📄 sc_man.c
字号:
//**************************************************************************//**//** sc_man.c : Heretic 2 : Raven Software, Corp.//**//** $RCSfile: sc_man.c,v $//** $Revision: 1.3 $//** $Date: 96/01/06 03:23:43 $//** $Author: bgokey $//**//**************************************************************************// HEADER FILES ------------------------------------------------------------#include <string.h>#include <stdlib.h>#include "h2def.h"// MACROS ------------------------------------------------------------------#define MAX_STRING_SIZE 64#define ASCII_COMMENT (';')#define ASCII_QUOTE (34)#define LUMP_SCRIPT 1#define FILE_ZONE_SCRIPT 2#define FILE_CLIB_SCRIPT 3// TYPES -------------------------------------------------------------------// EXTERNAL FUNCTION PROTOTYPES --------------------------------------------// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------// PRIVATE FUNCTION PROTOTYPES ---------------------------------------------static void CheckOpen(void);static void OpenScript(char *name, int type);// EXTERNAL DATA DECLARATIONS ----------------------------------------------// PUBLIC DATA DEFINITIONS -------------------------------------------------char *sc_String;int sc_Number;int sc_Line;boolean sc_End;boolean sc_Crossed;boolean sc_FileScripts = false;char *sc_ScriptsDir = "";// PRIVATE DATA DEFINITIONS ------------------------------------------------static char ScriptName[16];static char *ScriptBuffer;static char *ScriptPtr;static char *ScriptEndPtr;static char StringBuffer[MAX_STRING_SIZE];static boolean ScriptOpen = false;static boolean ScriptFreeCLib; // true = de-allocate using free()static int ScriptSize;static boolean AlreadyGot = false;// CODE --------------------------------------------------------------------//==========================================================================//// SC_Open////==========================================================================void SC_Open(char *name){ char fileName[128]; if(sc_FileScripts == true) { sprintf(fileName, "%s%s.txt", sc_ScriptsDir, name); SC_OpenFile(fileName); } else { SC_OpenLump(name); }}//==========================================================================//// SC_OpenLump//// Loads a script (from the WAD files) and prepares it for parsing.////==========================================================================void SC_OpenLump(char *name){ OpenScript(name, LUMP_SCRIPT);}//==========================================================================//// SC_OpenFile//// Loads a script (from a file) and prepares it for parsing. Uses the// zone memory allocator for memory allocation and de-allocation.////==========================================================================void SC_OpenFile(char *name){ OpenScript(name, FILE_ZONE_SCRIPT);}//==========================================================================//// SC_OpenFileCLib//// Loads a script (from a file) and prepares it for parsing. Uses C// library function calls for memory allocation and de-allocation.////==========================================================================void SC_OpenFileCLib(char *name){ OpenScript(name, FILE_CLIB_SCRIPT);}//==========================================================================//// OpenScript////==========================================================================static void OpenScript(char *name, int type){ SC_Close(); if(type == LUMP_SCRIPT) { // Lump script ScriptBuffer = (char *)W_CacheLumpName(name, PU_STATIC); ScriptSize = W_LumpLength(W_GetNumForName(name)); strcpy(ScriptName, name); ScriptFreeCLib = false; // De-allocate using Z_Free() } else if(type == FILE_ZONE_SCRIPT) { // File script - zone ScriptSize = M_ReadFile(name, (byte **)&ScriptBuffer); M_ExtractFileBase(name, ScriptName); ScriptFreeCLib = false; // De-allocate using Z_Free() } else { // File script - clib ScriptSize = M_ReadFileCLib(name, (byte **)&ScriptBuffer); M_ExtractFileBase(name, ScriptName); ScriptFreeCLib = true; // De-allocate using free() } ScriptPtr = ScriptBuffer; ScriptEndPtr = ScriptPtr+ScriptSize; sc_Line = 1; sc_End = false; ScriptOpen = true; sc_String = StringBuffer; AlreadyGot = false;}//==========================================================================//// SC_Close////==========================================================================void SC_Close(void){ if(ScriptOpen) { if(ScriptFreeCLib == true) { free(ScriptBuffer); } else { Z_Free(ScriptBuffer); } ScriptOpen = false; }}//==========================================================================//// SC_GetString////==========================================================================boolean SC_GetString(void){ char *text; boolean foundToken; CheckOpen(); if(AlreadyGot) { AlreadyGot = false; return true; } foundToken = false; sc_Crossed = false; if(ScriptPtr >= ScriptEndPtr) { sc_End = true; return false; } while(foundToken == false) { while(*ScriptPtr <= 32) { if(ScriptPtr >= ScriptEndPtr) { sc_End = true; return false; } if(*ScriptPtr++ == '\n') { sc_Line++; sc_Crossed = true; } } if(ScriptPtr >= ScriptEndPtr) { sc_End = true; return false; } if(*ScriptPtr != ASCII_COMMENT) { // Found a token foundToken = true; } else { // Skip comment while(*ScriptPtr++ != '\n') { if(ScriptPtr >= ScriptEndPtr) { sc_End = true; return false;
} } sc_Line++; sc_Crossed = true; } } text = sc_String; if(*ScriptPtr == ASCII_QUOTE) { // Quoted string ScriptPtr++; while(*ScriptPtr != ASCII_QUOTE) { *text++ = *ScriptPtr++; if(ScriptPtr == ScriptEndPtr || text == &sc_String[MAX_STRING_SIZE-1]) { break; } } ScriptPtr++; } else { // Normal string while((*ScriptPtr > 32) && (*ScriptPtr != ASCII_COMMENT)) { *text++ = *ScriptPtr++; if(ScriptPtr == ScriptEndPtr || text == &sc_String[MAX_STRING_SIZE-1]) { break; } } } *text = 0; return true;}//==========================================================================//// SC_MustGetString////==========================================================================void SC_MustGetString(void){ if(SC_GetString() == false) { SC_ScriptError("Missing string."); }}//==========================================================================//// SC_MustGetStringName////==========================================================================void SC_MustGetStringName(char *name){ SC_MustGetString(); if(SC_Compare(name) == false) { SC_ScriptError(NULL); }}//==========================================================================//// SC_GetNumber////==========================================================================boolean SC_GetNumber(void){ char *stopper; CheckOpen(); if(SC_GetString()) { sc_Number = strtol(sc_String, &stopper, 0); if(*stopper != 0) { I_Error("SC_GetNumber: Bad numeric constant \"%s\".\n" "Script %s, Line %d", sc_String, ScriptName, sc_Line); } return true; } else { return false; }}//==========================================================================//// SC_MustGetNumber////==========================================================================void SC_MustGetNumber(void){ if(SC_GetNumber() == false) { SC_ScriptError("Missing integer."); }}//==========================================================================//// SC_UnGet//// Assumes there is a valid string in sc_String.////==========================================================================void SC_UnGet(void){ AlreadyGot = true;}//==========================================================================//// SC_Check//// Returns true if another token is on the current line.////==========================================================================/*boolean SC_Check(void){ char *text; CheckOpen(); text = ScriptPtr; if(text >= ScriptEndPtr) { return false; } while(*text <= 32) { if(*text == '\n') { return false; } text++; if(text == ScriptEndPtr) { return false; } } if(*text == ASCII_COMMENT) { return false; } return true;}*///==========================================================================//// SC_MatchString//// Returns the index of the first match to sc_String from the passed// array of strings, or -1 if not found.////==========================================================================int SC_MatchString(char **strings){ int i; for(i = 0; *strings != NULL; i++) { if(SC_Compare(*strings++)) { return i; } } return -1;}//==========================================================================//// SC_MustMatchString////==========================================================================int SC_MustMatchString(char **strings){ int i; i = SC_MatchString(strings); if(i == -1) { SC_ScriptError(NULL); } return i;}//==========================================================================//// SC_Compare////==========================================================================boolean SC_Compare(char *text){ if(strcasecmp(text, sc_String) == 0) { return true; } return false;}//==========================================================================//// SC_ScriptError////==========================================================================void SC_ScriptError(char *message){ if(message == NULL) { message = "Bad syntax."; } I_Error("Script error, \"%s\" line %d: %s", ScriptName, sc_Line, message);}//==========================================================================//// CheckOpen////==========================================================================static void CheckOpen(void){ if(ScriptOpen == false) { I_Error("SC_ call before SC_Open()."); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -