]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/CodeTools/Source/Pccts/h/ATokenBuffer.cpp
More renames for Tool Packages
[mirror_edk2.git] / Tools / CodeTools / Source / Pccts / h / ATokenBuffer.cpp
CommitLineData
878ddf1f 1/* ANTLRTokenBuffer.cpp\r
2 *\r
3 * SOFTWARE RIGHTS\r
4 *\r
5 * We reserve no LEGAL rights to the Purdue Compiler Construction Tool\r
6 * Set (PCCTS) -- PCCTS is in the public domain. An individual or\r
7 * company may do whatever they wish with source code distributed with\r
8 * PCCTS or the code generated by PCCTS, including the incorporation of\r
9 * PCCTS, or its output, into commerical software.\r
10 *\r
11 * We encourage users to develop software with PCCTS. However, we do ask\r
12 * that credit is given to us for developing PCCTS. By "credit",\r
13 * we mean that if you incorporate our source code into one of your\r
14 * programs (commercial product, research project, or otherwise) that you\r
15 * acknowledge this fact somewhere in the documentation, research report,\r
16 * etc... If you like PCCTS and have developed a nice tool with the\r
17 * output, please mention that you developed it using PCCTS. In\r
18 * addition, we ask that this header remain intact in our source code.\r
19 * As long as these guidelines are kept, we expect to continue enhancing\r
20 * this system and expect to make other tools available as they are\r
21 * completed.\r
22 *\r
23 * ANTLR 1.33\r
24 * Terence Parr\r
25 * Parr Research Corporation\r
26 * with Purdue University and AHPCRC, University of Minnesota\r
27 * 1989-2000\r
28 */\r
29\r
30typedef int ANTLRTokenType; // fool AToken.h into compiling\r
31\r
32class ANTLRParser; /* MR1 */\r
33\r
34#define ANTLR_SUPPORT_CODE\r
35\r
36#include "pcctscfg.h"\r
37\r
38#include ATOKENBUFFER_H\r
39#include APARSER_H // MR23\r
40\r
41typedef ANTLRAbstractToken *_ANTLRTokenPtr;\r
42\r
43#if defined(DBG_TBUF)||defined(DBG_TBUF_MARK_REW)\r
44static unsigned char test[1000];\r
45#endif\r
46\r
47#ifdef DBG_REFCOUNTTOKEN\r
48int ANTLRRefCountToken::ctor = 0; /* MR23 */\r
49int ANTLRRefCountToken::dtor = 0; /* MR23 */\r
50#endif\r
51\r
52ANTLRTokenBuffer::\r
53ANTLRTokenBuffer(ANTLRTokenStream *_input, int _k, int _chunk_size_formal) /* MR14 */\r
54{\r
55 this->input = _input;\r
56 this->k = _k;\r
57 buffer_size = chunk_size = _chunk_size_formal;\r
58 buffer = (_ANTLRTokenPtr *)\r
59 calloc(chunk_size+1,sizeof(_ANTLRTokenPtr ));\r
60 if ( buffer == NULL ) {\r
61 panic("cannot alloc token buffer");\r
62 }\r
63 buffer++; // leave the first elem empty so tp-1 is valid ptr\r
64\r
65 tp = &buffer[0];\r
66 last = tp-1;\r
67 next = &buffer[0];\r
68 num_markers = 0;\r
69 end_of_buffer = &buffer[buffer_size-1];\r
70 threshold = &buffer[(int)(buffer_size/2)]; // MR23 - Used to be 1.0/2.0 !\r
71 _deleteTokens = 1; // assume we delete tokens\r
72 parser=NULL; // MR5 - uninitialized reference\r
73}\r
74\r
75static void f() {;}\r
76ANTLRTokenBuffer::\r
77~ANTLRTokenBuffer()\r
78{\r
79 f();\r
80 // Delete all remaining tokens (from 0..last inclusive)\r
81 if ( _deleteTokens )\r
82 {\r
83 _ANTLRTokenPtr *z;\r
84 for (z=buffer; z<=last; z++)\r
85 {\r
86 (*z)->deref();\r
87// z->deref();\r
88#ifdef DBG_REFCOUNTTOKEN\r
89 /* MR23 */ printMessage(stderr, "##########dtor: deleting token '%s' (ref %d)\n",\r
90 ((ANTLRCommonToken *)*z)->getText(), (*z)->nref());\r
91#endif\r
92 if ( (*z)->nref()==0 )\r
93 {\r
94 delete (*z);\r
95 }\r
96 }\r
97 }\r
98\r
99 if ( buffer!=NULL ) free((char *)(buffer-1));\r
100}\r
101\r
102#if defined(DBG_TBUF)||defined(DBG_TBUF_MARK_REW)\r
103#include "pccts_stdio.h"\r
104PCCTS_NAMESPACE_STD\r
105#endif\r
106\r
107_ANTLRTokenPtr ANTLRTokenBuffer::\r
108getToken()\r
109{\r
110 if ( tp <= last ) // is there any buffered lookahead still to be read?\r
111 {\r
112 return *tp++; // read buffered lookahead\r
113 }\r
114 // out of buffered lookahead, get some more "real"\r
115 // input from getANTLRToken()\r
116 if ( num_markers==0 )\r
117 {\r
118 if( next > threshold )\r
119 {\r
120#ifdef DBG_TBUF\r
121/* MR23 */ printMessage(stderr,"getToken: next > threshold (high water is %d)\n", threshold-buffer);\r
122#endif\r
123 makeRoom();\r
124 }\r
125 }\r
126 else {\r
127 if ( next > end_of_buffer )\r
128 {\r
129#ifdef DBG_TBUF\r
130/* MR23 */ printMessage(stderr,"getToken: next > end_of_buffer (size is %d)\n", buffer_size);\r
131#endif\r
132 extendBuffer();\r
133 }\r
134 }\r
135 *next = getANTLRToken();\r
136 (*next)->ref(); // say we have a copy of this pointer in buffer\r
137 last = next;\r
138 next++;\r
139 tp = last;\r
140 return *tp++;\r
141}\r
142\r
143void ANTLRTokenBuffer::\r
144rewind(int pos)\r
145{\r
146#if defined(DBG_TBUF)||defined(DBG_TBUF_MARK_REW)\r
147 /* MR23 */ printMessage(stderr, "rewind(%d)[nm=%d,from=%d,%d.n=%d]\n", pos, num_markers, tp-buffer,pos,test[pos]);\r
148 test[pos]--;\r
149#endif\r
150 tp = &buffer[pos];\r
151 num_markers--;\r
152}\r
153\r
154/*\r
155 * This function is used to specify that the token pointers read\r
156 * by the ANTLRTokenBuffer should be buffered up (to be reused later).\r
157 */\r
158int ANTLRTokenBuffer::\r
159mark()\r
160{\r
161#if defined(DBG_TBUF)||defined(DBG_TBUF_MARK_REW)\r
162 test[tp-buffer]++;\r
163 /* MR23 */ printMessage(stderr,"mark(%d)[nm=%d,%d.n=%d]\n",tp-buffer,num_markers+1,tp-buffer,test[tp-buffer]);\r
164#endif\r
165 num_markers++;\r
166 return tp - buffer;\r
167}\r
168\r
169/*\r
170 * returns the token pointer n positions ahead.\r
171 * This implies that bufferedToken(1) gets the NEXT symbol of lookahead.\r
172 * This is used in conjunction with the ANTLRParser lookahead buffer.\r
173 *\r
174 * No markers are set or anything. A bunch of input is buffered--that's all.\r
175 * The tp pointer is left alone as the lookahead has not been advanced\r
176 * with getToken(). The next call to getToken() will find a token\r
177 * in the buffer and won't have to call getANTLRToken().\r
178 *\r
179 * If this is called before a consume() is done, how_many_more_i_need is\r
180 * set to 'n'.\r
181 */\r
182_ANTLRTokenPtr ANTLRTokenBuffer::\r
183bufferedToken(int n)\r
184{\r
185// int how_many_more_i_need = (last-tp < 0) ? n : n-(last-tp)-1;\r
186 int how_many_more_i_need = (tp > last) ? n : n-(last-tp)-1;\r
187 // Make sure that at least n tokens are available in the buffer\r
188#ifdef DBG_TBUF\r
189 /* MR23 */ printMessage(stderr, "bufferedToken(%d)\n", n);\r
190#endif\r
191 for (int i=1; i<=how_many_more_i_need; i++)\r
192 {\r
193 if ( next > end_of_buffer ) // buffer overflow?\r
194 {\r
195 extendBuffer();\r
196 }\r
197 *next = getANTLRToken();\r
198 (*next)->ref(); // say we have a copy of this pointer in buffer\r
199 last = next;\r
200 next++;\r
201 }\r
202 return tp[n - 1];\r
203}\r
204\r
205/* If no markers are set, the none of the input needs to be saved (except\r
206 * for the lookahead Token pointers). We save only k-1 token pointers as\r
207 * we are guaranteed to do a getANTLRToken() right after this because otherwise\r
208 * we wouldn't have needed to extend the buffer.\r
209 *\r
210 * If there are markers in the buffer, we need to save things and so\r
211 * extendBuffer() is called.\r
212 */\r
213void ANTLRTokenBuffer::\r
214makeRoom()\r
215{\r
216#ifdef DBG_TBUF\r
217 /* MR23 */ printMessage(stderr, "in makeRoom.................\n");\r
218 /* MR23 */ printMessage(stderr, "num_markers==%d\n", num_markers);\r
219#endif\r
220/*\r
221 if ( num_markers == 0 )\r
222 {\r
223*/\r
224#ifdef DBG_TBUF\r
225 /* MR23 */ printMessage(stderr, "moving lookahead and resetting next\n");\r
226\r
227 _ANTLRTokenPtr *r;\r
228 /* MR23 */ printMessage(stderr, "tbuf = [");\r
229 for (r=buffer; r<=last; r++)\r
230 {\r
231 if ( *r==NULL ) /* MR23 */ printMessage(stderr, " xxx");\r
232 else /* MR23 */ printMessage(stderr, " '%s'", ((ANTLRCommonToken *)*r)->getText());\r
233 }\r
234 /* MR23 */ printMessage(stderr, " ]\n");\r
235\r
236 /* MR23 */ printMessage(stderr,\r
237 "before: tp=%d, last=%d, next=%d, threshold=%d\n",tp-buffer,last-buffer,next-buffer,threshold-buffer);\r
238#endif\r
239\r
240 // Delete all tokens from 0..last-(k-1) inclusive\r
241 if ( _deleteTokens )\r
242 {\r
243 _ANTLRTokenPtr *z;\r
244 for (z=buffer; z<=last-(k-1); z++)\r
245 {\r
246 (*z)->deref();\r
247// z->deref();\r
248#ifdef DBG_REFCOUNTTOKEN\r
249 /* MR23 */ printMessage(stderr, "##########makeRoom: deleting token '%s' (ref %d)\n",\r
250 ((ANTLRCommonToken *)*z)->getText(), (*z)->nref());\r
251#endif\r
252 if ( (*z)->nref()==0 )\r
253 {\r
254 delete (*z);\r
255 }\r
256 }\r
257 }\r
258\r
259 // reset the buffer to initial conditions, but move k-1 symbols\r
260 // to the beginning of buffer and put new input symbol at k\r
261 _ANTLRTokenPtr *p = buffer, *q = last-(k-1)+1;\r
262// ANTLRAbstractToken **p = buffer, **q = end_of_buffer-(k-1)+1;\r
263#ifdef DBG_TBUF\r
264 /* MR23 */ printMessage(stderr, "lookahead buffer = [");\r
265#endif\r
266 for (int i=1; i<=(k-1); i++)\r
267 {\r
268 *p++ = *q++;\r
269#ifdef DBG_TBUF\r
270 /* MR23 */ printMessage(stderr,\r
271 " '%s'", ((ANTLRCommonToken *)buffer[i-1])->getText());\r
272#endif\r
273 }\r
274#ifdef DBG_TBUF\r
275 /* MR23 */ printMessage(stderr, " ]\n");\r
276#endif\r
277 next = &buffer[k-1];\r
278 tp = &buffer[k-1]; // tp points to what will be filled in next\r
279 last = tp-1;\r
280#ifdef DBG_TBUF\r
281 /* MR23 */ printMessage(stderr,\r
282 "after: tp=%d, last=%d, next=%d\n",\r
283 tp-buffer, last-buffer, next-buffer);\r
284#endif\r
285/*\r
286 }\r
287 else {\r
288 extendBuffer();\r
289 }\r
290*/\r
291}\r
292\r
293/* This function extends 'buffer' by chunk_size and returns with all\r
294 * pointers at the same relative positions in the buffer (the buffer base\r
295 * address could have changed in realloc()) except that 'next' comes\r
296 * back set to where the next token should be stored. All other pointers\r
297 * are untouched.\r
298 */\r
299void\r
300ANTLRTokenBuffer::\r
301extendBuffer()\r
302{\r
303 int save_last = last-buffer, save_tp = tp-buffer, save_next = next-buffer;\r
304#ifdef DBG_TBUF\r
305 /* MR23 */ printMessage(stderr, "extending physical buffer\n");\r
306#endif\r
307 buffer_size += chunk_size;\r
308 buffer = (_ANTLRTokenPtr *)\r
309 realloc((char *)(buffer-1),\r
310 (buffer_size+1)*sizeof(_ANTLRTokenPtr ));\r
311 if ( buffer == NULL ) {\r
312 panic("cannot alloc token buffer");\r
313 }\r
314 buffer++; // leave the first elem empty so tp-1 is valid ptr\r
315\r
316 tp = buffer + save_tp; // put the pointers back to same relative position\r
317 last = buffer + save_last;\r
318 next = buffer + save_next;\r
319 end_of_buffer = &buffer[buffer_size-1];\r
320 threshold = &buffer[(int)(buffer_size*(1.0/2.0))];\r
321\r
322/*\r
323 // zero out new token ptrs so we'll know if something to delete in buffer\r
324 ANTLRAbstractToken **p = end_of_buffer-chunk_size+1;\r
325 for (; p<=end_of_buffer; p++) *p = NULL;\r
326*/\r
327}\r
328\r
329ANTLRParser * ANTLRTokenBuffer:: // MR1\r
330setParser(ANTLRParser *p) { // MR1\r
331 ANTLRParser *old=parser; // MR1\r
332 parser=p; // MR1\r
333 input->setParser(p); // MR1\r
334 return old; // MR1\r
335} // MR1\r
336 // MR1\r
337ANTLRParser * ANTLRTokenBuffer:: // MR1\r
338getParser() { // MR1\r
339 return parser; // MR1\r
340} // MR1\r
341\r
342void ANTLRTokenBuffer::panic(const char *msg) // MR23\r
343{ \r
344 if (parser) //MR23\r
345 parser->panic(msg); //MR23\r
346 else //MR23\r
347 exit(PCCTS_EXIT_FAILURE); \r
348} \r
349\r
350//MR23\r
351int ANTLRTokenBuffer::printMessage(FILE* pFile, const char* pFormat, ...)\r
352{\r
353 va_list marker;\r
354 va_start( marker, pFormat );\r
355\r
356 int iRet = 0;\r
357 if (parser)\r
358 parser->printMessageV(pFile, pFormat, marker);\r
359 else\r
360 iRet = vfprintf(pFile, pFormat, marker);\r
361\r
362 va_end( marker );\r
363 return iRet;\r
364}\r
365\r
366/* to avoid having to link in another file just for the smart token ptr\r
367 * stuff, we include it here. Ugh.\r
368 *\r
369 * MR23 This causes nothing but problems for IDEs.\r
370 * Change from .cpp to .h\r
371 *\r
372 */\r
373\r
374#include ATOKPTR_IMPL_H\r