2 //**************************************************************************
\r
6 //**************************************************************************
\r
8 // HEADER FILES ------------------------------------------------------------
\r
29 // MACROS ------------------------------------------------------------------
\r
31 #define NON_HEX_DIGIT 255
\r
32 #define MAX_NESTED_SOURCES 16
\r
34 // TYPES -------------------------------------------------------------------
\r
52 boolean incLineNumber;
\r
54 enum ImportModes prevMode;
\r
58 // EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
\r
60 // PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
\r
62 // PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
\r
64 static int SortKeywords(const void *a, const void *b);
\r
65 static void MakeIncludePath(char *sourceName);
\r
66 static int PopNestedSource(enum ImportModes *prevMode);
\r
67 static void ProcessLetterToken(void);
\r
68 static void ProcessNumberToken(void);
\r
69 static void EvalFixedConstant(int whole);
\r
70 static void EvalHexConstant(void);
\r
71 static void EvalRadixConstant(void);
\r
72 static int DigitValue(char digit, int radix);
\r
73 static void ProcessQuoteToken(void);
\r
74 static void ProcessSpecialToken(void);
\r
75 static boolean CheckForKeyword(void);
\r
76 static boolean CheckForLineSpecial(void);
\r
77 static boolean CheckForConstant(void);
\r
78 static void NextChr(void);
\r
79 static void SkipComment(void);
\r
80 static void SkipCPPComment(void);
\r
81 static void BumpMasterSourceLine(char Chr, boolean clear); // master line - Ty 07jan2000
\r
82 static char *AddFileName(const char *name);
\r
83 static int OctalChar();
\r
85 // EXTERNAL DATA DECLARATIONS ----------------------------------------------
\r
87 // PUBLIC DATA DEFINITIONS -------------------------------------------------
\r
89 tokenType_t tk_Token;
\r
93 U_BYTE tk_SpecialValue;
\r
94 int tk_SpecialArgCount;
\r
95 char *tk_SourceName;
\r
96 int tk_IncludedLines;
\r
97 boolean forSemicolonHack;
\r
98 char MasterSourceLine[MAX_STATEMENT_LENGTH+1]; // master line - Ty 07jan2000
\r
99 int MasterSourcePos; // master position - Ty 07jan2000
\r
100 int PrevMasterSourcePos; // previous master position - RH 09feb2000
\r
101 boolean ClearMasterSourceLine; // master clear flag - Ty 07jan2000
\r
103 // PRIVATE DATA DEFINITIONS ------------------------------------------------
\r
106 static char *FileStart;
\r
107 static char *FilePtr;
\r
108 static char *FileEnd;
\r
109 static boolean SourceOpen;
\r
110 static char ASCIIToChrCode[256];
\r
111 static byte ASCIIToHexDigit[256];
\r
112 static char TokenStringBuffer[MAX_QUOTED_LENGTH];
\r
113 static nestInfo_t OpenFiles[MAX_NESTED_SOURCES];
\r
114 static boolean AlreadyGot;
\r
115 static int NestDepth;
\r
116 static boolean IncLineNumber;
\r
117 static char IncludePath[MAX_FILE_NAME_LENGTH];
\r
118 static char *FileNames;
\r
119 static size_t FileNamesLen, FileNamesMax;
\r
121 static struct keyword_s
\r
127 { "break", TK_BREAK },
\r
128 { "case", TK_CASE },
\r
129 { "const", TK_CONST },
\r
130 { "continue", TK_CONTINUE },
\r
131 { "default", TK_DEFAULT },
\r
132 { "define", TK_DEFINE },
\r
134 { "else", TK_ELSE },
\r
136 { "goto", TK_GOTO },
\r
138 { "include", TK_INCLUDE },
\r
140 { "open", TK_OPEN },
\r
141 { "print", TK_PRINT },
\r
142 { "printbold", TK_PRINTBOLD },
\r
144 { "hudmessage", TK_HUDMESSAGE },
\r
145 { "hudmessagebold", TK_HUDMESSAGEBOLD },
\r
146 { "restart", TK_RESTART },
\r
147 { "script", TK_SCRIPT },
\r
148 { "special", TK_SPECIAL },
\r
150 { "suspend", TK_SUSPEND },
\r
151 { "switch", TK_SWITCH },
\r
152 { "terminate", TK_TERMINATE },
\r
153 { "until", TK_UNTIL },
\r
154 { "void", TK_VOID },
\r
155 { "while", TK_WHILE },
\r
156 { "world", TK_WORLD },
\r
157 { "global", TK_GLOBAL },
\r
158 // [BC] Start Skulltag tokens.
\r
159 { "respawn", TK_RESPAWN },
\r
160 { "death", TK_DEATH },
\r
161 { "enter", TK_ENTER },
\r
162 { "pickup", TK_PICKUP },
\r
163 { "bluereturn", TK_BLUERETURN },
\r
164 { "redreturn", TK_REDRETURN },
\r
165 { "whitereturn", TK_WHITERETURN },
\r
166 // [BC] End Skulltag tokens.
\r
167 { "nocompact", TK_NOCOMPACT },
\r
168 { "lightning", TK_LIGHTNING },
\r
169 { "createtranslation", TK_CREATETRANSLATION },
\r
170 { "function", TK_FUNCTION },
\r
171 { "return", TK_RETURN },
\r
172 { "wadauthor", TK_WADAUTHOR },
\r
173 { "nowadauthor", TK_NOWADAUTHOR },
\r
174 { "acs_executewait", TK_ACSEXECUTEWAIT },
\r
175 { "encryptstrings", TK_ENCRYPTSTRINGS },
\r
176 { "import", TK_IMPORT },
\r
177 { "library", TK_LIBRARY },
\r
178 { "libdefine", TK_LIBDEFINE },
\r
179 { "bool", TK_BOOL },
\r
181 { "disconnect", TK_DISCONNECT },
\r
182 { "unloading", TK_UNLOADING },
\r
183 { "static", TK_STATIC }
\r
186 #define NUM_KEYWORDS (sizeof(Keywords)/sizeof(Keywords[0]))
\r
188 // CODE --------------------------------------------------------------------
\r
190 //==========================================================================
\r
194 //==========================================================================
\r
200 for(i = 0; i < 256; i++)
\r
202 ASCIIToChrCode[i] = CHR_SPECIAL;
\r
203 ASCIIToHexDigit[i] = NON_HEX_DIGIT;
\r
205 for(i = '0'; i <= '9'; i++)
\r
207 ASCIIToChrCode[i] = CHR_NUMBER;
\r
208 ASCIIToHexDigit[i] = i-'0';
\r
210 for(i = 'A'; i <= 'F'; i++)
\r
212 ASCIIToHexDigit[i] = 10+(i-'A');
\r
214 for(i = 'a'; i <= 'f'; i++)
\r
216 ASCIIToHexDigit[i] = 10+(i-'a');
\r
218 for(i = 'A'; i <= 'Z'; i++)
\r
220 ASCIIToChrCode[i] = CHR_LETTER;
\r
222 for(i = 'a'; i <= 'z'; i++)
\r
224 ASCIIToChrCode[i] = CHR_LETTER;
\r
226 ASCIIToChrCode[ASCII_QUOTE] = CHR_QUOTE;
\r
227 ASCIIToChrCode[ASCII_UNDERSCORE] = CHR_LETTER;
\r
228 ASCIIToChrCode[EOF_CHARACTER] = CHR_EOF;
\r
229 tk_String = TokenStringBuffer;
\r
230 IncLineNumber = FALSE;
\r
231 tk_IncludedLines = 0;
\r
232 SourceOpen = FALSE;
\r
233 *MasterSourceLine = '\0'; // master line - Ty 07jan2000
\r
234 MasterSourcePos = 0; // master position - Ty 07jan2000
\r
235 ClearMasterSourceLine = TRUE; // clear the line to start
\r
236 qsort (Keywords, NUM_KEYWORDS, sizeof(Keywords[0]), SortKeywords);
\r
237 FileNames = MS_Alloc(4096, ERR_OUT_OF_MEMORY);
\r
239 FileNamesMax = 4096;
\r
242 //==========================================================================
\r
246 //==========================================================================
\r
248 static int SortKeywords(const void *a, const void *b)
\r
250 return strcmp (((struct keyword_s *)a)->name,
\r
251 ((struct keyword_s *)b)->name);
\r
254 //==========================================================================
\r
258 //==========================================================================
\r
260 void TK_OpenSource(char *fileName)
\r
265 size = MS_LoadFile(fileName, &FileStart);
\r
266 tk_SourceName = AddFileName(fileName);
\r
267 MakeIncludePath(fileName);
\r
269 FileEnd = FileStart+size;
\r
270 FilePtr = FileStart;
\r
272 tk_Token = TK_NONE;
\r
273 AlreadyGot = FALSE;
\r
278 //==========================================================================
\r
282 //==========================================================================
\r
284 static char *AddFileName(const char *name)
\r
286 size_t len = strlen(name) + 1;
\r
289 if (FileNamesLen + len > FileNamesMax)
\r
291 FileNames = MS_Alloc(FileNamesMax, ERR_OUT_OF_MEMORY);
\r
294 namespot = FileNames + FileNamesLen;
\r
295 memcpy(namespot, name, len);
\r
296 FileNamesLen += len;
\r
300 //==========================================================================
\r
304 //==========================================================================
\r
306 static void MakeIncludePath(char *sourceName)
\r
308 strcpy(IncludePath, sourceName);
\r
309 if(MS_StripFilename(IncludePath) == NO)
\r
311 IncludePath[0] = 0;
\r
314 { // Add a directory delimiter to the include path
\r
315 strcat(IncludePath, DIRECTORY_DELIMITER);
\r
319 //==========================================================================
\r
323 //==========================================================================
\r
325 void TK_Include(char *fileName)
\r
327 char sourceName[MAX_FILE_NAME_LENGTH];
\r
331 MS_Message(MSG_DEBUG, "*Including %s\n", fileName);
\r
332 if(NestDepth == MAX_NESTED_SOURCES)
\r
334 ERR_Exit(ERR_INCL_NESTING_TOO_DEEP, YES, fileName);
\r
336 info = &OpenFiles[NestDepth++];
\r
337 info->name = tk_SourceName;
\r
338 info->start = FileStart;
\r
339 info->end = FileEnd;
\r
340 info->position = FilePtr;
\r
341 info->line = tk_Line;
\r
342 info->incLineNumber = IncLineNumber;
\r
343 info->lastChar = Chr;
\r
344 info->imported = NO;
\r
345 strcpy(sourceName, IncludePath);
\r
346 strcat(sourceName, fileName);
\r
347 tk_SourceName = AddFileName(sourceName);
\r
348 size = MS_LoadFile(tk_SourceName, &FileStart);
\r
349 FileEnd = FileStart+size;
\r
350 FilePtr = FileStart;
\r
352 IncLineNumber = FALSE;
\r
353 tk_Token = TK_NONE;
\r
354 AlreadyGot = FALSE;
\r
355 BumpMasterSourceLine('x',TRUE); // dummy x
\r
359 //==========================================================================
\r
363 //==========================================================================
\r
365 void TK_Import(char *fileName, enum ImportModes prevMode)
\r
367 TK_Include (fileName);
\r
368 OpenFiles[NestDepth - 1].imported = YES;
\r
369 OpenFiles[NestDepth - 1].prevMode = prevMode;
\r
370 ImportMode = IMPORT_Importing;
\r
373 //==========================================================================
\r
377 //==========================================================================
\r
379 static int PopNestedSource(enum ImportModes *prevMode)
\r
383 MS_Message(MSG_DEBUG, "*Leaving %s\n", tk_SourceName);
\r
385 tk_IncludedLines += tk_Line;
\r
386 info = &OpenFiles[--NestDepth];
\r
387 tk_SourceName = info->name;
\r
388 FileStart = info->start;
\r
389 FileEnd = info->end;
\r
390 FilePtr = info->position;
\r
391 tk_Line = info->line;
\r
392 IncLineNumber = info->incLineNumber;
\r
393 Chr = info->lastChar;
\r
394 tk_Token = TK_NONE;
\r
395 AlreadyGot = FALSE;
\r
396 *prevMode = info->prevMode;
\r
397 return info->imported ? 2 : 0;
\r
400 //==========================================================================
\r
404 //==========================================================================
\r
406 void TK_CloseSource(void)
\r
413 for(i = 0; i < NestDepth; i++)
\r
415 free(OpenFiles[i].start);
\r
417 SourceOpen = FALSE;
\r
421 //==========================================================================
\r
425 //==========================================================================
\r
427 tokenType_t TK_NextToken(void)
\r
429 enum ImportModes prevMode;
\r
430 boolean validToken;
\r
432 if(AlreadyGot == TRUE)
\r
434 int t = MasterSourcePos;
\r
435 MasterSourcePos = PrevMasterSourcePos;
\r
436 PrevMasterSourcePos = t;
\r
437 AlreadyGot = FALSE;
\r
441 PrevMasterSourcePos = MasterSourcePos;
\r
444 while(Chr == ASCII_SPACE)
\r
448 switch(ASCIIToChrCode[(byte)Chr])
\r
454 ProcessLetterToken();
\r
457 ProcessNumberToken();
\r
460 ProcessQuoteToken();
\r
463 ProcessSpecialToken();
\r
466 if(tk_Token == TK_STARTCOMMENT)
\r
470 else if(tk_Token == TK_CPPCOMMENT)
\r
474 else if((tk_Token == TK_EOF) && (NestDepth > 0))
\r
476 if (PopNestedSource(&prevMode))
\r
478 ImportMode = prevMode;
\r
479 if(!ExporterFlagged)
\r
481 ERR_Exit(ERR_EXPORTER_NOT_FLAGGED, NO);
\r
490 } while(validToken == NO);
\r
494 //==========================================================================
\r
496 // TK_NextCharacter
\r
498 //==========================================================================
\r
500 int TK_NextCharacter(void)
\r
504 while(Chr == ASCII_SPACE)
\r
509 if(c == EOF_CHARACTER)
\r
517 //==========================================================================
\r
521 //==========================================================================
\r
523 void TK_SkipPast(tokenType_t token)
\r
525 while (tk_Token != token)
\r
532 //==========================================================================
\r
536 //==========================================================================
\r
538 void TK_SkipTo(tokenType_t token)
\r
540 while (tk_Token != token)
\r
546 //==========================================================================
\r
548 // TK_NextTokenMustBe
\r
550 //==========================================================================
\r
552 boolean TK_NextTokenMustBe(tokenType_t token, error_t error)
\r
554 if(TK_NextToken() != token)
\r
556 ERR_Error(error, YES);
\r
558 if(skipToken == TK_EOF)
\r
562 else if(skipToken != TK_NONE)
\r
564 TK_SkipPast(skipToken);
\r
573 //==========================================================================
\r
577 //==========================================================================
\r
579 boolean TK_TokenMustBe(tokenType_t token, error_t error)
\r
581 if (token == TK_SEMICOLON && forSemicolonHack)
\r
585 if(tk_Token != token)
\r
587 ERR_Error(error, YES);
\r
589 if(skipToken == TK_EOF)
\r
593 else if(skipToken != TK_NONE)
\r
595 while(tk_Token != skipToken)
\r
607 //==========================================================================
\r
611 //==========================================================================
\r
613 boolean TK_Member(tokenType_t *list)
\r
617 for(i = 0; list[i] != TK_NONE; i++)
\r
619 if(tk_Token == list[i])
\r
627 //==========================================================================
\r
631 //==========================================================================
\r
635 if(tk_Token != TK_NONE)
\r
637 if (AlreadyGot == FALSE)
\r
639 int t = MasterSourcePos;
\r
640 MasterSourcePos = PrevMasterSourcePos;
\r
641 PrevMasterSourcePos = t;
\r
647 //==========================================================================
\r
649 // ProcessLetterToken
\r
651 //==========================================================================
\r
653 static void ProcessLetterToken(void)
\r
659 text = TokenStringBuffer;
\r
660 while (ASCIIToChrCode[(byte)Chr] == CHR_LETTER
\r
661 || ASCIIToChrCode[(byte)Chr] == CHR_NUMBER)
\r
663 if(++i == MAX_IDENTIFIER_LENGTH)
\r
665 ERR_Error(ERR_IDENTIFIER_TOO_LONG, YES);
\r
667 if(i < MAX_IDENTIFIER_LENGTH)
\r
674 MS_StrLwr(TokenStringBuffer);
\r
675 if(CheckForKeyword() == FALSE
\r
676 && CheckForLineSpecial() == FALSE
\r
677 && CheckForConstant() == FALSE)
\r
679 tk_Token = TK_IDENTIFIER;
\r
683 //==========================================================================
\r
687 //==========================================================================
\r
689 static boolean CheckForKeyword(void)
\r
691 int min, max, probe, lexx;
\r
693 // [RH] Use a binary search
\r
695 max = NUM_KEYWORDS-1;
\r
696 probe = NUM_KEYWORDS/2;
\r
698 while (max - min >= 0)
\r
700 lexx = strcmp(tk_String, Keywords[probe].name);
\r
703 tk_Token = Keywords[probe].token;
\r
714 probe = (max-min)/2+min;
\r
719 //==========================================================================
\r
721 // CheckForLineSpecial
\r
723 //==========================================================================
\r
725 static boolean CheckForLineSpecial(void)
\r
729 sym = SY_FindGlobal(tk_String);
\r
734 if(sym->type != SY_SPECIAL)
\r
738 tk_Token = TK_LINESPECIAL;
\r
739 tk_SpecialValue = sym->info.special.value;
\r
740 tk_SpecialArgCount = sym->info.special.argCount;
\r
744 //==========================================================================
\r
746 // CheckForConstant
\r
748 //==========================================================================
\r
750 static boolean CheckForConstant(void)
\r
754 sym = SY_FindGlobal(tk_String);
\r
759 if(sym->type != SY_CONSTANT)
\r
763 tk_Token = TK_NUMBER;
\r
764 tk_Number = sym->info.constant.value;
\r
768 //==========================================================================
\r
770 // ProcessNumberToken
\r
772 //==========================================================================
\r
774 static void ProcessNumberToken(void)
\r
780 if(c == '0' && (Chr == 'x' || Chr == 'X'))
\r
781 { // Hexadecimal constant
\r
787 while(ASCIIToChrCode[(byte)Chr] == CHR_NUMBER)
\r
789 tk_Number = 10*tk_Number+(Chr-'0');
\r
794 NextChr(); // Skip period
\r
795 EvalFixedConstant(tk_Number);
\r
798 if(Chr == ASCII_UNDERSCORE)
\r
800 NextChr(); // Skip underscore
\r
801 EvalRadixConstant();
\r
804 tk_Token = TK_NUMBER;
\r
807 //==========================================================================
\r
809 // EvalFixedConstant
\r
811 //==========================================================================
\r
813 static void EvalFixedConstant(int whole)
\r
820 while(ASCIIToChrCode[(byte)Chr] == CHR_NUMBER)
\r
822 frac = 10*frac+(Chr-'0');
\r
826 tk_Number = (whole<<16)+((frac<<16)/divisor);
\r
827 tk_Token = TK_NUMBER;
\r
830 //==========================================================================
\r
834 //==========================================================================
\r
836 static void EvalHexConstant(void)
\r
839 while(ASCIIToHexDigit[(byte)Chr] != NON_HEX_DIGIT)
\r
841 tk_Number = (tk_Number<<4)+ASCIIToHexDigit[(byte)Chr];
\r
844 tk_Token = TK_NUMBER;
\r
847 //==========================================================================
\r
849 // EvalRadixConstant
\r
851 //==========================================================================
\r
853 static void EvalRadixConstant(void)
\r
859 if(radix < 2 || radix > 36)
\r
861 ERR_Error(ERR_BAD_RADIX_CONSTANT, YES, NULL);
\r
865 while((digitVal = DigitValue(Chr, radix)) != -1)
\r
867 tk_Number = radix*tk_Number+digitVal;
\r
870 tk_Token = TK_NUMBER;
\r
873 //==========================================================================
\r
877 // Returns -1 if the digit is not allowed in the specified radix.
\r
879 //==========================================================================
\r
881 static int DigitValue(char digit, int radix)
\r
883 digit = toupper(digit);
\r
884 if(digit < '0' || (digit > '9' && digit < 'A') || digit > 'Z')
\r
890 digit = 10+digit-'A';
\r
903 //==========================================================================
\r
905 // ProcessQuoteToken
\r
907 //==========================================================================
\r
909 static void ProcessQuoteToken(void)
\r
917 text = TokenStringBuffer;
\r
919 while(Chr != EOF_CHARACTER)
\r
921 if(Chr == ASCII_QUOTE && escaped == 0) // [JB]
\r
925 if(++i == MAX_QUOTED_LENGTH)
\r
927 ERR_Error(ERR_STRING_TOO_LONG, YES, NULL);
\r
929 if(i < MAX_QUOTED_LENGTH)
\r
933 // escape the character after a backslash [JB]
\r
934 if(Chr == ASCII_BACKSLASH)
\r
935 escaped ^= (Chr == ASCII_BACKSLASH);
\r
941 if(Chr == ASCII_QUOTE)
\r
945 tk_Token = TK_STRING;
\r
948 //==========================================================================
\r
950 // ProcessSpecialToken
\r
952 //==========================================================================
\r
954 static void ProcessSpecialToken(void)
\r
966 tk_Token = TK_ADDASSIGN;
\r
974 tk_Token = TK_PLUS;
\r
982 tk_Token = TK_SUBASSIGN;
\r
990 tk_Token = TK_MINUS;
\r
998 tk_Token = TK_MULASSIGN;
\r
1002 tk_Token = TK_ENDCOMMENT;
\r
1006 tk_Token = TK_ASTERISK;
\r
1014 tk_Token = TK_DIVASSIGN;
\r
1018 tk_Token = TK_CPPCOMMENT;
\r
1021 tk_Token = TK_STARTCOMMENT;
\r
1025 tk_Token = TK_SLASH;
\r
1032 tk_Token = TK_MODASSIGN;
\r
1037 tk_Token = TK_PERCENT;
\r
1048 tk_Token = TK_ASSIGN;
\r
1057 else if(Chr == '<')
\r
1059 tk_Token = TK_LSHIFT;
\r
1073 else if(Chr == '>')
\r
1075 tk_Token = TK_RSHIFT;
\r
1091 tk_Token = TK_NOT;
\r
1097 tk_Token = TK_ANDLOGICAL;
\r
1102 tk_Token = TK_ANDBITWISE;
\r
1108 tk_Token = TK_ORLOGICAL;
\r
1113 tk_Token = TK_ORBITWISE;
\r
1117 tk_Token = TK_LPAREN;
\r
1120 tk_Token = TK_RPAREN;
\r
1123 tk_Token = TK_LBRACE;
\r
1126 tk_Token = TK_RBRACE;
\r
1129 tk_Token = TK_LBRACKET;
\r
1132 tk_Token = TK_RBRACKET;
\r
1135 tk_Token = TK_COLON;
\r
1138 tk_Token = TK_SEMICOLON;
\r
1141 tk_Token = TK_COMMA;
\r
1144 tk_Token = TK_PERIOD;
\r
1147 tk_Token = TK_NUMBERSIGN;
\r
1150 tk_Token = TK_EORBITWISE;
\r
1153 tk_Token = TK_TILDE;
\r
1161 case '0': case '1': case '2': case '3':
\r
1162 case '4': case '5': case '6': case '7':
\r
1163 tk_Number = OctalChar();
\r
1165 case 'x': case 'X':
\r
1167 EvalHexConstant();
\r
1170 ERR_Exit(ERR_BAD_CHARACTER_CONSTANT, YES, NULL);
\r
1199 ERR_Exit(ERR_BAD_CHARACTER_CONSTANT, YES, NULL);
\r
1201 tk_Token = TK_NUMBER;
\r
1203 else if(Chr == '\'')
\r
1205 ERR_Exit(ERR_BAD_CHARACTER_CONSTANT, YES, NULL);
\r
1210 tk_Token = TK_NUMBER;
\r
1215 ERR_Exit(ERR_BAD_CHARACTER_CONSTANT, YES, NULL);
\r
1220 ERR_Exit(ERR_BAD_CHARACTER, YES, NULL);
\r
1225 //==========================================================================
\r
1229 //==========================================================================
\r
1231 static void NextChr(void)
\r
1233 if(FilePtr >= FileEnd)
\r
1235 Chr = EOF_CHARACTER;
\r
1238 if(IncLineNumber == TRUE)
\r
1241 IncLineNumber = FALSE;
\r
1242 BumpMasterSourceLine('x',TRUE); // dummy x
\r
1245 if(Chr < ASCII_SPACE && Chr >= 0) // Allow high ASCII characters
\r
1249 IncLineNumber = TRUE;
\r
1251 Chr = ASCII_SPACE;
\r
1253 BumpMasterSourceLine(Chr,FALSE);
\r
1256 //==========================================================================
\r
1258 // PeekChr // [JB]
\r
1260 //==========================================================================
\r
1262 static int PeekChr(void)
\r
1265 if(FilePtr >= FileEnd)
\r
1267 return EOF_CHARACTER;
\r
1270 if(ch < ASCII_SPACE && ch >= 0) // Allow high ASCII characters
\r
1277 //==========================================================================
\r
1279 // OctalChar // [JB]
\r
1281 //==========================================================================
\r
1283 static int OctalChar()
\r
1286 int code = Chr - '0';
\r
1287 while(digits < 4 && PeekChr() >= '0' && PeekChr() <= '7')
\r
1290 code = (code << 3) + Chr - '0';
\r
1295 //==========================================================================
\r
1299 //==========================================================================
\r
1301 void SkipComment(void)
\r
1306 while(Chr != EOF_CHARACTER)
\r
1308 if(first == TRUE && Chr == '/')
\r
1312 first = (Chr == '*');
\r
1318 //==========================================================================
\r
1322 //==========================================================================
\r
1324 void SkipCPPComment(void)
\r
1326 while(FilePtr < FileEnd)
\r
1328 if(*FilePtr++ == '\n')
\r
1331 BumpMasterSourceLine('x',TRUE); // dummy x
\r
1338 //==========================================================================
\r
1340 // BumpMasterSourceLine
\r
1342 //==========================================================================
\r
1344 void BumpMasterSourceLine(char Chr, boolean clear) // master line - Ty 07jan2000
\r
1346 if (ClearMasterSourceLine) // set to clear last time, clear now for first character
\r
1348 *MasterSourceLine = '\0';
\r
1349 MasterSourcePos = 0;
\r
1350 ClearMasterSourceLine = FALSE;
\r
1354 ClearMasterSourceLine = TRUE;
\r
1358 if (MasterSourcePos < MAX_STATEMENT_LENGTH)
\r
1359 MasterSourceLine[MasterSourcePos++] = Chr;
\r
1363 //==========================================================================
\r
1367 //==========================================================================
\r
1369 void TK_SkipLine(void)
\r
1371 char *sourcenow = tk_SourceName;
\r
1372 int linenow = tk_Line;
\r
1373 do TK_NextToken(); while (tk_Line == linenow && tk_SourceName == sourcenow);
\r