]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Other/Maintained/Tools/Pccts/h/err.h
Add in the 1st version of ECP.
[mirror_edk2.git] / EdkCompatibilityPkg / Other / Maintained / Tools / Pccts / h / err.h
CommitLineData
3eb9473e 1/*\r
2 * err.h\r
3 *\r
4 * Standard error handling mechanism\r
5 *\r
6 * SOFTWARE RIGHTS\r
7 *\r
8 * We reserve no LEGAL rights to the Purdue Compiler Construction Tool\r
9 * Set (PCCTS) -- PCCTS is in the public domain. An individual or\r
10 * company may do whatever they wish with source code distributed with\r
11 * PCCTS or the code generated by PCCTS, including the incorporation of\r
12 * PCCTS, or its output, into commerical software.\r
13 *\r
14 * We encourage users to develop software with PCCTS. However, we do ask\r
15 * that credit is given to us for developing PCCTS. By "credit",\r
16 * we mean that if you incorporate our source code into one of your\r
17 * programs (commercial product, research project, or otherwise) that you\r
18 * acknowledge this fact somewhere in the documentation, research report,\r
19 * etc... If you like PCCTS and have developed a nice tool with the\r
20 * output, please mention that you developed it using PCCTS. In\r
21 * addition, we ask that this header remain intact in our source code.\r
22 * As long as these guidelines are kept, we expect to continue enhancing\r
23 * this system and expect to make other tools available as they are\r
24 * completed.\r
25 *\r
26 * Has grown to hold all kinds of stuff (err.h is increasingly misnamed)\r
27 *\r
28 * ANTLR 1.33\r
29 * Terence Parr\r
30 * Parr Research Corporation\r
31 * with Purdue University and AHPCRC, University of Minnesota\r
32 * 1989-1998\r
33 */\r
34\r
35#ifndef ERR_H\r
36#define ERR_H\r
37\r
38#include "pcctscfg.h"\r
39#include <stdlib.h>\r
40#include <assert.h>\r
41\r
42/* */\r
43/* 7-Apr-97 133MR1 */\r
44/* Proper choice of STDC and cplusplus pre-processor symbols (?) */\r
45/* */\r
46#include "pccts_string.h"\r
47\r
48#ifdef PCCTS_USE_STDARG\r
49#include "pccts_stdarg.h"\r
50#else\r
51#include <varargs.h>\r
52#endif\r
53\r
54#ifdef DUM\r
55/* Define usable bits per unsigned int word (used for set stuff) */\r
56#ifdef PC\r
57#define BSETWORDSIZE 16\r
58#define BSETLOGWORDSIZE 4\r
59#else\r
60#define BSETWORDSIZE 32\r
61#define BSETLOGWORDSIZE 5\r
62#endif\r
63#endif\r
64\r
65#define BSETWORDSIZE 8\r
66#define BSETLOGWORDSIZE 3 /* SetWordType is 8bits */\r
67\r
68#define BSETMODWORD(x) ((x) & (BSETWORDSIZE-1)) /* x % BSETWORDSIZE */\r
69#define BSETDIVWORD(x) ((x) >> BSETLOGWORDSIZE) /* x / BSETWORDSIZE */\r
70\r
71/* This is not put into the global pccts_parser structure because it is\r
72 * hidden and does not need to be saved during a "save state" operation\r
73 */\r
74/* maximum of 32 bits/unsigned int and must be 8 bits/byte */\r
75static SetWordType bitmask[] = {\r
76 0x00000001, 0x00000002, 0x00000004, 0x00000008,\r
77 0x00000010, 0x00000020, 0x00000040, 0x00000080\r
78};\r
79\r
80#ifdef zzTRACE_RULES\r
81int zzTraceOptionValueDefault=1;\r
82int zzTraceOptionValue=1;\r
83int zzTraceGuessOptionValue=1;\r
84char *zzTraceCurrentRuleName=NULL;\r
85int zzTraceDepth=0;\r
86#endif\r
87\r
88int zzGuessSeq=0; /* MR10 */\r
89int zzSyntaxErrCount=0; /* MR11 */\r
90int zzLexErrCount=0; /* MR11 */\r
91\r
92void\r
93#ifdef __USE_PROTOS\r
94zzresynch(SetWordType *wd,SetWordType mask)\r
95#else\r
96zzresynch(wd,mask)\r
97SetWordType *wd, mask;\r
98#endif\r
99{\r
100 static int consumed = 1;\r
101\r
102 /* if you enter here without having consumed a token from last resynch\r
103 * force a token consumption.\r
104 */\r
105 if ( !consumed ) {zzCONSUME; consumed=1; return;} /* MR10 */\r
106\r
107 /* if current token is in resynch set, we've got what we wanted */\r
108 if ( wd[LA(1)]&mask || LA(1) == zzEOF_TOKEN ) {consumed=0; return;}\r
109 \r
110 /* scan until we find something in the resynch set */\r
111 while ( !(wd[LA(1)]&mask) && LA(1) != zzEOF_TOKEN ) {zzCONSUME;}\r
112 consumed=1;\r
113}\r
114\r
115/* */\r
116/* 7-Apr-97 133MR1 for C++ and MR7 for C */\r
117/* Change suggested by Eli Sternheim (eli@interhdl.com) */\r
118/* */\r
119\r
120void\r
121#ifdef __USE_PROTOS\r
122zzconsumeUntil(SetWordType *st)\r
123#else\r
124zzconsumeUntil(st)\r
125SetWordType *st;\r
126#endif\r
127{\r
128 int tmp; /* MR7 */\r
129 while ( !zzset_el( (tmp=LA(1)), st) && tmp!=1 /* Eof */) { /* MR7 */\r
130 zzCONSUME; } /* MR7 */\r
131}\r
132\r
133/* */\r
134/* 7-Apr-97 133MR1 for C++ and MR7 for C */\r
135/* Change suggested by Eli Sternheim (eli@interhdl.com) */\r
136/* */\r
137\r
138void\r
139#ifdef __USE_PROTOS\r
140zzconsumeUntilToken(int t)\r
141#else\r
142zzconsumeUntilToken(t)\r
143int t;\r
144#endif\r
145{\r
146 int tmp; /* MR7 */\r
147 while ( (tmp=LA(1)) !=t && tmp!=1 /* Eof */) { zzCONSUME; } /* MR7 */\r
148}\r
149\r
150/* input looks like:\r
151 * zzFAIL(k, e1, e2, ...,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText)\r
152 * where the zzMiss stuff is set here to the token that did not match\r
153 * (and which set wasn't it a member of).\r
154 */\r
155\r
156#ifdef PCCTS_USE_STDARG\r
157void zzFAIL(int k, ...)\r
158#else\r
159void zzFAIL(va_alist)\r
160va_dcl\r
161#endif\r
162{\r
163#ifdef LL_K\r
164 static char text[LL_K*ZZLEXBUFSIZE+1];\r
165 SetWordType *f[LL_K];\r
166#else\r
167 static char text[ZZLEXBUFSIZE+1];\r
168 SetWordType *f[1];\r
169#endif\r
170 SetWordType **miss_set;\r
171 char **miss_text;\r
172 int *bad_tok;\r
173 char **bad_text;\r
174 int *err_k;\r
175 int i;\r
176 va_list ap;\r
177#ifndef PCCTS_USE_STDARG /* MR20 */\r
178 int k;\r
179#endif\r
180#ifdef PCCTS_USE_STDARG /* MR20 */\r
181 va_start(ap, k);\r
182#else\r
183 va_start(ap);\r
184 k = va_arg(ap, int); /* how many lookahead sets? */\r
185#endif\r
186 assert(k <= sizeof(f)/sizeof(f[0])); /* MR20 G. Hobbelt */\r
187 text[0] = '\0';\r
188 for (i=1; i<=k; i++) /* collect all lookahead sets */\r
189 {\r
190 f[i-1] = va_arg(ap, SetWordType *);\r
191 }\r
192 for (i=1; i<=k; i++) /* look for offending token */\r
193 {\r
194 if ( i>1 ) strcat(text, " ");\r
195 strcat(text, LATEXT(i));\r
196 if ( !zzset_el((unsigned)LA(i), f[i-1]) ) break;\r
197 }\r
198 miss_set = va_arg(ap, SetWordType **);\r
199 miss_text = va_arg(ap, char **);\r
200 bad_tok = va_arg(ap, int *);\r
201 bad_text = va_arg(ap, char **);\r
202 err_k = va_arg(ap, int *);\r
203 if ( i>k )\r
204 {\r
205 /* bad; lookahead is permutation that cannot be matched,\r
206 * but, the ith token of lookahead is valid at the ith position\r
207 * (The old LL sub 1 (k) versus LL(k) parsing technique)\r
208 */\r
209 *miss_set = NULL;\r
210 *miss_text = zzlextext;\r
211 *bad_tok = LA(1);\r
212 *bad_text = LATEXT(1);\r
213 *err_k = k;\r
214 return;\r
215 }\r
216/* fprintf(stderr, "%s not in %dth set\n", zztokens[LA(i)], i);*/\r
217 *miss_set = f[i-1];\r
218 *miss_text = text;\r
219 *bad_tok = LA(i);\r
220 *bad_text = LATEXT(i);\r
221 if ( i==1 ) *err_k = 1;\r
222 else *err_k = k;\r
223}\r
224\r
225#ifdef __USE_PROTOS\r
226void zzTraceGuessDone(zzantlr_state *state)\r
227#else\r
228void zzTraceGuessDone(state)\r
229 zzantlr_state *state;\r
230#endif\r
231{\r
232#ifdef zzTRACE_RULES\r
233#ifdef ZZCAN_GUESS\r
234\r
235 int doIt=0;\r
236\r
237 if (zzTraceCurrentRuleName == NULL) return;\r
238\r
239 if (zzTraceOptionValue <= 0) {\r
240 doIt=0;\r
241 } else if (zzTraceGuessOptionValue <= 0) {\r
242 doIt=0;\r
243 } else {\r
244 doIt=1;\r
245 };\r
246\r
247 if (doIt) {\r
248 fprintf(stderr,"guess done - returning to rule %s {\"%s\"} at depth %d",\r
249 state->traceCurrentRuleName,\r
250 LATEXT(1),\r
251 state->traceDepth);\r
252 if (state->guessing != 0) {\r
253 fprintf(stderr," (guess mode continues - an enclosing guess is still active)");\r
254 } else {\r
255 fprintf(stderr," (guess mode ends)");\r
256 };\r
257 fprintf(stderr,"\n");\r
258 };\r
259#endif\r
260#endif\r
261}\r
262\r
263void\r
264#ifdef __USE_PROTOS\r
265zzsave_antlr_state(zzantlr_state *buf)\r
266#else\r
267zzsave_antlr_state(buf)\r
268zzantlr_state *buf;\r
269#endif\r
270{\r
271#ifdef LL_K\r
272 int i;\r
273#endif\r
274\r
275#ifdef ZZCAN_GUESS\r
276 buf->guess_start = zzguess_start;\r
277 buf->guessing = zzguessing;\r
278#endif\r
279 buf->asp = zzasp;\r
280#ifdef GENAST\r
281 buf->ast_sp = zzast_sp;\r
282#endif\r
283#ifdef ZZINF_LOOK\r
284 buf->inf_labase = zzinf_labase;\r
285 buf->inf_last = zzinf_last;\r
286\r
287/* MR6 Gunnar Rxnning (gunnar@candleweb.no) */\r
288/* MR6 Additional state needs to be saved/restored */\r
289\r
290 buf->inf_tokens = zzinf_tokens; /* MR6 */\r
291 buf->inf_text = zzinf_text; /* MR6 */\r
292 buf->inf_text_buffer = zzinf_text_buffer; /* MR6 */\r
293 buf->inf_line = zzinf_line; /* MR6 */\r
294\r
295#endif\r
296#ifdef DEMAND_LOOK\r
297 buf->dirty = zzdirty;\r
298#endif\r
299#ifdef LL_K\r
300 for (i=0; i<LL_K; i++) buf->tokenLA[i] = zztokenLA[i];\r
301 for (i=0; i<LL_K; i++) strcpy(buf->textLA[i], zztextLA[i]);\r
302 buf->lap = zzlap;\r
303 buf->labase = zzlabase;\r
304#else\r
305 buf->token = zztoken;\r
306 strcpy(buf->text, zzlextext);\r
307#endif\r
308#ifdef zzTRACE_RULES\r
309\r
310 /* MR10 */\r
311\r
312 buf->traceOptionValue=zzTraceOptionValue;\r
313 buf->traceGuessOptionValue=zzTraceGuessOptionValue;\r
314 buf->traceCurrentRuleName=zzTraceCurrentRuleName;\r
315 buf->traceDepth=zzTraceDepth;\r
316#endif\r
317}\r
318\r
319void\r
320#ifdef __USE_PROTOS\r
321zzrestore_antlr_state(zzantlr_state *buf)\r
322#else\r
323zzrestore_antlr_state(buf)\r
324zzantlr_state *buf;\r
325#endif\r
326{\r
327\r
328#ifdef zzTRACE_RULES\r
329 int prevTraceOptionValue;\r
330#endif\r
331\r
332#ifdef LL_K\r
333 int i;\r
334#endif\r
335\r
336#ifdef ZZCAN_GUESS\r
337 zzguess_start = buf->guess_start;\r
338 zzguessing = buf->guessing;\r
339#endif\r
340 zzasp = buf->asp;\r
341#ifdef GENAST\r
342 zzast_sp = buf->ast_sp;\r
343#endif\r
344#ifdef ZZINF_LOOK\r
345 zzinf_labase = buf->inf_labase;\r
346 zzinf_last = buf->inf_last;\r
347\r
348/* MR6 Gunnar Rxnning (gunnar@candleweb.no) */\r
349/* MR6 Additional state needs to be saved/restored */\r
350\r
351 zzinf_tokens = buf->inf_tokens; /* MR6 */\r
352 zzinf_text = buf->inf_text; /* MR6 */\r
353 zzinf_text_buffer = buf->inf_text_buffer; /* MR6 */\r
354 zzinf_line = buf->inf_line; /* MR6 */\r
355#endif\r
356#ifdef DEMAND_LOOK\r
357 zzdirty = buf->dirty;\r
358#endif\r
359#ifdef LL_K\r
360 for (i=0; i<LL_K; i++) zztokenLA[i] = buf->tokenLA[i];\r
361 for (i=0; i<LL_K; i++) strcpy(zztextLA[i], buf->textLA[i]);\r
362 zzlap = buf->lap;\r
363 zzlabase = buf->labase;\r
364#else\r
365 zztoken = buf->token;\r
366 strcpy(zzlextext, buf->text);\r
367#endif\r
368#ifdef zzTRACE_RULES\r
369\r
370 prevTraceOptionValue=zzTraceOptionValue;\r
371 zzTraceOptionValue=buf->traceOptionValue;\r
372 if ( (prevTraceOptionValue > 0) !=\r
373 (zzTraceOptionValue > 0)) {\r
374 if (zzTraceOptionValue > 0) {\r
375 fprintf(stderr,"trace enable restored in rule %s depth %d\n",\r
376 zzTraceCurrentRuleName,zzTraceDepth);\r
377 };\r
378 if (zzTraceOptionValue <= 0) {\r
379 fprintf(stderr,"trace disable restored in rule %s depth %d\n",\r
380 zzTraceCurrentRuleName,zzTraceDepth);\r
381 };\r
382 };\r
383\r
384 zzTraceOptionValue=buf->traceOptionValue; /* MR10 */\r
385 zzTraceGuessOptionValue=buf->traceGuessOptionValue; /* MR10 */\r
386 zzTraceCurrentRuleName=buf->traceCurrentRuleName; /* MR10 */\r
387 zzTraceDepth=buf->traceDepth; /* MR10 */\r
388 zzTraceGuessDone(buf); /* MR10 */\r
389#endif\r
390}\r
391\r
392void\r
393#ifdef __USE_PROTOS\r
394zzedecode(SetWordType *a)\r
395#else\r
396zzedecode(a)\r
397SetWordType *a;\r
398#endif\r
399{\r
400 register SetWordType *p = a;\r
401 register SetWordType *endp = &(p[zzSET_SIZE]);\r
402 register unsigned e = 0;\r
403\r
404 if ( zzset_deg(a)>1 ) fprintf(stderr, " {");\r
405 do {\r
406 register SetWordType t = *p;\r
407 register SetWordType *b = &(bitmask[0]);\r
408 do {\r
409 if ( t & *b ) fprintf(stderr, " %s", zztokens[e]);\r
410 e++;\r
411 } while (++b < &(bitmask[sizeof(SetWordType)*8]));\r
412 } while (++p < endp);\r
413 if ( zzset_deg(a)>1 ) fprintf(stderr, " }");\r
414}\r
415\r
416#ifndef USER_ZZSYN\r
417/* standard error reporting function */\r
418void\r
419#ifdef __USE_PROTOS\r
420zzsyn(char *text, int tok, char *egroup, SetWordType *eset, int etok, int k, char *bad_text)\r
421#else\r
422zzsyn(text, tok, egroup, eset, etok, k, bad_text)\r
423char *text, *egroup, *bad_text;\r
424int tok;\r
425int etok;\r
426int k;\r
427SetWordType *eset;\r
428#endif\r
429{\r
430 \r
431 zzSyntaxErrCount++; /* MR11 */\r
432 fprintf(stderr, "line %d: syntax error at \"%s\"", zzline, (tok==zzEOF_TOKEN)?"EOF":bad_text);\r
433 if ( !etok && !eset ) {fprintf(stderr, "\n"); return;}\r
434 if ( k==1 ) fprintf(stderr, " missing");\r
435 else\r
436 {\r
437 fprintf(stderr, "; \"%s\" not", bad_text);\r
438 if ( zzset_deg(eset)>1 ) fprintf(stderr, " in");\r
439 }\r
440 if ( zzset_deg(eset)>0 ) zzedecode(eset);\r
441 else fprintf(stderr, " %s", zztokens[etok]);\r
442 if ( strlen(egroup) > 0 ) fprintf(stderr, " in %s", egroup);\r
443 fprintf(stderr, "\n");\r
444}\r
445#endif\r
446\r
447/* is b an element of set p? */\r
448int\r
449#ifdef __USE_PROTOS\r
450zzset_el(unsigned b, SetWordType *p)\r
451#else\r
452zzset_el(b,p)\r
453unsigned b;\r
454SetWordType *p;\r
455#endif\r
456{\r
457 return( p[BSETDIVWORD(b)] & bitmask[BSETMODWORD(b)] );\r
458}\r
459\r
460int\r
461#ifdef __USE_PROTOS\r
462zzset_deg(SetWordType *a)\r
463#else\r
464zzset_deg(a)\r
465SetWordType *a;\r
466#endif\r
467{\r
468 /* Fast compute degree of a set... the number\r
469 of elements present in the set. Assumes\r
470 that all word bits are used in the set\r
471 */\r
472 register SetWordType *p = a;\r
473 register SetWordType *endp = &(a[zzSET_SIZE]);\r
474 register int degree = 0;\r
475\r
476 if ( a == NULL ) return 0;\r
477 while ( p < endp )\r
478 {\r
479 register SetWordType t = *p;\r
480 register SetWordType *b = &(bitmask[0]);\r
481 do {\r
482 if (t & *b) ++degree;\r
483 } while (++b < &(bitmask[sizeof(SetWordType)*8]));\r
484 p++;\r
485 }\r
486\r
487 return(degree);\r
488}\r
489\r
490#ifdef DEMAND_LOOK\r
491\r
492#ifdef LL_K\r
493int\r
494#ifdef __USE_PROTOS\r
495_zzmatch(int _t, char **zzBadText, char **zzMissText,\r
496 int *zzMissTok, int *zzBadTok,\r
497 SetWordType **zzMissSet)\r
498#else\r
499_zzmatch(_t, zzBadText, zzMissText, zzMissTok, zzBadTok, zzMissSet)\r
500int _t;\r
501char **zzBadText;\r
502char **zzMissText;\r
503int *zzMissTok, *zzBadTok;\r
504SetWordType **zzMissSet;\r
505#endif\r
506{\r
507 if ( zzdirty==LL_K ) {\r
508 zzCONSUME;\r
509 }\r
510 if ( LA(1)!=_t ) {\r
511 *zzBadText = *zzMissText=LATEXT(1); \r
512 *zzMissTok= _t; *zzBadTok=LA(1);\r
513 *zzMissSet=NULL; \r
514 return 0;\r
515 }\r
516 zzMakeAttr \r
517 zzdirty++; \r
518 zzlabase++; \r
519 return 1;\r
520}\r
521\r
522int\r
523#ifdef __USE_PROTOS\r
524_zzmatch_wsig(int _t)\r
525#else\r
526_zzmatch_wsig(_t)\r
527int _t;\r
528#endif\r
529{\r
530 if ( zzdirty==LL_K ) {\r
531 zzCONSUME;\r
532 }\r
533 if ( LA(1)!=_t ) {\r
534 return 0;\r
535 }\r
536 zzMakeAttr \r
537 zzdirty++; \r
538 zzlabase++; \r
539 return 1;\r
540}\r
541\r
542#else\r
543\r
544int\r
545#ifdef __USE_PROTOS\r
546_zzmatch(int _t, char **zzBadText, char **zzMissText,\r
547 int *zzMissTok, int *zzBadTok, SetWordType **zzMissSet)\r
548#else\r
549_zzmatch(_t, zzBadText, zzMissText, zzMissTok, zzBadTok, zzMissSet)\r
550int _t;\r
551char **zzBadText;\r
552char **zzMissText;\r
553int *zzMissTok, *zzBadTok;\r
554SetWordType **zzMissSet;\r
555#endif\r
556{ \r
557 if ( zzdirty ) {zzCONSUME;} \r
558 if ( LA(1)!=_t ) {\r
559 *zzBadText = *zzMissText=LATEXT(1); \r
560 *zzMissTok= _t; *zzBadTok=LA(1);\r
561 *zzMissSet=NULL; \r
562 return 0;\r
563 } \r
564 zzdirty = 1; \r
565 zzMakeAttr \r
566 return 1;\r
567}\r
568\r
569int\r
570#ifdef __USE_PROTOS\r
571_zzmatch_wsig(int _t)\r
572#else\r
573_zzmatch_wsig(_t)\r
574int _t;\r
575#endif\r
576{\r
577 if ( zzdirty ) {zzCONSUME;} \r
578 if ( LA(1)!=_t ) {\r
579 return 0;\r
580 }\r
581 zzdirty = 1; \r
582 zzMakeAttr \r
583 return 1;\r
584}\r
585\r
586#endif /*LL_K*/\r
587\r
588#else\r
589\r
590int\r
591#ifdef __USE_PROTOS\r
592_zzmatch(int _t, char **zzBadText, char **zzMissText,\r
593 int *zzMissTok, int *zzBadTok,\r
594 SetWordType **zzMissSet)\r
595#else\r
596_zzmatch(_t, zzBadText, zzMissText, zzMissTok, zzBadTok, zzMissSet)\r
597int _t;\r
598char **zzBadText;\r
599char **zzMissText;\r
600int *zzMissTok, *zzBadTok;\r
601SetWordType **zzMissSet;\r
602#endif\r
603{\r
604 if ( LA(1)!=_t ) { \r
605 *zzBadText = *zzMissText=LATEXT(1); \r
606 *zzMissTok= _t; *zzBadTok=LA(1);\r
607 *zzMissSet=NULL; \r
608 return 0;\r
609 }\r
610 zzMakeAttr\r
611 return 1;\r
612}\r
613\r
614int\r
615#ifdef __USE_PROTOS\r
616_zzmatch_wsig(int _t)\r
617#else\r
618_zzmatch_wsig(_t)\r
619int _t;\r
620#endif\r
621{\r
622 if ( LA(1)!=_t ) return 0;\r
623 zzMakeAttr \r
624 return 1;\r
625}\r
626\r
627#endif /*DEMAND_LOOK*/\r
628\r
629#ifdef ZZINF_LOOK\r
630void\r
631#ifdef __USE_PROTOS\r
632_inf_zzgettok(void)\r
633#else\r
634_inf_zzgettok()\r
635#endif\r
636{\r
637 if ( zzinf_labase >= zzinf_last ) \r
638 {NLA = zzEOF_TOKEN; strcpy(NLATEXT, "");} \r
639 else { \r
640 NLA = zzinf_tokens[zzinf_labase];\r
641 zzline = zzinf_line[zzinf_labase]; /* wrong in 1.21 */\r
642 strcpy(NLATEXT, zzinf_text[zzinf_labase]); \r
643 zzinf_labase++; \r
644 } \r
645}\r
646#endif\r
647\r
648#ifdef ZZINF_LOOK\r
649/* allocate default size text,token and line arrays;\r
650 * then, read all of the input reallocing the arrays as needed.\r
651 * Once the number of total tokens is known, the LATEXT(i) array (zzinf_text)\r
652 * is allocated and it's pointers are set to the tokens in zzinf_text_buffer.\r
653 */\r
654void\r
655#ifdef __USE_PROTOS\r
656zzfill_inf_look(void)\r
657#else\r
658zzfill_inf_look()\r
659#endif\r
660{\r
661 int tok, line;\r
662 int zzinf_token_buffer_size = ZZINF_DEF_TOKEN_BUFFER_SIZE;\r
663 int zzinf_text_buffer_size = ZZINF_DEF_TEXT_BUFFER_SIZE;\r
664 int zzinf_text_buffer_index = 0;\r
665 int zzinf_lap = 0;\r
666\r
667 /* allocate text/token buffers */\r
668 zzinf_text_buffer = (char *) malloc(zzinf_text_buffer_size);\r
669 if ( zzinf_text_buffer == NULL )\r
670 {\r
671 fprintf(stderr, "cannot allocate lookahead text buffer (%d bytes)\n",\r
672 zzinf_text_buffer_size);\r
673 exit(PCCTS_EXIT_FAILURE); \r
674 }\r
675 zzinf_tokens = (int *) calloc(zzinf_token_buffer_size,sizeof(int));\r
676 if ( zzinf_tokens == NULL )\r
677 {\r
678 fprintf(stderr, "cannot allocate token buffer (%d tokens)\n",\r
679 zzinf_token_buffer_size);\r
680 exit(PCCTS_EXIT_FAILURE); \r
681 }\r
682 zzinf_line = (int *) calloc(zzinf_token_buffer_size,sizeof(int));\r
683 if ( zzinf_line == NULL )\r
684 {\r
685 fprintf(stderr, "cannot allocate line buffer (%d ints)\n",\r
686 zzinf_token_buffer_size);\r
687 exit(PCCTS_EXIT_FAILURE);\r
688 }\r
689\r
690 /* get tokens, copying text to text buffer */\r
691 zzinf_text_buffer_index = 0;\r
692 do {\r
693 zzgettok();\r
694 line = zzreal_line;\r
695 while ( zzinf_lap>=zzinf_token_buffer_size )\r
696 {\r
697 zzinf_token_buffer_size += ZZINF_BUFFER_TOKEN_CHUNK_SIZE;\r
698 zzinf_tokens = (int *) realloc(zzinf_tokens,\r
699 zzinf_token_buffer_size*sizeof(int));\r
700 if ( zzinf_tokens == NULL )\r
701 {\r
702 fprintf(stderr, "cannot allocate lookahead token buffer (%d tokens)\n",\r
703 zzinf_token_buffer_size);\r
704 exit(PCCTS_EXIT_FAILURE);\r
705 }\r
706 zzinf_line = (int *) realloc(zzinf_line,\r
707 zzinf_token_buffer_size*sizeof(int));\r
708 if ( zzinf_line == NULL )\r
709 {\r
710 fprintf(stderr, "cannot allocate lookahead line buffer (%d ints)\n",\r
711 zzinf_token_buffer_size);\r
712 exit(PCCTS_EXIT_FAILURE);\r
713 }\r
714\r
715 }\r
716 while ( (zzinf_text_buffer_index+strlen(NLATEXT)+1) >= zzinf_text_buffer_size )\r
717 {\r
718 zzinf_text_buffer_size += ZZINF_BUFFER_TEXT_CHUNK_SIZE;\r
719 zzinf_text_buffer = (char *) realloc(zzinf_text_buffer,\r
720 zzinf_text_buffer_size);\r
721 if ( zzinf_text_buffer == NULL )\r
722 {\r
723 fprintf(stderr, "cannot allocate lookahead text buffer (%d bytes)\n",\r
724 zzinf_text_buffer_size);\r
725 exit(PCCTS_EXIT_FAILURE);\r
726 }\r
727 }\r
728 /* record token and text and line of input symbol */\r
729 tok = zzinf_tokens[zzinf_lap] = NLA;\r
730 strcpy(&zzinf_text_buffer[zzinf_text_buffer_index], NLATEXT);\r
731 zzinf_text_buffer_index += strlen(NLATEXT)+1;\r
732 zzinf_line[zzinf_lap] = line;\r
733 zzinf_lap++;\r
734 } while (tok!=zzEOF_TOKEN);\r
735 zzinf_labase = 0;\r
736 zzinf_last = zzinf_lap-1;\r
737\r
738 /* allocate ptrs to text of ith token */\r
739 zzinf_text = (char **) calloc(zzinf_last+1,sizeof(char *));\r
740 if ( zzinf_text == NULL )\r
741 {\r
742 fprintf(stderr, "cannot allocate lookahead text buffer (%d)\n",\r
743 zzinf_text_buffer_size);\r
744 exit(PCCTS_EXIT_FAILURE); \r
745 } \r
746 zzinf_text_buffer_index = 0;\r
747 zzinf_lap = 0;\r
748 /* set ptrs so that zzinf_text[i] is the text of the ith token found on input */\r
749 while (zzinf_lap<=zzinf_last)\r
750 {\r
751 zzinf_text[zzinf_lap++] = &zzinf_text_buffer[zzinf_text_buffer_index];\r
752 zzinf_text_buffer_index += strlen(&zzinf_text_buffer[zzinf_text_buffer_index])+1;\r
753 }\r
754}\r
755#endif\r
756\r
757int\r
758#ifdef __USE_PROTOS\r
759_zzsetmatch(SetWordType *e, char **zzBadText, char **zzMissText,\r
760 int *zzMissTok, int *zzBadTok,\r
761 SetWordType **zzMissSet)\r
762#else\r
763_zzsetmatch(e, zzBadText, zzMissText, zzMissTok, zzBadTok, zzMissSet)\r
764SetWordType *e;\r
765char **zzBadText;\r
766char **zzMissText;\r
767int *zzMissTok, *zzBadTok;\r
768SetWordType **zzMissSet;\r
769#endif\r
770{\r
771#ifdef DEMAND_LOOK\r
772#ifdef LL_K\r
773 if ( zzdirty==LL_K ) {zzCONSUME;}\r
774#else\r
775 if ( zzdirty ) {zzCONSUME;}\r
776#endif\r
777#endif\r
778 if ( !zzset_el((unsigned)LA(1), e) ) {\r
779 *zzBadText = LATEXT(1); *zzMissText=NULL;\r
780 *zzMissTok= 0; *zzBadTok=LA(1);\r
781 *zzMissSet=e;\r
782 return 0;\r
783 }\r
784 zzMakeAttr /* MR14 Ger Hobbelt (hobbelt@axa.nl) */\r
785#ifdef DEMAND_LOOK\r
786#ifdef LL_K\r
787 zzdirty++;\r
788 zzlabase++; /* MR14 Ger Hobbelt (hobbelt@axa.nl) */\r
789#else\r
790 zzdirty = 1;\r
791#endif\r
792#endif\r
793 return 1;\r
794}\r
795\r
796int\r
797#ifdef __USE_PROTOS\r
798_zzmatch_wdfltsig(int tokenWanted, SetWordType *whatFollows)\r
799#else\r
800_zzmatch_wdfltsig(tokenWanted, whatFollows)\r
801int tokenWanted;\r
802SetWordType *whatFollows;\r
803#endif\r
804{\r
805#ifdef DEMAND_LOOK\r
806#ifdef LL_K\r
807 if ( zzdirty==LL_K ) {\r
808 zzCONSUME;\r
809 }\r
810#else\r
811 if ( zzdirty ) {zzCONSUME;}\r
812#endif\r
813#endif\r
814\r
815 if ( LA(1)!=tokenWanted )\r
816 {\r
817 zzSyntaxErrCount++; /* MR11 */\r
818 fprintf(stderr,\r
819 "line %d: syntax error at \"%s\" missing %s\n",\r
820 zzline,\r
821 (LA(1)==zzEOF_TOKEN)?"<eof>":(char *)LATEXT(1),\r
822 zztokens[tokenWanted]);\r
823 zzconsumeUntil( whatFollows );\r
824 return 0;\r
825 }\r
826 else {\r
827 zzMakeAttr \r
828#ifdef DEMAND_LOOK\r
829#ifdef LL_K\r
830 zzdirty++;\r
831 zzlabase++;\r
832#else\r
833 zzdirty = 1;\r
834#endif\r
835#else\r
836/* zzCONSUME; consume if not demand lookahead */\r
837#endif\r
838 return 1;\r
839 }\r
840}\r
841\r
842int\r
843#ifdef __USE_PROTOS\r
844_zzsetmatch_wdfltsig(SetWordType *tokensWanted,\r
845 int tokenTypeOfSet,\r
846 SetWordType *whatFollows)\r
847#else\r
848_zzsetmatch_wdfltsig(tokensWanted, tokenTypeOfSet, whatFollows)\r
849SetWordType *tokensWanted;\r
850int tokenTypeOfSet;\r
851SetWordType *whatFollows;\r
852#endif\r
853{\r
854#ifdef DEMAND_LOOK\r
855#ifdef LL_K\r
856 if ( zzdirty==LL_K ) {zzCONSUME;}\r
857#else\r
858 if ( zzdirty ) {zzCONSUME;}\r
859#endif\r
860#endif\r
861 if ( !zzset_el((unsigned)LA(1), tokensWanted) )\r
862 {\r
863 zzSyntaxErrCount++; /* MR11 */\r
864 fprintf(stderr,\r
865 "line %d: syntax error at \"%s\" missing %s\n",\r
866 zzline,\r
867 (LA(1)==zzEOF_TOKEN)?"<eof>":(char *)LATEXT(1),\r
868 zztokens[tokenTypeOfSet]);\r
869 zzconsumeUntil( whatFollows );\r
870 return 0;\r
871 }\r
872 else {\r
873 zzMakeAttr\r
874#ifdef DEMAND_LOOK\r
875#ifdef LL_K\r
876 zzdirty++;\r
877 zzlabase++;\r
878#else\r
879 zzdirty = 1;\r
880#endif\r
881#else\r
882/* zzCONSUME; consume if not demand lookahead */\r
883#endif\r
884 return 1;\r
885 }\r
886}\r
887\r
888int\r
889#ifdef __USE_PROTOS\r
890_zzsetmatch_wsig(SetWordType *e)\r
891#else\r
892_zzsetmatch_wsig(e)\r
893SetWordType *e;\r
894#endif\r
895{\r
896#ifdef DEMAND_LOOK\r
897#ifdef LL_K\r
898 if ( zzdirty==LL_K ) {zzCONSUME;}\r
899#else\r
900 if ( zzdirty ) {zzCONSUME;}\r
901#endif\r
902#endif\r
903 if ( !zzset_el((unsigned)LA(1), e) ) return 0;\r
904 zzMakeAttr /* MR14 Ger Hobbelt (hobbelt@axa.nl) */\r
905#ifdef DEMAND_LOOK\r
906#ifdef LL_K\r
907 zzdirty++;\r
908 zzlabase++; /* MR14 Ger Hobbelt (hobbelt@axa.nl) */\r
909#else\r
910 zzdirty = 1;\r
911#endif\r
912#endif\r
913 return 1;\r
914}\r
915\r
916#ifdef USER_ZZMODE_STACK\r
917static int zzmstk[ZZMAXSTK] = { -1 };\r
918static int zzmdep = 0;\r
919static char zzmbuf[70];\r
920\r
921void\r
922#ifdef __USE_PROTOS\r
923zzmpush( int m )\r
924#else\r
925zzmpush( m )\r
926int m;\r
927#endif\r
928{\r
929 if(zzmdep == ZZMAXSTK - 1) {\r
930 sprintf(zzmbuf, "Mode stack overflow ");\r
931 zzerr(zzmbuf);\r
932 } else {\r
933 zzmstk[zzmdep++] = zzauto;\r
934 zzmode(m);\r
935 }\r
936}\r
937\r
938void\r
939#ifdef __USE_PROTOS\r
940zzmpop( void )\r
941#else\r
942zzmpop( )\r
943#endif\r
944{\r
945 if(zzmdep == 0)\r
946 { sprintf(zzmbuf, "Mode stack underflow ");\r
947 zzerr(zzmbuf);\r
948 }\r
949 else\r
950 { zzmdep--;\r
951 zzmode(zzmstk[zzmdep]);\r
952 }\r
953}\r
954\r
955void\r
956#ifdef __USE_PROTOS\r
957zzsave_mode_stack( int modeStack[], int *modeLevel )\r
958#else\r
959zzsave_mode_stack( modeStack, modeLevel )\r
960int modeStack[];\r
961int *modeLevel;\r
962#endif\r
963{\r
964 int i;\r
965 memcpy(modeStack, zzmstk, sizeof(zzmstk));\r
966 *modeLevel = zzmdep;\r
967 zzmdep = 0;\r
968\r
969 return;\r
970}\r
971\r
972void\r
973#ifdef __USE_PROTOS\r
974zzrestore_mode_stack( int modeStack[], int *modeLevel )\r
975#else\r
976zzrestore_mode_stack( modeStack, modeLevel )\r
977int modeStack[];\r
978int *modeLevel;\r
979#endif\r
980{\r
981 int i;\r
982\r
983 memcpy(zzmstk, modeStack, sizeof(zzmstk));\r
984 zzmdep = *modeLevel;\r
985\r
986 return;\r
987}\r
988#endif /* USER_ZZMODE_STACK */\r
989\r
990#ifdef __USE_PROTOS\r
991void zzTraceReset(void)\r
992#else\r
993void zzTraceReset()\r
994#endif\r
995{\r
996#ifdef zzTRACE_RULES\r
997 zzTraceOptionValue=zzTraceOptionValueDefault;\r
998 zzTraceGuessOptionValue=1;\r
999 zzTraceCurrentRuleName=NULL;\r
1000 zzTraceDepth=0;\r
1001#endif\r
1002}\r
1003\r
1004#ifdef __USE_PROTOS\r
1005void zzTraceGuessFail(void)\r
1006#else\r
1007void zzTraceGuessFail()\r
1008#endif\r
1009{\r
1010\r
1011#ifdef zzTRACE_RULES\r
1012#ifdef ZZCAN_GUESS\r
1013\r
1014 int doIt=0;\r
1015\r
1016 if (zzTraceOptionValue <= 0) {\r
1017 doIt=0;\r
1018 } else if (zzguessing && zzTraceGuessOptionValue <= 0) {\r
1019 doIt=0;\r
1020 } else {\r
1021 doIt=1;\r
1022 };\r
1023\r
1024 if (doIt) {\r
1025 fprintf(stderr,"guess failed\n");\r
1026 };\r
1027#endif\r
1028#endif\r
1029}\r
1030\r
1031/* zzTraceOption:\r
1032 zero value turns off trace\r
1033*/\r
1034\r
1035#ifdef __USE_PROTOS\r
1036void zzTraceIn(char * rule)\r
1037#else\r
1038void zzTraceIn(rule)\r
1039 char *rule;\r
1040#endif\r
1041{\r
1042#ifdef zzTRACE_RULES\r
1043\r
1044 int doIt=0;\r
1045\r
1046 zzTraceDepth++;\r
1047 zzTraceCurrentRuleName=rule;\r
1048\r
1049 if (zzTraceOptionValue <= 0) {\r
1050 doIt=0;\r
1051#ifdef ZZCAN_GUESS\r
1052 } else if (zzguessing && zzTraceGuessOptionValue <= 0) {\r
1053 doIt=0;\r
1054#endif\r
1055 } else {\r
1056 doIt=1;\r
1057 };\r
1058\r
1059 if (doIt) {\r
1060 fprintf(stderr,"enter rule %s {\"%s\"} depth %d",\r
1061 rule,\r
1062 LA(1)==1 ? "@" : (char *) LATEXT(1), /* MR19 */\r
1063 zzTraceDepth);\r
1064#ifdef ZZCAN_GUESS\r
1065 if (zzguessing) fprintf(stderr," guessing");\r
1066#endif\r
1067 fprintf(stderr,"\n");\r
1068 };\r
1069#endif\r
1070 return;\r
1071}\r
1072\r
1073#ifdef __USE_PROTOS\r
1074void zzTraceOut(char * rule)\r
1075#else\r
1076void zzTraceOut(rule)\r
1077 char *rule;\r
1078#endif\r
1079{\r
1080#ifdef zzTRACE_RULES\r
1081 int doIt=0;\r
1082\r
1083 zzTraceDepth--;\r
1084\r
1085 if (zzTraceOptionValue <= 0) {\r
1086 doIt=0;\r
1087#ifdef ZZCAN_GUESS\r
1088 } else if (zzguessing && zzTraceGuessOptionValue <= 0) {\r
1089 doIt=0;\r
1090#endif\r
1091 } else {\r
1092 doIt=1;\r
1093 };\r
1094\r
1095 if (doIt) {\r
1096 fprintf(stderr,"exit rule %s {\"%s\"} depth %d",\r
1097 rule,\r
1098 LA(1)==1 ? "@" : (char *) LATEXT(1), /* MR19 */\r
1099 zzTraceDepth+1);\r
1100#ifdef ZZCAN_GUESS\r
1101 if (zzguessing) fprintf(stderr," guessing");\r
1102#endif\r
1103 fprintf(stderr,"\n");\r
1104 };\r
1105#endif\r
1106}\r
1107\r
1108#ifdef __USE_PROTOS\r
1109int zzTraceOption(int delta)\r
1110#else\r
1111int zzTraceOption(delta)\r
1112 int delta;\r
1113#endif\r
1114{\r
1115#ifdef zzTRACE_RULES\r
1116 int prevValue=zzTraceOptionValue;\r
1117\r
1118 zzTraceOptionValue=zzTraceOptionValue+delta;\r
1119\r
1120 if (zzTraceCurrentRuleName != NULL) {\r
1121 if (prevValue <= 0 && zzTraceOptionValue > 0) {\r
1122 fprintf(stderr,"trace enabled in rule %s depth %d\n",\r
1123 zzTraceCurrentRuleName,zzTraceDepth);\r
1124 };\r
1125 if (prevValue > 0 && zzTraceOptionValue <= 0) {\r
1126 fprintf(stderr,"trace disabled in rule %s depth %d\n",\r
1127 zzTraceCurrentRuleName,zzTraceDepth);\r
1128 };\r
1129 };\r
1130 return prevValue;\r
1131#else\r
1132 return 0;\r
1133#endif\r
1134}\r
1135\r
1136#ifdef __USE_PROTOS\r
1137int zzTraceGuessOption(int delta)\r
1138#else\r
1139int zzTraceGuessOption(delta)\r
1140 int delta;\r
1141#endif\r
1142{\r
1143#ifdef zzTRACE_RULES\r
1144#ifdef ZZCAN_GUESS\r
1145 int prevValue=zzTraceGuessOptionValue;\r
1146\r
1147 zzTraceGuessOptionValue=zzTraceGuessOptionValue+delta;\r
1148\r
1149 if (zzTraceCurrentRuleName != NULL) {\r
1150 if (prevValue <= 0 && zzTraceGuessOptionValue > 0) {\r
1151 fprintf(stderr,"guess trace enabled in rule %s depth %d\n",\r
1152 zzTraceCurrentRuleName,zzTraceDepth);\r
1153 };\r
1154 if (prevValue > 0 && zzTraceGuessOptionValue <= 0) {\r
1155 fprintf(stderr,"guess trace disabled in rule %s depth %d\n",\r
1156 zzTraceCurrentRuleName,zzTraceDepth);\r
1157 };\r
1158 };\r
1159 return prevValue;\r
1160#else\r
1161 return 0;\r
1162#endif\r
1163#else\r
1164 return 0;\r
1165#endif\r
1166}\r
1167\r
1168#endif /* ERR_H */\r