1 /* 2 =========================================================================== 3 Copyright (C) 1999-2005 Id Software, Inc. 4 5 This file is part of Quake III Arena source code. 6 7 Quake III Arena source code is free software; you can redistribute it 8 and/or modify it under the terms of the GNU General Public License as 9 published by the Free Software Foundation; either version 2 of the License, 10 or (at your option) any later version. 11 12 Quake III Arena source code is distributed in the hope that it will be 13 useful, 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. 16 17 You should have received a copy of the GNU General Public License 18 along with Quake III Arena source code; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 20 =========================================================================== 21 */ 22 23 /***************************************************************************** 24 * name: l_script.h 25 * 26 * desc: lexicographical parser 27 * 28 * $Archive: /source/code/botlib/l_script.h $ 29 * 30 *****************************************************************************/ 31 32 //undef if binary numbers of the form 0b... or 0B... are not allowed 33 #define BINARYNUMBERS 34 //undef if not using the token.intvalue and token.floatvalue 35 #define NUMBERVALUE 36 //use dollar sign also as punctuation 37 #define DOLLAR 38 39 //maximum token length 40 #define MAX_TOKEN 1024 41 42 #if defined(BSPC) && !defined(QDECL) 43 #define QDECL 44 #endif 45 46 47 //script flags 48 #define SCFL_NOERRORS 0x0001 49 #define SCFL_NOWARNINGS 0x0002 50 #define SCFL_NOSTRINGWHITESPACES 0x0004 51 #define SCFL_NOSTRINGESCAPECHARS 0x0008 52 #define SCFL_PRIMITIVE 0x0010 53 #define SCFL_NOBINARYNUMBERS 0x0020 54 #define SCFL_NONUMBERVALUES 0x0040 55 56 //token types 57 #define TT_STRING 1 // string 58 #define TT_LITERAL 2 // literal 59 #define TT_NUMBER 3 // number 60 #define TT_NAME 4 // name 61 #define TT_PUNCTUATION 5 // punctuation 62 63 //string sub type 64 //--------------- 65 // the length of the string 66 //literal sub type 67 //---------------- 68 // the ASCII code of the literal 69 //number sub type 70 //--------------- 71 #define TT_DECIMAL 0x0008 // decimal number 72 #define TT_HEX 0x0100 // hexadecimal number 73 #define TT_OCTAL 0x0200 // octal number 74 #ifdef BINARYNUMBERS 75 #define TT_BINARY 0x0400 // binary number 76 #endif //BINARYNUMBERS 77 #define TT_FLOAT 0x0800 // floating point number 78 #define TT_INTEGER 0x1000 // integer number 79 #define TT_LONG 0x2000 // long number 80 #define TT_UNSIGNED 0x4000 // unsigned number 81 //punctuation sub type 82 //-------------------- 83 #define P_RSHIFT_ASSIGN 1 84 #define P_LSHIFT_ASSIGN 2 85 #define P_PARMS 3 86 #define P_PRECOMPMERGE 4 87 88 #define P_LOGIC_AND 5 89 #define P_LOGIC_OR 6 90 #define P_LOGIC_GEQ 7 91 #define P_LOGIC_LEQ 8 92 #define P_LOGIC_EQ 9 93 #define P_LOGIC_UNEQ 10 94 95 #define P_MUL_ASSIGN 11 96 #define P_DIV_ASSIGN 12 97 #define P_MOD_ASSIGN 13 98 #define P_ADD_ASSIGN 14 99 #define P_SUB_ASSIGN 15 100 #define P_INC 16 101 #define P_DEC 17 102 103 #define P_BIN_AND_ASSIGN 18 104 #define P_BIN_OR_ASSIGN 19 105 #define P_BIN_XOR_ASSIGN 20 106 #define P_RSHIFT 21 107 #define P_LSHIFT 22 108 109 #define P_POINTERREF 23 110 #define P_CPP1 24 111 #define P_CPP2 25 112 #define P_MUL 26 113 #define P_DIV 27 114 #define P_MOD 28 115 #define P_ADD 29 116 #define P_SUB 30 117 #define P_ASSIGN 31 118 119 #define P_BIN_AND 32 120 #define P_BIN_OR 33 121 #define P_BIN_XOR 34 122 #define P_BIN_NOT 35 123 124 #define P_LOGIC_NOT 36 125 #define P_LOGIC_GREATER 37 126 #define P_LOGIC_LESS 38 127 128 #define P_REF 39 129 #define P_COMMA 40 130 #define P_SEMICOLON 41 131 #define P_COLON 42 132 #define P_QUESTIONMARK 43 133 134 #define P_PARENTHESESOPEN 44 135 #define P_PARENTHESESCLOSE 45 136 #define P_BRACEOPEN 46 137 #define P_BRACECLOSE 47 138 #define P_SQBRACKETOPEN 48 139 #define P_SQBRACKETCLOSE 49 140 #define P_BACKSLASH 50 141 142 #define P_PRECOMP 51 143 #define P_DOLLAR 52 144 //name sub type 145 //------------- 146 // the length of the name 147 148 //punctuation 149 typedef struct punctuation_s 150 { 151 char *p; //punctuation character(s) 152 int n; //punctuation indication 153 struct punctuation_s *next; //next punctuation 154 } punctuation_t; 155 156 //token 157 typedef struct token_s 158 { 159 char string[MAX_TOKEN]; //available token 160 int type; //last read token type 161 int subtype; //last read token sub type 162 #ifdef NUMBERVALUE 163 unsigned long int intvalue; //integer value 164 float floatvalue; //floating point value 165 #endif //NUMBERVALUE 166 char *whitespace_p; //start of white space before token 167 char *endwhitespace_p; //start of white space before token 168 int line; //line the token was on 169 int linescrossed; //lines crossed in white space 170 struct token_s *next; //next token in chain 171 } token_t; 172 173 //script file 174 typedef struct script_s 175 { 176 char filename[1024]; //file name of the script 177 char *buffer; //buffer containing the script 178 char *script_p; //current pointer in the script 179 char *end_p; //pointer to the end of the script 180 char *lastscript_p; //script pointer before reading token 181 char *whitespace_p; //begin of the white space 182 char *endwhitespace_p; //end of the white space 183 int length; //length of the script in bytes 184 int line; //current line in script 185 int lastline; //line before reading token 186 int tokenavailable; //set by UnreadLastToken 187 int flags; //several script flags 188 punctuation_t *punctuations; //the punctuations used in the script 189 punctuation_t **punctuationtable; 190 token_t token; //available token 191 struct script_s *next; //next script in a chain 192 } script_t; 193 194 //read a token from the script 195 int PS_ReadToken(script_t *script, token_t *token); 196 //expect a certain token 197 int PS_ExpectTokenString(script_t *script, char *string); 198 //expect a certain token type 199 int PS_ExpectTokenType(script_t *script, int type, int subtype, token_t *token); 200 //expect a token 201 int PS_ExpectAnyToken(script_t *script, token_t *token); 202 //returns true when the token is available 203 int PS_CheckTokenString(script_t *script, char *string); 204 //returns true an reads the token when a token with the given type is available 205 int PS_CheckTokenType(script_t *script, int type, int subtype, token_t *token); 206 //skip tokens until the given token string is read 207 int PS_SkipUntilString(script_t *script, char *string); 208 //unread the last token read from the script 209 void PS_UnreadLastToken(script_t *script); 210 //unread the given token 211 void PS_UnreadToken(script_t *script, token_t *token); 212 //returns the next character of the read white space, returns NULL if none 213 char PS_NextWhiteSpaceChar(script_t *script); 214 //remove any leading and trailing double quotes from the token 215 void StripDoubleQuotes(char *string); 216 //remove any leading and trailing single quotes from the token 217 void StripSingleQuotes(char *string); 218 //read a possible signed integer 219 signed long int ReadSignedInt(script_t *script); 220 //read a possible signed floating point number 221 float ReadSignedFloat(script_t *script); 222 //set an array with punctuations, NULL restores default C/C++ set 223 void SetScriptPunctuations(script_t *script, punctuation_t *p); 224 //set script flags 225 void SetScriptFlags(script_t *script, int flags); 226 //get script flags 227 int GetScriptFlags(script_t *script); 228 //reset a script 229 void ResetScript(script_t *script); 230 //returns true if at the end of the script 231 int EndOfScript(script_t *script); 232 //returns a pointer to the punctuation with the given number 233 char *PunctuationFromNum(script_t *script, int num); 234 //load a script from the given file at the given offset with the given length 235 script_t *LoadScriptFile(const char *filename); 236 //load a script from the given memory with the given length 237 script_t *LoadScriptMemory(char *ptr, int length, char *name); 238 //free a script 239 void FreeScript(script_t *script); 240 //set the base folder to load files from 241 void PS_SetBaseFolder(char *path); 242 //print a script error with filename and line number 243 void QDECL ScriptError(script_t *script, char *str, ...); 244 //print a script warning with filename and line number 245 void QDECL ScriptWarning(script_t *script, char *str, ...); 246 247 248