Annotation of researchv9/cmd/emacs/emacs_vt.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #ifdef ux3
                      3: #include <termio.h>
                      4: #else
                      5: #include <sgtty.h>
                      6: #endif
                      7: /* EMACS_MODES: c !fill */
                      8: char *getenv();
                      9: /* macro definitions */
                     10: 
                     11: #define EOL '\n'
                     12: 
                     13: char *UP;                                      /* cursor up line */
                     14: char *DOWN;
                     15: char *BACK;
                     16: char *FORWARD;
                     17: char *HOME;
                     18: char *CLEAR;
                     19: char *CLREST;
                     20: char *CLINE;
                     21: char *BELL;
                     22: char *CURAD;
                     23: char *TMAP;
                     24: char *SMAP;
                     25: char *NOP;
                     26: char *LOPEN;
                     27: char *LDEL;
                     28: char *INSERTC;
                     29: char *INSERTM;
                     30: char *OSERTC;
                     31: char *INSERTP;
                     32: char *DELC;
                     33: char *SSCROLL;
                     34: char *RSCROLL;
                     35: char *CR;
                     36: char *SCREG;
                     37: char *ULINE;
                     38: char *UEND;
                     39: int EOVER;
                     40: char *SCINIT;
                     41: char *VEXIT;
                     42: char *RELDOWN;
                     43: char *RELUP;
                     44: char *RELFORW;
                     45: char *RELBACK;
                     46: int XBASE;
                     47: int YBASE;
                     48: int SCRWID;
                     49: int SCRNLIN;
                     50: int SCRWRAP;
                     51: int VCOST;
                     52: int SRCADD;
                     53: int MI;
                     54: int IN;
                     55: int DELMODE;
                     56: 
                     57: /* character definitions */
                     58: 
                     59: #define META 0200
                     60: #define MTA(mtach) ('mtach'+0200)      /* make meta char */
                     61: #define ESC 033
                     62: #define NEWLINE 037
                     63: #define RUB 0177
                     64: 
                     65: /* DISPLAY MODE PARAMETERS */
                     66: 
                     67: int WRAPON = 0;                                /* perform ! processing at EOL */
                     68: int INSON = 0;                         /* use INSERTC/DELC */
                     69: 
                     70: /* screen display data */
                     71: 
                     72: char ttobuf[BUFSIZ];
                     73: 
                     74: int drain;
                     75: int mline;
                     76: int mcol;
                     77: int SCRLINES;                          /*  number of lines in window */
                     78: int ECHOL;                             /* line for prompting */
                     79: int MODLN;                             /* line for buffer and file data */
                     80: 
                     81: 
                     82: 
                     83: /* statistics */
                     84: 
                     85: long nmput;                            /* calls to mputc */
                     86: long noutc;                            /* actual characters output */
                     87: int ninch;                             /* number of characters input */
                     88: int ntwrite;                           /* number of terminal writes */
                     89: int nbwrite;                           /* number of buffer writes */
                     90: int nbseek;                            /* number of seeks of buffer */
                     91: int nbread;                            /* number of buffer reads */
                     92: int nmkline;                           /* number of makeline calls */
                     93: 
                     94: extern int errno;
                     95: 
                     96: /* function definitions */
                     97: 
                     98: char *getname();
                     99: /*VARARGS*/ char *execl();
                    100: 
                    101: /* lint definitions */
                    102: 
                    103: #ifdef lint
                    104: #define IGNORE(x) if(x);
                    105: #else
                    106: #define IGNORE(x) (x)
                    107: #endif
                    108: 
                    109: /* emacs display definitions */
                    110: 
                    111: 
                    112: /* EMACS_MODES: c !fill */
                    113: 
                    114: char ldchar;                           /* last clobbered character */
                    115: char ldcol;                            /* collumn of ldchar */
                    116: char osert = 0;                                /* flag indicating insert char mode */
                    117: int acost;                             /* cost of absolute positioning */
                    118: int lUP;                               /* cost of UP */
                    119: int lDOWN;                             /* cost of DOWN */
                    120: int lBAK;                              /* cost of BACK */
                    121: int lCR;
                    122: 
                    123: int psx;
                    124: int psy;
                    125: int saveline;
                    126: int savecol;
                    127: int scrlin;
                    128: int scrcol;
                    129: int ttywarp;                           /* tty warp factor (stty speed) */
                    130: 
                    131: /* display data */
                    132: 
                    133: #define TTYLEN 256                     /* total area for tty data strings */
                    134: char ttystrings[TTYLEN];
                    135: 
                    136: 
                    137: struct sparm {
                    138:        char *t_pname;
                    139:        int *t_padd;
                    140: };
                    141: 
                    142: struct sparm ttydata[] = {
                    143:        "up",(int *) &UP,
                    144:        "do",(int *) &DOWN,
                    145:        "bc",(int *) &BACK,
                    146:        "nd",(int *) &FORWARD,
                    147:        "ho",(int *) &HOME,
                    148:        "cl",(int *) &CLEAR,
                    149:        "cd",(int *) &CLREST,
                    150:        "ce",(int *) &CLINE,
                    151:        "bl",(int *) &BELL,
                    152:        "cm",(int *) &CURAD,
                    153:        "tm",(int *) &TMAP,
                    154:        "tM",(int *) &SMAP,
                    155:        "pc",(int *) &NOP,
                    156:        "al",(int *) &LOPEN,
                    157:        "dl",(int *) &LDEL,
                    158:        "ic",(int *) &INSERTC,
                    159:        "im",(int *) &INSERTM,
                    160:        "ei",(int *) &OSERTC,
                    161:        "ip",(int *) &INSERTP,
                    162:        "dc",(int *) &DELC,
                    163:        "sf",(int *) &SSCROLL,
                    164:        "sr",(int *) &RSCROLL,
                    165:        "cr",(int *) &CR,
                    166:        "cs",(int *) &SCREG,
                    167:        "ul",(int *) &ULINE,
                    168:        "ue",(int *) &UEND,
                    169:        "eo",&EOVER,
                    170:        "vs",(int *) &SCINIT,
                    171:        "ve",(int *) &VEXIT,
                    172:        "bx",&XBASE,
                    173:        "by",&YBASE,
                    174:        "co",&SCRWID,
                    175:        "li",&SCRNLIN,
                    176:        "am",&SCRWRAP,
                    177:        "vc",(int *) &VCOST,
                    178:        "rc",(int *) &SRCADD,
                    179:        "mi",(int *) &MI,
                    180:        "in",(int *) &IN,
                    181:        "dm",&DELMODE,
                    182:        "ru",(int *) &RELUP,
                    183:        "rd",(int *) &RELDOWN,
                    184:        "rl",(int *) &RELFORW,
                    185:        "rr",(int *) &RELBACK,
                    186:        0,0,
                    187: };
                    188: 
                    189: char *endput = "____________________";
                    190: 
                    191: 
                    192: 
                    193: #define SCRCONT '!'
                    194: int TABSTOP = 8;
                    195: 
                    196: #define NSCRLIN 48                     /* max screen lines */
                    197: #define NSCRCOL 128                    /* max screen columns */
                    198: char cmap[NSCRLIN] [NSCRCOL];
                    199: int scrjnk[NSCRLIN];   /* column of last non-white character */
                    200: 
                    201: 
                    202: 
                    203: /* character type table */
                    204: 
                    205: #define PLAIN 0
                    206: #define CONTRL 1
                    207: #define TAB 2
                    208: #define BACKSP 3
                    209: 
                    210: char ctype[128] = {
                    211:        CONTRL, CONTRL, CONTRL, CONTRL, CONTRL, CONTRL, CONTRL, CONTRL,
                    212:        BACKSP, TAB,    CONTRL, CONTRL, CONTRL, CONTRL, CONTRL, CONTRL,
                    213:        CONTRL, CONTRL, CONTRL, CONTRL, CONTRL, CONTRL, CONTRL, CONTRL,
                    214:        CONTRL, CONTRL, CONTRL, CONTRL, CONTRL, CONTRL, CONTRL, CONTRL,
                    215:        PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,
                    216:        PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,
                    217:        PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,
                    218:        PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,
                    219:        PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,
                    220:        PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,
                    221:        PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,
                    222:        PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,
                    223:        PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,
                    224:        PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,
                    225:        PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,
                    226:        PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  PLAIN,  CONTRL,
                    227: };
                    228: 
                    229: 
                    230: /* display heuristics */
                    231: 
                    232: #define CFILL 30                       /* average chars/line */
                    233: #define PATIENCE 2000                  /* number of millisecends of */
                    234:                                        /* output to buffer before */
                    235:                                        /* looking for type ahead */
                    236: 
                    237: 
                    238: /* display macros */
                    239: 
                    240: #define mputc(chr) (((mcol<scrjnk[mline]) && (chr == cmap[mline][mcol]))? mcol++ : mptc(chr))
                    241: 
                    242: /* trace stuff */
                    243: 
                    244: 
                    245: char *termdir = SDIR/terminals/%s";
                    246: 
                    247: 
                    248: /* Terminal I/O modes, sgttyb for before unix 3.0, termio for later */
                    249: 
                    250: int SREGION = 24;
                    251: 
                    252: #ifdef ux3
                    253: struct termio ttyjunk;
                    254: #else
                    255: struct sgttyb ttyjunk;
                    256: #endif
                    257: 
                    258: int ttyerase = '#';
                    259: int ttykill = '@';
                    260: int ttyintr = '';
                    261: int ttyeof = '';
                    262: 
                    263: #define NBAUD 16                       /* number of baud rates */
                    264: char charms[NBAUD]  = {                        /* ms per char in various rates */
                    265:        100,
                    266:        100,                            /* 50 */
                    267:        100,                            /* 75 */
                    268:        100,                            /* 110 */
                    269:        70,                             /* 134 */
                    270:        66,                             /* 150 */
                    271:        50,                             /* 200 */
                    272:        33,                             /* 300 */
                    273:        16,                             /* 600 */
                    274:        8,                              /* 1200 */
                    275:        5,                              /* 1800 */
                    276:        4,                              /* 2400 */
                    277:        2,                              /* 4800 */
                    278:        1,                              /* 9600 */
                    279:        1,                              /* EXTA */
                    280:        1,                              /* EXTB */
                    281: };
                    282:        
                    283: xgo(x,y)
                    284: 
                    285: {
                    286:        ldchar = 0;
                    287:        mline = x;
                    288:        mcol = y;
                    289: }
                    290: 
                    291: 
                    292: /* beep -- obvious */
                    293: 
                    294: beep()
                    295: 
                    296: {
                    297:        PUTS(BELL);                     /* print a bell */
                    298: }
                    299: 
                    300: /* move both the display matrix pointer and the actual display to the
                    301:  * specified line and column */
                    302: 
                    303: mgo(x,y)
                    304: 
                    305: register x,y;
                    306: 
                    307: {
                    308: 
                    309:        sgo(mline = x,mcol = y);
                    310: }
                    311: 
                    312: 
                    313: /* move the display cursor to the specified destination.  sgo attempts
                    314:  * to optimize the movement, using single character or absolute
                    315:  * positioning */
                    316: 
                    317: sgo(x,y)
                    318: 
                    319: register x,y;
                    320: 
                    321: {
                    322:        int mx,my;
                    323:        int xcost;                                              /* cost with all relative movement */
                    324:        int ycost;                                              /* cost with carriage return */
                    325:                                                                        /* acost is cost of absolute positioning */
                    326:        
                    327: /* calculate relative costs of various movements.  cost functions  */
                    328: /* automatically indicate that un-doable motions have infinite cost */
                    329:        
                    330: 
                    331:        
                    332:        
                    333:        /* calculate xcost and ycost */
                    334: 
                    335:        mx = x-scrlin;
                    336:        if (mx<0) {
                    337:                mx = -mx;
                    338:                xcost = mx*lUP;
                    339:        } else xcost = mx*lDOWN;
                    340: 
                    341:        ycost = y + xcost + lCR;
                    342:        
                    343:        my = y-scrcol;
                    344:        if (my<0) {
                    345:                my = -my;
                    346:                xcost +=my*lBAK;
                    347:        } else xcost += my;
                    348: 
                    349: 
                    350:        if (acost < ycost) {
                    351:                if (acost < xcost) {
                    352:                                                                        /* do absolute positioning */
                    353:                        if (CURAD) {    /* have absolute addrs */
                    354:                                if (SRCADD) {
                    355:                                        eprintf(CURAD,x+XBASE,y+YBASE);
                    356:                                } else { 
                    357:                                        eprintf(CURAD,y+YBASE,x+XBASE);
                    358:                                }
                    359:                        } else {        /* have relative addrs */
                    360:                                if (x>scrlin) printf (RELDOWN,mx);
                    361:                                if (x<scrlin) printf (RELUP,mx);
                    362:                                if (y>scrcol) printf (RELFORW,my);
                    363:                                if (y<scrcol) printf (RELBACK,my);
                    364:                        }
                    365:                        scrlin=x;
                    366:                        scrcol=y;
                    367:                        return;
                    368:                }               /* else relative is cheap, do it */
                    369:        } else {
                    370:                if (osert && (MI == 0)) {
                    371:                        unsert();
                    372:                }
                    373:                if (ycost < xcost) {    /* do carriage return processing */
                    374:                        PUTS(CR);               /* carriage return */
                    375:                        scrcol = 0;
                    376:                                                /* fall through to finish with relative motion */
                    377:                }
                    378:        }
                    379: 
                    380:        while (x != scrlin) {
                    381:                if (x < scrlin) {
                    382:                        PUTS(UP);
                    383:                        scrlin--;
                    384:                } else {
                    385:                        PUTS(DOWN);
                    386:                        scrlin++;
                    387:                }
                    388:        }
                    389: 
                    390:        /* now correct row */
                    391: 
                    392:        while (y != scrcol) {
                    393:                if (y < scrcol) {
                    394:                        PUTS(BACK);
                    395:                        scrcol--;
                    396:                } else {
                    397:                        if (FORWARD == NULL)  {
                    398:                                if (osert) {
                    399:                                        unsert();
                    400:                                }
                    401:                                x = cmap[scrlin] [scrcol];
                    402:                                if ((x == 0)|| (scrjnk[scrlin]<=scrcol)) x=cmap[scrlin] [scrcol] = ' ';
                    403:                                putit(x);        /* re-write */
                    404:                        } else {
                    405:                                PUTS(FORWARD);
                    406:                        }
                    407:                        scrcol++;
                    408:                }
                    409:        };
                    410:        return;
                    411: }
                    412: 
                    413: /* unsert -- LEAVE insert character mode */
                    414: 
                    415: unsert()
                    416: {
                    417:        eprintf(OSERTC); /* can't stay inserting */
                    418:        osert = 0;
                    419: }
                    420: 
                    421: /* a simple guide to all of the various putc routines in this program: 
                    422:  * xputc puts a character out, translating control and meta characters
                    423:  * to prefix sequences, and calling sputc to put out the individual
                    424:  * characters.  sputc checks for end of line, and if so wraps to the
                    425:  * next line.  sputc calls mputc to output characters.  mputc updates
                    426:  * the next character in the display to be whaat is put out.  Display
                    427:  * takes place only if the character on the screen is not that called for
                    428:  * already. */
                    429: 
                    430: 
                    431: mptc(c)
                    432: register c;
                    433: {
                    434:        nmput++;                        /* count for stats */
                    435:        if ((c == ' ') && (mcol >= scrjnk[mline])) {
                    436: 
                    437:                cmap[mline] [mcol++] = c;
                    438:                return;
                    439:        }
                    440:        if ((mcol != scrcol) || (mline != scrlin)) sgo(mline,mcol);
                    441:        if (DELC && INSON && (c == cmap [mline] [mcol+1]) && (mcol+3 <scrjnk[mline]) && (ldchar == 0)) {
                    442:                register i;
                    443:                SREGION=scrjnk[mline]-mcol; /* number of char's gobbled */
                    444:                if (DELMODE && (osert == 0)) {
                    445:                        eprintf(INSERTM);
                    446:                        osert++;
                    447:                }
                    448:                eprintf(DELC);  /*clobber next char */
                    449:                for (i = mcol; i <=scrjnk[mline];i++) {
                    450:                        cmap[mline] [i] = cmap[mline] [i+1];
                    451:                }
                    452:                scrjnk[mline]--;
                    453:        } else {
                    454:                if ((INSERTC || INSERTM) && INSON && (c == ldchar) && (mcol == ldcol+1) && (mcol<scrjnk[mline])) {
                    455:                        register i;
                    456:                        if (INSERTM && (osert == 0)) {
                    457:                                eprintf(INSERTM);        /* open space */
                    458:                                osert = 1;
                    459:                        }
                    460:                        if (scrjnk[mline] >SCRWID) scrjnk[mline]--;
                    461:                        for (i = scrjnk[mline]++; i >= mcol;i--) {
                    462:                                cmap[mline] [i+1] = cmap[mline] [i];
                    463:                        }
                    464:                        if (INSERTC) eprintf(INSERTC);
                    465:                        cmap[mline] [mcol] = 0;
                    466:                } else {
                    467:                        if (osert) {
                    468:                                unsert();
                    469:                        }
                    470:                }
                    471:                putit(c);
                    472:                if (osert && INSERTP) eprintf(INSERTP);
                    473:                if (ldchar == 0) ldcol = mcol;          /* remember where it was */
                    474:                ldchar = cmap[mline][mcol]; /* save last clobber */
                    475:                if ((scrcol++ >= SCRWID) && SCRWRAP) {
                    476:                        scrlin++;
                    477:                        scrcol=0;
                    478:                }
                    479:        }
                    480:        cmap[mline] [mcol] = c;
                    481:        while (scrjnk[mline] <mcol) cmap[mline] [scrjnk[mline]++] = ' ';
                    482:        if (++mcol> scrjnk[mline]) scrjnk[mline] = mcol;
                    483: }
                    484: 
                    485: /* getname prompts for a string, using ps, and inputs a string */
                    486: 
                    487: /* rubout and @ can be used to edit the string as enterred, and  causes
                    488:  * a quit, returning no input string
                    489:  * ^Y causes the current buffer name to be brought out
                    490:  */
                    491: #define FNLEN 128
                    492: char fnbuf[FNLEN];
                    493: 
                    494: 
                    495: char *
                    496: getname(ps)
                    497: 
                    498: register char *ps;
                    499: 
                    500: {
                    501:        register i;
                    502:        register char c;
                    503:        char *xp;
                    504: 
                    505:        fnbuf[i=0] = 0; 
                    506:        for (;;) {
                    507:                prompt1("%s%s",ps,fnbuf); /* display prompt */
                    508:                mgo(mline,mcol);
                    509:                c = mgetchar();
                    510:        
                    511:                if ((c == '') || (c == ttyintr)) {
                    512:                        beep();
                    513:                        unprompt();
                    514:                        return(NULL);
                    515:                }
                    516:                if ((c == '
') || (c == '\n')) {
                    517:                        unprompt();
                    518:                        return(fnbuf);
                    519:                }
                    520:                if (c == ttyerase) {
                    521:                        if (i) {
                    522:                                i--;
                    523:                                fnbuf[i] = 0;
                    524:                        } else beep();
                    525:                        continue;
                    526:                }
                    527:                if (c  == ttykill) {
                    528:                        fnbuf[i=0]=0;
                    529:                        continue;
                    530:                }
                    531:                if (c == '') {
                    532:                        c = 0177 & getchar();
                    533:                }
                    534:                fnbuf[i++] = c;
                    535:                if (i >= FNLEN) {
                    536:                        beep();
                    537:                        --i;
                    538:                }
                    539:                fnbuf[i] = 0;
                    540:                continue;
                    541:        }
                    542: }
                    543: 
                    544: /* putout outputs a string (like eprintf) at the current position */
                    545: 
                    546: /* position is advanced one line.  If the position overflows the screen,
                    547:  * -MORE- is printed, and input  is read.  Any character except ^G
                    548:  * continues the display, ^G quits by returning -1 */
                    549: 
                    550: /*VARARGS1*/
                    551: 
                    552: putout(string,arg1,arg2,arg3,arg4,arg5,arg6)
                    553: char *string;
                    554: {
                    555:        if (mline>=SCRLINES) {
                    556:                prompt1("--  MORE --");
                    557:                if ((mgetchar()) == ttykill) return(-1);
                    558:                unprompt();
                    559:                mline=0;                /* TOP */
                    560:        }
                    561:        prompt(mline,string,arg1,arg2,arg3,arg4,arg5,arg6);
                    562:        clrl();
                    563:        mgo(++mline,0);
                    564:        return(0);
                    565: }
                    566: 
                    567: /* put out a string on ECHOL */
                    568: /*VARARGS1*/
                    569: 
                    570: prompt1(string,arg1,arg2,arg3,arg4,arg5)
                    571: char *string;
                    572: {
                    573:        prompt(ECHOL,string,arg1,arg2,arg3,arg4,arg5);
                    574: }
                    575: 
                    576: /* put out a string at a specified line */
                    577: 
                    578: /*VARARGS2*/
                    579: 
                    580: prompt(ecl,string,arg1,arg2,arg3,arg4,arg5,arg6)
                    581: 
                    582: char *string;
                    583: register int ecl;
                    584: 
                    585: {
                    586:        char pbuf[256];
                    587: 
                    588:        if (mline<=SCRLINES) {
                    589:                saveline = mline;
                    590:                savecol = mcol;
                    591:        }
                    592:        mline = ecl;
                    593:        mcol = 0;
                    594:        seprintf(pbuf,string,arg1,arg2,arg3,arg4,arg5,arg6);
                    595:        sputs(pbuf);
                    596:        psx = mline;
                    597:        psy = mcol;
                    598:        clrl();
                    599: }
                    600: 
                    601: /* clear out prompt */
                    602: 
                    603: unprompt()
                    604: 
                    605: {
                    606: 
                    607:        if (mline<=SCRLINES) {          /* if position to save */
                    608:                saveline = mline;
                    609:                savecol = mcol;
                    610:        }
                    611:        mgo(ECHOL,0);
                    612:        clrl();
                    613:        mgo(saveline,savecol);
                    614: }
                    615: 
                    616: 
                    617: /* return to the position saved before the last prompt */
                    618: 
                    619: goback()
                    620: 
                    621: {
                    622:        mgo(saveline,savecol);
                    623: }
                    624: 
                    625: /* put one character on the screen checking for end of screen line */
                    626: 
                    627: sputc(c)
                    628: 
                    629: register c;
                    630: {
                    631: 
                    632:        register i;
                    633: 
                    634:        if (mcol == SCRWID) {
                    635:                if (WRAPON) {
                    636:                        if (mline>=NSCRLIN-1) {
                    637:                                mline--; /* don't run overboard */
                    638:                        } else {
                    639:                                mputc(SCRCONT);
                    640:                                mline++;
                    641:                        }
                    642:                        ldchar = 0;             /* reset ldchar */
                    643:                        mcol = 0;
                    644:                } else {
                    645:                        mputc(c);
                    646:                        mline++;
                    647:                        mcol=0;
                    648:                        ldchar=0;
                    649:                        return;
                    650:                }
                    651:        }
                    652:        mputc(c);
                    653: }
                    654: 
                    655: /* put one character in the display, checking for control and meta chars. */
                    656: 
                    657: xputc(c)
                    658: register c;
                    659: {
                    660:        register i;
                    661: 
                    662:        c &= 0377;
                    663:        if (c & META) {
                    664:                sputc('M');
                    665:                sputc('-');
                    666:                c-= META;
                    667:        }
                    668:        switch(ctype[c]) {
                    669:                char oc;
                    670:                case PLAIN:
                    671:                        if ((!ULINE)||(!EOVER)) {
                    672:                                sputc(c);
                    673:                                return;
                    674:                        }
                    675:                        if (scrjnk[mline] <= mcol) {
                    676:                                sputc(c);
                    677:                                return;
                    678:                        }
                    679:                        oc = cmap[mline][mcol] & 0177 ;
                    680:                        if ((oc == '_') && ((c & 0177) != ' ') 
                    681:                        && ((c & 0177) != '_')) {
                    682:                                sputc(0200 | c);
                    683:                                return;
                    684:                        }
                    685:                        sputc(c);
                    686:                        return;
                    687:                case BACKSP:
                    688:                        if ((ULINE)&&(EOVER)) {
                    689:                                if (mcol != 0) xgo(mline,mcol-1);
                    690:                                return;
                    691:                        }
                    692:                        /* NO BREAK HERE */
                    693:                case CONTRL:
                    694:                        sputc('^');
                    695:                        sputc(c^0100);
                    696:                        return;
                    697: 
                    698:                case TAB:
                    699:                        i = TABSTOP-(mcol%TABSTOP);
                    700:                        while (i--) sputc(' ');
                    701:                        return;
                    702: 
                    703:                }
                    704: }
                    705: 
                    706: 
                    707: 
                    708: /* clear the rest of the line, checking to see if the line previously
                    709:  * displayed corresponds to the one displayed here now */
                    710: 
                    711: clrl()
                    712: 
                    713: {
                    714:        register x;
                    715:        register y;
                    716:        register z;
                    717:        int xline;
                    718:        int xcol;
                    719: 
                    720:        ldchar = 0;                     /* wipe out last char */
                    721:        x = mline;
                    722:        z = mcol;
                    723:        y = scrjnk[mline] - mcol;
                    724:        if (y > 0) {
                    725:                sgo(mline,mcol);                        /* go for real */
                    726:                if (CLINE) {
                    727:                        SREGION=y;      /* Number of characters cleared */
                    728:                        eprintf(CLINE);
                    729:                } else {
                    730:                        xline = mline;
                    731:                        xcol = mcol;
                    732:                        while (y--) mputc (' ');
                    733:                        mgo(xline,xcol);
                    734:                }
                    735:                scrjnk[x] = z;
                    736:        }
                    737: }
                    738: 
                    739: /* put a string on the screen, translating control and meta */
                    740: 
                    741: sputs(xp)
                    742: register char *xp;
                    743: {
                    744:        register c;
                    745:        while (c= *xp++) {
                    746:                if (c == NEWLINE) {
                    747:                        if (mline < NSCRLIN) mline++; /* don't overflow */
                    748:                        mcol = 0;
                    749:                        xputc(' ');
                    750:                } else xputc(c);
                    751:        }
                    752: }
                    753: 
                    754: clear()
                    755: 
                    756: {
                    757:        register int i;
                    758:        
                    759:        eprintf(CLEAR);
                    760:        for (i = 0; i < NSCRLIN; i++) scrjnk[i] = 0;
                    761:        scrlin = scrcol = mline = mcol = 0;
                    762: }
                    763: 
                    764: 
                    765: /* Refresh the screen.  Clears and then restores what we think is there */
                    766: 
                    767: rfrsh()
                    768: {
                    769:        register xline;
                    770:        register xcol;
                    771:        
                    772:        eprintf(CLEAR);
                    773:        scrlin=scrcol=0;
                    774:        
                    775:        for (xline = 0; xline < SCRNLIN; xline++) {
                    776:                for (xcol = 0; xcol < scrjnk[xline]; xcol++) {
                    777:                        if (cmap[xline][xcol]) {
                    778:                                sgo(xline,xcol);
                    779:                                putit(cmap[xline][xcol]);
                    780:                                if ((scrcol++ >= SCRWID) && SCRWRAP) {
                    781:                                        scrlin++;
                    782:                                        scrcol=0;
                    783:                                }
                    784:                        }
                    785:                }
                    786:        }
                    787:        ldchar = 0;
                    788: }
                    789: 
                    790: sdelay(ms)
                    791: 
                    792: register int ms;                       /* milliseconds of delay */
                    793: {
                    794:        register i;
                    795:        for (i = 0; i < ms;) {
                    796:                PUTS(NOP);              /* idle */
                    797:                i+=ttywarp;             /* milliseconds/character */
                    798:        }
                    799: }
                    800: 
                    801: ttype()                /* set terminal type */
                    802: 
                    803: {
                    804: register char *mp;
                    805: 
                    806:        mp = getname("Terminal Type? ");
                    807:        if (mp == NULL) return;
                    808:        sttype(mp);
                    809: }
                    810: 
                    811: int ttyptr = 0;
                    812: 
                    813: /* terminal description file parser: */
                    814: 
                    815: /* terminal description file contains lines with 
                    816: 
                    817:        parameter=data
                    818:        
                    819:  * where data is either a number of a string */
                    820: 
                    821: 
                    822: ttyparse(mp)
                    823: char *mp;
                    824: 
                    825: {
                    826:        register FILE *file;
                    827:        char xbuf[128];
                    828:        char optbuf[128];
                    829:        register char *cp;
                    830:        register int c;
                    831:        struct sparm *parmp;
                    832:        
                    833:        int parm;
                    834:        
                    835:        
                    836: /* find the terminal file and open it */
                    837:        
                    838:        seprintf(xbuf,termdir,mp);      /* terminal file */
                    839:        
                    840:        file = fopen(xbuf,"r");
                    841:        
                    842:        if (file == NULL) file = fopen(mp,"r");
                    843:        
                    844:        if (file == NULL) {
                    845:                eprintf ("Can't use terminal type %s\n", mp);
                    846:                return(0);
                    847:        }
                    848:        
                    849:        /* first find what option we are setting */
                    850: 
                    851: nextparm: cp = optbuf;
                    852:        while ((c = getc(file)) != '=') {
                    853:                if (c == '\n') goto nextparm; /* comment line */
                    854:                if (c == EOF) {
                    855:                        fclose(file);
                    856:                        return(1); /* abort during option scan */
                    857:                }
                    858:                *cp++=c;
                    859:        }
                    860:        *cp = 0;
                    861:        
                    862: /* look up parameter in parameter table */
                    863:        
                    864:        for (parmp = ttydata; parmp->t_pname; parmp++) {
                    865:                if ((optbuf[0]==parmp->t_pname[0])&& (optbuf[1]==parmp->t_pname[1])) {
                    866:                        
                    867:                        c = getc(file);
                    868:                        if ((c >= '0') && (c <= '9')) {
                    869:                                parm = 0;
                    870:                                while ((c >= '0') && (c <= '9')) {
                    871:                                        parm = 10*parm + (c-'0');
                    872:                                        c = getc(file);
                    873:                                }
                    874:                                *(parmp->t_padd) = parm;
                    875:                                if (c != EOF) goto nextparm;
                    876:                                fclose(file);
                    877:                                return(1);
                    878:                        }
                    879:                        *(parmp->t_padd) = ((int) &ttystrings[ttyptr]);
                    880:                        
                    881:                        while ((c != EOF) && (c != EOL)) {
                    882:                                if (c == '\\') {
                    883:                                        c = getc(file);
                    884:                                        if (c == 'n') c = '\n';
                    885:                                }
                    886:                                
                    887:                                ttystrings[ttyptr++] = c;
                    888:                                c = getc(file);
                    889:                        }
                    890:                        ttystrings[ttyptr++] = 0;
                    891:                        if (c != EOF) goto nextparm;
                    892:                }
                    893:        }
                    894:        goto nextparm;
                    895: }
                    896: 
                    897: PUTS(string)
                    898: 
                    899: char *string;
                    900: 
                    901: {
                    902:        if (!drain) while(*string) putchar(0177 & *string++);
                    903: }
                    904: sttype(mp)
                    905: register char *mp;
                    906: 
                    907: {
                    908:        register struct sparm *parmp;
                    909:        
                    910: /* First, initialize the tty data */
                    911:        
                    912: 
                    913: 
                    914:        ttyptr = 0;
                    915:        for (parmp = ttydata; parmp->t_pname; parmp++) {
                    916:                *(parmp->t_padd) = 0;
                    917:        }
                    918:        SCRLINES=20;
                    919:        SCRWID=80;                      /* so we won't bomb */
                    920:        
                    921:        if (ttyparse(mp)) {
                    922:  
                    923:                SCRWID--;
                    924: 
                    925:                if (SCRNLIN>NSCRLIN) {
                    926:                        SCRNLIN=NSCRLIN;
                    927:                }
                    928:                if (SCRWID>NSCRCOL-1) {
                    929:                        SCRWID=NSCRCOL-1;
                    930:                }
                    931:                if (VCOST == 0) VCOST = 1;
                    932:                SCRLINES = SCRNLIN-4;
                    933:                ECHOL = SCRNLIN-1;
                    934:                MODLN = SCRNLIN-3;
                    935: 
                    936:                if (CURAD) {
                    937:                        acost = dcost(CURAD);
                    938:                } else {
                    939:                        acost = dcost(RELUP)+dcost(RELFORW);
                    940:                }
                    941:                lUP = dcost(UP);
                    942:                lDOWN = dcost(DOWN);
                    943:                lBAK = dcost(BACK);
                    944:                lCR = dcost(CR);
                    945:                if (OSERTC && (INSERTM == 0)) {
                    946:                        INSERTM=INSERTC;                /* old style insert modes */
                    947:                        INSERTC=0;
                    948:                }
                    949:                if (SCREG) LOPEN = SCREG; /* make sure we use SCREG */
                    950:                if ((NOP == NULL) || (*NOP == 0)) NOP = "\200"; /* null pads get lost */
                    951: 
                    952:                if (SCINIT) {
                    953:                        eprintf(SCINIT); /* initialize screen */
                    954:                }
                    955:                clear();
                    956:        }
                    957: }
                    958: 
                    959: /* dcost -- calculate display cost of a string */
                    960: 
                    961: dcost(sp)
                    962: register char *sp;
                    963: {
                    964:        register int dc;
                    965:        
                    966:        if (sp == NULL) return(1000); /* infinite cost for missing capability */
                    967:        
                    968:        dc = 0;
                    969:        while (*sp) {
                    970:                if (*sp++ != '%') dc++;
                    971:        }
                    972:        return(dc);
                    973: }
                    974: 
                    975: /* yes or no question */
                    976: /*VARARGS1*/
                    977: int
                    978: gyn(string,arg1,arg2,arg3)
                    979: 
                    980: char *string;
                    981: char *arg1;
                    982: char *arg2;
                    983: char *arg3;
                    984: {
                    985:        register char c;
                    986:        
                    987:        while (1) {
                    988:                prompt(ECHOL,string,arg1,arg2,arg3);
                    989:                sgo(mline,mcol);
                    990:                c = mgetchar();
                    991:                switch(c) {
                    992:                        
                    993:                case 'y':
                    994:                case 'Y':
                    995:                case ' ':
                    996:                        return(1);
                    997:                case '':       /* This is necessary to insure exit */
                    998:                case 'n':
                    999:                case 'N':
                   1000:                case '':
                   1001:                        return(0);
                   1002:                case '':
                   1003:                        return(-1);
                   1004:                default:
                   1005:                        prompt(ECHOL-1,"y for yes, n for no, ^G to quit");
                   1006:                }
                   1007:        }
                   1008: };
                   1009: 
                   1010: /* mtop -- move to top of display for message output */
                   1011: 
                   1012: mtop()
                   1013: {
                   1014:        mgo(0,0);                       /* for messages */
                   1015: }
                   1016:        
                   1017: uncook()
                   1018: {
                   1019: 
                   1020: /* UNIX 3 code thanks to J. Langer and M. Plotnick */
                   1021: 
                   1022: #ifdef ux3
                   1023:        struct termio nttyjunk;
                   1024: 
                   1025:        ioctl(1, TCGETA, &ttyjunk);
                   1026:        nttyjunk=ttyjunk;
                   1027: 
                   1028: #ifdef u370
                   1029: 
                   1030:        nttyjunk.c_iflag |= (BRKINT|ISTRIP|IGNPAR);
                   1031:        nttyjunk.c_iflag &= 
                   1032:                ~(IGNBRK|IGNPAR|PARMRK|IXON|INLCR|IGNCR|ICRNL|INPCK);
                   1033:        /* accept break, no crnl mapping, no ^S^Q */ 
                   1034:        nttyjunk.c_oflag = 0;           /* no delays, no crlf mapping */
                   1035:        nttyjunk.c_cflag |= CS8 ;
                   1036:        nttyjunk.c_lflag &= ~(ISIG|ECHO|ICANON); /* no echo, signals,
                   1037:                                            or erase/kill processing */
                   1038: #else
                   1039:        nttyjunk.c_iflag |= (BRKINT|ISTRIP);
                   1040:        nttyjunk.c_iflag &= ~(IGNBRK|PARMRK|INLCR|ICRNL|IGNCR|IXON|IXOFF);
                   1041:        /* accept break, no crnl mapping, no ^S^Q */ 
                   1042:        nttyjunk.c_oflag = 0;           /* no delays, no crlf mapping */
                   1043:        nttyjunk.c_lflag &= ~(ISIG|ECHO|ICANON); /* no echo, signals,
                   1044:                                            or erase/kill processing */
                   1045: #endif
                   1046:        nttyjunk.c_cc[VMIN] =  1;       /* return after every character read */
                   1047:        nttyjunk.c_cc[VTIME] = 1;
                   1048:        ttywarp = charms[ttyjunk.c_cflag&CBAUD]; /* milliseconds for character */
                   1049: 
                   1050:        ioctl(1, TCSETAW, &nttyjunk);
                   1051:        ioctl(1, TCXONC,1);             /* Force tty back on */
                   1052:        
                   1053: #else
                   1054: 
                   1055:        struct sgttyb nttyjunk;
                   1056:        
                   1057:        gtty (1,&ttyjunk);
                   1058:        nttyjunk=ttyjunk;
                   1059:        nttyjunk.sg_flags &= (~ECHO);   /* it was so SIMPLE in the old days */
                   1060:        nttyjunk.sg_flags |= (RAW);
                   1061:        ttywarp = charms[ttyjunk.sg_ospeed]; /* milliseconds for char */
                   1062:        stty(1,&nttyjunk);
                   1063: #endif
                   1064: 
                   1065: #ifndef RT
                   1066:        ttyerase =      ttyjunk.c_cc[VERASE];
                   1067:        ttykill =       ttyjunk.c_cc[VKILL];
                   1068:        ttyeof =        ttyjunk.c_cc[VEOF];
                   1069:        ttyintr =       ttyjunk.c_cc[VINTR];
                   1070: #else
                   1071:        ttyerase =      ttyjunk.sg_erase;
                   1072:        ttykill =       ttyjunk.sg_kill;
                   1073:        ttyeof =        '\004';
                   1074:        ttyintr =       '';
                   1075: #endif
                   1076:        if (VEXIT) eprintf(SCINIT); /* RE-init terminal */
                   1077: }
                   1078: 
                   1079: /* out of raw mode */
                   1080: 
                   1081: cook()
                   1082: {
                   1083:        if (VEXIT) eprintf(VEXIT);
                   1084:        fflush(stdout);                 /* force output */
                   1085: #ifdef ux3
                   1086:        ioctl(1,TCSETAW, &ttyjunk);
                   1087:        ioctl(1, TCXONC,1);             /* Force tty back on */
                   1088: #else
                   1089:        stty(1,&ttyjunk);
                   1090: #endif
                   1091: }
                   1092: 
                   1093: 
                   1094: /*VARARGS2*/
                   1095: 
                   1096: char *
                   1097: nscan(stptr,ret)
                   1098: 
                   1099: register char *stptr;
                   1100: register int *ret;
                   1101: {
                   1102:        register c;
                   1103: 
                   1104:        *ret = 0;
                   1105:        while (((c = *stptr)>='0') && (c <= '9')) {
                   1106:                stptr++;
                   1107:                *ret = *ret*10+(c-'0');
                   1108:        }
                   1109:        return(stptr);
                   1110: }
                   1111: 
                   1112: 
                   1113: char *
                   1114: strcpy(cp,cp1)
                   1115: 
                   1116: register char *cp;
                   1117: register char *cp1;
                   1118: {
                   1119:        while (*cp++ = *cp1++);
                   1120:        return(cp-1);
                   1121: }
                   1122: 
                   1123: seprintf(string,fmt, x1)
                   1124: register char *string;
                   1125: register char *fmt;
                   1126: unsigned x1;
                   1127: {
                   1128:        int c;
                   1129:        int width;
                   1130:        register unsigned int *adx;
                   1131:        extern char *strcpy();
                   1132:        
                   1133:        adx = &x1;
                   1134: loop:
                   1135:        while((c = *fmt++) != '%') {
                   1136:                *string++ = c;
                   1137:                if(c == '\0') {
                   1138:                        return;
                   1139:                }
                   1140:        }
                   1141:        width = 0;
                   1142:        c = *fmt++;
                   1143:        if ((c >= '0') && (c <= '9')) {
                   1144:                fmt = nscan(fmt-1,&width);
                   1145:                c = *fmt++;
                   1146:        }
                   1147:        
                   1148:        switch(c) {
                   1149:        case 'd':
                   1150:        case 'D':
                   1151:        case 'o':
                   1152:        case 'O':
                   1153:                {
                   1154:                        register int b;
                   1155:                        long n;
                   1156:                        long n1;
                   1157:                        register int i;
                   1158:                        char dstack[20];
                   1159: 
                   1160:                        b = (((c=='o') || (c == 'O'))? 8: 10); /* number base */
                   1161:                        if ((c == 'o') || (c == 'd')) {
                   1162:                                n = (long) (*adx);
                   1163:                                if (n > 32768L) n = n-65536L; /* sign correction */
                   1164:                        } else {
                   1165:                                n = *((long *) adx);
                   1166:                                adx += ((sizeof(n)-sizeof(i))/sizeof(i));
                   1167:                        }
                   1168:                        i = 0;
                   1169:                        if (n < 0) {
                   1170:                                n = -n;
                   1171:                                *string++ = '-';
                   1172:                        }
                   1173:                        
                   1174:                        do {
                   1175:                                n1 = n/b;
                   1176:                                dstack[i++] = (short) (n-(n1*b));
                   1177:                                n = n1;
                   1178:                        } while (n != 0);       /* figure number */
                   1179:                        if ((b == 8) && ((i !=1 ) || (dstack[0] != 0))) dstack[i++]=0;
                   1180:                        while (i<width) dstack[i++] = 0;
                   1181:                        while (i > 0) *string++ =(dstack[--i] + '0');   /* print number */
                   1182:                        }
                   1183:                break;
                   1184:        case 'P':
                   1185:                width *= SREGION;
                   1186:                                        /* Fall through */
                   1187:        case 'p':
                   1188:                while (width > 0) {
                   1189:                        *string++ = *NOP;
                   1190:                        width -= ttywarp;
                   1191:                }
                   1192:                adx--;
                   1193:                break;
                   1194:        case 's':
                   1195:                string = strcpy(string,(char *)*adx);
                   1196:                break;
                   1197:        case 'm':
                   1198:        case 'M':
                   1199:                {
                   1200:                        char *cp;
                   1201:                        if (c=='m') {
                   1202:                                cp = &TMAP[width * (*adx)];
                   1203:                        } else {
                   1204:                                cp = &SMAP[width * (*adx)];
                   1205:                        }
                   1206:                        for (c = 0; c < width; c++) {
                   1207:                                if (*cp) *string++ = *cp++;
                   1208:                        }
                   1209:                }
                   1210:                break;
                   1211:        case 'c':
                   1212:                c = *adx;
                   1213:                if (c) {
                   1214:                        *string++ = c;
                   1215:                } else {
                   1216:                        *string++ = '^';
                   1217:                        *string++ = '@'; /* punt */
                   1218:                }
                   1219:                break;
                   1220:        case '%':
                   1221:                *string++ ='%';
                   1222:                adx--;
                   1223:                break;
                   1224:        default:
                   1225:                break;
                   1226:        }
                   1227:        adx++;
                   1228:        goto loop;
                   1229: }
                   1230: 
                   1231: mgetchar()
                   1232: {
                   1233:        fflush(stdout);                 /* force output */
                   1234:        return(0177 & getchar());
                   1235: }
                   1236: 
                   1237: /*VARARGS1*/
                   1238: 
                   1239: eprintf(string,a1,a2,a3,a4,a5,a6,a7)
                   1240: 
                   1241: register char *string;
                   1242: 
                   1243: {
                   1244:        char pbuf[1024];
                   1245:        seprintf(pbuf,string,a1,a2,a3,a4,a5,a6,a7);
                   1246:        PUTS(pbuf);
                   1247: }
                   1248: 
                   1249: 
                   1250: 
                   1251: xprintf(sp,ap1,ap2,ap3,ap4,ap5,ap6)
                   1252: register char *sp;
                   1253: {
                   1254:        char sbuf[0400];                /* buffer */
                   1255:        register c;
                   1256:        int x;
                   1257:        
                   1258: 
                   1259:        sprintf(sbuf,sp,ap1,ap2,ap3,ap4,ap5,ap6);
                   1260:        sp = sbuf;
                   1261:        while (c = *sp++) {
                   1262:                if (c == '\n') {
                   1263:                        clrl();
                   1264:                        if (++mline >= ECHOL) {
                   1265:                                mline=0;
                   1266:                        }
                   1267:                        mcol=0;
                   1268:                } else {
                   1269:                        xputc(c);
                   1270:                }
                   1271:        }
                   1272: }
                   1273: 
                   1274: die(arg)
                   1275: int arg;
                   1276: {
                   1277:        mgo(SCRNLIN-1,0);
                   1278:        clrl();
                   1279:        cook();
                   1280:        if (arg) abort(arg);
                   1281:        else exit(0);
                   1282: }
                   1283: ttystart()
                   1284: {
                   1285:        int i;
                   1286:        char *tp;
                   1287:        
                   1288:        setbuf(stdout,ttobuf);
                   1289: 
                   1290:        uncook();
                   1291:        for (i = 0; i < 16; i++) {
                   1292:                signal(i,die);
                   1293:        }
                   1294:        tp = getenv("TERM");
                   1295:        if (tp == NULL) ttype();
                   1296:        else sttype(tp);
                   1297: }
                   1298: 
                   1299: insrtc(c)
                   1300: int c;
                   1301: {
                   1302:        if (INSERTC == NULL) return(0);
                   1303:        INSON = 1;
                   1304:        ldchar = c;
                   1305:        ldcol = mcol-1;
                   1306:        mputc(c);
                   1307:        INSON = 0;
                   1308:        return(1);
                   1309: }
                   1310: delc()
                   1311: {
                   1312:        register i;
                   1313: 
                   1314:        if (DELC == NULL) return(0);
                   1315:        SREGION=scrjnk[mline]-mcol; /* number of char's gobbled */
                   1316:        if (DELMODE && (osert == 0)) {
                   1317:                eprintf(INSERTM);
                   1318:                osert++;
                   1319:        }
                   1320:        eprintf(DELC);  /*clobber next char */
                   1321:        for (i = mcol; i <=scrjnk[mline];i++) {
                   1322:                cmap[mline] [i] = cmap[mline] [i+1];
                   1323:        }
                   1324:        scrjnk[mline]--;
                   1325:        return(1);
                   1326: }
                   1327:        
                   1328: /* adjust vertical position of line -- open (or close) lines on */
                   1329: /* the screen  argument is the number of lines to add (or drop). */
                   1330: 
                   1331: vadjust(xline,tline,x)
                   1332: 
                   1333: register x;
                   1334: int xline;
                   1335: int tline;
                   1336: {
                   1337:        register i;
                   1338:        register j;
                   1339:        int oldx;
                   1340: 
                   1341:        if (LOPEN == NULL) return(0);
                   1342:        
                   1343:        oldx = xline;
                   1344:        
                   1345:        if (x<0) {
                   1346:                x = -x;
                   1347:                i = 1;
                   1348:        } else i = 0;
                   1349:        SREGION=tline-oldx;             /* effected region */
                   1350:        if (i) {                        /* if deleting lines */
                   1351:                sgo(xline,0);
                   1352:                
                   1353:                if (SCREG) {            /*if vt100 stype scrolling */
                   1354:                        eprintf(SCREG,oldx+XBASE,tline+XBASE); /*define region*/
                   1355:                        scrlin = scrcol = 0;
                   1356:                        sgo(tline,0);
                   1357:                        for (i = 0; i < x; i ++) {
                   1358:                                eprintf(SSCROLL);
                   1359:                        }
                   1360:                        eprintf(SCREG,XBASE,SCRNLIN);
                   1361:                        scrlin = scrcol = 0;
                   1362:                } else {
                   1363:                        for (i = 0; i < x; i++) {
                   1364:                                eprintf(LDEL);
                   1365:                        }
                   1366:                        sgo(tline-x+1,0);
                   1367:                        for (i = 0; i < x; i++) {
                   1368:                                eprintf(LOPEN);
                   1369:                        }
                   1370:                }
                   1371:                sgo(oldx,0);
                   1372:                vshift (oldx,tline,x);
                   1373:        } else {
                   1374:                if (SCREG) {            /* if vt100 style scrolling */
                   1375: 
                   1376:                        eprintf(SCREG,oldx+XBASE,tline+XBASE); /*define region */
                   1377:                        scrlin = scrcol = 0; /* vt100 dies */
                   1378:                        sgo(xline,0);
                   1379:                        for (i = 0; i < x; i ++) {
                   1380:                                eprintf(RSCROLL);
                   1381:                        }
                   1382:                        eprintf(SCREG,XBASE,SCRNLIN);
                   1383:                        scrlin = scrcol = 0;
                   1384:                } else {
                   1385:                        sgo(tline+1-x,0);
                   1386:                        for (i = 0; i < x;i++) eprintf(LDEL);
                   1387:                        sgo(oldx,0);
                   1388:                        for (i = 0; i < x; i++) eprintf(LOPEN);
                   1389:                }
                   1390:                mgo(oldx,0);
                   1391:                
                   1392:                vshift(oldx,tline,-x);
                   1393:        }
                   1394:        return(1);
                   1395: }
                   1396: 
                   1397: 
                   1398: /* sscroll -- try to fix display by scrolling */
                   1399: 
                   1400: sscroll(x)
                   1401: 
                   1402: register int x;
                   1403: 
                   1404: {
                   1405:        register int i;
                   1406: 
                   1407:        
                   1408:        if (SSCROLL == NULL) return(0);
                   1409: 
                   1410: 
                   1411:        sgo(SCRNLIN-1,0);                       /* to bottom */
                   1412:        SREGION=SCRNLIN;                        /* number of lines effected */
                   1413:        for (i = 0; i < x; i++) {
                   1414:                eprintf(SSCROLL); /* scroll screen */
                   1415:        }
                   1416:        vshift (0,SCRNLIN-1,x);
                   1417: }
                   1418: 
                   1419: /* vshift -- shift the display image from top to bottom (inclusive) by x */
                   1420: 
                   1421: 
                   1422: vshift(top,bottom,x)
                   1423: 
                   1424: int top;
                   1425: int bottom;
                   1426: int x;
                   1427: 
                   1428: {
                   1429:        register i;
                   1430:        register j;
                   1431:        char *cp1;
                   1432:        char *cp2;
                   1433:        int *jnkptr;
                   1434:        int start;
                   1435:        int stop;
                   1436:        register int off;
                   1437:        
                   1438:        if (x > 0) {
                   1439:                off = 1;
                   1440:                start = top;
                   1441:                stop = bottom+1;
                   1442:        } else {
                   1443:                off = -1;
                   1444:                start = bottom;
                   1445:                stop = top-1;
                   1446:        }
                   1447:        for (i = start,jnkptr = scrjnk+i; i != stop-x; i+=off,jnkptr+=off) {
                   1448:                *jnkptr = *(jnkptr+x);
                   1449:                cp1 = cmap[i];
                   1450:                cp2 = cmap[i+x];
                   1451:                for (j = 0; j < *jnkptr; j++) {
                   1452:                        *cp1++ = *cp2++;
                   1453:                }
                   1454:        }
                   1455:        while (i != stop) {
                   1456:                if (off > 0) {
                   1457:                        *jnkptr++ = 0;
                   1458:                        i++;
                   1459:                } else {
                   1460:                        *jnkptr-- = 0;
                   1461:                        i--;
                   1462:                }
                   1463:        }
                   1464: }
                   1465: 
                   1466: 
                   1467: /* print an underscored character.  */
                   1468: 
                   1469: pu(c)
                   1470: register char c;
                   1471: {
                   1472:        register oc;
                   1473:        c &= 0177;
                   1474:        if ((c == 0)||(c == 040)) {
                   1475:                                        /* bare underscore */
                   1476:                        putchar('_');
                   1477:                        return;         /* just put out the underscore */
                   1478:        }
                   1479:        if (UEND == 0) {
                   1480:                eprintf(ULINE,c);
                   1481:        } else {
                   1482:                eprintf(ULINE); /* enter "underscore mode" */
                   1483:                putchar(c);
                   1484:                eprintf(UEND);
                   1485:        }
                   1486: }
                   1487: 
                   1488: putit(c)
                   1489: char c;
                   1490: {
                   1491:        if (drain) return;
                   1492:        if (c & 0200) {
                   1493:                pu(c);
                   1494:                return;
                   1495:        } 
                   1496:        putchar(0177 & c);
                   1497: }

unix.superglobalmegacorp.com

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