|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.