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