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