123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486 |
- //**************************************************************************
- //**
- //** 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().");
- }
- }
|