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

1.1     ! root        1: /***************************************************************************
        !             2:  * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne.  JOVE *
        !             3:  * is provided to you without charge, and with no warranty.  You may give  *
        !             4:  * away copies of JOVE, including sources, provided that this notice is    *
        !             5:  * included in all the files.                                              *
        !             6:  ***************************************************************************/
        !             7: 
        !             8: #include "jove.h"
        !             9: #include "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.