1: #ifndef lint
   2: static char sccsid[] = "@(#)ed.c	4.4 (Berkeley) 4/26/86";
   3: #endif
   4: 
   5: /*
   6:  * Editor
   7:  */
   8: 
   9: #include <signal.h>
  10: #include <sgtty.h>
  11: #undef CEOF
  12: #include <setjmp.h>
  13: #define NULL    0
  14: #define FNSIZE  64
  15: #define LBSIZE  512
  16: #define ESIZE   128
  17: #define GBSIZE  256
  18: #define NBRA    5
  19: #define EOF -1
  20: #define KSIZE   9
  21: 
  22: #define CBRA    1
  23: #define CCHR    2
  24: #define CDOT    4
  25: #define CCL 6
  26: #define NCCL    8
  27: #define CDOL    10
  28: #define CEOF    11
  29: #define CKET    12
  30: #define CBACK   14
  31: 
  32: #define STAR    01
  33: 
  34: char    Q[] = "";
  35: char    T[] = "TMP";
  36: #define READ    0
  37: #define WRITE   1
  38: 
  39: int peekc;
  40: int lastc;
  41: char    savedfile[FNSIZE];
  42: char    file[FNSIZE];
  43: char    linebuf[LBSIZE];
  44: char    rhsbuf[LBSIZE/2];
  45: char    expbuf[ESIZE+4];
  46: int circfl;
  47: int *zero;
  48: int *dot;
  49: int *dol;
  50: int *addr1;
  51: int *addr2;
  52: char    genbuf[LBSIZE];
  53: long    count;
  54: char    *nextip;
  55: char    *linebp;
  56: int ninbuf;
  57: int io;
  58: int pflag;
  59: long    lseek();
  60: int (*oldhup)();
  61: int (*oldquit)();
  62: int vflag   = 1;
  63: int xflag;
  64: int xtflag;
  65: int kflag;
  66: char    key[KSIZE + 1];
  67: char    crbuf[512];
  68: char    perm[768];
  69: char    tperm[768];
  70: int listf;
  71: int col;
  72: char    *globp;
  73: int tfile   = -1;
  74: int tline;
  75: char    *tfname;
  76: char    *loc1;
  77: char    *loc2;
  78: char    *locs;
  79: char    ibuff[512];
  80: int iblock  = -1;
  81: char    obuff[512];
  82: int oblock  = -1;
  83: int ichanged;
  84: int nleft;
  85: char    WRERR[] = "WRITE ERROR";
  86: int names[26];
  87: int anymarks;
  88: char    *braslist[NBRA];
  89: char    *braelist[NBRA];
  90: int nbra;
  91: int subnewa;
  92: int subolda;
  93: int fchange;
  94: int wrapp;
  95: unsigned nlall = 128;
  96: 
  97: int *address();
  98: char    *getline();
  99: char    *getblock();
 100: char    *place();
 101: char    *mktemp();
 102: char    *malloc();
 103: char    *realloc();
 104: jmp_buf savej;
 105: 
 106: main(argc, argv)
 107: char **argv;
 108: {
 109:     register char *p1, *p2;
 110:     extern int onintr(), quit(), onhup();
 111:     int (*oldintr)();
 112: 
 113:     oldquit = signal(SIGQUIT, SIG_IGN);
 114:     oldhup = signal(SIGHUP, SIG_IGN);
 115:     oldintr = signal(SIGINT, SIG_IGN);
 116:     if ((int)signal(SIGTERM, SIG_IGN) == 0)
 117:         signal(SIGTERM, quit);
 118:     argv++;
 119:     while (argc > 1 && **argv=='-') {
 120:         switch((*argv)[1]) {
 121: 
 122:         case '\0':
 123:             vflag = 0;
 124:             break;
 125: 
 126:         case 'q':
 127:             signal(SIGQUIT, SIG_DFL);
 128:             vflag = 1;
 129:             break;
 130: 
 131:         case 'x':
 132:             xflag = 1;
 133:             break;
 134:         }
 135:         argv++;
 136:         argc--;
 137:     }
 138:     if(xflag){
 139:         getkey();
 140:         kflag = crinit(key, perm);
 141:     }
 142: 
 143:     if (argc>1) {
 144:         p1 = *argv;
 145:         p2 = savedfile;
 146:         while (*p2++ = *p1++)
 147:             ;
 148:         globp = "r";
 149:     }
 150:     zero = (int *)malloc(nlall*sizeof(int));
 151:     tfname = mktemp("/tmp/eXXXXX");
 152:     init();
 153:     if (((int)oldintr&01) == 0)
 154:         signal(SIGINT, onintr);
 155:     if (((int)oldhup&01) == 0)
 156:         signal(SIGHUP, onhup);
 157:     setjmp(savej);
 158:     commands();
 159:     quit();
 160: }
 161: 
 162: commands()
 163: {
 164:     int getfile(), gettty();
 165:     register *a1, c;
 166: 
 167:     for (;;) {
 168:     if (pflag) {
 169:         pflag = 0;
 170:         addr1 = addr2 = dot;
 171:         goto print;
 172:     }
 173:     addr1 = 0;
 174:     addr2 = 0;
 175:     do {
 176:         addr1 = addr2;
 177:         if ((a1 = address())==0) {
 178:             c = getchr();
 179:             break;
 180:         }
 181:         addr2 = a1;
 182:         if ((c=getchr()) == ';') {
 183:             c = ',';
 184:             dot = a1;
 185:         }
 186:     } while (c==',');
 187:     if (addr1==0)
 188:         addr1 = addr2;
 189:     switch(c) {
 190: 
 191:     case 'a':
 192:         setdot();
 193:         newline();
 194:         append(gettty, addr2);
 195:         continue;
 196: 
 197:     case 'c':
 198:         delete();
 199:         append(gettty, addr1-1);
 200:         continue;
 201: 
 202:     case 'd':
 203:         delete();
 204:         continue;
 205: 
 206:     case 'E':
 207:         fchange = 0;
 208:         c = 'e';
 209:     case 'e':
 210:         setnoaddr();
 211:         if (vflag && fchange) {
 212:             fchange = 0;
 213:             error(Q);
 214:         }
 215:         filename(c);
 216:         init();
 217:         addr2 = zero;
 218:         goto caseread;
 219: 
 220:     case 'f':
 221:         setnoaddr();
 222:         filename(c);
 223:         puts(savedfile);
 224:         continue;
 225: 
 226:     case 'g':
 227:         global(1);
 228:         continue;
 229: 
 230:     case 'i':
 231:         setdot();
 232:         nonzero();
 233:         newline();
 234:         append(gettty, addr2-1);
 235:         continue;
 236: 
 237: 
 238:     case 'j':
 239:         if (addr2==0) {
 240:             addr1 = dot;
 241:             addr2 = dot+1;
 242:         }
 243:         setdot();
 244:         newline();
 245:         nonzero();
 246:         join();
 247:         continue;
 248: 
 249:     case 'k':
 250:         if ((c = getchr()) < 'a' || c > 'z')
 251:             error(Q);
 252:         newline();
 253:         setdot();
 254:         nonzero();
 255:         names[c-'a'] = *addr2 & ~01;
 256:         anymarks |= 01;
 257:         continue;
 258: 
 259:     case 'm':
 260:         move(0);
 261:         continue;
 262: 
 263:     case '\n':
 264:         if (addr2==0)
 265:             addr2 = dot+1;
 266:         addr1 = addr2;
 267:         goto print;
 268: 
 269:     case 'l':
 270:         listf++;
 271:     case 'p':
 272:     case 'P':
 273:         newline();
 274:     print:
 275:         setdot();
 276:         nonzero();
 277:         a1 = addr1;
 278:         do {
 279:             puts(getline(*a1++));
 280:         } while (a1 <= addr2);
 281:         dot = addr2;
 282:         listf = 0;
 283:         continue;
 284: 
 285:     case 'Q':
 286:         fchange = 0;
 287:     case 'q':
 288:         setnoaddr();
 289:         newline();
 290:         quit();
 291: 
 292:     case 'r':
 293:         filename(c);
 294:     caseread:
 295:         if ((io = open(file, 0)) < 0) {
 296:             lastc = '\n';
 297:             error(file);
 298:         }
 299:         setall();
 300:         ninbuf = 0;
 301:         c = zero != dol;
 302:         append(getfile, addr2);
 303:         exfile();
 304:         fchange = c;
 305:         continue;
 306: 
 307:     case 's':
 308:         setdot();
 309:         nonzero();
 310:         substitute(globp!=0);
 311:         continue;
 312: 
 313:     case 't':
 314:         move(1);
 315:         continue;
 316: 
 317:     case 'u':
 318:         setdot();
 319:         nonzero();
 320:         newline();
 321:         if ((*addr2&~01) != subnewa)
 322:             error(Q);
 323:         *addr2 = subolda;
 324:         dot = addr2;
 325:         continue;
 326: 
 327:     case 'v':
 328:         global(0);
 329:         continue;
 330: 
 331:     case 'W':
 332:         wrapp++;
 333:     case 'w':
 334:         setall();
 335:         nonzero();
 336:         filename(c);
 337:         if(!wrapp ||
 338:           ((io = open(file,1)) == -1) ||
 339:           ((lseek(io, 0L, 2)) == -1))
 340:             if ((io = creat(file, 0666)) < 0)
 341:                 error(file);
 342:         wrapp = 0;
 343:         putfile();
 344:         exfile();
 345:         if (addr1==zero+1 && addr2==dol)
 346:             fchange = 0;
 347:         continue;
 348: 
 349:     case 'x':
 350:         setnoaddr();
 351:         newline();
 352:         xflag = 1;
 353:         puts("Entering encrypting mode!");
 354:         getkey();
 355:         kflag = crinit(key, perm);
 356:         continue;
 357: 
 358: 
 359:     case '=':
 360:         setall();
 361:         newline();
 362:         count = (addr2-zero)&077777;
 363:         putd();
 364:         putchr('\n');
 365:         continue;
 366: 
 367:     case '!':
 368:         callunix();
 369:         continue;
 370: 
 371:     case EOF:
 372:         return;
 373: 
 374:     }
 375:     error(Q);
 376:     }
 377: }
 378: 
 379: int *
 380: address()
 381: {
 382:     register *a1, minus, c;
 383:     int n, relerr;
 384: 
 385:     minus = 0;
 386:     a1 = 0;
 387:     for (;;) {
 388:         c = getchr();
 389:         if ('0'<=c && c<='9') {
 390:             n = 0;
 391:             do {
 392:                 n *= 10;
 393:                 n += c - '0';
 394:             } while ((c = getchr())>='0' && c<='9');
 395:             peekc = c;
 396:             if (a1==0)
 397:                 a1 = zero;
 398:             if (minus<0)
 399:                 n = -n;
 400:             a1 += n;
 401:             minus = 0;
 402:             continue;
 403:         }
 404:         relerr = 0;
 405:         if (a1 || minus)
 406:             relerr++;
 407:         switch(c) {
 408:         case ' ':
 409:         case '\t':
 410:             continue;
 411: 
 412:         case '+':
 413:             minus++;
 414:             if (a1==0)
 415:                 a1 = dot;
 416:             continue;
 417: 
 418:         case '-':
 419:         case '^':
 420:             minus--;
 421:             if (a1==0)
 422:                 a1 = dot;
 423:             continue;
 424: 
 425:         case '?':
 426:         case '/':
 427:             compile(c);
 428:             a1 = dot;
 429:             for (;;) {
 430:                 if (c=='/') {
 431:                     a1++;
 432:                     if (a1 > dol)
 433:                         a1 = zero;
 434:                 } else {
 435:                     a1--;
 436:                     if (a1 < zero)
 437:                         a1 = dol;
 438:                 }
 439:                 if (execute(0, a1))
 440:                     break;
 441:                 if (a1==dot)
 442:                     error(Q);
 443:             }
 444:             break;
 445: 
 446:         case '$':
 447:             a1 = dol;
 448:             break;
 449: 
 450:         case '.':
 451:             a1 = dot;
 452:             break;
 453: 
 454:         case '\'':
 455:             if ((c = getchr()) < 'a' || c > 'z')
 456:                 error(Q);
 457:             for (a1=zero; a1<=dol; a1++)
 458:                 if (names[c-'a'] == (*a1 & ~01))
 459:                     break;
 460:             break;
 461: 
 462:         default:
 463:             peekc = c;
 464:             if (a1==0)
 465:                 return(0);
 466:             a1 += minus;
 467:             if (a1<zero || a1>dol)
 468:                 error(Q);
 469:             return(a1);
 470:         }
 471:         if (relerr)
 472:             error(Q);
 473:     }
 474: }
 475: 
 476: setdot()
 477: {
 478:     if (addr2 == 0)
 479:         addr1 = addr2 = dot;
 480:     if (addr1 > addr2)
 481:         error(Q);
 482: }
 483: 
 484: setall()
 485: {
 486:     if (addr2==0) {
 487:         addr1 = zero+1;
 488:         addr2 = dol;
 489:         if (dol==zero)
 490:             addr1 = zero;
 491:     }
 492:     setdot();
 493: }
 494: 
 495: setnoaddr()
 496: {
 497:     if (addr2)
 498:         error(Q);
 499: }
 500: 
 501: nonzero()
 502: {
 503:     if (addr1<=zero || addr2>dol)
 504:         error(Q);
 505: }
 506: 
 507: newline()
 508: {
 509:     register c;
 510: 
 511:     if ((c = getchr()) == '\n')
 512:         return;
 513:     if (c=='p' || c=='l') {
 514:         pflag++;
 515:         if (c=='l')
 516:             listf++;
 517:         if (getchr() == '\n')
 518:             return;
 519:     }
 520:     error(Q);
 521: }
 522: 
 523: filename(comm)
 524: {
 525:     register char *p1, *p2;
 526:     register c;
 527: 
 528:     count = 0;
 529:     c = getchr();
 530:     if (c=='\n' || c==EOF) {
 531:         p1 = savedfile;
 532:         if (*p1==0 && comm!='f')
 533:             error(Q);
 534:         p2 = file;
 535:         while (*p2++ = *p1++)
 536:             ;
 537:         return;
 538:     }
 539:     if (c!=' ')
 540:         error(Q);
 541:     while ((c = getchr()) == ' ')
 542:         ;
 543:     if (c=='\n')
 544:         error(Q);
 545:     p1 = file;
 546:     do {
 547:         *p1++ = c;
 548:         if (c==' ' || c==EOF)
 549:             error(Q);
 550:     } while ((c = getchr()) != '\n');
 551:     *p1++ = 0;
 552:     if (savedfile[0]==0 || comm=='e' || comm=='f') {
 553:         p1 = savedfile;
 554:         p2 = file;
 555:         while (*p1++ = *p2++)
 556:             ;
 557:     }
 558: }
 559: 
 560: exfile()
 561: {
 562:     close(io);
 563:     io = -1;
 564:     if (vflag) {
 565:         putd();
 566:         putchr('\n');
 567:     }
 568: }
 569: 
 570: onintr()
 571: {
 572:     signal(SIGINT, onintr);
 573:     putchr('\n');
 574:     lastc = '\n';
 575:     error(Q);
 576: }
 577: 
 578: onhup()
 579: {
 580:     signal(SIGINT, SIG_IGN);
 581:     signal(SIGHUP, SIG_IGN);
 582:     if (dol > zero) {
 583:         addr1 = zero+1;
 584:         addr2 = dol;
 585:         io = creat("ed.hup", 0666);
 586:         if (io > 0)
 587:             putfile();
 588:     }
 589:     fchange = 0;
 590:     quit();
 591: }
 592: 
 593: error(s)
 594: char *s;
 595: {
 596:     register c;
 597: 
 598:     wrapp = 0;
 599:     listf = 0;
 600:     putchr('?');
 601:     puts(s);
 602:     count = 0;
 603:     lseek(0, (long)0, 2);
 604:     pflag = 0;
 605:     if (globp)
 606:         lastc = '\n';
 607:     globp = 0;
 608:     peekc = lastc;
 609:     if(lastc)
 610:         while ((c = getchr()) != '\n' && c != EOF)
 611:             ;
 612:     if (io > 0) {
 613:         close(io);
 614:         io = -1;
 615:     }
 616:     longjmp(savej, 1);
 617: }
 618: 
 619: getchr()
 620: {
 621:     char c;
 622:     if (lastc=peekc) {
 623:         peekc = 0;
 624:         return(lastc);
 625:     }
 626:     if (globp) {
 627:         if ((lastc = *globp++) != 0)
 628:             return(lastc);
 629:         globp = 0;
 630:         return(EOF);
 631:     }
 632:     if (read(0, &c, 1) <= 0)
 633:         return(lastc = EOF);
 634:     lastc = c&0177;
 635:     return(lastc);
 636: }
 637: 
 638: gettty()
 639: {
 640:     register c;
 641:     register char *gf;
 642:     register char *p;
 643: 
 644:     p = linebuf;
 645:     gf = globp;
 646:     while ((c = getchr()) != '\n') {
 647:         if (c==EOF) {
 648:             if (gf)
 649:                 peekc = c;
 650:             return(c);
 651:         }
 652:         if ((c &= 0177) == 0)
 653:             continue;
 654:         *p++ = c;
 655:         if (p >= &linebuf[LBSIZE-2])
 656:             error(Q);
 657:     }
 658:     *p++ = 0;
 659:     if (linebuf[0]=='.' && linebuf[1]==0)
 660:         return(EOF);
 661:     return(0);
 662: }
 663: 
 664: getfile()
 665: {
 666:     register c;
 667:     register char *lp, *fp;
 668: 
 669:     lp = linebuf;
 670:     fp = nextip;
 671:     do {
 672:         if (--ninbuf < 0) {
 673:             if ((ninbuf = read(io, genbuf, LBSIZE)-1) < 0)
 674:                 return(EOF);
 675:             fp = genbuf;
 676:             while(fp < &genbuf[ninbuf]) {
 677:                 if (*fp++ & 0200) {
 678:                     if (kflag)
 679:                         crblock(perm, genbuf, ninbuf+1, count);
 680:                     break;
 681:                 }
 682:             }
 683:             fp = genbuf;
 684:         }
 685:         c = *fp++;
 686:         if (c=='\0')
 687:             continue;
 688:         if (c&0200 || lp >= &linebuf[LBSIZE]) {
 689:             lastc = '\n';
 690:             error(Q);
 691:         }
 692:         *lp++ = c;
 693:         count++;
 694:     } while (c != '\n');
 695:     *--lp = 0;
 696:     nextip = fp;
 697:     return(0);
 698: }
 699: 
 700: putfile()
 701: {
 702:     int *a1, n;
 703:     register char *fp, *lp;
 704:     register nib;
 705: 
 706:     nib = 512;
 707:     fp = genbuf;
 708:     a1 = addr1;
 709:     do {
 710:         lp = getline(*a1++);
 711:         for (;;) {
 712:             if (--nib < 0) {
 713:                 n = fp-genbuf;
 714:                 if(kflag)
 715:                     crblock(perm, genbuf, n, count-n);
 716:                 if(write(io, genbuf, n) != n) {
 717:                     puts(WRERR);
 718:                     error(Q);
 719:                 }
 720:                 nib = 511;
 721:                 fp = genbuf;
 722:             }
 723:             count++;
 724:             if ((*fp++ = *lp++) == 0) {
 725:                 fp[-1] = '\n';
 726:                 break;
 727:             }
 728:         }
 729:     } while (a1 <= addr2);
 730:     n = fp-genbuf;
 731:     if(kflag)
 732:         crblock(perm, genbuf, n, count-n);
 733:     if(write(io, genbuf, n) != n) {
 734:         puts(WRERR);
 735:         error(Q);
 736:     }
 737: }
 738: 
 739: append(f, a)
 740: int *a;
 741: int (*f)();
 742: {
 743:     register *a1, *a2, *rdot;
 744:     int nline, tl;
 745: 
 746:     nline = 0;
 747:     dot = a;
 748:     while ((*f)() == 0) {
 749:         if ((dol-zero)+1 >= nlall) {
 750:             int *ozero = zero;
 751:             nlall += 512;
 752:             if ((zero = (int *)realloc((char *)zero, nlall*sizeof(int)))==NULL) {
 753:                 lastc = '\n';
 754:                 zero = ozero;
 755:                 error("MEM?");
 756:             }
 757:             dot += zero - ozero;
 758:             dol += zero - ozero;
 759:         }
 760:         tl = putline();
 761:         nline++;
 762:         a1 = ++dol;
 763:         a2 = a1+1;
 764:         rdot = ++dot;
 765:         while (a1 > rdot)
 766:             *--a2 = *--a1;
 767:         *rdot = tl;
 768:     }
 769:     return(nline);
 770: }
 771: 
 772: callunix()
 773: {
 774:     register (*savint)(), pid, rpid;
 775:     int retcode;
 776: 
 777:     setnoaddr();
 778:     if ((pid = fork()) == 0) {
 779:         signal(SIGHUP, oldhup);
 780:         signal(SIGQUIT, oldquit);
 781:         execl("/bin/sh", "sh", "-t", 0);
 782:         exit(0100);
 783:     }
 784:     savint = signal(SIGINT, SIG_IGN);
 785:     while ((rpid = wait(&retcode)) != pid && rpid != -1)
 786:         ;
 787:     signal(SIGINT, savint);
 788:     puts("!");
 789: }
 790: 
 791: quit()
 792: {
 793:     if (vflag && fchange && dol!=zero) {
 794:         fchange = 0;
 795:         error(Q);
 796:     }
 797:     unlink(tfname);
 798:     exit(0);
 799: }
 800: 
 801: delete()
 802: {
 803:     setdot();
 804:     newline();
 805:     nonzero();
 806:     rdelete(addr1, addr2);
 807: }
 808: 
 809: rdelete(ad1, ad2)
 810: int *ad1, *ad2;
 811: {
 812:     register *a1, *a2, *a3;
 813: 
 814:     a1 = ad1;
 815:     a2 = ad2+1;
 816:     a3 = dol;
 817:     dol -= a2 - a1;
 818:     do {
 819:         *a1++ = *a2++;
 820:     } while (a2 <= a3);
 821:     a1 = ad1;
 822:     if (a1 > dol)
 823:         a1 = dol;
 824:     dot = a1;
 825:     fchange = 1;
 826: }
 827: 
 828: gdelete()
 829: {
 830:     register *a1, *a2, *a3;
 831: 
 832:     a3 = dol;
 833:     for (a1=zero+1; (*a1&01)==0; a1++)
 834:         if (a1>=a3)
 835:             return;
 836:     for (a2=a1+1; a2<=a3;) {
 837:         if (*a2&01) {
 838:             a2++;
 839:             dot = a1;
 840:         } else
 841:             *a1++ = *a2++;
 842:     }
 843:     dol = a1-1;
 844:     if (dot>dol)
 845:         dot = dol;
 846:     fchange = 1;
 847: }
 848: 
 849: char *
 850: getline(tl)
 851: {
 852:     register char *bp, *lp;
 853:     register nl;
 854: 
 855:     lp = linebuf;
 856:     bp = getblock(tl, READ);
 857:     nl = nleft;
 858:     tl &= ~0377;
 859:     while (*lp++ = *bp++)
 860:         if (--nl == 0) {
 861:             bp = getblock(tl+=0400, READ);
 862:             nl = nleft;
 863:         }
 864:     return(linebuf);
 865: }
 866: 
 867: putline()
 868: {
 869:     register char *bp, *lp;
 870:     register nl;
 871:     int tl;
 872: 
 873:     fchange = 1;
 874:     lp = linebuf;
 875:     tl = tline;
 876:     bp = getblock(tl, WRITE);
 877:     nl = nleft;
 878:     tl &= ~0377;
 879:     while (*bp = *lp++) {
 880:         if (*bp++ == '\n') {
 881:             *--bp = 0;
 882:             linebp = lp;
 883:             break;
 884:         }
 885:         if (--nl == 0) {
 886:             bp = getblock(tl+=0400, WRITE);
 887:             nl = nleft;
 888:         }
 889:     }
 890:     nl = tline;
 891:     tline += (((lp-linebuf)+03)>>1)&077776;
 892:     return(nl);
 893: }
 894: 
 895: char *
 896: getblock(atl, iof)
 897: {
 898:     extern read(), write();
 899:     register bno, off;
 900:     register char *p1, *p2;
 901:     register int n;
 902: 
 903:     bno = (atl>>8)&0377;
 904:     off = (atl<<1)&0774;
 905:     if (bno >= 255) {
 906:         lastc = '\n';
 907:         error(T);
 908:     }
 909:     nleft = 512 - off;
 910:     if (bno==iblock) {
 911:         ichanged |= iof;
 912:         return(ibuff+off);
 913:     }
 914:     if (bno==oblock)
 915:         return(obuff+off);
 916:     if (iof==READ) {
 917:         if (ichanged) {
 918:             if(xtflag)
 919:                 crblock(tperm, ibuff, 512, (long)0);
 920:             blkio(iblock, ibuff, write);
 921:         }
 922:         ichanged = 0;
 923:         iblock = bno;
 924:         blkio(bno, ibuff, read);
 925:         if(xtflag)
 926:             crblock(tperm, ibuff, 512, (long)0);
 927:         return(ibuff+off);
 928:     }
 929:     if (oblock>=0) {
 930:         if(xtflag) {
 931:             p1 = obuff;
 932:             p2 = crbuf;
 933:             n = 512;
 934:             while(n--)
 935:                 *p2++ = *p1++;
 936:             crblock(tperm, crbuf, 512, (long)0);
 937:             blkio(oblock, crbuf, write);
 938:         } else
 939:             blkio(oblock, obuff, write);
 940:     }
 941:     oblock = bno;
 942:     return(obuff+off);
 943: }
 944: 
 945: blkio(b, buf, iofcn)
 946: char *buf;
 947: int (*iofcn)();
 948: {
 949:     lseek(tfile, (long)b<<9, 0);
 950:     if ((*iofcn)(tfile, buf, 512) != 512) {
 951:         error(T);
 952:     }
 953: }
 954: 
 955: init()
 956: {
 957:     register *markp;
 958: 
 959:     close(tfile);
 960:     tline = 2;
 961:     for (markp = names; markp < &names[26]; )
 962:         *markp++ = 0;
 963:     subnewa = 0;
 964:     anymarks = 0;
 965:     iblock = -1;
 966:     oblock = -1;
 967:     ichanged = 0;
 968:     close(creat(tfname, 0600));
 969:     tfile = open(tfname, 2);
 970:     if(xflag) {
 971:         xtflag = 1;
 972:         makekey(key, tperm);
 973:     }
 974:     dot = dol = zero;
 975: }
 976: 
 977: global(k)
 978: {
 979:     register char *gp;
 980:     register c;
 981:     register int *a1;
 982:     char globuf[GBSIZE];
 983: 
 984:     if (globp)
 985:         error(Q);
 986:     setall();
 987:     nonzero();
 988:     if ((c=getchr())=='\n')
 989:         error(Q);
 990:     compile(c);
 991:     gp = globuf;
 992:     while ((c = getchr()) != '\n') {
 993:         if (c==EOF)
 994:             error(Q);
 995:         if (c=='\\') {
 996:             c = getchr();
 997:             if (c!='\n')
 998:                 *gp++ = '\\';
 999:         }
1000:         *gp++ = c;
1001:         if (gp >= &globuf[GBSIZE-2])
1002:             error(Q);
1003:     }
1004:     *gp++ = '\n';
1005:     *gp++ = 0;
1006:     for (a1=zero; a1<=dol; a1++) {
1007:         *a1 &= ~01;
1008:         if (a1>=addr1 && a1<=addr2 && execute(0, a1)==k)
1009:             *a1 |= 01;
1010:     }
1011:     /*
1012: 	 * Special case: g/.../d (avoid n^2 algorithm)
1013: 	 */
1014:     if (globuf[0]=='d' && globuf[1]=='\n' && globuf[2]=='\0') {
1015:         gdelete();
1016:         return;
1017:     }
1018:     for (a1=zero; a1<=dol; a1++) {
1019:         if (*a1 & 01) {
1020:             *a1 &= ~01;
1021:             dot = a1;
1022:             globp = globuf;
1023:             commands();
1024:             a1 = zero;
1025:         }
1026:     }
1027: }
1028: 
1029: join()
1030: {
1031:     register char *gp, *lp;
1032:     register *a1;
1033: 
1034:     gp = genbuf;
1035:     for (a1=addr1; a1<=addr2; a1++) {
1036:         lp = getline(*a1);
1037:         while (*gp = *lp++)
1038:             if (gp++ >= &genbuf[LBSIZE-2])
1039:                 error(Q);
1040:     }
1041:     lp = linebuf;
1042:     gp = genbuf;
1043:     while (*lp++ = *gp++)
1044:         ;
1045:     *addr1 = putline();
1046:     if (addr1<addr2)
1047:         rdelete(addr1+1, addr2);
1048:     dot = addr1;
1049: }
1050: 
1051: substitute(inglob)
1052: {
1053:     register *markp, *a1, nl;
1054:     int gsubf;
1055:     int getsub();
1056: 
1057:     gsubf = compsub();
1058:     for (a1 = addr1; a1 <= addr2; a1++) {
1059:         int *ozero;
1060:         if (execute(0, a1)==0)
1061:             continue;
1062:         inglob |= 01;
1063:         dosub();
1064:         if (gsubf) {
1065:             while (*loc2) {
1066:                 if (execute(1, (int *)0)==0)
1067:                     break;
1068:                 dosub();
1069:             }
1070:         }
1071:         subnewa = putline();
1072:         *a1 &= ~01;
1073:         if (anymarks) {
1074:             for (markp = names; markp < &names[26]; markp++)
1075:                 if (*markp == *a1)
1076:                     *markp = subnewa;
1077:         }
1078:         subolda = *a1;
1079:         *a1 = subnewa;
1080:         ozero = zero;
1081:         nl = append(getsub, a1);
1082:         nl += zero-ozero;
1083:         a1 += nl;
1084:         addr2 += nl;
1085:     }
1086:     if (inglob==0)
1087:         error(Q);
1088: }
1089: 
1090: compsub()
1091: {
1092:     register seof, c;
1093:     register char *p;
1094: 
1095:     if ((seof = getchr()) == '\n' || seof == ' ')
1096:         error(Q);
1097:     compile(seof);
1098:     p = rhsbuf;
1099:     for (;;) {
1100:         c = getchr();
1101:         if (c=='\\')
1102:             c = getchr() | 0200;
1103:         if (c=='\n') {
1104:             if (globp)
1105:                 c |= 0200;
1106:             else
1107:                 error(Q);
1108:         }
1109:         if (c==seof)
1110:             break;
1111:         *p++ = c;
1112:         if (p >= &rhsbuf[LBSIZE/2])
1113:             error(Q);
1114:     }
1115:     *p++ = 0;
1116:     if ((peekc = getchr()) == 'g') {
1117:         peekc = 0;
1118:         newline();
1119:         return(1);
1120:     }
1121:     newline();
1122:     return(0);
1123: }
1124: 
1125: getsub()
1126: {
1127:     register char *p1, *p2;
1128: 
1129:     p1 = linebuf;
1130:     if ((p2 = linebp) == 0)
1131:         return(EOF);
1132:     while (*p1++ = *p2++)
1133:         ;
1134:     linebp = 0;
1135:     return(0);
1136: }
1137: 
1138: dosub()
1139: {
1140:     register char *lp, *sp, *rp;
1141:     int c;
1142: 
1143:     lp = linebuf;
1144:     sp = genbuf;
1145:     rp = rhsbuf;
1146:     while (lp < loc1)
1147:         *sp++ = *lp++;
1148:     while (c = *rp++&0377) {
1149:         if (c=='&') {
1150:             sp = place(sp, loc1, loc2);
1151:             continue;
1152:         } else if (c&0200 && (c &= 0177) >='1' && c < nbra+'1') {
1153:             sp = place(sp, braslist[c-'1'], braelist[c-'1']);
1154:             continue;
1155:         }
1156:         *sp++ = c&0177;
1157:         if (sp >= &genbuf[LBSIZE])
1158:             error(Q);
1159:     }
1160:     lp = loc2;
1161:     loc2 = sp - genbuf + linebuf;
1162:     while (*sp++ = *lp++)
1163:         if (sp >= &genbuf[LBSIZE])
1164:             error(Q);
1165:     lp = linebuf;
1166:     sp = genbuf;
1167:     while (*lp++ = *sp++)
1168:         ;
1169: }
1170: 
1171: char *
1172: place(sp, l1, l2)
1173: register char *sp, *l1, *l2;
1174: {
1175: 
1176:     while (l1 < l2) {
1177:         *sp++ = *l1++;
1178:         if (sp >= &genbuf[LBSIZE])
1179:             error(Q);
1180:     }
1181:     return(sp);
1182: }
1183: 
1184: move(cflag)
1185: {
1186:     register int *adt, *ad1, *ad2;
1187:     int getcopy();
1188: 
1189:     setdot();
1190:     nonzero();
1191:     if ((adt = address())==0)
1192:         error(Q);
1193:     newline();
1194:     if (cflag) {
1195:         int *ozero, delta;
1196:         ad1 = dol;
1197:         ozero = zero;
1198:         append(getcopy, ad1++);
1199:         ad2 = dol;
1200:         delta = zero - ozero;
1201:         ad1 += delta;
1202:         adt += delta;
1203:     } else {
1204:         ad2 = addr2;
1205:         for (ad1 = addr1; ad1 <= ad2;)
1206:             *ad1++ &= ~01;
1207:         ad1 = addr1;
1208:     }
1209:     ad2++;
1210:     if (adt<ad1) {
1211:         dot = adt + (ad2-ad1);
1212:         if ((++adt)==ad1)
1213:             return;
1214:         reverse(adt, ad1);
1215:         reverse(ad1, ad2);
1216:         reverse(adt, ad2);
1217:     } else if (adt >= ad2) {
1218:         dot = adt++;
1219:         reverse(ad1, ad2);
1220:         reverse(ad2, adt);
1221:         reverse(ad1, adt);
1222:     } else
1223:         error(Q);
1224:     fchange = 1;
1225: }
1226: 
1227: reverse(a1, a2)
1228: register int *a1, *a2;
1229: {
1230:     register int t;
1231: 
1232:     for (;;) {
1233:         t = *--a2;
1234:         if (a2 <= a1)
1235:             return;
1236:         *a2 = *a1;
1237:         *a1++ = t;
1238:     }
1239: }
1240: 
1241: getcopy()
1242: {
1243:     if (addr1 > addr2)
1244:         return(EOF);
1245:     getline(*addr1++);
1246:     return(0);
1247: }
1248: 
1249: compile(aeof)
1250: {
1251:     register eof, c;
1252:     register char *ep;
1253:     char *lastep;
1254:     char bracket[NBRA], *bracketp;
1255:     int cclcnt;
1256: 
1257:     ep = expbuf;
1258:     eof = aeof;
1259:     bracketp = bracket;
1260:     if ((c = getchr()) == eof) {
1261:         if (*ep==0)
1262:             error(Q);
1263:         return;
1264:     }
1265:     circfl = 0;
1266:     nbra = 0;
1267:     if (c=='^') {
1268:         c = getchr();
1269:         circfl++;
1270:     }
1271:     peekc = c;
1272:     lastep = 0;
1273:     for (;;) {
1274:         if (ep >= &expbuf[ESIZE])
1275:             goto cerror;
1276:         c = getchr();
1277:         if (c==eof) {
1278:             if (bracketp != bracket)
1279:                 goto cerror;
1280:             *ep++ = CEOF;
1281:             return;
1282:         }
1283:         if (c!='*')
1284:             lastep = ep;
1285:         switch (c) {
1286: 
1287:         case '\\':
1288:             if ((c = getchr())=='(') {
1289:                 if (nbra >= NBRA)
1290:                     goto cerror;
1291:                 *bracketp++ = nbra;
1292:                 *ep++ = CBRA;
1293:                 *ep++ = nbra++;
1294:                 continue;
1295:             }
1296:             if (c == ')') {
1297:                 if (bracketp <= bracket)
1298:                     goto cerror;
1299:                 *ep++ = CKET;
1300:                 *ep++ = *--bracketp;
1301:                 continue;
1302:             }
1303:             if (c>='1' && c<'1'+NBRA) {
1304:                 *ep++ = CBACK;
1305:                 *ep++ = c-'1';
1306:                 continue;
1307:             }
1308:             *ep++ = CCHR;
1309:             if (c=='\n')
1310:                 goto cerror;
1311:             *ep++ = c;
1312:             continue;
1313: 
1314:         case '.':
1315:             *ep++ = CDOT;
1316:             continue;
1317: 
1318:         case '\n':
1319:             goto cerror;
1320: 
1321:         case '*':
1322:             if (lastep==0 || *lastep==CBRA || *lastep==CKET)
1323:                 goto defchar;
1324:             *lastep |= STAR;
1325:             continue;
1326: 
1327:         case '$':
1328:             if ((peekc=getchr()) != eof)
1329:                 goto defchar;
1330:             *ep++ = CDOL;
1331:             continue;
1332: 
1333:         case '[':
1334:             *ep++ = CCL;
1335:             *ep++ = 0;
1336:             cclcnt = 1;
1337:             if ((c=getchr()) == '^') {
1338:                 c = getchr();
1339:                 ep[-2] = NCCL;
1340:             }
1341:             do {
1342:                 if (c=='\n')
1343:                     goto cerror;
1344:                 if (c=='-' && ep[-1]!=0) {
1345:                     if ((c=getchr())==']') {
1346:                         *ep++ = '-';
1347:                         cclcnt++;
1348:                         break;
1349:                     }
1350:                     while (ep[-1]<c) {
1351:                         *ep = ep[-1]+1;
1352:                         ep++;
1353:                         cclcnt++;
1354:                         if (ep>=&expbuf[ESIZE])
1355:                             goto cerror;
1356:                     }
1357:                 }
1358:                 *ep++ = c;
1359:                 cclcnt++;
1360:                 if (ep >= &expbuf[ESIZE])
1361:                     goto cerror;
1362:             } while ((c = getchr()) != ']');
1363:             lastep[1] = cclcnt;
1364:             continue;
1365: 
1366:         defchar:
1367:         default:
1368:             *ep++ = CCHR;
1369:             *ep++ = c;
1370:         }
1371:     }
1372:    cerror:
1373:     expbuf[0] = 0;
1374:     nbra = 0;
1375:     error(Q);
1376: }
1377: 
1378: execute(gf, addr)
1379: int *addr;
1380: {
1381:     register char *p1, *p2, c;
1382: 
1383:     for (c=0; c<NBRA; c++) {
1384:         braslist[c] = 0;
1385:         braelist[c] = 0;
1386:     }
1387:     if (gf) {
1388:         if (circfl)
1389:             return(0);
1390:         p1 = linebuf;
1391:         p2 = genbuf;
1392:         while (*p1++ = *p2++)
1393:             ;
1394:         locs = p1 = loc2;
1395:     } else {
1396:         if (addr==zero)
1397:             return(0);
1398:         p1 = getline(*addr);
1399:         locs = 0;
1400:     }
1401:     p2 = expbuf;
1402:     if (circfl) {
1403:         loc1 = p1;
1404:         return(advance(p1, p2));
1405:     }
1406:     /* fast check for first character */
1407:     if (*p2==CCHR) {
1408:         c = p2[1];
1409:         do {
1410:             if (*p1!=c)
1411:                 continue;
1412:             if (advance(p1, p2)) {
1413:                 loc1 = p1;
1414:                 return(1);
1415:             }
1416:         } while (*p1++);
1417:         return(0);
1418:     }
1419:     /* regular algorithm */
1420:     do {
1421:         if (advance(p1, p2)) {
1422:             loc1 = p1;
1423:             return(1);
1424:         }
1425:     } while (*p1++);
1426:     return(0);
1427: }
1428: 
1429: advance(lp, ep)
1430: register char *ep, *lp;
1431: {
1432:     register char *curlp;
1433:     int i;
1434: 
1435:     for (;;) switch (*ep++) {
1436: 
1437:     case CCHR:
1438:         if (*ep++ == *lp++)
1439:             continue;
1440:         return(0);
1441: 
1442:     case CDOT:
1443:         if (*lp++)
1444:             continue;
1445:         return(0);
1446: 
1447:     case CDOL:
1448:         if (*lp==0)
1449:             continue;
1450:         return(0);
1451: 
1452:     case CEOF:
1453:         loc2 = lp;
1454:         return(1);
1455: 
1456:     case CCL:
1457:         if (cclass(ep, *lp++, 1)) {
1458:             ep += *ep;
1459:             continue;
1460:         }
1461:         return(0);
1462: 
1463:     case NCCL:
1464:         if (cclass(ep, *lp++, 0)) {
1465:             ep += *ep;
1466:             continue;
1467:         }
1468:         return(0);
1469: 
1470:     case CBRA:
1471:         braslist[*ep++] = lp;
1472:         continue;
1473: 
1474:     case CKET:
1475:         braelist[*ep++] = lp;
1476:         continue;
1477: 
1478:     case CBACK:
1479:         if (braelist[i = *ep++]==0)
1480:             error(Q);
1481:         if (backref(i, lp)) {
1482:             lp += braelist[i] - braslist[i];
1483:             continue;
1484:         }
1485:         return(0);
1486: 
1487:     case CBACK|STAR:
1488:         if (braelist[i = *ep++] == 0)
1489:             error(Q);
1490:         curlp = lp;
1491:         while (backref(i, lp))
1492:             lp += braelist[i] - braslist[i];
1493:         while (lp >= curlp) {
1494:             if (advance(lp, ep))
1495:                 return(1);
1496:             lp -= braelist[i] - braslist[i];
1497:         }
1498:         continue;
1499: 
1500:     case CDOT|STAR:
1501:         curlp = lp;
1502:         while (*lp++)
1503:             ;
1504:         goto star;
1505: 
1506:     case CCHR|STAR:
1507:         curlp = lp;
1508:         while (*lp++ == *ep)
1509:             ;
1510:         ep++;
1511:         goto star;
1512: 
1513:     case CCL|STAR:
1514:     case NCCL|STAR:
1515:         curlp = lp;
1516:         while (cclass(ep, *lp++, ep[-1]==(CCL|STAR)))
1517:             ;
1518:         ep += *ep;
1519:         goto star;
1520: 
1521:     star:
1522:         do {
1523:             lp--;
1524:             if (lp==locs)
1525:                 break;
1526:             if (advance(lp, ep))
1527:                 return(1);
1528:         } while (lp > curlp);
1529:         return(0);
1530: 
1531:     default:
1532:         error(Q);
1533:     }
1534: }
1535: 
1536: backref(i, lp)
1537: register i;
1538: register char *lp;
1539: {
1540:     register char *bp;
1541: 
1542:     bp = braslist[i];
1543:     while (*bp++ == *lp++)
1544:         if (bp >= braelist[i])
1545:             return(1);
1546:     return(0);
1547: }
1548: 
1549: cclass(set, c, af)
1550: register char *set, c;
1551: {
1552:     register n;
1553: 
1554:     if (c==0)
1555:         return(0);
1556:     n = *set++;
1557:     while (--n)
1558:         if (*set++ == c)
1559:             return(af);
1560:     return(!af);
1561: }
1562: 
1563: putd()
1564: {
1565:     register r;
1566: 
1567:     r = count%10;
1568:     count /= 10;
1569:     if (count)
1570:         putd();
1571:     putchr(r + '0');
1572: }
1573: 
1574: puts(sp)
1575: register char *sp;
1576: {
1577:     col = 0;
1578:     while (*sp)
1579:         putchr(*sp++);
1580:     putchr('\n');
1581: }
1582: 
1583: char    line[70];
1584: char    *linp   = line;
1585: 
1586: putchr(ac)
1587: {
1588:     register char *lp;
1589:     register c;
1590: 
1591:     lp = linp;
1592:     c = ac;
1593:     if (listf) {
1594:         col++;
1595:         if (col >= 72) {
1596:             col = 0;
1597:             *lp++ = '\\';
1598:             *lp++ = '\n';
1599:         }
1600:         if (c=='\t') {
1601:             c = '>';
1602:             goto esc;
1603:         }
1604:         if (c=='\b') {
1605:             c = '<';
1606:         esc:
1607:             *lp++ = '-';
1608:             *lp++ = '\b';
1609:             *lp++ = c;
1610:             goto out;
1611:         }
1612:         if (c<' ' && c!= '\n') {
1613:             *lp++ = '\\';
1614:             *lp++ = (c>>3)+'0';
1615:             *lp++ = (c&07)+'0';
1616:             col += 2;
1617:             goto out;
1618:         }
1619:     }
1620:     *lp++ = c;
1621: out:
1622:     if(c == '\n' || lp >= &line[64]) {
1623:         linp = line;
1624:         write(1, line, lp-line);
1625:         return;
1626:     }
1627:     linp = lp;
1628: }
1629: crblock(permp, buf, nchar, startn)
1630: char *permp;
1631: char *buf;
1632: long startn;
1633: {
1634:     register char *p1;
1635:     int n1;
1636:     int n2;
1637:     register char *t1, *t2, *t3;
1638: 
1639:     t1 = permp;
1640:     t2 = &permp[256];
1641:     t3 = &permp[512];
1642: 
1643:     n1 = startn&0377;
1644:     n2 = (startn>>8)&0377;
1645:     p1 = buf;
1646:     while(nchar--) {
1647:         *p1 = t2[(t3[(t1[(*p1+n1)&0377]+n2)&0377]-n2)&0377]-n1;
1648:         n1++;
1649:         if(n1==256){
1650:             n1 = 0;
1651:             n2++;
1652:             if(n2==256) n2 = 0;
1653:         }
1654:         p1++;
1655:     }
1656: }
1657: 
1658: getkey()
1659: {
1660:     struct sgttyb b;
1661:     int save;
1662:     int (*sig)();
1663:     register char *p;
1664:     register c;
1665: 
1666:     sig = signal(SIGINT, SIG_IGN);
1667:     if (gtty(0, &b) == -1)
1668:         error("Input not tty");
1669:     save = b.sg_flags;
1670:     b.sg_flags &= ~ECHO;
1671:     stty(0, &b);
1672:     puts("Key:");
1673:     p = key;
1674:     while(((c=getchr()) != EOF) && (c!='\n')) {
1675:         if(p < &key[KSIZE])
1676:             *p++ = c;
1677:     }
1678:     *p = 0;
1679:     b.sg_flags = save;
1680:     stty(0, &b);
1681:     signal(SIGINT, sig);
1682:     return(key[0] != 0);
1683: }
1684: 
1685: /*
1686:  * Besides initializing the encryption machine, this routine
1687:  * returns 0 if the key is null, and 1 if it is non-null.
1688:  */
1689: crinit(keyp, permp)
1690: char    *keyp, *permp;
1691: {
1692:     register char *t1, *t2, *t3;
1693:     register i;
1694:     int ic, k, temp, pf[2];
1695:     unsigned random;
1696:     char buf[13];
1697:     long seed;
1698: 
1699:     t1 = permp;
1700:     t2 = &permp[256];
1701:     t3 = &permp[512];
1702:     if(*keyp == 0)
1703:         return(0);
1704:     strncpy(buf, keyp, 8);
1705:     while (*keyp)
1706:         *keyp++ = '\0';
1707:     buf[8] = buf[0];
1708:     buf[9] = buf[1];
1709:     if (pipe(pf)<0)
1710:         pf[0] = pf[1] = -1;
1711:     if (fork()==0) {
1712:         close(0);
1713:         close(1);
1714:         dup(pf[0]);
1715:         dup(pf[1]);
1716:         execl("/usr/lib/makekey", "-", 0);
1717:         execl("/lib/makekey", "-", 0);
1718:         exit(1);
1719:     }
1720:     write(pf[1], buf, 10);
1721:     if (wait((int *)NULL)==-1 || read(pf[0], buf, 13)!=13)
1722:         error("crypt: cannot generate key");
1723:     close(pf[0]);
1724:     close(pf[1]);
1725:     seed = 123;
1726:     for (i=0; i<13; i++)
1727:         seed = seed*buf[i] + i;
1728:     for(i=0;i<256;i++){
1729:         t1[i] = i;
1730:         t3[i] = 0;
1731:     }
1732:     for(i=0; i<256; i++) {
1733:         seed = 5*seed + buf[i%13];
1734:         random = seed % 65521;
1735:         k = 256-1 - i;
1736:         ic = (random&0377) % (k+1);
1737:         random >>= 8;
1738:         temp = t1[k];
1739:         t1[k] = t1[ic];
1740:         t1[ic] = temp;
1741:         if(t3[k]!=0) continue;
1742:         ic = (random&0377) % k;
1743:         while(t3[ic]!=0) ic = (ic+1) % k;
1744:         t3[k] = ic;
1745:         t3[ic] = k;
1746:     }
1747:     for(i=0; i<256; i++)
1748:         t2[t1[i]&0377] = i;
1749:     return(1);
1750: }
1751: 
1752: makekey(a, b)
1753: char *a, *b;
1754: {
1755:     register int i;
1756:     long t;
1757:     char temp[KSIZE + 1];
1758: 
1759:     for(i = 0; i < KSIZE; i++)
1760:         temp[i] = *a++;
1761:     time(&t);
1762:     t += getpid();
1763:     for(i = 0; i < 4; i++)
1764:         temp[i] ^= (t>>(8*i))&0377;
1765:     crinit(temp, b);
1766: }

Defined functions

address defined in line 379; used 3 times
advance defined in line 1429; used 5 times
append defined in line 739; used 6 times
backref defined in line 1536; used 2 times
blkio defined in line 945; used 4 times
callunix defined in line 772; used 1 times
cclass defined in line 1549; used 3 times
commands defined in line 162; used 2 times
compile defined in line 1249; used 3 times
compsub defined in line 1090; used 1 times
crblock defined in line 1629; used 6 times
crinit defined in line 1689; used 3 times
delete defined in line 801; used 2 times
dosub defined in line 1138; used 2 times
error defined in line 593; used 48 times
execute defined in line 1378; used 4 times
exfile defined in line 560; used 2 times
filename defined in line 523; used 4 times
gdelete defined in line 828; used 1 times
getblock defined in line 895; used 5 times
getchr defined in line 619; used 30 times
getcopy defined in line 1241; used 2 times
getfile defined in line 664; used 2 times
getkey defined in line 1658; used 2 times
getline defined in line 849; used 6 times
getsub defined in line 1125; used 2 times
gettty defined in line 638; used 4 times
global defined in line 977; used 2 times
init defined in line 955; used 2 times
join defined in line 1029; used 1 times
main defined in line 106; never used
makekey defined in line 1752; used 1 times
move defined in line 1184; used 2 times
newline defined in line 507; used 13 times
nonzero defined in line 501; used 10 times
onhup defined in line 578; used 2 times
onintr defined in line 570; used 3 times
place defined in line 1171; used 3 times
putchr defined in line 1586; used 7 times
putd defined in line 1563; used 3 times
putfile defined in line 700; used 2 times
putline defined in line 867; used 3 times
puts defined in line 1574; used 8 times
quit defined in line 791; used 5 times
rdelete defined in line 809; used 2 times
reverse defined in line 1227; used 6 times
setall defined in line 484; used 4 times
setdot defined in line 476; used 10 times
setnoaddr defined in line 495; used 5 times
substitute defined in line 1051; used 1 times

Defined variables

Q defined in line 34; used 41 times
T defined in line 35; used 2 times
WRERR defined in line 85; used 2 times
addr1 defined in line 50; used 29 times
addr2 defined in line 51; used 40 times
anymarks defined in line 87; used 3 times
braelist defined in line 89; used 9 times
braslist defined in line 88; used 7 times
circfl defined in line 46; used 4 times
col defined in line 71; used 5 times
count defined in line 53; used 11 times
crbuf defined in line 67; used 3 times
dol defined in line 49; used 29 times
dot defined in line 48; used 25 times
expbuf defined in line 45; used 6 times
fchange defined in line 93; used 13 times
file defined in line 42; used 8 times
genbuf defined in line 52; used 23 times
globp defined in line 72; used 11 times
iblock defined in line 80; used 4 times
ibuff defined in line 79; used 6 times
ichanged defined in line 83; used 4 times
io defined in line 57; used 14 times
key defined in line 66; used 6 times
kflag defined in line 65; used 5 times
lastc defined in line 40; used 15 times
line defined in line 1583; used 5 times
linebp defined in line 55; used 3 times
linebuf defined in line 43; used 16 times
linp defined in line 1584; used 3 times
listf defined in line 70; used 5 times
loc1 defined in line 76; used 5 times
loc2 defined in line 77; used 6 times
locs defined in line 78; used 3 times
names defined in line 86; used 6 times
nbra defined in line 90; used 6 times
nextip defined in line 54; used 2 times
ninbuf defined in line 56; used 5 times
nlall defined in line 95; used 4 times
nleft defined in line 84; used 5 times
oblock defined in line 82; used 6 times
obuff defined in line 81; used 4 times
peekc defined in line 39; used 10 times
perm defined in line 68; used 5 times
pflag defined in line 58; used 4 times
rhsbuf defined in line 44; used 3 times
savedfile defined in line 41; used 5 times
savej defined in line 104; used 2 times
sccsid defined in line 2; never used
subnewa defined in line 91; used 5 times
subolda defined in line 92; used 2 times
tfile defined in line 73; used 4 times
tfname defined in line 75; used 4 times
tline defined in line 74; used 4 times
tperm defined in line 69; used 4 times
vflag defined in line 62; used 5 times
wrapp defined in line 94; used 4 times
xflag defined in line 63; used 4 times
xtflag defined in line 64; used 4 times
zero defined in line 47; used 34 times

Defined macros

CBACK defined in line 30; used 2 times
CBRA defined in line 22; used 2 times
CCHR defined in line 23; used 4 times
CCL defined in line 25; used 3 times
CDOL defined in line 27; used 1 times
CDOT defined in line 24; used 2 times
CEOF defined in line 28; used 2 times
CKET defined in line 29; used 2 times
EOF defined in line 19; used 12 times
ESIZE defined in line 16; used 4 times
FNSIZE defined in line 14; used 2 times
GBSIZE defined in line 17; used 2 times
KSIZE defined in line 20; used 4 times
LBSIZE defined in line 15; used 11 times
NBRA defined in line 18; used 6 times
NCCL defined in line 26; used 2 times
NULL defined in line 13; used 2 times
READ defined in line 36; used 3 times
STAR defined in line 32; used 2 times
WRITE defined in line 37; used 2 times
Last modified: 1986-04-26
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1294
Valid CSS Valid XHTML 1.0 Strict