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