|
|
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.