Home | History | Annotate | Download | only in binutils
      1 /* Copyright (C) 2001-2014 Free Software Foundation, Inc.
      2    Written by Steve Chamberlain of Cygnus Support (steve (at) 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
    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
    425 yyerror (char *s)
    426 {
    427   fprintf(stderr, "%s\n" , s);
    428   return 0;
    429 }
    430