Annotation of 43BSD/old/fed/fed.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char sccsid[] = "@(#)fed.c      4.2 (Berkeley) 8/11/83";
        !             3: #endif
        !             4: 
        !             5: /*
        !             6:  *     Font editor for the HP 2648.
        !             7:  *
        !             8:  *     Mark Horton, 1/80
        !             9:  */
        !            10: 
        !            11: #include "fed.h"
        !            12: 
        !            13: main(argc,argv)
        !            14: int argc;
        !            15: char **argv;
        !            16: {
        !            17: 
        !            18:        signal(SIGINT, onintr);
        !            19:        signal(SIGQUIT, onsig);
        !            20:        signal(SIGILL, onsig);
        !            21:        signal(SIGBUS, onsig);
        !            22:        signal(SIGSEGV, onsig);
        !            23:        signal(SIGSYS, onsig);
        !            24: 
        !            25:        while (argc > 1 && argv[1][0] == '-') {
        !            26:                switch(argv[1][1]) {
        !            27:                case 'T':
        !            28:                        trace = fopen("trace", "w");
        !            29:                        setbuf(trace, tracebuf);
        !            30:                        break;
        !            31:                case 'i':
        !            32:                case 'v':
        !            33:                        vidinv();
        !            34:                        break;
        !            35:                case 'q':
        !            36:                        QUIET = 1;
        !            37:                        break;
        !            38:                default:
        !            39:                        printf("Bad flag: %s\n", argv[1]);
        !            40:                }
        !            41:                argc--; argv++;
        !            42:        }
        !            43:        if (argc < 2) {
        !            44:                fprintf(stderr,"Usage: %s filename\n", argv[0]);
        !            45:                exit(1);
        !            46:        }
        !            47: 
        !            48:        if (setjmp(env) == 0) {
        !            49:                initialize();
        !            50:                editfont(argv[1]);
        !            51:        }
        !            52: 
        !            53:        cmdloop();
        !            54: }
        !            55: 
        !            56: cmdloop()
        !            57: {
        !            58:        char cmd;
        !            59: 
        !            60:        setjmp(env);
        !            61:        for (;;) {
        !            62:                cmd = inchar();
        !            63:                if (cmd == ESC)
        !            64:                        cmd = esccmd();
        !            65:                switch (cmd) {
        !            66: 
        !            67:                /* ^L: redraw munged up screen */
        !            68:                case '\14':
        !            69:                        redraw();
        !            70:                        break;
        !            71: 
        !            72:                /* b: move cursor to base point of window */
        !            73:                case 'b':
        !            74:                        cch();
        !            75:                        curs_r = cht[curchar].rcent;
        !            76:                        curs_c = cht[curchar].ccent;
        !            77:                        turnoncurs();
        !            78:                        break;
        !            79: 
        !            80:                /* c: toggle whether cursor is on */
        !            81:                case 'c':
        !            82:                        if (curcurs)
        !            83:                                turnofcurs();
        !            84:                        else
        !            85:                                turnoncurs();
        !            86:                        break;
        !            87: 
        !            88:                /* d: draw line of current flavor from pen to cursor */
        !            89:                case 'd':
        !            90:                        cch();
        !            91:                        bufmod();
        !            92:                        drawline(pen_r, pen_c, curs_r, curs_c);
        !            93:                        turnofcurs();
        !            94:                        turnofrb();
        !            95:                        pen_r = curs_r; pen_c = curs_c;
        !            96:                        syncwind(curwind);
        !            97:                        break;
        !            98: 
        !            99:                /* f: fill in the current hole around the cursor */
        !           100:                case 'f':
        !           101:                        cch();
        !           102:                        bufmod();
        !           103:                        if (trace)
        !           104:                                fprintf(trace, "fillin(%d, %d)\n", curs_r, curs_c);
        !           105:                        if (mat(wind[curwind].val, GLROW, GLCOL, curs_r, curs_c))
        !           106:                                error("Not in a hole");
        !           107:                        fillin(curs_r, curs_c);
        !           108:                        curoff();
        !           109:                        syncwind(curwind);
        !           110:                        break;
        !           111: 
        !           112:                /* g <x>: get glyph "x" as current. */
        !           113:                case 'g':
        !           114:                        if (fontdes == NULL)
        !           115:                                error("No current font file");
        !           116:                        message("get glyph <char>");
        !           117:                        curchar = inchar();
        !           118:                        sprintf(msgbuf, "get glyph %s", rdchar(curchar));
        !           119:                        message(msgbuf);
        !           120:                        getglyph(curchar);
        !           121:                        break;
        !           122: 
        !           123:                /* h, left arrow: move cursor left */
        !           124:                case 'h':
        !           125:                        cch();
        !           126:                        if (curs_c <= 0)
        !           127:                                error("Off edge");
        !           128:                        else
        !           129:                                curs_c--;
        !           130:                        turnoncurs();
        !           131:                        break;
        !           132: 
        !           133:                /* j, down arrow: move cursor down */
        !           134:                case 'j':
        !           135:                        cch();
        !           136:                        if (curs_r >= GLROW-1)
        !           137:                                error("Off edge");
        !           138:                        else
        !           139:                                curs_r++;
        !           140:                        turnoncurs();
        !           141:                        break;
        !           142: 
        !           143:                /* k, up arrow: move cursor up */
        !           144:                case 'k':
        !           145:                        cch();
        !           146:                        if (curs_r <= 0)
        !           147:                                error("Off edge");
        !           148:                        else
        !           149:                                curs_r--;
        !           150:                        turnoncurs();
        !           151:                        break;
        !           152: 
        !           153:                /* l, right arrow: move cursor down */
        !           154:                case 'l':
        !           155:                        cch();
        !           156:                        if (curs_c >= GLCOL-1)
        !           157:                                error("Off edge");
        !           158:                        else
        !           159:                                curs_c++;
        !           160:                        turnoncurs();
        !           161:                        break;
        !           162: 
        !           163:                /* m: move the pen to where the cursor is */
        !           164:                case 'm':
        !           165:                        cch();
        !           166:                        pen_r = curs_r; pen_c = curs_c;
        !           167:                        turnoncurs();
        !           168:                        move(base[curwind].c+curs_c, base[curwind].r+GLROW-1-curs_r);
        !           169:                        turnonrb();
        !           170:                        break;
        !           171: 
        !           172:                /* n <x>: make a new glyph with char x */
        !           173:                case 'n':
        !           174:                        newglyph();
        !           175:                        break;
        !           176: 
        !           177:                /* p: print a hard copy on the printer of the screen */
        !           178:                case 'p':
        !           179:                        printg();
        !           180:                        break;
        !           181: 
        !           182:                /* r: toggle rubber band line */
        !           183:                case 'r':
        !           184:                        if (currb)
        !           185:                                turnofrb();
        !           186:                        else
        !           187:                                turnonrb();
        !           188:                        break;
        !           189: 
        !           190:                /* s <what> <where>: set <what> to <where> */
        !           191:                case 's':
        !           192:                        setcmd();
        !           193:                        break;
        !           194: 
        !           195:                /* u: undo previous buffer modifying command */
        !           196:                case 'u':
        !           197:                        cch();
        !           198:                        undo();
        !           199:                        break;
        !           200: 
        !           201:                /* z <n>: set zoom to n. */
        !           202:                case 'z':
        !           203:                        message("zoom to <level>");
        !           204:                        curzoom = inchar();
        !           205:                        if (curzoom == '\r' || curzoom == '\n')
        !           206:                                curzoom = oldzoom;
        !           207:                        else {
        !           208:                                curzoom -= '0';
        !           209:                                oldzoom = curzoom;
        !           210:                        }
        !           211:                        zoomn(curzoom);
        !           212:                        break;
        !           213: 
        !           214:                /* space: reset zoom to last thing user asked for */
        !           215:                case ' ':
        !           216:                        zoomn(curzoom = oldzoom);
        !           217:                        break;
        !           218: 
        !           219:                /* A: artificially embolden/italicize <range> by heavy pen size */
        !           220:                case 'A':
        !           221:                        bufmod();
        !           222:                        artificial();
        !           223:                        break;
        !           224: 
        !           225:                /* B: move base point of window to cursor */
        !           226:                case 'B':
        !           227:                        cch();
        !           228:                        cht[curchar].rcent = curs_r;
        !           229:                        cht[curchar].ccent = curs_c;
        !           230:                        turnoncurs();
        !           231:                        break;
        !           232: 
        !           233:                /*
        !           234:                 * C <from> <to>: copy glyph <from> to <to>.
        !           235:                 * M <from> <to>: move glyph <from> to <to>.
        !           236:                 */
        !           237:                case 'C':
        !           238:                case 'M':
        !           239:                        copymove(cmd);
        !           240:                        break;
        !           241: 
        !           242:                /* D <char1> <char2>: delete range from font */
        !           243:                case 'D':
        !           244:                        delchar();
        !           245:                        break;
        !           246: 
        !           247:                /* F: display the entire font on the screen. */
        !           248:                case 'F':
        !           249:                        showfont();
        !           250:                        break;
        !           251: 
        !           252:                /* I: invert the current glyph */
        !           253:                case 'I':
        !           254:                        cch();
        !           255:                        bufmod();
        !           256:                        invert();
        !           257:                        break;
        !           258: 
        !           259:                /* K: kill (wipe clean) current glyph. */
        !           260:                case 'K':
        !           261:                        cch();
        !           262:                        bufmod();
        !           263:                        zermat(wind[curwind].val, GLROW, GLCOL);
        !           264:                        syncwind(curwind);
        !           265:                        if (trace)
        !           266:                                fprintf(trace, "kill: curs_r = %d, curs_c = %d\n", curs_r, curs_c);
        !           267:                        break;
        !           268: 
        !           269:                /* P <first> <last> <file>: read partial font */
        !           270:                case 'P':
        !           271:                        readchars();
        !           272:                        break;
        !           273: 
        !           274:                /* Q: quit the editor, not saving work. */
        !           275:                case 'Q':
        !           276:                        confirm();
        !           277:                        done();
        !           278:                        exit(0);
        !           279: 
        !           280:                /* T: typeset a line of input text */
        !           281:                case 'T':
        !           282:                        typein();
        !           283:                        break;
        !           284: 
        !           285:                /* V: toggle video between inverse and normal */
        !           286:                case 'V':
        !           287:                        togvid();
        !           288:                        break;
        !           289: 
        !           290:                /*
        !           291:                 * E <file>: edit new font file <file>.
        !           292:                 * N <file>: write, then edit <file>
        !           293:                 * R <file>: read <file> on top of buffer.
        !           294:                 * W <file>: write out on <file> without quitting
        !           295:                 */
        !           296:                case 'E':
        !           297:                case 'N':
        !           298:                case 'R':
        !           299:                case 'W':
        !           300:                        fileiocmd(cmd);
        !           301:                        break;
        !           302: 
        !           303:                /* Z: exit, writing out work */
        !           304:                case 'Z':
        !           305:                        message("Z");
        !           306:                        if (inchar() != 'Z') {
        !           307:                                error("No second Z");
        !           308:                        }
        !           309:                        if (changes)
        !           310:                                writeback();
        !           311:                        done();
        !           312:                        exit(0);
        !           313: 
        !           314:                /*
        !           315:                 * ".", ">".  Set and clear the bit under the cursor.
        !           316:                 */
        !           317:                case '.':
        !           318:                case '>':
        !           319:                        bufmod();
        !           320:                        setmat(wind[curwind].val, GLROW, GLCOL, curs_r, curs_c, cmd=='.' ? 1 : 0);
        !           321:                        turnofcurs();
        !           322:                        syncwind(curwind);
        !           323:                        break;
        !           324: 
        !           325:                /*
        !           326:                 * "#": edit the numerical parameters
        !           327:                 */
        !           328:                case '#':
        !           329:                        numedit();
        !           330:                        break;
        !           331: 
        !           332:                default:
        !           333:                        sprintf(msgbuf, "No such command as %s", rdchar(cmd));
        !           334:                        message(msgbuf);
        !           335:                }
        !           336: 
        !           337:        }
        !           338: }
        !           339: 
        !           340: /*
        !           341:  * esccmd: a command beginning with an escape.
        !           342:  * Map it into the corresponding regular command.
        !           343:  */
        !           344: char
        !           345: esccmd()
        !           346: {
        !           347:        char cmd;
        !           348:        char *p;
        !           349:        char escseqbuf[20];
        !           350: 
        !           351:        cmd = inchar();
        !           352:        switch(cmd) {
        !           353:        case 'A':       return ('k');   /* up arrow */
        !           354:        case 'B':       return ('j');   /* down arrow */
        !           355:        case 'C':       return ('l');   /* right arrow */
        !           356:        case 'D':       return ('h');   /* left arrow */
        !           357:        case 'h':       return ('b');   /* home */
        !           358:        case '2':       return ('u');   /* clear tab = undo */
        !           359:        case '1':       return (' ');   /* set tab = rezoom */
        !           360:        case 'J':       return ('f');   /* clear display = fill area */
        !           361:        case 'S':       return ('m');   /* roll up = move */
        !           362:        case 'U':       return ('d');   /* next page = draw */
        !           363:        case 'T':       return ('.');   /* roll down = set bit */
        !           364:        case 'V':       return ('>');   /* prev page = clear bit */
        !           365:        default:
        !           366:                /*
        !           367:                 * Eat up rest of (possibly long) escape sequence.
        !           368:                 * They all end in an upper case letter, with
        !           369:                 * a few exceptions.
        !           370:                 */
        !           371:                p = escseqbuf;
        !           372:                *p++ = '$';
        !           373:                *p++ = cmd;
        !           374:                while (!isupper(cmd) && cmd != 'h' && cmd != '\n')
        !           375:                        *p++ = cmd = inchar();
        !           376:                *p++ = 0;
        !           377:                sprintf(msgbuf, "Bad escape sequence: %s\n", escseqbuf);
        !           378:                error(msgbuf);
        !           379:        }
        !           380: }
        !           381: 
        !           382: onsig(signo)
        !           383: int signo;
        !           384: {
        !           385:        char *mes;
        !           386: 
        !           387:        switch(signo) {
        !           388:                case SIGQUIT:   mes = "quit"; break;
        !           389:                case SIGILL:    mes = "illegal instruction"; break;
        !           390:                case SIGBUS:    mes = "bus error"; break;
        !           391:                case SIGSEGV:   mes = "segmentation violation"; break;
        !           392:                case SIGSYS:    mes = "bad system call"; break;
        !           393:                default:        mes = "random signal"; break;
        !           394:        }
        !           395:        if (trace) {
        !           396:                fprintf(trace, "%s: core dumped\n", mes);
        !           397:                fflush(trace);
        !           398:        }
        !           399:        signal(SIGILL, SIG_DFL);
        !           400:        done();
        !           401:        printf("fed: %s: core dumped\n", mes);
        !           402:        fflush(stdout);
        !           403:        abort();
        !           404: }
        !           405: 
        !           406: onintr()
        !           407: {
        !           408:        signal(SIGINT, onintr);
        !           409:        error("Interrupted");
        !           410:        longjmp(env);
        !           411: }

unix.superglobalmegacorp.com

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