1: /*	sed0.c	4.2	85/06/19	*/
   2: 
   3: #include <stdio.h>
   4: #include "sed.h"
   5: 
   6: struct label    *labtab = ltab;
   7: char    CGMES[] = "command garbled: %s\n";
   8: char    TMMES[] = "Too much text: %s\n";
   9: char    LTL[]   = "Label too long: %s\n";
  10: char    AD0MES[]    = "No addresses allowed: %s\n";
  11: char    AD1MES[]    = "Only one address allowed: %s\n";
  12: char    bittab[]  = {
  13:         1,
  14:         2,
  15:         4,
  16:         8,
  17:         16,
  18:         32,
  19:         64,
  20:         128
  21:     };
  22: 
  23: main(argc, argv)
  24: char    *argv[];
  25: {
  26: 
  27:     eargc = argc;
  28:     eargv = argv;
  29: 
  30:     badp = &bad;
  31:     aptr = abuf;
  32:     lab = labtab + 1;   /* 0 reserved for end-pointer */
  33:     rep = ptrspace;
  34:     rep->ad1 = respace;
  35:     lbend = &linebuf[LBSIZE];
  36:     hend = &holdsp[LBSIZE];
  37:     lcomend = &genbuf[71];
  38:     ptrend = &ptrspace[PTRSIZE];
  39:     reend = &respace[RESIZE];
  40:     labend = &labtab[LABSIZE];
  41:     lnum = 0;
  42:     pending = 0;
  43:     depth = 0;
  44:     spend = linebuf;
  45:     hspend = holdsp;
  46:     fcode[0] = stdout;
  47:     nfiles = 1;
  48: 
  49:     if(eargc == 1)
  50:         exit(0);
  51: 
  52: 
  53:     while (--eargc > 0 && (++eargv)[0][0] == '-')
  54:         switch (eargv[0][1]) {
  55: 
  56:         case 'n':
  57:             nflag++;
  58:             continue;
  59: 
  60:         case 'f':
  61:             if(eargc-- <= 0)    exit(2);
  62: 
  63:             if((fin = fopen(*++eargv, "r")) == NULL) {
  64:                 fprintf(stderr, "Cannot open pattern-file: %s\n", *eargv);
  65:                 exit(2);
  66:             }
  67: 
  68:             fcomp();
  69:             fclose(fin);
  70:             continue;
  71: 
  72:         case 'e':
  73:             eflag++;
  74:             fcomp();
  75:             eflag = 0;
  76:             continue;
  77: 
  78:         case 'g':
  79:             gflag++;
  80:             continue;
  81: 
  82:         default:
  83:             fprintf(stdout, "Unknown flag: %c\n", eargv[0][1]);
  84:             continue;
  85:         }
  86: 
  87: 
  88:     if(compfl == 0) {
  89:         eargv--;
  90:         eargc++;
  91:         eflag++;
  92:         fcomp();
  93:         eargv++;
  94:         eargc--;
  95:         eflag = 0;
  96:     }
  97: 
  98:     if(depth) {
  99:         fprintf(stderr, "Too many {'s");
 100:         exit(2);
 101:     }
 102: 
 103:     labtab->address = rep;
 104: 
 105:     dechain();
 106: 
 107: /*	abort();	/*DEBUG*/
 108: 
 109:     if(eargc <= 0)
 110:         execute((char *)NULL);
 111:     else while(--eargc >= 0) {
 112:         execute(*eargv++);
 113:     }
 114:     fclose(stdout);
 115:     exit(0);
 116: }
 117: fcomp()
 118: {
 119: 
 120:     register char   *p, *op, *tp;
 121:     char    *address();
 122:     union reptr *pt, *pt1;
 123:     int i;
 124:     struct label    *lpt;
 125: 
 126:     compfl = 1;
 127:     op = lastre;
 128: 
 129:     if(rline(linebuf) < 0)  return;
 130:     if(*linebuf == '#') {
 131:         if(linebuf[1] == 'n')
 132:             nflag = 1;
 133:     }
 134:     else {
 135:         cp = linebuf;
 136:         goto comploop;
 137:     }
 138: 
 139:     for(;;) {
 140:         if(rline(linebuf) < 0)  break;
 141: 
 142:         cp = linebuf;
 143: 
 144: comploop:
 145: /*	fprintf(stdout, "cp: %s\n", cp);	/*DEBUG*/
 146:         while(*cp == ' ' || *cp == '\t')    cp++;
 147:         if(*cp == '\0' || *cp == '#')       continue;
 148:         if(*cp == ';') {
 149:             cp++;
 150:             goto comploop;
 151:         }
 152: 
 153:         p = address(rep->ad1);
 154:         if(p == badp) {
 155:             fprintf(stderr, CGMES, linebuf);
 156:             exit(2);
 157:         }
 158: 
 159:         if(p == rep->ad1) {
 160:             if(op)
 161:                 rep->ad1 = op;
 162:             else {
 163:                 fprintf(stderr, "First RE may not be null\n");
 164:                 exit(2);
 165:             }
 166:         } else if(p == 0) {
 167:             p = rep->ad1;
 168:             rep->ad1 = 0;
 169:         } else {
 170:             op = rep->ad1;
 171:             if(*cp == ',' || *cp == ';') {
 172:                 cp++;
 173:                 if((rep->ad2 = p) > reend) {
 174:                     fprintf(stderr, TMMES, linebuf);
 175:                     exit(2);
 176:                 }
 177:                 p = address(rep->ad2);
 178:                 if(p == badp || p == 0) {
 179:                     fprintf(stderr, CGMES, linebuf);
 180:                     exit(2);
 181:                 }
 182:                 if(p == rep->ad2)
 183:                     rep->ad2 = op;
 184:                 else
 185:                     op = rep->ad2;
 186: 
 187:             } else
 188:                 rep->ad2 = 0;
 189:         }
 190: 
 191:         if(p > reend) {
 192:             fprintf(stderr, "Too much text: %s\n", linebuf);
 193:             exit(2);
 194:         }
 195: 
 196:         while(*cp == ' ' || *cp == '\t')    cp++;
 197: 
 198: swit:
 199:         switch(*cp++) {
 200: 
 201:             default:
 202:                 fprintf(stderr, "Unrecognized command: %s\n", linebuf);
 203:                 exit(2);
 204: 
 205:             case '!':
 206:                 rep->negfl = 1;
 207:                 goto swit;
 208: 
 209:             case '{':
 210:                 rep->command = BCOM;
 211:                 rep->negfl = !(rep->negfl);
 212:                 cmpend[depth++] = &rep->lb1;
 213:                 if(++rep >= ptrend) {
 214:                     fprintf(stderr, "Too many commands: %s\n", linebuf);
 215:                     exit(2);
 216:                 }
 217:                 rep->ad1 = p;
 218:                 if(*cp == '\0') continue;
 219: 
 220:                 goto comploop;
 221: 
 222:             case '}':
 223:                 if(rep->ad1) {
 224:                     fprintf(stderr, AD0MES, linebuf);
 225:                     exit(2);
 226:                 }
 227: 
 228:                 if(--depth < 0) {
 229:                     fprintf(stderr, "Too many }'s\n");
 230:                     exit(2);
 231:                 }
 232:                 *cmpend[depth] = rep;
 233: 
 234:                 rep->ad1 = p;
 235:                 continue;
 236: 
 237:             case '=':
 238:                 rep->command = EQCOM;
 239:                 if(rep->ad2) {
 240:                     fprintf(stderr, AD1MES, linebuf);
 241:                     exit(2);
 242:                 }
 243:                 break;
 244: 
 245:             case ':':
 246:                 if(rep->ad1) {
 247:                     fprintf(stderr, AD0MES, linebuf);
 248:                     exit(2);
 249:                 }
 250: 
 251:                 while(*cp++ == ' ');
 252:                 cp--;
 253: 
 254: 
 255:                 tp = lab->asc;
 256:                 while((*tp++ = *cp++))
 257:                     if(tp >= &(lab->asc[8])) {
 258:                         fprintf(stderr, LTL, linebuf);
 259:                         exit(2);
 260:                     }
 261:                 *--tp = '\0';
 262: 
 263:                 if(lpt = search(lab)) {
 264:                     if(lpt->address) {
 265:                         fprintf(stderr, "Duplicate labels: %s\n", linebuf);
 266:                         exit(2);
 267:                     }
 268:                 } else {
 269:                     lab->chain = 0;
 270:                     lpt = lab;
 271:                     if(++lab >= labend) {
 272:                         fprintf(stderr, "Too many labels: %s\n", linebuf);
 273:                         exit(2);
 274:                     }
 275:                 }
 276:                 lpt->address = rep;
 277:                 rep->ad1 = p;
 278: 
 279:                 continue;
 280: 
 281:             case 'a':
 282:                 rep->command = ACOM;
 283:                 if(rep->ad2) {
 284:                     fprintf(stderr, AD1MES, linebuf);
 285:                     exit(2);
 286:                 }
 287:                 if(*cp == '\\') cp++;
 288:                 if(*cp++ != '\n') {
 289:                     fprintf(stderr, CGMES, linebuf);
 290:                     exit(2);
 291:                 }
 292:                 rep->re1 = p;
 293:                 p = text(rep->re1);
 294:                 break;
 295:             case 'c':
 296:                 rep->command = CCOM;
 297:                 if(*cp == '\\') cp++;
 298:                 if(*cp++ != ('\n')) {
 299:                     fprintf(stderr, CGMES, linebuf);
 300:                     exit(2);
 301:                 }
 302:                 rep->re1 = p;
 303:                 p = text(rep->re1);
 304:                 break;
 305:             case 'i':
 306:                 rep->command = ICOM;
 307:                 if(rep->ad2) {
 308:                     fprintf(stderr, AD1MES, linebuf);
 309:                     exit(2);
 310:                 }
 311:                 if(*cp == '\\') cp++;
 312:                 if(*cp++ != ('\n')) {
 313:                     fprintf(stderr, CGMES, linebuf);
 314:                     exit(2);
 315:                 }
 316:                 rep->re1 = p;
 317:                 p = text(rep->re1);
 318:                 break;
 319: 
 320:             case 'g':
 321:                 rep->command = GCOM;
 322:                 break;
 323: 
 324:             case 'G':
 325:                 rep->command = CGCOM;
 326:                 break;
 327: 
 328:             case 'h':
 329:                 rep->command = HCOM;
 330:                 break;
 331: 
 332:             case 'H':
 333:                 rep->command = CHCOM;
 334:                 break;
 335: 
 336:             case 't':
 337:                 rep->command = TCOM;
 338:                 goto jtcommon;
 339: 
 340:             case 'b':
 341:                 rep->command = BCOM;
 342: jtcommon:
 343:                 while(*cp++ == ' ');
 344:                 cp--;
 345: 
 346:                 if(*cp == '\0') {
 347:                     if(pt = labtab->chain) {
 348:                         while(pt1 = pt->lb1)
 349:                             pt = pt1;
 350:                         pt->lb1 = rep;
 351:                     } else
 352:                         labtab->chain = rep;
 353:                     break;
 354:                 }
 355:                 tp = lab->asc;
 356:                 while((*tp++ = *cp++))
 357:                     if(tp >= &(lab->asc[8])) {
 358:                         fprintf(stderr, LTL, linebuf);
 359:                         exit(2);
 360:                     }
 361:                 cp--;
 362:                 *--tp = '\0';
 363: 
 364:                 if(lpt = search(lab)) {
 365:                     if(lpt->address) {
 366:                         rep->lb1 = lpt->address;
 367:                     } else {
 368:                         pt = lpt->chain;
 369:                         while(pt1 = pt->lb1)
 370:                             pt = pt1;
 371:                         pt->lb1 = rep;
 372:                     }
 373:                 } else {
 374:                     lab->chain = rep;
 375:                     lab->address = 0;
 376:                     if(++lab >= labend) {
 377:                         fprintf(stderr, "Too many labels: %s\n", linebuf);
 378:                         exit(2);
 379:                     }
 380:                 }
 381:                 break;
 382: 
 383:             case 'n':
 384:                 rep->command = NCOM;
 385:                 break;
 386: 
 387:             case 'N':
 388:                 rep->command = CNCOM;
 389:                 break;
 390: 
 391:             case 'p':
 392:                 rep->command = PCOM;
 393:                 break;
 394: 
 395:             case 'P':
 396:                 rep->command = CPCOM;
 397:                 break;
 398: 
 399:             case 'r':
 400:                 rep->command = RCOM;
 401:                 if(rep->ad2) {
 402:                     fprintf(stderr, AD1MES, linebuf);
 403:                     exit(2);
 404:                 }
 405:                 if(*cp++ != ' ') {
 406:                     fprintf(stderr, CGMES, linebuf);
 407:                     exit(2);
 408:                 }
 409:                 rep->re1 = p;
 410:                 p = text(rep->re1);
 411:                 break;
 412: 
 413:             case 'd':
 414:                 rep->command = DCOM;
 415:                 break;
 416: 
 417:             case 'D':
 418:                 rep->command = CDCOM;
 419:                 rep->lb1 = ptrspace;
 420:                 break;
 421: 
 422:             case 'q':
 423:                 rep->command = QCOM;
 424:                 if(rep->ad2) {
 425:                     fprintf(stderr, AD1MES, linebuf);
 426:                     exit(2);
 427:                 }
 428:                 break;
 429: 
 430:             case 'l':
 431:                 rep->command = LCOM;
 432:                 break;
 433: 
 434:             case 's':
 435:                 rep->command = SCOM;
 436:                 seof = *cp++;
 437:                 rep->re1 = p;
 438:                 p = compile(rep->re1);
 439:                 if(p == badp) {
 440:                     fprintf(stderr, CGMES, linebuf);
 441:                     exit(2);
 442:                 }
 443:                 if(p == rep->re1) {
 444:                     if(op)
 445:                         rep->re1 = op;
 446:                     else {
 447:                         fprintf(stderr,
 448:                         "First RE may not be null\n");
 449:                         exit(2);
 450:                     }
 451:                 } else {
 452:                     op = rep->re1;
 453:                 }
 454: 
 455:                 if((rep->rhs = p) > reend) {
 456:                     fprintf(stderr, TMMES, linebuf);
 457:                     exit(2);
 458:                 }
 459: 
 460:                 if((p = compsub(rep->rhs)) == badp) {
 461:                     fprintf(stderr, CGMES, linebuf);
 462:                     exit(2);
 463:                 }
 464:                 if(*cp == 'g') {
 465:                     cp++;
 466:                     rep->gfl++;
 467:                 } else if(gflag)
 468:                     rep->gfl++;
 469: 
 470:                 if(*cp == 'p') {
 471:                     cp++;
 472:                     rep->pfl = 1;
 473:                 }
 474: 
 475:                 if(*cp == 'P') {
 476:                     cp++;
 477:                     rep->pfl = 2;
 478:                 }
 479: 
 480:                 if(*cp == 'w') {
 481:                     cp++;
 482:                     if(*cp++ !=  ' ') {
 483:                         fprintf(stderr, CGMES, linebuf);
 484:                         exit(2);
 485:                     }
 486:                     if(nfiles >= 10) {
 487:                         fprintf(stderr, "Too many files in w commands\n");
 488:                         exit(2);
 489:                     }
 490: 
 491:                     text(fname[nfiles]);
 492:                     for(i = nfiles - 1; i >= 0; i--)
 493:                         if(cmp(fname[nfiles],fname[i]) == 0) {
 494:                             rep->fcode = fcode[i];
 495:                             goto done;
 496:                         }
 497:                     if((rep->fcode = fopen(fname[nfiles], "w")) == NULL) {
 498:                         fprintf(stderr, "cannot open %s\n", fname[nfiles]);
 499:                         exit(2);
 500:                     }
 501:                     fcode[nfiles++] = rep->fcode;
 502:                 }
 503:                 break;
 504: 
 505:             case 'w':
 506:                 rep->command = WCOM;
 507:                 if(*cp++ != ' ') {
 508:                     fprintf(stderr, CGMES, linebuf);
 509:                     exit(2);
 510:                 }
 511:                 if(nfiles >= 10){
 512:                     fprintf(stderr, "Too many files in w commands\n");
 513:                     exit(2);
 514:                 }
 515: 
 516:                 text(fname[nfiles]);
 517:                 for(i = nfiles - 1; i >= 0; i--)
 518:                     if(cmp(fname[nfiles], fname[i]) == 0) {
 519:                         rep->fcode = fcode[i];
 520:                         goto done;
 521:                     }
 522: 
 523:                 if((rep->fcode = fopen(fname[nfiles], "w")) == NULL) {
 524:                     fprintf(stderr, "Cannot create %s\n", fname[nfiles]);
 525:                     exit(2);
 526:                 }
 527:                 fcode[nfiles++] = rep->fcode;
 528:                 break;
 529: 
 530:             case 'x':
 531:                 rep->command = XCOM;
 532:                 break;
 533: 
 534:             case 'y':
 535:                 rep->command = YCOM;
 536:                 seof = *cp++;
 537:                 rep->re1 = p;
 538:                 p = ycomp(rep->re1);
 539:                 if(p == badp) {
 540:                     fprintf(stderr, CGMES, linebuf);
 541:                     exit(2);
 542:                 }
 543:                 if(p > reend) {
 544:                     fprintf(stderr, TMMES, linebuf);
 545:                     exit(2);
 546:                 }
 547:                 break;
 548: 
 549:         }
 550: done:
 551:         if(++rep >= ptrend) {
 552:             fprintf(stderr, "Too many commands, last: %s\n", linebuf);
 553:             exit(2);
 554:         }
 555: 
 556:         rep->ad1 = p;
 557: 
 558:         if(*cp++ != '\0') {
 559:             if(cp[-1] == ';')
 560:                 goto comploop;
 561:             fprintf(stderr, CGMES, linebuf);
 562:             exit(2);
 563:         }
 564: 
 565:     }
 566:     rep->command = 0;
 567:     lastre = op;
 568: }
 569: char    *compsub(rhsbuf)
 570: char    *rhsbuf;
 571: {
 572:     register char   *p, *q;
 573: 
 574:     p = rhsbuf;
 575:     q = cp;
 576:     for(;;) {
 577:         if((*p = *q++) == '\\') {
 578:             *p = *q++;
 579:             if(*p > numbra + '0' && *p <= '9')
 580:                 return(badp);
 581:             *p++ |= 0200;
 582:             continue;
 583:         }
 584:         if(*p == seof) {
 585:             *p++ = '\0';
 586:             cp = q;
 587:             return(p);
 588:         }
 589:         if(*p++ == '\0') {
 590:             return(badp);
 591:         }
 592: 
 593:     }
 594: }
 595: 
 596: char *compile(expbuf)
 597: char    *expbuf;
 598: {
 599:     register c;
 600:     register char *ep, *sp;
 601:     char    neg;
 602:     char *lastep, *cstart;
 603:     int cclcnt;
 604:     int closed;
 605:     char    bracket[NBRA], *bracketp;
 606: 
 607:     if(*cp == seof) {
 608:         cp++;
 609:         return(expbuf);
 610:     }
 611: 
 612:     ep = expbuf;
 613:     lastep = 0;
 614:     bracketp = bracket;
 615:     closed = numbra = 0;
 616:     sp = cp;
 617:     if (*sp == '^') {
 618:         *ep++ = 1;
 619:         sp++;
 620:     } else {
 621:         *ep++ = 0;
 622:     }
 623:     for (;;) {
 624:         if (ep >= &expbuf[ESIZE]) {
 625:             cp = sp;
 626:             return(badp);
 627:         }
 628:         if((c = *sp++) == seof) {
 629:             if(bracketp != bracket) {
 630:                 cp = sp;
 631:                 return(badp);
 632:             }
 633:             cp = sp;
 634:             *ep++ = CEOF;
 635:             return(ep);
 636:         }
 637:         if(c != '*')
 638:             lastep = ep;
 639:         switch (c) {
 640: 
 641:         case '\\':
 642:             if((c = *sp++) == '(') {
 643:                 if(numbra >= NBRA) {
 644:                     cp = sp;
 645:                     return(badp);
 646:                 }
 647:                 *bracketp++ = numbra;
 648:                 *ep++ = CBRA;
 649:                 *ep++ = numbra++;
 650:                 continue;
 651:             }
 652:             if(c == ')') {
 653:                 if(bracketp <= bracket) {
 654:                     cp = sp;
 655:                     return(badp);
 656:                 }
 657:                 *ep++ = CKET;
 658:                 *ep++ = *--bracketp;
 659:                 closed++;
 660:                 continue;
 661:             }
 662: 
 663:             if(c >= '1' && c <= '9') {
 664:                 if((c -= '1') >= closed)
 665:                     return(badp);
 666: 
 667:                 *ep++ = CBACK;
 668:                 *ep++ = c;
 669:                 continue;
 670:             }
 671:             if(c == '\n') {
 672:                 cp = sp;
 673:                 return(badp);
 674:             }
 675:             if(c == 'n') {
 676:                 c = '\n';
 677:             }
 678:             goto defchar;
 679: 
 680:         case '\0':
 681:             continue;
 682:         case '\n':
 683:             cp = sp;
 684:             return(badp);
 685: 
 686:         case '.':
 687:             *ep++ = CDOT;
 688:             continue;
 689: 
 690:         case '*':
 691:             if (lastep == 0)
 692:                 goto defchar;
 693:             if(*lastep == CKET) {
 694:                 cp = sp;
 695:                 return(badp);
 696:             }
 697:             *lastep |= STAR;
 698:             continue;
 699: 
 700:         case '$':
 701:             if (*sp != seof)
 702:                 goto defchar;
 703:             *ep++ = CDOL;
 704:             continue;
 705: 
 706:         case '[':
 707:             if(&ep[17] >= &expbuf[ESIZE]) {
 708:                 fprintf(stderr, "RE too long: %s\n", linebuf);
 709:                 exit(2);
 710:             }
 711: 
 712:             *ep++ = CCL;
 713: 
 714:             neg = 0;
 715:             if((c = *sp++) == '^') {
 716:                 neg = 1;
 717:                 c = *sp++;
 718:             }
 719: 
 720:             cstart = sp;
 721:             do {
 722:                 if(c == '\0') {
 723:                     fprintf(stderr, CGMES, linebuf);
 724:                     exit(2);
 725:                 }
 726:                 if (c=='-' && sp>cstart && *sp!=']') {
 727:                     for (c = sp[-2]; c<*sp; c++)
 728:                         ep[c>>3] |= bittab[c&07];
 729:                 }
 730:                 if(c == '\\') {
 731:                     switch(c = *sp++) {
 732:                         case 'n':
 733:                             c = '\n';
 734:                             break;
 735:                     }
 736:                 }
 737: 
 738:                 ep[c >> 3] |= bittab[c & 07];
 739:             } while((c = *sp++) != ']');
 740: 
 741:             if(neg)
 742:                 for(cclcnt = 0; cclcnt < 16; cclcnt++)
 743:                     ep[cclcnt] ^= -1;
 744:             ep[0] &= 0376;
 745: 
 746:             ep += 16;
 747: 
 748:             continue;
 749: 
 750:         defchar:
 751:         default:
 752:             *ep++ = CCHR;
 753:             *ep++ = c;
 754:         }
 755:     }
 756: }
 757: rline(lbuf)
 758: char    *lbuf;
 759: {
 760:     register char   *p, *q;
 761:     register    t;
 762:     static char *saveq;
 763: 
 764:     p = lbuf - 1;
 765: 
 766:     if(eflag) {
 767:         if(eflag > 0) {
 768:             eflag = -1;
 769:             if(eargc-- <= 0)
 770:                 exit(2);
 771:             q = *++eargv;
 772:             while(*++p = *q++) {
 773:                 if(*p == '\\') {
 774:                     if((*++p = *q++) == '\0') {
 775:                         saveq = 0;
 776:                         return(-1);
 777:                     } else
 778:                         continue;
 779:                 }
 780:                 if(*p == '\n') {
 781:                     *p = '\0';
 782:                     saveq = q;
 783:                     return(1);
 784:                 }
 785:             }
 786:             saveq = 0;
 787:             return(1);
 788:         }
 789:         if((q = saveq) == 0)    return(-1);
 790: 
 791:         while(*++p = *q++) {
 792:             if(*p == '\\') {
 793:                 if((*++p = *q++) == '0') {
 794:                     saveq = 0;
 795:                     return(-1);
 796:                 } else
 797:                     continue;
 798:             }
 799:             if(*p == '\n') {
 800:                 *p = '\0';
 801:                 saveq = q;
 802:                 return(1);
 803:             }
 804:         }
 805:         saveq = 0;
 806:         return(1);
 807:     }
 808: 
 809:     while((t = getc(fin)) != EOF) {
 810:         *++p = t;
 811:         if(*p == '\\') {
 812:             t = getc(fin);
 813:             *++p = t;
 814:         }
 815:         else if(*p == '\n') {
 816:             *p = '\0';
 817:             return(1);
 818:         }
 819:     }
 820:     *++p = '\0';
 821:     return(-1);
 822: }
 823: 
 824: char    *address(expbuf)
 825: char    *expbuf;
 826: {
 827:     register char   *rcp;
 828:     long    lno;
 829: 
 830:     if(*cp == '$') {
 831:         cp++;
 832:         *expbuf++ = CEND;
 833:         *expbuf++ = CEOF;
 834:         return(expbuf);
 835:     }
 836: 
 837:     if(*cp == '/') {
 838:         seof = '/';
 839:         cp++;
 840:         return(compile(expbuf));
 841:     }
 842: 
 843:     rcp = cp;
 844:     lno = 0;
 845: 
 846:     while(*rcp >= '0' && *rcp <= '9')
 847:         lno = lno*10 + *rcp++ - '0';
 848: 
 849:     if(rcp > cp) {
 850:         *expbuf++ = CLNUM;
 851:         *expbuf++ = nlno;
 852:         tlno[nlno++] = lno;
 853:         if(nlno >= NLINES) {
 854:             fprintf(stderr, "Too many line numbers\n");
 855:             exit(2);
 856:         }
 857:         *expbuf++ = CEOF;
 858:         cp = rcp;
 859:         return(expbuf);
 860:     }
 861:     return(0);
 862: }
 863: cmp(a, b)
 864: char    *a,*b;
 865: {
 866:     register char   *ra, *rb;
 867: 
 868:     ra = a - 1;
 869:     rb = b - 1;
 870: 
 871:     while(*++ra == *++rb)
 872:         if(*ra == '\0') return(0);
 873:     return(1);
 874: }
 875: 
 876: char    *text(textbuf)
 877: char    *textbuf;
 878: {
 879:     register char   *p, *q;
 880: 
 881:     p = textbuf;
 882:     q = cp;
 883:     while(*q == '\t' || *q == ' ')  q++;
 884:     for(;;) {
 885: 
 886:         if((*p = *q++) == '\\')
 887:             *p = *q++;
 888:         if(*p == '\0') {
 889:             cp = --q;
 890:             return(++p);
 891:         }
 892:         if(*p == '\n') {
 893:             while(*q == '\t' || *q == ' ')  q++;
 894:         }
 895:         p++;
 896:     }
 897: }
 898: 
 899: 
 900: struct label    *search(ptr)
 901: struct label    *ptr;
 902: {
 903:     struct label    *rp;
 904: 
 905:     rp = labtab;
 906:     while(rp < ptr) {
 907:         if(cmp(rp->asc, ptr->asc) == 0)
 908:             return(rp);
 909:         rp++;
 910:     }
 911: 
 912:     return(0);
 913: }
 914: 
 915: 
 916: dechain()
 917: {
 918:     struct label    *lptr;
 919:     union reptr *rptr, *trptr;
 920: 
 921:     for(lptr = labtab; lptr < lab; lptr++) {
 922: 
 923:         if(lptr->address == 0) {
 924:             fprintf(stderr, "Undefined label: %s\n", lptr->asc);
 925:             exit(2);
 926:         }
 927: 
 928:         if(lptr->chain) {
 929:             rptr = lptr->chain;
 930:             while(trptr = rptr->lb1) {
 931:                 rptr->lb1 = lptr->address;
 932:                 rptr = trptr;
 933:             }
 934:             rptr->lb1 = lptr->address;
 935:         }
 936:     }
 937: }
 938: 
 939: char *ycomp(expbuf)
 940: char    *expbuf;
 941: {
 942:     register char   c, *ep, *tsp;
 943:     char    *sp;
 944: 
 945:     ep = expbuf;
 946:     sp = cp;
 947:     for(tsp = cp; *tsp != seof; tsp++) {
 948:         if(*tsp == '\\')
 949:             tsp++;
 950:         if(*tsp == '\n')
 951:             return(badp);
 952:     }
 953:     tsp++;
 954: 
 955:     while((c = *sp++ & 0177) != seof) {
 956:         if(c == '\\' && *sp == 'n') {
 957:             sp++;
 958:             c = '\n';
 959:         }
 960:         if((ep[c] = *tsp++) == '\\' && *tsp == 'n') {
 961:             ep[c] = '\n';
 962:             tsp++;
 963:         }
 964:         if(ep[c] == seof || ep[c] == '\0')
 965:             return(badp);
 966:     }
 967:     if(*tsp != seof)
 968:         return(badp);
 969:     cp = ++tsp;
 970: 
 971:     for(c = 0; !(c & 0200); c++)
 972:         if(ep[c] == 0)
 973:             ep[c] = c;
 974: 
 975:     return(ep + 0200);
 976: }

Defined functions

address defined in line 824; used 13 times
cmp defined in line 863; used 3 times
compile defined in line 596; used 3 times
compsub defined in line 569; used 2 times
dechain defined in line 916; used 1 times
fcomp defined in line 117; used 3 times
main defined in line 23; never used
rline defined in line 757; used 2 times
search defined in line 900; used 3 times
text defined in line 876; used 7 times
ycomp defined in line 939; used 2 times

Defined variables

AD0MES defined in line 10; used 2 times
AD1MES defined in line 11; used 5 times
CGMES defined in line 7; used 13 times
LTL defined in line 9; used 2 times
TMMES defined in line 8; used 3 times
bittab defined in line 12; used 6 times
labtab defined in line 6; used 7 times
Last modified: 1985-06-19
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 2837
Valid CSS Valid XHTML 1.0 Strict