/* scriplib.c $Id: scriplib.c,v 1.1 2007/05/05 11:18:47 sezero Exp $ */ #include "util_inc.h" #include "cmdlib.h" #include "util_io.h" #include "scriplib.h" /* ============================================================================= PARSING STUFF ============================================================================= */ char token[MAXTOKEN]; static char *scriptbuffer, *script_p, *scriptend_p; int scriptline; qboolean endofscript; static qboolean tokenready; // only true if UnGetToken was just called /* ============== LoadScriptFile ============== */ void LoadScriptFile (char *filename) { int size; size = LoadFile (filename, (void **) (char *) &scriptbuffer); script_p = scriptbuffer; scriptend_p = script_p + size; scriptline = 1; endofscript = false; tokenready = false; } /* ============== UnGetToken Signals that the current token was not used, and should be reported for the next GetToken. Note that GetToken (true); UnGetToken (); GetToken (false); could cross a line boundary. ============== */ void UnGetToken (void) { tokenready = true; } /* ============== GetToken ============== */ qboolean GetToken (qboolean crossline) { char *token_p; if (tokenready) // is a token already waiting? { tokenready = false; return true; } if (script_p >= scriptend_p) { if (!crossline) Error ("Line %i is incomplete\n",scriptline); endofscript = true; return false; } // // skip space // skipspace: while (*script_p <= 32) { if (script_p >= scriptend_p) { if (!crossline) Error ("Line %i is incomplete\n",scriptline); endofscript = true; return true; } if (*script_p++ == '\n') { if (!crossline) Error ("Line %i is incomplete\n",scriptline); scriptline++; } } if (script_p >= scriptend_p) { if (!crossline) Error ("Line %i is incomplete\n",scriptline); endofscript = true; return true; } if (*script_p == ';' || *script_p == '#') // semicolon is comment field { // also make # a comment field if (!crossline) Error ("Line %i is incomplete\n",scriptline); while (*script_p++ != '\n') if (script_p >= scriptend_p) { endofscript = true; return false; } goto skipspace; } // // copy token // token_p = token; while ( *script_p > 32 && *script_p != ';') { *token_p++ = *script_p++; if (script_p == scriptend_p) break; if (token_p == &token[MAXTOKEN]) Error ("Token too large on line %i\n",scriptline); } *token_p = 0; return true; } /* ============== TokenAvailable Returns true if there is another token on the line ============== */ qboolean TokenAvailable (void) { char *search_p; search_p = script_p; if (search_p >= scriptend_p) return false; while ( *search_p <= 32) { if (*search_p == '\n') return false; search_p++; if (search_p == scriptend_p) return false; } if (*search_p == ';') return false; return true; }