sysinfo.y revision 89857
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 printf("#include <ansidecl.h>\n"); 76 break; 77 } 78 } 79it_list { 80 switch (writecode) { 81 case 'i': 82 case 'p': 83 case 'g': 84 case 'c': 85 printf("#endif\n"); 86 break; 87 case 'd': 88 break; 89 } 90} 91 92 ; 93 94 95it_list: it it_list 96 | 97 ; 98 99it: 100 '(' NAME NUMBER 101 { 102 it = $2; code = $3; 103 switch (writecode) 104 { 105 case 'd': 106 printf("\n\n\n#define IT_%s_CODE 0x%x\n", it,code); 107 printf("struct IT_%s;\n", it); 108 printf("extern void sysroff_swap_%s_in PARAMS ((struct IT_%s *));\n", 109 $2, it); 110 printf("extern void sysroff_swap_%s_out PARAMS ((FILE *, struct IT_%s *));\n", 111 $2, it); 112 printf("extern void sysroff_print_%s_out PARAMS ((struct IT_%s *));\n", 113 $2, it); 114 printf("struct IT_%s { \n", it); 115 break; 116 case 'i': 117 printf("void sysroff_swap_%s_in(ptr)\n",$2); 118 printf("struct IT_%s *ptr;\n", it); 119 printf("{\n"); 120 printf("char raw[255];\n"); 121 printf("\tint idx = 0 ;\n"); 122 printf("\tint size;\n"); 123 printf("memset(raw,0,255);\n"); 124 printf("memset(ptr,0,sizeof(*ptr));\n"); 125 printf("size = fillup(raw);\n"); 126 break; 127 case 'g': 128 printf("void sysroff_swap_%s_out(file,ptr)\n",$2); 129 printf("FILE * file;\n"); 130 printf("struct IT_%s *ptr;\n", it); 131 printf("{\n"); 132 printf("\tchar raw[255];\n"); 133 printf("\tint idx = 16 ;\n"); 134 printf("\tmemset (raw, 0, 255);\n"); 135 printf("\tcode = IT_%s_CODE;\n", it); 136 break; 137 case 'o': 138 printf("void sysroff_swap_%s_out(abfd,ptr)\n",$2); 139 printf("bfd * abfd;\n"); 140 printf("struct IT_%s *ptr;\n",it); 141 printf("{\n"); 142 printf("int idx = 0 ;\n"); 143 break; 144 case 'c': 145 printf("void sysroff_print_%s_out(ptr)\n",$2); 146 printf("struct IT_%s *ptr;\n", it); 147 printf("{\n"); 148 printf("itheader(\"%s\", IT_%s_CODE);\n",$2,$2); 149 break; 150 151 case 't': 152 break; 153 } 154 155 } 156 it_field_list 157')' 158{ 159 switch (writecode) { 160 case 'd': 161 printf("};\n"); 162 break; 163 case 'g': 164 printf("\tchecksum(file,raw, idx, IT_%s_CODE);\n", it); 165 166 case 'i': 167 168 case 'o': 169 case 'c': 170 printf("}\n"); 171 } 172} 173; 174 175 176 177it_field_list: 178 it_field it_field_list 179 | cond_it_field it_field_list 180 | repeat_it_field it_field_list 181 | 182 ; 183 184repeat_it_field: '(' REPEAT NAME 185 { 186 rdepth++; 187 switch (writecode) 188 { 189 case 'c': 190 if (rdepth==1) 191 printf("\tprintf(\"repeat %%d\\n\", %s);\n",$3); 192 if (rdepth==2) 193 printf("\tprintf(\"repeat %%d\\n\", %s[n]);\n",$3); 194 case 'i': 195 case 'g': 196 case 'o': 197 198 if (rdepth==1) 199 { 200 printf("\t{ int n; for (n = 0; n < %s; n++) {\n", $3); 201 } 202 if (rdepth == 2) { 203 printf("\t{ int m; for (m = 0; m < %s[n]; m++) {\n", $3); 204 } 205 206 break; 207 } 208 209 oldrepeat = repeat; 210 repeat = $3; 211 } 212 213 it_field_list ')' 214 215 { 216 repeat = oldrepeat; 217 oldrepeat =0; 218 rdepth--; 219 switch (writecode) 220 { 221 case 'i': 222 case 'g': 223 case 'o': 224 case 'c': 225 printf("\t}}\n"); 226 } 227 } 228 ; 229 230 231cond_it_field: '(' COND NAME 232 { 233 switch (writecode) 234 { 235 case 'i': 236 case 'g': 237 case 'o': 238 case 'c': 239 printf("\tif (%s) {\n", $3); 240 break; 241 } 242 } 243 244 it_field_list ')' 245 { 246 switch (writecode) 247 { 248 case 'i': 249 case 'g': 250 case 'o': 251 case 'c': 252 printf("\t}\n"); 253 } 254 } 255 ; 256 257it_field: 258 '(' attr_desc '(' attr_type attr_size ')' attr_id 259 {name = $7; } 260 enums ')' 261 { 262 char *desc = $2; 263 char *type = $4; 264 int size = $5; 265 char *id = $7; 266char *p = names[rdepth]; 267char *ptr = pnames[rdepth]; 268 switch (writecode) 269 { 270 case 'g': 271 if (size % 8) 272 { 273 274 printf("\twriteBITS(ptr->%s%s,raw,&idx,%d);\n", 275 id, 276 names[rdepth], size); 277 278 } 279 else { 280 printf("\twrite%s(ptr->%s%s,raw,&idx,%d,file);\n", 281 type, 282 id, 283 names[rdepth],size/8); 284 } 285 break; 286 case 'i': 287 { 288 289 if (rdepth >= 1) 290 291 { 292 printf("if (!ptr->%s) ptr->%s = (%s*)xcalloc(%s, sizeof(ptr->%s[0]));\n", 293 id, 294 id, 295 type, 296 repeat, 297 id); 298 } 299 300 if (rdepth == 2) 301 { 302 printf("if (!ptr->%s[n]) ptr->%s[n] = (%s**)xcalloc(%s[n], sizeof(ptr->%s[n][0]));\n", 303 id, 304 id, 305 type, 306 repeat, 307 id); 308 } 309 310 } 311 312 if (size % 8) 313 { 314 printf("\tptr->%s%s = getBITS(raw,&idx, %d,size);\n", 315 id, 316 names[rdepth], 317 size); 318 } 319 else { 320 printf("\tptr->%s%s = get%s(raw,&idx, %d,size);\n", 321 id, 322 names[rdepth], 323 type, 324 size/8); 325 } 326 break; 327 case 'o': 328 printf("\tput%s(raw,%d,%d,&idx,ptr->%s%s);\n", type,size/8,size%8,id,names[rdepth]); 329 break; 330 case 'd': 331 if (repeat) 332 printf("\t/* repeat %s */\n", repeat); 333 334 if (type[0] == 'I') { 335 printf("\tint %s%s; \t/* %s */\n",ptr,id, desc); 336 } 337 else if (type[0] =='C') { 338 printf("\tchar %s*%s;\t /* %s */\n",ptr,id, desc); 339 } 340 else { 341 printf("\tbarray %s%s;\t /* %s */\n",ptr,id, desc); 342 } 343 break; 344 case 'c': 345 printf("tabout();\n"); 346 printf("\tprintf(\"/*%-30s*/ ptr->%s = \");\n", desc, id); 347 348 if (type[0] == 'I') 349 printf("\tprintf(\"%%d\\n\",ptr->%s%s);\n", id,p); 350 else if (type[0] == 'C') 351 printf("\tprintf(\"%%s\\n\",ptr->%s%s);\n", id,p); 352 353 else if (type[0] == 'B') 354 { 355 printf("\tpbarray(&ptr->%s%s);\n", id,p); 356 } 357 else abort(); 358 break; 359 } 360 } 361 362 ; 363 364 365attr_type: 366 TYPE { $$ = $1; } 367 | { $$ = "INT";} 368 ; 369 370attr_desc: 371 '(' NAME ')' 372 { $$ = $2; } 373 ; 374 375attr_size: 376 NUMBER UNIT 377 { $$ = $1 * $2; } 378 ; 379 380 381attr_id: 382 '(' NAME ')' { $$ = $2; } 383 | { $$ = "dummy";} 384 ; 385 386enums: 387 | '(' enum_list ')' ; 388 389enum_list: 390 | 391 enum_list '(' NAME NAME ')' { 392 switch (writecode) 393 { 394 case 'd': 395 printf("#define %s %s\n", $3,$4); 396 break; 397 case 'c': 398 printf("if (ptr->%s%s == %s) { tabout(); printf(\"%s\\n\");}\n", name, names[rdepth],$4,$3); 399 } 400 } 401 402 ; 403 404 405 406%% 407/* four modes 408 409 -d write structure defintions for sysroff in host format 410 -i write functions to swap into sysroff format in 411 -o write functions to swap into sysroff format out 412 -c write code to print info in human form */ 413 414int yydebug; 415char writecode; 416 417int 418main(ac,av) 419int ac; 420char **av; 421{ 422 yydebug=0; 423 if (ac > 1) 424 writecode = av[1][1]; 425if (writecode == 'd') 426 { 427 printf("typedef struct { unsigned char *data; int len; } barray; \n"); 428 printf("typedef int INT;\n"); 429 printf("typedef char * CHARS;\n"); 430 431 } 432 yyparse(); 433return 0; 434} 435 436int 437yyerror(s) 438 char *s; 439{ 440 fprintf(stderr, "%s\n" , s); 441 return 0; 442} 443