|
|
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> xmin ymin xmax ymax ! 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: #ifdef BLIT ! 45: long memsize = 65000; /* memory allocation */ ! 46: #endif ! 47: #ifdef X11 ! 48: long memsize = 200000; /* X11 memory allocation */ ! 49: #endif ! 50: ! 51: int dbg = 0; ! 52: int lineno = 1; /* ? */ ! 53: ! 54: #ifndef X11 ! 55: char *termld = TERMLD; /* will be "32ld" or "dmdld" */ ! 56: #endif ! 57: ! 58: char *zload = ""; /* will be -z for load and hang on blit */ ! 59: int nterm = 0; /* number of bytes needed in terminal */ ! 60: ! 61: main(argc, argv) ! 62: char *argv[]; ! 63: { ! 64: FILE *fp; ! 65: char *term_process = ANIMTERM; /* typically "./animterm" */ ! 66: char buf[100]; ! 67: int i, c, bootstat; ! 68: ! 69: cmdname = argv[0]; ! 70: while (argc > 1 && argv[1][0] == '-') { ! 71: switch (argv[1][1]) { ! 72: case 'd': ! 73: dbg = !dbg; ! 74: break; ! 75: case 'z': ! 76: zload = "-z"; ! 77: break; ! 78: case 't': ! 79: term_process = argv[2]; ! 80: argc--; ! 81: argv++; ! 82: break; ! 83: case 'm': ! 84: memsize = atoi(&argv[1][2]); ! 85: if (memsize <= 0) { ! 86: memsize = atoi(argv[2]); ! 87: if (memsize <= 0) ! 88: error(FATAL, "memory size must be positive. use -mN"); ! 89: argc--; ! 90: argv++; ! 91: } ! 92: break; ! 93: } ! 94: argc--; ! 95: argv++; ! 96: } ! 97: if (argc <= 1) ! 98: error(FATAL, "no input file"); ! 99: if ((fp = fopen(argv[1], "r")) == NULL) ! 100: error(FATAL, "can't open %s\n", argv[1]); ! 101: if (!dbg) { ! 102: bootstat = bootterm(term_process); ! 103: set_tty(); ! 104: } ! 105: if (bootstat || dbg) ! 106: send_data(fp); ! 107: if (dbg) { ! 108: printf("\nterminal bytes needed: %d\n", nterm); ! 109: exit(0); ! 110: } ! 111: while ((c = readchar()) != P_QUIT) { ! 112: if (c == P_FILE) { /* rest of line is a filename */ ! 113: readstring(buf); ! 114: if ((fp = fopen(buf, "r")) == NULL) ! 115: send1char(P_ERROR); ! 116: else { ! 117: send1char(P_FILE); /* ack */ ! 118: send_data(fp); ! 119: } ! 120: } else ! 121: send1char(P_ERROR); ! 122: } ! 123: reset_tty(); ! 124: } ! 125: ! 126: send_data(fp) ! 127: FILE *fp; ! 128: { ! 129: char text[100], buf[100], opts[100], *p; ! 130: int c, x1, y1, x2, y2, i, v, slot; ! 131: int ntext; ! 132: ! 133: sendint(memsize); ! 134: send1char(P_INIT); ! 135: send1char(P_PRINT); ! 136: sendstring("here comes the data!"); ! 137: while ((c = getc(fp)) != EOF) { ! 138: switch (c) { ! 139: case ' ': ! 140: case '\t': ! 141: break; ! 142: case '\n': ! 143: lineno++; /* this should be the only increment */ ! 144: break; ! 145: case '#': /* comments */ ! 146: skipline(fp); ! 147: break; ! 148: case 'b': /* blank. ignore for now */ ! 149: skipline(fp); ! 150: break; ! 151: case 'c': /* click */ ! 152: if (fscanf(fp, "%d", &i) != 1) ! 153: return badfile(fp); ! 154: send1char(P_OBJECT); ! 155: send1char(c); ! 156: sendint(i); ! 157: skipline(fp); ! 158: nterm += 3; ! 159: break; ! 160: case 'e': /* erase */ ! 161: if (fscanf(fp, "%d", &i) != 1) ! 162: return badfile(fp); ! 163: send1char(P_OBJECT); ! 164: send1char(c); ! 165: sendint(i); ! 166: skipline(fp); ! 167: nterm += 6; ! 168: break; ! 169: case 'g': /* geom: draw line, box, circle, ... */ ! 170: if (fscanf(fp, "%d", &slot) != 1) ! 171: return badfile(fp); ! 172: switch (c = skipbl(fp)) { ! 173: case 'l': ! 174: case 'b': ! 175: if (fscanf(fp, "%d %s %d %d %d %d", &v, opts, &x1, &y1, &x2, &y2) != 6) ! 176: return badfile(fp); ! 177: send1char(P_OBJECT); ! 178: send1char(c); ! 179: sendint(slot); ! 180: sendint(v); ! 181: sendopt(c=='b' ? boxops : lineops, opts); ! 182: sendpair(x1, y1); ! 183: sendpair(x2, y2); ! 184: nterm += 12; ! 185: break; ! 186: case 'c': /* circle */ ! 187: if (fscanf(fp, "%d %s %d %d %d", &v, opts, &x1, &y1, &x2) != 5) ! 188: return badfile(fp);; ! 189: send1char(P_OBJECT); ! 190: send1char('o'); /* 'o' is for circle */ ! 191: sendint(slot); ! 192: sendint(v); ! 193: sendopt(circops, opts); ! 194: sendpair(x1, y1); ! 195: sendint(x2); ! 196: nterm += 10; ! 197: break; ! 198: case 't': /* text */ ! 199: if (fscanf(fp, "%d %s %d %d", &v, opts, &x1, &y1) != 4) ! 200: return badfile(fp); ! 201: send1char(P_OBJECT); ! 202: send1char('t'); ! 203: sendint(slot); ! 204: sendint(v); ! 205: sendopt(textops, opts); ! 206: sendpair(x1, y1); ! 207: getc(fp); /* skip 1 separator; no quotes */ ! 208: for (p = text; (c = getc(fp)) != '\n'; ) ! 209: *p++ = c; ! 210: *p = 0; ! 211: ungetc('\n', fp); ! 212: ntext = 1; ! 213: /* slow... */ ! 214: if (eq(text, "bullet")) ! 215: sendstring("*"); ! 216: else if (eq(text, "dot")) ! 217: sendstring("."); ! 218: else if (eq(text, "circle")) ! 219: sendstring("o"); ! 220: else if (eq(text, "times")) ! 221: sendstring("x"); ! 222: else { ! 223: sendstring(text); ! 224: ntext = strlen(text); ! 225: } ! 226: nterm += 10 + ntext; ! 227: break; ! 228: default: ! 229: return badfile(fp); ! 230: } ! 231: break; ! 232: case 'd': /* definition of some sort */ ! 233: switch (c = skipbl(fp)) { ! 234: case 'v': /* view */ ! 235: if (fscanf(fp, "%d %s", &i, text) != 2) ! 236: return badfile(fp); ! 237: send1char(P_DEFINE); ! 238: send1char('v'); ! 239: sendint(i); ! 240: sendstring(text); ! 241: skipline(fp); /* might be a title there */ ! 242: break; ! 243: case 'c': /* click */ ! 244: if (fscanf(fp, "%d %s", &i, text) != 2) ! 245: return badfile(fp); ! 246: send1char(P_DEFINE); ! 247: send1char('c'); ! 248: sendint(i); ! 249: sendstring(text); ! 250: break; ! 251: case 'p': ! 252: skipline(fp); ! 253: break; ! 254: default: ! 255: return badfile(fp); ! 256: } ! 257: break; ! 258: default: ! 259: return badfile(fp); ! 260: } ! 261: } ! 262: send1char(P_ENDFILE); ! 263: fclose(fp); ! 264: flushproto(); ! 265: return 1; ! 266: } ! 267: ! 268: badfile(fp) ! 269: FILE *fp; ! 270: { ! 271: send1char(P_ERRPRINT); ! 272: sendstring("file is not in .i format"); ! 273: send1char(P_ENDFILE); ! 274: while (getc(fp) != EOF) ! 275: ; ! 276: fclose(fp); ! 277: flushproto(); ! 278: return 0; ! 279: } ! 280: ! 281: sendopt(optvals, opts) ! 282: int optvals[]; ! 283: char *opts; ! 284: { ! 285: int i, n; ! 286: ! 287: n = 0; ! 288: for (i = 0; optvals[i] && opts; i += 2) ! 289: if (*opts == optvals[i]) { ! 290: n += optvals[i+1]; ! 291: opts++; ! 292: } ! 293: sendint(n); ! 294: } ! 295: ! 296: skipbl(fp) ! 297: FILE *fp; ! 298: { ! 299: int c; ! 300: ! 301: while ((c = getc(fp)) == ' ' || c == '\t') ! 302: ; ! 303: return c; ! 304: } ! 305: ! 306: skipline(fp) ! 307: FILE *fp; ! 308: { ! 309: int c; ! 310: ! 311: while ((c = getc(fp)) != '\n') ! 312: ; ! 313: ungetc('\n', fp); ! 314: } ! 315: ! 316: error(f, s, a1, a2, a3, a4, a5, a6, a7) ! 317: { ! 318: extern char *cmdname; ! 319: extern int dbg; ! 320: ! 321: fprintf(stderr, "%s: ", cmdname); ! 322: fprintf(stderr, s, a1, a2, a3, a4, a5, a6, a7); ! 323: fprintf(stderr, "\n"); ! 324: if (lineno) ! 325: fprintf(stderr, " source line number %d\n", lineno); ! 326: if (f) { ! 327: if (dbg) ! 328: abort(); ! 329: exit(2); ! 330: } ! 331: } ! 332: ! 333: #ifndef X11 ! 334: ! 335: bootterm(procname) ! 336: char *procname; ! 337: { ! 338: char buf[100]; ! 339: ! 340: sprintf(buf, "%s %s %s </dev/tty", termld, zload, procname); ! 341: if (system(buf) != 0) { ! 342: fprintf(stderr, ! 343: "anim: can't create pipe to terminal process\n"); ! 344: return 0; ! 345: } ! 346: return 1; ! 347: } ! 348: ! 349: #endif ! 350: ! 351: #ifdef X11 ! 352: ! 353: bootterm(procname) ! 354: char *procname; ! 355: { ! 356: int afildes[2], bfildes[2], pid; ! 357: if((pipe(afildes)==-1)||(pipe(bfildes)==-1)){ ! 358: fprintf(stderr, ! 359: "anim: can't create pipe to terminal process\n"); ! 360: return 0; ! 361: } ! 362: if((pid=fork())==0){ ! 363: close(0); ! 364: dup(afildes[0]); ! 365: close(1); ! 366: dup(bfildes[1]); ! 367: execl(procname, "animterm", 0); ! 368: exit(127); ! 369: } ! 370: if(pid==-1){ ! 371: fprintf(stderr,"anim: can't fork %s\n", procname); ! 372: return 0; ! 373: } ! 374: close(0); ! 375: dup(bfildes[0]); ! 376: close(1); ! 377: dup(afildes[1]); ! 378: return 1; ! 379: } ! 380: ! 381: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.