Annotation of coherent/g/usr/lib/ncurses/lib_doupd.c, revision 1.1.1.1

1.1       root        1: /*********************************************************************
                      2: *                         COPYRIGHT NOTICE                           *
                      3: **********************************************************************
                      4: *        This software is copyright (C) 1982 by Pavel Curtis         *
                      5: *                                                                    *
                      6: *        Permission is granted to reproduce and distribute           *
                      7: *        this file by any means so long as no fee is charged         *
                      8: *        above a nominal handling fee and so long as this            *
                      9: *        notice is always included in the copies.                    *
                     10: *                                                                    *
                     11: *        Other rights are reserved except as explicitly granted      *
                     12: *        by written permission of the author.                        *
                     13: *                Pavel Curtis                                        *
                     14: *                Computer Science Dept.                              *
                     15: *                405 Upson Hall                                      *
                     16: *                Cornell University                                  *
                     17: *                Ithaca, NY 14853                                    *
                     18: *                                                                    *
                     19: *                Ph- (607) 256-4934                                  *
                     20: *                                                                    *
                     21: *                Pavel.Cornell@Udel-Relay   (ARPAnet)                *
                     22: *                decvax!cornell!pavel       (UUCPnet)                *
                     23: *********************************************************************/
                     24: 
                     25: /*
                     26:  *     lib_doupdate.c
                     27:  *
                     28:  *     The routine doupdate() and its dependents
                     29:  *
                     30:  *  $Log:      lib_doupd.c,v $
                     31:  * Revision 1.1  92/08/31  08:55:43  bin
                     32:  * Initial revision
                     33:  * 
                     34:  * Revision 3.2  91/04/20  18:20:16  munk
                     35:  * Usage of register variables
                     36:  *
                     37:  * Revision 3.1  84/12/13  11:20:28  john
                     38:  * Revisions by Mark Horton
                     39:  * 
                     40:  * Revision 2.1  82/10/25  14:47:05  pavel
                     41:  * Added Copyright Notice
                     42:  * 
                     43:  * Revision 2.0  82/10/25  13:44:33  pavel
                     44:  * Beta-one Test Release
                     45:  * 
                     46:  *
                     47:  */
                     48: #ifndef COHERENT
                     49: static char RCSid[] =
                     50:        "$Header: /src386/usr/lib/ncurses/RCS/lib_doupd.c,v 1.1 92/08/31 08:55:43 bin Exp Locker: bin $";
                     51: #endif
                     52: 
                     53: #include <signal.h>
                     54: #include "curses.h"
                     55: #include "curses.priv.h"
                     56: #include "term.h"
                     57: 
                     58: #define GoTo(row,col)          mvcur(SP->_cursrow, SP->_curscol, row, col);  \
                     59:                                SP->_cursrow = row;                           \
                     60:                                SP->_curscol = col;
                     61: 
                     62: #define PutAttrChar(ch)                if (curscr->_attrs != (ch & A_ATTRIBUTES))    \
                     63:                                {                                             \
                     64:                                    curscr->_attrs = ch & A_ATTRIBUTES;       \
                     65:                                    vidputs(curscr->_attrs, outc);            \
                     66:                                }                                             \
                     67:                                putc(ch & A_CHARTEXT, SP->_ofp);
                     68: 
                     69: #define PutChar(ch)            if (!auto_right_margin  ||                    \
                     70:                                                SP->_cursrow != lines - 1  || \
                     71:                                                SP->_curscol != columns - 1)  \
                     72:                                {                                             \
                     73:                                    PutAttrChar(ch);                          \
                     74:                                    SP->_curscol++;                           \
                     75:                                    if (SP->_curscol >= columns)              \
                     76:                                        if (auto_right_margin)                \
                     77:                                        {                                     \
                     78:                                            SP->_curscol = 0;                 \
                     79:                                            SP->_cursrow++;                   \
                     80:                                        }                                     \
                     81:                                        else                                  \
                     82:                                            SP->_curscol--;                   \
                     83:                                }
                     84: 
                     85: 
                     86: 
                     87: outc(ch)
                     88: char   ch;
                     89: {
                     90:        putc(ch, SP->_ofp);
                     91: }
                     92: 
                     93: 
                     94: doupdate()
                     95: {
                     96:        register int    i;
                     97:        int             (*oldsig)();
                     98: 
                     99: #ifdef TRACE
                    100:        if (_tracing)
                    101:            _tracef("doupdate() called");
                    102: #endif
                    103: 
                    104: #ifdef COHERENT
                    105:        oldsig = signal(SIGTRAP, SIG_IGN);
                    106: #else
                    107:        oldsig = signal(SIGTSTP, SIG_IGN);
                    108: #endif
                    109: 
                    110:        if (curscr->_clear)
                    111:        {
                    112:            ClrUpdate(curscr);
                    113:            curscr->_clear = FALSE;
                    114: 
                    115:            GoTo(curscr->_cury, curscr->_curx);
                    116:        }
                    117:        else
                    118:        {
                    119:            if (newscr->_clear)
                    120:            {
                    121:                ClrUpdate(newscr);
                    122:                newscr->_clear = FALSE;
                    123:            }
                    124:            else if (curscr->_idlok)
                    125:                IdlUpdate();
                    126:            else
                    127:                NoIdlUpdate();
                    128: 
                    129:            for (i = 0; i < lines; i++)
                    130:            {
                    131:                newscr->_firstchar[i] = _NOCHANGE;
                    132:                newscr->_lastchar[i] = _NOCHANGE;
                    133:                newscr->_numchngd[i] = 0;
                    134:            }
                    135: 
                    136:            curscr->_curx = newscr->_curx;
                    137:            curscr->_cury = newscr->_cury;
                    138: 
                    139:            GoTo(curscr->_cury, curscr->_curx);
                    140:        }
                    141: 
                    142: 
                    143:        fflush(SP->_ofp);
                    144: 
                    145: #ifdef COHERENT
                    146:        signal(SIGTRAP, oldsig);
                    147: #else
                    148:        signal(SIGTSTP, oldsig);
                    149: #endif
                    150: }
                    151: 
                    152: 
                    153: /*
                    154: **     ClrUpdate(scr)
                    155: **
                    156: **     Update by clearing and redrawing the entire screen.
                    157: **
                    158: */
                    159: static
                    160: ClrUpdate(scr)
                    161: register WINDOW        *scr;
                    162: {
                    163:        register int    i, j;
                    164: 
                    165:        ClearScreen();
                    166: 
                    167:        for (i=0; i < lines; i++)
                    168:        {
                    169:            int lastNonBlank, lastCol;
                    170: 
                    171:            for (lastNonBlank = columns - 1;
                    172:                 lastNonBlank && scr->_line[i][lastNonBlank] == ' ';
                    173:                 lastNonBlank--)
                    174:                ;
                    175: 
                    176:             if (!lastNonBlank)
                    177:                continue;
                    178: 
                    179:            lastCol = lastNonBlank == (columns - 1);
                    180:            if (lastCol && i == lines)
                    181:                lastNonBlank--;
                    182: 
                    183:            for (j = 0; j <= lastNonBlank; j++) {
                    184:                if (' ' != scr->_line[i][j]) {
                    185:                        GoTo(i, j);
                    186:                        break;
                    187:                }
                    188:            }
                    189: 
                    190:            for (;j <= lastNonBlank; j++) {
                    191:                PutAttrChar(scr->_line[i][j]);
                    192:            }
                    193: 
                    194:            if (auto_right_margin && lastCol) {
                    195:                SP->_cursrow = i + 1;
                    196:                SP->_curscol = 0;
                    197:            }
                    198:            else
                    199:                SP->_curscol = j;
                    200:        }
                    201: 
                    202:        if (scr != curscr)
                    203:            for (i = 0; i < LINES; i++)
                    204:                for (j = 0; j < COLS; j++)
                    205:                        curscr->_line[i][j] = scr->_line[i][j];
                    206: }
                    207: 
                    208: 
                    209: /*
                    210: **     NoIdlUpdate()
                    211: **
                    212: **     Update screen without using Insert/Delete Line capabilities
                    213: **
                    214: */
                    215: static
                    216: NoIdlUpdate()
                    217: {
                    218:        register int    i;
                    219: 
                    220: #ifdef TRACE
                    221:        if (_tracing)
                    222:            _tracef("NoIdlUpdate() called");
                    223: #endif
                    224: 
                    225:        for (i=0; i < lines; i++)
                    226:            if (newscr->_numchngd[i])
                    227:                TransformLine(i);
                    228: }
                    229: 
                    230: 
                    231: 
                    232: /*
                    233: **     IdlUpdate()
                    234: **
                    235: **     Update screen using Insert/Delete Line capabilities
                    236: **
                    237: */
                    238: #define UNCHANGED(n)   (newscr->_numchngd[n] <= columns/10             \
                    239:                                ||  newscr->_lastchar[n]                \
                    240:                                          - newscr->_firstchar[n] <= columns/10)
                    241: 
                    242: static
                    243: IdlUpdate()
                    244: {
                    245:        int             firstLine, lastLine;
                    246:        register int    thisLine;
                    247: 
                    248: #ifdef TRACE
                    249:        if (_tracing)
                    250:            _tracef("IdlUpdate() called");
                    251: #endif
                    252: 
                    253:        firstLine = -1;
                    254: 
                    255:        for (thisLine = 0; thisLine < lines; thisLine++)
                    256:        {
                    257:            if (UNCHANGED(thisLine))
                    258:            {
                    259:                if (firstLine != -1)
                    260:                {
                    261:                    lastLine = thisLine - 1;
                    262:                    Gosling(firstLine, lastLine);
                    263:                    firstLine = -1;
                    264:                }
                    265:                
                    266:                if (newscr->_firstchar[thisLine] != _NOCHANGE)
                    267:                    TransformLine(thisLine);
                    268:            }
                    269:            else if (firstLine == -1)
                    270:                firstLine = thisLine;
                    271:        }
                    272: 
                    273:        if (firstLine != -1)
                    274:            Gosling(firstLine, lines - 1);
                    275: }
                    276: 
                    277: 
                    278: /*
                    279: **     TransformLine(lineno)
                    280: **
                    281: **     Call either IDcTransformLine or NoIDcTransformLine to do the
                    282: **     update, depending upon availability of insert/delete character.
                    283: */
                    284: static
                    285: TransformLine(lineno)
                    286: int    lineno;
                    287: {
                    288:        if ( (insert_character  ||  (enter_insert_mode  &&  exit_insert_mode))
                    289:                 &&  delete_character)
                    290:            IDcTransformLine(lineno);
                    291:        else
                    292:            NoIDcTransformLine(lineno);
                    293: }
                    294: 
                    295: 
                    296: /*
                    297: **     NoIDcTransformLine(lineno)
                    298: **
                    299: **     Transform the given line in curscr to the one in newscr, without
                    300: **     using Insert/Delete Character.
                    301: **
                    302: **             firstChar = position of first different character in line
                    303: **             lastChar = position of last different character in line
                    304: **
                    305: **             overwrite all characters between firstChar and lastChar.
                    306: **
                    307: */
                    308: static
                    309: NoIDcTransformLine(lineno)
                    310: int    lineno;
                    311: {
                    312:        register int    firstChar, lastChar;
                    313:        register chtype *newLine = newscr->_line[lineno];
                    314:        register chtype *oldLine = curscr->_line[lineno];
                    315:         register int     k;
                    316: 
                    317: #ifdef TRACE
                    318:        if (_tracing)
                    319:            _tracef("NoIDcTransformLine(%d) called", lineno);
                    320: #endif
                    321: 
                    322:        firstChar = 0;
                    323:        while (firstChar < columns
                    324:                         &&  newLine[firstChar] == oldLine[firstChar])
                    325:            firstChar++;
                    326: 
                    327:        if (firstChar >= columns)
                    328:            return;
                    329: 
                    330:        lastChar = columns - 1;
                    331:        while (lastChar > firstChar  &&  newLine[lastChar] == oldLine[lastChar])
                    332:            lastChar--;
                    333:        
                    334:        GoTo(lineno, firstChar);
                    335: 
                    336:        for (k=firstChar; k <= lastChar; k++)
                    337:        {
                    338:            PutChar(newLine[k]);
                    339:            oldLine[k] = newLine[k];
                    340:        }
                    341: }
                    342: 
                    343: 
                    344: /*
                    345: **     IDcTransformLine(lineno)
                    346: **
                    347: **     Transform the given line in curscr to the one in newscr, using
                    348: **     Insert/Delete Character.
                    349: **
                    350: **             firstChar = position of first different character in line
                    351: **             oLastChar = position of last different character in old line
                    352: **             nLastChar = position of last different character in new line
                    353: **
                    354: **             move to firstChar
                    355: **             overwrite chars up to min(oLastChar, nLastChar)
                    356: **             if oLastChar < nLastChar
                    357: **                     insert newLine[oLastChar+1..nLastChar]
                    358: **             else
                    359: **                     delete oLastChar - nLastChar spaces
                    360: */
                    361: static
                    362: IDcTransformLine(lineno)
                    363: int    lineno;
                    364: {
                    365:        int             firstChar, oLastChar, nLastChar;
                    366:        chtype          *newLine = newscr->_line[lineno];
                    367:        chtype          *oldLine = curscr->_line[lineno];
                    368:         register int   k, n;
                    369: 
                    370: #ifdef TRACE
                    371:        if (_tracing)
                    372:            _tracef("IDcTransformLine(%d) called", lineno);
                    373: #endif
                    374: 
                    375:        firstChar = 0;
                    376:        while (firstChar < columns  &&  newLine[firstChar] == oldLine[firstChar])
                    377:            firstChar++;
                    378: 
                    379:        if (firstChar >= columns)
                    380:            return;
                    381: 
                    382:        oLastChar = columns - 1;
                    383:        while (oLastChar > firstChar  &&  oldLine[oLastChar] == ' ')
                    384:            oLastChar--;
                    385: 
                    386:        nLastChar = columns - 1;
                    387:        while (nLastChar > firstChar  &&  newLine[nLastChar] == ' ')
                    388:            nLastChar--;
                    389: 
                    390:        while (newLine[nLastChar] == oldLine[oLastChar])
                    391:        {
                    392:            nLastChar--;
                    393:            oLastChar--;
                    394:        }
                    395: 
                    396:        n = min(oLastChar, nLastChar);
                    397:        GoTo(lineno, firstChar);
                    398: 
                    399:        for (k=firstChar; k <= n; k++)
                    400:            PutChar(newLine[k]);
                    401: 
                    402:        if (oLastChar < nLastChar)
                    403:            InsStr(&newLine[k], nLastChar - oLastChar);
                    404:        else if (oLastChar > nLastChar)
                    405:            DelChar(oLastChar - nLastChar);
                    406: 
                    407:        for (k=firstChar; k < columns; k++)
                    408:            oldLine[k] = newLine[k];
                    409: }
                    410: 
                    411: 
                    412: /*
                    413: **     Gosling(firstLine, lastLine)
                    414: **
                    415: **     Change the given range of lines on curscr into the same lines
                    416: **     on newscr, using Gosling's Algorithm.
                    417: */
                    418: static short lineCost[MAXLINES][MAXLINES];
                    419: static short lineOps[MAXLINES][MAXLINES];
                    420: static short lineDels[MAXLINES];
                    421: static short lineIRs[MAXLINES];
                    422: 
                    423: #define INSERT 1
                    424: #define DELETE 2
                    425: #define REPLACE 3
                    426: 
                    427: static
                    428: Gosling(firstLine, lastLine)
                    429: int    firstLine, lastLine;
                    430: {
                    431:        register int    i, count;
                    432: 
                    433: #ifdef TRACE
                    434:        if (_tracing)
                    435:            _tracef("Gosling(%d,%d) called", firstLine, lastLine);
                    436: #endif
                    437: 
                    438:        Goscost(firstLine, lastLine - firstLine + 1);
                    439: 
                    440:        for (i=0; i <= lastLine - firstLine + 1; i++)
                    441:            lineDels[i] = lineIRs[i] = 0;
                    442: 
                    443:        Gosdraw(lastLine - firstLine + 1, lastLine - firstLine + 1);
                    444: 
                    445:        count = 0;
                    446:        for (i = lastLine - firstLine + 1; i > 0; i--)
                    447:        {
                    448:            if (lineDels[i] == DELETE)
                    449:                count++;
                    450:            else if (count)
                    451:            {   
                    452:                DelLine(count, firstLine + i, lastLine);
                    453:                count = 0;
                    454:            }
                    455:        }
                    456: 
                    457:        if (count)
                    458:            DelLine(count, firstLine, lastLine);
                    459: 
                    460: 
                    461:        for (i = 1; i <= lastLine - firstLine + 1; i++)
                    462:        {
                    463:            switch (lineIRs[i])
                    464:            {
                    465:                case REPLACE:
                    466:                    TransformLine(firstLine + i - 1);
                    467:                    break;
                    468: 
                    469:                case INSERT:
                    470:                    InsLine(firstLine + i - 1, lastLine);
                    471:                    break;
                    472: 
                    473:                default:
                    474:                    /* do nothing */
                    475:                    break;
                    476:            }
                    477:        }
                    478: }
                    479: 
                    480: 
                    481: #define RPLCOST(old,new)       (oHash[old] == nHash[new]  ?  0  :  columns)
                    482: 
                    483: static
                    484: Goscost(lineno, length)
                    485: int    lineno, length;
                    486: {      
                    487:        register int    i, j;
                    488:        int             cost, ILcost, DLcost;
                    489:        long            nHash[MAXLINES], oHash[MAXLINES];
                    490:         long           HashFn();
                    491: 
                    492: #ifdef TRACE
                    493:        if (_tracing)
                    494:            _tracef("Goscost(lineno=%d,length=%d) called", lineno, length);
                    495: #endif
                    496: 
                    497:        ILcost = (insert_line ? strlen(insert_line) : 9999) + columns;
                    498:        DLcost = (delete_line ? strlen(delete_line) : 9999);
                    499: 
                    500:        for (i=1; i <= length; i++)
                    501:        {
                    502:            nHash[i] = HashFn(newscr->_line[lineno + i - 1]);
                    503:            oHash[i] = HashFn(curscr->_line[lineno + i - 1]);
                    504:        }
                    505: 
                    506:        lineCost[0][0] = 0;
                    507: 
                    508:        for (i=1; i <= length; i++)
                    509:        {
                    510:            lineCost[i][0] = lineCost[i-1][0] + DLcost;
                    511:            lineOps[i][0] = DELETE;
                    512: 
                    513:            lineCost[0][i] = lineCost[0][i-1] + ILcost;
                    514:            lineOps[0][i] = INSERT;
                    515:        }
                    516: 
                    517:        for (i=1; i <= length; i++)
                    518:        {
                    519:            for (j=1; j <= length; j++)
                    520:            {
                    521:                lineCost[i][j] = lineCost[i-1][j-1] + RPLCOST(i, j);
                    522:                lineOps[i][j] = REPLACE;
                    523: 
                    524:                cost = lineCost[i][j-1] + ILcost;
                    525:                if (cost < lineCost[i][j])
                    526:                {
                    527:                    lineCost[i][j] = cost;
                    528:                    lineOps[i][j] = INSERT;
                    529:                }
                    530: 
                    531:                cost = lineCost[i-1][j] + DLcost;
                    532:                if (cost < lineCost[i][j])
                    533:                {
                    534:                    lineCost[i][j] = cost;
                    535:                    lineOps[i][j] = DELETE;
                    536:                }
                    537:            }
                    538:        }
                    539: 
                    540:        return(lineCost[columns][columns]);
                    541: }
                    542: 
                    543: 
                    544: /*
                    545: **     _PrintCosts(length)
                    546: **
                    547: **     Print out the cost matrix.  Called only from sdb.
                    548: **
                    549: **
                    550: **     _DumpNewscr(first, last)
                    551: **
                    552: **     Print the specified range of lines from newscr.  Called only from sdb.
                    553: **
                    554: **
                    555: **     _DumpCurscr(first, last)
                    556: **
                    557: **     Print the specified range of lines from curscr.  Called only from sdb.
                    558: **
                    559: */
                    560: _PrintCosts(length)
                    561: int    length;
                    562: {
                    563:        register int    i, j;
                    564: 
                    565:        for (i=0; i <= length; i++)
                    566:        {
                    567:            for (j=0; j <= length; j++)
                    568:            {
                    569:                printf("%5d/%d", lineCost[i][j], lineOps[i][j]);
                    570:            }
                    571: 
                    572:            putchar('\n');
                    573:        }
                    574: 
                    575:        fflush(stdout);
                    576: }
                    577: 
                    578: 
                    579: _DumpNewscr(first, last)
                    580: int    first, last;
                    581: {
                    582:        register int    i, j;
                    583: 
                    584:        for (i=first; i <= last; i++)
                    585:        {
                    586:            for (j=0; j < columns; j++)
                    587:                putchar(newscr->_line[i][j]);
                    588:            
                    589:            putchar('\n');
                    590:        }
                    591: }
                    592: 
                    593: 
                    594: _DumpCurscr(first, last)
                    595: int    first, last;
                    596: {
                    597:        register int    i, j;
                    598: 
                    599:        for (i=first; i <= last; i++)
                    600:        {
                    601:            for (j=0; j < columns; j++)
                    602:                putchar(curscr->_line[i][j]);
                    603:            
                    604:            putchar('\n');
                    605:        }
                    606: }
                    607: 
                    608: 
                    609: long
                    610: HashFn(line)
                    611: register chtype        *line;
                    612: {
                    613:        register int    i = 0;
                    614:        long            hash = 0;
                    615: 
                    616:        while(i < columns  &&  (line[i] | A_CHARTEXT) == ' ')
                    617:            i++;
                    618: 
                    619:        for (; i+1 < columns; i += 2)
                    620:            hash += (line[i] << 8) + line[i+1];
                    621: 
                    622:        return (hash);
                    623: }
                    624: 
                    625: 
                    626: 
                    627: 
                    628: 
                    629: static
                    630: Gosdraw(i, j)
                    631: register int   i, j;
                    632: {
                    633:        if (i == 0  &&  j == 0)
                    634:            return;
                    635:        
                    636:        switch (lineOps[i][j])
                    637:        {
                    638:            case INSERT:
                    639:                Gosdraw(i, j-1);
                    640:                lineIRs[j] = INSERT;
                    641:                break;
                    642: 
                    643:            case DELETE:
                    644:                lineDels[i] = DELETE;
                    645:                Gosdraw(i-1, j);
                    646:                break;
                    647: 
                    648:            case REPLACE:
                    649:                Gosdraw(i-1, j-1);
                    650:                lineIRs[j] = REPLACE;
                    651:                break;
                    652:        }
                    653: }
                    654: 
                    655: 
                    656: /*
                    657: **     ClearScreen()
                    658: **
                    659: **     Clear the physical screen and put cursor at home
                    660: **
                    661: */
                    662: static
                    663: ClearScreen()
                    664: {
                    665:        if (clear_screen)
                    666:        {
                    667:            tputs(clear_screen, 1, outc);
                    668:            SP->_cursrow = SP->_curscol = 0;
                    669:        }
                    670:        else if (clr_eos)
                    671:        {
                    672:            SP->_cursrow = SP->_curscol = -1;
                    673:            GoTo(0,0);
                    674: 
                    675:            tputs(clr_eos, 1, outc);
                    676:        }
                    677:        else if (clr_eol)
                    678:        {
                    679:            SP->_cursrow = SP->_curscol = -1;
                    680: 
                    681:            while (SP->_cursrow < lines)
                    682:            {
                    683:                GoTo(SP->_cursrow, 0);
                    684:                tputs(clr_eol, 1, outc);
                    685:            }
                    686: 
                    687:            GoTo(0,0);
                    688:        }
                    689: }
                    690: 
                    691: 
                    692: /*
                    693: **     InsStr(line, count)
                    694: **
                    695: **     Insert the count characters pointed to by line.
                    696: **
                    697: */
                    698: InsStr(line, count)
                    699: register chtype        *line;
                    700: register int   count;
                    701: {
                    702: #ifdef TRACE
                    703:        if (_tracing)
                    704:            _tracef("InsStr(%o,%d) called", line, count);
                    705: #endif
                    706: 
                    707:        if (enter_insert_mode  &&  exit_insert_mode)
                    708:        {
                    709:            tputs(enter_insert_mode, 1, outc);
                    710:            while (count)
                    711:            {
                    712:                PutChar(*line);
                    713:                line++;
                    714:                count--;
                    715:            }
                    716:            tputs(exit_insert_mode, 1, outc);
                    717:        }
                    718:        else if (parm_ich)
                    719:        {
                    720:            tputs(tparm(parm_ich, count), 1, outc);
                    721:            while (count)
                    722:            {
                    723:                PutChar(*line);
                    724:                line++;
                    725:                count--;
                    726:            }
                    727:        }
                    728:        else
                    729:        {
                    730:            while (count)
                    731:            {
                    732:                tputs(insert_character, 1, outc);
                    733:                PutChar(*line);
                    734:                line++;
                    735:                count--;
                    736:            }
                    737:        }
                    738: }
                    739: 
                    740: 
                    741: /*
                    742: **     DelChar(count)
                    743: **
                    744: **     Delete count characters at current position
                    745: **
                    746: */
                    747: DelChar(count)
                    748: register int   count;
                    749: {
                    750: #ifdef TRACE
                    751:        if (_tracing)
                    752:            _tracef("DelChar(%d) called", count);
                    753: #endif
                    754: 
                    755:        if (parm_dch)
                    756:        {
                    757:            tputs(tparm(parm_dch, count), 1, outc);
                    758:        }
                    759:        else
                    760:        {
                    761:            while (count--)
                    762:                tputs(delete_character, 1, outc);
                    763:        }
                    764: }
                    765: 
                    766: 
                    767: /*
                    768: **     InsLine(lineno, lastLine)
                    769: **
                    770: **     Insert line number lineno, affecting up to lastLine
                    771: **
                    772: */
                    773: InsLine(lineno, lastLine)
                    774: int    lineno, lastLine;
                    775: {
                    776:        register int    i, j, k;
                    777:        chtype          *temp;
                    778:        chtype          *line = newscr->_line[lineno];
                    779: 
                    780: #ifdef TRACE
                    781:        if (_tracing)
                    782:            _tracef("InsLine(%d,%d) called", lineno, lastLine);
                    783: #endif
                    784:        
                    785:        GoTo(lineno, 0);
                    786: 
                    787:        tputs(insert_line, 1, outc);
                    788: 
                    789:        for (i=0; i < columns; i++)
                    790:            PutChar(line[i]);
                    791: 
                    792:        temp = curscr->_line[lastLine];
                    793:        for (k = lastLine; k > lineno; k--)
                    794:            curscr->_line[k] = curscr->_line[k - 1];
                    795: 
                    796:        curscr->_line[k] = temp;
                    797: 
                    798:        for (j=0; j < columns; j++)
                    799:            curscr->_line[k][j] = newscr->_line[k][j];
                    800: }
                    801: 
                    802: 
                    803: /*
                    804: **     DelLine(count, lineno, lastLine)
                    805: **
                    806: **     Delete count lines at lineno, affecting up to lastLine
                    807: **
                    808: */
                    809: DelLine(count, lineno, lastLine)
                    810: int    count, lineno, lastLine;
                    811: {
                    812:        register int    j, k;
                    813:        chtype          *temp;
                    814: 
                    815: #ifdef TRACE
                    816:        if (_tracing)
                    817:            _tracef("DelLine(%d,%d,%d) called", count, lineno, lastLine);
                    818: #endif
                    819: 
                    820:        GoTo(lineno, 0);
                    821: 
                    822:        if (parm_delete_line)
                    823:        {
                    824:            tputs(tparm(parm_delete_line, count), 1, outc);
                    825:        }
                    826:        else
                    827:        {
                    828:            while (count--)
                    829:                tputs(delete_line, 1, outc);
                    830:        }
                    831: 
                    832:        for (k = lineno; k + count <= lastLine; k++)
                    833:        {
                    834:            temp = curscr->_line[k];
                    835:            curscr->_line[k] = curscr->_line[k + count];
                    836:            curscr->_line[k + count] = temp;
                    837:        }
                    838: 
                    839:        for (; k <= lastLine; k++)
                    840:            for (j=0; j < columns; j++)
                    841:                curscr->_line[k][j] = ' ';
                    842: }

unix.superglobalmegacorp.com

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