1*3d8817e4Smiod /* Copyright 2001, 2003, 2005 Free Software Foundation, Inc.
2*3d8817e4Smiod Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com).
3*3d8817e4Smiod
4*3d8817e4Smiod This file is part of GNU binutils.
5*3d8817e4Smiod
6*3d8817e4Smiod This program is free software; you can redistribute it and/or modify
7*3d8817e4Smiod it under the terms of the GNU General Public License as published by
8*3d8817e4Smiod the Free Software Foundation; either version 2 of the License, or
9*3d8817e4Smiod (at your option) any later version.
10*3d8817e4Smiod
11*3d8817e4Smiod This program is distributed in the hope that it will be useful,
12*3d8817e4Smiod but WITHOUT ANY WARRANTY; without even the implied warranty of
13*3d8817e4Smiod MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14*3d8817e4Smiod GNU General Public License for more details.
15*3d8817e4Smiod
16*3d8817e4Smiod You should have received a copy of the GNU General Public License
17*3d8817e4Smiod along with this program; if not, write to the Free Software
18*3d8817e4Smiod Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
19*3d8817e4Smiod
20*3d8817e4Smiod %{
21*3d8817e4Smiod #include <stdio.h>
22*3d8817e4Smiod #include <stdlib.h>
23*3d8817e4Smiod
24*3d8817e4Smiod static char writecode;
25*3d8817e4Smiod static char *it;
26*3d8817e4Smiod static int code;
27*3d8817e4Smiod static char * repeat;
28*3d8817e4Smiod static char *oldrepeat;
29*3d8817e4Smiod static char *name;
30*3d8817e4Smiod static int rdepth;
31*3d8817e4Smiod static char *names[] = {" ","[n]","[n][m]"};
32*3d8817e4Smiod static char *pnames[]= {"","*","**"};
33*3d8817e4Smiod
34*3d8817e4Smiod static int yyerror (char *s);
35*3d8817e4Smiod extern int yylex (void);
36*3d8817e4Smiod %}
37*3d8817e4Smiod
38*3d8817e4Smiod
39*3d8817e4Smiod %union {
40*3d8817e4Smiod int i;
41*3d8817e4Smiod char *s;
42*3d8817e4Smiod }
43*3d8817e4Smiod %token COND
44*3d8817e4Smiod %token REPEAT
45*3d8817e4Smiod %token '(' ')'
46*3d8817e4Smiod %token <s> TYPE
47*3d8817e4Smiod %token <s> NAME
48*3d8817e4Smiod %token <i> NUMBER UNIT
49*3d8817e4Smiod %type <i> attr_size
50*3d8817e4Smiod %type <s> attr_desc attr_id attr_type
51*3d8817e4Smiod %%
52*3d8817e4Smiod
53*3d8817e4Smiod top: {
54*3d8817e4Smiod switch (writecode)
55*3d8817e4Smiod {
56*3d8817e4Smiod case 'i':
57*3d8817e4Smiod printf("#ifdef SYSROFF_SWAP_IN\n");
58*3d8817e4Smiod break;
59*3d8817e4Smiod case 'p':
60*3d8817e4Smiod printf("#ifdef SYSROFF_p\n");
61*3d8817e4Smiod break;
62*3d8817e4Smiod case 'd':
63*3d8817e4Smiod break;
64*3d8817e4Smiod case 'g':
65*3d8817e4Smiod printf("#ifdef SYSROFF_SWAP_OUT\n");
66*3d8817e4Smiod break;
67*3d8817e4Smiod case 'c':
68*3d8817e4Smiod printf("#ifdef SYSROFF_PRINT\n");
69*3d8817e4Smiod printf("#include <stdio.h>\n");
70*3d8817e4Smiod printf("#include <stdlib.h>\n");
71*3d8817e4Smiod printf("#include <ansidecl.h>\n");
72*3d8817e4Smiod break;
73*3d8817e4Smiod }
74*3d8817e4Smiod }
75*3d8817e4Smiod it_list {
76*3d8817e4Smiod switch (writecode) {
77*3d8817e4Smiod case 'i':
78*3d8817e4Smiod case 'p':
79*3d8817e4Smiod case 'g':
80*3d8817e4Smiod case 'c':
81*3d8817e4Smiod printf("#endif\n");
82*3d8817e4Smiod break;
83*3d8817e4Smiod case 'd':
84*3d8817e4Smiod break;
85*3d8817e4Smiod }
86*3d8817e4Smiod }
87*3d8817e4Smiod
88*3d8817e4Smiod ;
89*3d8817e4Smiod
90*3d8817e4Smiod
91*3d8817e4Smiod it_list: it it_list
92*3d8817e4Smiod |
93*3d8817e4Smiod ;
94*3d8817e4Smiod
95*3d8817e4Smiod it:
96*3d8817e4Smiod '(' NAME NUMBER
97*3d8817e4Smiod {
98*3d8817e4Smiod it = $2; code = $3;
99*3d8817e4Smiod switch (writecode)
100*3d8817e4Smiod {
101*3d8817e4Smiod case 'd':
102*3d8817e4Smiod printf("\n\n\n#define IT_%s_CODE 0x%x\n", it,code);
103*3d8817e4Smiod printf("struct IT_%s;\n", it);
104*3d8817e4Smiod printf("extern void sysroff_swap_%s_in PARAMS ((struct IT_%s *));\n",
105*3d8817e4Smiod $2, it);
106*3d8817e4Smiod printf("extern void sysroff_swap_%s_out PARAMS ((FILE *, struct IT_%s *));\n",
107*3d8817e4Smiod $2, it);
108*3d8817e4Smiod printf("extern void sysroff_print_%s_out PARAMS ((struct IT_%s *));\n",
109*3d8817e4Smiod $2, it);
110*3d8817e4Smiod printf("struct IT_%s { \n", it);
111*3d8817e4Smiod break;
112*3d8817e4Smiod case 'i':
113*3d8817e4Smiod printf("void sysroff_swap_%s_in(ptr)\n",$2);
114*3d8817e4Smiod printf("struct IT_%s *ptr;\n", it);
115*3d8817e4Smiod printf("{\n");
116*3d8817e4Smiod printf("unsigned char raw[255];\n");
117*3d8817e4Smiod printf("\tint idx = 0 ;\n");
118*3d8817e4Smiod printf("\tint size;\n");
119*3d8817e4Smiod printf("memset(raw,0,255);\n");
120*3d8817e4Smiod printf("memset(ptr,0,sizeof(*ptr));\n");
121*3d8817e4Smiod printf("size = fillup(raw);\n");
122*3d8817e4Smiod break;
123*3d8817e4Smiod case 'g':
124*3d8817e4Smiod printf("void sysroff_swap_%s_out(file,ptr)\n",$2);
125*3d8817e4Smiod printf("FILE * file;\n");
126*3d8817e4Smiod printf("struct IT_%s *ptr;\n", it);
127*3d8817e4Smiod printf("{\n");
128*3d8817e4Smiod printf("\tunsigned char raw[255];\n");
129*3d8817e4Smiod printf("\tint idx = 16 ;\n");
130*3d8817e4Smiod printf("\tmemset (raw, 0, 255);\n");
131*3d8817e4Smiod printf("\tcode = IT_%s_CODE;\n", it);
132*3d8817e4Smiod break;
133*3d8817e4Smiod case 'o':
134*3d8817e4Smiod printf("void sysroff_swap_%s_out(abfd,ptr)\n",$2);
135*3d8817e4Smiod printf("bfd * abfd;\n");
136*3d8817e4Smiod printf("struct IT_%s *ptr;\n",it);
137*3d8817e4Smiod printf("{\n");
138*3d8817e4Smiod printf("int idx = 0 ;\n");
139*3d8817e4Smiod break;
140*3d8817e4Smiod case 'c':
141*3d8817e4Smiod printf("void sysroff_print_%s_out(ptr)\n",$2);
142*3d8817e4Smiod printf("struct IT_%s *ptr;\n", it);
143*3d8817e4Smiod printf("{\n");
144*3d8817e4Smiod printf("itheader(\"%s\", IT_%s_CODE);\n",$2,$2);
145*3d8817e4Smiod break;
146*3d8817e4Smiod
147*3d8817e4Smiod case 't':
148*3d8817e4Smiod break;
149*3d8817e4Smiod }
150*3d8817e4Smiod
151*3d8817e4Smiod }
152*3d8817e4Smiod it_field_list
153*3d8817e4Smiod ')'
154*3d8817e4Smiod {
155*3d8817e4Smiod switch (writecode) {
156*3d8817e4Smiod case 'd':
157*3d8817e4Smiod printf("};\n");
158*3d8817e4Smiod break;
159*3d8817e4Smiod case 'g':
160*3d8817e4Smiod printf("\tchecksum(file,raw, idx, IT_%s_CODE);\n", it);
161*3d8817e4Smiod
162*3d8817e4Smiod case 'i':
163*3d8817e4Smiod
164*3d8817e4Smiod case 'o':
165*3d8817e4Smiod case 'c':
166*3d8817e4Smiod printf("}\n");
167*3d8817e4Smiod }
168*3d8817e4Smiod }
169*3d8817e4Smiod ;
170*3d8817e4Smiod
171*3d8817e4Smiod
172*3d8817e4Smiod
173*3d8817e4Smiod it_field_list:
174*3d8817e4Smiod it_field it_field_list
175*3d8817e4Smiod | cond_it_field it_field_list
176*3d8817e4Smiod | repeat_it_field it_field_list
177*3d8817e4Smiod |
178*3d8817e4Smiod ;
179*3d8817e4Smiod
180*3d8817e4Smiod repeat_it_field: '(' REPEAT NAME
181*3d8817e4Smiod {
182*3d8817e4Smiod rdepth++;
183*3d8817e4Smiod switch (writecode)
184*3d8817e4Smiod {
185*3d8817e4Smiod case 'c':
186*3d8817e4Smiod if (rdepth==1)
187*3d8817e4Smiod printf("\tprintf(\"repeat %%d\\n\", %s);\n",$3);
188*3d8817e4Smiod if (rdepth==2)
189*3d8817e4Smiod printf("\tprintf(\"repeat %%d\\n\", %s[n]);\n",$3);
190*3d8817e4Smiod case 'i':
191*3d8817e4Smiod case 'g':
192*3d8817e4Smiod case 'o':
193*3d8817e4Smiod
194*3d8817e4Smiod if (rdepth==1)
195*3d8817e4Smiod {
196*3d8817e4Smiod printf("\t{ int n; for (n = 0; n < %s; n++) {\n", $3);
197*3d8817e4Smiod }
198*3d8817e4Smiod if (rdepth == 2) {
199*3d8817e4Smiod printf("\t{ int m; for (m = 0; m < %s[n]; m++) {\n", $3);
200*3d8817e4Smiod }
201*3d8817e4Smiod
202*3d8817e4Smiod break;
203*3d8817e4Smiod }
204*3d8817e4Smiod
205*3d8817e4Smiod oldrepeat = repeat;
206*3d8817e4Smiod repeat = $3;
207*3d8817e4Smiod }
208*3d8817e4Smiod
209*3d8817e4Smiod it_field_list ')'
210*3d8817e4Smiod
211*3d8817e4Smiod {
212*3d8817e4Smiod repeat = oldrepeat;
213*3d8817e4Smiod oldrepeat =0;
214*3d8817e4Smiod rdepth--;
215*3d8817e4Smiod switch (writecode)
216*3d8817e4Smiod {
217*3d8817e4Smiod case 'i':
218*3d8817e4Smiod case 'g':
219*3d8817e4Smiod case 'o':
220*3d8817e4Smiod case 'c':
221*3d8817e4Smiod printf("\t}}\n");
222*3d8817e4Smiod }
223*3d8817e4Smiod }
224*3d8817e4Smiod ;
225*3d8817e4Smiod
226*3d8817e4Smiod
227*3d8817e4Smiod cond_it_field: '(' COND NAME
228*3d8817e4Smiod {
229*3d8817e4Smiod switch (writecode)
230*3d8817e4Smiod {
231*3d8817e4Smiod case 'i':
232*3d8817e4Smiod case 'g':
233*3d8817e4Smiod case 'o':
234*3d8817e4Smiod case 'c':
235*3d8817e4Smiod printf("\tif (%s) {\n", $3);
236*3d8817e4Smiod break;
237*3d8817e4Smiod }
238*3d8817e4Smiod }
239*3d8817e4Smiod
240*3d8817e4Smiod it_field_list ')'
241*3d8817e4Smiod {
242*3d8817e4Smiod switch (writecode)
243*3d8817e4Smiod {
244*3d8817e4Smiod case 'i':
245*3d8817e4Smiod case 'g':
246*3d8817e4Smiod case 'o':
247*3d8817e4Smiod case 'c':
248*3d8817e4Smiod printf("\t}\n");
249*3d8817e4Smiod }
250*3d8817e4Smiod }
251*3d8817e4Smiod ;
252*3d8817e4Smiod
253*3d8817e4Smiod it_field:
254*3d8817e4Smiod '(' attr_desc '(' attr_type attr_size ')' attr_id
255*3d8817e4Smiod {name = $7; }
256*3d8817e4Smiod enums ')'
257*3d8817e4Smiod {
258*3d8817e4Smiod char *desc = $2;
259*3d8817e4Smiod char *type = $4;
260*3d8817e4Smiod int size = $5;
261*3d8817e4Smiod char *id = $7;
262*3d8817e4Smiod char *p = names[rdepth];
263*3d8817e4Smiod char *ptr = pnames[rdepth];
264*3d8817e4Smiod switch (writecode)
265*3d8817e4Smiod {
266*3d8817e4Smiod case 'g':
267*3d8817e4Smiod if (size % 8)
268*3d8817e4Smiod {
269*3d8817e4Smiod
270*3d8817e4Smiod printf("\twriteBITS(ptr->%s%s,raw,&idx,%d);\n",
271*3d8817e4Smiod id,
272*3d8817e4Smiod names[rdepth], size);
273*3d8817e4Smiod
274*3d8817e4Smiod }
275*3d8817e4Smiod else {
276*3d8817e4Smiod printf("\twrite%s(ptr->%s%s,raw,&idx,%d,file);\n",
277*3d8817e4Smiod type,
278*3d8817e4Smiod id,
279*3d8817e4Smiod names[rdepth],size/8);
280*3d8817e4Smiod }
281*3d8817e4Smiod break;
282*3d8817e4Smiod case 'i':
283*3d8817e4Smiod {
284*3d8817e4Smiod
285*3d8817e4Smiod if (rdepth >= 1)
286*3d8817e4Smiod
287*3d8817e4Smiod {
288*3d8817e4Smiod printf("if (!ptr->%s) ptr->%s = (%s*)xcalloc(%s, sizeof(ptr->%s[0]));\n",
289*3d8817e4Smiod id,
290*3d8817e4Smiod id,
291*3d8817e4Smiod type,
292*3d8817e4Smiod repeat,
293*3d8817e4Smiod id);
294*3d8817e4Smiod }
295*3d8817e4Smiod
296*3d8817e4Smiod if (rdepth == 2)
297*3d8817e4Smiod {
298*3d8817e4Smiod printf("if (!ptr->%s[n]) ptr->%s[n] = (%s**)xcalloc(%s[n], sizeof(ptr->%s[n][0]));\n",
299*3d8817e4Smiod id,
300*3d8817e4Smiod id,
301*3d8817e4Smiod type,
302*3d8817e4Smiod repeat,
303*3d8817e4Smiod id);
304*3d8817e4Smiod }
305*3d8817e4Smiod
306*3d8817e4Smiod }
307*3d8817e4Smiod
308*3d8817e4Smiod if (size % 8)
309*3d8817e4Smiod {
310*3d8817e4Smiod printf("\tptr->%s%s = getBITS(raw,&idx, %d,size);\n",
311*3d8817e4Smiod id,
312*3d8817e4Smiod names[rdepth],
313*3d8817e4Smiod size);
314*3d8817e4Smiod }
315*3d8817e4Smiod else {
316*3d8817e4Smiod printf("\tptr->%s%s = get%s(raw,&idx, %d,size);\n",
317*3d8817e4Smiod id,
318*3d8817e4Smiod names[rdepth],
319*3d8817e4Smiod type,
320*3d8817e4Smiod size/8);
321*3d8817e4Smiod }
322*3d8817e4Smiod break;
323*3d8817e4Smiod case 'o':
324*3d8817e4Smiod printf("\tput%s(raw,%d,%d,&idx,ptr->%s%s);\n", type,size/8,size%8,id,names[rdepth]);
325*3d8817e4Smiod break;
326*3d8817e4Smiod case 'd':
327*3d8817e4Smiod if (repeat)
328*3d8817e4Smiod printf("\t/* repeat %s */\n", repeat);
329*3d8817e4Smiod
330*3d8817e4Smiod if (type[0] == 'I') {
331*3d8817e4Smiod printf("\tint %s%s; \t/* %s */\n",ptr,id, desc);
332*3d8817e4Smiod }
333*3d8817e4Smiod else if (type[0] =='C') {
334*3d8817e4Smiod printf("\tchar %s*%s;\t /* %s */\n",ptr,id, desc);
335*3d8817e4Smiod }
336*3d8817e4Smiod else {
337*3d8817e4Smiod printf("\tbarray %s%s;\t /* %s */\n",ptr,id, desc);
338*3d8817e4Smiod }
339*3d8817e4Smiod break;
340*3d8817e4Smiod case 'c':
341*3d8817e4Smiod printf("tabout();\n");
342*3d8817e4Smiod printf("\tprintf(\"/*%-30s*/ ptr->%s = \");\n", desc, id);
343*3d8817e4Smiod
344*3d8817e4Smiod if (type[0] == 'I')
345*3d8817e4Smiod printf("\tprintf(\"%%d\\n\",ptr->%s%s);\n", id,p);
346*3d8817e4Smiod else if (type[0] == 'C')
347*3d8817e4Smiod printf("\tprintf(\"%%s\\n\",ptr->%s%s);\n", id,p);
348*3d8817e4Smiod
349*3d8817e4Smiod else if (type[0] == 'B')
350*3d8817e4Smiod {
351*3d8817e4Smiod printf("\tpbarray(&ptr->%s%s);\n", id,p);
352*3d8817e4Smiod }
353*3d8817e4Smiod else abort();
354*3d8817e4Smiod break;
355*3d8817e4Smiod }
356*3d8817e4Smiod }
357*3d8817e4Smiod
358*3d8817e4Smiod ;
359*3d8817e4Smiod
360*3d8817e4Smiod
361*3d8817e4Smiod attr_type:
362*3d8817e4Smiod TYPE { $$ = $1; }
363*3d8817e4Smiod | { $$ = "INT";}
364*3d8817e4Smiod ;
365*3d8817e4Smiod
366*3d8817e4Smiod attr_desc:
367*3d8817e4Smiod '(' NAME ')'
368*3d8817e4Smiod { $$ = $2; }
369*3d8817e4Smiod ;
370*3d8817e4Smiod
371*3d8817e4Smiod attr_size:
372*3d8817e4Smiod NUMBER UNIT
373*3d8817e4Smiod { $$ = $1 * $2; }
374*3d8817e4Smiod ;
375*3d8817e4Smiod
376*3d8817e4Smiod
377*3d8817e4Smiod attr_id:
378*3d8817e4Smiod '(' NAME ')' { $$ = $2; }
379*3d8817e4Smiod | { $$ = "dummy";}
380*3d8817e4Smiod ;
381*3d8817e4Smiod
382*3d8817e4Smiod enums:
383*3d8817e4Smiod | '(' enum_list ')' ;
384*3d8817e4Smiod
385*3d8817e4Smiod enum_list:
386*3d8817e4Smiod |
387*3d8817e4Smiod enum_list '(' NAME NAME ')' {
388*3d8817e4Smiod switch (writecode)
389*3d8817e4Smiod {
390*3d8817e4Smiod case 'd':
391*3d8817e4Smiod printf("#define %s %s\n", $3,$4);
392*3d8817e4Smiod break;
393*3d8817e4Smiod case 'c':
394*3d8817e4Smiod printf("if (ptr->%s%s == %s) { tabout(); printf(\"%s\\n\");}\n", name, names[rdepth],$4,$3);
395*3d8817e4Smiod }
396*3d8817e4Smiod }
397*3d8817e4Smiod
398*3d8817e4Smiod ;
399*3d8817e4Smiod
400*3d8817e4Smiod
401*3d8817e4Smiod
402*3d8817e4Smiod %%
403*3d8817e4Smiod /* four modes
404*3d8817e4Smiod
405*3d8817e4Smiod -d write structure definitions for sysroff in host format
406*3d8817e4Smiod -i write functions to swap into sysroff format in
407*3d8817e4Smiod -o write functions to swap into sysroff format out
408*3d8817e4Smiod -c write code to print info in human form */
409*3d8817e4Smiod
410*3d8817e4Smiod int yydebug;
411*3d8817e4Smiod
412*3d8817e4Smiod int
main(int ac,char ** av)413*3d8817e4Smiod main (int ac, char **av)
414*3d8817e4Smiod {
415*3d8817e4Smiod yydebug=0;
416*3d8817e4Smiod if (ac > 1)
417*3d8817e4Smiod writecode = av[1][1];
418*3d8817e4Smiod if (writecode == 'd')
419*3d8817e4Smiod {
420*3d8817e4Smiod printf("typedef struct { unsigned char *data; int len; } barray; \n");
421*3d8817e4Smiod printf("typedef int INT;\n");
422*3d8817e4Smiod printf("typedef char * CHARS;\n");
423*3d8817e4Smiod
424*3d8817e4Smiod }
425*3d8817e4Smiod yyparse();
426*3d8817e4Smiod return 0;
427*3d8817e4Smiod }
428*3d8817e4Smiod
429*3d8817e4Smiod static int
yyerror(char * s)430*3d8817e4Smiod yyerror (char *s)
431*3d8817e4Smiod {
432*3d8817e4Smiod fprintf(stderr, "%s\n" , s);
433*3d8817e4Smiod return 0;
434*3d8817e4Smiod }
435