|
|
1.1 root 1: A DEFINITIONS ::=
2: %{
3:
4: #define DEBUG
5:
6: #include <stdio.h>
7:
8: /* DATA */
9:
10: #define ps_advise(ps, f) \
11: advise (NULLCP, "%s: %s", (f), ps_error ((ps) -> ps_errno))
12:
13:
14: static char *myname = "integertest";
15:
16: static enum { ps2test, pl2test } mode = ps2test;
17:
18:
19: void adios ();
20:
21: /* MAIN */
22:
23: /* ARGSUSED */
24:
25: main (argc, argv, envp)
26: int argc;
27: char **argv,
28: **envp;
29: {
30: register int status = 0;
31: register char *cp;
32: register FILE * fp;
33:
34: myname = *argv;
35: for (argc--, argv++; cp = *argv; argc--, argv++)
36: if (*cp == '-') {
37: if (strcmp (cp + 1, "ps") == 0) {
38: mode = ps2test;
39: continue;
40: }
41: if (strcmp (cp + 1, "pl") == 0) {
42: mode = pl2test;
43: continue;
44: }
45: adios (NULLCP, "usage: %s [ -ps | -pl ] [ files... ]",
46: myname);
47: }
48: else
49: break;
50:
51: if (argc == 0)
52: status = process ("(stdin)", stdin);
53: else
54: while (cp = *argv++) {
55: if ((fp = fopen (cp, "r")) == NULL) {
56: advise (cp, "unable to read");
57: status++;
58: continue;
59: }
60: status += process (cp, fp);
61: (void) fclose (fp);
62: }
63:
64: exit (status);
65: }
66:
67: /* */
68:
69: static int process (file, fp)
70: register char *file;
71: register FILE *fp;
72: {
73: register PE pe;
74: register PS ps;
75:
76: if ((ps = ps_alloc (std_open)) == NULLPS) {
77: ps_advise (ps, "ps_alloc");
78: return 1;
79: }
80: if (std_setup (ps, fp) == NOTOK) {
81: advise (NULLCP, "%s: std_setup loses", file);
82: return 1;
83: }
84:
85: for (;;) {
86: switch (mode) {
87: case ps2test:
88: if ((pe = ps2pe (ps)) == NULLPE)
89: if (ps -> ps_errno) {
90: ps_advise (ps, "ps2pe");
91: you_lose: ;
92: ps_free (ps);
93: return 1;
94: }
95: else {
96: done: ;
97: ps_free (ps);
98: return 0;
99: }
100: break;
101:
102: case pl2test:
103: if ((pe = pl2pe (ps)) == NULLPE)
104: if (ps -> ps_errno) {
105: ps_advise (ps, "pl2pe");
106: goto you_lose;
107: }
108: else
109: goto done;
110: break;
111: }
112:
113: (void) do_A_A (pe, 1);
114:
115: pe_free (pe);
116: }
117: }
118:
119: /* */
120:
121: %}
122:
123: BEGIN
124:
125: A ::= CHOICE { B, C }
126:
127: B ::= INTEGER
128: %{ fprintf(stderr, "INTEGER = %d (0x%x)\n", $$, $$); %}
129:
130: C ::= NumericString
131: %{
132: int len;
133: char *s = prim2str ($$, &len);
134: fprintf (stderr, "NumericString = %s (len %d)\n", s, len);
135: free (s);
136: %}
137:
138: END
139:
140:
141:
142: %{
143: /* DEBUG */
144:
145: #ifdef DEBUG
146: char *getenv ();
147:
148: testdebug (pe, s)
149: register PE pe;
150: register char *s;
151: {
152: static int debug = OK;
153: char *cp;
154: register PS ps;
155:
156: switch (debug) {
157: case NOTOK:
158: break;
159:
160: case OK:
161: if ((debug = (cp = getenv ("PEPYDEBUG")) && *cp ? atoi (cp)
162: : NOTOK) == NOTOK)
163: break;
164: fprintf (stderr, "%s made with %s\n", myname, pepyid);
165:
166: default:
167: fprintf (stderr, "%s\n", s);
168:
169: if ((ps = ps_alloc (std_open)) == NULLPS)
170: return;
171: if (std_setup (ps, stderr) != NOTOK)
172: (void) pe2pl (ps, pe);
173: fprintf (stderr, "--------\n");
174: ps_free (ps);
175: break;
176: }
177: }
178: #endif
179:
180: /* ERRORS */
181:
182: /* VARARGS2 */
183:
184: void adios (what, fmt, a, b, c, d, e, f, g, h, i, j)
185: char *what,
186: *fmt,
187: *a,
188: *b,
189: *c,
190: *d,
191: *e,
192: *f,
193: *g,
194: *h,
195: *i,
196: *j;
197: {
198: advise (what, fmt, a, b, c, d, e, f, g, h, i, j);
199: _exit (1);
200: }
201:
202: /* */
203:
204: /* VARARGS2 */
205:
206: void advise (what, fmt, a, b, c, d, e, f, g, h, i, j)
207: char *what,
208: *fmt,
209: *a,
210: *b,
211: *c,
212: *d,
213: *e,
214: *f,
215: *g,
216: *h,
217: *i,
218: *j;
219: {
220: (void) fflush (stdout);
221:
222: fprintf (stderr, "%s: ", myname);
223: fprintf (stderr, fmt, a, b, c, d, e, f, g, h, i, j);
224: if (what)
225: (void) fputc (' ', stderr), perror (what);
226: else
227: (void) fputc ('\n', stderr);
228: (void) fflush (stderr);
229: }
230:
231: %}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.