1 //----------------------------------------------------------------------------- 2 // Parser 3 //----------------------------------------------------------------------------- 4 5 #include "parser.h" 6 7 char Parser::token[MAXTOKEN]; // buffer for tokens 8 int Parser::scriptline; 9 VFile * Parser::file; 10 const byte *Parser::buffer; 11 const byte *Parser::buf_start; 12 const byte *Parser::buf_end; 13 StartParseFile(const char * name)14void Parser::StartParseFile(const char *name) 15 { 16 file = new VFile(name); 17 18 buf_start= buffer = file->mem; 19 buf_end = file->mem + file->size; 20 scriptline = 1; 21 } 22 StartParseBuffer(const BYTE * buff,const INT size)23void Parser::StartParseBuffer(const BYTE *buff, const INT size) 24 { 25 buf_start = buffer = buff; 26 buf_end = buff + size; 27 scriptline = 1; 28 } 29 StartParseString(const char * string)30void Parser::StartParseString(const char *string) 31 { 32 buf_start = buffer = (BYTE *) string; 33 buf_end = (BYTE *) string + strlen(string); 34 scriptline = 1; 35 } 36 StopParseFile(void)37void Parser::StopParseFile(void) 38 { 39 delete file; 40 } 41 42 // if crossline is false, GetToken returns false when a line break is found 43 // GetToken(true) returns 0 only if end of file 44 // GetToken(false) returns 0 if line break or end of file GetToken(bool crossline)45bool Parser::GetToken(bool crossline) 46 { 47 char *token_p; 48 49 if (!buffer) return 0; 50 if (buffer == buf_end) return 0; 51 52 *token = 0; // init to zero 53 54 // skip space 55 skipspace: 56 while (*buffer <= 32 || *buffer == '\n') 57 { 58 // no se si \n, \t y \r son menores que 32, pero supongo que s� 59 if (*buffer == '\n') ++scriptline; 60 if (buffer >= buf_end) 61 { 62 if (!crossline) 63 { 64 //gConsole->InsertLine("Line %i is incomplete", scriptline); 65 } 66 return 0; 67 } 68 69 if (!crossline) 70 { 71 if (*buffer == '\n') 72 { 73 --scriptline; 74 return 0; 75 } 76 } 77 ++buffer; 78 } 79 80 if (buffer >= buf_end) return 0; 81 82 // # // comments 83 if (*buffer == '#' || 84 (buffer[0] == '/' && buffer[1] == '/')) 85 { 86 while (*buffer++ != '\n') 87 { 88 if (buffer >= buf_end) return 0; 89 } 90 ++scriptline; 91 if (!crossline) return 0; 92 goto skipspace; 93 } 94 95 // /* */ comments 96 if (buffer[0] == '/' && buffer[1] == '*') 97 { 98 buffer += 2; 99 while (buffer[0] != '*' && 100 buffer[1] != '/') 101 { 102 ++buffer; 103 if (buffer >= buf_end) 104 { 105 //gConsole->InsertLine("*** Error: Premature end of file, '/*' without '*/'"); 106 return 0; 107 } 108 if (*buffer == '\n') ++scriptline; 109 } 110 buffer += 2; 111 goto skipspace; 112 } 113 114 // copy token 115 token_p = token; 116 117 if (*buffer == '"') 118 { 119 // quoted token 120 ++buffer; 121 while (*buffer != '"') 122 { 123 *token_p++ = *buffer++; 124 if (buffer == buf_end) break; 125 if (token_p == &token[MAXTOKEN]) 126 { 127 //gConsole->InsertLine("^1ERROR: Token too large on line %i",scriptline); 128 } 129 } 130 ++buffer; 131 } 132 else 133 { 134 // regular token 135 if (*buffer == '{' || 136 *buffer == '}') 137 { 138 *token_p++ = *buffer++; 139 *token_p = 0; 140 return 1; 141 } 142 while (*buffer > 32 && 143 *buffer != '\n' && 144 *buffer !='{' && 145 *buffer !='}') 146 { 147 *token_p++ = *buffer++; 148 if (buffer == buf_end) break; 149 if (token_p == &token[MAXTOKEN]) 150 { 151 //gConsole->InsertLine("^1ERROR: Token too large on line %i",scriptline); 152 } 153 } 154 } 155 156 *token_p = 0; 157 158 return 1; 159 } 160 GetOffset(void)161int Parser::GetOffset(void) 162 { 163 return (int) (buffer - buf_start); 164 } 165 GoTo(const INT offset)166void Parser::GoTo(const INT offset) 167 { 168 buffer = buf_start + offset; 169 170 } 171