|
|
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: long memsize = 80000; /* jerq memory allocation */
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: sprintf(buf, "32ld %s %s </dev/tty", zload, term_process);
85: system(buf);
86: set_tty();
87: }
88: send_data(fp);
89: if (dbg)
90: exit(0);
91: while ((c = readchar()) != P_QUIT) {
92: if (c == P_FILE) { /* rest of line is a filename */
93: readstring(buf);
94: if ((fp = fopen(buf, "r")) == NULL)
95: send1char(P_ERROR);
96: else {
97: send1char(P_FILE); /* ack */
98: send_data(fp);
99: }
100: } else
101: send1char(P_ERROR);
102: }
103: reset_tty();
104: }
105:
106: send_data(fp)
107: FILE *fp;
108: {
109: char text[100], buf[100], opts[100], *p;
110: int c, x1, y1, x2, y2, i, v, slot;
111:
112: sendint(memsize);
113: send1char(P_INIT);
114: send1char(P_PRINT);
115: sendstring("here comes the data!");
116: while ((c = getc(fp)) != EOF) {
117: switch (c) {
118: case ' ':
119: case '\t':
120: break;
121: case '\n':
122: lineno++; /* this should be the only increment */
123: break;
124: case '#': /* comments */
125: skipline(fp);
126: break;
127: case 'b': /* blank. ignore for now */
128: skipline(fp);
129: break;
130: case 'c': /* click */
131: fscanf(fp, "%d", &i);
132: send1char(P_OBJECT);
133: send1char(c);
134: sendint(i);
135: skipline(fp);
136: break;
137: case 'e': /* erase */
138: fscanf(fp, "%d", &i);
139: send1char(P_OBJECT);
140: send1char(c);
141: sendint(i);
142: skipline(fp);
143: break;
144: case 'g': /* geom: draw line, box, circle, ... */
145: fscanf(fp, "%d", &slot);
146: switch (c = skipbl(fp)) {
147: case 'l':
148: case 'b':
149: fscanf(fp, "%d %s %d %d %d %d", &v, opts, &x1, &y1, &x2, &y2);
150: send1char(P_OBJECT);
151: send1char(c);
152: sendint(slot);
153: sendint(v);
154: sendopt(c=='b' ? boxops : lineops, opts);
155: sendpair(x1, y1);
156: sendpair(x2, y2);
157: break;
158: case 'c': /* circle */
159: fscanf(fp, "%d %s %d %d %d", &v, opts, &x1, &y1, &x2);
160: send1char(P_OBJECT);
161: send1char('o'); /* 'o' is for circle */
162: sendint(slot);
163: sendint(v);
164: sendopt(circops, opts);
165: sendpair(x1, y1);
166: sendint(x2);
167: break;
168: case 't': /* text */
169: fscanf(fp, "%d %s %d %d", &v, opts, &x1, &y1);
170: send1char(P_OBJECT);
171: send1char('t');
172: sendint(slot);
173: sendint(v);
174: sendopt(textops, opts);
175: sendpair(x1, y1);
176: getc(fp); /* skip 1 separator; no quotes */
177: for (p = text; (c = getc(fp)) != '\n'; )
178: *p++ = c;
179: *p = 0;
180: ungetc('\n', fp);
181: /* slow... */
182: if (eq(text, "bullet"))
183: sendstring("*");
184: else if (eq(text, "dot"))
185: sendstring(".");
186: else if (eq(text, "circle"))
187: sendstring("o");
188: else if (eq(text, "times"))
189: sendstring("x");
190: else
191: sendstring(text);
192: break;
193: default:
194: error(FATAL, "illegal g command: g %c", c);
195: break;
196: }
197: break;
198: case 'd': /* definition of some sort */
199: switch (c = skipbl(fp)) {
200: case 'v': /* view */
201: fscanf(fp, "%d %s", &i, text);
202: send1char(P_DEFINE);
203: send1char('v');
204: sendint(i);
205: sendstring(text);
206: skipline(fp); /* might be a title there */
207: break;
208: case 'c': /* click */
209: fscanf(fp, "%d %s", &i, text);
210: send1char(P_DEFINE);
211: send1char('c');
212: sendint(i);
213: sendstring(text);
214: break;
215: case 'p':
216: skipline(fp);
217: break;
218: default:
219: error(FATAL, "unknown define command d %c", c);
220: break;
221: }
222: break;
223: default:
224: error(FATAL, "unknown command %c", c);
225: break;
226: }
227: }
228: send1char(P_ENDFILE);
229: flushproto();
230: fclose(fp);
231: }
232:
233: sendopt(optvals, opts)
234: int optvals[];
235: char *opts;
236: {
237: int i, n;
238:
239: n = 0;
240: for (i = 0; optvals[i] && opts; i += 2)
241: if (*opts == optvals[i]) {
242: n += optvals[i+1];
243: opts++;
244: }
245: sendint(n);
246: }
247:
248: skipbl(fp)
249: FILE *fp;
250: {
251: int c;
252:
253: while ((c = getc(fp)) == ' ' || c == '\t')
254: ;
255: return c;
256: }
257:
258: skipline(fp)
259: FILE *fp;
260: {
261: int c;
262:
263: while ((c = getc(fp)) != '\n')
264: ;
265: ungetc('\n', fp);
266: }
267:
268: error(f, s, a1, a2, a3, a4, a5, a6, a7)
269: {
270: extern char *cmdname;
271: extern int dbg;
272:
273: fprintf(stderr, "%s: ", cmdname);
274: fprintf(stderr, s, a1, a2, a3, a4, a5, a6, a7);
275: fprintf(stderr, "\n");
276: if (lineno)
277: fprintf(stderr, " source line number %d\n", lineno);
278: if (f) {
279: if (dbg)
280: abort();
281: exit(2);
282: }
283: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.