|
|
1.1 ! root 1: /* ! 2: This is version 4. The input language is: ! 3: ! 4: Cmd Abbrev Operands / Comments ! 5: comment # only at start of line ! 6: blank b s <vnum> start blanking; erase commands follow ! 7: e <vnum> end blanking current view ! 8: click c <clicknum> ! 9: define d v <number> <viewname> ! 10: c <number> <clickname> ! 11: p e pragma -- end of defs at front of file ! 12: Other possible ``pragmas'': ??? ! 13: Number of views, clicks ! 14: Number of (lines, bytes) in file ! 15: erase e <line repeated here, except for leading g> ! 16: Object is deletable ! 17: geom g <slotn> l <vnum> <opts> <x1> <y1> <x2> <y2> line ! 18: b <vnum> <opts> <x1> <y1> <x2> <y2> box ! 19: c <vnum> <opts> <x> <y> <rad> circle ! 20: t <vnum> <opts> <x> <y> <text string> text ! 21: one separating blank; string unquoted ! 22: <opts> format: string of characters, in order ! 23: <slotn> == 0 => line never erased ! 24: ! 25: At beginning of file: ! 26: d v <number> <view name> ! 27: d c <number> <click name> ! 28: d p <various pragmas here> ! 29: d p e ! 30: ! 31: */ ! 32: ! 33: #include <stdio.h> ! 34: #include "anim.h" ! 35: ! 36: #define sendpoint(p) { sendint(p.x); sendint(p.y); } ! 37: #define sendpair(x,y) { sendint(x); sendint(y); } ! 38: #define eq(s, t) (strcmp(s,t) == 0) ! 39: #define FATAL 1 ! 40: ! 41: char *cmdname; ! 42: char *emalloc(); ! 43: ! 44: long memsize = 200000; /* object memory allocation, ~20000 objs */ ! 45: ! 46: int dbg = 0; ! 47: int lineno = 1; /* ? */ ! 48: ! 49: main(argc, argv) ! 50: char *argv[]; ! 51: { ! 52: FILE *fp; ! 53: char *term_process = ANIMTERM; ! 54: char *zload = ""; ! 55: char buf[100]; ! 56: int i, c; ! 57: ! 58: cmdname = argv[0]; ! 59: while (argc > 1 && argv[1][0] == '-') { ! 60: switch (argv[1][1]) { ! 61: case 'd': ! 62: dbg = !dbg; ! 63: break; ! 64: case 'z': ! 65: zload = "-z"; ! 66: break; ! 67: case 't': ! 68: term_process = argv[2]; ! 69: argc--; ! 70: argv++; ! 71: break; ! 72: case 'm': ! 73: memsize = atoi(&argv[1][2]); ! 74: break; ! 75: } ! 76: argc--; ! 77: argv++; ! 78: } ! 79: if (argc <= 1) ! 80: error(FATAL, "no input file"); ! 81: if ((fp = fopen(argv[1], "r")) == NULL) ! 82: error(FATAL, "can't open %s\n", argv[1]); ! 83: if (!dbg) { ! 84: bootterm(term_process); ! 85: set_tty(); ! 86: } ! 87: send_data(fp); ! 88: if (dbg) ! 89: exit(0); ! 90: while ((c = readchar()) != P_QUIT) { ! 91: if (c == P_FILE) { /* rest of line is a filename */ ! 92: readstring(buf); ! 93: if ((fp = fopen(buf, "r")) == NULL) ! 94: send1char(P_ERROR); ! 95: else { ! 96: send1char(P_FILE); /* ack */ ! 97: send_data(fp); ! 98: } ! 99: } else ! 100: send1char(P_ERROR); ! 101: } ! 102: reset_tty(); ! 103: } ! 104: ! 105: send_data(fp) ! 106: FILE *fp; ! 107: { ! 108: char text[100], buf[100], opts[100], *p; ! 109: int c, x1, y1, x2, y2, i, v, slot; ! 110: ! 111: sendint(memsize); ! 112: send1char(P_INIT); ! 113: send1char(P_PRINT); ! 114: sendstring("here comes the data!"); ! 115: while ((c = getc(fp)) != EOF) { ! 116: switch (c) { ! 117: case ' ': ! 118: case '\t': ! 119: break; ! 120: case '\n': ! 121: lineno++; /* this should be the only increment */ ! 122: break; ! 123: case '#': /* comments */ ! 124: skipline(fp); ! 125: break; ! 126: case 'b': /* blank. ignore for now */ ! 127: skipline(fp); ! 128: break; ! 129: case 'c': /* click */ ! 130: fscanf(fp, "%d", &i); ! 131: send1char(P_OBJECT); ! 132: send1char(c); ! 133: sendint(i); ! 134: skipline(fp); ! 135: break; ! 136: case 'e': /* erase */ ! 137: fscanf(fp, "%d", &i); ! 138: send1char(P_OBJECT); ! 139: send1char(c); ! 140: sendint(i); ! 141: skipline(fp); ! 142: break; ! 143: case 'g': /* geom: draw line, box, circle, ... */ ! 144: fscanf(fp, "%d", &slot); ! 145: switch (c = skipbl(fp)) { ! 146: case 'l': ! 147: case 'b': ! 148: fscanf(fp, "%d %s %d %d %d %d", &v, opts, &x1, &y1, &x2, &y2); ! 149: send1char(P_OBJECT); ! 150: send1char(c); ! 151: sendint(slot); ! 152: sendint(v); ! 153: sendopt(c=='b' ? boxops : lineops, opts); ! 154: sendpair(x1, y1); ! 155: sendpair(x2, y2); ! 156: break; ! 157: case 'c': /* circle */ ! 158: fscanf(fp, "%d %s %d %d %d", &v, opts, &x1, &y1, &x2); ! 159: send1char(P_OBJECT); ! 160: send1char('o'); /* 'o' is for circle */ ! 161: sendint(slot); ! 162: sendint(v); ! 163: sendopt(circops, opts); ! 164: sendpair(x1, y1); ! 165: sendint(x2); ! 166: break; ! 167: case 't': /* text */ ! 168: fscanf(fp, "%d %s %d %d", &v, opts, &x1, &y1); ! 169: send1char(P_OBJECT); ! 170: send1char('t'); ! 171: sendint(slot); ! 172: sendint(v); ! 173: sendopt(textops, opts); ! 174: sendpair(x1, y1); ! 175: getc(fp); /* skip 1 separator; no quotes */ ! 176: for (p = text; (c = getc(fp)) != '\n'; ) ! 177: *p++ = c; ! 178: *p = 0; ! 179: ungetc('\n', fp); ! 180: /* slow... */ ! 181: if (eq(text, "bullet")) ! 182: sendstring("*"); ! 183: else if (eq(text, "dot")) ! 184: sendstring("."); ! 185: else if (eq(text, "circle")) ! 186: sendstring("o"); ! 187: else if (eq(text, "times")) ! 188: sendstring("x"); ! 189: else ! 190: sendstring(text); ! 191: break; ! 192: default: ! 193: send1char(P_ERROR); ! 194: flushproto(); ! 195: error(FATAL, "illegal g command: g %c", c); ! 196: break; ! 197: } ! 198: break; ! 199: case 'd': /* definition of some sort */ ! 200: switch (c = skipbl(fp)) { ! 201: case 'v': /* view */ ! 202: fscanf(fp, "%d %s", &i, text); ! 203: send1char(P_DEFINE); ! 204: send1char('v'); ! 205: sendint(i); ! 206: sendstring(text); ! 207: skipline(fp); /* might be a title there */ ! 208: break; ! 209: case 'c': /* click */ ! 210: fscanf(fp, "%d %s", &i, text); ! 211: send1char(P_DEFINE); ! 212: send1char('c'); ! 213: sendint(i); ! 214: sendstring(text); ! 215: break; ! 216: case 'p': ! 217: skipline(fp); ! 218: break; ! 219: default: ! 220: send1char(P_ERROR); ! 221: flushproto(); ! 222: error(FATAL, "unknown define command d %c", c); ! 223: break; ! 224: } ! 225: break; ! 226: default: ! 227: send1char(P_ERROR); ! 228: flushproto(); ! 229: error(FATAL, "unknown command %c", c); ! 230: break; ! 231: } ! 232: } ! 233: send1char(P_ENDFILE); ! 234: fclose(fp); ! 235: flushproto(); ! 236: } ! 237: ! 238: sendopt(optvals, opts) ! 239: int optvals[]; ! 240: char *opts; ! 241: { ! 242: int i, n; ! 243: ! 244: n = 0; ! 245: for (i = 0; optvals[i] && opts; i += 2) ! 246: if (*opts == optvals[i]) { ! 247: n += optvals[i+1]; ! 248: opts++; ! 249: } ! 250: sendint(n); ! 251: } ! 252: ! 253: skipbl(fp) ! 254: FILE *fp; ! 255: { ! 256: int c; ! 257: ! 258: while ((c = getc(fp)) == ' ' || c == '\t') ! 259: ; ! 260: return c; ! 261: } ! 262: ! 263: skipline(fp) ! 264: FILE *fp; ! 265: { ! 266: int c; ! 267: ! 268: while ((c = getc(fp)) != '\n') ! 269: ; ! 270: ungetc('\n', fp); ! 271: } ! 272: ! 273: error(f, s, a1, a2, a3, a4, a5, a6, a7) ! 274: { ! 275: extern char *cmdname; ! 276: extern int dbg; ! 277: ! 278: fprintf(stderr, "%s: ", cmdname); ! 279: fprintf(stderr, s, a1, a2, a3, a4, a5, a6, a7); ! 280: fprintf(stderr, "\n"); ! 281: if (lineno) ! 282: fprintf(stderr, " source line number %d\n", lineno); ! 283: if (f) { ! 284: if (dbg) ! 285: abort(); ! 286: exit(2); ! 287: } ! 288: } ! 289: ! 290: bootterm(procname) ! 291: char *procname; ! 292: { ! 293: int afildes[2], bfildes[2], pid; ! 294: if((pipe(afildes)==-1)||(pipe(bfildes)==-1)){ ! 295: fprintf(stderr, ! 296: "anim: can't create pipe to terminal process\n"); ! 297: return 0; ! 298: } ! 299: if((pid=fork())==0){ ! 300: close(0); ! 301: dup(afildes[0]); ! 302: close(1); ! 303: dup(bfildes[1]); ! 304: execl(procname, 0); ! 305: exit(127); ! 306: } ! 307: if(pid==-1){ ! 308: fprintf(stderr,"anim: can't fork %s\n", procname); ! 309: return 0; ! 310: } ! 311: close(0); ! 312: dup(bfildes[0]); ! 313: close(1); ! 314: dup(afildes[1]); ! 315: return 1; ! 316: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.