Annotation of coherent/d/usr/bin/elvis/vcmd.c, revision 1.1.1.1

1.1       root        1: /* vcmd.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 functions that handle VI commands */
                     12: 
                     13: 
                     14: #include "config.h"
                     15: #include "vi.h"
                     16: #if MSDOS
                     17: #include <process.h>
                     18: #include <string.h>
                     19: #endif
                     20: #if TOS
                     21: #include <osbind.h>
                     22: #include <string.h>
                     23: #endif
                     24: #if OSK
                     25: # include <stdio.h>
                     26: #endif
                     27: 
                     28: 
                     29: /* This function puts the editor in EX mode */
                     30: MARK v_quit()
                     31: {
                     32:        move(LINES - 1, 0);
                     33:        mode = MODE_EX;
                     34:        return cursor;
                     35: }
                     36: 
                     37: /* This function causes the screen to be redrawn */
                     38: MARK v_redraw()
                     39: {
                     40:        redraw(MARK_UNSET, FALSE);
                     41:        return cursor;
                     42: }
                     43: 
                     44: /* This function executes a single EX command, and waits for a user keystroke
                     45:  * before returning to the VI screen.  If that keystroke is another ':', then
                     46:  * another EX command is read and executed.
                     47:  */
                     48: /*ARGSUSED*/
                     49: MARK v_1ex(m, text)
                     50:        MARK    m;      /* the current line */
                     51:        char    *text;  /* the first command to execute */
                     52: {
                     53:        /* run the command.  be careful about modes & output */
                     54:        exwrote = (mode == MODE_COLON);
                     55:        doexcmd(text);
                     56:        exrefresh();
                     57: 
                     58:        /* if mode is no longer MODE_VI, then we should quit right away! */
                     59:        if (mode != MODE_VI && mode != MODE_COLON)
                     60:                return cursor;
                     61: 
                     62:        /* The command did some output.  Wait for a keystoke. */
                     63:        if (exwrote)
                     64:        {
                     65:                mode = MODE_VI; 
                     66:                msg("[Hit <RETURN> to continue]");
                     67:                if (getkey(0) == ':')
                     68:                {       mode = MODE_COLON;
                     69:                        addch('\n');
                     70:                }
                     71:                else
                     72:                        redraw(MARK_UNSET, FALSE);
                     73:        }
                     74: 
                     75:        return cursor;
                     76: }
                     77: 
                     78: /* This function undoes the last change */
                     79: /*ARGSUSED*/
                     80: MARK v_undo(m)
                     81:        MARK    m;      /* (ignored) */
                     82: {
                     83:        if (undo())
                     84:        {
                     85:                redraw(MARK_UNSET, FALSE);
                     86:        }
                     87:        return cursor;
                     88: }
                     89: 
                     90: /* This function deletes the character(s) that the cursor is on */
                     91: MARK v_xchar(m, cnt, cmd)
                     92:        MARK    m;      /* where to start deletions */
                     93:        long    cnt;    /* number of chars to delete */
                     94:        int     cmd;    /* either 'x' or 'X' */
                     95: {
                     96:        DEFAULT(1);
                     97: 
                     98:        /* for 'X', adjust so chars are deleted *BEFORE* cursor */
                     99:        if (cmd == 'X')
                    100:        {
                    101:                if (markidx(m) < cnt)
                    102:                        return MARK_UNSET;
                    103:                m -= cnt;
                    104:        }
                    105: 
                    106:        /* make sure we don't try to delete more thars than there are */
                    107:        pfetch(markline(m));
                    108:        if (markidx(m + cnt) > plen)
                    109:        {
                    110:                cnt = plen - markidx(m);
                    111:        }
                    112:        if (cnt == 0L)
                    113:        {
                    114:                return MARK_UNSET;
                    115:        }
                    116: 
                    117:        /* do it */
                    118:        ChangeText
                    119:        {
                    120:                cut(m, m + cnt);
                    121:                delete(m, m + cnt);
                    122:        }
                    123:        return m;
                    124: }
                    125: 
                    126: /* This function defines a mark */
                    127: /*ARGSUSED*/
                    128: MARK v_mark(m, count, key)
                    129:        MARK    m;      /* where the mark will be */
                    130:        long    count;  /* (ignored) */
                    131:        int     key;    /* the ASCII label of the mark */
                    132: {
                    133:        if (key < 'a' || key > 'z')
                    134:        {
                    135:                msg("Marks must be from a to z");
                    136:        }
                    137:        else
                    138:        {
                    139:                mark[key - 'a'] = m;
                    140:        }
                    141:        return m;
                    142: }
                    143: 
                    144: /* This function toggles upper & lower case letters */
                    145: MARK v_ulcase(m, cnt)
                    146:        MARK    m;      /* where to make the change */
                    147:        long    cnt;    /* number of chars to flip */
                    148: {
                    149:        REG char        *pos;
                    150:        REG int         i, j;
                    151:        static char     flip[] =
                    152:                "aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ[](){}<>";
                    153: 
                    154:        DEFAULT(1);
                    155: 
                    156:        /* fetch the current version of the line */
                    157:        pfetch(markline(m));
                    158: 
                    159:        /* for each position in the line */
                    160:        for (j = 0, i = markidx(m); j < cnt && ptext[i]; j++, i++)
                    161:        {
                    162:                tmpblk.c[j] = 0;
                    163: 
                    164:                /* one of the standard chars? */
                    165:                for (pos = flip; *pos && *pos != ptext[i]; pos++)
                    166:                {
                    167:                }
                    168:                if (*pos)
                    169:                {
                    170:                        tmpblk.c[j] = flip[(int)(pos - flip) ^ 1];
                    171:                }
                    172: #ifndef NO_DIGRAPH
                    173:                else /* one of the non-standard chars? */
                    174:                {
                    175:                        for (pos = o_flipcase; *pos && *pos != ptext[i]; pos++)
                    176:                        {
                    177:                        }
                    178:                        if (*pos)
                    179:                        {
                    180:                                tmpblk.c[j] = o_flipcase[(int)(pos - o_flipcase) ^ 1];
                    181:                        }
                    182:                }
                    183: #endif
                    184: 
                    185:                /* if nothing special, then don't change it */
                    186:                if (tmpblk.c[j] == 0)
                    187:                {
                    188:                        tmpblk.c[j] = ptext[i];
                    189:                }
                    190:        }
                    191: 
                    192:        /* if the new text is different from the old, then change it */
                    193:        if (strncmp(tmpblk.c, &ptext[markidx(m)], j))
                    194:        {
                    195:                ChangeText
                    196:                {
                    197:                        tmpblk.c[j] = '\0';
                    198:                        change(m, m + j, tmpblk.c);
                    199:                }
                    200:        }
                    201: 
                    202:        return m + j;
                    203: }
                    204: 
                    205: 
                    206: MARK v_replace(m, cnt, key)
                    207:        MARK    m;      /* first char to be replaced */
                    208:        long    cnt;    /* number of chars to replace */
                    209:        int     key;    /* what to replace them with */
                    210: {
                    211:        REG char        *text;
                    212:        REG int         i;
                    213: 
                    214:        DEFAULT(1);
                    215: 
                    216:        /* map ^M to '\n' */
                    217:        if (key == '\r')
                    218:        {
                    219:                key = '\n';
                    220:        }
                    221: 
                    222:        /* make sure the resulting line isn't too long */
                    223:        if (cnt > BLKSIZE - 2 - markidx(m))
                    224:        {
                    225:                cnt = BLKSIZE - 2 - markidx(m);
                    226:        }
                    227: 
                    228:        /* build a string of the desired character with the desired length */
                    229:        for (text = tmpblk.c, i = cnt; i > 0; i--)
                    230:        {
                    231:                *text++ = key;
                    232:        }
                    233:        *text = '\0';
                    234: 
                    235:        /* make sure cnt doesn't extend past EOL */
                    236:        pfetch(markline(m));
                    237:        key = markidx(m);
                    238:        if (key + cnt > plen)
                    239:        {
                    240:                cnt = plen - key;
                    241:        }
                    242: 
                    243:        /* do the replacement */
                    244:        ChangeText
                    245:        {
                    246:                change(m, m + cnt, tmpblk.c);
                    247:        }
                    248: 
                    249:        if (*tmpblk.c == '\n')
                    250:        {
                    251:                return (m & ~(BLKSIZE - 1)) + cnt * BLKSIZE;
                    252:        }
                    253:        else
                    254:        {
                    255:                return m + cnt - 1;
                    256:        }
                    257: }
                    258: 
                    259: MARK v_overtype(m)
                    260:        MARK            m;      /* where to start overtyping */
                    261: {
                    262:        MARK            end;    /* end of a substitution */
                    263:        static long     width;  /* width of a single-line replace */
                    264: 
                    265:        /* the "doingdot" version of replace is really a substitution */
                    266:        if (doingdot)
                    267:        {
                    268:                /* was the last one really repeatable? */
                    269:                if (width < 0)
                    270:                {
                    271:                        msg("Can't repeat a multi-line overtype command");
                    272:                        return MARK_UNSET;
                    273:                }
                    274: 
                    275:                /* replacing nothing by nothing?  Don't bother */
                    276:                if (width == 0)
                    277:                {
                    278:                        return m;
                    279:                }
                    280: 
                    281:                /* replace some chars by repeated text */
                    282:                return v_subst(m, width);
                    283:        }
                    284: 
                    285:        /* Normally, we input starting here, in replace mode */
                    286:        ChangeText
                    287:        {
                    288:                end = input(m, m, WHEN_VIREP);
                    289:        }
                    290: 
                    291:        /* if we ended on the same line we started on, then this
                    292:         * overtype is repeatable via the dot key.
                    293:         */
                    294:        if (markline(end) == markline(m) && end >= m - 1L)
                    295:        {
                    296:                width = end - m + 1L;
                    297:        }
                    298:        else /* it isn't repeatable */
                    299:        {
                    300:                width = -1L;
                    301:        }
                    302: 
                    303:        return end;
                    304: }
                    305: 
                    306: 
                    307: /* This function selects which cut buffer to use */
                    308: /*ARGSUSED*/
                    309: MARK v_selcut(m, cnt, key)
                    310:        MARK    m;
                    311:        long    cnt;
                    312:        int     key;
                    313: {
                    314:        cutname(key);
                    315:        return m;
                    316: }
                    317: 
                    318: /* This function pastes text from a cut buffer */
                    319: /*ARGSUSED*/
                    320: MARK v_paste(m, cnt, cmd)
                    321:        MARK    m;      /* where to paste the text */
                    322:        long    cnt;    /* (ignored) */
                    323:        int     cmd;    /* either 'p' or 'P' */
                    324: {
                    325:        ChangeText
                    326:        {
                    327:                m = paste(m, cmd == 'p', FALSE);
                    328:        }
                    329:        return m;
                    330: }
                    331: 
                    332: /* This function yanks text into a cut buffer */
                    333: MARK v_yank(m, n)
                    334:        MARK    m, n;   /* range of text to yank */
                    335: {
                    336:        cut(m, n);
                    337:        return m;
                    338: }
                    339: 
                    340: /* This function deletes a range of text */
                    341: MARK v_delete(m, n)
                    342:        MARK    m, n;   /* range of text to delete */
                    343: {
                    344:        /* illegal to try and delete nothing */
                    345:        if (n <= m)
                    346:        {
                    347:                return MARK_UNSET;
                    348:        }
                    349: 
                    350:        /* Do it */
                    351:        ChangeText
                    352:        {
                    353:                cut(m, n);
                    354:                delete(m, n);
                    355:        }
                    356:        return m;
                    357: }
                    358: 
                    359: 
                    360: /* This starts input mode without deleting anything */
                    361: MARK v_insert(m, cnt, key)
                    362:        MARK    m;      /* where to start (sort of) */
                    363:        long    cnt;    /* repeat how many times? */
                    364:        int     key;    /* what command is this for? {a,A,i,I,o,O} */
                    365: {
                    366:        int     wasdot;
                    367:        long    reps;
                    368:        int     after;  /* are we appending or inserting? */
                    369: 
                    370:        DEFAULT(1);
                    371: 
                    372:        ChangeText
                    373:        {
                    374:                /* tweak the insertion point, based on command key */
                    375:                switch (key)
                    376:                {
                    377:                  case 'i':
                    378:                        after = FALSE;
                    379:                        break;
                    380: 
                    381:                  case 'a':
                    382:                        pfetch(markline(m));
                    383:                        if (plen > 0)
                    384:                        {
                    385:                                m++;
                    386:                        }
                    387:                        after = TRUE;
                    388:                        break;
                    389: 
                    390:                  case 'I':
                    391:                        m = m_front(m, 1L);
                    392:                        after = FALSE;
                    393:                        break;
                    394: 
                    395:                  case 'A':
                    396:                        pfetch(markline(m));
                    397:                        m = (m & ~(BLKSIZE - 1)) + plen;
                    398:                        after = TRUE;
                    399:                        break;
                    400: 
                    401:                  case 'O':
                    402:                        m &= ~(BLKSIZE - 1);
                    403:                        add(m, "\n");
                    404:                        after = FALSE;
                    405:                        break;
                    406: 
                    407:                  case 'o':
                    408:                        m = (m & ~(BLKSIZE - 1)) + BLKSIZE;
                    409:                        add(m, "\n");
                    410:                        after = FALSE;
                    411:                        break;
                    412:                }
                    413: 
                    414:                /* insert the same text once or more */
                    415:                for (reps = cnt, wasdot = doingdot; reps > 0; reps--, doingdot = TRUE)
                    416:                {
                    417:                        m = input(m, m, WHEN_VIINP);
                    418:                        if (after)
                    419:                        {
                    420:                                m++;
                    421:                        }
                    422:                }
                    423:                if (after)
                    424:                {
                    425:                        m--;
                    426:                }
                    427: 
                    428:                doingdot = wasdot;
                    429:        }
                    430: 
                    431: #ifndef CRUNCH
                    432: # ifndef NO_EXTENSIONS
                    433:        if (key == 'i' && *o_inputmode)
                    434:        {
                    435:                msg("Now in visual command mode!  To return to input mode, hit <i>.");
                    436:        }
                    437: # endif
                    438: #endif
                    439: 
                    440:        return m;
                    441: }
                    442: 
                    443: /* This starts input mode with some text deleted */
                    444: MARK v_change(m, n)
                    445:        MARK    m, n;   /* the range of text to change */
                    446: {
                    447:        int     lnmode; /* is this a line-mode change? */
                    448: 
                    449:        /* swap them if they're in reverse order */
                    450:        if (m > n)
                    451:        {
                    452:                MARK    tmp;
                    453:                tmp = m;
                    454:                m = n;
                    455:                n = tmp;
                    456:        }
                    457: 
                    458:        /* for line mode, retain the last newline char */
                    459:        lnmode = (markidx(m) == 0 && markidx(n) == 0 && m != n);
                    460:        if (lnmode)
                    461:        {
                    462:                n -= BLKSIZE;
                    463:                pfetch(markline(n));
                    464:                n = (n & ~(BLKSIZE - 1)) + plen;
                    465:        }
                    466: 
                    467:        ChangeText
                    468:        {
                    469:                cut(m, n);
                    470:                m = input(m, n, WHEN_VIINP);
                    471:        }
                    472: 
                    473:        return m;
                    474: }
                    475: 
                    476: /* This function replaces a given number of characters with input */
                    477: MARK v_subst(m, cnt)
                    478:        MARK    m;      /* where substitutions start */
                    479:        long    cnt;    /* number of chars to replace */
                    480: {
                    481:        DEFAULT(1);
                    482: 
                    483:        /* make sure we don't try replacing past EOL */
                    484:        pfetch(markline(m));
                    485:        if (markidx(m) + cnt > plen)
                    486:        {
                    487:                cnt = plen - markidx(m);
                    488:        }
                    489: 
                    490:        /* Go for it! */
                    491:        ChangeText
                    492:        {
                    493:                cut(m, m + cnt);
                    494:                m = input(m, m + cnt, WHEN_VIINP);
                    495:        }
                    496:        return m;
                    497: }
                    498: 
                    499: /* This calls the ex "join" command to join some lines together */
                    500: MARK v_join(m, cnt)
                    501:        MARK    m;      /* the first line to be joined */
                    502:        long    cnt;    /* number of other lines to join */
                    503: {
                    504:        MARK    joint;  /* where the lines were joined */
                    505: 
                    506:        DEFAULT(1);
                    507: 
                    508:        /* figure out where the joint will be */
                    509:        pfetch(markline(m));
                    510:        joint = (m & ~(BLKSIZE - 1)) + plen;
                    511: 
                    512:        /* join the lines */
                    513:        cmd_join(m, m + MARK_AT_LINE(cnt), CMD_JOIN, 0, "");
                    514:        mustredraw = TRUE;
                    515: 
                    516:        /* the cursor should be left at the joint */
                    517:        return joint;
                    518: }
                    519: 
                    520: /* This calls the ex shifter command to shift some lines */
                    521: static MARK shift_help(m, n, excmd)
                    522:        MARK    m, n;   /* range of lines to shift */
                    523:        CMD     excmd;  /* which way do we shift? */
                    524: {
                    525:        /* adjust for inclusive endmarks in ex */
                    526:        n -= BLKSIZE;
                    527: 
                    528:        cmd_shift(m, n, excmd, 0, "");
                    529:        return m;
                    530: }
                    531: 
                    532: /* This calls the ex "<" command to shift some lines left */
                    533: MARK v_lshift(m, n)
                    534:        MARK    m, n;   /* range of lines to shift */
                    535: {
                    536:        return shift_help(m, n, CMD_SHIFTL);
                    537: }
                    538: 
                    539: /* This calls the ex ">" command to shift some lines right */
                    540: MARK v_rshift(m, n)
                    541:        MARK    m, n;   /* range of lines to shift */
                    542: {
                    543:        return shift_help(m, n, CMD_SHIFTR);
                    544: }
                    545: 
                    546: /* This runs some lines through a filter program */
                    547: MARK v_filter(m, n)
                    548:        MARK    m, n;   /* range of lines to shift */
                    549: {
                    550:        char    cmdln[100];     /* a shell command line */
                    551: 
                    552:        /* adjust for inclusive endmarks in ex */
                    553:        n -= BLKSIZE;
                    554: 
                    555:        if (vgets('!', cmdln, sizeof(cmdln)) > 0)
                    556:        {
                    557:                filter(m, n, cmdln);
                    558:        }
                    559: 
                    560:        redraw(MARK_UNSET, FALSE);
                    561:        return m;
                    562: }
                    563: 
                    564: 
                    565: /* This function runs the ex "file" command to show the file's status */
                    566: MARK v_status()
                    567: {
                    568:        cmd_file(cursor, cursor, CMD_FILE, 0, "");
                    569:        return cursor;
                    570: }
                    571: 
                    572: 
                    573: /* This function runs the ":&" command to repeat the previous :s// */
                    574: MARK v_again(m, n)
                    575:        MARK    m, n;
                    576: {
                    577:        cmd_substitute(m, n - BLKSIZE, CMD_SUBAGAIN, TRUE, "");
                    578:        return cursor;
                    579: }
                    580: 
                    581: 
                    582: 
                    583: /* This function switches to the previous file, if possible */
                    584: MARK v_switch()
                    585: {
                    586:        if (!*prevorig)
                    587:                msg("No previous file");
                    588:        else
                    589:        {       strcpy(tmpblk.c, prevorig);
                    590:                cmd_edit(cursor, cursor, CMD_EDIT, 0, tmpblk.c);
                    591:        }
                    592:        return cursor;
                    593: }
                    594: 
                    595: /* This function does a tag search on a keyword */
                    596: /*ARGSUSED*/
                    597: MARK v_tag(keyword, m, cnt)
                    598:        char    *keyword;
                    599:        MARK    m;
                    600:        long    cnt;
                    601: {
                    602:        /* move the cursor to the start of the tag name, where m is */
                    603:        cursor = m;
                    604: 
                    605:        /* perform the tag search */
                    606:        cmd_tag(cursor, cursor, CMD_TAG, 0, keyword);
                    607: 
                    608:        return cursor;
                    609: }
                    610: 
                    611: #ifndef NO_EXTENSIONS
                    612: /* This function looks up a keyword by calling the helpprog program */
                    613: /*ARGSUSED*/
                    614: MARK v_keyword(keyword, m, cnt)
                    615:        char    *keyword;
                    616:        MARK    m;
                    617:        long    cnt;
                    618: {
                    619:        int     waswarn;
                    620:        char    cmdline[130];
                    621: 
                    622:        move(LINES - 1, 0);
                    623:        addstr("---------------------------------------------------------\n");
                    624:        clrtoeol();
                    625:        refresh();
                    626:        sprintf(cmdline, "%s %s", o_keywordprg, keyword);
                    627:        waswarn = *o_warn;
                    628:        *o_warn = FALSE;
                    629:        suspend_curses();
                    630:        if (system(cmdline))
                    631:        {
                    632:                addstr("<<< failed >>>\n");
                    633:        }
                    634:        resume_curses(FALSE);
                    635:        mode = MODE_VI;
                    636:        redraw(MARK_UNSET, FALSE);
                    637:        *o_warn = waswarn;
                    638: 
                    639:        return m;
                    640: }
                    641: 
                    642: 
                    643: 
                    644: MARK v_increment(keyword, m, cnt)
                    645:        char    *keyword;
                    646:        MARK    m;
                    647:        long    cnt;
                    648: {
                    649:        static  sign;
                    650:        char    newval[12];
                    651:        long    atol();
                    652: 
                    653:        DEFAULT(1);
                    654: 
                    655:        /* get one more keystroke, unless doingdot */
                    656:        if (!doingdot)
                    657:        {
                    658:                sign = getkey(0);
                    659:        }
                    660: 
                    661:        /* adjust the number, based on that second keystroke */
                    662:        switch (sign)
                    663:        {
                    664:          case '+':
                    665:          case '#':
                    666:                cnt = atol(keyword) + cnt;
                    667:                break;
                    668: 
                    669:          case '-':
                    670:                cnt = atol(keyword) - cnt;
                    671:                break;
                    672: 
                    673:          case '=':
                    674:                break;
                    675: 
                    676:          default:
                    677:                return MARK_UNSET;
                    678:        }
                    679:        sprintf(newval, "%ld", cnt);
                    680: 
                    681:        ChangeText
                    682:        {
                    683:                change(m, m + strlen(keyword), newval);
                    684:        }
                    685: 
                    686:        return m;
                    687: }
                    688: #endif
                    689: 
                    690: 
                    691: /* This function acts like the EX command "xit" */
                    692: /*ARGSUSED*/
                    693: MARK v_xit(m, cnt, key)
                    694:        MARK    m;      /* ignored */
                    695:        long    cnt;    /* ignored */
                    696:        int     key;    /* must be a second 'Z' */
                    697: {
                    698:        /* if second char wasn't 'Z', fail */
                    699:        if (key != 'Z')
                    700:        {
                    701:                return MARK_UNSET;
                    702:        }
                    703: 
                    704:        /* move the cursor to the bottom of the screen */
                    705:        move(LINES - 1, 0);
                    706:        clrtoeol();
                    707: 
                    708:        /* do the xit command */
                    709:        cmd_xit(m, m, CMD_XIT, FALSE, "");
                    710: 
                    711:        /* return the cursor */
                    712:        return m;
                    713: }
                    714: 
                    715: 
                    716: /* This function undoes changes to a single line, if possible */
                    717: MARK v_undoline(m)
                    718:        MARK    m;      /* where we hope to undo the change */
                    719: {
                    720:        /* make sure we have the right line in the buffer */
                    721:        if (markline(m) != U_line)
                    722:        {
                    723:                return MARK_UNSET;
                    724:        }
                    725: 
                    726:        /* fix it */
                    727:        ChangeText
                    728:        {
                    729:                strcat(U_text, "\n");
                    730:                change(MARK_AT_LINE(U_line), MARK_AT_LINE(U_line + 1), U_text);
                    731:        }
                    732: 
                    733:        /* nothing in the buffer anymore */
                    734:        U_line = -1L;
                    735: 
                    736:        /* return, with the cursor at the front of the line */
                    737:        return m & ~(BLKSIZE - 1);
                    738: }
                    739: 
                    740: 
                    741: #ifndef NO_ERRLIST
                    742: MARK v_errlist(m)
                    743:        MARK    m;
                    744: {
                    745:        cmd_errlist(m, m, CMD_ERRLIST, FALSE, "");
                    746:        return cursor;
                    747: }
                    748: #endif
                    749: 
                    750: 
                    751: #ifndef NO_AT
                    752: /*ARGSUSED*/
                    753: MARK v_at(m, cnt, key)
                    754:        MARK    m;
                    755:        long    cnt;
                    756:        int     key;
                    757: {
                    758:        if (!fromcutbuf(key))
                    759:        {
                    760:                return MARK_UNSET;
                    761:        }
                    762:        return cursor;
                    763: }
                    764: #endif

unix.superglobalmegacorp.com

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