Annotation of coherent/d/usr/bin/elvis/input.c, revision 1.1

1.1     ! root        1: /* input.c */
        !             2: 
        !             3: /* Author:
        !             4:  *     Steve Kirkendall
        !             5:  *     16820 SW Tallac Way
        !             6:  *     Beaverton, OR 97006
        !             7:  *     [email protected], or ...uunet!tektronix!psueea!jove!kirkenda
        !             8:  */
        !             9: 
        !            10: 
        !            11: /* This file contains the input() function, which implements vi's INPUT mode.
        !            12:  * It also contains the code that supports digraphs.
        !            13:  */
        !            14: 
        !            15: #include <ctype.h>
        !            16: #include "config.h"
        !            17: #include "vi.h"
        !            18: 
        !            19: 
        !            20: #ifndef NO_DIGRAPH
        !            21: static struct _DIG
        !            22: {
        !            23:        struct _DIG     *next;
        !            24:        char            key1;
        !            25:        char            key2;
        !            26:        char            dig;
        !            27:        char            save;
        !            28: } *digs;
        !            29: 
        !            30: char digraph(key1, key2)
        !            31:        char    key1;   /* the underlying character */
        !            32:        char    key2;   /* the second character */
        !            33: {
        !            34:        int             newkey;
        !            35:        REG struct _DIG *dp;
        !            36: 
        !            37:        /* if digraphs are disabled, then just return the new char */
        !            38:        if (!*o_digraph)
        !            39:        {
        !            40:                return key2;
        !            41:        }
        !            42: 
        !            43:        /* remember the new key, so we can return it if this isn't a digraph */
        !            44:        newkey = key2;
        !            45: 
        !            46:        /* sort key1 and key2, so that their original order won't matter */
        !            47:        if (key1 > key2)
        !            48:        {
        !            49:                key2 = key1;
        !            50:                key1 = newkey;
        !            51:        }
        !            52: 
        !            53:        /* scan through the digraph chart */
        !            54:        for (dp = digs;
        !            55:             dp && (dp->key1 != key1 || dp->key2 != key2);
        !            56:             dp = dp->next)
        !            57:        {
        !            58:        }
        !            59: 
        !            60:        /* if this combination isn't in there, just use the new key */
        !            61:        if (!dp)
        !            62:        {
        !            63:                return newkey;
        !            64:        }
        !            65: 
        !            66:        /* else use the digraph key */
        !            67:        return dp->dig;
        !            68: }
        !            69: 
        !            70: /* this function lists or defines digraphs */
        !            71: void do_digraph(bang, extra)
        !            72:        int     bang;
        !            73:        char    extra[];
        !            74: {
        !            75:        int             dig;
        !            76:        REG struct _DIG *dp;
        !            77:        struct _DIG     *prev;
        !            78:        static int      user_defined = FALSE; /* boolean: are all later digraphs user-defined? */
        !            79: 
        !            80:        /* if "extra" is NULL, then we've reached the end of the built-ins */
        !            81:        if (!extra)
        !            82:        {
        !            83:                user_defined = TRUE;
        !            84:                return;
        !            85:        }
        !            86: 
        !            87:        /* if no args, then display the existing digraphs */
        !            88:        if (*extra < ' ')
        !            89:        {
        !            90:                for (dp = digs; dp; dp = dp->next)
        !            91:                {
        !            92:                        if (dp->save || bang)
        !            93:                        {
        !            94:                                addstr("digraph ");
        !            95:                                addch(dp->key1);
        !            96:                                addch(dp->key2);
        !            97:                                addch(' ');
        !            98:                                addch(dp->dig);
        !            99:                                addch('\n');
        !           100:                                exrefresh();
        !           101:                        }
        !           102:                }
        !           103:                return;
        !           104:        }
        !           105: 
        !           106:        /* make sure we have at least two characters */
        !           107:        if (!extra[1])
        !           108:        {
        !           109:                msg("Digraphs must be composed of two characters");
        !           110:                return;
        !           111:        }
        !           112: 
        !           113:        /* sort key1 and key2, so that their original order won't matter */
        !           114:        if (extra[0] > extra[1])
        !           115:        {
        !           116:                dig = extra[0];
        !           117:                extra[0] = extra[1];
        !           118:                extra[1] = dig;
        !           119:        }
        !           120: 
        !           121:        /* locate the new digraph character */
        !           122:        for (dig = 2; extra[dig] == ' ' || extra[dig] == '\t'; dig++)
        !           123:        {
        !           124:        }
        !           125:        dig = extra[dig];
        !           126:        if (!bang && dig)
        !           127:        {
        !           128:                dig |= 0x80;
        !           129:        }
        !           130: 
        !           131:        /* search for the digraph */
        !           132:        for (prev = (struct _DIG *)0, dp = digs;
        !           133:             dp && (dp->key1 != extra[0] || dp->key2 != extra[1]);
        !           134:             prev = dp, dp = dp->next)
        !           135:        {
        !           136:        }
        !           137: 
        !           138:        /* deleting the digraph? */
        !           139:        if (!dig)
        !           140:        {
        !           141:                if (!dp)
        !           142:                {
        !           143: #ifndef CRUNCH
        !           144:                        msg("%c%c not a digraph", extra[0], extra[1]);
        !           145: #endif
        !           146:                        return;
        !           147:                }
        !           148:                if (prev)
        !           149:                        prev->next = dp->next;
        !           150:                else
        !           151:                        digs = dp->next;
        !           152:                free(dp);
        !           153:                return;
        !           154:        }
        !           155: 
        !           156:        /* if necessary, create a new digraph struct for the new digraph */
        !           157:        if (dig && !dp)
        !           158:        {
        !           159:                dp = (struct _DIG *)malloc(sizeof *dp);
        !           160:                if (!dp)
        !           161:                {
        !           162:                        msg("Out of space in the digraph table");
        !           163:                        return;
        !           164:                }
        !           165:                if (prev)
        !           166:                        prev->next = dp;
        !           167:                else
        !           168:                        digs = dp;
        !           169:                dp->next = (struct _DIG *)0;
        !           170:        }
        !           171: 
        !           172:        /* assign it the new digraph value */
        !           173:        dp->key1 = extra[0];
        !           174:        dp->key2 = extra[1];
        !           175:        dp->dig = dig;
        !           176:        dp->save = user_defined;
        !           177: }
        !           178: 
        !           179: # ifndef NO_MKEXRC
        !           180: void savedigs(fd)
        !           181:        int             fd;
        !           182: {
        !           183:        static char     buf[] = "digraph! XX Y\n";
        !           184:        REG struct _DIG *dp;
        !           185: 
        !           186:        for (dp = digs; dp; dp = dp->next)
        !           187:        {
        !           188:                if (dp->save)
        !           189:                {
        !           190:                        buf[9] = dp->key1;
        !           191:                        buf[10] = dp->key2;
        !           192:                        buf[12] = dp->dig;
        !           193:                        write(fd, buf, (unsigned)14);
        !           194:                }
        !           195:        }
        !           196: }
        !           197: # endif
        !           198: #endif
        !           199: 
        !           200: 
        !           201: #ifndef NO_ABBR
        !           202: static struct _AB
        !           203: {
        !           204:        struct _AB      *next;
        !           205:        char            *large;         /* the expanded form */
        !           206:        char            small[1];       /* the abbreviated form (appended to struct) */
        !           207: }
        !           208:        *abbrev;
        !           209: 
        !           210: /* This functions lists or defines abbreviations */
        !           211: void do_abbr(extra)
        !           212:        char    *extra;
        !           213: {
        !           214:        int             smlen;  /* length of the small form */
        !           215:        int             lrg;    /* index of the start of the large form */
        !           216:        REG struct _AB  *ab;    /* used to move through the abbrev list */
        !           217:        struct _AB      *prev;
        !           218: 
        !           219:        /* no arguments? */
        !           220:        if (!*extra)
        !           221:        {
        !           222:                /* list all current abbreviations */
        !           223:                for (ab = abbrev; ab; ab = ab->next)
        !           224:                {
        !           225:                        qaddstr("abbr ");
        !           226:                        qaddstr(ab->small);
        !           227:                        qaddch(' ');
        !           228:                        qaddstr(ab->large);
        !           229:                        addch('\n');
        !           230:                        exrefresh();
        !           231:                }
        !           232:                return;
        !           233:        }
        !           234: 
        !           235:        /* else one or more arguments.  Parse the first & look up in abbrev[] */
        !           236:        for (smlen = 0; extra[smlen] && isalnum(extra[smlen]); smlen++)
        !           237:        {
        !           238:        }
        !           239:        for (prev = (struct _AB *)0, ab = abbrev; ab; prev = ab, ab = ab->next)
        !           240:        {
        !           241:                if (!strncmp(extra, ab->small, smlen) && !ab->small[smlen])
        !           242:                {
        !           243:                        break;
        !           244:                }
        !           245:        }
        !           246: 
        !           247:        /* locate the start of the large form, if any */
        !           248:        for (lrg = smlen; extra[lrg] && isascii(extra[lrg]) && isspace(extra[lrg]); lrg++)
        !           249:        {
        !           250:        }
        !           251: 
        !           252:        /* only one arg? */
        !           253:        if (!extra[lrg])
        !           254:        {
        !           255:                /* trying to undo an abbreviation which doesn't exist? */
        !           256:                if (!ab)
        !           257:                {
        !           258: #ifndef CRUNCH
        !           259:                        msg("\"%s\" not an abbreviation", extra);
        !           260: #endif
        !           261:                        return;
        !           262:                }
        !           263: 
        !           264:                /* undo the abbreviation */
        !           265:                if (prev)
        !           266:                        prev->next = ab->next;
        !           267:                else
        !           268:                        abbrev = ab->next;
        !           269:                free(ab->large);
        !           270:                free(ab);
        !           271: 
        !           272:                return;
        !           273:        }
        !           274: 
        !           275:        /* multiple args - [re]define an abbreviation */
        !           276:        if (ab)
        !           277:        {
        !           278:                /* redefining - free the old large form */
        !           279:                free(ab->large);
        !           280:        }
        !           281:        else
        !           282:        {
        !           283:                /* adding a new definition - make a new struct */
        !           284:                ab = (struct _AB *)malloc((unsigned)(smlen + sizeof *ab));
        !           285: #ifndef CRUNCH
        !           286:                if (!ab)
        !           287:                {
        !           288:                        msg("Out of memory -- Sorry");
        !           289:                        return;
        !           290:                }
        !           291: #endif
        !           292:                strncpy(ab->small, extra, smlen);
        !           293:                ab->small[smlen] = '\0';
        !           294:                ab->next = (struct _AB *)0;
        !           295:                if (prev)
        !           296:                        prev->next = ab;
        !           297:                else
        !           298:                        abbrev = ab;
        !           299:        }
        !           300: 
        !           301:        /* store the new form */
        !           302:        ab->large = (char *)malloc((unsigned)(strlen(&extra[lrg]) + 1));
        !           303:        strcpy(ab->large, &extra[lrg]);
        !           304: }
        !           305: 
        !           306: 
        !           307: # ifndef NO_MKEXRC
        !           308: /* This function is called from cmd_mkexrc() to save the abbreviations */
        !           309: void saveabbr(fd)
        !           310:        int     fd;     /* fd to which the :abbr commands should be written */
        !           311: {
        !           312:        REG struct _AB  *ab;
        !           313: 
        !           314:        for (ab = abbrev; ab; ab = ab->next)
        !           315:        {
        !           316:                twrite(fd, "abbr ", 5);
        !           317:                twrite(fd, ab->small, strlen(ab->small));
        !           318:                twrite(fd, " ", 1);
        !           319:                twrite(fd, ab->large, strlen(ab->large));
        !           320:                twrite(fd, "\n", 1);
        !           321:        }
        !           322: }
        !           323: # endif
        !           324: 
        !           325: /* This function should be called before each char is inserted.  If the next
        !           326:  * char is non-alphanumeric and we're at the end of a word, then that word
        !           327:  * is checked against the abbrev[] array and expanded, if appropriate.  Upon
        !           328:  * returning from this function, the new char still must be inserted.
        !           329:  */
        !           330: static MARK expandabbr(m, ch)
        !           331:        MARK            m;      /* the cursor position */
        !           332:        int             ch;     /* the character to insert */
        !           333: {
        !           334:        char            *word;  /* where the word starts */
        !           335:        int             len;    /* length of the word */
        !           336:        REG struct _AB  *ab;
        !           337: 
        !           338:        /* if no abbreviations are in effect, or ch is aphanumeric, then
        !           339:         * don't do anything
        !           340:         */
        !           341:        if (!abbrev || !isascii(ch) || isalnum(ch))
        !           342:        {
        !           343:                return m;
        !           344:        }
        !           345: 
        !           346:        /* see where the preceding word starts */
        !           347:        pfetch(markline(m));
        !           348:        for (word = ptext + markidx(m), len = 0;
        !           349:             --word >= ptext && (!isascii(*word) || isalnum(*word));
        !           350:             len++)
        !           351:        {
        !           352:        }
        !           353:        word++;
        !           354: 
        !           355:        /* if zero-length, then it isn't a word, really -- so nothing */
        !           356:        if (len == 0)
        !           357:        {
        !           358:                return m;
        !           359:        }
        !           360: 
        !           361:        /* look it up in the abbrev list */
        !           362:        for (ab = abbrev; ab; ab = ab->next)
        !           363:        {
        !           364:                if (!strncmp(ab->small, word, len) && !ab->small[len])
        !           365:                {
        !           366:                        break;
        !           367:                }
        !           368:        }
        !           369: 
        !           370:        /* not an abbreviation? then do nothing */
        !           371:        if (!ab)
        !           372:        {
        !           373:                return m;
        !           374:        }
        !           375: 
        !           376:        /* else replace the small form with the large form */
        !           377:        add(m, ab->large);
        !           378:        delete(m - len, m);
        !           379: 
        !           380:        /* return with the cursor after the end of the large form */
        !           381:        return m - len + strlen(ab->large);
        !           382: }
        !           383: #endif
        !           384: 
        !           385:                
        !           386: /* This function allows the user to replace an existing (possibly zero-length)
        !           387:  * chunk of text with typed-in text.  It returns the MARK of the last character
        !           388:  * that the user typed in.
        !           389:  */
        !           390: MARK input(from, to, when)
        !           391:        MARK    from;   /* where to start inserting text */
        !           392:        MARK    to;     /* extent of text to delete */
        !           393:        int     when;   /* either WHEN_VIINP or WHEN_VIREP */
        !           394: {
        !           395:        char    key[2]; /* key char followed by '\0' char */
        !           396:        char    *build; /* used in building a newline+indent string */
        !           397:        char    *scan;  /* used while looking at the indent chars of a line */
        !           398:        MARK    m;      /* some place in the text */
        !           399: #ifndef NO_EXTENSIONS
        !           400:        int     quit = FALSE;   /* boolean: are we exiting after this? */
        !           401: #endif
        !           402: 
        !           403: #ifdef DEBUG
        !           404:        /* if "from" and "to" are reversed, complain */
        !           405:        if (from > to)
        !           406:        {
        !           407:                msg("ERROR: input(%ld:%d, %ld:%d)",
        !           408:                        markline(from), markidx(from),
        !           409:                        markline(to), markidx(to));
        !           410:                return MARK_UNSET;
        !           411:        }
        !           412: #endif
        !           413: 
        !           414:        key[1] = 0;
        !           415: 
        !           416:        /* if we're replacing text with new text, save the old stuff */
        !           417:        /* (Alas, there is no easy way to save text for replace mode) */
        !           418:        if (from != to)
        !           419:        {
        !           420:                cut(from, to);
        !           421:        }
        !           422: 
        !           423:        ChangeText
        !           424:        {
        !           425:                /* if doing a dot command, then reuse the previous text */
        !           426:                if (doingdot)
        !           427:                {
        !           428:                        /* delete the text that's there now */
        !           429:                        if (from != to)
        !           430:                        {
        !           431:                                delete(from, to);
        !           432:                        }
        !           433: 
        !           434:                        /* insert the previous text */
        !           435:                        cutname('.');
        !           436:                        cursor = paste(from, FALSE, TRUE) + 1L;
        !           437:                }
        !           438:                else /* interactive version */
        !           439:                {
        !           440:                        /* if doing a change within the line... */
        !           441:                        if (from != to && markline(from) == markline(to))
        !           442:                        {
        !           443:                                /* mark the end of the text with a "$" */
        !           444:                                change(to - 1, to, "$");
        !           445:                        }
        !           446:                        else
        !           447:                        {
        !           448:                                /* delete the old text right off */
        !           449:                                if (from != to)
        !           450:                                {
        !           451:                                        delete(from, to);
        !           452:                                }
        !           453:                                to = from;
        !           454:                        }
        !           455: 
        !           456:                        /* handle autoindent of the first line, maybe */
        !           457:                        cursor = from;
        !           458:                        if (*o_autoindent && markline(cursor) > 1L && markidx(cursor) == 0)
        !           459:                        {
        !           460:                                /* Only autoindent blank lines. */
        !           461:                                pfetch(markline(cursor));
        !           462:                                if (plen == 0)
        !           463:                                {
        !           464:                                        /* Okay, we really want to autoindent */
        !           465:                                        pfetch(markline(cursor) - 1L);
        !           466:                                        for (scan = ptext, build = tmpblk.c;
        !           467:                                             *scan == ' ' || *scan == '\t';
        !           468:                                             )
        !           469:                                        {
        !           470:                                                *build++ = *scan++;
        !           471:                                        }
        !           472:                                        if (build > tmpblk.c)
        !           473:                                        {
        !           474:                                                *build = '\0';
        !           475:                                                add(cursor, tmpblk.c);
        !           476:                                                cursor += (build - tmpblk.c);
        !           477:                                        }
        !           478:                                }
        !           479:                        }
        !           480: 
        !           481:                        /* repeatedly add characters from the user */
        !           482:                        for (;;)
        !           483:                        {
        !           484:                                /* Get a character */
        !           485:                                redraw(cursor, TRUE);
        !           486: #ifdef DEBUG
        !           487:                                msg("cursor=%ld.%d, to=%ld.%d",
        !           488:                                        markline(cursor), markidx(cursor),
        !           489:                                        markline(to), markidx(to));
        !           490: #endif
        !           491:                                key[0] = getkey(when);
        !           492: 
        !           493:                                /* if whitespace & wrapmargin is set & we're
        !           494:                                 * past the warpmargin, then change the
        !           495:                                 * whitespace character into a newline
        !           496:                                 */
        !           497:                                if ((*key == ' ' || *key == '\t')
        !           498:                                 && *o_wrapmargin != 0)
        !           499:                                {
        !           500:                                        pfetch(markline(cursor));
        !           501:                                        if (idx2col(cursor, ptext, TRUE) > COLS - (*o_wrapmargin & 0xff))
        !           502:                                        {
        !           503:                                                *key = '\n';
        !           504:                                        }
        !           505:                                }
        !           506: 
        !           507:                                /* process it */
        !           508:                                switch (*key)
        !           509:                                {
        !           510: #ifndef NO_EXTENSIONS
        !           511:                                  case 0: /* special movement mapped keys */
        !           512:                                        *key = getkey(0);
        !           513:                                        switch (*key)
        !           514:                                        {
        !           515:                                          case 'h':     m = m_left(cursor, 0L);         break;
        !           516:                                          case 'j':
        !           517:                                          case 'k':     m = m_updnto(cursor, 0L, *key); break;
        !           518:                                          case 'l':     m = cursor + 1;                 break;
        !           519:                                          case 'b':     m = m_bword(cursor, 0L);        break;
        !           520:                                          case 'w':     m = m_fword(cursor, 0L);        break;
        !           521:                                          case '^':     m = m_front(cursor, 0L);        break;
        !           522:                                          case '$':     m = m_rear(cursor, 0L);         break;
        !           523:                                          case ctrl('B'):
        !           524:                                          case ctrl('F'):
        !           525:                                                        m = m_scroll(cursor, 0L, *key); break;
        !           526:                                          case 'x':     m = v_xchar(cursor, 0L);        break;
        !           527:                                          case 'i':     m = to = from = cursor;         break;
        !           528:                                          default:      m = MARK_UNSET;                 break;
        !           529:                                        }
        !           530:                                        /* adjust the moved cursor */
        !           531:                                        m = adjmove(cursor, m, (*key == 'j' || *key == 'k' ? 0x20 : 0));
        !           532:                                        if (*key == '$' || (*key == 'l' && m <= cursor))
        !           533:                                        {
        !           534:                                                m++;
        !           535:                                        }
        !           536:                                        /* if the cursor is reasonable, use it */
        !           537:                                        if (m == MARK_UNSET)
        !           538:                                        {
        !           539:                                                beep();
        !           540:                                        }
        !           541:                                        else
        !           542:                                        {
        !           543:                                                if (to > cursor)
        !           544:                                                {
        !           545:                                                        delete(cursor, to);
        !           546:                                                        redraw(cursor, TRUE);
        !           547:                                                }
        !           548:                                                from = to = cursor = m;
        !           549:                                        }
        !           550:                                        break;
        !           551: 
        !           552:                                  case ctrl('Z'):
        !           553:                                        if (getkey(0) == ctrl('Z'))
        !           554:                                        {
        !           555:                                                quit = TRUE;
        !           556:                                                goto BreakBreak;
        !           557:                                        }
        !           558:                                        break;
        !           559: #endif
        !           560: 
        !           561:                                  case ctrl('['):
        !           562: #ifndef NO_ABBR
        !           563:                                        cursor = expandabbr(cursor, ctrl('['));
        !           564: #endif
        !           565:                                        goto BreakBreak;
        !           566: 
        !           567:                                  case ctrl('U'):
        !           568:                                        if (markline(cursor) == markline(from))
        !           569:                                        {
        !           570:                                                cursor = from;
        !           571:                                        }
        !           572:                                        else
        !           573:                                        {
        !           574:                                                cursor &= ~(BLKSIZE - 1);
        !           575:                                        }
        !           576:                                        break;
        !           577: 
        !           578:                                  case ctrl('D'):
        !           579:                                  case ctrl('T'):
        !           580:                                        if (to > cursor)
        !           581:                                        {
        !           582:                                                delete(cursor, to);
        !           583:                                        }
        !           584:                                        mark[27] = cursor;
        !           585:                                        cmd_shift(cursor, cursor, *key == ctrl('D') ? CMD_SHIFTL : CMD_SHIFTR, TRUE, "");
        !           586:                                        if (mark[27])
        !           587:                                        {
        !           588:                                                cursor = mark[27];
        !           589:                                        }
        !           590:                                        else
        !           591:                                        {
        !           592:                                                cursor = m_front(cursor, 0L);
        !           593:                                        }
        !           594:                                        to = cursor;
        !           595:                                        break;
        !           596: 
        !           597:                                  case '\b':
        !           598:                                        if (cursor <= from)
        !           599:                                        {
        !           600:                                                beep();
        !           601:                                        }
        !           602:                                        else if (markidx(cursor) == 0)
        !           603:                                        {
        !           604:                                                cursor -= BLKSIZE;
        !           605:                                                pfetch(markline(cursor));
        !           606:                                                cursor += plen;
        !           607:                                        }
        !           608:                                        else
        !           609:                                        {
        !           610:                                                cursor--;
        !           611:                                        }
        !           612:                                        break;
        !           613: 
        !           614:                                  case ctrl('W'):
        !           615:                                        m = m_bword(cursor, 1L);
        !           616:                                        if (markline(m) == markline(cursor) && m >= from)
        !           617:                                        {
        !           618:                                                cursor = m;
        !           619:                                                if (from > cursor)
        !           620:                                                {
        !           621:                                                        from = cursor;
        !           622:                                                }
        !           623:                                        }
        !           624:                                        else
        !           625:                                        {
        !           626:                                                beep();
        !           627:                                        }
        !           628:                                        break;
        !           629: 
        !           630:                                  case '\n':
        !           631: #if OSK
        !           632:                                  case '\l':
        !           633: #else                            
        !           634:                                  case '\r':
        !           635: #endif
        !           636: #ifndef NO_ABBR
        !           637:                                        cursor = expandabbr(cursor, '\n');
        !           638: #endif
        !           639:                                        build = tmpblk.c;
        !           640:                                        *build++ = '\n';
        !           641:                                        if (*o_autoindent)
        !           642:                                        {
        !           643:                                                /* figure out indent for next line */
        !           644:                                                pfetch(markline(cursor));
        !           645:                                                for (scan = ptext; *scan == ' ' || *scan == '\t'; )
        !           646:                                                {
        !           647:                                                        *build++ = *scan++;
        !           648:                                                }
        !           649: 
        !           650:                                                /* remove indent from this line, if blank */
        !           651:                                                if (!*scan && plen > 0)
        !           652:                                                {
        !           653:                                                        to = cursor &= ~(BLKSIZE - 1);
        !           654:                                                        delete(cursor, cursor + plen);
        !           655:                                                }
        !           656:                                        }
        !           657:                                        *build = 0;
        !           658:                                        if (cursor >= to && when != WHEN_VIREP)
        !           659:                                        {
        !           660:                                                add(cursor, tmpblk.c);
        !           661:                                        }
        !           662:                                        else
        !           663:                                        {
        !           664:                                                change(cursor, to, tmpblk.c);
        !           665:                                        }
        !           666:                                        redraw(cursor, TRUE);
        !           667:                                        to = cursor = (cursor & ~(BLKSIZE - 1))
        !           668:                                                        + BLKSIZE
        !           669:                                                        + (int)(build - tmpblk.c) - 1;
        !           670:                                        break;
        !           671: 
        !           672:                                  case ctrl('A'):
        !           673:                                  case ctrl('P'):
        !           674:                                        if (cursor < to)
        !           675:                                        {
        !           676:                                                delete(cursor, to);
        !           677:                                        }
        !           678:                                        if (*key == ctrl('A'))
        !           679:                                        {
        !           680:                                                cutname('.');
        !           681:                                        }
        !           682:                                        to = cursor = paste(cursor, FALSE, TRUE) + 1L;
        !           683:                                        break;
        !           684: 
        !           685:                                  case ctrl('V'):
        !           686:                                        if (cursor >= to && when != WHEN_VIREP)
        !           687:                                        {
        !           688:                                                add(cursor, "^");
        !           689:                                        }
        !           690:                                        else
        !           691:                                        {
        !           692:                                                change(cursor, to, "^");
        !           693:                                                to = cursor + 1;
        !           694:                                        }
        !           695:                                        redraw(cursor, TRUE);
        !           696:                                        *key = getkey(0);
        !           697:                                        if (*key == '\n')
        !           698:                                        {
        !           699:                                                /* '\n' too hard to handle */
        !           700: #if OSK
        !           701:                                                *key = '\l';
        !           702: #else
        !           703:                                                *key = '\r';
        !           704: #endif
        !           705:                                        }
        !           706:                                        change(cursor, cursor + 1, key);
        !           707:                                        cursor++;
        !           708:                                        if (cursor > to)
        !           709:                                        {
        !           710:                                                to = cursor;
        !           711:                                        }
        !           712:                                        break;
        !           713: 
        !           714:                                  case ctrl('L'):
        !           715:                                  case ctrl('R'):
        !           716:                                        redraw(MARK_UNSET, FALSE);
        !           717:                                        break;
        !           718: 
        !           719:                                  default:
        !           720:                                        if (cursor >= to && when != WHEN_VIREP)
        !           721:                                        {
        !           722: #ifndef NO_ABBR
        !           723:                                                cursor = expandabbr(cursor, *key);
        !           724: #endif
        !           725:                                                add(cursor, key);
        !           726:                                                cursor++;
        !           727:                                                to = cursor;
        !           728:                                        }
        !           729:                                        else
        !           730:                                        {
        !           731:                                                pfetch(markline(cursor));
        !           732:                                                if (markidx(cursor) == plen)
        !           733:                                                {
        !           734: #ifndef NO_ABBR
        !           735:                                                        cursor = expandabbr(cursor, *key);
        !           736: #endif
        !           737:                                                        add(cursor, key);
        !           738:                                                }
        !           739:                                                else
        !           740:                                                {
        !           741: #ifndef NO_DIGRAPH
        !           742:                                                        *key = digraph(ptext[markidx(cursor)], *key);
        !           743: #endif
        !           744: #ifndef NO_ABBR
        !           745:                                                        cursor = expandabbr(cursor, *key);
        !           746: #endif
        !           747:                                                        change(cursor, cursor + 1, key);
        !           748:                                                }
        !           749:                                                cursor++;
        !           750:                                        }
        !           751: #ifndef NO_SHOWMATCH
        !           752:                                        /* show matching "({[" if neceesary */
        !           753:                                        if (*o_showmatch && strchr(")}]", *key))
        !           754:                                        {
        !           755:                                                m = m_match(cursor - 1, 0L);
        !           756:                                                if (markline(m) >= topline
        !           757:                                                 && markline(m) <= botline)
        !           758:                                                {
        !           759:                                                        redraw(m, TRUE);
        !           760:                                                        refresh();
        !           761:                                                        sleep(1);
        !           762:                                                }
        !           763:                                        }
        !           764: #endif
        !           765:                                } /* end switch(*key) */
        !           766:                        } /* end for(;;) */
        !           767: BreakBreak:;
        !           768: 
        !           769:                        /* delete any excess characters */
        !           770:                        if (cursor < to)
        !           771:                        {
        !           772:                                delete(cursor, to);
        !           773:                        }
        !           774: 
        !           775:                } /* end if doingdot else */
        !           776: 
        !           777:        } /* end ChangeText */
        !           778: 
        !           779:        /* put the new text into a cut buffer for possible reuse */
        !           780:        if (!doingdot)
        !           781:        {
        !           782:                blksync();
        !           783:                cutname('.');
        !           784:                cut(from, cursor);
        !           785:        }
        !           786: 
        !           787:        /* move to last char that we inputted, unless it was newline */
        !           788:        if (markidx(cursor) != 0)
        !           789:        {
        !           790:                cursor--;
        !           791:        }
        !           792:        redraw(cursor, FALSE);
        !           793: 
        !           794: #ifndef NO_EXTENSIONS
        !           795:        if (quit)
        !           796:        {
        !           797:                refresh();
        !           798:                cursor = v_xit(cursor, 0L, 'Z');
        !           799:        }
        !           800: #endif
        !           801: 
        !           802:        rptlines = 0L;
        !           803:        return cursor;
        !           804: }

unix.superglobalmegacorp.com

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