Annotation of 43BSDTahoe/new/jove/screen.c, revision 1.1

1.1     ! root        1: /***************************************************************************
        !             2:  * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne.  JOVE *
        !             3:  * is provided to you without charge, and with no warranty.  You may give  *
        !             4:  * away copies of JOVE, including sources, provided that this notice is    *
        !             5:  * included in all the files.                                              *
        !             6:  ***************************************************************************/
        !             7: 
        !             8: #include "jove.h"
        !             9: #include "io.h"
        !            10: #include "ctype.h"
        !            11: #include "termcap.h"
        !            12: 
        !            13: #ifdef IBMPC
        !            14: 
        !            15: /* here come the actual emulation routines     */
        !            16: 
        !            17: #include <dos.h>
        !            18: #include <conio.h>
        !            19: 
        !            20: #define BYTE   unsigned char
        !            21: #define WORD   unsigned int
        !            22: 
        !            23: #ifdef MAC
        !            24: #      undef private
        !            25: #      define private
        !            26: #endif
        !            27: 
        !            28: #ifdef LINT_ARGS
        !            29: private BYTE near get_mode(void);
        !            30: 
        !            31: private WORD
        !            32:        near cur_page(void),
        !            33:        near get_cur(void);
        !            34: 
        !            35: private void
        !            36:        near ch_out(BYTE, BYTE),
        !            37:        near clr_eop(void),
        !            38:        near cur_advance(void),
        !            39:        near cur_down(void),
        !            40:        near cur_left(void),
        !            41:        near cur_right(void),
        !            42:        near cur_up(void),
        !            43:        near line_feed(void),
        !            44:        near normfun(char),
        !            45:        near scr_win(int, BYTE, BYTE, BYTE, BYTE),
        !            46:        near set_cur(WORD),
        !            47:        near set_mode(BYTE),
        !            48:        near wherexy(BYTE *, BYTE *);
        !            49: #else
        !            50: private BYTE near get_mode();
        !            51: 
        !            52: private WORD
        !            53:        near cur_page(),
        !            54:        near get_cur();
        !            55: 
        !            56: private void
        !            57:        near ch_out(),
        !            58:        near clr_eop(),
        !            59:        near cur_advance(),
        !            60:        near cur_down(),
        !            61:        near cur_left(),
        !            62:        near cur_right(),
        !            63:        near cur_up(),
        !            64:        near line_feed(),
        !            65:        near normfun(),
        !            66:        near scr_win(),
        !            67:        near set_cur(),
        !            68:        near set_mode(),
        !            69:        near wherexy();
        !            70: #endif /* LINT_ARGS */
        !            71: 
        !            72: #ifdef MAC
        !            73: #      undef private
        !            74: #      define private static
        !            75: #endif
        !            76: 
        !            77: #define VIDEO   0x10
        !            78: 
        !            79: #define intr(n, r)     int86(n, r, r);
        !            80: 
        !            81: BYTE CHPL=80, 
        !            82:      LPP=25, 
        !            83:      CUR_PAGE=0, 
        !            84:      C_ATTR = 0x07,
        !            85:      C_X=0, 
        !            86:      C_Y=0;
        !            87: 
        !            88: int Fgcolor = 7,
        !            89:     Bgcolor = 0,
        !            90:        Mdcolor = 0;
        !            91:     
        !            92: void setcolor(fg, bg)
        !            93: BYTE fg, bg;
        !            94: {
        !            95:    C_ATTR = ((bg&0xf)<<4)|(fg&0xf);
        !            96: }   
        !            97: 
        !            98: private
        !            99: WORD near cur_page()
        !           100: {
        !           101:    union REGS vr;
        !           102: 
        !           103:    vr.h.ah = 0x0f;
        !           104:    intr(VIDEO, &vr);
        !           105:    return(vr.h.bh);
        !           106: }
        !           107:    
        !           108: private
        !           109: void near set_cur(xy)
        !           110: WORD xy;
        !           111: {
        !           112:    union REGS vr;
        !           113:    
        !           114:    vr.h.bh = CUR_PAGE;
        !           115:    vr.h.ah = 0x02;
        !           116:    vr.x.dx = xy;
        !           117:    intr(VIDEO, &vr);
        !           118: }
        !           119: 
        !           120: private
        !           121: WORD near get_cur()
        !           122: {
        !           123:    union REGS vr;
        !           124: 
        !           125:    vr.h.bh = CUR_PAGE;
        !           126:    vr.h.ah = 0x03;
        !           127:    intr(VIDEO, &vr);
        !           128:    return (vr.x.dx);
        !           129: }                  
        !           130:  
        !           131: private
        !           132: BYTE near get_mode()
        !           133: {
        !           134:   union REGS vr;
        !           135: 
        !           136:   vr.h.ah = 0x0f;
        !           137:   intr(VIDEO, &vr);
        !           138:   return(vr.h.al);
        !           139: }
        !           140: 
        !           141: BYTE lpp()
        !           142: {
        !           143:    int far *regen = (int far *) 0x44C;
        !           144:    int what;
        !           145:    BYTE chpl();
        !           146:    
        !           147:    what = (*regen&0xff00)/2/chpl();
        !           148:    return (what > 43 ? 25 : what);
        !           149: }    
        !           150:          
        !           151: private
        !           152: void near set_mode(n)
        !           153: BYTE n;
        !           154: {
        !           155:   union REGS vr;
        !           156: 
        !           157:   vr.h.ah = 0x00;
        !           158:   vr.h.al = n;
        !           159:   intr(VIDEO, &vr);
        !           160: } 
        !           161: 
        !           162: #define gotoxy(x,y)    set_cur((x)<<8|((y)&0xff))
        !           163: #define cur_mov(x,y)   set_cur((C_X=x)<<8|((C_Y=y)&0xff))
        !           164: 
        !           165: private
        !           166: void near wherexy( x, y)
        !           167: BYTE *x, *y;
        !           168: {
        !           169:   register WORD xy;
        !           170: 
        !           171:   xy = get_cur();
        !           172:   *x = xy>>8;
        !           173:   *y = xy&0xff;
        !           174: }
        !           175:     
        !           176: #define wherex()       C_X
        !           177: #define wherey()       C_Y
        !           178: 
        !           179: private
        !           180: void near scr_win(no, ulr, ulc, lrr, lrc)
        !           181: int no;
        !           182: BYTE ulr, ulc, lrr, lrc;
        !           183: {
        !           184:   union REGS vr;
        !           185: 
        !           186:   if (no >= 0)
        !           187:      vr.h.ah = 0x06;
        !           188:   else {
        !           189:      vr.h.ah = 0x07;
        !           190:      no = - no;
        !           191:   }
        !           192:   vr.h.al = no;
        !           193:   vr.x.cx = ulr<<8 | ulc;
        !           194:   vr.x.dx = lrr<<8 | lrc;
        !           195:   vr.h.bh = C_ATTR;
        !           196:   intr(VIDEO, &vr);
        !           197: }    
        !           198: 
        !           199: BYTE chpl()
        !           200: {
        !           201:   union REGS vr;
        !           202: 
        !           203:   vr.h.ah = 0x0f;
        !           204:   intr(VIDEO, &vr);
        !           205:   return(vr.h.ah);
        !           206: }
        !           207:    
        !           208: #define clr_page()     scr_win(0, 0, 0, LPP-1, CHPL-1), \
        !           209:                        gotoxy(C_X = 0, C_Y = 0)
        !           210:                
        !           211: private
        !           212: void near cur_right()
        !           213: {
        !           214:    if (C_Y < CHPL-1) 
        !           215:       C_Y++;
        !           216:    gotoxy(C_X, C_Y);
        !           217: }           
        !           218: 
        !           219: private
        !           220: void near cur_up()
        !           221: {
        !           222:    if (C_X)
        !           223:       C_X--;
        !           224:    gotoxy(C_X, C_Y);
        !           225: }
        !           226: 
        !           227: private
        !           228: void near cur_left()
        !           229: {
        !           230:    if (C_Y)
        !           231:       C_Y--;
        !           232:    gotoxy(C_X, C_Y);
        !           233: }
        !           234: 
        !           235: private
        !           236: void near cur_down()
        !           237: {
        !           238:    if (C_X < LPP-1)
        !           239:       C_X++;
        !           240:    gotoxy(C_X, C_Y);
        !           241: }
        !           242:                          
        !           243: private
        !           244: void near ch_out(c, n)
        !           245: BYTE c, n;
        !           246: {
        !           247:   union REGS vr;
        !           248: 
        !           249:   vr.h.ah = 0x09;
        !           250:   vr.h.al = c;
        !           251:   vr.h.bl = C_ATTR;
        !           252:   vr.h.bh = CUR_PAGE;
        !           253:   vr.x.cx = n;
        !           254:   intr(VIDEO, &vr);
        !           255: }
        !           256: 
        !           257: #define wrch(c)                ch_out((c), 1), cur_advance()
        !           258: 
        !           259: #define home_cur()     gotoxy(C_X = 0, C_Y = 0)
        !           260: 
        !           261: #define clr_eoln()     ch_out(' ', CHPL-wherey())
        !           262: 
        !           263: private
        !           264: void near clr_eop()
        !           265: {
        !           266:   clr_eoln();
        !           267:   scr_win(LPP-1-wherex(), wherex()+1, 0, LPP-1, CHPL-1);
        !           268: }
        !           269: 
        !           270: void init_43()
        !           271: {
        !           272:    BYTE far *info = (BYTE far *) 0x487;
        !           273:    WORD far *CRTC = (WORD far *) 0x463;
        !           274:    union REGS vr;
        !           275:    WORD cur;
        !           276:          
        !           277:    CUR_PAGE = cur_page();
        !           278:    CHPL = chpl();
        !           279:    LPP = lpp();
        !           280: 
        !           281:    if (get_mode()!=3)
        !           282:       set_mode(3);
        !           283:    cur = get_cur();
        !           284:    
        !           285:    vr.x.ax = 0x1112;
        !           286:    vr.h.bl = 0;
        !           287:    intr(VIDEO, &vr);
        !           288: 
        !           289:    *info |= 1;
        !           290:    vr.x.ax = 0x0100;
        !           291:    vr.h.bh = 0;
        !           292:    vr.x.cx = 0x0600;
        !           293:    intr(VIDEO, &vr);
        !           294: 
        !           295:    outp(*CRTC, 0x14);
        !           296:    outp(*CRTC+1, 0x07);
        !           297: 
        !           298:    vr.x.ax = 0x1200;
        !           299:    vr.h.bl = 0x20;
        !           300:    intr(VIDEO, &vr);
        !           301:    
        !           302:    LPP = lpp();
        !           303: 
        !           304:    set_cur(cur);
        !           305:    wherexy(&C_X, &C_Y);
        !           306: }
        !           307: 
        !           308: void reset_43()
        !           309: {
        !           310:    BYTE far *info = (BYTE far *) 0x487;
        !           311:    WORD far *CRTC = (WORD far *) 0x463;
        !           312:    union REGS vr;
        !           313:    
        !           314:    set_mode(3);
        !           315: 
        !           316:    *info &= 128;
        !           317:    vr.x.ax = 0x0100;
        !           318:    vr.h.bh = 0x0607;
        !           319:    vr.x.cx = 0x0607;
        !           320:    intr(VIDEO, &vr);             
        !           321: 
        !           322:    outp(*CRTC, 0x14);
        !           323:    outp(*CRTC+1, 13);
        !           324: 
        !           325: }
        !           326: 
        !           327: #define scr_up()               scr_win(1, 0, 0, LPP-1, CHPL-1)
        !           328: #define back_space()   cur_left()
        !           329: 
        !           330: private
        !           331: void near line_feed()
        !           332: {
        !           333:    if (++C_X > LPP-1) {
        !           334:       C_X = LPP-1;
        !           335:       scr_up();
        !           336:    }   
        !           337:    gotoxy(C_X, C_Y);
        !           338: }
        !           339: 
        !           340: #define BELL_P 0x61                    /* speaker */
        !           341: #define BELL_D 0x2dc                   /* 550 hz  */
        !           342: #define TIME_P 0x40                    /* timer   */
        !           343: #define TINI   182                     /* 10110110b timer initialization */
        !           344: 
        !           345: void dobell(x)
        !           346: {
        !           347:    unsigned int n = 0x8888;
        !           348:    int orgval;
        !           349: 
        !           350:    outp(TIME_P+3, TINI);
        !           351:    outp(TIME_P+2, BELL_D&0xff);
        !           352:    outp(TIME_P+2, BELL_D>>8);
        !           353:    orgval = inp(BELL_P);
        !           354:    outp(BELL_P, orgval|3);             /* turn speaker on  */
        !           355:    while (--n > 0)
        !           356:         ;
        !           357:    outp(BELL_P, orgval);
        !           358: }
        !           359: 
        !           360: #define carriage_return()      gotoxy(wherex(), C_Y = 0)
        !           361:    
        !           362: private
        !           363: void near cur_advance()
        !           364: {
        !           365:    if (++C_Y > CHPL-1) {
        !           366:       C_Y = 0;
        !           367:       if (++C_X > LPP-1) {
        !           368:          scr_up();     
        !           369:          C_X = LPP-1;
        !           370:       }   
        !           371:    }
        !           372:    gotoxy(C_X, C_Y);
        !           373: }           
        !           374: 
        !           375: void init_term()
        !           376: {
        !           377:    if (lpp() == 43)
        !           378:       reset_43();   
        !           379:    CUR_PAGE = cur_page();
        !           380:    CHPL = chpl();
        !           381:    LPP = lpp();
        !           382:    wherexy(&C_X, &C_Y); 
        !           383: }
        !           384: 
        !           385: private
        !           386: void near normfun();
        !           387: 
        !           388: void write_em(s)
        !           389: char *s;
        !           390: {
        !           391:   while (*s)
        !           392:         normfun(*s++);
        !           393: }          
        !           394: 
        !           395: void write_emif(s)
        !           396: char *s;
        !           397: {
        !           398:   if (s)
        !           399:         write_em(s);
        !           400: }
        !           401: 
        !           402: void write_emc(s, n)
        !           403: char *s;
        !           404: int n;
        !           405: {
        !           406:    while (n--)
        !           407:          normfun(*s++);
        !           408: }           
        !           409: 
        !           410: private
        !           411: void near normfun(c)
        !           412: char c;
        !           413: {
        !           414:       switch (c) {
        !           415:         case 10: line_feed(); break;
        !           416:         case 13: carriage_return(); break;
        !           417:         case  8: back_space(); break;
        !           418:         case  7: dobell(0); break;
        !           419:                case  0: break;
        !           420:         default: wrch(c);
        !           421:       }  
        !           422: }
        !           423: 
        !           424: #endif /* IBMPC */
        !           425: 
        !           426: 
        !           427: extern int     BufSize;
        !           428: 
        !           429: int    AbortCnt,
        !           430:        tabstop = 8;
        !           431: 
        !           432: #if !(defined(IBMPC) || defined(MAC))  
        !           433: int    (*TTins_line)(),
        !           434:        (*TTdel_line)();
        !           435: #endif /* (defined(IBMPC) || defined(MAC)) */
        !           436: 
        !           437: struct scrimage
        !           438:        *DesiredScreen = 0,
        !           439:        *PhysScreen = 0;
        !           440: 
        !           441: struct screenline      *Screen = 0,    /* the screen (a bunch of screenline) */
        !           442:                        *Savelines = 0, /* another bunch (LI of them) */
        !           443:                        *Curline = 0;   /* current line */
        !           444: char   *cursor,                        /* offset into current Line */
        !           445:        *cursend;
        !           446: 
        !           447: int    CapCol,
        !           448:        CapLine,
        !           449: 
        !           450:        i_line,
        !           451:        i_col;
        !           452: 
        !           453: void
        !           454: make_scr()
        !           455: {
        !           456:        register int    i;
        !           457:        register struct screenline      *ns;
        !           458:        register char   *nsp;
        !           459: 
        !           460: #ifdef RESHAPING
        !           461:        /* In case we are RESHAPING the window! */
        !           462:        if (DesiredScreen)
        !           463:                free((char *) DesiredScreen);
        !           464:        if (PhysScreen)
        !           465:                free((char *) PhysScreen);
        !           466:        if (Savelines)
        !           467:                free((char *) Savelines);
        !           468:        if (Screen) {
        !           469:                free(Screen->s_line);   /* free all the screen data */
        !           470:                free((char *) Screen);
        !           471:        }
        !           472: #endif /* RESHAPING */
        !           473: 
        !           474:        DesiredScreen = (struct scrimage *) malloc((unsigned) LI * sizeof (struct scrimage));
        !           475:        PhysScreen = (struct scrimage *) malloc((unsigned) LI * sizeof (struct scrimage));
        !           476: 
        !           477:        Savelines = (struct screenline *)
        !           478:                        malloc((unsigned) LI * sizeof(struct screenline));
        !           479:        ns = Screen = (struct screenline *)
        !           480:                        malloc((unsigned) LI * sizeof(struct screenline));
        !           481: 
        !           482:        nsp = (char *) malloc((unsigned)CO * LI);
        !           483:        if (nsp == 0) {
        !           484:                printf("\n\rCannot malloc screen!\n");
        !           485:                finish(1);
        !           486:        }
        !           487: 
        !           488:        for (i = 0; i < LI; i++) {
        !           489:                ns->s_line = nsp;
        !           490:                nsp += CO;
        !           491:                ns->s_length = nsp - 1;         /* End of Line */
        !           492:                ns += 1;
        !           493:        }
        !           494:        cl_scr(0);
        !           495: }
        !           496: 
        !           497: void
        !           498: clrline(cp1, cp2)
        !           499: register char  *cp1,
        !           500:                *cp2;
        !           501: {
        !           502:        while (cp1 <= cp2)
        !           503:                *cp1++ = ' ';
        !           504: }
        !           505: 
        !           506: #if !(defined(IBMPC) || defined(MAC))
        !           507: # define sputc(c)      ((*cursor != (char) (c)) ? dosputc(c) : (cursor++, i_col++))
        !           508: #endif /* (defined(IBMPC) || defined(MAC)) */
        !           509: 
        !           510: #ifdef IBMPC
        !           511: int force = 0;
        !           512: # define sputc(c)      dosputc(c)
        !           513: #endif /* IBMPC */
        !           514: 
        !           515: #ifdef MAC
        !           516: # define sputc(c)      bufputc(c)      /* line buffered for mac display */
        !           517: #endif /* MAC */
        !           518: 
        !           519: #define soutputc(c)    if (--n <= 0) break; else sputc(c)
        !           520: 
        !           521: void
        !           522: cl_eol()
        !           523: {
        !           524:        if (cursor > cursend)
        !           525:                return;
        !           526: 
        !           527:        if (cursor < Curline->s_length) {
        !           528: #if !(defined(IBMPC) || defined(MAC))
        !           529:                if (CE) {
        !           530: #endif /* (defined(IBMPC) || defined(MAC)) */
        !           531:                        Placur(i_line, i_col);
        !           532: #ifdef TERMCAP
        !           533:                        putpad(CE, 1);
        !           534: #else 
        !           535:                clr_eoln();
        !           536: #endif /* TERMCAP */
        !           537:                        clrline(cursor, Curline->s_length);
        !           538: #if !(defined(IBMPC) || defined(MAC))
        !           539:                } else {
        !           540:                /* Ugh.  The slow way for dumb terminals. */
        !           541:                        register char *savecp = cursor;
        !           542: 
        !           543:                        while (cursor <= Curline->s_length)
        !           544:                                sputc(' ');
        !           545:                        cursor = savecp;
        !           546:                }
        !           547: #endif /* (defined(IBMPC) || defined(MAC)) */
        !           548:                Curline->s_length = cursor;
        !           549:        }
        !           550: }
        !           551: 
        !           552: void
        !           553: cl_scr(doit)
        !           554: {
        !           555:        register int    i;
        !           556:        register struct screenline      *sp = Screen;
        !           557: 
        !           558:        for (i = 0; i < LI; i++, sp++) {
        !           559:                clrline(sp->s_line, sp->s_length);
        !           560:                sp->s_length = sp->s_line;
        !           561:                PhysScreen[i].s_id = 0;
        !           562:        }
        !           563:        if (doit) {
        !           564: #ifdef TERMCAP
        !           565:                putpad(CL, LI);
        !           566: #else 
        !           567:                clr_page();
        !           568: #endif /* TERMCAP */
        !           569:                CapCol = CapLine = 0;
        !           570:                UpdMesg = YES;
        !           571:        }
        !           572: }
        !           573: 
        !           574: #ifdef ID_CHAR
        !           575: extern int     IN_INSmode;
        !           576: #endif
        !           577: 
        !           578: /* Output one character (if necessary) at the current position */
        !           579: 
        !           580: #ifndef MAC
        !           581: int            /* only for lints sake */
        !           582: dosputc(c)
        !           583: register char  c;
        !           584: {
        !           585: #ifndef IBMPC
        !           586:        if (*cursor != c) {
        !           587: # ifdef ID_CHAR
        !           588:                if (IN_INSmode)
        !           589:                        INSmode(0);
        !           590: # endif
        !           591: #else /* IBMPC */
        !           592:        if ((force) || (*cursor != c)) {
        !           593: #endif /* IBMPC */
        !           594:                if (i_line != CapLine || i_col != CapCol)
        !           595:                        Placur(i_line, i_col);
        !           596: #ifndef IBMPC
        !           597:                if (UL && (c & CHARMASK) == '_' && (*cursor & CHARMASK) != ' ')
        !           598:                        putstr(" \b");          /* Erase so '_' looks right. */
        !           599: #endif /* IBMPC */
        !           600:                *cursor++ = c;
        !           601: #ifndef IBMPC
        !           602:                putchar(c & CHARMASK);
        !           603: #else /* IBMPC */
        !           604:                normfun(c);
        !           605: #endif /* IBMPC */
        !           606:                AbortCnt -= 1;
        !           607:                CapCol += 1;
        !           608:                i_col += 1;
        !           609:        } else {
        !           610:                cursor += 1;
        !           611:                i_col += 1;
        !           612:        }
        !           613: }
        !           614: #else /* MAC */
        !           615: 
        !           616: /* Character output to bit-mapped screen is very expensive. It makes
        !           617:    much more sense to write the entire line at once. So, we print all
        !           618:    the characters, whether already there or not, once the line is
        !           619:    complete.  */
        !           620:    
        !           621: #define BUFFLUSH (char) 0
        !           622: #define BUFSTART (char) 1
        !           623:     
        !           624: bufputc(c)
        !           625: register char c;
        !           626: {
        !           627:        static char buf[256];
        !           628:        static int len = 0;
        !           629:        
        !           630:        if(c == BUFSTART) {
        !           631: /*             if (i_line != CapLine || i_col != CapCol)*/
        !           632:                        NPlacur(i_line, i_col);
        !           633:                len = 0;
        !           634:                return;
        !           635:        }
        !           636:        if(c == BUFFLUSH) {
        !           637:                buf[0] = (unsigned char) len;
        !           638:                writechr(buf);
        !           639:                len = 0;
        !           640:        }
        !           641:        else {
        !           642:                if(len > 255) return;
        !           643:                *cursor++ = c;
        !           644:                if(c == '0') buf[++len] = 0xAF; /* slashed zero */
        !           645:                else buf[++len] = c;
        !           646:                CapCol++;
        !           647:                i_col++;
        !           648:        }
        !           649:        return;
        !           650: }
        !           651: #endif /* MAC */
        !           652: 
        !           653: /* Write `line' at the current position of `cursor'.  Stop when we
        !           654:    reach the end of the screen.  Aborts if there is a character
        !           655:    waiting.  */
        !           656: 
        !           657: #ifdef MAC             /* This was getting too complicated with ifdefs ... */
        !           658: int
        !           659: swrite(line, inversep, abortable)
        !           660: register char  *line;
        !           661: register int   abortable;
        !           662: {
        !           663:        register int    c;
        !           664:        int     col = i_col,
        !           665:                aborted = 0;
        !           666:        register int    n = cursend - cursor;
        !           667: 
        !           668:        if (n <= 0)
        !           669:                return 1;
        !           670:        sputc(BUFSTART);        /* Okay, because no interruption possible */
        !           671: 
        !           672:        while (c = *line++) {
        !           673:                if (c == '\t') {
        !           674:                        int     nchars;
        !           675: 
        !           676:                        nchars = (tabstop - (col % tabstop));
        !           677:                        col += nchars;
        !           678: 
        !           679:                        while (nchars--)
        !           680:                                soutputc(' ');
        !           681:                        if (n <= 0)
        !           682:                                break;
        !           683:                } else if (isctrl(c)) {
        !           684:                        soutputc('^');
        !           685:                        c = ((c == '\177') ? '?' : c + '@');
        !           686:                        soutputc(c);
        !           687:                        col += 2;
        !           688:                } else {
        !           689:                        soutputc(c);
        !           690:                        col += 1;
        !           691:                }
        !           692:        }
        !           693:        if (n <= 0) {
        !           694:                if ((*line == '\0') && (c != '\t') && !isctrl(c))
        !           695:                        sputc(c);
        !           696:                        sputc('!');
        !           697:        }
        !           698:        if (cursor > Curline->s_length)
        !           699:                Curline->s_length = cursor;
        !           700:        sputc(BUFFLUSH);
        !           701:        return !aborted;
        !           702: }
        !           703: #else /* MAC */
        !           704: 
        !           705: int
        !           706: swrite(line, inversep, abortable)
        !           707: register char  *line;
        !           708: register int   abortable;
        !           709: {
        !           710:        register int    c;
        !           711:        int     col = i_col,
        !           712:                aborted = 0;
        !           713:        register int    n = cursend - cursor;
        !           714: #ifndef IBMPC
        !           715:        int     or_byte = inversep ? 0200 : 0,
        !           716:                thebyte;
        !           717: #else 
        !           718:        int     thebyte;
        !           719: #endif /* IBMPC */
        !           720: 
        !           721: #ifdef IBMPC
        !           722:         force = inversep? 1: 0;  /* to force a redraw of the modeline */
        !           723: #endif /* IBMPC */
        !           724: 
        !           725:        if (n <= 0)
        !           726:                return 1;
        !           727:        while (c = *line++) {
        !           728: #if !(defined(IBMPC) || defined(MAC))  /* don't check after every character */
        !           729:                if (abortable && AbortCnt < 0) {
        !           730:                        AbortCnt = BufSize;
        !           731:                        if (InputPending = charp()) {
        !           732:                                aborted = 1;
        !           733:                                break;
        !           734:                        }
        !           735:                }
        !           736: #endif /* (defined(IBMPC) || defined(MAC)) */
        !           737:                if (c == '\t') {
        !           738:                        int     nchars;
        !           739: 
        !           740:                        nchars = (tabstop - (col % tabstop));
        !           741:                        col += nchars;
        !           742: 
        !           743: #ifndef IBMPC
        !           744:                        thebyte = (' ' | or_byte);
        !           745: #endif /* IBMPC */
        !           746:                        while (nchars--)
        !           747: #ifndef IBMPC
        !           748:                                soutputc(thebyte);
        !           749: #else /* IBMPC */
        !           750:                                soutputc(' ');
        !           751: #endif /* IBMPC */
        !           752:                        if (n <= 0)
        !           753:                                break;
        !           754:                } else if (isctrl(c)) {
        !           755: #ifndef IBMPC
        !           756:                        thebyte = ('^' | or_byte);
        !           757:                        soutputc(thebyte);
        !           758:                        thebyte = (((c == '\177') ? '?' : c + '@') | or_byte);
        !           759:                        soutputc(thebyte);
        !           760: #else /* IBMPC */
        !           761:                        soutputc('^');
        !           762:                        c = ((c == '\177') ? '?' : c + '@');
        !           763:                        soutputc(c);
        !           764: #endif /* IBMPC */
        !           765:                        col += 2;
        !           766:                } else {
        !           767: #ifndef IBMPC
        !           768:                        thebyte = (c | or_byte);
        !           769:                        soutputc(thebyte);
        !           770: #else /* IBMPC */
        !           771:                    if (c == 255) c = 1;
        !           772:                        if (c == ' ' && inversep) c = 255;
        !           773:                        soutputc(c);
        !           774: #endif /* IBMPC */
        !           775:                        col += 1;
        !           776:                }
        !           777:        }
        !           778:        if (n <= 0) {
        !           779:                if ((*line == '\0') && (c != '\t') && !isctrl(c))
        !           780: #ifndef IBMPC
        !           781:                        sputc(c|or_byte);
        !           782: #else /* IBMPC */
        !           783:                        sputc(c);
        !           784: #endif /* IBMPC */
        !           785:                else
        !           786: #ifndef IBMPC
        !           787:                        sputc('!'|or_byte);
        !           788: #else /* IBMPC */
        !           789:                        sputc('!');
        !           790: #endif /* IBMPC */
        !           791:        }
        !           792:        if (cursor > Curline->s_length)
        !           793:                Curline->s_length = cursor;
        !           794: #ifdef IBMPC
        !           795:        force = 0;
        !           796: #endif
        !           797:        return !aborted;
        !           798: }
        !           799: #endif /* MAC */
        !           800: /* This is for writing a buffer line to the screen.  This is to
        !           801:    minimize the amount of copying from one buffer to another buffer.
        !           802:    This gets the info directly from the disk buffers. */
        !           803: 
        !           804: int
        !           805: BufSwrite(linenum)
        !           806: {
        !           807:        register int    n = cursend - cursor,
        !           808:                        col = 0,
        !           809:                        c = -1;
        !           810:        register char   *bp;
        !           811:        int     StartCol = DesiredScreen[linenum].s_offset,
        !           812:                visspace = DesiredScreen[linenum].s_window->w_flags & W_VISSPACE,
        !           813:                aborted = 0;
        !           814: 
        !           815:        bp = lcontents(DesiredScreen[linenum].s_lp);
        !           816:        if (*bp) for (;;) {
        !           817:                if (col >= StartCol) {
        !           818:                        DesiredScreen[linenum].s_offset = col;
        !           819:                        break;
        !           820:                }
        !           821: 
        !           822:                c = *bp++ & CHARMASK;
        !           823:                if (c == '\0')
        !           824:                        break;
        !           825:                if (c == '\t')
        !           826:                        col += (tabstop - (col % tabstop));
        !           827:                else if (isctrl(c))
        !           828:                        col += 2;
        !           829:                else
        !           830:                        col += 1;
        !           831:        }
        !           832: #ifdef MAC
        !           833:        sputc(BUFSTART);        /* Okay because we can't be interrupted */
        !           834: #endif
        !           835: 
        !           836:        if (c != '\0') while (c = *bp++) {
        !           837: #if !(defined(IBMPC) || defined(MAC))          /* will never get true so why bother */
        !           838:                if (AbortCnt < 0) {
        !           839:                        AbortCnt = BufSize;
        !           840:                        if (InputPending = charp()) {
        !           841:                                aborted = 1;
        !           842:                                break;
        !           843:                        }
        !           844:                }
        !           845: #endif /* (defined(IBMPC) || defined(MAC)) */
        !           846:                if (c == '\t') {
        !           847:                        int     nchars = (tabstop - (col % tabstop));
        !           848: 
        !           849:                        col += nchars;
        !           850:                        if (visspace) {
        !           851:                                soutputc('>');
        !           852:                                nchars -= 1;
        !           853:                        }
        !           854:                        while (--nchars >= 0)
        !           855:                                soutputc(' ');
        !           856:                        if (n <= 0)
        !           857:                                break;
        !           858:                } else if (isctrl(c)) {
        !           859:                        soutputc('^');
        !           860:                        soutputc((c == '\177') ? '?' : c + '@');
        !           861:                        col += 2;
        !           862:                } else {
        !           863:                        if (c == ' ' && visspace)
        !           864:                                c = '_';
        !           865: #ifdef IBMPC
        !           866:                        if (c == 255)
        !           867:                           c = 1;
        !           868: #endif /* IBMPC */
        !           869:                        soutputc(c);
        !           870:                        col += 1;
        !           871:                }
        !           872:        }
        !           873:        if (n <= 0) {
        !           874:                if ((*bp == '\0') && (c != '\t') && !isctrl(c))
        !           875:                        sputc(c);
        !           876:                else
        !           877:                        sputc('!');
        !           878:        }
        !           879:        if (cursor > Curline->s_length)
        !           880:                Curline->s_length = cursor;
        !           881: #ifdef MAC
        !           882:        sputc(BUFFLUSH);
        !           883: #endif
        !           884:        return !aborted;                /* Didn't abort */
        !           885: }
        !           886: 
        !           887: void
        !           888: i_set(nline, ncol)
        !           889: register int   nline,
        !           890:                ncol;
        !           891: {
        !           892:        Curline = &Screen[nline];
        !           893:        cursor = Curline->s_line + ncol;
        !           894:        cursend = &Curline->s_line[CO - 1];
        !           895:        i_line = nline;
        !           896:        i_col = ncol;
        !           897: }
        !           898: 
        !           899: /* Insert `num' lines a top, but leave all the lines BELOW `bottom'
        !           900:    alone (at least they won't look any different when we are done).
        !           901:    This changes the screen array AND does the physical changes. */
        !           902: 
        !           903: void
        !           904: v_ins_line(num, top, bottom)
        !           905: {
        !           906:        register int    i;
        !           907: 
        !           908:        /* Save the screen pointers. */
        !           909: 
        !           910:        for(i = 0; i < num && top + i <= bottom; i++)
        !           911:                Savelines[i] = Screen[bottom - i];
        !           912: 
        !           913:        /* Num number of bottom lines will be lost.
        !           914:           Copy everything down num number of times. */
        !           915: 
        !           916:        for (i = bottom; i > top && i-num >= 0; i--)
        !           917:                Screen[i] = Screen[i - num];
        !           918: 
        !           919:        /* Restore the saved ones, making them blank. */
        !           920: 
        !           921:        for (i = 0; i < num; i++) {
        !           922:                Screen[top + i] = Savelines[i];
        !           923:                clrline(Screen[top + i].s_line, Screen[top + i].s_length);
        !           924:                Screen[top + i].s_length = Screen[top + i].s_line;
        !           925:        }
        !           926: 
        !           927: #if !(defined(IBMPC) || defined(MAC))
        !           928:        (*TTins_line)(top, bottom, num);
        !           929: #endif
        !           930: 
        !           931: #ifdef MAC
        !           932:        i_lines(top, bottom, num);
        !           933: #endif 
        !           934: 
        !           935: #ifdef IBMPC
        !           936:        scr_win(-num, top, 0, bottom, CHPL-1);
        !           937: #endif 
        !           938: }
        !           939: 
        !           940: /* Delete `num' lines starting at `top' leaving the lines below `bottom'
        !           941:    alone.  This updates the internal image as well as the physical image.  */
        !           942: 
        !           943: void
        !           944: v_del_line(num, top, bottom)
        !           945: {
        !           946:        register int    i,
        !           947:                        bot;
        !           948: 
        !           949:        bot = bottom;
        !           950: 
        !           951:        /* Save the lost lines. */
        !           952: 
        !           953:        for (i = 0; i < num && top + i <= bottom; i++)
        !           954:                Savelines[i] = Screen[top + i];
        !           955: 
        !           956:        /* Copy everything up num number of lines. */
        !           957: 
        !           958:        for (i = top; num + i <= bottom; i++)
        !           959:                Screen[i] = Screen[i + num];
        !           960: 
        !           961:        /* Restore the lost ones, clearing them. */
        !           962: 
        !           963:        for (i = 0; i < num; i++) {
        !           964:                Screen[bottom - i] = Savelines[i];
        !           965:                clrline(Screen[bot].s_line, Screen[bot].s_length);
        !           966:                Screen[bot].s_length = Screen[bot].s_line;
        !           967:                bot -= 1;
        !           968:        }
        !           969: 
        !           970: #if !(defined(IBMPC) || defined(MAC))
        !           971:        (*TTdel_line)(top, bottom, num);
        !           972: #endif
        !           973: 
        !           974: #ifdef MAC
        !           975:        d_lines(top, bottom, num);
        !           976: #endif
        !           977: 
        !           978: #ifdef IBMPC
        !           979:        scr_win(num, top, 0, bottom, CHPL-1);
        !           980: #endif 
        !           981: 
        !           982: }
        !           983: 
        !           984: #ifndef MAC    /* remainder of this file */
        !           985: #ifdef IBMPC
        !           986: 
        !           987: /* No cursor optimization on an IBMPC, this simplifies things a lot.
        !           988:    Think about it: it would be silly!
        !           989:  */
        !           990: 
        !           991: int    phystab = 8;
        !           992: 
        !           993: void
        !           994: Placur(line, col)
        !           995: {
        !           996:        cur_mov(line, col);
        !           997:        CapCol = col;
        !           998:        CapLine = line;
        !           999: }
        !          1000: 
        !          1001: void
        !          1002: SO_on()
        !          1003: {
        !          1004:        if (Mdcolor)
        !          1005:                setcolor(Mdcolor&0xf, Mdcolor>>4);
        !          1006:        else
        !          1007:                setcolor(Bgcolor, Fgcolor);
        !          1008: }
        !          1009: 
        !          1010: void
        !          1011: SO_off()
        !          1012: {
        !          1013:    setcolor(Fgcolor, Bgcolor);
        !          1014: }
        !          1015: 
        !          1016: extern int EGA;
        !          1017: 
        !          1018: void
        !          1019: 
        !          1020: UnsetTerm(foo)
        !          1021: char *foo;
        !          1022: {
        !          1023:   Placur(ILI, 0);
        !          1024:   clr_eoln();
        !          1025:   if (EGA)
        !          1026:         reset_43();
        !          1027: }
        !          1028: 
        !          1029: 
        !          1030: void
        !          1031: ResetTerm()
        !          1032: {
        !          1033:        if (EGA)
        !          1034:           init_43();
        !          1035:        else
        !          1036:           init_term();
        !          1037:           
        !          1038:        do_sgtty();             /* this is so if you change baudrate or stuff
        !          1039:                                   like that, JOVE will notice. */
        !          1040:        ttyset(ON);
        !          1041: }
        !          1042: 
        !          1043: #else /* IBMPC */ 
        !          1044: 
        !          1045: /* The cursor optimization happens here.  You may decide that this
        !          1046:    is going too far with cursor optimization, or perhaps it should
        !          1047:    limit the amount of checking to when the output speed is slow.
        !          1048:    What ever turns you on ...   */
        !          1049: 
        !          1050: private struct cursaddr {
        !          1051:        int     cm_numchars,
        !          1052:                (*cm_proc)();
        !          1053: };
        !          1054: 
        !          1055: private char   *Cmstr;
        !          1056: private struct cursaddr        *HorMin,
        !          1057:                        *VertMin,
        !          1058:                        *DirectMin;
        !          1059: 
        !          1060: private void
        !          1061:        GENi_lines(),
        !          1062:        GENd_lines(),
        !          1063:        ForMotion(),
        !          1064:        ForTab(),
        !          1065:        BackMotion(),
        !          1066:        RetTab(),
        !          1067:        DownMotion(),
        !          1068:        UpMotion(),
        !          1069:        GoDirect(),
        !          1070:        HomeGo(),
        !          1071:        BottomUp();
        !          1072:        
        !          1073: 
        !          1074: private struct cursaddr        WarpHor[] = {
        !          1075:        0,      ForMotion,
        !          1076:        0,      ForTab,
        !          1077:        0,      BackMotion,
        !          1078:        0,      RetTab
        !          1079: };
        !          1080: 
        !          1081: private struct cursaddr        WarpVert[] = {
        !          1082:        0,      DownMotion,
        !          1083:        0,      UpMotion
        !          1084: };
        !          1085: 
        !          1086: private struct cursaddr        WarpDirect[] = {
        !          1087:        0,      GoDirect,
        !          1088:        0,      HomeGo,
        !          1089:        0,      BottomUp
        !          1090: };
        !          1091: 
        !          1092: #undef FORWARD
        !          1093: #define        FORWARD         0       /* Move forward */
        !          1094: #define FORTAB         1       /* Forward using tabs */
        !          1095: #undef BACKWARD
        !          1096: #define        BACKWARD        2       /* Move backward */
        !          1097: #define RETFORWARD     3       /* Beginning of line and then tabs */
        !          1098: #define NUMHOR         4
        !          1099: 
        !          1100: #define DOWN           0       /* Move down */
        !          1101: #define UPMOVE         1       /* Move up */
        !          1102: #define NUMVERT                2
        !          1103: 
        !          1104: #define DIRECT         0       /* Using CM */
        !          1105: #define HOME           1       /* HOME */
        !          1106: #define LOWER          2       /* Lower Line */
        !          1107: #define NUMDIRECT      3
        !          1108: 
        !          1109: #define        home()          Placur(0, 0)
        !          1110: #define LowLine()      putpad(LL, 1), CapLine = ILI, CapCol = 0
        !          1111: #define PrintHo()      putpad(HO, 1), CapLine = CapCol = 0
        !          1112: 
        !          1113: int    phystab = 8;
        !          1114: 
        !          1115: private void
        !          1116: GoDirect(line, col)
        !          1117: register int   line,
        !          1118:                col;
        !          1119: {
        !          1120:        putpad(Cmstr, 1);
        !          1121:        CapLine = line;
        !          1122:        CapCol = col;
        !          1123: }
        !          1124: 
        !          1125: private void
        !          1126: RetTab(col)
        !          1127: register int   col;
        !          1128: {
        !          1129:        putchar('\r');
        !          1130:        CapCol = 0;
        !          1131:        ForTab(col);
        !          1132: }
        !          1133: 
        !          1134: private void
        !          1135: HomeGo(line, col)
        !          1136: {
        !          1137:        PrintHo();
        !          1138:        DownMotion(line);
        !          1139:        ForTab(col);
        !          1140: }
        !          1141: 
        !          1142: private void
        !          1143: BottomUp(line, col)
        !          1144: register int   line,
        !          1145:                col;
        !          1146: {
        !          1147:        LowLine();
        !          1148:        UpMotion(line);
        !          1149:        ForTab(col);
        !          1150: }
        !          1151: 
        !          1152: /* Tries to move forward using tabs (if possible).  It tabs to the
        !          1153:    closest tabstop which means it may go past 'destcol' and backspace
        !          1154:    to it. */
        !          1155: 
        !          1156: private void
        !          1157: ForTab(destcol)
        !          1158: int    destcol;
        !          1159: {
        !          1160:        register int    tabgoal,
        !          1161:                        ntabs,
        !          1162:                        tabstp = phystab;
        !          1163: 
        !          1164:        if (TABS && (tabstp > 0)) {
        !          1165:                tabgoal = destcol + (tabstp / 2);
        !          1166:                tabgoal -= (tabgoal % tabstp);
        !          1167: 
        !          1168:                /* Don't tab to last place or else it is likely to screw up. */
        !          1169:                if (tabgoal >= CO)
        !          1170:                        tabgoal -= tabstp;
        !          1171: 
        !          1172:                ntabs = (tabgoal / tabstp) - (CapCol / tabstp);
        !          1173:                while (--ntabs >= 0)
        !          1174:                        putchar('\t');
        !          1175:                CapCol = tabgoal;
        !          1176:        }
        !          1177:        if (CapCol > destcol)
        !          1178:                BackMotion(destcol);
        !          1179:        else if (CapCol < destcol)
        !          1180:                ForMotion(destcol);
        !          1181: }
        !          1182: 
        !          1183: private void
        !          1184: ForMotion(destcol)
        !          1185: register int   destcol;
        !          1186: {
        !          1187:        register int    nchars = destcol - CapCol;
        !          1188:        register char   *cp = &Screen[CapLine].s_line[CapCol];
        !          1189: 
        !          1190:        while (--nchars >= 0)
        !          1191:                putchar(*cp++ & CHARMASK);
        !          1192:        CapCol = destcol;
        !          1193: }
        !          1194: 
        !          1195: private void
        !          1196: BackMotion(destcol)
        !          1197: register int   destcol;
        !          1198: {
        !          1199:        register int    nchars = CapCol - destcol;
        !          1200: 
        !          1201:        if (BC)
        !          1202:                while (--nchars >= 0)
        !          1203:                        putpad(BC, 1);
        !          1204:        else
        !          1205:                while (--nchars >= 0)
        !          1206:                        putchar('\b');
        !          1207:        CapCol = destcol;
        !          1208: }
        !          1209: 
        !          1210: private void
        !          1211: DownMotion(destline)
        !          1212: register int   destline;
        !          1213: {
        !          1214:        register int    nlines = destline - CapLine;
        !          1215: 
        !          1216:        while (--nlines >= 0)
        !          1217:                putpad(NL, 1);
        !          1218:        CapLine = destline;
        !          1219: }
        !          1220: 
        !          1221: private void
        !          1222: UpMotion(destline)
        !          1223: register int   destline;
        !          1224: {
        !          1225:        register int    nchars = CapLine - destline;
        !          1226: 
        !          1227:        while (--nchars >= 0)
        !          1228:                putpad(UP, 1);
        !          1229:        CapLine = destline;
        !          1230: }
        !          1231: 
        !          1232: #ifdef ID_CHAR
        !          1233: static int     EIlen;
        !          1234: #endif
        !          1235: extern int     IMlen;
        !          1236: 
        !          1237: void
        !          1238: InitCM()
        !          1239: {
        !          1240:        HOlen = HO ? strlen(HO) : 1000;
        !          1241:        LLlen = LL ? strlen(LL) : 1000;
        !          1242:        UPlen = UP ? strlen(UP) : 1000;
        !          1243: #ifdef ID_CHAR
        !          1244:        if (EI)
        !          1245:                EIlen = strlen(EI);
        !          1246: #endif
        !          1247: }
        !          1248: 
        !          1249: void
        !          1250: Placur(line, col)
        !          1251: {
        !          1252:        int     dline,          /* Number of lines to move */
        !          1253:                dcol;           /* Number of columns to move */
        !          1254:        register int    best,
        !          1255:                        i;
        !          1256:        register struct cursaddr        *cp;
        !          1257:        int     xtracost = 0;   /* Misc addition to cost. */
        !          1258: 
        !          1259: #define CursMin(which,addrs,max) \
        !          1260:        for (best = 0, cp = &addrs[1], i = 1; i < max; i++, cp++) \
        !          1261:                if (cp->cm_numchars < addrs[best].cm_numchars) \
        !          1262:                        best = i; \
        !          1263:        which = &addrs[best];
        !          1264: 
        !          1265:        if (line == CapLine && col == CapCol)
        !          1266:                return;         /* We are already there. */
        !          1267: 
        !          1268:        dline = line - CapLine;
        !          1269:        dcol = col - CapCol;
        !          1270: #ifdef ID_CHAR
        !          1271:        if (IN_INSmode && MI)
        !          1272:                xtracost = EIlen + IMlen;
        !          1273:        /* If we're already in insert mode, it is likely that we will
        !          1274:           want to be in insert mode again, after the insert. */
        !          1275: #endif
        !          1276: 
        !          1277:        /* Number of characters to move horizontally for each case.
        !          1278:           1: Just move forward by typing the right character on the screen.
        !          1279:           2: Print the correct number of back spaces.
        !          1280:           3: Try tabbing to the correct place.
        !          1281:           4: Try going to the beginning of the line, and then tab. */
        !          1282: 
        !          1283:        if (dcol == 1 || dcol == 0) {           /* Most common case. */
        !          1284:                HorMin = &WarpHor[FORWARD];
        !          1285:                HorMin->cm_numchars = dcol + xtracost;
        !          1286:        } else {
        !          1287:                WarpHor[FORWARD].cm_numchars = dcol >= 0 ? dcol + xtracost : 1000;
        !          1288:                WarpHor[BACKWARD].cm_numchars = dcol < 0 ? -(dcol + xtracost) : 1000;
        !          1289:                WarpHor[FORTAB].cm_numchars = dcol >= 0 && TABS ?
        !          1290:                                ForNum(CapCol, col) + xtracost : 1000;
        !          1291:                WarpHor[RETFORWARD].cm_numchars = (xtracost + 1 + (TABS ? ForNum(0, col) : col));
        !          1292: 
        !          1293:                /* Which is the shortest of the bunch */
        !          1294: 
        !          1295:                CursMin(HorMin, WarpHor, NUMHOR);
        !          1296:        }
        !          1297: 
        !          1298:        /* Moving vertically is more simple. */
        !          1299: 
        !          1300:        WarpVert[DOWN].cm_numchars = dline >= 0 ? dline : 1000;
        !          1301:        WarpVert[UPMOVE].cm_numchars = dline < 0 ? ((-dline) * UPlen) : 1000;
        !          1302: 
        !          1303:        /* Which of these is simpler */
        !          1304:        CursMin(VertMin, WarpVert, NUMVERT);
        !          1305: 
        !          1306:        /* Homing first and lowering first are considered 
        !          1307:           direct motions.
        !          1308:           Homing first's total is the sum of the cost of homing
        !          1309:           and the sum of tabbing (if possible) to the right. */
        !          1310:        
        !          1311:        if (VertMin->cm_numchars + HorMin->cm_numchars <= 3) {
        !          1312:                DirectMin = &WarpDirect[DIRECT];        /* A dummy ... */
        !          1313:                DirectMin->cm_numchars = 100;
        !          1314:        } else {
        !          1315:                WarpDirect[DIRECT].cm_numchars = CM ?
        !          1316:                                strlen(Cmstr = tgoto(CM, col, line)) : 1000;
        !          1317:                WarpDirect[HOME].cm_numchars = HOlen + line +
        !          1318:                                WarpHor[RETFORWARD].cm_numchars;
        !          1319:                WarpDirect[LOWER].cm_numchars = LLlen + ((ILI - line) * UPlen) +
        !          1320:                                WarpHor[RETFORWARD].cm_numchars;
        !          1321:                CursMin(DirectMin, WarpDirect, NUMDIRECT);
        !          1322:        }
        !          1323: 
        !          1324:        if (HorMin->cm_numchars + VertMin->cm_numchars < DirectMin->cm_numchars) {
        !          1325:                if (line != CapLine)
        !          1326:                        (*VertMin->cm_proc)(line);
        !          1327:                if (col != CapCol) {
        !          1328: #ifdef ID_CHAR
        !          1329:                        if (IN_INSmode) /* We may use real characters ... */
        !          1330:                                INSmode(0);
        !          1331: #endif
        !          1332:                        (*HorMin->cm_proc)(col);
        !          1333:                }
        !          1334:        } else {
        !          1335: #ifdef ID_CHAR
        !          1336:                if (IN_INSmode && !MI)
        !          1337:                        INSmode(0);
        !          1338: #endif
        !          1339:                (*DirectMin->cm_proc)(line, col);
        !          1340:        }
        !          1341: }
        !          1342: 
        !          1343: #define abs(x) ((x) >= 0 ? (x) : -(x))
        !          1344: 
        !          1345: int
        !          1346: ForNum(from, to)
        !          1347: register int   from;
        !          1348: {
        !          1349:        register int    tabgoal,
        !          1350:                        tabstp = phystab;
        !          1351:        int             numchars = 0;
        !          1352: 
        !          1353:        if (from >= to)
        !          1354:                return from - to;
        !          1355:        if (TABS && (tabstp > 0)) {
        !          1356:                tabgoal = to + (tabstp / 2);
        !          1357:                tabgoal -= (tabgoal % tabstp);
        !          1358:                if (tabgoal >= CO)
        !          1359:                        tabgoal -= tabstp;
        !          1360:                numchars = (tabgoal / tabstop) - (from / tabstp);
        !          1361:                from = tabgoal;
        !          1362:        }
        !          1363:        return numchars + abs(from - to);
        !          1364: }
        !          1365: 
        !          1366: #ifdef WIRED_TERMS
        !          1367: 
        !          1368: void
        !          1369: BGi_lines(top, bottom, num)
        !          1370: {
        !          1371:        printf("\033[%d;%dr\033[%dL\033[r", top + 1, bottom + 1, num);
        !          1372:        CapCol = CapLine = 0;
        !          1373: }
        !          1374: 
        !          1375: void
        !          1376: SUNi_lines(top, bottom, num)
        !          1377: {
        !          1378:        Placur(bottom - num + 1, 0);
        !          1379:        printf("\033[%dM", num);
        !          1380:        Placur(top, 0);
        !          1381:        printf("\033[%dL", num);
        !          1382: }
        !          1383: 
        !          1384: void
        !          1385: C100i_lines(top, bottom, num)
        !          1386: {
        !          1387:        if (num <= 1) {
        !          1388:                GENi_lines(top, bottom, num);
        !          1389:                return;
        !          1390:        }
        !          1391:        printf("\033v%c%c%c%c", ' ', ' ', ' ' + bottom + 1, ' ' + CO);
        !          1392:        CapLine = CapCol = 0;
        !          1393:        Placur(top, 0);
        !          1394:        while (num--)
        !          1395:                putpad(AL, ILI - CapLine);
        !          1396:        printf("\033v%c%c%c%c", ' ', ' ', ' ' + LI, ' ' + CO);
        !          1397:        CapLine = CapCol = 0;
        !          1398: }
        !          1399: 
        !          1400: #endif /* WIRED_TERMS */
        !          1401: 
        !          1402: private void
        !          1403: GENi_lines(top, bottom, num)
        !          1404: {
        !          1405:        register int    i;
        !          1406: 
        !          1407:        if (CS) {
        !          1408:                putpad(tgoto(CS, bottom, top), 1);
        !          1409:                CapCol = CapLine = 0;
        !          1410:                Placur(top, 0);
        !          1411:                for (i = 0; i < num; i++)
        !          1412:                        putpad(SR, bottom - top);
        !          1413:                putpad(tgoto(CS, ILI, 0), 1);
        !          1414:                CapCol = CapLine = 0;
        !          1415:        } else {
        !          1416:                Placur(bottom - num + 1, 0);
        !          1417:                if (M_DL && (num > 1)) {
        !          1418:                        char    minibuf[16];
        !          1419: 
        !          1420:                        sprintf(minibuf, M_DL, num);
        !          1421:                        putpad(minibuf, ILI - CapLine);
        !          1422:                } else {
        !          1423:                        for (i = 0; i < num; i++)
        !          1424:                                putpad(DL, ILI - CapLine);
        !          1425:                }
        !          1426:                Placur(top, 0);
        !          1427:                if (M_AL && (num > 1)) {
        !          1428:                        char    minibuf[16];
        !          1429: 
        !          1430:                        sprintf(minibuf, M_AL, num);
        !          1431:                        putpad(minibuf, ILI - CapLine);
        !          1432:                } else {
        !          1433:                        for (i = 0; i < num; i++)
        !          1434:                                putpad(AL, ILI - CapLine);
        !          1435:                }
        !          1436:        }
        !          1437: }
        !          1438: 
        !          1439: #ifdef WIRED_TERMS
        !          1440: 
        !          1441: void
        !          1442: BGd_lines(top, bottom, num)
        !          1443: {
        !          1444:        printf("\033[%d;%dr\033[%dM\033[r", top + 1, bottom + 1, num);
        !          1445:        CapCol = CapLine = 0;
        !          1446: }
        !          1447: 
        !          1448: void
        !          1449: SUNd_lines(top, bottom, num)
        !          1450: {
        !          1451:        Placur(top, 0);
        !          1452:        printf("\033[%dM", num);
        !          1453:        Placur(bottom + 1 - num, 0);
        !          1454:        printf("\033[%dL", num);
        !          1455: }
        !          1456: 
        !          1457: void
        !          1458: C100d_lines(top, bottom, num)
        !          1459: {
        !          1460:        if (num <= 1) {
        !          1461:                GENd_lines(top, bottom, num);
        !          1462:                return;
        !          1463:        }
        !          1464:        printf("\033v%c%c%c%c", ' ', ' ', ' ' + bottom + 1, ' ' + CO);
        !          1465:        CapLine = CapCol = 0;
        !          1466:        Placur(top, 0);
        !          1467:        while (num--)
        !          1468:                putpad(DL, ILI - CapLine);
        !          1469:        printf("\033v%c%c%c%c", ' ', ' ', ' ' + LI, ' ' + CO);
        !          1470:        CapLine = CapCol = 0;
        !          1471: }
        !          1472: 
        !          1473: #endif /* WIRED_TERMS */
        !          1474: 
        !          1475: private void
        !          1476: GENd_lines(top, bottom, num)
        !          1477: {
        !          1478:        register int    i;
        !          1479: 
        !          1480:        if (CS) {
        !          1481:                putpad(tgoto(CS, bottom, top), 1);
        !          1482:                CapCol = CapLine = 0;
        !          1483:                Placur(bottom, 0);
        !          1484:                for (i = 0; i < num; i++)
        !          1485:                        putpad(SF, bottom - top);
        !          1486:                putpad(tgoto(CS, ILI, 0), 1);
        !          1487:                CapCol = CapLine = 0;
        !          1488:        } else {
        !          1489:                Placur(top, 0);
        !          1490:                if (M_DL && (num > 1)) {
        !          1491:                        char    minibuf[16];
        !          1492: 
        !          1493:                        sprintf(minibuf, M_DL, num);
        !          1494:                        putpad(minibuf, ILI - top);
        !          1495:                } else {
        !          1496:                        for (i = 0; i < num; i++)
        !          1497:                                putpad(DL, ILI - top);
        !          1498:                }
        !          1499:                Placur(bottom + 1 - num, 0);
        !          1500:                if (M_AL && (num > 1)) {
        !          1501:                        char    minibuf[16];
        !          1502: 
        !          1503:                        sprintf(minibuf, M_AL, num);
        !          1504:                        putpad(minibuf, ILI - CapLine);
        !          1505:                } else {
        !          1506:                        for (i = 0; i < num; i++)
        !          1507:                                putpad(AL, ILI - CapLine);
        !          1508:                }
        !          1509:        }
        !          1510: }
        !          1511: 
        !          1512: struct ID_lookup {
        !          1513:        char    *ID_name;
        !          1514:        int     (*I_proc)();    /* proc to insert lines */
        !          1515:        int     (*D_proc)();    /* proc to delete lines */
        !          1516: } ID_trms[] = {
        !          1517:        "generic",      GENi_lines,     GENd_lines,     /* This should stay here */
        !          1518: #ifdef WIRED_TERMS
        !          1519:        "sun",          SUNi_lines,     SUNd_lines,
        !          1520:        "bg",           BGi_lines,      BGd_lines,
        !          1521:        "c1",           C100i_lines,    C100d_lines,
        !          1522: #endif /* WIRED_TERMS */
        !          1523:        0,              0,              0
        !          1524: };
        !          1525: 
        !          1526: void
        !          1527: IDline_setup(tname)
        !          1528: char   *tname;
        !          1529: {
        !          1530:        register struct ID_lookup       *idp;
        !          1531: 
        !          1532:        for (idp = &ID_trms[1]; idp->ID_name; idp++)
        !          1533:                if (strncmp(idp->ID_name, tname, strlen(idp->ID_name)) == 0)
        !          1534:                        break;
        !          1535:        if (idp->ID_name == 0)
        !          1536:                idp = &ID_trms[0];
        !          1537:        TTins_line = idp->I_proc;
        !          1538:        TTdel_line = idp->D_proc;
        !          1539: }
        !          1540: 
        !          1541: #endif /* IBMPC */
        !          1542: #endif /* MAC */

unix.superglobalmegacorp.com

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