Annotation of 43BSD/contrib/jove/misc.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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