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 ){
38 // Hydra: added support for GetTokenExtra()
39 currentdelimiters = NULL;
40 script_keepdelimiter = true;
44 qboolean GetToken( qboolean crossline ){
47 if ( unget ) { // is a token already waiting?
56 while ( *script_p <= 32 )
60 Sys_Printf( "Warning: Line %i is incomplete [01]\n",scriptline );
65 if ( *script_p++ == '\n' ) {
67 Sys_Printf( "Warning: Line %i is incomplete [02]\n",scriptline );
73 if ( script_p[0] == '/' && script_p[1] == '/' ) { // comment field
75 Sys_Printf( "Warning: Line %i is incomplete [03]\n",scriptline );
77 while ( *script_p++ != '\n' )
80 Sys_Printf( "Warning: Line %i is incomplete [04]\n",scriptline );
84 scriptline++; // Hydra: fixed bad line numbers problem
93 if ( *script_p == '"' ) {
95 while ( *script_p != '"' )
98 Error( "EOF inside quoted token" );
100 *token_p++ = *script_p++;
101 if ( token_p == &token[MAXTOKEN] ) {
102 Error( "Token too large on line %i",scriptline );
108 while ( *script_p > 32 )
110 // Hydra: added support for GetTokenExtra(), care was taken to maintain speed
111 if ( ( currentdelimiters ) && ( !script_keepdelimiter ) && ( strchr( currentdelimiters,*( script_p ) ) ) ) {
115 *token_p++ = *script_p++;
116 if ( token_p == &token[MAXTOKEN] ) {
117 Error( "Token too large on line %i",scriptline );
120 // Hydra: added support for GetTokenExtra()
121 if ( ( currentdelimiters ) && ( strchr( currentdelimiters,*( script_p - 1 ) ) ) ) {
133 void UngetToken( void ){
141 This function expands the use of GetToken() so it can be used to parse
142 more complex file formats.
145 You can use this function to split a string like this
149 into two strings, like this:
153 whilst still checking for the brackets and colons, like this:
155 GetTokenExtra(false,":",false);// contains "string1"
156 GetTokenExtra(false,":",true); // contains ":"
157 GetTokenExtra(false,"(",true); // contains "("
158 GetToken(false); // contains "string2"
159 GetTokenExtra(false,")",true); // contains ")"
161 here's what you get, given the same string, with this code:
163 GetToken(false); // contains "string1:("string2")"
165 Parsing will end if any character in the script matches any one of the
166 characters in the "delimiters" string.
168 it's also possible to do things like this:
177 GetTokenExtra(false,",:-*",false); // token contains "1"
178 GetTokenExtra(false,",:-*",false); // token contains the delimiter that was used
179 GetToken(false); // contains "2"
182 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 ){
206 while ( *search_p <= 32 )
208 if ( *search_p == '\n' ) {
211 if ( *search_p == 0 ) {
217 if ( *search_p == ';' ) {