mirror of
https://github.com/blendogames/thirtyflightsofloving.git
synced 2024-11-15 00:41:21 +00:00
283 lines
11 KiB
C
283 lines
11 KiB
C
/*
|
||
===========================================================================
|
||
|
||
Return to Castle Wolfenstein single player GPL Source Code
|
||
Copyright (C) 1999-2010 id Software LLC, a ZeniMax Media company.
|
||
|
||
This file is part of the Return to Castle Wolfenstein single player GPL Source Code (RTCW SP Source Code).
|
||
|
||
RTCW SP Source Code is free software: you can redistribute it and/or modify
|
||
it under the terms of the GNU General Public License as published by
|
||
the Free Software Foundation, either version 3 of the License, or
|
||
(at your option) any later version.
|
||
|
||
RTCW SP Source Code is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
GNU General Public License for more details.
|
||
|
||
You should have received a copy of the GNU General Public License
|
||
along with RTCW SP Source Code. If not, see <http://www.gnu.org/licenses/>.
|
||
|
||
In addition, the RTCW SP Source Code is also subject to certain additional terms.
|
||
You should have received a copy of these additional terms immediately following the
|
||
terms and conditions of the GNU General Public License which accompanied the RTCW SP
|
||
Source Code. If not, please request a copy in writing from id Software at the address below.
|
||
|
||
If you have questions concerning this license or the applicable additional terms,
|
||
you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
|
||
|
||
===========================================================================
|
||
*/
|
||
|
||
|
||
/*****************************************************************************
|
||
* name: l_script.h
|
||
*
|
||
* desc: lexicographical parser
|
||
*
|
||
*
|
||
*****************************************************************************/
|
||
|
||
// Ridah, can't get it to compile without this
|
||
#ifndef QDECL
|
||
|
||
// for windows fastcall option
|
||
#define QDECL
|
||
//======================= WIN32 DEFINES =================================
|
||
#ifdef WIN32
|
||
#undef QDECL
|
||
#define QDECL __cdecl
|
||
#endif
|
||
#endif
|
||
// done.
|
||
|
||
//undef if binary numbers of the form 0b... or 0B... are not allowed
|
||
#define BINARYNUMBERS
|
||
//undef if not using the token.intvalue and token.floatvalue
|
||
#define NUMBERVALUE
|
||
//use dollar sign also as punctuation
|
||
#define DOLLAR
|
||
|
||
//maximum token length
|
||
#define MAX_TOKEN 1024
|
||
//maximum path length
|
||
#ifndef MAX_QPATH
|
||
#define MAX_QPATH 64
|
||
#endif
|
||
#ifndef _MAX_PATH
|
||
#define _MAX_PATH MAX_QPATH
|
||
#endif
|
||
|
||
// from Quake3 source
|
||
#ifdef WIN32
|
||
//#define Q_vsnprintf _vsnprintf
|
||
__inline int Q_vsnprintf (char *Dest, size_t Count, const char *Format, va_list Args) {
|
||
int ret = _vsnprintf(Dest, Count, Format, Args);
|
||
Dest[Count-1] = 0; // null terminate
|
||
return ret;
|
||
}
|
||
#else
|
||
// TODO: do we need Mac define?
|
||
#define Q_vsnprintf vsnprintf
|
||
#endif
|
||
|
||
//script flags
|
||
#define SCFL_NOERRORS 0x0001
|
||
#define SCFL_NOWARNINGS 0x0002
|
||
#define SCFL_NOSTRINGWHITESPACES 0x0004
|
||
#define SCFL_NOSTRINGESCAPECHARS 0x0008
|
||
#define SCFL_PRIMITIVE 0x0010
|
||
#define SCFL_NOBINARYNUMBERS 0x0020
|
||
#define SCFL_NONUMBERVALUES 0x0040
|
||
|
||
//token types
|
||
#define TT_STRING 1 // string
|
||
#define TT_LITERAL 2 // literal
|
||
#define TT_NUMBER 3 // number
|
||
#define TT_NAME 4 // name
|
||
#define TT_PUNCTUATION 5 // punctuation
|
||
|
||
//string sub type
|
||
//---------------
|
||
// the length of the string
|
||
//literal sub type
|
||
//----------------
|
||
// the ASCII code of the literal
|
||
//number sub type
|
||
//---------------
|
||
#define TT_DECIMAL 0x0008 // decimal number
|
||
#define TT_HEX 0x0100 // hexadecimal number
|
||
#define TT_OCTAL 0x0200 // octal number
|
||
#ifdef BINARYNUMBERS
|
||
#define TT_BINARY 0x0400 // binary number
|
||
#endif //BINARYNUMBERS
|
||
#define TT_FLOAT 0x0800 // floating point number
|
||
#define TT_INTEGER 0x1000 // integer number
|
||
#define TT_LONG 0x2000 // long number
|
||
#define TT_UNSIGNED 0x4000 // unsigned number
|
||
//punctuation sub type
|
||
//--------------------
|
||
#define P_RSHIFT_ASSIGN 1
|
||
#define P_LSHIFT_ASSIGN 2
|
||
#define P_PARMS 3
|
||
#define P_PRECOMPMERGE 4
|
||
|
||
#define P_LOGIC_AND 5
|
||
#define P_LOGIC_OR 6
|
||
#define P_LOGIC_GEQ 7
|
||
#define P_LOGIC_LEQ 8
|
||
#define P_LOGIC_EQ 9
|
||
#define P_LOGIC_UNEQ 10
|
||
|
||
#define P_MUL_ASSIGN 11
|
||
#define P_DIV_ASSIGN 12
|
||
#define P_MOD_ASSIGN 13
|
||
#define P_ADD_ASSIGN 14
|
||
#define P_SUB_ASSIGN 15
|
||
#define P_INC 16
|
||
#define P_DEC 17
|
||
|
||
#define P_BIN_AND_ASSIGN 18
|
||
#define P_BIN_OR_ASSIGN 19
|
||
#define P_BIN_XOR_ASSIGN 20
|
||
#define P_RSHIFT 21
|
||
#define P_LSHIFT 22
|
||
|
||
#define P_POINTERREF 23
|
||
#define P_CPP1 24
|
||
#define P_CPP2 25
|
||
#define P_MUL 26
|
||
#define P_DIV 27
|
||
#define P_MOD 28
|
||
#define P_ADD 29
|
||
#define P_SUB 30
|
||
#define P_ASSIGN 31
|
||
|
||
#define P_BIN_AND 32
|
||
#define P_BIN_OR 33
|
||
#define P_BIN_XOR 34
|
||
#define P_BIN_NOT 35
|
||
|
||
#define P_LOGIC_NOT 36
|
||
#define P_LOGIC_GREATER 37
|
||
#define P_LOGIC_LESS 38
|
||
|
||
#define P_REF 39
|
||
#define P_COMMA 40
|
||
#define P_SEMICOLON 41
|
||
#define P_COLON 42
|
||
#define P_QUESTIONMARK 43
|
||
|
||
#define P_PARENTHESESOPEN 44
|
||
#define P_PARENTHESESCLOSE 45
|
||
#define P_BRACEOPEN 46
|
||
#define P_BRACECLOSE 47
|
||
#define P_SQBRACKETOPEN 48
|
||
#define P_SQBRACKETCLOSE 49
|
||
#define P_BACKSLASH 50
|
||
|
||
#define P_PRECOMP 51
|
||
#define P_DOLLAR 52
|
||
//name sub type
|
||
//-------------
|
||
// the length of the name
|
||
|
||
//punctuation
|
||
typedef struct punctuation_s
|
||
{
|
||
char *p; //punctuation character(s)
|
||
int n; //punctuation indication
|
||
struct punctuation_s *next; //next punctuation
|
||
} punctuation_t;
|
||
|
||
//token
|
||
typedef struct token_s
|
||
{
|
||
char string[MAX_TOKEN]; //available token
|
||
int type; //last read token type
|
||
int subtype; //last read token sub type
|
||
#ifdef NUMBERVALUE
|
||
unsigned long int intvalue; //integer value
|
||
long double floatvalue; //floating point value
|
||
#endif //NUMBERVALUE
|
||
char *whitespace_p; //start of white space before token
|
||
char *endwhitespace_p; //start of white space before token
|
||
int line; //line the token was on
|
||
int linescrossed; //lines crossed in white space
|
||
struct token_s *next; //next token in chain
|
||
} token_t;
|
||
|
||
//script file
|
||
typedef struct script_s
|
||
{
|
||
char filename[_MAX_PATH]; //file name of the script
|
||
char *buffer; //buffer containing the script
|
||
char *script_p; //current pointer in the script
|
||
char *end_p; //pointer to the end of the script
|
||
char *lastscript_p; //script pointer before reading token
|
||
char *whitespace_p; //begin of the white space
|
||
char *endwhitespace_p; //end of the white space
|
||
int length; //length of the script in bytes
|
||
int line; //current line in script
|
||
int lastline; //line before reading token
|
||
int tokenavailable; //set by UnreadLastToken
|
||
int flags; //several script flags
|
||
punctuation_t *punctuations; //the punctuations used in the script
|
||
punctuation_t **punctuationtable;
|
||
token_t token; //available token
|
||
struct script_s *next; //next script in a chain
|
||
} script_t;
|
||
|
||
//read a token from the script
|
||
int PS_ReadToken( script_t *script, token_t *token );
|
||
//expect a certain token
|
||
int PS_ExpectTokenString( script_t *script, char *string );
|
||
//expect a certain token type
|
||
int PS_ExpectTokenType( script_t *script, int type, int subtype, token_t *token );
|
||
//expect a token
|
||
int PS_ExpectAnyToken( script_t *script, token_t *token );
|
||
//returns true when the token is available
|
||
int PS_CheckTokenString( script_t *script, char *string );
|
||
//returns true an reads the token when a token with the given type is available
|
||
int PS_CheckTokenType( script_t *script, int type, int subtype, token_t *token );
|
||
//skip tokens until the given token string is read
|
||
int PS_SkipUntilString( script_t *script, char *string );
|
||
//unread the last token read from the script
|
||
void PS_UnreadLastToken( script_t *script );
|
||
//unread the given token
|
||
void PS_UnreadToken( script_t *script, token_t *token );
|
||
//returns the next character of the read white space, returns NULL if none
|
||
char PS_NextWhiteSpaceChar( script_t *script );
|
||
//remove any leading and trailing double quotes from the token
|
||
void StripDoubleQuotes( char *string );
|
||
//remove any leading and trailing single quotes from the token
|
||
void StripSingleQuotes( char *string );
|
||
//read a possible signed integer
|
||
signed long int ReadSignedInt( script_t *script );
|
||
//read a possible signed floating point number
|
||
long double ReadSignedFloat( script_t *script );
|
||
//set an array with punctuations, NULL restores default C/C++ set
|
||
void SetScriptPunctuations( script_t *script, punctuation_t *p );
|
||
//set script flags
|
||
void SetScriptFlags( script_t *script, int flags );
|
||
//get script flags
|
||
int GetScriptFlags( script_t *script );
|
||
//reset a script
|
||
void ResetScript( script_t *script );
|
||
//returns true if at the end of the script
|
||
int EndOfScript( script_t *script );
|
||
//returns a pointer to the punctuation with the given number
|
||
char *PunctuationFromNum( script_t *script, int num );
|
||
//load a script from the given file at the given offset with the given length
|
||
script_t *LoadScriptFile( char *filename );
|
||
//load a script from the given memory with the given length
|
||
script_t *LoadScriptMemory( char *ptr, int length, char *name );
|
||
//free a script
|
||
void FreeScript( script_t *script );
|
||
//print a script error with filename and line number
|
||
void QDECL ScriptError( script_t *script, char *str, ... );
|
||
//print a script warning with filename and line number
|
||
void QDECL ScriptWarning( script_t *script, char *str, ... );
|
||
|
||
|