|
|
1.1 root 1: #include <stdio.h>
2: #include <ctype.h>
3: #define void int
4:
5: #ifdef T5620
6: #include "jcom.h"
7: extern int openflg;
8: extern int t;
9: #endif
10:
11: #define MAXL 16
12: double atof();
13: char *strchr();
14: char *getl();
15: void idle();
16: void arc();
17: void box();
18: void circle();
19: void disc();
20: void erase();
21: void closepl();
22: void color();
23: void cfill();
24: void pen();
25: void frame();
26: void grade();
27: void ppause();
28: void line();
29: void move();
30: void openpl();
31: void point();
32: void parabola();
33: void range();
34: void rmove();
35: void text();
36: void sbox();
37: void vec();
38: void rvec();
39: void fill();
40: void poly();
41: void spline();
42: void fspline();
43: void lspline();
44: void dspline();
45: void cspline();
46: void save();
47: void restore();
48: void define();
49: void call();
50: void pinclude();
51: struct pcall {
52: void (*plot)();
53: int kount;
54: char *cc;
55: int numc;
56: } plots[] = {
57: arc, 7, "a", 1,
58: box, 4, "bo", 2,
59: circle, 3, "ci", 2,
60: disc, 3, "di", 2,
61: erase, -1, "e", 1,
62: closepl, -1, "cl", 2,
63: frame, 4, "fr", 2,
64: grade, 1, "g", 1,
65: ppause, -1, "pau", 3,
66: color, 0, "co", 2,
67: cfill, 0, "cf", 2,
68: pen, 0, "pe", 2,
69: line, 4, "li", 2,
70: move, 2, "m", 1,
71: idle, -2, "id", 2,
72: openpl, 0, "o", 1,
73: point, 2, "poi", 3,
74: parabola, 6, "par", 3,
75: range, 4, "ra", 2,
76: rmove, 2, "rm", 2,
77: text, 0, "t", 1,
78: sbox, 4, "sb", 2,
79: vec, 2, "v", 1,
80: rvec, 2, "rv", 2,
81: fill, 256, "fi", 2,
82: poly, 256, "pol", 3,
83: spline, 256, "sp", 2,
84: fspline, 256, "fs", 2,
85: lspline, 256, "ls", 2,
86: dspline, 256, "ds", 2,
87: cspline, 256, "cs", 2,
88: save, -1, "sa", 2,
89: restore, -1, "re", 2,
90: define, 0, "de", 2,
91: call, 0, "ca", 2,
92: pinclude, 0, "in", 2,
93: 0, 0, 0, 0
94: };
95: struct pcall *pplots;
96: struct fcall {
97: char *name;
98: char *stash;
99: } flibr[MAXL];
100: struct fcall *fptr = flibr;
101: short FN = 1;
102: double SC = 1.0;
103: char *fstack[64], **fstp;
104:
105: int num[256],*nn;
106: double *ff[256], **fp;
107: char aa[256];
108: FILE *fd;
109: main(arc, arv)
110: int arc;
111: char **arv;
112: {
113: char *ap;
114: fd = stdin;
115: for (; arc > 1; arc--, arv++) {
116: if (arv[1][0] == '-') {
117: ap = arv[1];
118: ap++;
119: if (*ap == 'T')
120: continue;
121: if (*ap == 'D') {
122: ptype(++ap);
123: continue;
124: }
125: switch (*ap) {
126: case 'e':
127: erase();
128: continue;
129: case 'C':
130: closepl();
131: continue;
132: case 'w':
133: ppause();
134: continue;
135: case 'c':
136: color(++ap);
137: continue;
138: case 'f':
139: cfill(++ap);
140: continue;
141: case 'p':
142: pen(++ap);
143: continue;
144: case 'o':
145: openpl(++ap);
146: continue;
147: case 'g':
148: grade(atof(++ap));
149: continue;
150: default:
151: fprintf(stderr, "%s not allowed as argument\n",
152: ap);
153: exit(1);
154: }
155: continue;
156: }
157: if ((fd = fopen(arv[1], "r")) == NULL) {
158: perror();
159: fprintf(stderr, "Cannot find file %s\n", arv[1]);
160: continue;
161: }
162: if(!process())
163: break;
164: fclose(fd);
165: }
166: if (fd == stdin)
167: process();
168: #ifdef T5620
169: closep();
170: #endif
171: exit(0);
172: }
173: process()
174: {
175: short acn,curl;
176: double X[512], *xp;
177: char *ap, *aq, truef;
178: fstp = fstack;
179: fp = ff;
180: nn = num;
181: while((ap=getl(aa))){
182: #ifdef T5620
183: if(t == TQUIT)
184: return(0);
185: #endif
186: while(isspace(*ap)){
187: if(*ap == '\n')
188: ap=getl(aa);
189: else ap++;
190: }
191: if(*ap == ':')continue;
192: while(*ap == '.' && !(isdigit(*(ap+1))))
193: ap++;
194: if (isupper(*ap))
195: *ap = tolower(*ap);
196: if (!islower(*ap)){
197: if(pplots == 0){
198: closepl();
199: fprintf(stderr,"file probably not jplot input\n");
200: exit(1);
201: }
202: if (pplots->kount > 1)
203: goto aresume;
204: continue;
205: }
206: if(fp != ff){
207: if(acn%2 != 0){
208: #ifdef T5620
209: if(openflg) closep();
210: #endif
211: fprintf(stderr,"phase error\n");
212: exit(1);
213: }
214: *nn++ = acn/2;
215: *nn = 0;
216: (*pplots->plot)(num,ff);
217: fp = ff;
218: nn = num;
219: }
220: for (pplots = plots; pplots->plot != 0; pplots++)
221: if (strncmp(ap, pplots->cc, pplots->numc) == 0){
222: break;
223: }
224: if (pplots->plot == 0) {
225: #ifdef T5620
226: if(openflg) closep();
227: #endif
228: fprintf(stderr,"no command for %s\n", ap);
229: exit();
230: }
231: if (pplots->kount < 0) {
232: (*pplots->plot)();
233: continue;
234: }
235: if (*ap != '\n')
236: while(islower(*ap))
237: ap++;
238: if (*ap != '\n')
239: while (isspace(*ap) || *ap == ',')
240: ap++;
241: if (*ap == '\n') {
242: if (!(pplots->kount))
243: (*pplots->plot)(" ");
244: continue;
245: }
246: if (!(pplots->kount)) {
247: for(aq=ap; *aq != '\n';aq++)
248: if(*aq == '\\')aq++;
249: if (*ap == '"'){
250: ap++;
251: if(*(aq-1) == '"')
252: aq--;
253: }
254: *aq = NULL;
255: (*pplots->plot)(ap);
256: continue;
257: }
258: acn = 0;
259: xp = X;
260: if(pplots->kount == 256){
261: curl = 0;
262: *fp++ = X;
263: }
264: aresume:
265: while (*ap != '\n') {
266: while (isspace(*ap) || *ap == ',')
267: ap++;
268: if (*ap == '\n')
269: break;
270: if(*ap == '{'){
271: ap++;
272: if(curl==0 || ( curl==1 && acn == 0)){
273: curl++;
274: continue;
275: }
276: *fp++ = xp;
277: continue;
278: }
279: if(*ap == '}'){
280: ap++;
281: curl++;
282: if(acn==0){
283: *nn = 0;
284: (*pplots->plot)(num,ff);
285: fp = ff;
286: nn = num;
287: continue;
288: }
289: if(acn%2 != 0){
290: #ifdef T5620
291: closep();
292: #endif
293: fprintf(stderr,"phase error\n");
294: exit(1);
295: }
296: *nn++ = acn/2;
297: acn = 0;
298: continue;
299: }
300: aq = ap;
301: while (!(isspace(*ap)) && *ap != ',' && *ap != '\n')
302: ap++;
303: if (isdigit(*aq)||(*aq == '-'||*aq == '+'||*aq == '.')){
304: *xp++ = atof(aq)*SC;
305: if (++acn >= pplots->kount&&pplots->kount != 256) {
306: switch (acn) {
307: case 1:
308: (*pplots->plot)(X[0]);
309: break;
310: case 2:
311: (*pplots->plot)(X[0], X[1]);
312: break;
313: case 3:
314: (*pplots->plot)(X[0],X[1],X[2]);
315: break;
316: case 4:
317: (*pplots->plot)(X[0],X[1],X[2],X[3]);
318: break;
319: case 6:
320: (*pplots->plot)(X[0],X[1],X[2],
321: X[3], X[4], X[5]);
322: break;
323: case 7:
324: (*pplots->plot)(X[0],X[1],X[2],
325: X[3], X[4], X[5], X[6]);
326: break;
327: }
328: acn = 0;
329: xp = X;
330: }
331: }
332: }
333: }
334: return(1);
335: }
336: char *malloc();
337: char *realloc();
338: char *names = 0;
339: char *enames = 0;
340: char *bstash = 0;
341: char *estash = 0;
342: unsigned size = 1024;
343: char *nstash = 0;
344: define(a)
345: char *a;
346: {
347: char *ap, *aq;
348: short i, j;
349: int curly = 0;
350: ap = a;
351: while(isalpha(*ap))ap++;
352: if(ap == a){
353: fprintf(stderr,"no name with define\n");
354: exit(1);
355: }
356: i = ap - a;
357: if(names+i+1 > enames){
358: names = malloc((unsigned)512);
359: enames = names + 512;
360: }
361: fptr->name = names;
362: strncpy(names, a,i);
363: names += i;
364: *names++ = '\0';
365: if(!bstash){
366: bstash = nstash = malloc(size);
367: estash = bstash + size;
368: }
369: fptr->stash = nstash;
370: while(*ap != '{')
371: if(*ap == '\n'){
372: if((ap=fgets(aa,256,fd))==NULL){
373: fprintf(stderr,"unexpected end of file\n");
374: exit(1);
375: }
376: }
377: else ap++;
378: while((j=getc(fd))!= EOF){
379: if(j == '{')curly++;
380: else if(j == '}'){
381: if(curly == 0)break;
382: else curly--;
383: }
384: *nstash++ = j;
385: if(nstash == estash){
386: free(bstash);
387: size += 1024;
388: bstash = realloc(bstash,size);
389: estash = bstash+size;
390: }
391: }
392: *nstash++ = '\0';
393: if(fptr++ >= &flibr[MAXL]){
394: fprintf(stderr,"Too many objects\n");
395: exit(1);
396: }
397: }
398: call(a)
399: char *a;
400: {
401: char *ap;
402: struct fcall *f;
403: char sav;
404: ap = a;
405: while(isalpha(*ap))ap++;
406: sav = *ap;
407: *ap = '\0';
408: for(f=flibr;f<fptr;f++){
409: if (!(strcmp(a, f->name)))
410: break;
411: }
412: if(f == fptr){
413: fprintf(stderr, "object %s not defined\n",a);
414: exit(1);
415: }
416: *ap = sav;
417: while (isspace(*ap) || *ap == ',')
418: ap++;
419: if (*ap != '\0')
420: SC = atof(ap);
421: else SC = 1.;
422: *(++fstp) = f->stash;
423: FN = 0;
424: }
425: pinclude(a)
426: char *a;
427: {
428: FILE * fd1;
429: char aa[256], *ap;
430: double x[256], *xp;
431: int n;
432: if ((fd1 = fopen(a + 1, "r")) == NULL) {
433: perror();
434: fprintf(stderr, "Cannot find %s\n", a + 1);
435: return(0);
436: }
437: xp = x;
438: while (fgets(aa, 256, fd1) != NULL) {
439: ap = aa;
440: while (*ap != NULL && *ap != '\n') {
441: while (isspace(*ap) || *ap == ',')
442: ap++;
443: if (*ap == NULL)
444: break;
445: *xp++ = atof(ap);
446: while (!(isspace(*ap)) && *ap != ',' && *ap != NULL)
447: ap++;
448: }
449: }
450: fclose(fd1);
451: }
452: char *getl(a)
453: char a[];
454: {
455: char *ap;
456: newl:
457: if(FN){
458: if (fgets(a, 256, fd) == NULL)
459: return(0);
460: if(*a == '\n')goto newl;
461: return(a);
462: } else {
463: if(**fstp == '\0'){
464: fstp--;
465: if(fstp == fstack){
466: SC = 1.;
467: FN = 1;
468: }
469: goto newl;
470: }
471: ap = *fstp;
472: *fstp = strchr(*fstp,'\n') +1;
473: return(ap);
474: }
475: }
476: spline(n1, f1)
477: int n1[];
478: double *f1[];
479: {
480: splin(0,n1,f1);
481: }
482: fspline(n1,f1)
483: int n1[];
484: double *f1[];
485: {
486: splin(1,n1,f1);
487: }
488: lspline(n1,f1)
489: int n1[];
490: double *f1[];
491: {
492: splin(2,n1,f1);
493: }
494: dspline(n1,f1)
495: int n1[];
496: double *f1[];
497: {
498: splin(3,n1,f1);
499: }
500: cspline(n1,f1)
501: int n1[];
502: double *f1[];
503: {
504: splin(4,n1,f1);
505: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.