|
|
1.1 ! root 1: #define YYSTYPE char * ! 2: ! 3: #include "asmtrans.h" ! 4: ! 5: #include "asmtab.h" ! 6: ! 7: ! 8: ! 9: #define QUOTESYM '"' ! 10: ! 11: #define CMDSYM '%' ! 12: ! 13: ! 14: ! 15: FILE *infile, *outfile; ! 16: ! 17: ! 18: ! 19: #define MAXNEST 10 ! 20: ! 21: int hidecnt = 0; ! 22: ! 23: int ifstack[MAXNEST], ifstkptr; ! 24: ! 25: ! 26: ! 27: void emit(s) ! 28: ! 29: char *s; ! 30: ! 31: { ! 32: ! 33: if (hidecnt == 0) ! 34: ! 35: fputs(s, outfile); ! 36: ! 37: free(s); ! 38: ! 39: } ! 40: ! 41: ! 42: ! 43: char *concat(s1, s2) ! 44: ! 45: char *s1, *s2; ! 46: ! 47: { ! 48: ! 49: size_t siz = strlen(s1) + strlen(s2) + 1; ! 50: ! 51: char *r; ! 52: ! 53: ! 54: ! 55: r = malloc(siz); ! 56: ! 57: if (!r) return 0; ! 58: ! 59: ! 60: ! 61: strcpy(r, s1); ! 62: ! 63: strcat(r, s2); ! 64: ! 65: return r; ! 66: ! 67: } ! 68: ! 69: ! 70: ! 71: char *concat3(s1, s2, s3) ! 72: ! 73: char *s1, *s2, *s3; ! 74: ! 75: { ! 76: ! 77: size_t siz = strlen(s1) + strlen(s2) + strlen(s3) + 1; ! 78: ! 79: char *r; ! 80: ! 81: ! 82: ! 83: r = malloc(siz); ! 84: ! 85: if (!r) return 0; ! 86: ! 87: ! 88: ! 89: strcpy(r, s1); ! 90: ! 91: strcat(r, s2); ! 92: ! 93: strcat(r, s3); ! 94: ! 95: return r; ! 96: ! 97: } ! 98: ! 99: ! 100: ! 101: char *concat4(s1, s2, s3, s4) ! 102: ! 103: char *s1, *s2, *s3, *s4; ! 104: ! 105: { ! 106: ! 107: size_t siz = strlen(s1) + strlen(s2) + strlen(s3) + strlen(s4) + 1; ! 108: ! 109: char *r; ! 110: ! 111: ! 112: ! 113: r = malloc(siz); ! 114: ! 115: if (!r) return 0; ! 116: ! 117: ! 118: ! 119: strcpy(r, s1); ! 120: ! 121: strcat(r, s2); ! 122: ! 123: strcat(r, s3); ! 124: ! 125: strcat(r, s4); ! 126: ! 127: return r; ! 128: ! 129: } ! 130: ! 131: ! 132: ! 133: char *concat5(s1, s2, s3, s4, s5) ! 134: ! 135: char *s1, *s2, *s3, *s4, *s5; ! 136: ! 137: { ! 138: ! 139: size_t siz = strlen(s1) + strlen(s2) + strlen(s3) ! 140: ! 141: + strlen(s4) + strlen(s5) + 1; ! 142: ! 143: char *r; ! 144: ! 145: ! 146: ! 147: r = malloc(siz); ! 148: ! 149: if (!r) return 0; ! 150: ! 151: ! 152: ! 153: strcpy(r, s1); ! 154: ! 155: strcat(r, s2); ! 156: ! 157: strcat(r, s3); ! 158: ! 159: strcat(r, s4); ! 160: ! 161: strcat(r, s5); ! 162: ! 163: return r; ! 164: ! 165: } ! 166: ! 167: ! 168: ! 169: char *concat6(s1, s2, s3, s4, s5, s6) ! 170: ! 171: char *s1, *s2, *s3, *s4, *s5, *s6; ! 172: ! 173: { ! 174: ! 175: size_t siz = strlen(s1) + strlen(s2) + strlen(s3) ! 176: ! 177: + strlen(s4) + strlen(s5) + strlen(s6) + 1; ! 178: ! 179: char *r; ! 180: ! 181: ! 182: ! 183: r = malloc(siz); ! 184: ! 185: if (!r) return 0; ! 186: ! 187: ! 188: ! 189: strcpy(r, s1); ! 190: ! 191: strcat(r, s2); ! 192: ! 193: strcat(r, s3); ! 194: ! 195: strcat(r, s4); ! 196: ! 197: strcat(r, s5); ! 198: ! 199: strcat(r, s6); ! 200: ! 201: return r; ! 202: ! 203: } ! 204: ! 205: ! 206: ! 207: static int is_word_sym(c) ! 208: ! 209: int c; ! 210: ! 211: { ! 212: ! 213: if (c == '.' || (c >= '0' && c <= '9')) return 1; ! 214: ! 215: if (c >= 'a' && c <= 'z') return 1; ! 216: ! 217: if (c >= 'A' && c <= 'Z') return 1; ! 218: ! 219: if (c == '_') return 1; ! 220: ! 221: return 0; ! 222: ! 223: } ! 224: ! 225: ! 226: ! 227: typedef struct wordtab { ! 228: ! 229: char *word; ! 230: ! 231: char *defn; ! 232: ! 233: struct wordtab *next; ! 234: ! 235: } WORDTAB; ! 236: ! 237: ! 238: ! 239: WORDTAB *globaltab; ! 240: ! 241: ! 242: ! 243: void ! 244: ! 245: do_define(word, defn) ! 246: ! 247: char *word, *defn; ! 248: ! 249: { ! 250: ! 251: WORDTAB *w; ! 252: ! 253: ! 254: ! 255: w = malloc(sizeof(WORDTAB)); ! 256: ! 257: if (!w) return; ! 258: ! 259: w->word = strdup(word); ! 260: ! 261: w->defn = strdup(defn); ! 262: ! 263: w->next = globaltab; ! 264: ! 265: globaltab = w; ! 266: ! 267: } ! 268: ! 269: ! 270: ! 271: /* ! 272: ! 273: * if we were actually using this program for ! 274: ! 275: * large things, we would use a hash table ! 276: ! 277: * to speed up the table lookup; but for the ! 278: ! 279: * uses we have, there aren't likely to be ! 280: ! 281: * many defines ! 282: ! 283: */ ! 284: ! 285: ! 286: ! 287: char * ! 288: ! 289: wordlookup(which) ! 290: ! 291: char *which; ! 292: ! 293: { ! 294: ! 295: WORDTAB *w; ! 296: ! 297: ! 298: ! 299: for (w = globaltab; w; w = w->next) { ! 300: ! 301: if (!strcmp(which, w->word)) { ! 302: ! 303: return strdup(w->defn); ! 304: ! 305: } ! 306: ! 307: } ! 308: ! 309: return strdup(which); ! 310: ! 311: } ! 312: ! 313: ! 314: ! 315: void ! 316: ! 317: do_ifdef(which) ! 318: ! 319: char *which; ! 320: ! 321: { ! 322: ! 323: int output = 0; ! 324: ! 325: WORDTAB *w; ! 326: ! 327: ! 328: ! 329: for (w = globaltab; w; w = w->next) { ! 330: ! 331: if (!strcmp(which, w->word)) { ! 332: ! 333: output = 1; ! 334: ! 335: break; ! 336: ! 337: } ! 338: ! 339: } ! 340: ! 341: if (ifstkptr < MAXNEST) { ! 342: ! 343: ifstack[ifstkptr++] = output; ! 344: ! 345: if (!output) ! 346: ! 347: hidecnt++; ! 348: ! 349: } else { ! 350: ! 351: ifstkptr++; ! 352: ! 353: yyerror("too many levels of %ifdef"); ! 354: ! 355: } ! 356: ! 357: } ! 358: ! 359: ! 360: ! 361: void ! 362: ! 363: do_ifndef(which) ! 364: ! 365: char *which; ! 366: ! 367: { ! 368: ! 369: int output = 1; ! 370: ! 371: WORDTAB *w; ! 372: ! 373: ! 374: ! 375: for (w = globaltab; w; w = w->next) { ! 376: ! 377: if (!strcmp(which, w->word)) { ! 378: ! 379: output = 0; ! 380: ! 381: break; ! 382: ! 383: } ! 384: ! 385: } ! 386: ! 387: if (ifstkptr < MAXNEST) { ! 388: ! 389: ifstack[ifstkptr++] = output; ! 390: ! 391: if (!output) ! 392: ! 393: hidecnt++; ! 394: ! 395: } else { ! 396: ! 397: ifstkptr++; ! 398: ! 399: yyerror("too many levels of %ifdef"); ! 400: ! 401: } ! 402: ! 403: } ! 404: ! 405: ! 406: ! 407: void ! 408: ! 409: do_else() ! 410: ! 411: { ! 412: ! 413: int output; ! 414: ! 415: ! 416: ! 417: if (ifstkptr == 0) { ! 418: ! 419: yyerror("%else without %ifdef"); ! 420: ! 421: } else { ! 422: ! 423: if (ifstkptr > MAXNEST) return; ! 424: ! 425: /* if we were outputting, stop */ ! 426: ! 427: /* otherwise, start again */ ! 428: ! 429: output = !ifstack[ifstkptr-1]; ! 430: ! 431: if (output) ! 432: ! 433: hidecnt--; ! 434: ! 435: else ! 436: ! 437: hidecnt++; ! 438: ! 439: ifstack[ifstkptr-1] = output; ! 440: ! 441: } ! 442: ! 443: } ! 444: ! 445: ! 446: ! 447: void ! 448: ! 449: do_endif() ! 450: ! 451: { ! 452: ! 453: int output; ! 454: ! 455: ! 456: ! 457: if (ifstkptr == 0) { ! 458: ! 459: yyerror("%endif without %ifdef"); ! 460: ! 461: } else { ! 462: ! 463: ifstkptr--; ! 464: ! 465: if (ifstkptr >= MAXNEST) return; ! 466: ! 467: ! 468: ! 469: output = ifstack[ifstkptr]; ! 470: ! 471: if (!output) ! 472: ! 473: hidecnt--; ! 474: ! 475: } ! 476: ! 477: } ! 478: ! 479: ! 480: ! 481: /* this is a terrible hack to remove the leading ! 482: ! 483: * '_' from labels... ! 484: ! 485: */ ! 486: ! 487: ! 488: ! 489: char * ! 490: ! 491: fixupword(w) ! 492: ! 493: char *w; ! 494: ! 495: { ! 496: ! 497: if (*w == '_' && syntax == PUREC) ! 498: ! 499: return strdup(w+1); ! 500: ! 501: else ! 502: ! 503: return strdup(w); ! 504: ! 505: } ! 506: ! 507: ! 508: ! 509: ! 510: ! 511: static char footext[1024]; ! 512: ! 513: ! 514: ! 515: int ! 516: ! 517: yylex() ! 518: ! 519: { ! 520: ! 521: int c; ! 522: ! 523: char *to = footext; ! 524: ! 525: int cmdword; ! 526: ! 527: static int saweoln = 1; ! 528: ! 529: ! 530: ! 531: c = getc(infile); ! 532: ! 533: ! 534: ! 535: if (c < 0) { ! 536: ! 537: doeof: ! 538: ! 539: saweoln = 1; ! 540: ! 541: return 0; ! 542: ! 543: } ! 544: ! 545: if (c == ';') { ! 546: ! 547: docomment: ! 548: ! 549: if (syntax == GAS) ! 550: ! 551: c = '|'; ! 552: ! 553: *to++ = c; ! 554: ! 555: do { ! 556: ! 557: c = getc(infile); ! 558: ! 559: if (c < 0) return 0; ! 560: ! 561: if (c != '\r') ! 562: ! 563: *to++ = c; ! 564: ! 565: } while (c != '\n'); ! 566: ! 567: *to = 0; ! 568: ! 569: yylval = strdup(footext); ! 570: ! 571: saweoln = 1; ! 572: ! 573: return EOLN; ! 574: ! 575: } ! 576: ! 577: if (c == '\n') { ! 578: ! 579: doeoln: ! 580: ! 581: *to++ = c; ! 582: ! 583: *to = 0; ! 584: ! 585: yylval = strdup(footext); ! 586: ! 587: saweoln = 1; ! 588: ! 589: return EOLN; ! 590: ! 591: } ! 592: ! 593: if (c == CMDSYM && saweoln) { ! 594: ! 595: cmdword = 1; ! 596: ! 597: c = getc(infile); ! 598: ! 599: } else { ! 600: ! 601: cmdword = 0; ! 602: ! 603: } ! 604: ! 605: ! 606: ! 607: if (c == ' ' || c == '\t' || c == '\r') { ! 608: ! 609: do { ! 610: ! 611: if (c == '\r') ! 612: ! 613: c = ' '; ! 614: ! 615: *to++ = c; ! 616: ! 617: c = getc(infile); ! 618: ! 619: } while (c == ' ' || c == '\t'); ! 620: ! 621: if (c == '\n') goto doeoln; ! 622: ! 623: if (c == ';') goto docomment; ! 624: ! 625: if (!cmdword) { ! 626: ! 627: ungetc(c, infile); ! 628: ! 629: *to = 0; ! 630: ! 631: yylval = strdup(footext); ! 632: ! 633: return WHITESP; ! 634: ! 635: } else { ! 636: ! 637: to = footext; ! 638: ! 639: } ! 640: ! 641: } ! 642: ! 643: ! 644: ! 645: saweoln = 0; ! 646: ! 647: ! 648: ! 649: if (c == QUOTESYM) { ! 650: ! 651: for(;;) { ! 652: ! 653: c = getc(infile); ! 654: ! 655: if (c < 0) goto doeof; ! 656: ! 657: if (c == QUOTESYM) break; ! 658: ! 659: *to++ = c; ! 660: ! 661: } ! 662: ! 663: *to = 0; ! 664: ! 665: yylval = strdup(footext); ! 666: ! 667: return STRING; ! 668: ! 669: } ! 670: ! 671: if (is_word_sym(c)) { ! 672: ! 673: do { ! 674: ! 675: *to++ = c; ! 676: ! 677: c = getc(infile); ! 678: ! 679: } while (is_word_sym(c)); ! 680: ! 681: ungetc(c, infile); ! 682: ! 683: *to = 0; ! 684: ! 685: if (cmdword) { ! 686: ! 687: yylval = footext; ! 688: ! 689: if (!strcmp(footext, "define")) { ! 690: ! 691: return DEFINECMD; ! 692: ! 693: } else if (!strcmp(footext, "include")) { ! 694: ! 695: return INCLUDECMD; ! 696: ! 697: } else if (!strcmp(footext, "ifdef")) { ! 698: ! 699: return IFDEFCMD; ! 700: ! 701: } else if (!strcmp(footext, "ifndef")) { ! 702: ! 703: return IFNDEFCMD; ! 704: ! 705: } else if (!strcmp(footext, "else")) { ! 706: ! 707: return ELSECMD; ! 708: ! 709: } else if (!strcmp(footext, "endif")) { ! 710: ! 711: return ENDIFCMD; ! 712: ! 713: } else { ! 714: ! 715: fprintf(stderr, "Unknown command: %s\n", footext); ! 716: ! 717: } ! 718: ! 719: } ! 720: ! 721: yylval = fixupword(footext); ! 722: ! 723: return WORD; ! 724: ! 725: } ! 726: ! 727: ! 728: ! 729: *to++ = c; ! 730: ! 731: *to = 0; ! 732: ! 733: yylval = footext; ! 734: ! 735: return c; ! 736: ! 737: } ! 738:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.