2 Copyright (C) 1999-2007 id Software, Inc. and contributors.
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
5 This file is part of GtkRadiant.
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
29 // Hydra: added support for GetTokenExtra()
30 char *currentdelimiters;
31 qboolean script_keepdelimiter;
33 void StartTokenParsing (char *data)
39 // Hydra: added support for GetTokenExtra()
40 currentdelimiters = NULL;
41 script_keepdelimiter = true;
45 qboolean GetToken (qboolean crossline)
49 if (unget) // is a token already waiting?
59 while (*script_p <= 32)
64 Sys_Printf("Warning: Line %i is incomplete [01]\n",scriptline);
68 if (*script_p++ == '\n')
71 Sys_Printf("Warning: Line %i is incomplete [02]\n",scriptline);
76 if (script_p[0] == '/' && script_p[1] == '/') // comment field
79 Sys_Printf("Warning: Line %i is incomplete [03]\n",scriptline);
80 while (*script_p++ != '\n')
84 Sys_Printf("Warning: Line %i is incomplete [04]\n",scriptline);
87 scriptline++; // Hydra: fixed bad line numbers problem
99 while ( *script_p != '"' )
102 Error ("EOF inside quoted token");
103 *token_p++ = *script_p++;
104 if (token_p == &token[MAXTOKEN])
105 Error ("Token too large on line %i",scriptline);
110 while ( *script_p > 32 )
112 // Hydra: added support for GetTokenExtra(), care was taken to maintain speed
113 if((currentdelimiters) && (!script_keepdelimiter) && (strchr(currentdelimiters,*(script_p))))
116 *token_p++ = *script_p++;
117 if (token_p == &token[MAXTOKEN])
118 Error ("Token too large on line %i",scriptline);
120 // Hydra: added support for GetTokenExtra()
121 if((currentdelimiters) && (strchr(currentdelimiters,*(script_p-1))))
131 void UngetToken (void)
140 This function expands the use of GetToken() so it can be used to parse
141 more complex file formats.
144 You can use this function to split a string like this
148 into two strings, like this:
152 whilst still checking for the brackets and colons, like this:
154 GetTokenExtra(false,":",false);// contains "string1"
155 GetTokenExtra(false,":",true); // contains ":"
156 GetTokenExtra(false,"(",true); // contains "("
157 GetToken(false); // contains "string2"
158 GetTokenExtra(false,")",true); // contains ")"
160 here's what you get, given the same string, with this code:
162 GetToken(false); // contains "string1:("string2")"
164 Parsing will end if any character in the script matches any one of the
165 characters in the "delimiters" string.
167 it's also possible to do things like this:
176 GetTokenExtra(false,",:-*",false); // token contains "1"
177 GetTokenExtra(false,",:-*",false); // token contains the delimiter that was used
178 GetToken(false); // contains "2"
181 qboolean GetTokenExtra (qboolean crossline,char *delimiters, qboolean keepdelimiter)
184 char *olddelimiters = currentdelimiters; // store it
186 currentdelimiters = delimiters; // change the delimiters
187 script_keepdelimiter = keepdelimiter; // change the global flag
189 result = GetToken(crossline);
190 currentdelimiters = olddelimiters; // restore it
198 Returns true if there is another token on the line
201 qboolean TokenAvailable (void)
207 while ( *search_p <= 32)
209 if (*search_p == '\n')
216 if (*search_p == ';')