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)14 void 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)23 void 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)30 void 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)37 void 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)45 bool 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)161 int Parser::GetOffset(void)
162 {
163   return (int) (buffer - buf_start);
164 }
165 
GoTo(const INT offset)166 void Parser::GoTo(const INT offset)
167 {
168   buffer = buf_start + offset;
169 
170 }
171