~ubuntu-branches/ubuntu/precise/openarena/precise

« back to all changes in this revision

Viewing changes to code/botlib/l_script.h

  • Committer: Bazaar Package Importer
  • Author(s): Bruno "Fuddl" Kleinert
  • Date: 2007-01-20 12:28:09 UTC
  • Revision ID: james.westby@ubuntu.com-20070120122809-2yza5ojt7nqiyiam
Tags: upstream-0.6.0
ImportĀ upstreamĀ versionĀ 0.6.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
        double 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
double 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