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