2 //**************************************************************************
4 //** sc_man.c : Heretic 2 : Raven Software, Corp.
11 //**************************************************************************
13 // HEADER FILES ------------------------------------------------------------
19 // MACROS ------------------------------------------------------------------
21 #define MAX_STRING_SIZE 64
22 #define ASCII_COMMENT (';')
23 #define ASCII_QUOTE (34)
25 #define FILE_ZONE_SCRIPT 2
26 #define FILE_CLIB_SCRIPT 3
28 // TYPES -------------------------------------------------------------------
30 // EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
32 // PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
34 // PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
36 static void CheckOpen(void);
37 static void OpenScript(char *name, int type);
39 // EXTERNAL DATA DECLARATIONS ----------------------------------------------
41 // PUBLIC DATA DEFINITIONS -------------------------------------------------
48 boolean sc_FileScripts = false;
49 char *sc_ScriptsDir = "";
51 // PRIVATE DATA DEFINITIONS ------------------------------------------------
53 static char ScriptName[16];
54 static char *ScriptBuffer;
55 static char *ScriptPtr;
56 static char *ScriptEndPtr;
57 static char StringBuffer[MAX_STRING_SIZE];
58 static boolean ScriptOpen = false;
59 static boolean ScriptFreeCLib; // true = de-allocate using free()
60 static int ScriptSize;
61 static boolean AlreadyGot = false;
63 // CODE --------------------------------------------------------------------
65 //==========================================================================
69 //==========================================================================
71 void SC_Open(char *name)
75 if(sc_FileScripts == true)
77 sprintf(fileName, "%s%s.txt", sc_ScriptsDir, name);
78 SC_OpenFile(fileName);
86 //==========================================================================
90 // Loads a script (from the WAD files) and prepares it for parsing.
92 //==========================================================================
94 void SC_OpenLump(char *name)
96 OpenScript(name, LUMP_SCRIPT);
99 //==========================================================================
103 // Loads a script (from a file) and prepares it for parsing. Uses the
104 // zone memory allocator for memory allocation and de-allocation.
106 //==========================================================================
108 void SC_OpenFile(char *name)
110 OpenScript(name, FILE_ZONE_SCRIPT);
113 //==========================================================================
117 // Loads a script (from a file) and prepares it for parsing. Uses C
118 // library function calls for memory allocation and de-allocation.
120 //==========================================================================
122 void SC_OpenFileCLib(char *name)
124 OpenScript(name, FILE_CLIB_SCRIPT);
127 //==========================================================================
131 //==========================================================================
133 static void OpenScript(char *name, int type)
136 if(type == LUMP_SCRIPT)
138 ScriptBuffer = (char *)W_CacheLumpName(name, PU_STATIC);
139 ScriptSize = W_LumpLength(W_GetNumForName(name));
140 strcpy(ScriptName, name);
141 ScriptFreeCLib = false; // De-allocate using Z_Free()
143 else if(type == FILE_ZONE_SCRIPT)
144 { // File script - zone
145 ScriptSize = M_ReadFile(name, (byte **)&ScriptBuffer);
146 M_ExtractFileBase(name, ScriptName);
147 ScriptFreeCLib = false; // De-allocate using Z_Free()
150 { // File script - clib
151 ScriptSize = M_ReadFileCLib(name, (byte **)&ScriptBuffer);
152 M_ExtractFileBase(name, ScriptName);
153 ScriptFreeCLib = true; // De-allocate using free()
155 ScriptPtr = ScriptBuffer;
156 ScriptEndPtr = ScriptPtr+ScriptSize;
160 sc_String = StringBuffer;
164 //==========================================================================
168 //==========================================================================
174 if(ScriptFreeCLib == true)
180 Z_Free(ScriptBuffer);
186 //==========================================================================
190 //==========================================================================
192 boolean SC_GetString(void)
205 if(ScriptPtr >= ScriptEndPtr)
210 while(foundToken == false)
212 while(*ScriptPtr <= 32)
214 if(ScriptPtr >= ScriptEndPtr)
219 if(*ScriptPtr++ == '\n')
225 if(ScriptPtr >= ScriptEndPtr)
230 if(*ScriptPtr != ASCII_COMMENT)
236 while(*ScriptPtr++ != '\n')
238 if(ScriptPtr >= ScriptEndPtr)
250 if(*ScriptPtr == ASCII_QUOTE)
253 while(*ScriptPtr != ASCII_QUOTE)
255 *text++ = *ScriptPtr++;
256 if(ScriptPtr == ScriptEndPtr
257 || text == &sc_String[MAX_STRING_SIZE-1])
266 while((*ScriptPtr > 32) && (*ScriptPtr != ASCII_COMMENT))
268 *text++ = *ScriptPtr++;
269 if(ScriptPtr == ScriptEndPtr
270 || text == &sc_String[MAX_STRING_SIZE-1])
280 //==========================================================================
284 //==========================================================================
286 void SC_MustGetString(void)
288 if(SC_GetString() == false)
290 SC_ScriptError("Missing string.");
294 //==========================================================================
296 // SC_MustGetStringName
298 //==========================================================================
300 void SC_MustGetStringName(char *name)
303 if(SC_Compare(name) == false)
305 SC_ScriptError(NULL);
309 //==========================================================================
313 //==========================================================================
315 boolean SC_GetNumber(void)
322 sc_Number = strtol(sc_String, &stopper, 0);
325 I_Error("SC_GetNumber: Bad numeric constant \"%s\".\n"
326 "Script %s, Line %d", sc_String, ScriptName, sc_Line);
336 //==========================================================================
340 //==========================================================================
342 void SC_MustGetNumber(void)
344 if(SC_GetNumber() == false)
346 SC_ScriptError("Missing integer.");
350 //==========================================================================
354 // Assumes there is a valid string in sc_String.
356 //==========================================================================
363 //==========================================================================
367 // Returns true if another token is on the current line.
369 //==========================================================================
372 boolean SC_Check(void)
378 if(text >= ScriptEndPtr)
389 if(text == ScriptEndPtr)
394 if(*text == ASCII_COMMENT)
402 //==========================================================================
406 // Returns the index of the first match to sc_String from the passed
407 // array of strings, or -1 if not found.
409 //==========================================================================
411 int SC_MatchString(char **strings)
415 for(i = 0; *strings != NULL; i++)
417 if(SC_Compare(*strings++))
425 //==========================================================================
427 // SC_MustMatchString
429 //==========================================================================
431 int SC_MustMatchString(char **strings)
435 i = SC_MatchString(strings);
438 SC_ScriptError(NULL);
443 //==========================================================================
447 //==========================================================================
449 boolean SC_Compare(char *text)
451 if(strcasecmp(text, sc_String) == 0)
458 //==========================================================================
462 //==========================================================================
464 void SC_ScriptError(char *message)
468 message = "Bad syntax.";
470 I_Error("Script error, \"%s\" line %d: %s", ScriptName,
474 //==========================================================================
478 //==========================================================================
480 static void CheckOpen(void)
482 if(ScriptOpen == false)
484 I_Error("SC_ call before SC_Open().");