📄 l_script.c
字号:
if (token->type != type)
{
if (type == TT_STRING) strcpy(str, "string");
if (type == TT_LITERAL) strcpy(str, "literal");
if (type == TT_NUMBER) strcpy(str, "number");
if (type == TT_NAME) strcpy(str, "name");
if (type == TT_PUNCTUATION) strcpy(str, "punctuation");
ScriptError(script, "expected a %s, found %s", str, token->string);
return 0;
} //end if
if (token->type == TT_NUMBER)
{
if ((token->subtype & subtype) != subtype)
{
if (subtype & TT_DECIMAL) strcpy(str, "decimal");
if (subtype & TT_HEX) strcpy(str, "hex");
if (subtype & TT_OCTAL) strcpy(str, "octal");
if (subtype & TT_BINARY) strcpy(str, "binary");
if (subtype & TT_LONG) strcat(str, " long");
if (subtype & TT_UNSIGNED) strcat(str, " unsigned");
if (subtype & TT_FLOAT) strcat(str, " float");
if (subtype & TT_INTEGER) strcat(str, " integer");
ScriptError(script, "expected %s, found %s", str, token->string);
return 0;
} //end if
} //end if
else if (token->type == TT_PUNCTUATION)
{
if (subtype < 0)
{
ScriptError(script, "BUG: wrong punctuation subtype");
return 0;
} //end if
if (token->subtype != subtype)
{
ScriptError(script, "expected %s, found %s",
script->punctuations[subtype], token->string);
return 0;
} //end if
} //end else if
return 1;
} //end of the function PS_ExpectTokenType
//============================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//============================================================================
int PS_ExpectAnyToken(script_t *script, token_t *token)
{
if (!PS_ReadToken(script, token))
{
ScriptError(script, "couldn't read expected token");
return 0;
} //end if
else
{
return 1;
} //end else
} //end of the function PS_ExpectAnyToken
//============================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//============================================================================
int PS_CheckTokenString(script_t *script, char *string)
{
token_t tok;
if (!PS_ReadToken(script, &tok)) return 0;
//if the token is available
if (!strcmp(tok.string, string)) return 1;
//token not available
script->script_p = script->lastscript_p;
return 0;
} //end of the function PS_CheckTokenString
//============================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//============================================================================
int PS_CheckTokenType(script_t *script, int type, int subtype, token_t *token)
{
token_t tok;
if (!PS_ReadToken(script, &tok)) return 0;
//if the type matches
if (tok.type == type &&
(tok.subtype & subtype) == subtype)
{
Com_Memcpy(token, &tok, sizeof(token_t));
return 1;
} //end if
//token is not available
script->script_p = script->lastscript_p;
return 0;
} //end of the function PS_CheckTokenType
//============================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//============================================================================
int PS_SkipUntilString(script_t *script, char *string)
{
token_t token;
while(PS_ReadToken(script, &token))
{
if (!strcmp(token.string, string)) return 1;
} //end while
return 0;
} //end of the function PS_SkipUntilString
//============================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//============================================================================
void PS_UnreadLastToken(script_t *script)
{
script->tokenavailable = 1;
} //end of the function UnreadLastToken
//============================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//============================================================================
void PS_UnreadToken(script_t *script, token_t *token)
{
Com_Memcpy(&script->token, token, sizeof(token_t));
script->tokenavailable = 1;
} //end of the function UnreadToken
//============================================================================
// returns the next character of the read white space, returns NULL if none
//
// Parameter: -
// Returns: -
// Changes Globals: -
//============================================================================
char PS_NextWhiteSpaceChar(script_t *script)
{
if (script->whitespace_p != script->endwhitespace_p)
{
return *script->whitespace_p++;
} //end if
else
{
return 0;
} //end else
} //end of the function PS_NextWhiteSpaceChar
//============================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//============================================================================
void StripDoubleQuotes(char *string)
{
if (*string == '\"')
{
strcpy(string, string+1);
} //end if
if (string[strlen(string)-1] == '\"')
{
string[strlen(string)-1] = '\0';
} //end if
} //end of the function StripDoubleQuotes
//============================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//============================================================================
void StripSingleQuotes(char *string)
{
if (*string == '\'')
{
strcpy(string, string+1);
} //end if
if (string[strlen(string)-1] == '\'')
{
string[strlen(string)-1] = '\0';
} //end if
} //end of the function StripSingleQuotes
//============================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//============================================================================
long double ReadSignedFloat(script_t *script)
{
token_t token;
long double sign = 1;
PS_ExpectAnyToken(script, &token);
if (!strcmp(token.string, "-"))
{
sign = -1;
PS_ExpectTokenType(script, TT_NUMBER, 0, &token);
} //end if
else if (token.type != TT_NUMBER)
{
ScriptError(script, "expected float value, found %s\n", token.string);
} //end else if
return sign * token.floatvalue;
} //end of the function ReadSignedFloat
//============================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//============================================================================
signed long int ReadSignedInt(script_t *script)
{
token_t token;
signed long int sign = 1;
PS_ExpectAnyToken(script, &token);
if (!strcmp(token.string, "-"))
{
sign = -1;
PS_ExpectTokenType(script, TT_NUMBER, TT_INTEGER, &token);
} //end if
else if (token.type != TT_NUMBER || token.subtype == TT_FLOAT)
{
ScriptError(script, "expected integer value, found %s\n", token.string);
} //end else if
return sign * token.intvalue;
} //end of the function ReadSignedInt
//============================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//============================================================================
void SetScriptFlags(script_t *script, int flags)
{
script->flags = flags;
} //end of the function SetScriptFlags
//============================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//============================================================================
int GetScriptFlags(script_t *script)
{
return script->flags;
} //end of the function GetScriptFlags
//============================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//============================================================================
void ResetScript(script_t *script)
{
//pointer in script buffer
script->script_p = script->buffer;
//pointer in script buffer before reading token
script->lastscript_p = script->buffer;
//begin of white space
script->whitespace_p = NULL;
//end of white space
script->endwhitespace_p = NULL;
//set if there's a token available in script->token
script->tokenavailable = 0;
//
script->line = 1;
script->lastline = 1;
//clear the saved token
Com_Memset(&script->token, 0, sizeof(token_t));
} //end of the function ResetScript
//============================================================================
// returns true if at the end of the script
//
// Parameter: -
// Returns: -
// Changes Globals: -
//============================================================================
int EndOfScript(script_t *script)
{
return script->script_p >= script->end_p;
} //end of the function EndOfScript
//============================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//============================================================================
int NumLinesCrossed(script_t *script)
{
return script->line - script->lastline;
} //end of the function NumLinesCrossed
//============================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//============================================================================
int ScriptSkipTo(script_t *script, char *value)
{
int len;
char firstchar;
firstchar = *value;
len = strlen(value);
do
{
if (!PS_ReadWhiteSpace(script)) return 0;
if (*script->script_p == firstchar)
{
if (!strncmp(script->script_p, value, len))
{
return 1;
} //end if
} //end if
script->script_p++;
} while(1);
} //end of the function ScriptSkipTo
#ifndef BOTLIB
//============================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//============================================================================
int FileLength(FILE *fp)
{
int pos;
int end;
pos = ftell(fp);
fseek(fp, 0, SEEK_END);
end = ftell(fp);
fseek(fp, pos, SEEK_SET);
return end;
} //end of the function FileLength
#endif
//============================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//============================================================================
script_t *LoadScriptFile(const char *filename)
{
#ifdef BOTLIB
fileHandle_t fp;
char pathname[MAX_QPATH];
#else
FILE *fp;
#endif
int length;
void *buffer;
script_t *script;
#ifdef BOTLIB
if (strlen(basefolder))
Com_sprintf(pathname, sizeof(pathname), "%s/%s", basefolder, filename);
else
Com_sprintf(pathname, sizeof(pathname), "%s", filename);
length = botimport.FS_FOpenFile( pathname, &fp, FS_READ );
if (!fp) return NULL;
#else
fp = fopen(filename, "rb");
if (!fp) return NULL;
length = FileLength(fp);
#endif
buffer = GetClearedMemory(sizeof(script_t) + length + 1);
script = (script_t *) buffer;
Com_Memset(script, 0, sizeof(script_t));
strcpy(script->filename, filename);
script->buffer = (char *) buffer + sizeof(script_t);
script->buffer[length] = 0;
script->length = length;
//pointer in script buffer
script->script_p = script->buffer;
//pointer in script buffer before reading token
script->lastscript_p = script->buffer;
//pointer to end of script buffer
script->end_p = &script->buffer[length];
//set if there's a token available in script->token
script->tokenavailable = 0;
//
script->line = 1;
script->lastline = 1;
//
SetScriptPunctuations(script, NULL);
//
#ifdef BOTLIB
botimport.FS_Read(script->buffer, length, fp);
botimport.FS_FCloseFile(fp);
#else
if (fread(script->buffer, length, 1, fp) != 1)
{
FreeMemory(buffer);
script = NULL;
} //end if
fclose(fp);
#endif
//
script->length = COM_Compress(script->buffer);
return script;
} //end of the function LoadScriptFile
//============================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//============================================================================
script_t *LoadScriptMemory(char *ptr, int length, char *name)
{
void *buffer;
script_t *script;
buffer = GetClearedMemory(sizeof(script_t) + length + 1);
script = (script_t *) buffer;
Com_Memset(script, 0, sizeof(script_t));
strcpy(script->filename, name);
script->buffer = (char *) buffer + sizeof(script_t);
script->buffer[length] = 0;
script->length = length;
//pointer in script buffer
script->script_p = script->buffer;
//pointer in script buffer before reading token
script->lastscript_p = script->buffer;
//pointer to end of script buffer
script->end_p = &script->buffer[length];
//set if there's a token available in script->token
script->tokenavailable = 0;
//
script->line = 1;
script->lastline = 1;
//
SetScriptPunctuations(script, NULL);
//
Com_Memcpy(script->buffer, ptr, length);
//
return script;
} //end of the function LoadScriptMemory
//============================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//============================================================================
void FreeScript(script_t *script)
{
#ifdef PUNCTABLE
if (script->punctuationtable) FreeMemory(script->punctuationtable);
#endif //PUNCTABLE
FreeMemory(script);
} //end of the function FreeScript
//============================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//============================================================================
void PS_SetBaseFolder(char *path)
{
#ifdef BSPC
sprintf(basefolder, path);
#else
Com_sprintf(basefolder, sizeof(basefolder), path);
#endif
} //end of the function PS_SetBaseFolder
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -