Annotation of 43BSDTahoe/new/jove/misc.c, revision 1.1.1.1

1.1       root        1: /***************************************************************************
                      2:  * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne.  JOVE *
                      3:  * is provided to you without charge, and with no warranty.  You may give  *
                      4:  * away copies of JOVE, including sources, provided that this notice is    *
                      5:  * included in all the files.                                              *
                      6:  ***************************************************************************/
                      7: 
                      8: #include "jove.h"
                      9: #include "ctype.h"
                     10: #include <signal.h>
                     11: #ifdef ANSICODES
                     12: # include "termcap.h"
                     13: #endif
                     14: 
                     15: void
                     16: prCTIME()
                     17: {
                     18:        s_mess(": %f %s", get_time((time_t *) 0, (char *) 0, 0, -1));
                     19: }
                     20: 
                     21: void
                     22: ChrToOct()
                     23: {
                     24:        int     c,
                     25:                slow;
                     26: 
                     27:        c = waitchar(&slow);
                     28:        if (slow)
                     29:                message(key_strokes);
                     30:        ins_str(sprint("\\%03o", c), NO);
                     31: }
                     32: 
                     33: void
                     34: StrLength()
                     35: {
                     36:        static char     inquotes[] = "Where are the quotes?";
                     37:        char    *first = StrIndex(-1, linebuf, curchar, '"'),
                     38:                *last = StrIndex(1, linebuf, curchar + 1, '"'),
                     39:                c;
                     40:        int     numchars = 0;
                     41: 
                     42:        if (first == 0 || last == 0)
                     43:                complain(inquotes);
                     44:        first += 1;
                     45:        while (first < last) {
                     46:                c = *first++;
                     47:                if (c == '\\') {
                     48:                        int     num;
                     49: 
                     50:                        if (!isdigit(*first))
                     51:                                first += 1;
                     52:                        else {
                     53:                                num = 3;
                     54:                                while (num-- && isdigit(*first++) && first < last)
                     55:                                        ;
                     56:                        }
                     57:                }
                     58:                numchars += 1;
                     59:        }
                     60:        s_mess("%d characters", numchars);
                     61: }
                     62: 
                     63: /* Transpos cur_char with cur_char - 1 */
                     64: 
                     65: void
                     66: TransChar()
                     67: {
                     68:        char    before;
                     69: 
                     70:        if (curchar == 0 || (eolp() && curchar == 1))
                     71:                complain((char *) 0);   /* BEEP */
                     72:        if (eolp())
                     73:                b_char(1);
                     74:        before = linebuf[curchar - 1];
                     75:        del_char(BACKWARD, 1);
                     76:        f_char(1);
                     77:        insert_c(before, 1);
                     78: }
                     79: 
                     80: /* Switch current line with previous one */
                     81: 
                     82: void
                     83: TransLines()
                     84: {
                     85:        disk_line       old_prev;
                     86: 
                     87:        if (firstp(curline))
                     88:                return;
                     89:        lsave();
                     90:        old_prev = curline->l_prev->l_dline;
                     91:        curline->l_prev->l_dline = curline->l_dline;
                     92:        curline->l_dline = old_prev;
                     93:        getDOT();
                     94:        if (!lastp(curline))
                     95:                line_move(FORWARD, 1, NO);
                     96:        modify();
                     97: }
                     98: 
                     99: void
                    100: Leave()
                    101: {
                    102:        longjmp(mainjmp, QUIT);
                    103: }
                    104: 
                    105: /* If argument is specified, kill that many lines down.  Otherwise,
                    106:    if we "appear" to be at the end of a line, i.e. everything to the
                    107:    right of the cursor is white space, we delete the line separator
                    108:    as if we were at the end of the line. */
                    109: 
                    110: void
                    111: KillEOL()
                    112: {
                    113:        Line    *line2;
                    114:        int     char2;
                    115:        int     num = arg_value();
                    116: 
                    117:        if (is_an_arg()) {
                    118:                if (num == 0) { /* Kill to beginning of line */
                    119:                        line2 = curline;
                    120:                        char2 = 0;
                    121:                } else {
                    122:                        line2 = next_line(curline, num);
                    123:                        if ((LineDist(curline, line2) < num) || (line2 == curline))
                    124:                                char2 = length(line2);
                    125:                        else
                    126:                                char2 = 0;
                    127:                }
                    128:        } else if (blnkp(&linebuf[curchar])) {
                    129:                line2 = next_line(curline, 1);
                    130:                if (line2 == curline)
                    131:                        char2 = length(curline);
                    132:                else
                    133:                        char2 = 0;
                    134:        } else {
                    135:                line2 = curline;
                    136:                char2 = length(curline);
                    137:        }
                    138:        reg_kill(line2, char2, 0);
                    139: }
                    140: 
                    141: /* kill to beginning of sentence */
                    142: 
                    143: void
                    144: KillBos()
                    145: {
                    146:        negate_arg_value();
                    147:        KillEos();
                    148: }
                    149: 
                    150: /* Kill to end of sentence */
                    151: 
                    152: void
                    153: KillEos()
                    154: {
                    155:        Line    *line1;
                    156:        int     char1;
                    157: 
                    158:        line1 = curline;
                    159:        char1 = curchar;
                    160:        Eos();
                    161:        reg_kill(line1, char1, 1);
                    162: }
                    163: 
                    164: void
                    165: KillExpr()
                    166: {
                    167:        Line    *line1;
                    168:        int     char1;
                    169: 
                    170:        line1 = curline;
                    171:        char1 = curchar;
                    172:        FSexpr();
                    173:        reg_kill(line1, char1, 1);
                    174: }
                    175: 
                    176: void
                    177: EscPrefix()
                    178: {
                    179:        HandlePref(pref1map);
                    180: }
                    181: 
                    182: void
                    183: CtlxPrefix()
                    184: {
                    185:        HandlePref(pref2map);
                    186: }
                    187: 
                    188: void
                    189: MiscPrefix()
                    190: {
                    191:        HandlePref(miscmap);
                    192: }
                    193: 
                    194: void
                    195: HandlePref(map)
                    196: data_obj       **map;
                    197: {
                    198:        register data_obj       *cp;
                    199:        register int    c;
                    200:        int     slow;
                    201: 
                    202:        c = waitchar(&slow);
                    203:        if (c == AbortChar) {
                    204:                message("[Aborted]");
                    205:                rbell();
                    206:                return;
                    207:        }
                    208: 
                    209:        if (slow)
                    210:                message(key_strokes);
                    211: 
                    212:        cp = map[c];
                    213:        if (cp == 0) {
                    214:                s_mess("[%sunbound]", key_strokes);
                    215:                rbell();
                    216:        } else
                    217:                ExecCmd(cp);
                    218: }
                    219: 
                    220: void
                    221: Yank()
                    222: {
                    223:        Line    *line,
                    224:                *lp;
                    225:        Bufpos  *dot;
                    226: 
                    227:        if (killbuf[killptr] == 0)
                    228:                complain("[Nothing to yank!]");
                    229:        lsave();
                    230:        this_cmd = YANKCMD;
                    231:        line = killbuf[killptr];
                    232:        lp = lastline(line);
                    233:        dot = DoYank(line, 0, lp, length(lp), curline, curchar, curbuf);
                    234:        set_mark();
                    235:        SetDot(dot);
                    236: }
                    237: 
                    238: void
                    239: WtModBuf()
                    240: {
                    241:        if (!ModBufs(NO))
                    242:                message("[No buffers need saving]");
                    243:        else
                    244:                put_bufs(is_an_arg());
                    245: }
                    246: 
                    247: void
                    248: put_bufs(askp)
                    249: {
                    250:        register Buffer *oldb = curbuf, 
                    251:                        *b;             
                    252: 
                    253:        for (b = world; b != 0; b = b->b_next) {
                    254:                if (!IsModified(b) || b->b_type != B_FILE)
                    255:                        continue;
                    256:                SetBuf(b);      /* Make this current Buffer */
                    257:                if (curbuf->b_fname == 0) {
                    258:                        char    *newname;
                    259: 
                    260:                        newname = ask(NullStr, "Buffer \"%s\" needs a file name; type Return to skip: ", b->b_name);
                    261:                        if (*newname == 0)
                    262:                                continue;
                    263:                        setfname(b, newname);
                    264:                }
                    265:                if (askp && (yes_or_no_p("Write %s? ", curbuf->b_fname) == NO))
                    266:                        continue;
                    267:                filemunge(curbuf->b_fname);
                    268: #if !(defined(MSDOS) || defined(MAC))
                    269:                chk_mtime(curbuf, curbuf->b_fname, "save");
                    270: #endif
                    271:                file_write(curbuf->b_fname, 0);
                    272:                unmodify();
                    273:        }
                    274:        SetBuf(oldb);
                    275: }
                    276: 
                    277: void
                    278: ToIndent()
                    279: {
                    280:        register char   *cp,
                    281:                        c;
                    282: 
                    283:        for (cp = linebuf; c = *cp; cp++)
                    284:                if (c != ' ' && c != '\t')
                    285:                        break;
                    286:        curchar = cp - linebuf;
                    287: }
                    288: 
                    289: /* GoLine -- go to a line, usually wired to goto-line, ESC g or ESC G.
                    290:    If no argument is specified it asks for a line number. */
                    291: void
                    292: GoLine()
                    293: {
                    294:        Line    *newline;
                    295: 
                    296: #ifndef ANSICODES
                    297:        if (!is_an_arg())
                    298:                set_arg_value(ask_int("Line: ",10));
                    299: #else /* not ANSICODES */
                    300:        if (!is_an_arg() || arg_value() <= 0) {
                    301:                if (SP) {
                    302:                        putpad(SP, 1);  /* Ask for cursor position */
                    303:                        return;
                    304:                }
                    305:                set_arg_value(ask_int("Line: ", 10));
                    306:        }
                    307: #endif /* ANSICODES */
                    308:        newline = next_line(curbuf->b_first, arg_value() - 1);
                    309:        PushPntp(newline);
                    310:        SetLine(newline);
                    311: }
                    312: 
                    313: #ifdef ANSICODES
                    314: void
                    315: MoveToCursor(line, col)
                    316: {
                    317:        register struct scrimage *sp = &PhysScreen[line];
                    318: 
                    319:        while (sp->s_id == 0)
                    320:                sp = &PhysScreen[--line];
                    321:        if (sp->s_flags & MODELINE)
                    322:                complain((char *) 0);
                    323:        if (curwind != sp->s_window)
                    324:                SetWind(sp->s_window);
                    325:        SetLine(sp->s_lp);
                    326:        curchar = how_far(sp->s_lp, col);
                    327: }
                    328: 
                    329: void
                    330: AnsiCodes()
                    331: {
                    332:        int     c;
                    333:        int     num1 = 0;
                    334:        int     num2;
                    335:        static char *unsupported = "[Unsupported ANSI code received]";
                    336: 
                    337:        while (isdigit(c = getch()))
                    338:                num1 = (num1 * 10) + (c - '0');
                    339: 
                    340:        switch (c) {
                    341:        case ';':
                    342:                num2 = 0;
                    343:                while (isdigit(c = getch()))
                    344:                        num2 = (num2 * 10) + (c - '0');
                    345:                switch (c) {
                    346:                case 'R':
                    347:                        MoveToCursor(--num1, --num2);
                    348:                        break;
                    349:                case 'H':
                    350:                        Eow();
                    351:                        Bol();
                    352:                        break;
                    353:                default:
                    354:                        complain(unsupported);
                    355:                }
                    356:                break;
                    357:        case 'A':
                    358:                PrevLine();
                    359:                break;
                    360:        case 'B':
                    361:                NextLine();
                    362:                break;
                    363:        case 'C':
                    364:                ForChar();
                    365:                break;
                    366:        case 'D':
                    367:                BackChar();
                    368:                break;
                    369:        case 'H':
                    370:                Bow();
                    371:                break;
                    372:        case 'J':
                    373:                if (num1 == 2) {
                    374:                        ClAndRedraw();
                    375:                        break;
                    376:                }
                    377:        case 'M':               /* Enter */
                    378:                PopMark();
                    379:                break;
                    380:        case 'P':               /* PF1 */
                    381:                ExecCmd((data_obj *) FindCmd(IncFSearch));
                    382:                break;
                    383:        case 'Q':               /* PF2 */
                    384:                ExecCmd((data_obj *) FindCmd(QRepSearch));
                    385:                break;
                    386:        case 'R':               /* PF3 */
                    387:                WtModBuf();
                    388:                Leave();
                    389:                break;
                    390:        case 'S':               /* PF4 */
                    391:                KillEOL();
                    392:                break;
                    393:        case 'l':               /* , */
                    394:                DelNChar();
                    395:                break;
                    396:        case 'm':               /* - */
                    397:                DelNWord();
                    398:                break;
                    399:        case 'n':               /* . */
                    400:                SetMark();
                    401:                break;
                    402:        case 'p':               /* 0 */
                    403:                Bol();
                    404:                NextLine();
                    405:                break;
                    406:        case 'q':               /* 1 */
                    407:                ForWord();
                    408:                break;
                    409:        case 'r':               /* 2 */
                    410:                ForChar();
                    411:                Eol();
                    412:                break;
                    413:        case 's':               /* 3 */
                    414:                Yank();
                    415:                break;
                    416:        case 't':               /* 4 */
                    417:                ExecCmd((data_obj *) FindCmd(ForSearch));
                    418:                break;
                    419:        case 'u':               /* 5 */
                    420:                ExecCmd((data_obj *) FindCmd(RevSearch));
                    421:                break;
                    422:        case 'v':               /* 6 */
                    423:                DelReg();
                    424:                break;
                    425:        case 'w':               /* 7 */
                    426:                PrevPage();
                    427:                break;
                    428:        case 'x':               /* 8 */
                    429:                NextPage();
                    430:                break;
                    431:        case 'y':               /* 9 */
                    432:                DelPWord();
                    433:                break;
                    434:        case 'z':       /* Sun function keys send <esc>[Nz */
                    435:                switch(num1) {
                    436:                        case 193:       /* L2 */
                    437:                                SetMark();
                    438:                                break;
                    439:                        case 194:       /* L3 */
                    440:                                PopMark();
                    441:                                break;
                    442:                        case 195:       /* L4 */
                    443:                                DelReg();
                    444:                                break;
                    445:                        case 208:       /* R1 */
                    446:                                ExecCmd((data_obj *) FindCmd(QRepSearch));
                    447:                                break;
                    448:                        case 209:       /* R2 */
                    449:                                ExecCmd((data_obj *) FindCmd(IncFSearch));
                    450:                                break;
                    451:                        case 210:       /* R3 */
                    452:                                WtModBuf();
                    453:                                break;
                    454:                        case 211:       /* R4 */
                    455:                                ExecCmd((data_obj *) FindCmd(RepSearch));
                    456:                                break;
                    457:                        case 212:       /* R5 */
                    458:                                ExecCmd((data_obj *) FindCmd(IncRSearch));
                    459:                                break;
                    460:                        case 213:       /* R6 */
                    461:                                Leave();
                    462:                                break;
                    463:                        case 214:       /* R7 */
                    464:                                BackWord();
                    465:                                break;
                    466:                        case 215:       /* R8 == UpArrow */
                    467:                                break;
                    468:                        case 216:       /* R9 */
                    469:                                ForWord();
                    470:                                break;
                    471:                        case 217:       /* R10 == LeftArrow */
                    472:                                break;
                    473:                        case 218:       /* R11 */
                    474:                                NextWindow();
                    475:                                break;
                    476:                        case 219:       /* R12 == RightArrow */
                    477:                                break;
                    478:                        case 220:       /* R13 */
                    479:                        case 221:       /* R14 == DownArrow */
                    480:                                break;
                    481:                        case 222:       /* R15 */
                    482:                        case 225:       /* F2 */
                    483:                        case 226:       /* F3 */
                    484:                        case 227:       /* F4 */
                    485:                                break;
                    486:                        case 228:       /* F5 */
                    487:                                break;
                    488:                        case 229:       /* F6 */
                    489:                                break;
                    490:                        case 230:       /* F7 */
                    491:                                break;
                    492:                        case 231:       /* F8 */
                    493:                                break;
                    494:                        case 232:       /* F9 */
                    495:                                break;
                    496:                        default:
                    497:                                num1 = -1;      /* Hack flags failure */
                    498:                                break;
                    499:                }
                    500:                if (num1 >= 0)
                    501:                        break;
                    502:        default:
                    503:                complain(unsupported);
                    504:        }
                    505: }
                    506: #endif /* ANSICODES */
                    507: 
                    508: void
                    509: NotModified()
                    510: {
                    511:        unmodify();
                    512: }
                    513: 
                    514: void
                    515: SetLMargin()
                    516: {
                    517:        LMargin = calc_pos(linebuf, curchar);
                    518: }
                    519: 
                    520: void
                    521: SetRMargin()
                    522: {
                    523:        RMargin = calc_pos(linebuf, curchar);
                    524: }
                    525: 

unix.superglobalmegacorp.com

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