Annotation of 43BSDReno/usr.bin/ex/ex_subr.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1980 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: static char *sccsid = "@(#)ex_subr.c   7.13 (Berkeley) 5/28/90";
                      9: #endif not lint
                     10: 
                     11: #include "ex.h"
                     12: #include "ex_re.h"
                     13: #include "ex_tty.h"
                     14: #include "ex_vis.h"
                     15: #include "pathnames.h"
                     16: 
                     17: /*
                     18:  * Random routines, in alphabetical order.
                     19:  */
                     20: 
                     21: any(c, s)
                     22:        int c;
                     23:        register char *s;
                     24: {
                     25:        register int x;
                     26: 
                     27:        while (x = *s++)
                     28:                if (x == c)
                     29:                        return (1);
                     30:        return (0);
                     31: }
                     32: 
                     33: backtab(i)
                     34:        register int i;
                     35: {
                     36:        register int j;
                     37: 
                     38:        j = i % value(SHIFTWIDTH);
                     39:        if (j == 0)
                     40:                j = value(SHIFTWIDTH);
                     41:        i -= j;
                     42:        if (i < 0)
                     43:                i = 0;
                     44:        return (i);
                     45: }
                     46: 
                     47: change()
                     48: {
                     49: 
                     50:        tchng++;
                     51:        chng = tchng;
                     52: }
                     53: 
                     54: /*
                     55:  * Column returns the number of
                     56:  * columns occupied by printing the
                     57:  * characters through position cp of the
                     58:  * current line.
                     59:  */
                     60: column(cp)
                     61:        register char *cp;
                     62: {
                     63: 
                     64:        if (cp == 0)
                     65:                cp = &linebuf[LBSIZE - 2];
                     66:        return (qcolumn(cp, (char *) 0));
                     67: }
                     68: 
                     69: /*
                     70:  * Ignore a comment to the end of the line.
                     71:  * This routine eats the trailing newline so don't call newline().
                     72:  */
                     73: comment()
                     74: {
                     75:        register int c;
                     76: 
                     77:        do {
                     78:                c = ex_getchar();
                     79:        } while (c != '\n' && c != EOF);
                     80:        if (c == EOF)
                     81:                ungetchar(c);
                     82: }
                     83: 
                     84: Copy(to, from, size)
                     85:        register char *from, *to;
                     86:        register int size;
                     87: {
                     88: 
                     89:        if (size > 0)
                     90:                do
                     91:                        *to++ = *from++;
                     92:                while (--size > 0);
                     93: }
                     94: 
                     95: copyw(to, from, size)
                     96:        register line *from, *to;
                     97:        register int size;
                     98: {
                     99:        if (size > 0)
                    100:                do
                    101:                        *to++ = *from++;
                    102:                while (--size > 0);
                    103: }
                    104: 
                    105: copywR(to, from, size)
                    106:        register line *from, *to;
                    107:        register int size;
                    108: {
                    109: 
                    110:        while (--size >= 0)
                    111:                to[size] = from[size];
                    112: }
                    113: 
                    114: ctlof(c)
                    115:        int c;
                    116: {
                    117: 
                    118:        return (c == TRIM ? '?' : c | ('A' - 1));
                    119: }
                    120: 
                    121: dingdong()
                    122: {
                    123: 
                    124:        if (VB)
                    125:                putpad(VB);
                    126:        else if (value(ERRORBELLS))
                    127:                putch('\207');
                    128: }
                    129: 
                    130: fixindent(indent)
                    131:        int indent;
                    132: {
                    133:        register int i;
                    134:        register char *cp;
                    135: 
                    136:        i = whitecnt(genbuf);
                    137:        cp = vpastwh(genbuf);
                    138:        if (*cp == 0 && i == indent && linebuf[0] == 0) {
                    139:                genbuf[0] = 0;
                    140:                return (i);
                    141:        }
                    142:        CP(genindent(i), cp);
                    143:        return (i);
                    144: }
                    145: 
                    146: filioerr(cp)
                    147:        char *cp;
                    148: {
                    149:        register int oerrno = errno;
                    150: 
                    151:        lprintf("\"%s\"", cp);
                    152:        errno = oerrno;
                    153:        syserror();
                    154: }
                    155: 
                    156: char *
                    157: genindent(indent)
                    158:        register int indent;
                    159: {
                    160:        register char *cp;
                    161: 
                    162:        for (cp = genbuf; indent >= value(TABSTOP); indent -= value(TABSTOP))
                    163:                *cp++ = '\t';
                    164:        for (; indent > 0; indent--)
                    165:                *cp++ = ' ';
                    166:        return (cp);
                    167: }
                    168: 
                    169: getDOT()
                    170: {
                    171: 
                    172:        getline(*dot);
                    173: }
                    174: 
                    175: line *
                    176: getmark(c)
                    177:        register int c;
                    178: {
                    179:        register line *addr;
                    180:        
                    181:        for (addr = one; addr <= dol; addr++)
                    182:                if (names[c - 'a'] == (*addr &~ 01)) {
                    183:                        return (addr);
                    184:                }
                    185:        return (0);
                    186: }
                    187: 
                    188: getn(cp)
                    189:        register char *cp;
                    190: {
                    191:        register int i = 0;
                    192: 
                    193:        while (isdigit(*cp))
                    194:                i = i * 10 + *cp++ - '0';
                    195:        if (*cp)
                    196:                return (0);
                    197:        return (i);
                    198: }
                    199: 
                    200: ignnEOF()
                    201: {
                    202:        register int c = ex_getchar();
                    203: 
                    204:        if (c == EOF)
                    205:                ungetchar(c);
                    206:        else if (c=='"')
                    207:                comment();
                    208: }
                    209: 
                    210: iswhite(c)
                    211:        int c;
                    212: {
                    213: 
                    214:        return (c == ' ' || c == '\t');
                    215: }
                    216: 
                    217: junk(c)
                    218:        register int c;
                    219: {
                    220: 
                    221:        if (c && !value(BEAUTIFY))
                    222:                return (0);
                    223:        if (c >= ' ' && c != TRIM)
                    224:                return (0);
                    225:        switch (c) {
                    226: 
                    227:        case '\t':
                    228:        case '\n':
                    229:        case '\f':
                    230:                return (0);
                    231: 
                    232:        default:
                    233:                return (1);
                    234:        }
                    235: }
                    236: 
                    237: killed()
                    238: {
                    239: 
                    240:        killcnt(addr2 - addr1 + 1);
                    241: }
                    242: 
                    243: killcnt(cnt)
                    244:        register int cnt;
                    245: {
                    246: 
                    247:        if (inopen) {
                    248:                notecnt = cnt;
                    249:                notenam = notesgn = "";
                    250:                return;
                    251:        }
                    252:        if (!notable(cnt))
                    253:                return;
                    254:        ex_printf("%d lines", cnt);
                    255:        if (value(TERSE) == 0) {
                    256:                ex_printf(" %c%s", Command[0] | ' ', Command + 1);
                    257:                if (Command[strlen(Command) - 1] != 'e')
                    258:                        ex_putchar('e');
                    259:                ex_putchar('d');
                    260:        }
                    261:        putNFL();
                    262: }
                    263: 
                    264: lineno(a)
                    265:        line *a;
                    266: {
                    267: 
                    268:        return (a - zero);
                    269: }
                    270: 
                    271: lineDOL()
                    272: {
                    273: 
                    274:        return (lineno(dol));
                    275: }
                    276: 
                    277: lineDOT()
                    278: {
                    279: 
                    280:        return (lineno(dot));
                    281: }
                    282: 
                    283: markDOT()
                    284: {
                    285: 
                    286:        markpr(dot);
                    287: }
                    288: 
                    289: markpr(which)
                    290:        line *which;
                    291: {
                    292: 
                    293:        if ((inglobal == 0 || inopen) && which <= endcore) {
                    294:                names['z'-'a'+1] = *which & ~01;
                    295:                if (inopen)
                    296:                        ncols['z'-'a'+1] = cursor;
                    297:        }
                    298: }
                    299: 
                    300: markreg(c)
                    301:        register int c;
                    302: {
                    303: 
                    304:        if (c == '\'' || c == '`')
                    305:                return ('z' + 1);
                    306:        if (c >= 'a' && c <= 'z')
                    307:                return (c);
                    308:        return (0);
                    309: }
                    310: 
                    311: /*
                    312:  * Mesg decodes the terse/verbose strings. Thus
                    313:  *     'xxx@yyy' -> 'xxx' if terse, else 'xxx yyy'
                    314:  *     'xxx|yyy' -> 'xxx' if terse, else 'yyy'
                    315:  * All others map to themselves.
                    316:  */
                    317: char *
                    318: mesg(str)
                    319:        register char *str;
                    320: {
                    321:        register char *cp;
                    322: 
                    323:        str = strcpy(genbuf, str);
                    324:        for (cp = str; *cp; cp++)
                    325:                switch (*cp) {
                    326: 
                    327:                case '@':
                    328:                        if (value(TERSE))
                    329:                                *cp = 0;
                    330:                        else
                    331:                                *cp = ' ';
                    332:                        break;
                    333: 
                    334:                case '|':
                    335:                        if (value(TERSE) == 0)
                    336:                                return (cp + 1);
                    337:                        *cp = 0;
                    338:                        break;
                    339:                }
                    340:        return (str);
                    341: }
                    342: 
                    343: /*VARARGS2*/
                    344: merror(seekpt, i)
                    345: #ifndef EXSTRINGS
                    346:        char *seekpt;
                    347: #else
                    348: # ifdef lint
                    349:        char *seekpt;
                    350: # else
                    351:        int seekpt;
                    352: # endif
                    353: #endif
                    354:        int i;
                    355: {
                    356:        register char *cp = linebuf;
                    357: 
                    358:        if (seekpt == 0)
                    359:                return;
                    360:        merror1(seekpt);
                    361:        if (*cp == '\n')
                    362:                putnl(), cp++;
                    363:        if (inopen > 0 && CE)
                    364:                vclreol();
                    365:        if (SO && SE)
                    366:                putpad(SO);
                    367:        ex_printf(mesg(cp), i);
                    368:        if (SO && SE)
                    369:                putpad(SE);
                    370: }
                    371: 
                    372: merror1(seekpt)
                    373: #ifndef EXSTRINGS
                    374:        char *seekpt;
                    375: #else
                    376: # ifdef lint
                    377:        char *seekpt;
                    378: # else
                    379:        int seekpt;
                    380: # endif
                    381: #endif
                    382: {
                    383: 
                    384: #ifndef EXSTRINGS
                    385:        strcpy(linebuf, seekpt);
                    386: #else
                    387:        lseek(erfile, (long) seekpt, 0);
                    388:        if (read(erfile, linebuf, 128) < 2)
                    389:                CP(linebuf, "ERROR");
                    390: #endif
                    391: }
                    392: 
                    393: morelines()
                    394: {
                    395: #ifdef UNIX_SBRK
                    396:        char *sbrk();
                    397: 
                    398:        if ((int) sbrk(1024 * sizeof (line)) == -1)
                    399:                return (-1);
                    400:        endcore += 1024;
                    401:        return (0);
                    402: #else
                    403:        /*
                    404:         * We can never be guaranteed that we can get more memory
                    405:         * beyond "endcore".  So we just punt every time.
                    406:         */
                    407:        return -1;
                    408: #endif
                    409: }
                    410: 
                    411: nonzero()
                    412: {
                    413: 
                    414:        if (addr1 == zero) {
                    415:                notempty();
                    416:                error("Nonzero address required@on this command");
                    417:        }
                    418: }
                    419: 
                    420: notable(i)
                    421:        int i;
                    422: {
                    423: 
                    424:        return (hush == 0 && !inglobal && i > value(REPORT));
                    425: }
                    426: 
                    427: 
                    428: notempty()
                    429: {
                    430: 
                    431:        if (dol == zero)
                    432:                error("No lines@in the buffer");
                    433: }
                    434: 
                    435: 
                    436: netchHAD(cnt)
                    437:        int cnt;
                    438: {
                    439: 
                    440:        netchange(lineDOL() - cnt);
                    441: }
                    442: 
                    443: netchange(i)
                    444:        register int i;
                    445: {
                    446:        register char *cp;
                    447: 
                    448:        if (i > 0)
                    449:                notesgn = cp = "more ";
                    450:        else
                    451:                notesgn = cp = "fewer ", i = -i;
                    452:        if (inopen) {
                    453:                notecnt = i;
                    454:                notenam = "";
                    455:                return;
                    456:        }
                    457:        if (!notable(i))
                    458:                return;
                    459:        ex_printf(mesg("%d %slines@in file after %s"), i, cp, Command);
                    460:        putNFL();
                    461: }
                    462: 
                    463: putmark(addr)
                    464:        line *addr;
                    465: {
                    466: 
                    467:        putmk1(addr, putline());
                    468: }
                    469: 
                    470: putmk1(addr, n)
                    471:        register line *addr;
                    472:        int n;
                    473: {
                    474:        register line *markp;
                    475:        register oldglobmk;
                    476: 
                    477:        oldglobmk = *addr & 1;
                    478:        *addr &= ~1;
                    479:        for (markp = (anymarks ? names : &names['z'-'a'+1]);
                    480:          markp <= &names['z'-'a'+1]; markp++)
                    481:                if (*markp == *addr)
                    482:                        *markp = n;
                    483:        *addr = n | oldglobmk;
                    484: }
                    485: 
                    486: char *
                    487: plural(i)
                    488:        long i;
                    489: {
                    490: 
                    491:        return (i == 1 ? "" : "s");
                    492: }
                    493: 
                    494: int    qcount();
                    495: short  vcntcol;
                    496: 
                    497: qcolumn(lim, gp)
                    498:        register char *lim, *gp;
                    499: {
                    500:        register int x;
                    501:        int (*OO)();
                    502: 
                    503:        OO = Outchar;
                    504:        Outchar = qcount;
                    505:        vcntcol = 0;
                    506:        if (lim != NULL)
                    507:                x = lim[1], lim[1] = 0;
                    508:        pline(0);
                    509:        if (lim != NULL)
                    510:                lim[1] = x;
                    511:        if (gp)
                    512:                while (*gp)
                    513:                        ex_putchar(*gp++);
                    514:        Outchar = OO;
                    515:        return (vcntcol);
                    516: }
                    517: 
                    518: int
                    519: qcount(c)
                    520:        int c;
                    521: {
                    522: 
                    523:        if (c == '\t') {
                    524:                vcntcol += value(TABSTOP) - vcntcol % value(TABSTOP);
                    525:                return;
                    526:        }
                    527:        vcntcol++;
                    528: }
                    529: 
                    530: reverse(a1, a2)
                    531:        register line *a1, *a2;
                    532: {
                    533:        register line t;
                    534: 
                    535:        for (;;) {
                    536:                t = *--a2;
                    537:                if (a2 <= a1)
                    538:                        return;
                    539:                *a2 = *a1;
                    540:                *a1++ = t;
                    541:        }
                    542: }
                    543: 
                    544: save(a1, a2)
                    545:        line *a1;
                    546:        register line *a2;
                    547: {
                    548:        register int more;
                    549: 
                    550:        if (!FIXUNDO)
                    551:                return;
                    552: #ifdef TRACE
                    553:        if (trace)
                    554:                vudump("before save");
                    555: #endif
                    556:        undkind = UNDNONE;
                    557:        undadot = dot;
                    558:        more = (a2 - a1 + 1) - (unddol - dol);
                    559:        while (more > (endcore - truedol))
                    560:                if (morelines() < 0)
                    561: #ifdef UNIX_SBRK
                    562:                        error("Out of memory@saving lines for undo - try using ed");
                    563: #else
                    564:                        error("Out of memory@saving lines for undo - try increasing linelimit");
                    565: #endif
                    566:        if (more)
                    567:                (*(more > 0 ? copywR : copyw))(unddol + more + 1, unddol + 1,
                    568:                    (truedol - unddol));
                    569:        unddol += more;
                    570:        truedol += more;
                    571:        copyw(dol + 1, a1, a2 - a1 + 1);
                    572:        undkind = UNDALL;
                    573:        unddel = a1 - 1;
                    574:        undap1 = a1;
                    575:        undap2 = a2 + 1;
                    576: #ifdef TRACE
                    577:        if (trace)
                    578:                vudump("after save");
                    579: #endif
                    580: }
                    581: 
                    582: save12()
                    583: {
                    584: 
                    585:        save(addr1, addr2);
                    586: }
                    587: 
                    588: saveall()
                    589: {
                    590: 
                    591:        save(one, dol);
                    592: }
                    593: 
                    594: span()
                    595: {
                    596: 
                    597:        return (addr2 - addr1 + 1);
                    598: }
                    599: 
                    600: ex_sync()
                    601: {
                    602: 
                    603:        chng = 0;
                    604:        tchng = 0;
                    605:        xchng = 0;
                    606: }
                    607: 
                    608: 
                    609: skipwh()
                    610: {
                    611:        register int wh;
                    612: 
                    613:        wh = 0;
                    614:        while (iswhite(peekchar())) {
                    615:                wh++;
                    616:                ignchar();
                    617:        }
                    618:        return (wh);
                    619: }
                    620: 
                    621: /*VARARGS2*/
                    622: smerror(seekpt, cp)
                    623: #ifdef lint
                    624:        char *seekpt;
                    625: #else
                    626:        int seekpt;
                    627: #endif
                    628:        char *cp;
                    629: {
                    630: 
                    631:        if (seekpt == 0)
                    632:                return;
                    633:        merror1(seekpt);
                    634:        if (inopen && CE)
                    635:                vclreol();
                    636:        if (SO && SE)
                    637:                putpad(SO);
                    638:        lprintf(mesg(linebuf), cp);
                    639:        if (SO && SE)
                    640:                putpad(SE);
                    641: }
                    642: 
                    643: char *
                    644: strend(cp)
                    645:        register char *cp;
                    646: {
                    647: 
                    648:        while (*cp)
                    649:                cp++;
                    650:        return (cp);
                    651: }
                    652: 
                    653: strcLIN(dp)
                    654:        char *dp;
                    655: {
                    656: 
                    657:        CP(linebuf, dp);
                    658: }
                    659: 
                    660: syserror()
                    661: {
                    662:        char *strerror();
                    663: 
                    664:        dirtcnt = 0;
                    665:        ex_putchar(' ');
                    666:        error(strerror(errno));
                    667: }
                    668: 
                    669: /*
                    670:  * Return the column number that results from being in column col and
                    671:  * hitting a tab, where tabs are set every ts columns.  Work right for
                    672:  * the case where col > COLUMNS, even if ts does not divide COLUMNS.
                    673:  */
                    674: tabcol(col, ts)
                    675: int col, ts;
                    676: {
                    677:        int offset, result;
                    678: 
                    679:        if (col >= COLUMNS) {
                    680:                offset = COLUMNS * (col/COLUMNS);
                    681:                col -= offset;
                    682:        } else
                    683:                offset = 0;
                    684:        result = col + ts - (col % ts) + offset;
                    685:        return (result);
                    686: }
                    687: 
                    688: char *
                    689: vfindcol(i)
                    690:        int i;
                    691: {
                    692:        register char *cp;
                    693:        register int (*OO)() = Outchar;
                    694: 
                    695:        Outchar = qcount;
                    696:        ignore(qcolumn(linebuf - 1, NOSTR));
                    697:        for (cp = linebuf; *cp && vcntcol < i; cp++)
                    698:                ex_putchar(*cp);
                    699:        if (cp != linebuf)
                    700:                cp--;
                    701:        Outchar = OO;
                    702:        return (cp);
                    703: }
                    704: 
                    705: char *
                    706: vskipwh(cp)
                    707:        register char *cp;
                    708: {
                    709: 
                    710:        while (iswhite(*cp) && cp[1])
                    711:                cp++;
                    712:        return (cp);
                    713: }
                    714: 
                    715: 
                    716: char *
                    717: vpastwh(cp)
                    718:        register char *cp;
                    719: {
                    720: 
                    721:        while (iswhite(*cp))
                    722:                cp++;
                    723:        return (cp);
                    724: }
                    725: 
                    726: whitecnt(cp)
                    727:        register char *cp;
                    728: {
                    729:        register int i;
                    730: 
                    731:        i = 0;
                    732:        for (;;)
                    733:                switch (*cp++) {
                    734: 
                    735:                case '\t':
                    736:                        i += value(TABSTOP) - i % value(TABSTOP);
                    737:                        break;
                    738: 
                    739:                case ' ':
                    740:                        i++;
                    741:                        break;
                    742: 
                    743:                default:
                    744:                        return (i);
                    745:                }
                    746: }
                    747: 
                    748: #ifdef lint
                    749: Ignore(a)
                    750:        char *a;
                    751: {
                    752: 
                    753:        a = a;
                    754: }
                    755: 
                    756: Ignorf(a)
                    757:        int (*a)();
                    758: {
                    759: 
                    760:        a = a;
                    761: }
                    762: #endif
                    763: 
                    764: markit(addr)
                    765:        line *addr;
                    766: {
                    767: 
                    768:        if (addr != dot && addr >= one && addr <= dol)
                    769:                markDOT();
                    770: }
                    771: 
                    772: /*
                    773:  * The following code is defensive programming against a bug in the
                    774:  * pdp-11 overlay implementation.  Sometimes it goes nuts and asks
                    775:  * for an overlay with some garbage number, which generates an emt
                    776:  * trap.  This is a less than elegant solution, but it is somewhat
                    777:  * better than core dumping and losing your work, leaving your tty
                    778:  * in a weird state, etc.
                    779:  */
                    780: int _ovno;
                    781: onemt()
                    782: {
                    783:        signal(SIGEMT, onemt);
                    784:        /* 2 and 3 are valid on 11/40 type vi, so */
                    785:        if (_ovno < 0 || _ovno > 3)
                    786:                _ovno = 0;
                    787:        error("emt trap, _ovno is %d @ - try again");
                    788: }
                    789: 
                    790: /*
                    791:  * When a hangup occurs our actions are similar to a preserve
                    792:  * command.  If the buffer has not been [Modified], then we do
                    793:  * nothing but remove the temporary files and exit.
                    794:  * Otherwise, we sync the temp file and then attempt a preserve.
                    795:  * If the preserve succeeds, we unlink our temp files.
                    796:  * If the preserve fails, we leave the temp files as they are
                    797:  * as they are a backup even without preservation if they
                    798:  * are not removed.
                    799:  */
                    800: onhup()
                    801: {
                    802: 
                    803:        /*
                    804:         * USG tty driver can send multiple HUP's!!
                    805:         */
                    806:        signal(SIGINT, SIG_IGN);
                    807:        signal(SIGHUP, SIG_IGN);
                    808:        if (chng == 0) {
                    809:                cleanup(1);
                    810:                ex_exit(0);
                    811:        }
                    812:        if (setexit() == 0) {
                    813:                if (preserve()) {
                    814:                        cleanup(1);
                    815:                        ex_exit(0);
                    816:                }
                    817:        }
                    818:        ex_exit(1);
                    819: }
                    820: 
                    821: /*
                    822:  * An interrupt occurred.  Drain any output which
                    823:  * is still in the output buffering pipeline.
                    824:  * Catch interrupts again.  Unless we are in visual
                    825:  * reset the output state (out of -nl mode, e.g).
                    826:  * Then like a normal error (with the \n before Interrupt
                    827:  * suppressed in visual mode).
                    828:  */
                    829: onintr()
                    830: {
                    831: 
                    832: #ifndef CBREAK
                    833:        signal(SIGINT, onintr);
                    834: #else
                    835:        signal(SIGINT, inopen ? vintr : onintr);
                    836: #endif
                    837:        alarm(0);       /* in case we were called from map */
                    838:        draino();
                    839:        if (!inopen) {
                    840:                pstop();
                    841:                setlastchar('\n');
                    842: #ifdef CBREAK
                    843:        }
                    844: #else
                    845:        } else
                    846:                vraw();
                    847: #endif
                    848:        error("\nInterrupt" + inopen);
                    849: }
                    850: 
                    851: /*
                    852:  * If we are interruptible, enable interrupts again.
                    853:  * In some critical sections we turn interrupts off,
                    854:  * but not very often.
                    855:  */
                    856: setrupt()
                    857: {
                    858: 
                    859:        if (ruptible) {
                    860: #ifndef CBREAK
                    861:                signal(SIGINT, onintr);
                    862: #else
                    863:                signal(SIGINT, inopen ? vintr : onintr);
                    864: #endif
                    865: #ifdef SIGTSTP
                    866:                if (dosusp)
                    867:                        signal(SIGTSTP, onsusp);
                    868: #endif
                    869:        }
                    870: }
                    871: 
                    872: preserve()
                    873: {
                    874: 
                    875: #ifdef VMUNIX
                    876:        tflush();
                    877: #endif
                    878:        synctmp();
                    879:        pid = vfork();
                    880:        if (pid < 0)
                    881:                return (0);
                    882:        if (pid == 0) {
                    883:                close(0);
                    884:                dup(tfile);
                    885:                execl(_PATH_EXPRESERVE, "expreserve", (char *) 0);
                    886:                ex_exit(1);
                    887:        }
                    888:        waitfor();
                    889:        if (rpid == pid && status == 0)
                    890:                return (1);
                    891:        return (0);
                    892: }
                    893: 
                    894: #ifndef V6
                    895: ex_exit(i)
                    896:        int i;
                    897: {
                    898: 
                    899: # ifdef TRACE
                    900:        if (trace)
                    901:                fclose(trace);
                    902: # endif
                    903:        _exit(i);
                    904: }
                    905: #endif
                    906: 
                    907: #ifdef SIGTSTP
                    908: /*
                    909:  * We have just gotten a susp.  Suspend and prepare to resume.
                    910:  */
                    911: onsusp()
                    912: {
                    913:        ttymode f;
                    914:        struct winsize win;
                    915: 
                    916:        f = setty(normf);
                    917:        vnfl();
                    918:        putpad(TE);
                    919:        flush();
                    920: 
                    921:        (void) sigsetmask(0);
                    922:        signal(SIGTSTP, SIG_DFL);
                    923:        kill(0, SIGTSTP);
                    924: 
                    925:        /* the pc stops here */
                    926: 
                    927:        signal(SIGTSTP, onsusp);
                    928:        vcontin(0);
                    929:        ignore(setty(f));
                    930:        if (!inopen)
                    931:                error((char *) 0);
                    932:        else {
                    933: #ifdef TIOCGWINSZ
                    934:                if (ioctl(0, TIOCGWINSZ, &win) >= 0)
                    935:                        if (win.ws_row != winsz.ws_row ||
                    936:                            win.ws_col != winsz.ws_col)
                    937:                                winch();
                    938: #endif
                    939:                if (vcnt < 0) {
                    940:                        vcnt = -vcnt;
                    941:                        if (state == VISUAL)
                    942:                                vclear();
                    943:                        else if (state == CRTOPEN)
                    944:                                vcnt = 0;
                    945:                }
                    946:                vdirty(0, LINES);
                    947:                vrepaint(cursor);
                    948:        }
                    949: }
                    950: #endif

unix.superglobalmegacorp.com

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