|
|
1.1 root 1:
2: /* A Bison parser, made from bi-parser.y */
3:
4: #define DEFOP 258
5: #define STRING 259
6:
7: #line 21 "bi-parser.y"
8:
9:
10: #include <stdio.h>
11: #include "hconfig.h"
12: #include "bi-defs.h"
13:
14: extern char yytext[];
15: extern int yyleng;
16:
17:
18: /* Chain of all defs built by the parser. */
19: struct def *defs;
20: int ndefs;
21:
22: static struct node *makenode ();
23: static struct variation *makevar ();
24: static struct def *makedef ();
25:
26: void yyerror ();
27:
28:
29: #line 43 "bi-parser.y"
30: typedef union
31: {
32: char *string;
33: struct def *def;
34: struct variation *variation;
35: struct node *node;
36: } YYSTYPE;
37:
38: #ifndef YYLTYPE
39: typedef
40: struct yyltype
41: {
42: int timestamp;
43: int first_line;
44: int first_column;
45: int last_line;
46: int last_column;
47: char *text;
48: }
49: yyltype;
50:
51: #define YYLTYPE yyltype
52: #endif
53:
54: #include <stdio.h>
55:
56: #ifndef __STDC__
57: #define const
58: #endif
59:
60:
61:
62: #define YYFINAL 39
63: #define YYFLAG -32768
64: #define YYNTBASE 8
65:
66: #define YYTRANSLATE(x) ((unsigned)(x) <= 259 ? yytranslate[x] : 17)
67:
68: static const char yytranslate[] = { 0,
69: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
70: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
71: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
72: 2, 2, 2, 2, 2, 2, 2, 2, 2, 5,
73: 7, 2, 2, 6, 2, 2, 2, 2, 2, 2,
74: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
75: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
76: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
77: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
78: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
79: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
80: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
81: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
82: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
83: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
84: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
85: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
86: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
87: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
88: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
89: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
90: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
91: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
92: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
93: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
94: 2, 2, 2, 2, 2, 1, 2, 3, 4
95: };
96:
97: static const short yyrline[] = { 0,
98: 59, 64, 66, 70, 75, 77, 81, 84, 86, 88,
99: 92, 94, 97, 100, 104, 107, 111
100: };
101:
102: static const char * const yytname[] = { 0,
103: "error","$illegal.","DEFOP","STRING","'('","','","')'","top"
104: };
105:
106: static const short yyr1[] = { 0,
107: 8, 9, 9, 10, 11, 11, 12, 12, 12, 12,
108: 13, 13, 14, 14, 15, 15, 16
109: };
110:
111: static const short yyr2[] = { 0,
112: 1, 1, 2, 10, 1, 3, 3, 5, 7, 9,
113: 0, 1, 3, 0, 1, 3, 1
114: };
115:
116: static const short yydefact[] = { 0,
117: 0, 1, 2, 0, 3, 0, 11, 12, 0, 0,
118: 0, 11, 0, 5, 0, 0, 0, 14, 7, 6,
119: 4, 0, 0, 17, 0, 15, 14, 8, 13, 0,
120: 0, 16, 14, 9, 0, 10, 0, 0, 0
121: };
122:
123: static const short yydefgoto[] = { 37,
124: 2, 3, 13, 14, 9, 23, 25, 26
125: };
126:
127: static const short yypact[] = { 2,
128: 6, 2,-32768, 8,-32768, 7, 10,-32768, 9, 11,
129: 12, 10, -5,-32768, -3, 12, 13, 14,-32768,-32768,
130: -32768, 17, 1,-32768, 15, 18, 14,-32768,-32768, 17,
131: 3,-32768, 14,-32768, 16,-32768, 25, 26,-32768
132: };
133:
134: static const short yypgoto[] = {-32768,
135: -32768, 27,-32768, 19, 20, -27, -12,-32768
136: };
137:
138:
139: #define YYLAST 35
140:
141:
142: static const short yytable[] = { 31,
143: 16, 17, 18, 19, 1, 35, 27, 28, 33, 34,
144: 4, 6, 7, 8, 10, 11, 12, 32, 22, 21,
145: 24, 29, 36, 30, 38, 39, 0, 0, 5, 0,
146: 0, 15, 0, 0, 20
147: };
148:
149: static const short yycheck[] = { 27,
150: 6, 7, 6, 7, 3, 33, 6, 7, 6, 7,
151: 5, 4, 6, 4, 6, 5, 5, 30, 5, 7,
152: 4, 7, 7, 6, 0, 0, -1, -1, 2, -1,
153: -1, 12, -1, -1, 16
154: };
155: #define YYPURE 1
156:
157: /* -*-C-*- Note some compilers choke on comments on `#line' lines. */
158: #line 3 "bison.simple"
159:
160: /* Skeleton output parser for bison,
161: Copyright (C) 1984 Bob Corbett and Richard Stallman
162:
163: This program is free software; you can redistribute it and/or modify
164: it under the terms of the GNU General Public License as published by
165: the Free Software Foundation; either version 1, or (at your option)
166: any later version.
167:
168: This program is distributed in the hope that it will be useful,
169: but WITHOUT ANY WARRANTY; without even the implied warranty of
170: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
171: GNU General Public License for more details.
172:
173: You should have received a copy of the GNU General Public License
174: along with this program; if not, write to the Free Software
175: Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
176:
177:
178: #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__)
179: #include <alloca.h>
180: #endif
181:
182: /* This is the parser code that is written into each bison parser
183: when the %semantic_parser declaration is not specified in the grammar.
184: It was written by Richard Stallman by simplifying the hairy parser
185: used when %semantic_parser is specified. */
186:
187: /* Note: there must be only one dollar sign in this file.
188: It is replaced by the list of actions, each action
189: as one case of the switch. */
190:
191: #define yyerrok (yyerrstatus = 0)
192: #define yyclearin (yychar = YYEMPTY)
193: #define YYEMPTY -2
194: #define YYEOF 0
195: #define YYFAIL goto yyerrlab;
196: #define YYACCEPT return(0)
197: #define YYABORT return(1)
198: #define YYERROR goto yyerrlab
199:
200: #define YYTERROR 1
201: #define YYERRCODE 256
202:
203: #ifndef YYIMPURE
204: #define YYLEX yylex()
205: #endif
206:
207: #ifndef YYPURE
208: #define YYLEX yylex(&yylval, &yylloc)
209: #endif
210:
211: /* If nonreentrant, generate the variables here */
212:
213: #ifndef YYIMPURE
214:
215: int yychar; /* the lookahead symbol */
216: YYSTYPE yylval; /* the semantic value of the */
217: /* lookahead symbol */
218:
219: YYLTYPE yylloc; /* location data for the lookahead */
220: /* symbol */
221:
222: int yynerrs; /* number of parse errors so far */
223: #endif /* YYIMPURE */
224:
225: #if YYDEBUG != 0
226: int yydebug; /* nonzero means print parse trace */
227: /* Since this is uninitialized, it does not stop multiple parsers
228: from coexisting. */
229: #endif
230:
231: /* YYMAXDEPTH indicates the initial size of the parser's stacks */
232:
233: #ifndef YYMAXDEPTH
234: #define YYMAXDEPTH 200
235: #endif
236:
237: /* YYMAXLIMIT is the maximum size the stacks can grow to
238: (effective only if the built-in stack extension method is used). */
239:
240: #ifndef YYMAXLIMIT
241: #define YYMAXLIMIT 10000
242: #endif
243:
244:
245: #line 90 "bison.simple"
246: int
247: yyparse()
248: {
249: register int yystate;
250: register int yyn;
251: register short *yyssp;
252: register YYSTYPE *yyvsp;
253: YYLTYPE *yylsp;
254: int yyerrstatus; /* number of tokens to shift before error messages enabled */
255: int yychar1; /* lookahead token as an internal (translated) token number */
256:
257: short yyssa[YYMAXDEPTH]; /* the state stack */
258: YYSTYPE yyvsa[YYMAXDEPTH]; /* the semantic value stack */
259: YYLTYPE yylsa[YYMAXDEPTH]; /* the location stack */
260:
261: short *yyss = yyssa; /* refer to the stacks thru separate pointers */
262: YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */
263: YYLTYPE *yyls = yylsa;
264:
265: int yymaxdepth = YYMAXDEPTH;
266:
267: #ifndef YYPURE
268: int yychar;
269: YYSTYPE yylval;
270: YYLTYPE yylloc;
271: int yynerrs;
272: #endif
273:
274: YYSTYPE yyval; /* the variable used to return */
275: /* semantic values from the action */
276: /* routines */
277:
278: int yylen;
279:
280: #if YYDEBUG != 0
281: if (yydebug)
282: fprintf(stderr, "Starting parse\n");
283: #endif
284:
285: yystate = 0;
286: yyerrstatus = 0;
287: yynerrs = 0;
288: yychar = YYEMPTY; /* Cause a token to be read. */
289:
290: /* Initialize stack pointers.
291: Waste one element of value and location stack
292: so that they stay on the same level as the state stack. */
293:
294: yyssp = yyss - 1;
295: yyvsp = yyvs;
296: yylsp = yyls;
297:
298: /* Push a new state, which is found in yystate . */
299: /* In all cases, when you get here, the value and location stacks
300: have just been pushed. so pushing a state here evens the stacks. */
301: yynewstate:
302:
303: *++yyssp = yystate;
304:
305: if (yyssp >= yyss + yymaxdepth - 1)
306: {
307: /* Give user a chance to reallocate the stack */
308: /* Use copies of these so that the &'s don't force the real ones into memory. */
309: YYSTYPE *yyvs1 = yyvs;
310: YYLTYPE *yyls1 = yyls;
311: short *yyss1 = yyss;
312:
313: /* Get the current used size of the three stacks, in elements. */
314: int size = yyssp - yyss + 1;
315:
316: #ifdef yyoverflow
317: /* Each stack pointer address is followed by the size of
318: the data in use in that stack, in bytes. */
319: yyoverflow("parser stack overflow",
320: &yyss1, size * sizeof (*yyssp),
321: &yyvs1, size * sizeof (*yyvsp),
322: &yyls1, size * sizeof (*yylsp),
323: &yymaxdepth);
324:
325: yyss = yyss1; yyvs = yyvs1; yyls = yyls1;
326: #else /* no yyoverflow */
327: /* Extend the stack our own way. */
328: if (yymaxdepth >= YYMAXLIMIT)
329: yyerror("parser stack overflow");
330: yymaxdepth *= 2;
331: if (yymaxdepth > YYMAXLIMIT)
332: yymaxdepth = YYMAXLIMIT;
333: yyss = (short *) alloca (yymaxdepth * sizeof (*yyssp));
334: bcopy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp));
335: yyvs = (YYSTYPE *) alloca (yymaxdepth * sizeof (*yyvsp));
336: bcopy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp));
337: #ifdef YYLSP_NEEDED
338: yyls = (YYLTYPE *) alloca (yymaxdepth * sizeof (*yylsp));
339: bcopy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp));
340: #endif
341: #endif /* no yyoverflow */
342:
343: yyssp = yyss + size - 1;
344: yyvsp = yyvs + size - 1;
345: #ifdef YYLSP_NEEDED
346: yylsp = yyls + size - 1;
347: #endif
348:
349: #if YYDEBUG != 0
350: if (yydebug)
351: fprintf(stderr, "Stack size increased to %d\n", yymaxdepth);
352: #endif
353:
354: if (yyssp >= yyss + yymaxdepth - 1)
355: YYABORT;
356: }
357:
358: #if YYDEBUG != 0
359: if (yydebug)
360: fprintf(stderr, "Entering state %d\n", yystate);
361: #endif
362:
363: /* Do appropriate processing given the current state. */
364: /* Read a lookahead token if we need one and don't already have one. */
365: yyresume:
366:
367: /* First try to decide what to do without reference to lookahead token. */
368:
369: yyn = yypact[yystate];
370: if (yyn == YYFLAG)
371: goto yydefault;
372:
373: /* Not known => get a lookahead token if don't already have one. */
374:
375: /* yychar is either YYEMPTY or YYEOF
376: or a valid token in external form. */
377:
378: if (yychar == YYEMPTY)
379: {
380: #if YYDEBUG != 0
381: if (yydebug)
382: fprintf(stderr, "Reading a token: ");
383: #endif
384: yychar = YYLEX;
385: }
386:
387: /* Convert token to internal form (in yychar1) for indexing tables with */
388:
389: if (yychar <= 0) /* This means end of input. */
390: {
391: yychar1 = 0;
392: yychar = YYEOF; /* Don't call YYLEX any more */
393:
394: #if YYDEBUG != 0
395: if (yydebug)
396: fprintf(stderr, "Now at end of input.\n");
397: #endif
398: }
399: else
400: {
401: yychar1 = YYTRANSLATE(yychar);
402:
403: #if YYDEBUG != 0
404: if (yydebug)
405: fprintf(stderr, "Next token is %d (%s)\n", yychar, yytname[yychar1]);
406: #endif
407: }
408:
409: yyn += yychar1;
410: if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
411: goto yydefault;
412:
413: yyn = yytable[yyn];
414:
415: /* yyn is what to do for this token type in this state.
416: Negative => reduce, -yyn is rule number.
417: Positive => shift, yyn is new state.
418: New state is final state => don't bother to shift,
419: just return success.
420: 0, or most negative number => error. */
421:
422: if (yyn < 0)
423: {
424: if (yyn == YYFLAG)
425: goto yyerrlab;
426: yyn = -yyn;
427: goto yyreduce;
428: }
429: else if (yyn == 0)
430: goto yyerrlab;
431:
432: if (yyn == YYFINAL)
433: YYACCEPT;
434:
435: /* Shift the lookahead token. */
436:
437: #if YYDEBUG != 0
438: if (yydebug)
439: fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
440: #endif
441:
442: /* Discard the token being shifted unless it is eof. */
443: if (yychar != YYEOF)
444: yychar = YYEMPTY;
445:
446: *++yyvsp = yylval;
447: #ifdef YYLSP_NEEDED
448: *++yylsp = yylloc;
449: #endif
450:
451: /* count tokens shifted since error; after three, turn off error status. */
452: if (yyerrstatus) yyerrstatus--;
453:
454: yystate = yyn;
455: goto yynewstate;
456:
457: /* Do the default action for the current state. */
458: yydefault:
459:
460: yyn = yydefact[yystate];
461: if (yyn == 0)
462: goto yyerrlab;
463:
464: /* Do a reduction. yyn is the number of a rule to reduce with. */
465: yyreduce:
466: yylen = yyr2[yyn];
467: yyval = yyvsp[1-yylen]; /* implement default value of the action */
468:
469: #if YYDEBUG != 0
470: if (yydebug)
471: {
472: if (yylen == 1)
473: fprintf (stderr, "Reducing 1 value via line %d, ",
474: yyrline[yyn]);
475: else
476: fprintf (stderr, "Reducing %d values via line %d, ",
477: yylen, yyrline[yyn]);
478: }
479: #endif
480:
481:
482: switch (yyn) {
483:
484: case 1:
485: #line 61 "bi-parser.y"
486: { defs = yyvsp[0].def; ;
487: break;}
488: case 3:
489: #line 67 "bi-parser.y"
490: { yyvsp[0].def->next = yyvsp[-1].def; yyval.def = yyvsp[0].def; ;
491: break;}
492: case 4:
493: #line 72 "bi-parser.y"
494: { yyval.def = makedef (yyvsp[-7].string, yyvsp[-5].string, yyvsp[-2].variation); ;
495: break;}
496: case 6:
497: #line 78 "bi-parser.y"
498: { yyvsp[0].variation->next = yyvsp[-2].variation; yyval.variation = yyvsp[0].variation; ;
499: break;}
500: case 7:
501: #line 83 "bi-parser.y"
502: { yyval.variation = makevar (yyvsp[-1].string, (struct node *) NULL, (struct node *) NULL, (struct node *) NULL); ;
503: break;}
504: case 8:
505: #line 85 "bi-parser.y"
506: { yyval.variation = makevar (yyvsp[-3].string, yyvsp[-1].node, (struct node *) NULL, (struct node *) NULL); ;
507: break;}
508: case 9:
509: #line 87 "bi-parser.y"
510: { yyval.variation = makevar (yyvsp[-5].string, yyvsp[-3].node, yyvsp[-1].node, (struct node *) NULL); ;
511: break;}
512: case 10:
513: #line 89 "bi-parser.y"
514: { yyval.variation = makevar (yyvsp[-7].string, yyvsp[-5].node, yyvsp[-3].node, yyvsp[-1].node); ;
515: break;}
516: case 11:
517: #line 93 "bi-parser.y"
518: { yyval.string = ""; ;
519: break;}
520: case 12:
521: #line 94 "bi-parser.y"
522: { yyval.string = yyvsp[0].string; ;
523: break;}
524: case 13:
525: #line 99 "bi-parser.y"
526: { yyval.node = yyvsp[-1].node; ;
527: break;}
528: case 14:
529: #line 101 "bi-parser.y"
530: { yyval.node = NULL; ;
531: break;}
532: case 16:
533: #line 108 "bi-parser.y"
534: { yyvsp[-2].node->next = yyvsp[0].node; yyval.node = yyvsp[-2].node; ;
535: break;}
536: case 17:
537: #line 113 "bi-parser.y"
538: { yyval.node = makenode (yyvsp[0].string); ;
539: break;}
540: }
541: /* the action file gets copied in in place of this dollarsign */
542: #line 327 "bison.simple"
543:
544: yyvsp -= yylen;
545: yyssp -= yylen;
546: #ifdef YYLSP_NEEDED
547: yylsp -= yylen;
548: #endif
549:
550: #if YYDEBUG != 0
551: if (yydebug)
552: {
553: short *ssp1 = yyss - 1;
554: fprintf (stderr, "state stack now");
555: while (ssp1 != yyssp)
556: fprintf (stderr, " %d", *++ssp1);
557: fprintf (stderr, "\n");
558: }
559: #endif
560:
561: *++yyvsp = yyval;
562:
563: #ifdef YYLSP_NEEDED
564: yylsp++;
565: if (yylen == 0)
566: {
567: yylsp->first_line = yylloc.first_line;
568: yylsp->first_column = yylloc.first_column;
569: yylsp->last_line = (yylsp-1)->last_line;
570: yylsp->last_column = (yylsp-1)->last_column;
571: yylsp->text = 0;
572: }
573: else
574: {
575: yylsp->last_line = (yylsp+yylen-1)->last_line;
576: yylsp->last_column = (yylsp+yylen-1)->last_column;
577: }
578: #endif
579:
580: /* Now "shift" the result of the reduction.
581: Determine what state that goes to,
582: based on the state we popped back to
583: and the rule number reduced by. */
584:
585: yyn = yyr1[yyn];
586:
587: yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
588: if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
589: yystate = yytable[yystate];
590: else
591: yystate = yydefgoto[yyn - YYNTBASE];
592:
593: goto yynewstate;
594:
595: yyerrlab: /* here on detecting error */
596:
597: if (! yyerrstatus)
598: /* If not already recovering from an error, report this error. */
599: {
600: ++yynerrs;
601: yyerror("parse error");
602: }
603:
604: if (yyerrstatus == 3)
605: {
606: /* if just tried and failed to reuse lookahead token after an error, discard it. */
607:
608: /* return failure if at end of input */
609: if (yychar == YYEOF)
610: YYABORT;
611:
612: #if YYDEBUG != 0
613: if (yydebug)
614: fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
615: #endif
616:
617: yychar = YYEMPTY;
618: }
619:
620: /* Else will try to reuse lookahead token
621: after shifting the error token. */
622:
623: yyerrstatus = 3; /* Each real token shifted decrements this */
624:
625: goto yyerrhandle;
626:
627: yyerrdefault: /* current state does not do anything special for the error token. */
628:
629: #if 0
630: /* This is wrong; only states that explicitly want error tokens
631: should shift them. */
632: yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/
633: if (yyn) goto yydefault;
634: #endif
635:
636: yyerrpop: /* pop the current state because it cannot handle the error token */
637:
638: if (yyssp == yyss) YYABORT;
639: yyvsp--;
640: yystate = *--yyssp;
641: #ifdef YYLSP_NEEDED
642: yylsp--;
643: #endif
644:
645: #if YYDEBUG != 0
646: if (yydebug)
647: {
648: short *ssp1 = yyss - 1;
649: fprintf (stderr, "Error: state stack now");
650: while (ssp1 != yyssp)
651: fprintf (stderr, " %d", *++ssp1);
652: fprintf (stderr, "\n");
653: }
654: #endif
655:
656: yyerrhandle:
657:
658: yyn = yypact[yystate];
659: if (yyn == YYFLAG)
660: goto yyerrdefault;
661:
662: yyn += YYTERROR;
663: if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
664: goto yyerrdefault;
665:
666: yyn = yytable[yyn];
667: if (yyn < 0)
668: {
669: if (yyn == YYFLAG)
670: goto yyerrpop;
671: yyn = -yyn;
672: goto yyreduce;
673: }
674: else if (yyn == 0)
675: goto yyerrpop;
676:
677: if (yyn == YYFINAL)
678: YYACCEPT;
679:
680: #if YYDEBUG != 0
681: if (yydebug)
682: fprintf(stderr, "Shifting error token, ");
683: #endif
684:
685: *++yyvsp = yylval;
686: #ifdef YYLSP_NEEDED
687: *++yylsp = yylloc;
688: #endif
689:
690: yystate = yyn;
691: goto yynewstate;
692: }
693: #line 116 "bi-parser.y"
694:
695:
696: static struct node *
697: makenode (s)
698: char *s;
699: {
700: struct node *n;
701:
702: n = (struct node *) malloc (sizeof (struct node));
703: n->text = s;
704: n->next = NULL;
705: return n;
706: }
707:
708: static struct variation *
709: makevar (name, inputs, outputs, literals)
710: char *name;
711: struct node *inputs, *outputs, *literals;
712: {
713: struct variation *v;
714:
715: v = (struct variation *) malloc (sizeof (struct variation));
716: v->name = name;
717: v->code = ndefs++;
718: v->inputs = inputs;
719: v->outputs = outputs;
720: v->literals = literals;
721: v->next = NULL;
722: return v;
723: }
724:
725: static struct def *
726: makedef (name, template, vars)
727: char *name, *template;
728: struct variation *vars;
729: {
730: struct def *d;
731:
732: d = (struct def *) malloc (sizeof (struct def));
733: d->basename = name;
734: d->template = template;
735: d->variations = vars;
736: d->next = NULL;
737: return d;
738: }
739:
740: void
741: yyerror (s)
742: char *s;
743: {
744: fprintf (stderr, "syntax error in input\n");
745: exit (FATAL_EXIT_CODE);
746: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.