Annotation of researchv8dc/cmd/ed/ed.i, revision 1.1.1.1

1.1       root        1: 
                      2: 
                      3: 
                      4: 
                      5: 
                      6: 
                      7: 
                      8: 
                      9: 
                     10: 
                     11: 
                     12: 
                     13: 
                     14: 
                     15: 
                     16: 
                     17: 
                     18: 
                     19: 
                     20: 
                     21: 
                     22: 
                     23: 
                     24: 
                     25: 
                     26: 
                     27: 
                     28: 
                     29: 
                     30: 
                     31: 
                     32: 
                     33: 
                     34: 
                     35: 
                     36: 
                     37: 
                     38: 
                     39: 
                     40: 
                     41: 
                     42: 
                     43: 
                     44: typedef int    (*SIG_TYP)();
                     45: SIG_TYP signal();
                     46: 
                     47: 
                     48: 
                     49: 
                     50: 
                     51: 
                     52: 
                     53: 
                     54: 
                     55: 
                     56: 
                     57: 
                     58: 
                     59: 
                     60: 
                     61: 
                     62: 
                     63: 
                     64: 
                     65: 
                     66: 
                     67: 
                     68: 
                     69: 
                     70: 
                     71: 
                     72: 
                     73: 
                     74: 
                     75: 
                     76: 
                     77: 
                     78: 
                     79: 
                     80: 
                     81: 
                     82: 
                     83: 
                     84: 
                     85: 
                     86: typedef        unsigned char   u_char;
                     87: typedef        unsigned short  u_short;
                     88: typedef        unsigned int    u_int;
                     89: typedef        unsigned long   u_long;
                     90: 
                     91: 
                     92: 
                     93: typedef        struct  _physadr { int r[1]; } *physadr;
                     94: typedef        long    daddr_t;
                     95: typedef        char *  caddr_t;
                     96: typedef        u_short ino_t;
                     97: typedef        long    swblk_t;
                     98: typedef        long    size_t;
                     99: typedef        long    time_t;
                    100: typedef        long    label_t[14];
                    101: typedef        short   dev_t;
                    102: typedef        long    off_t;
                    103: typedef long   portid_t;
                    104: 
                    105: 
                    106: 
                    107: 
                    108: 
                    109: 
                    110: 
                    111: 
                    112: 
                    113: 
                    114: 
                    115: 
                    116: 
                    117: 
                    118: 
                    119: 
                    120: 
                    121: 
                    122: 
                    123: 
                    124: 
                    125: 
                    126: 
                    127: 
                    128: 
                    129: 
                    130: 
                    131: 
                    132: 
                    133: 
                    134: 
                    135: 
                    136: 
                    137: 
                    138: 
                    139: 
                    140: 
                    141: 
                    142: 
                    143: 
                    144: 
                    145: 
                    146: 
                    147: 
                    148: 
                    149: 
                    150: 
                    151: 
                    152: 
                    153: 
                    154: 
                    155: 
                    156: 
                    157: 
                    158: 
                    159: 
                    160: 
                    161: 
                    162: 
                    163: 
                    164: 
                    165: 
                    166: 
                    167: 
                    168: 
                    169: 
                    170: 
                    171: 
                    172: 
                    173: 
                    174: 
                    175: 
                    176: 
                    177: 
                    178: 
                    179: 
                    180: 
                    181: 
                    182: 
                    183: 
                    184: 
                    185: 
                    186: 
                    187: 
                    188: 
                    189: 
                    190: 
                    191: 
                    192: 
                    193: 
                    194: 
                    195: 
                    196: 
                    197: 
                    198: 
                    199: 
                    200: 
                    201: 
                    202: 
                    203: 
                    204: 
                    205: 
                    206: 
                    207: 
                    208: 
                    209: 
                    210: 
                    211: 
                    212: 
                    213: 
                    214: 
                    215: 
                    216: 
                    217: 
                    218: 
                    219: 
                    220: 
                    221: 
                    222: 
                    223: 
                    224: 
                    225: 
                    226: 
                    227: 
                    228: 
                    229: 
                    230: 
                    231: 
                    232: 
                    233: 
                    234: 
                    235: 
                    236: 
                    237: 
                    238: 
                    239: 
                    240: 
                    241: 
                    242: 
                    243: 
                    244: 
                    245: 
                    246: 
                    247: 
                    248: 
                    249: 
                    250: 
                    251: 
                    252: 
                    253: 
                    254: 
                    255: 
                    256: 
                    257: 
                    258: 
                    259: 
                    260: 
                    261: 
                    262: 
                    263: 
                    264: 
                    265: 
                    266: 
                    267: 
                    268: 
                    269: 
                    270: 
                    271: 
                    272: 
                    273: 
                    274: 
                    275: 
                    276: 
                    277: 
                    278: 
                    279: 
                    280: 
                    281: 
                    282: 
                    283: 
                    284: 
                    285: 
                    286: 
                    287: 
                    288: 
                    289: typedef struct fd_set { unsigned long fds_bits[        (128            +       sizeof(int)     *       8               -1)/(   sizeof(int)     *       8               )]; } fd_set;
                    290: 
                    291: 
                    292: 
                    293: 
                    294: 
                    295: 
                    296: 
                    297: 
                    298: 
                    299: 
                    300: 
                    301: 
                    302: 
                    303: struct sgttyb {
                    304:        char    sg_ispeed;              
                    305:        char    sg_ospeed;              
                    306:        char    sg_erase;               
                    307:        char    sg_kill;                
                    308:        short   sg_flags;               
                    309: };
                    310: 
                    311: 
                    312: 
                    313: 
                    314: struct tchars {
                    315:        char    t_intrc;        
                    316:        char    t_quitc;        
                    317:        char    t_startc;       
                    318:        char    t_stopc;        
                    319:        char    t_eofc;         
                    320:        char    t_brkc;         
                    321: };
                    322: 
                    323: 
                    324: 
                    325: 
                    326: struct insld {
                    327:        short   ld;
                    328:        short   level;
                    329: };
                    330: 
                    331: 
                    332: 
                    333: 
                    334: struct passfd {
                    335:        union  {
                    336:                struct  file *fp;
                    337:                int     fd;
                    338:        } f;
                    339:        short   uid;
                    340:        short   gid;
                    341:        short   nice;
                    342:        short   fill;
                    343: };
                    344: 
                    345: 
                    346: 
                    347: 
                    348: 
                    349: 
                    350: 
                    351: 
                    352: 
                    353: 
                    354: 
                    355: 
                    356: 
                    357: 
                    358: 
                    359: 
                    360: 
                    361: 
                    362: 
                    363: 
                    364: 
                    365: 
                    366: 
                    367: 
                    368: 
                    369: 
                    370: 
                    371: 
                    372: 
                    373: 
                    374: 
                    375: 
                    376: 
                    377: 
                    378: 
                    379: 
                    380: 
                    381: 
                    382: 
                    383: 
                    384: 
                    385: 
                    386: 
                    387: 
                    388: 
                    389: 
                    390: 
                    391: 
                    392: 
                    393: 
                    394: 
                    395: 
                    396: 
                    397: 
                    398: 
                    399: 
                    400: 
                    401: 
                    402: 
                    403: 
                    404: 
                    405: 
                    406: 
                    407: 
                    408: 
                    409: 
                    410: 
                    411: 
                    412: 
                    413: 
                    414: 
                    415: 
                    416: 
                    417: 
                    418: 
                    419: 
                    420: 
                    421: 
                    422: 
                    423: 
                    424: 
                    425: 
                    426: 
                    427: 
                    428: 
                    429: 
                    430: 
                    431: 
                    432: 
                    433: 
                    434: 
                    435: 
                    436: 
                    437: 
                    438: 
                    439: 
                    440: 
                    441: 
                    442: 
                    443: 
                    444: 
                    445: 
                    446: 
                    447: 
                    448: 
                    449: 
                    450: 
                    451: 
                    452: 
                    453: 
                    454: 
                    455: 
                    456: 
                    457: 
                    458: 
                    459: 
                    460: 
                    461: 
                    462: 
                    463: 
                    464: 
                    465: struct ltchars {
                    466:        char    t_suspc;        
                    467:        char    t_dsuspc;       
                    468:        char    t_rprntc;       
                    469:        char    t_flushc;       
                    470:        char    t_werasc;       
                    471:        char    t_lnextc;       
                    472: };
                    473: 
                    474: 
                    475: 
                    476: 
                    477: 
                    478: struct luchars {
                    479:        char    t_undoc;        
                    480:        char    t_urotc;        
                    481: };
                    482: 
                    483: 
                    484: 
                    485: 
                    486: 
                    487: 
                    488: 
                    489: 
                    490: 
                    491: 
                    492: 
                    493: 
                    494: 
                    495: 
                    496: 
                    497: 
                    498: 
                    499: 
                    500: 
                    501: 
                    502: 
                    503: 
                    504: 
                    505: 
                    506: 
                    507: 
                    508: 
                    509: 
                    510: 
                    511: 
                    512: 
                    513: 
                    514: 
                    515: 
                    516: 
                    517: 
                    518: 
                    519: 
                    520: 
                    521: 
                    522: 
                    523: 
                    524: 
                    525: 
                    526: 
                    527: 
                    528: 
                    529: 
                    530: 
                    531: 
                    532: 
                    533: 
                    534: 
                    535: 
                    536: 
                    537: 
                    538: 
                    539: 
                    540: 
                    541: 
                    542: 
                    543: 
                    544: 
                    545: 
                    546: 
                    547: 
                    548: 
                    549: 
                    550: 
                    551: 
                    552: 
                    553: 
                    554: 
                    555: 
                    556: 
                    557: 
                    558: 
                    559: 
                    560: 
                    561: 
                    562: 
                    563: 
                    564: 
                    565: 
                    566: 
                    567: 
                    568: 
                    569: 
                    570: 
                    571: 
                    572: 
                    573: 
                    574: 
                    575: 
                    576: 
                    577: 
                    578: 
                    579: 
                    580: 
                    581: 
                    582: 
                    583: 
                    584: 
                    585: 
                    586: 
                    587: 
                    588: 
                    589: 
                    590: 
                    591: 
                    592: 
                    593: 
                    594: 
                    595: 
                    596: 
                    597: 
                    598: 
                    599: 
                    600: 
                    601: 
                    602: 
                    603: 
                    604: 
                    605: 
                    606: 
                    607: 
                    608: 
                    609: 
                    610: 
                    611: 
                    612: 
                    613: 
                    614: 
                    615: 
                    616: 
                    617: 
                    618: 
                    619: 
                    620: 
                    621: 
                    622: 
                    623: 
                    624: 
                    625: 
                    626: 
                    627: 
                    628: 
                    629: 
                    630: typedef int jmp_buf[10];
                    631: 
                    632: 
                    633: 
                    634: 
                    635: 
                    636: 
                    637: 
                    638: 
                    639: 
                    640: 
                    641: 
                    642: 
                    643: 
                    644: 
                    645: 
                    646: 
                    647: 
                    648: 
                    649: 
                    650: 
                    651: 
                    652: char   Q[]     = "";
                    653: char   T[]     = "TMP";
                    654: 
                    655: 
                    656: 
                    657: int    peekc;
                    658: int    lastc;
                    659: char   savedfile[128];
                    660: char   file[128];
                    661: char   linebuf[512];
                    662: char   rhsbuf[512/2];
                    663: char   expbuf[256+4];
                    664: int    circfl;
                    665: int    *zero;
                    666: int    *dot;
                    667: int    *dol;
                    668: int    given;
                    669: int    *addr1;
                    670: int    *addr2;
                    671: char   genbuf[512];
                    672: long   count;
                    673: char   *nextip;
                    674: char   *linebp;
                    675: int    ninbuf;
                    676: int    io;
                    677: int    pflag;
                    678: long   lseek();
                    679: int    (*oldhup)();
                    680: int    (*oldquit)();
                    681: int    vflag   = 1;
                    682: int    xflag;
                    683: int    xtflag;
                    684: int    kflag;
                    685: int    oflag;
                    686: char   key[9 + 1];
                    687: char   crbuf[512];
                    688: char   perm[768];
                    689: char   tperm[768];
                    690: int    listf;
                    691: int    listn;
                    692: int    col;
                    693: char   *globp;
                    694: int    tfile   = -1;
                    695: int    tline;
                    696: char   *tfname;
                    697: char   *loc1;
                    698: char   *loc2;
                    699: char   *locs;
                    700: char   ibuff[512];
                    701: int    iblock  = -1;
                    702: char   obuff[512];
                    703: int    oblock  = -1;
                    704: int    ichanged;
                    705: int    nleft;
                    706: char   WRERR[] = "WRITE ERROR";
                    707: int    names[26];
                    708: int    anymarks;
                    709: char   *braslist[5];
                    710: char   *braelist[5];
                    711: int    nbra;
                    712: int    subnewa;
                    713: int    subolda;
                    714: int    fchange;
                    715: int    wrapp;
                    716: int    bpagesize = 20;
                    717: unsigned nlall = 128;
                    718: 
                    719: int    *address();
                    720: char   *getline();
                    721: char   *getblock();
                    722: char   *place();
                    723: char   *mktemp();
                    724: char   *malloc();
                    725: char   *realloc();
                    726: jmp_buf        savej;
                    727: 
                    728: main(argc, argv)
                    729: char **argv;
                    730: {
                    731:        register char *p1, *p2;
                    732:        extern int onintr(), quit(), onhup();
                    733:        int (*oldintr)();
                    734: 
                    735:        oldquit = signal(3      ,       (int (*)())1);
                    736:        oldhup = signal(1       ,       (int (*)())1);
                    737:        oldintr = signal(2      ,       (int (*)())1);
                    738:        if ((int)signal(15      ,       (int (*)())1) == 0)
                    739:                signal(15       , quit);
                    740:        argv++;
                    741:        while (argc > 1 && **argv=='-') {
                    742:                switch((*argv)[1]) {
                    743: 
                    744:                case '\0':
                    745:                        vflag = 0;
                    746:                        break;
                    747: 
                    748:                case 'q':
                    749:                        signal(3        ,       (int (*)())0);
                    750:                        vflag = 1;
                    751:                        break;
                    752: 
                    753:                case 'X':
                    754:                        xflag = 1;
                    755:                        break;
                    756: 
                    757:                case 'o':
                    758:                        oflag = 1;
                    759:                        vflag = 0;
                    760:                        break;
                    761:                }
                    762:                argv++;
                    763:                argc--;
                    764:        }
                    765:        if(xflag){
                    766:                getkey();
                    767:                kflag = crinit(key, perm);
                    768:        }
                    769: 
                    770:        if (oflag) {
                    771:                p1 = "/dev/stdout";
                    772:                p2 = savedfile;
                    773:                while (*p2++ = *p1++)
                    774:                        ;
                    775:                globp = "a";
                    776:        } else if (argc>1) {
                    777:                p1 = *argv;
                    778:                p2 = savedfile;
                    779:                while (*p2++ = *p1++)
                    780:                        if (p2 >= &savedfile[sizeof(savedfile)])
                    781:                                p2--;
                    782:                globp = "r";
                    783:        }
                    784:        zero = (int *)malloc(nlall*sizeof(int));
                    785:        tfname = mktemp("/tmp/eXXXXX");
                    786:        init();
                    787:        if (((int)oldintr&01) == 0)
                    788:                signal(2        , onintr);
                    789:        if (((int)oldhup&01) == 0)
                    790:                signal(1        , onhup);
                    791:        setjmp(savej);
                    792:        commands();
                    793:        quit();
                    794: }
                    795: 
                    796: commands()
                    797: {
                    798:        int getfile(), gettty();
                    799:        register *a1, c;
                    800:        register int temp;
                    801:        char lastsep;
                    802: 
                    803:        for (;;) {
                    804:        if (pflag) {
                    805:                pflag = 0;
                    806:                addr1 = addr2 = dot;
                    807:                print();
                    808:        }
                    809:        c = '\n';
                    810:        for (addr1 = 0;;) {
                    811:                lastsep = c;
                    812:                a1 = address();
                    813:                c = getchr();
                    814:                if (c!=',' && c!=';')
                    815:                        break;
                    816:                if (lastsep==',')
                    817:                        error(Q);
                    818:                if (a1==0) {
                    819:                        a1 = zero+1;
                    820:                        if (a1>dol)
                    821:                                a1--;
                    822:                }
                    823:                addr1 = a1;
                    824:                if (c==';')
                    825:                        dot = a1;
                    826:        }
                    827:        if (lastsep!='\n' && a1==0)
                    828:                a1 = dol;
                    829:        if ((addr2=a1)==0) {
                    830:                given = 0;
                    831:                addr2 = dot;    
                    832:        }
                    833:        else
                    834:                given = 1;
                    835:        if (addr1==0)
                    836:                addr1 = addr2;
                    837:        switch(c) {
                    838: 
                    839:        case 'a':
                    840:                add(0);
                    841:                continue;
                    842: 
                    843:        case 'b':
                    844:                nonzero();
                    845:                browse();
                    846:                continue;
                    847: 
                    848:        case 'c':
                    849:                nonzero();
                    850:                newline();
                    851:                rdelete(addr1, addr2);
                    852:                append(gettty, addr1-1);
                    853:                continue;
                    854: 
                    855:        case 'd':
                    856:                nonzero();
                    857:                newline();
                    858:                rdelete(addr1, addr2);
                    859:                continue;
                    860: 
                    861:        case 'E':
                    862:                fchange = 0;
                    863:                c = 'e';
                    864:        case 'e':
                    865:                setnoaddr();
                    866:                if (vflag && fchange) {
                    867:                        fchange = 0;
                    868:                        error(Q);
                    869:                }
                    870:                filename(c);
                    871:                init();
                    872:                addr2 = zero;
                    873:                goto caseread;
                    874: 
                    875:        case 'f':
                    876:                setnoaddr();
                    877:                filename(c);
                    878:                puts(savedfile);
                    879:                continue;
                    880: 
                    881:        case 'g':
                    882:                global(1);
                    883:                continue;
                    884: 
                    885:        case 'i':
                    886:                add(-1);
                    887:                continue;
                    888: 
                    889: 
                    890:        case 'j':
                    891:                if (!given)
                    892:                        addr2++;
                    893:                newline();
                    894:                join();
                    895:                continue;
                    896: 
                    897:        case 'k':
                    898:                nonzero();
                    899:                if ((c = getchr()) < 'a' || c > 'z')
                    900:                        error(Q);
                    901:                newline();
                    902:                names[c-'a'] = *addr2 & ~01;
                    903:                anymarks |= 01;
                    904:                continue;
                    905: 
                    906:        case 'm':
                    907:                move(0);
                    908:                continue;
                    909: 
                    910:        case 'n':
                    911:                listn++;
                    912:                newline();
                    913:                print();
                    914:                continue;
                    915: 
                    916:        case '\n':
                    917:                if (a1==0) {
                    918:                        a1 = dot+1;
                    919:                        addr2 = a1;
                    920:                        addr1 = a1;
                    921:                }
                    922:                if (lastsep==';')
                    923:                        addr1 = a1;
                    924:                print();
                    925:                continue;
                    926: 
                    927:        case 'l':
                    928:                listf++;
                    929:        case 'p':
                    930:        case 'P':
                    931:                newline();
                    932:                print();
                    933:                continue;
                    934: 
                    935:        case 'Q':
                    936:                fchange = 0;
                    937:        case 'q':
                    938:                setnoaddr();
                    939:                newline();
                    940:                quit();
                    941: 
                    942:        case 'r':
                    943:                filename(c);
                    944:        caseread:
                    945:                if ((io = open(file, 0)) < 0) {
                    946:                        lastc = '\n';
                    947:                        error(file);
                    948:                }
                    949:                setwide();
                    950:                squeeze(0);
                    951:                ninbuf = 0;
                    952:                c = zero != dol;
                    953:                append(getfile, addr2);
                    954:                exfile();
                    955:                fchange = c;
                    956:                continue;
                    957: 
                    958:        case 's':
                    959:                nonzero();
                    960:                substitute(globp!=0);
                    961:                continue;
                    962: 
                    963:        case 't':
                    964:                move(1);
                    965:                continue;
                    966: 
                    967:        case 'u':
                    968:                nonzero();
                    969:                newline();
                    970:                if ((*addr2&~01) != subnewa)
                    971:                        error(Q);
                    972:                *addr2 = subolda;
                    973:                dot = addr2;
                    974:                continue;
                    975: 
                    976:        case 'v':
                    977:                global(0);
                    978:                continue;
                    979: 
                    980:        case 'W':
                    981:                wrapp++;
                    982:        case 'w':
                    983:                setwide();
                    984:                squeeze(dol>zero);
                    985:                if ((temp = getchr()) != 'q' && temp != 'Q') {
                    986:                        peekc = temp;
                    987:                        temp = 0;
                    988:                }
                    989:                filename(c);
                    990:                if(!wrapp ||
                    991:                  ((io = open(file,1)) == -1) ||
                    992:                  ((lseek(io, 0L, 2)) == -1))
                    993:                        if ((io = creat(file, 0666)) < 0)
                    994:                                error(file);
                    995:                wrapp = 0;
                    996:                if (dol > zero)
                    997:                        putfile();
                    998:                exfile();
                    999:                if (addr1<=zero+1 && addr2==dol)
                   1000:                        fchange = 0;
                   1001:                if (temp == 'Q')
                   1002:                        fchange = 0;
                   1003:                if (temp)
                   1004:                        quit();
                   1005:                continue;
                   1006: 
                   1007:        case 'X':
                   1008:                setnoaddr();
                   1009:                newline();
                   1010:                xflag = 1;
                   1011:                puts("Entering encrypting mode!");
                   1012:                getkey();
                   1013:                kflag = crinit(key, perm);
                   1014:                continue;
                   1015: 
                   1016: 
                   1017:        case '=':
                   1018:                setwide();
                   1019:                squeeze(0);
                   1020:                newline();
                   1021:                count = addr2 - zero;
                   1022:                putd();
                   1023:                putchr('\n');
                   1024:                continue;
                   1025: 
                   1026:        case '!':
                   1027:                callunix();
                   1028:                continue;
                   1029: 
                   1030:        case -1:
                   1031:                return;
                   1032: 
                   1033:        }
                   1034:        error(Q);
                   1035:        }
                   1036: }
                   1037: 
                   1038: print(){
                   1039:        register int *a1;
                   1040:        nonzero();
                   1041:        a1 = addr1;
                   1042:        do {
                   1043:                if (listn) {
                   1044:                        count = a1-zero;
                   1045:                        putd();
                   1046:                        putchr('\t');
                   1047:                }
                   1048:                puts(getline(*a1++));
                   1049:        } while (a1 <= addr2);
                   1050:        dot = addr2;
                   1051:        listf = 0;
                   1052:        listn = 0;
                   1053:        pflag = 0;
                   1054: }
                   1055: 
                   1056: int *
                   1057: address()
                   1058: {
                   1059:        register int sign, *a;
                   1060:        int opcnt, nextopand, *b;
                   1061:        register int c;
                   1062: 
                   1063:        nextopand = -1;
                   1064:        sign = 1;
                   1065:        opcnt = 0;
                   1066:        a = dot;
                   1067:        do {
                   1068:                do c = getchr(); while (c==' ' || c=='\t');
                   1069:                if ('0'<=c && c<='9') {
                   1070:                        peekc = c;
                   1071:                        if (!opcnt)
                   1072:                                a = zero;
                   1073:                        a += sign*getnum();
                   1074:                } else switch (c) {
                   1075:                case '$':
                   1076:                        a = dol;
                   1077:                        
                   1078:                case '.':
                   1079:                        if (opcnt)
                   1080:                                error(Q);
                   1081:                        break;
                   1082:                case '\'':
                   1083:                        c = getchr();
                   1084:                        if (opcnt || c<'a' || 'z'<c)
                   1085:                                error(Q);
                   1086:                        a = zero;
                   1087:                        do a++; while (a<=dol && names[c-'a']!=(*a&~01));
                   1088:                        break;
                   1089:                case '?':
                   1090:                        sign = -sign;
                   1091:                        
                   1092:                case '/':
                   1093:                        compile(c);
                   1094:                        b = a;
                   1095:                        for (;;) {
                   1096:                                a += sign;
                   1097:                                if (a<zero)
                   1098:                                        a = dol;
                   1099:                                if (a>dol)
                   1100:                                        a = zero;
                   1101:                                if (execute(a))
                   1102:                                        break;
                   1103:                                if (a==b)
                   1104:                                        error(Q);
                   1105:                        }
                   1106:                        break;
                   1107:                default:
                   1108:                        if (nextopand == opcnt) {
                   1109:                                a += sign;
                   1110:                                if (a<zero || dol<a)
                   1111:                                        continue;       
                   1112:                        }
                   1113:                        if (c!='+' && c!='-' && c!='^') {
                   1114:                                peekc = c;
                   1115:                                if (opcnt==0)
                   1116:                                        a = 0;
                   1117:                                return (a);
                   1118:                        }
                   1119:                        sign = 1;
                   1120:                        if (c!='+')
                   1121:                                sign = -sign;
                   1122:                        nextopand = ++opcnt;
                   1123:                        continue;
                   1124:                }
                   1125:                sign = 1;
                   1126:                opcnt++;
                   1127:        } while (zero<=a && a<=dol);
                   1128:        error(Q);
                   1129:        
                   1130: }
                   1131: int getnum()
                   1132: {
                   1133:        register int r, c;
                   1134: 
                   1135:        r = 0;
                   1136:        while ((c=getchr())>='0' && c<='9')
                   1137:                r = r*10 + c - '0';
                   1138:        peekc = c;
                   1139:        return (r);
                   1140: }
                   1141: 
                   1142: setwide()
                   1143: {
                   1144:        if (!given) {
                   1145:                addr1 = zero + (dol>zero);
                   1146:                addr2 = dol;
                   1147:        }
                   1148: }
                   1149: 
                   1150: setnoaddr()
                   1151: {
                   1152:        if (given)
                   1153:                error(Q);
                   1154: }
                   1155: 
                   1156: nonzero()
                   1157: {
                   1158:        squeeze(1);
                   1159: }
                   1160: 
                   1161: squeeze(i)
                   1162: int i;
                   1163: {
                   1164:        if (addr1<zero+i || addr2>dol || addr1>addr2)
                   1165:                error(Q);
                   1166: }
                   1167: 
                   1168: newline()
                   1169: {
                   1170:        register c;
                   1171: 
                   1172:        if ((c = getchr()) == '\n' || c == -1)
                   1173:                return;
                   1174:        if (c=='p' || c=='l' || c=='n') {
                   1175:                pflag++;
                   1176:                if (c=='l')
                   1177:                        listf++;
                   1178:                else if (c=='n')
                   1179:                        listn++;
                   1180:                if ((c=getchr())=='\n')
                   1181:                        return;
                   1182:        }
                   1183:        error(Q);
                   1184: }
                   1185: 
                   1186: filename(comm)
                   1187: {
                   1188:        register char *p1, *p2;
                   1189:        register c;
                   1190: 
                   1191:        count = 0;
                   1192:        c = getchr();
                   1193:        if (c=='\n' || c==-1) {
                   1194:                p1 = savedfile;
                   1195:                if (*p1==0 && comm!='f')
                   1196:                        error(Q);
                   1197:                p2 = file;
                   1198:                while (*p2++ = *p1++)
                   1199:                        ;
                   1200:                return;
                   1201:        }
                   1202:        if (c!=' ')
                   1203:                error(Q);
                   1204:        while ((c = getchr()) == ' ')
                   1205:                ;
                   1206:        if (c=='\n')
                   1207:                error(Q);
                   1208:        p1 = file;
                   1209:        do {
                   1210:                if (p1 >= &file[sizeof(file)-1] || c==' ' || c==-1)
                   1211:                        error(Q);
                   1212:                *p1++ = c;
                   1213:        } while ((c = getchr()) != '\n');
                   1214:        *p1++ = 0;
                   1215:        if (savedfile[0]==0 || comm=='e' || comm=='f') {
                   1216:                p1 = savedfile;
                   1217:                p2 = file;
                   1218:                while (*p1++ = *p2++)
                   1219:                        ;
                   1220:        }
                   1221: }
                   1222: 
                   1223: exfile()
                   1224: {
                   1225:        close(io);
                   1226:        io = -1;
                   1227:        if (vflag) {
                   1228:                putd();
                   1229:                putchr('\n');
                   1230:        }
                   1231: }
                   1232: 
                   1233: onintr()
                   1234: {
                   1235:        signal(2        , onintr);
                   1236:        putchr('\n');
                   1237:        lastc = '\n';
                   1238:        error(Q);
                   1239: }
                   1240: 
                   1241: onhup()
                   1242: {
                   1243:        signal(2        ,       (int (*)())1);
                   1244:        signal(1        ,       (int (*)())1);
                   1245:        if (dol > zero) {
                   1246:                addr1 = zero+1;
                   1247:                addr2 = dol;
                   1248:                io = creat("ed.hup", 0666);
                   1249:                if (io > 0)
                   1250:                        putfile();
                   1251:        }
                   1252:        fchange = 0;
                   1253:        quit();
                   1254: }
                   1255: 
                   1256: error(s)
                   1257: char *s;
                   1258: {
                   1259:        register c;
                   1260: 
                   1261:        wrapp = 0;
                   1262:        listf = 0;
                   1263:        listn = 0;
                   1264:        putchr('?');
                   1265:        puts(s);
                   1266:        count = 0;
                   1267:        lseek(0, (long)0, 2);
                   1268:        pflag = 0;
                   1269:        if (globp)
                   1270:                lastc = '\n';
                   1271:        globp = 0;
                   1272:        peekc = lastc;
                   1273:        if(lastc)
                   1274:                while ((c = getchr()) != '\n' && c != -1)
                   1275:                        ;
                   1276:        if (io > 0) {
                   1277:                close(io);
                   1278:                io = -1;
                   1279:        }
                   1280:        longjmp(savej, 1);
                   1281: }
                   1282: 
                   1283: getchr()
                   1284: {
                   1285:        char c;
                   1286:        if (lastc=peekc) {
                   1287:                peekc = 0;
                   1288:                return(lastc);
                   1289:        }
                   1290:        if (globp) {
                   1291:                if ((lastc = *globp++) != 0)
                   1292:                        return(lastc);
                   1293:                globp = 0;
                   1294:                return(-1);
                   1295:        }
                   1296:        if (read(0, &c, 1) <= 0)
                   1297:                return(lastc = -1);
                   1298:        lastc = c&0177;
                   1299:        return(lastc);
                   1300: }
                   1301: 
                   1302: gettty()
                   1303: {
                   1304:        register int rc;
                   1305: 
                   1306:        if (rc = gety())
                   1307:                return(rc);
                   1308:        if (linebuf[0]=='.' && linebuf[1]==0)
                   1309:                return(-1);
                   1310:        return(0);
                   1311: }
                   1312: 
                   1313: gety()
                   1314: {
                   1315:        register int c;
                   1316:        register char *gf;
                   1317:        register char *p;
                   1318: 
                   1319:        p = linebuf;
                   1320:        gf = globp;
                   1321:        while ((c = getchr()) != '\n') {
                   1322:                if (c==-1) {
                   1323:                        if (gf)
                   1324:                                peekc = c;
                   1325:                        return(c);
                   1326:                }
                   1327:                if ((c &= 0177) == 0)
                   1328:                        continue;
                   1329:                *p++ = c;
                   1330:                if (p >= &linebuf[512-2])
                   1331:                        error(Q);
                   1332:        }
                   1333: 
                   1334:        *p++ = 0;
                   1335:        return(0);
                   1336: }
                   1337: 
                   1338: getfile()
                   1339: {
                   1340:        register c;
                   1341:        register char *lp, *fp;
                   1342: 
                   1343:        lp = linebuf;
                   1344:        fp = nextip;
                   1345:        do {
                   1346:                if (--ninbuf < 0) {
                   1347:                        if ((ninbuf = read(io, genbuf, 512)-1) < 0)
                   1348:                                if (lp>linebuf) {
                   1349:                                        puts("'\\n' appended");
                   1350:                                        *genbuf = '\n';
                   1351:                                }
                   1352:                                else return(-1);
                   1353:                        fp = genbuf;
                   1354:                        while(fp < &genbuf[ninbuf]) {
                   1355:                                if (*fp++ & 0200) {
                   1356:                                        if (kflag)
                   1357:                                                crblock(perm, genbuf, ninbuf+1, count);
                   1358:                                        break;
                   1359:                                }
                   1360:                        }
                   1361:                        fp = genbuf;
                   1362:                }
                   1363:                c = *fp++;
                   1364:                if (c=='\0')
                   1365:                        continue;
                   1366:                if (c&0200 || lp >= &linebuf[512]) {
                   1367:                        lastc = '\n';
                   1368:                        error(Q);
                   1369:                }
                   1370:                *lp++ = c;
                   1371:                count++;
                   1372:        } while (c != '\n');
                   1373:        *--lp = 0;
                   1374:        nextip = fp;
                   1375:        return(0);
                   1376: }
                   1377: 
                   1378: putfile()
                   1379: {
                   1380:        int *a1, n;
                   1381:        register char *fp, *lp;
                   1382:        register nib;
                   1383: 
                   1384:        nib = 512;
                   1385:        fp = genbuf;
                   1386:        a1 = addr1;
                   1387:        do {
                   1388:                lp = getline(*a1++);
                   1389:                for (;;) {
                   1390:                        if (--nib < 0) {
                   1391:                                n = fp-genbuf;
                   1392:                                if(kflag)
                   1393:                                        crblock(perm, genbuf, n, count-n);
                   1394:                                if(write(io, genbuf, n) != n) {
                   1395:                                        puts(WRERR);
                   1396:                                        error(Q);
                   1397:                                }
                   1398:                                nib = 511;
                   1399:                                fp = genbuf;
                   1400:                        }
                   1401:                        count++;
                   1402:                        if ((*fp++ = *lp++) == 0) {
                   1403:                                fp[-1] = '\n';
                   1404:                                break;
                   1405:                        }
                   1406:                }
                   1407:        } while (a1 <= addr2);
                   1408:        n = fp-genbuf;
                   1409:        if(kflag)
                   1410:                crblock(perm, genbuf, n, count-n);
                   1411:        if(write(io, genbuf, n) != n) {
                   1412:                puts(WRERR);
                   1413:                error(Q);
                   1414:        }
                   1415: }
                   1416: 
                   1417: append(f, a)
                   1418: int *a;
                   1419: int (*f)();
                   1420: {
                   1421:        register *a1, *a2, *rdot;
                   1422:        int nline, tl;
                   1423: 
                   1424:        nline = 0;
                   1425:        dot = a;
                   1426:        while ((*f)() == 0) {
                   1427:                if ((dol-zero)+1 >= nlall) {
                   1428:                        int *ozero = zero;
                   1429:                        nlall += 512;
                   1430:                        if ((zero = (int *)realloc((char *)zero, nlall*sizeof(int)))==0) {
                   1431:                                error("MEM?");
                   1432:                                onhup();
                   1433:                        }
                   1434:                        dot += zero - ozero;
                   1435:                        dol += zero - ozero;
                   1436:                }
                   1437:                tl = putline();
                   1438:                nline++;
                   1439:                a1 = ++dol;
                   1440:                a2 = a1+1;
                   1441:                rdot = ++dot;
                   1442:                while (a1 > rdot)
                   1443:                        *--a2 = *--a1;
                   1444:                *rdot = tl;
                   1445:        }
                   1446:        return(nline);
                   1447: }
                   1448: 
                   1449: add(i)
                   1450: int i;
                   1451: {
                   1452:        if (i && (given || dol>zero)) {
                   1453:                addr1--;
                   1454:                addr2--;
                   1455:        }
                   1456:        squeeze(0);
                   1457:        newline();
                   1458:        append(gettty, addr2);
                   1459: }
                   1460: 
                   1461: browse()
                   1462: {
                   1463:        register forward, n;
                   1464:        static bformat; 
                   1465:        static bnum; 
                   1466:        forward=1;
                   1467:        if((peekc=getchr())!='\n'){
                   1468:                if (peekc=='-' || peekc=='+') {
                   1469:                        if(peekc=='-')
                   1470:                                forward=0;
                   1471:                        getchr();
                   1472:                }
                   1473:                if((n=getnum())>0)
                   1474:                        bpagesize=n;
                   1475:        }
                   1476:        newline();
                   1477:        if (pflag) {
                   1478:                bformat=listf;
                   1479:                bnum=listn;
                   1480:        } else {
                   1481:                listf=bformat;
                   1482:                listn=bnum;
                   1483:        }
                   1484:        if (forward) {
                   1485:                addr1=addr2;
                   1486:                if((addr2+=bpagesize)>dol)
                   1487:                        addr2=dol;
                   1488:        } else {
                   1489:                if((addr1=addr2-bpagesize)<=zero)
                   1490:                        addr1=zero+1;
                   1491:        }
                   1492:        print();
                   1493: }
                   1494: 
                   1495: callunix()
                   1496: {
                   1497:        register (*savint)(), pid, rpid;
                   1498:        int retcode;
                   1499: 
                   1500:        setnoaddr();
                   1501:        if ((pid = fork()) == 0) {
                   1502:                signal(1        , oldhup);
                   1503:                signal(3        , oldquit);
                   1504:                execl("/bin/sh", "sh", "-t", 0);
                   1505:                exit(0100);
                   1506:        }
                   1507:        savint = signal(2       ,       (int (*)())1);
                   1508:        while ((rpid = wait(&retcode)) != pid && rpid != -1)
                   1509:                ;
                   1510:        signal(2        , savint);
                   1511:        if (vflag) {
                   1512:                puts("!");
                   1513:        }
                   1514: }
                   1515: 
                   1516: quit()
                   1517: {
                   1518:        if (vflag && fchange && dol!=zero) {
                   1519:                fchange = 0;
                   1520:                error(Q);
                   1521:        }
                   1522:        unlink(tfname);
                   1523:        exit(0);
                   1524: }
                   1525: 
                   1526: rdelete(ad1, ad2)
                   1527: int *ad1, *ad2;
                   1528: {
                   1529:        register *a1, *a2, *a3;
                   1530: 
                   1531:        a1 = ad1;
                   1532:        a2 = ad2+1;
                   1533:        a3 = dol;
                   1534:        dol -= a2 - a1;
                   1535:        do {
                   1536:                *a1++ = *a2++;
                   1537:        } while (a2 <= a3);
                   1538:        a1 = ad1;
                   1539:        if (a1 > dol)
                   1540:                a1 = dol;
                   1541:        dot = a1;
                   1542:        fchange = 1;
                   1543: }
                   1544: 
                   1545: gdelete()
                   1546: {
                   1547:        register *a1, *a2, *a3;
                   1548: 
                   1549:        a3 = dol;
                   1550:        for (a1=zero; (*a1&01)==0; a1++)
                   1551:                if (a1>=a3)
                   1552:                        return;
                   1553:        for (a2=a1+1; a2<=a3;) {
                   1554:                if (*a2&01) {
                   1555:                        a2++;
                   1556:                        dot = a1;
                   1557:                } else
                   1558:                        *a1++ = *a2++;
                   1559:        }
                   1560:        dol = a1-1;
                   1561:        if (dot>dol)
                   1562:                dot = dol;
                   1563:        fchange = 1;
                   1564: }
                   1565: 
                   1566: char *
                   1567: getline(tl)
                   1568: {
                   1569:        register char *bp, *lp;
                   1570:        register nl;
                   1571: 
                   1572:        lp = linebuf;
                   1573:        bp = getblock(tl, 0);
                   1574:        nl = nleft;
                   1575:        tl &= ~0377;
                   1576:        while (*lp++ = *bp++)
                   1577:                if (--nl == 0) {
                   1578:                        bp = getblock(tl+=0400, 0);
                   1579:                        nl = nleft;
                   1580:                }
                   1581:        return(linebuf);
                   1582: }
                   1583: 
                   1584: putline()
                   1585: {
                   1586:        register char *bp, *lp;
                   1587:        register nl;
                   1588:        int tl;
                   1589: 
                   1590:        fchange = 1;
                   1591:        lp = linebuf;
                   1592:        tl = tline;
                   1593:        bp = getblock(tl, 1);
                   1594:        nl = nleft;
                   1595:        tl &= ~0377;
                   1596:        while (*bp = *lp++) {
                   1597:                if (*bp++ == '\n') {
                   1598:                        *--bp = 0;
                   1599:                        linebp = lp;
                   1600:                        break;
                   1601:                }
                   1602:                if (--nl == 0) {
                   1603:                        bp = getblock(tl+=0400, 1);
                   1604:                        nl = nleft;
                   1605:                }
                   1606:        }
                   1607:        nl = tline;
                   1608:        tline += (((lp-linebuf)+03)>>1)&077776;
                   1609:        return(nl);
                   1610: }
                   1611: 
                   1612: char *
                   1613: getblock(atl, iof)
                   1614: {
                   1615:        extern read(), write();
                   1616:        register bno, off;
                   1617:        register char *p1, *p2;
                   1618:        register int n;
                   1619:        
                   1620:        bno = (atl>>8)&0377;
                   1621:        off = (atl<<1)&0774;
                   1622:        if (bno >= 255) {
                   1623:                lastc = '\n';
                   1624:                error(T);
                   1625:        }
                   1626:        nleft = 512 - off;
                   1627:        if (bno==iblock) {
                   1628:                ichanged |= iof;
                   1629:                return(ibuff+off);
                   1630:        }
                   1631:        if (bno==oblock)
                   1632:                return(obuff+off);
                   1633:        if (iof==0) {
                   1634:                if (ichanged) {
                   1635:                        if(xtflag)
                   1636:                                crblock(tperm, ibuff, 512, (long)0);
                   1637:                        blkio(iblock, ibuff, write);
                   1638:                }
                   1639:                ichanged = 0;
                   1640:                iblock = bno;
                   1641:                blkio(bno, ibuff, read);
                   1642:                if(xtflag)
                   1643:                        crblock(tperm, ibuff, 512, (long)0);
                   1644:                return(ibuff+off);
                   1645:        }
                   1646:        if (oblock>=0) {
                   1647:                if(xtflag) {
                   1648:                        p1 = obuff;
                   1649:                        p2 = crbuf;
                   1650:                        n = 512;
                   1651:                        while(n--)
                   1652:                                *p2++ = *p1++;
                   1653:                        crblock(tperm, crbuf, 512, (long)0);
                   1654:                        blkio(oblock, crbuf, write);
                   1655:                } else
                   1656:                        blkio(oblock, obuff, write);
                   1657:        }
                   1658:        oblock = bno;
                   1659:        return(obuff+off);
                   1660: }
                   1661: 
                   1662: blkio(b, buf, iofcn)
                   1663: char *buf;
                   1664: int (*iofcn)();
                   1665: {
                   1666:        lseek(tfile, (long)b<<9, 0);
                   1667:        if ((*iofcn)(tfile, buf, 512) != 512) {
                   1668:                error(T);
                   1669:        }
                   1670: }
                   1671: 
                   1672: init()
                   1673: {
                   1674:        register *markp;
                   1675: 
                   1676:        close(tfile);
                   1677:        tline = 2;
                   1678:        for (markp = names; markp < &names[26]; )
                   1679:                *markp++ = 0;
                   1680:        subnewa = 0;
                   1681:        anymarks = 0;
                   1682:        iblock = -1;
                   1683:        oblock = -1;
                   1684:        ichanged = 0;
                   1685:        close(creat(tfname, 0600));
                   1686:        tfile = open(tfname, 2);
                   1687:        if(xflag) {
                   1688:                xtflag = 1;
                   1689:                makekey(key, tperm);
                   1690:        }
                   1691:        dot = dol = zero;
                   1692: }
                   1693: 
                   1694: global(k)
                   1695: {
                   1696:        register char *gp;
                   1697:        register c;
                   1698:        register int *a1;
                   1699:        char globuf[256];
                   1700: 
                   1701:        if (globp)
                   1702:                error(Q);
                   1703:        setwide();
                   1704:        squeeze(dol>zero);
                   1705:        if ((c=getchr())=='\n')
                   1706:                error(Q);
                   1707:        compile(c);
                   1708:        gp = globuf;
                   1709:        while ((c = getchr()) != '\n') {
                   1710:                if (c==-1)
                   1711:                        error(Q);
                   1712:                if (c=='\\') {
                   1713:                        c = getchr();
                   1714:                        if (c!='\n')
                   1715:                                *gp++ = '\\';
                   1716:                }
                   1717:                *gp++ = c;
                   1718:                if (gp >= &globuf[256-2])
                   1719:                        error(Q);
                   1720:        }
                   1721:        if (gp == globuf)
                   1722:                *gp++ = 'p';
                   1723:        *gp++ = '\n';
                   1724:        *gp++ = 0;
                   1725:        for (a1=zero; a1<=dol; a1++) {
                   1726:                *a1 &= ~01;
                   1727:                if (a1>=addr1 && a1<=addr2 && execute(a1)==k)
                   1728:                        *a1 |= 01;
                   1729:        }
                   1730:        
                   1731: 
                   1732: 
                   1733:        if (globuf[0]=='d' && globuf[1]=='\n' && globuf[2]=='\0') {
                   1734:                gdelete();
                   1735:                return;
                   1736:        }
                   1737:        for (a1=zero; a1<=dol; a1++) {
                   1738:                if (*a1 & 01) {
                   1739:                        *a1 &= ~01;
                   1740:                        dot = a1;
                   1741:                        globp = globuf;
                   1742:                        commands();
                   1743:                        a1 = zero;
                   1744:                }
                   1745:        }
                   1746: }
                   1747: 
                   1748: join()
                   1749: {
                   1750:        register char *gp, *lp;
                   1751:        register *a1;
                   1752: 
                   1753:        nonzero();
                   1754:        gp = genbuf;
                   1755:        for (a1=addr1; a1<=addr2; a1++) {
                   1756:                lp = getline(*a1);
                   1757:                while (*gp = *lp++)
                   1758:                        if (gp++ >= &genbuf[512-2])
                   1759:                                error(Q);
                   1760:        }
                   1761:        lp = linebuf;
                   1762:        gp = genbuf;
                   1763:        while (*lp++ = *gp++)
                   1764:                ;
                   1765:        *addr1 = putline();
                   1766:        if (addr1<addr2)
                   1767:                rdelete(addr1+1, addr2);
                   1768:        dot = addr1;
                   1769: }
                   1770: 
                   1771: substitute(inglob)
                   1772: {
                   1773:        register *markp, *a1, nl;
                   1774:        int gsubf;
                   1775:        int getsub();
                   1776:        int n, m;
                   1777: 
                   1778:        n = getnum();   
                   1779:        gsubf = compsub();
                   1780:        for (a1 = addr1; a1 <= addr2; a1++) {
                   1781:                if (execute(a1)){
                   1782:                        int *ozero;
                   1783:                        m = n;
                   1784:                        do {
                   1785:                                if (--m <= 0) {
                   1786:                                        dosub();
                   1787:                                        if (!gsubf)
                   1788:                                                break;
                   1789:                                }
                   1790:                        } while (execute((int *)0));
                   1791:                        if (m <= 0) {
                   1792:                                inglob |= 01;
                   1793:                                subnewa = putline();
                   1794:                                *a1 &= ~01;
                   1795:                                if (anymarks) {
                   1796:                                        for (markp = names; markp < &names[26]; markp++)
                   1797:                                                if (*markp == *a1)
                   1798:                                                        *markp = subnewa;
                   1799:                                }
                   1800:                                subolda = *a1;
                   1801:                                *a1 = subnewa;
                   1802:                                ozero = zero;
                   1803:                                nl = append(getsub, a1);
                   1804:                                nl += zero-ozero;
                   1805:                                a1 += nl;
                   1806:                                addr2 += nl;
                   1807:                        }
                   1808:                }
                   1809:        }
                   1810:        if (inglob==0)
                   1811:                error(Q);
                   1812: }
                   1813: 
                   1814: compsub()
                   1815: {
                   1816:        register seof, c;
                   1817:        register char *p;
                   1818: 
                   1819:        if ((seof = getchr()) == '\n' || seof == ' ')
                   1820:                error(Q);
                   1821:        compile(seof);
                   1822:        p = rhsbuf;
                   1823:        for (;;) {
                   1824:                c = getchr();
                   1825:                if (c=='\\')
                   1826:                        c = getchr() | 0200;
                   1827:                if (c=='\n') {
                   1828:                        if (globp && globp[0])  
                   1829:                                c |= 0200;
                   1830:                        else {
                   1831:                                peekc = c;
                   1832:                                pflag++;
                   1833:                                break;
                   1834:                        }
                   1835:                }
                   1836:                if (c==seof)
                   1837:                        break;
                   1838:                *p++ = c;
                   1839:                if (p >= &rhsbuf[512/2])
                   1840:                        error(Q);
                   1841:        }
                   1842:        *p++ = 0;
                   1843:        if ((peekc = getchr()) == 'g') {
                   1844:                peekc = 0;
                   1845:                newline();
                   1846:                return(1);
                   1847:        }
                   1848:        newline();
                   1849:        return(0);
                   1850: }
                   1851: 
                   1852: getsub()
                   1853: {
                   1854:        register char *p1, *p2;
                   1855: 
                   1856:        p1 = linebuf;
                   1857:        if ((p2 = linebp) == 0)
                   1858:                return(-1);
                   1859:        while (*p1++ = *p2++)
                   1860:                ;
                   1861:        linebp = 0;
                   1862:        return(0);
                   1863: }
                   1864: 
                   1865: dosub()
                   1866: {
                   1867:        register char *lp, *sp, *rp;
                   1868:        int c;
                   1869: 
                   1870:        lp = linebuf;
                   1871:        sp = genbuf;
                   1872:        rp = rhsbuf;
                   1873:        while (lp < loc1)
                   1874:                *sp++ = *lp++;
                   1875:        while (c = *rp++&0377) {
                   1876:                if (c=='&') {
                   1877:                        sp = place(sp, loc1, loc2);
                   1878:                        continue;
                   1879:                } else if (c&0200 && (c &= 0177) >='1' && c < nbra+'1') {
                   1880:                        sp = place(sp, braslist[c-'1'], braelist[c-'1']);
                   1881:                        continue;
                   1882:                }
                   1883:                *sp++ = c&0177;
                   1884:                if (sp >= &genbuf[512])
                   1885:                        error(Q);
                   1886:        }
                   1887:        lp = loc2;
                   1888:        loc2 = sp - genbuf + linebuf;
                   1889:        while (*sp++ = *lp++)
                   1890:                if (sp >= &genbuf[512])
                   1891:                        error(Q);
                   1892:        lp = linebuf;
                   1893:        sp = genbuf;
                   1894:        while (*lp++ = *sp++)
                   1895:                ;
                   1896: }
                   1897: 
                   1898: char *
                   1899: place(sp, l1, l2)
                   1900: register char *sp, *l1, *l2;
                   1901: {
                   1902: 
                   1903:        while (l1 < l2) {
                   1904:                *sp++ = *l1++;
                   1905:                if (sp >= &genbuf[512])
                   1906:                        error(Q);
                   1907:        }
                   1908:        return(sp);
                   1909: }
                   1910: 
                   1911: move(cflag)
                   1912: {
                   1913:        register int *adt, *ad1, *ad2;
                   1914:        int getcopy();
                   1915: 
                   1916:        nonzero();
                   1917:        if ((adt = address())==0)       
                   1918:                error(Q);
                   1919:        newline();
                   1920:        if (cflag) {
                   1921:                int *ozero, delta;
                   1922:                ad1 = dol;
                   1923:                ozero = zero;
                   1924:                append(getcopy, ad1++);
                   1925:                ad2 = dol;
                   1926:                delta = zero - ozero;
                   1927:                ad1 += delta;
                   1928:                adt += delta;
                   1929:        } else {
                   1930:                ad2 = addr2;
                   1931:                for (ad1 = addr1; ad1 <= ad2;)
                   1932:                        *ad1++ &= ~01;
                   1933:                ad1 = addr1;
                   1934:        }
                   1935:        ad2++;
                   1936:        if (adt<ad1) {
                   1937:                dot = adt + (ad2-ad1);
                   1938:                if ((++adt)==ad1)
                   1939:                        return;
                   1940:                reverse(adt, ad1);
                   1941:                reverse(ad1, ad2);
                   1942:                reverse(adt, ad2);
                   1943:        } else if (adt >= ad2) {
                   1944:                dot = adt++;
                   1945:                reverse(ad1, ad2);
                   1946:                reverse(ad2, adt);
                   1947:                reverse(ad1, adt);
                   1948:        } else
                   1949:                error(Q);
                   1950:        fchange = 1;
                   1951: }
                   1952: 
                   1953: reverse(a1, a2)
                   1954: register int *a1, *a2;
                   1955: {
                   1956:        register int t;
                   1957: 
                   1958:        for (;;) {
                   1959:                t = *--a2;
                   1960:                if (a2 <= a1)
                   1961:                        return;
                   1962:                *a2 = *a1;
                   1963:                *a1++ = t;
                   1964:        }
                   1965: }
                   1966: 
                   1967: getcopy()
                   1968: {
                   1969:        if (addr1 > addr2)
                   1970:                return(-1);
                   1971:        getline(*addr1++);
                   1972:        return(0);
                   1973: }
                   1974: 
                   1975: compile(aeof)
                   1976: {
                   1977:        register eof, c;
                   1978:        register char *ep;
                   1979:        char *lastep;
                   1980:        char bracket[5], *bracketp;
                   1981:        int cclcnt;
                   1982: 
                   1983:        ep = expbuf;
                   1984:        eof = aeof;
                   1985:        bracketp = bracket;
                   1986:        if ((c = getchr()) == '\n') {
                   1987:                peekc = c;
                   1988:                c = eof;
                   1989:        }
                   1990:        if (c == eof) {
                   1991:                if (*ep==0)
                   1992:                        error(Q);
                   1993:                return;
                   1994:        }
                   1995:        circfl = 0;
                   1996:        nbra = 0;
                   1997:        if (c=='^') {
                   1998:                c = getchr();
                   1999:                circfl++;
                   2000:        }
                   2001:        peekc = c;
                   2002:        lastep = 0;
                   2003:        for (;;) {
                   2004:                if (ep >= &expbuf[256])
                   2005:                        goto cerror;
                   2006:                c = getchr();
                   2007:                if (c == '\n') {
                   2008:                        peekc = c;
                   2009:                        c = eof;
                   2010:                }
                   2011:                if (c==eof) {
                   2012:                        if (bracketp != bracket)
                   2013:                                goto cerror;
                   2014:                        *ep++ = 11;
                   2015:                        return;
                   2016:                }
                   2017:                if (c!='*')
                   2018:                        lastep = ep;
                   2019:                switch (c) {
                   2020: 
                   2021:                case '\\':
                   2022:                        if ((c = getchr())=='(') {
                   2023:                                if (nbra >= 5)
                   2024:                                        goto cerror;
                   2025:                                *bracketp++ = nbra;
                   2026:                                *ep++ = 1;
                   2027:                                *ep++ = nbra++;
                   2028:                                continue;
                   2029:                        }
                   2030:                        if (c == ')') {
                   2031:                                if (bracketp <= bracket)
                   2032:                                        goto cerror;
                   2033:                                *ep++ = 12;
                   2034:                                *ep++ = *--bracketp;
                   2035:                                continue;
                   2036:                        }
                   2037:                        if (c>='1' && c<'1'+5) {
                   2038:                                *ep++ = 14;
                   2039:                                *ep++ = c-'1';
                   2040:                                continue;
                   2041:                        }
                   2042:                        *ep++ = 2;
                   2043:                        if (c=='\n')
                   2044:                                goto cerror;
                   2045:                        *ep++ = c;
                   2046:                        continue;
                   2047: 
                   2048:                case '.':
                   2049:                        *ep++ = 4;
                   2050:                        continue;
                   2051: 
                   2052:                case '\n':
                   2053:                        goto cerror;
                   2054: 
                   2055:                case '*':
                   2056:                        if (lastep==0 || *lastep==1 || *lastep==12)
                   2057:                                goto defchar;
                   2058:                        *lastep |= 01;
                   2059:                        continue;
                   2060: 
                   2061:                case '$':
                   2062:                        if ((peekc=getchr()) != eof && peekc!='\n')
                   2063:                                goto defchar;
                   2064:                        *ep++ = 10;
                   2065:                        continue;
                   2066: 
                   2067:                case '[':
                   2068:                        *ep++ = 6;
                   2069:                        *ep++ = 0;
                   2070:                        cclcnt = 1;
                   2071:                        if ((c=getchr()) == '^') {
                   2072:                                c = getchr();
                   2073:                                ep[-2] = 8;
                   2074:                        }
                   2075:                        do {
                   2076:                                if (c=='\n')
                   2077:                                        goto cerror;
                   2078:                                if (c=='-' && ep[-1]!=0) {
                   2079:                                        if ((c=getchr())==']') {
                   2080:                                                *ep++ = '-';
                   2081:                                                cclcnt++;
                   2082:                                                break;
                   2083:                                        }
                   2084:                                        while (ep[-1]<c) {
                   2085:                                                *ep = ep[-1]+1;
                   2086:                                                ep++;
                   2087:                                                cclcnt++;
                   2088:                                                if (ep>=&expbuf[256])
                   2089:                                                        goto cerror;
                   2090:                                        }
                   2091:                                }
                   2092:                                *ep++ = c;
                   2093:                                cclcnt++;
                   2094:                                if (ep >= &expbuf[256])
                   2095:                                        goto cerror;
                   2096:                        } while ((c = getchr()) != ']');
                   2097:                        lastep[1] = cclcnt;
                   2098:                        continue;
                   2099: 
                   2100:                defchar:
                   2101:                default:
                   2102:                        *ep++ = 2;
                   2103:                        *ep++ = c;
                   2104:                }
                   2105:        }
                   2106:    cerror:
                   2107:        expbuf[0] = 0;
                   2108:        nbra = 0;
                   2109:        error(Q);
                   2110: }
                   2111: 
                   2112: execute(addr)
                   2113: int *addr;
                   2114: {
                   2115:        register char *p1, *p2;
                   2116:        register c;
                   2117: 
                   2118:        for (c=0; c<5; c++) {
                   2119:                braslist[c] = 0;
                   2120:                braelist[c] = 0;
                   2121:        }
                   2122:        if (addr == (int *)0) {
                   2123:                if (circfl)
                   2124:                        return(0);
                   2125:                locs = p1 = loc2;
                   2126:        } else {
                   2127:                if (addr==zero)
                   2128:                        return(0);
                   2129:                p1 = getline(*addr);
                   2130:                locs = 0;
                   2131:        }
                   2132:        p2 = expbuf;
                   2133:        if (circfl) {
                   2134:                loc1 = p1;
                   2135:                return(advance(p1, p2));
                   2136:        }
                   2137:        
                   2138:        if (*p2==2) {
                   2139:                c = p2[1];
                   2140:                do {
                   2141:                        if (*p1!=c)
                   2142:                                continue;
                   2143:                        if (advance(p1, p2)) {
                   2144:                                loc1 = p1;
                   2145:                                return(1);
                   2146:                        }
                   2147:                } while (*p1++);
                   2148:                return(0);
                   2149:        }
                   2150:        
                   2151:        do {
                   2152:                if (advance(p1, p2)) {
                   2153:                        loc1 = p1;
                   2154:                        return(1);
                   2155:                }
                   2156:        } while (*p1++);
                   2157:        return(0);
                   2158: }
                   2159: 
                   2160: advance(lp, ep)
                   2161: register char *ep, *lp;
                   2162: {
                   2163:        register char *curlp;
                   2164:        int i;
                   2165: 
                   2166:        for (;;) switch (*ep++) {
                   2167: 
                   2168:        case 2:
                   2169:                if (*ep++ == *lp++)
                   2170:                        continue;
                   2171:                return(0);
                   2172: 
                   2173:        case 4:
                   2174:                if (*lp++)
                   2175:                        continue;
                   2176:                return(0);
                   2177: 
                   2178:        case 10:
                   2179:                if (*lp==0)
                   2180:                        continue;
                   2181:                return(0);
                   2182: 
                   2183:        case 11:
                   2184:                loc2 = lp;
                   2185:                return(1);
                   2186: 
                   2187:        case 6:
                   2188:                if (cclass(ep, *lp++, 1)) {
                   2189:                        ep += *ep;
                   2190:                        continue;
                   2191:                }
                   2192:                return(0);
                   2193: 
                   2194:        case 8:
                   2195:                if (cclass(ep, *lp++, 0)) {
                   2196:                        ep += *ep;
                   2197:                        continue;
                   2198:                }
                   2199:                return(0);
                   2200: 
                   2201:        case 1:
                   2202:                braslist[*ep++] = lp;
                   2203:                continue;
                   2204: 
                   2205:        case 12:
                   2206:                braelist[*ep++] = lp;
                   2207:                continue;
                   2208: 
                   2209:        case 14:
                   2210:                if (braelist[i = *ep++]==0)
                   2211:                        error(Q);
                   2212:                if (backref(i, lp)) {
                   2213:                        lp += braelist[i] - braslist[i];
                   2214:                        continue;
                   2215:                }
                   2216:                return(0);
                   2217: 
                   2218:        case 14|01:
                   2219:                if (braelist[i = *ep++] == 0)
                   2220:                        error(Q);
                   2221:                curlp = lp;
                   2222:                while (backref(i, lp))
                   2223:                        lp += braelist[i] - braslist[i];
                   2224:                while (lp >= curlp) {
                   2225:                        if (advance(lp, ep))
                   2226:                                return(1);
                   2227:                        lp -= braelist[i] - braslist[i];
                   2228:                }
                   2229:                continue;
                   2230: 
                   2231:        case 4|01:
                   2232:                curlp = lp;
                   2233:                while (*lp++)
                   2234:                        ;
                   2235:                goto star;
                   2236: 
                   2237:        case 2|01:
                   2238:                curlp = lp;
                   2239:                while (*lp++ == *ep)
                   2240:                        ;
                   2241:                ep++;
                   2242:                goto star;
                   2243: 
                   2244:        case 6|01:
                   2245:        case 8|01:
                   2246:                curlp = lp;
                   2247:                while (cclass(ep, *lp++, ep[-1]==(6|01)))
                   2248:                        ;
                   2249:                ep += *ep;
                   2250:                goto star;
                   2251: 
                   2252:        star:
                   2253:                do {
                   2254:                        lp--;
                   2255:                        if (lp==locs)
                   2256:                                break;
                   2257:                        if (advance(lp, ep))
                   2258:                                return(1);
                   2259:                } while (lp > curlp);
                   2260:                return(0);
                   2261: 
                   2262:        default:
                   2263:                error(Q);
                   2264:        }
                   2265: }
                   2266: 
                   2267: backref(i, lp)
                   2268: register i;
                   2269: register char *lp;
                   2270: {
                   2271:        register char *bp;
                   2272: 
                   2273:        bp = braslist[i];
                   2274:        while (*bp++ == *lp++)
                   2275:                if (bp >= braelist[i])
                   2276:                        return(1);
                   2277:        return(0);
                   2278: }
                   2279: 
                   2280: cclass(set, c, af)
                   2281: register char *set;
                   2282: register c;
                   2283: {
                   2284:        register n;
                   2285: 
                   2286:        if (c==0)
                   2287:                return(0);
                   2288:        n = *set++;
                   2289:        while (--n)
                   2290:                if (*set++ == c)
                   2291:                        return(af);
                   2292:        return(!af);
                   2293: }
                   2294: 
                   2295: putd()
                   2296: {
                   2297:        register r;
                   2298: 
                   2299:        r = count%10;
                   2300:        count /= 10;
                   2301:        if (count)
                   2302:                putd();
                   2303:        putchr(r + '0');
                   2304: }
                   2305: 
                   2306: puts(sp)
                   2307: register char *sp;
                   2308: {
                   2309:        col = 0;
                   2310:        while (*sp)
                   2311:                putchr(*sp++);
                   2312:        putchr('\n');
                   2313: }
                   2314: 
                   2315: char   line[70];
                   2316: char   *linp   = line;
                   2317: 
                   2318: putchr(ac)
                   2319: {
                   2320:        register char *lp;
                   2321:        register c;
                   2322: 
                   2323:        lp = linp;
                   2324:        c = ac;
                   2325:        if (listf) {
                   2326:                if (c=='\n') {
                   2327:                        if (linp!=line && linp[-1]==' ') {
                   2328:                                *lp++ = '\\';
                   2329:                                *lp++ = 'n';
                   2330:                        }
                   2331:                } else {
                   2332:                        if (col > (72-4-2)) {
                   2333:                                col = 8;
                   2334:                                *lp++ = '\\';
                   2335:                                *lp++ = '\n';
                   2336:                                *lp++ = '\t';
                   2337:                        }
                   2338:                        col++;
                   2339:                        if (c=='\b' || c=='\t' || c=='\\') {
                   2340:                                *lp++ = '\\';
                   2341:                                if (c=='\b')
                   2342:                                        c = 'b';
                   2343:                                else if (c=='\t')
                   2344:                                        c = 't';
                   2345:                                col++;
                   2346:                        } else if (c<' ' || c=='\177') {
                   2347:                                *lp++ = '\\';
                   2348:                                *lp++ =  (c>>6)    +'0';
                   2349:                                *lp++ = ((c>>3)&07)+'0';
                   2350:                                c     = ( c    &07)+'0';
                   2351:                                col += 3;
                   2352:                        }
                   2353:                }
                   2354:        }
                   2355:        *lp++ = c;
                   2356:        if(c == '\n' || lp >= &line[64]) {
                   2357:                linp = line;
                   2358:                write(oflag?2:1, line, lp-line);
                   2359:                return;
                   2360:        }
                   2361:        linp = lp;
                   2362: }
                   2363: crblock(permp, buf, nchar, startn)
                   2364: char *permp;
                   2365: char *buf;
                   2366: long startn;
                   2367: {
                   2368:        register char *p1;
                   2369:        int n1;
                   2370:        int n2;
                   2371:        register char *t1, *t2, *t3;
                   2372: 
                   2373:        t1 = permp;
                   2374:        t2 = &permp[256];
                   2375:        t3 = &permp[512];
                   2376: 
                   2377:        n1 = startn&0377;
                   2378:        n2 = (startn>>8)&0377;
                   2379:        p1 = buf;
                   2380:        while(nchar--) {
                   2381:                *p1 = t2[(t3[(t1[(*p1+n1)&0377]+n2)&0377]-n2)&0377]-n1;
                   2382:                n1++;
                   2383:                if(n1==256){
                   2384:                        n1 = 0;
                   2385:                        n2++;
                   2386:                        if(n2==256) n2 = 0;
                   2387:                }
                   2388:                p1++;
                   2389:        }
                   2390: }
                   2391: 
                   2392: getkey()
                   2393: {
                   2394:        struct sgttyb b;
                   2395:        int save;
                   2396:        int (*sig)();
                   2397:        register char *p;
                   2398:        register c;
                   2399: 
                   2400:        sig = signal(2  ,       (int (*)())1);
                   2401:        if (gtty(0, &b) == -1)
                   2402:                error("Input not tty");
                   2403:        save = b.sg_flags;
                   2404:        b.sg_flags &= ~010;
                   2405:        stty(0, &b);
                   2406:        puts("Key:");
                   2407:        p = key;
                   2408:        while(((c=getchr()) != -1) && (c!='\n')) {
                   2409:                if(p < &key[9])
                   2410:                        *p++ = c;
                   2411:        }
                   2412:        *p = 0;
                   2413:        b.sg_flags = save;
                   2414:        stty(0, &b);
                   2415:        signal(2        , sig);
                   2416:        return(key[0] != 0);
                   2417: }
                   2418: 
                   2419: 
                   2420: 
                   2421: 
                   2422: 
                   2423: crinit(keyp, permp)
                   2424: char   *keyp, *permp;
                   2425: {
                   2426:        register char *t1, *t2, *t3;
                   2427:        register i;
                   2428:        int ic, k, temp, pf[2];
                   2429:        unsigned random;
                   2430:        char buf[13];
                   2431:        long seed;
                   2432: 
                   2433:        t1 = permp;
                   2434:        t2 = &permp[256];
                   2435:        t3 = &permp[512];
                   2436:        if(*keyp == 0)
                   2437:                return(0);
                   2438:        strncpy(buf, keyp, 8);
                   2439:        while (*keyp)
                   2440:                *keyp++ = '\0';
                   2441:        buf[8] = buf[0];
                   2442:        buf[9] = buf[1];
                   2443:        if (pipe(pf)<0)
                   2444:                pf[0] = pf[1] = -1;
                   2445:        if (fork()==0) {
                   2446:                close(0);
                   2447:                close(1);
                   2448:                dup(pf[0]);
                   2449:                dup(pf[1]);
                   2450:                execl("/usr/lib/makekey", "-", 0);
                   2451:                execl("/lib/makekey", "-", 0);
                   2452:                exit(1);
                   2453:        }
                   2454:        write(pf[1], buf, 10);
                   2455:        if (wait((int *)0)==-1 || read(pf[0], buf, 13)!=13)
                   2456:                error("crypt: cannot generate key");
                   2457:        close(pf[0]);
                   2458:        close(pf[1]);
                   2459:        seed = 123;
                   2460:        for (i=0; i<13; i++)
                   2461:                seed = seed*buf[i] + i;
                   2462:        for(i=0;i<256;i++){
                   2463:                t1[i] = i;
                   2464:                t3[i] = 0;
                   2465:        }
                   2466:        for(i=0; i<256; i++) {
                   2467:                seed = 5*seed + buf[i%13];
                   2468:                random = seed % 65521;
                   2469:                k = 256-1 - i;
                   2470:                ic = (random&0377) % (k+1);
                   2471:                random >>= 8;
                   2472:                temp = t1[k];
                   2473:                t1[k] = t1[ic];
                   2474:                t1[ic] = temp;
                   2475:                if(t3[k]!=0) continue;
                   2476:                ic = (random&0377) % k;
                   2477:                while(t3[ic]!=0) ic = (ic+1) % k;
                   2478:                t3[k] = ic;
                   2479:                t3[ic] = k;
                   2480:        }
                   2481:        for(i=0; i<256; i++)
                   2482:                t2[t1[i]&0377] = i;
                   2483:        return(1);
                   2484: }
                   2485: 
                   2486: makekey(a, b)
                   2487: char *a, *b;
                   2488: {
                   2489:        register int i;
                   2490:        long t;
                   2491:        char temp[9 + 1];
                   2492: 
                   2493:        for(i = 0; i < 9; i++)
                   2494:                temp[i] = *a++;
                   2495:        time(&t);
                   2496:        t += getpid();
                   2497:        for(i = 0; i < 4; i++)
                   2498:                temp[i] ^= (t>>(8*i))&0377;
                   2499:        crinit(temp, b);
                   2500: 
                   2501: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.