You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
292 lines
6.2 KiB
292 lines
6.2 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// SYS_SCRIPTLIB.CPP |
|
// |
|
// |
|
//=====================================================================================// |
|
#include "vxconsole.h" |
|
|
|
char g_sys_token[MAXTOKEN]; |
|
char* g_sys_scriptbuff; |
|
char* g_sys_scriptptr; |
|
char* g_sys_scriptendptr; |
|
int g_sys_scriptsize; |
|
int g_sys_scriptline; |
|
bool g_sys_endofscript; |
|
bool g_sys_tokenready; |
|
int g_sys_oldscriptline; |
|
char* g_sys_oldscriptptr; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Sys_FreeScriptFile |
|
// |
|
//----------------------------------------------------------------------------- |
|
void Sys_FreeScriptFile(void) |
|
{ |
|
if (g_sys_scriptbuff) |
|
{ |
|
Sys_Free(g_sys_scriptbuff); |
|
g_sys_scriptbuff = NULL; |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Sys_LoadScriptFile |
|
// |
|
//----------------------------------------------------------------------------- |
|
void Sys_LoadScriptFile(const char* filename) |
|
{ |
|
g_sys_scriptsize = Sys_LoadFile(filename,(void **)&g_sys_scriptbuff); |
|
|
|
Sys_ResetParser(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Sys_SetScriptData |
|
// |
|
//----------------------------------------------------------------------------- |
|
void Sys_SetScriptData(const char* data, int length) |
|
{ |
|
g_sys_scriptbuff = (char *)data; |
|
g_sys_scriptsize = length; |
|
|
|
Sys_ResetParser(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Sys_UnGetToken |
|
// |
|
//----------------------------------------------------------------------------- |
|
void Sys_UnGetToken(void) |
|
{ |
|
g_sys_tokenready = true; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Sys_GetToken |
|
// |
|
//----------------------------------------------------------------------------- |
|
char* Sys_GetToken(bool crossline) |
|
{ |
|
char* tokenptr; |
|
|
|
if (g_sys_tokenready) |
|
{ |
|
g_sys_tokenready = false; |
|
return (g_sys_token); |
|
} |
|
|
|
g_sys_token[0] = '\0'; |
|
|
|
if (g_sys_scriptptr >= g_sys_scriptendptr) |
|
{ |
|
g_sys_endofscript = true; |
|
return (NULL); |
|
} |
|
|
|
skipspace: |
|
while (*g_sys_scriptptr <= ' ') |
|
{ |
|
if (g_sys_scriptptr >= g_sys_scriptendptr) |
|
{ |
|
g_sys_endofscript = true; |
|
return (NULL); |
|
} |
|
|
|
if (*g_sys_scriptptr++ == '\n') |
|
{ |
|
if (!crossline) |
|
{ |
|
// unexpected newline at g_sys_scriptline |
|
return (NULL); |
|
} |
|
|
|
g_sys_scriptline++; |
|
} |
|
} |
|
|
|
if (g_sys_scriptptr >= g_sys_scriptendptr) |
|
{ |
|
g_sys_endofscript = true; |
|
return (NULL); |
|
} |
|
|
|
// skip commented line |
|
if ((g_sys_scriptptr[0] == ';') || (g_sys_scriptptr[0] == '/' && g_sys_scriptptr[1] == '/')) |
|
{ |
|
if (!crossline) |
|
{ |
|
// unexpected newline at g_sys_scriptline |
|
return (NULL); |
|
} |
|
|
|
while (*g_sys_scriptptr++ != '\n') |
|
{ |
|
if (g_sys_scriptptr >= g_sys_scriptendptr) |
|
{ |
|
g_sys_endofscript = true; |
|
return (NULL); |
|
} |
|
} |
|
|
|
g_sys_scriptline++; |
|
goto skipspace; |
|
} |
|
|
|
tokenptr = g_sys_token; |
|
if (g_sys_scriptptr[0] == '\"' && g_sys_scriptptr[1]) |
|
{ |
|
// copy quoted token |
|
do |
|
{ |
|
*tokenptr++ = *g_sys_scriptptr++; |
|
if (g_sys_scriptptr == g_sys_scriptendptr) |
|
break; |
|
|
|
if (tokenptr == &g_sys_token[MAXTOKEN]) |
|
{ |
|
// token too large |
|
return NULL; |
|
} |
|
} |
|
while (*g_sys_scriptptr >= ' ' && *g_sys_scriptptr != '\"'); |
|
|
|
if (g_sys_scriptptr[0] == '\"') |
|
*tokenptr++ = *g_sys_scriptptr++; |
|
} |
|
else |
|
{ |
|
// copy token |
|
while (*g_sys_scriptptr > ' ' && *g_sys_scriptptr != ';' && *g_sys_scriptptr != '\"') |
|
{ |
|
*tokenptr++ = *g_sys_scriptptr++; |
|
if (g_sys_scriptptr == g_sys_scriptendptr) |
|
break; |
|
|
|
if (tokenptr == &g_sys_token[MAXTOKEN]) |
|
{ |
|
// token too large |
|
return NULL; |
|
} |
|
} |
|
} |
|
|
|
*tokenptr = '\0'; |
|
|
|
return (g_sys_token); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Sys_SkipRestOfLine |
|
// |
|
//----------------------------------------------------------------------------- |
|
void Sys_SkipRestOfLine(void) |
|
{ |
|
while (*g_sys_scriptptr++ != '\n') |
|
{ |
|
if (g_sys_scriptptr >= g_sys_scriptendptr) |
|
{ |
|
break; |
|
} |
|
} |
|
|
|
g_sys_scriptline++; |
|
|
|
// flush any queued token |
|
g_sys_tokenready = false; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Sys_TokenAvailable |
|
// |
|
// Returns (TRUE) if token available on line. |
|
//----------------------------------------------------------------------------- |
|
bool Sys_TokenAvailable (void) |
|
{ |
|
char* ptr; |
|
|
|
ptr = g_sys_scriptptr; |
|
while (*ptr <= ' ') |
|
{ |
|
if (ptr >= g_sys_scriptendptr) |
|
{ |
|
g_sys_endofscript = true; |
|
return (false); |
|
} |
|
|
|
if (*ptr++ == '\n') |
|
return (false); |
|
} |
|
|
|
return (true); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Sys_EndOfScript |
|
// |
|
// Returns (TRUE) at end of script |
|
//----------------------------------------------------------------------------- |
|
bool Sys_EndOfScript(void) |
|
{ |
|
if (g_sys_scriptptr >= g_sys_scriptendptr) |
|
{ |
|
g_sys_endofscript = true; |
|
return (true); |
|
} |
|
|
|
return (false); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Sys_ResetParser |
|
// |
|
//----------------------------------------------------------------------------- |
|
void Sys_ResetParser(void) |
|
{ |
|
g_sys_scriptptr = g_sys_scriptbuff; |
|
g_sys_scriptendptr = g_sys_scriptptr + g_sys_scriptsize; |
|
g_sys_scriptline = 1; |
|
g_sys_endofscript = false; |
|
g_sys_tokenready = false; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Sys_SaveParser |
|
// |
|
//----------------------------------------------------------------------------- |
|
void Sys_SaveParser(void) |
|
{ |
|
g_sys_oldscriptline = g_sys_scriptline; |
|
g_sys_oldscriptptr = g_sys_scriptptr; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Sys_RestoreParser |
|
// |
|
//----------------------------------------------------------------------------- |
|
void Sys_RestoreParser(void) |
|
{ |
|
g_sys_scriptline = g_sys_oldscriptline; |
|
g_sys_scriptptr = g_sys_oldscriptptr; |
|
g_sys_tokenready = false; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Sys_StripQuotesFromToken |
|
// |
|
//----------------------------------------------------------------------------- |
|
void Sys_StripQuotesFromToken( char *pToken ) |
|
{ |
|
int len; |
|
|
|
len = strlen( pToken ); |
|
if ( len >= 2 && pToken[0] == '\"' ) |
|
{ |
|
memcpy( pToken, pToken+1, len-1 ); |
|
pToken[len-2] = '\0'; |
|
} |
|
} |
|
|
|
|
|
|
|
|