|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include "pico.h" ! 3: #include "y.tab.h" ! 4: ! 5: Symbol *comlist = 0; /* commands */ ! 6: Symbol *symlist = 0; /* keywords, functions, variables, names */ ! 7: Symbol *lastkey = 0; ! 8: ! 9: Symbol *install(), *newbltin(), *remove(); ! 10: ! 11: int rand(), println(), Clamp(), Abs(); ! 12: int patan2(), psin(), pcos(), Psin(), Pcos(), Patan2(); ! 13: int intexp(), intsqrt(), intlog(), intlog10(), intpow(); ! 14: int a_polar(), r_polar(), x_cart(), y_cart(); ! 15: int setcmap(), setzmap(), getcmap(); ! 16: int redcmap(), grncmap(), blucmap(); ! 17: int putframe(), getframe(), swap(); ! 18: int X_cart(), Y_cart(), A_polar(); ! 19: int putbitmap(), put0bitmap(); ! 20: ! 21: static struct { ! 22: char *name; ! 23: int (*faddr)(); ! 24: char nrparams; ! 25: } bltin[] = { ! 26: "A_polar", A_polar, 2, ! 27: "Atan", Patan2, 2, ! 28: "Cos", Pcos, 1, ! 29: "Sin", Psin, 1, ! 30: "X_cart", X_cart, 2, ! 31: "Y_cart", Y_cart, 2, ! 32: ! 33: "a_polar", a_polar, 2, ! 34: "abs", Abs, 1, ! 35: "atan", patan2, 2, ! 36: "blucmap", blucmap, 2, ! 37: "clamp", Clamp, 1, ! 38: "cos", pcos, 1, ! 39: "dump", putbitmap, 1, ! 40: "dump0", put0bitmap, 1, ! 41: "exp", intexp, 1, ! 42: "getcmap", getcmap, 4, ! 43: "getframe", getframe, 1, ! 44: "grncmap", grncmap, 2, ! 45: "log", intlog, 1, ! 46: "log10", intlog10, 1, ! 47: "pow", intpow, 2, ! 48: "printf", println, 1, ! 49: "putframe", putframe, 1, ! 50: "r_polar", r_polar, 2, ! 51: "rand", rand, 0, ! 52: "redcmap", redcmap, 2, ! 53: "setcmap", setcmap, 4, ! 54: "sin", psin, 1, ! 55: "sqrt", intsqrt, 1, ! 56: "swap", swap, 0, ! 57: "x_cart", x_cart, 2, ! 58: "y_cart", y_cart, 2, ! 59: 0, 0, 0, ! 60: }; ! 61: ! 62: static struct { ! 63: char *name; ! 64: int kval; ! 65: } keywords[] = { ! 66: "array", DECL, ! 67: "blu", BCHAN, ! 68: "bw", BW, ! 69: "cmap", CMAP, ! 70: "do", DO, ! 71: "else", ELSE, ! 72: "for", FOR, ! 73: "global", GLOBAL, ! 74: "goto", JUMP, ! 75: "grn", GCHAN, ! 76: "i", I, ! 77: "if", IF, ! 78: "int", INT, ! 79: "new", TMP, ! 80: "old", OLD, ! 81: "return", RETURN, ! 82: "rgb", RGB, ! 83: "red", RCHAN, ! 84: "while", WHILE, ! 85: "x", X, ! 86: "y", Y, ! 87: 0, 0, ! 88: }; ! 89: ! 90: static struct { ! 91: char *name; ! 92: int cval; ! 93: } consts[] = { ! 94: "Z", 255, ! 95: 0, 0 ! 96: }; ! 97: ! 98: static struct { ! 99: char *name; ! 100: int kval; ! 101: } commands[] = { ! 102: "a", A, ! 103: "blind", BLIND, ! 104: "color", COLOR, ! 105: "d", DEL, ! 106: "def", DEF, ! 107: "down", DOWN, ! 108: "f", F, ! 109: "faster", FASTER, ! 110: "framebuffer", FRAMEBUFFER, ! 111: "functions", SETF, ! 112: "get", GET, ! 113: "h", H, ! 114: "help", HELP, ! 115: "metheus", METHEUS, ! 116: "nocolor", NOCOLOR, ! 117: "optim", OPTIM, ! 118: "q", Q, ! 119: "r", R, ! 120: "ramzap", ZAP, ! 121: "show", SET, ! 122: "slower", SLOWER, ! 123: "tree", SEETREE, ! 124: "up", UP, ! 125: "w", W, ! 126: "window", WINDOW, ! 127: "x", RUN, ! 128: "zap", ZAP, ! 129: 0, 0, ! 130: }; ! 131: ! 132: syminit() ! 133: { int i; ! 134: extern int DEF_LL, DEF_NL; ! 135: extern char *progr; ! 136: ! 137: progr = (char *) Emalloc(NPROG * sizeof(char)); ! 138: ! 139: for (i = 0; keywords[i].name; i++) ! 140: install(keywords[i].name, keywords[i].kval, 0); ! 141: lastkey = symlist; ! 142: for (i = 0; bltin[i].name; i++) ! 143: newbltin(bltin[i].name, bltin[i].faddr, bltin[i].nrparams); ! 144: install("X", VARIABLE, DEF_LL); ! 145: install("Y", VARIABLE, DEF_NL); ! 146: for (i = 0; consts[i].name; i++) ! 147: install(consts[i].name, VARIABLE, consts[i].cval); ! 148: for (i = 0; commands[i].name; i++) ! 149: newcom(commands[i].name, commands[i].kval); ! 150: } ! 151: ! 152: fakeparams(n) ! 153: { int i, j; ! 154: char s[128]; ! 155: ! 156: for (i = j = 0; i < n-1; i++) ! 157: { s[j++] = 'a'+i; ! 158: s[j++] = ','; ! 159: } ! 160: if (n > 0) ! 161: s[j++] = 'a'+i; ! 162: s[j] = '\0'; ! 163: ! 164: fprintf(stderr, "(%s)", s); ! 165: } ! 166: ! 167: spaces(n) ! 168: { int i; char aa[32]; ! 169: for (i = 0; i < n; i++) ! 170: aa[i] = ' '; ! 171: aa[i] = '\0'; ! 172: fprintf(stderr, " %s", aa); ! 173: } ! 174: ! 175: showfcts() ! 176: { register Symbol *sym; ! 177: register int i, j; ! 178: ! 179: for (sym = symlist, i=j=0; sym != lastkey; sym = sym->next) ! 180: if (sym->type == FCT) ! 181: { if (i == 0) ! 182: fprintf(stderr, "functions:\n"); ! 183: if ((i++)%4) ! 184: spaces(15-j); ! 185: else ! 186: fprintf(stderr, "\n"); ! 187: fprintf(stderr, "%s", sym->name); ! 188: fakeparams(sym->u.fu->nrparams); ! 189: j = strlen(sym->name) + 2*(sym->u.fu->nrparams); ! 190: j -= (sym->u.fu->nrparams != 0); ! 191: } ! 192: if (i) ! 193: fprintf(stderr, "\n"); ! 194: for (sym = symlist, i=j=0; sym != lastkey; sym = sym->next) ! 195: if (sym->type == BLTN) ! 196: { if (i == 0) ! 197: fprintf(stderr, "builtins:\n"); ! 198: if ((i++)%4) ! 199: spaces(15-j); ! 200: else ! 201: fprintf(stderr, "\n"); ! 202: fprintf(stderr, "%s", sym->name); ! 203: fakeparams(sym->u.bl->nrparams); ! 204: j = strlen(sym->name) + 2*(sym->u.bl->nrparams); ! 205: j -= (sym->u.bl->nrparams != 0); ! 206: } ! 207: if (i) ! 208: fprintf(stderr, "\n"); ! 209: } ! 210: ! 211: showsym(sym) ! 212: Symbol *sym; ! 213: { register int i, j, last; ! 214: register struct AR *tmp; ! 215: ! 216: switch (sym->type) { ! 217: case VARIABLE: ! 218: fprintf(stderr, "%s = %d\n", sym->name, sym->u.val); ! 219: break; ! 220: case AUTO: ! 221: fprintf(stderr, "%s = fct arg %d\n", sym->name, sym->u.val); ! 222: break; ! 223: case ARRAY: ! 224: tmp = sym->u.ar; ! 225: fprintf(stderr, "%s[%d]\n", sym->name, tmp->sz); ! 226: fprintf(stderr, "\t%2d\t%5d\n", 0, last = tmp->base[0]); ! 227: for (j = 0, i = 1; i < tmp->sz; i++) ! 228: { if (last != tmp->base[i]) ! 229: { if (i > j+1) ! 230: { if (i > j+2) ! 231: fprintf(stderr, "\t...\t ...\n"); ! 232: fprintf(stderr, "\t%2d\t%5d\n", i-1, last); ! 233: } ! 234: fprintf(stderr, "\t%2d\t%5d\n", i, tmp->base[i]); ! 235: last = tmp->base[j=i]; ! 236: } ! 237: } ! 238: if (i > j+1) ! 239: { if (i > j+2) fprintf(stderr, "\t...\t ...\n"); ! 240: fprintf(stderr, "\t%2d\t%5d\n", i-1, last); ! 241: } ! 242: break; ! 243: case FCT: ! 244: fprintf(stderr, "%s", sym->name); ! 245: fakeparams(sym->u.fu->nrparams); ! 246: i = strlen(sym->name) + 2*(sym->u.fu->nrparams); ! 247: i -= (sym->u.bl->nrparams != 0); ! 248: fprintf(stderr, ": "); spaces(15-i); ! 249: fprintf(stderr, "user defined function\n"); ! 250: break; ! 251: case BLTN: ! 252: fprintf(stderr, "%s", sym->name); ! 253: fakeparams(sym->u.bl->nrparams); ! 254: i = strlen(sym->name) + 2*(sym->u.bl->nrparams); ! 255: i -= (sym->u.bl->nrparams != 0); ! 256: fprintf(stderr, ": "); spaces(15-i); ! 257: fprintf(stderr, "builtin function\n"); ! 258: break; ! 259: case NAME: ! 260: fprintf(stderr, "%s", sym->name); ! 261: i = strlen(sym->name); ! 262: fprintf(stderr, ": "); spaces(17-i); ! 263: fprintf(stderr, "name\n"); ! 264: break; ! 265: default: ! 266: fprintf(stderr, "%s", sym->name); ! 267: i = strlen(sym->name); ! 268: fprintf(stderr, ": "); spaces(17-i); ! 269: fprintf(stderr, "unknown type (%d)\n", sym->type); ! 270: break; ! 271: } ! 272: } ! 273: ! 274: showvars() ! 275: { register Symbol *sym; ! 276: ! 277: for (sym = symlist; sym != lastkey; sym = sym->next) ! 278: if (sym->type == VARIABLE || sym->type == AUTO) ! 279: showsym(sym); ! 280: for (sym = symlist; sym != lastkey; sym = sym->next) ! 281: if (sym->type == ARRAY) ! 282: showsym(sym); ! 283: for (sym = symlist; sym != lastkey; sym = sym->next) ! 284: switch (sym->type) ! 285: { default: showsym(sym); ! 286: case AUTO: case VARIABLE: case ARRAY: break; ! 287: } ! 288: } ! 289: ! 290: sympurge() ! 291: { Symbol *sym, *last = (Symbol *) 0; ! 292: extern char nesting; ! 293: ! 294: for (sym = symlist; sym != lastkey; ) ! 295: { if (sym->type == VARIABLE || sym->type == ARRAY) ! 296: { if (sym->depth >= nesting && sym->depth > 0) ! 297: { sym = remove(sym, last); ! 298: continue; ! 299: } ! 300: } else ! 301: if (sym->type == AUTO && nesting == 1) ! 302: { sym = remove(sym, last); ! 303: continue; ! 304: } ! 305: last = sym; ! 306: sym = sym->next; ! 307: } ! 308: } ! 309: ! 310: Symbol * ! 311: remove(s, l) ! 312: Symbol *s, *l; ! 313: { ! 314: if (s == symlist) ! 315: { symlist = s->next; ! 316: return symlist; ! 317: } else ! 318: { l->next = s->next; ! 319: return l->next; ! 320: } ! 321: } ! 322: ! 323: Symbol * ! 324: lookup(s) ! 325: char *s; ! 326: { Symbol *sym; ! 327: Symbol *zym; ! 328: int found = -1; ! 329: ! 330: for (sym = symlist; sym != (Symbol *) 0; sym = sym->next) ! 331: if (strcmp(sym->name, s) == 0 && sym->depth >= found) ! 332: { found = sym->depth; ! 333: zym = sym; ! 334: } ! 335: if (found != -1) ! 336: return zym; ! 337: ! 338: if (strcmp(s, "old") == 0 || strcmp(s, "new") == 0) ! 339: yyerror("cannot redefine %s", s); ! 340: ! 341: return install(s, NAME, 0); ! 342: } ! 343: ! 344: Symbol * ! 345: whichcmd(s) ! 346: char *s; ! 347: { Symbol *sym; ! 348: ! 349: for (sym = comlist; sym != (Symbol *) 0; sym = sym->next) ! 350: if (strcmp(sym->name, s) == 0) ! 351: return sym; ! 352: return lookup(s); ! 353: } ! 354: ! 355: Symbol * ! 356: newsym(s) ! 357: char *s; ! 358: { Symbol *tmp; ! 359: ! 360: tmp = (Symbol *) Emalloc(sizeof(Symbol)); ! 361: tmp->name = Emalloc(strlen(s)+1); ! 362: strcpy(tmp->name, s); ! 363: ! 364: return tmp; /* not linked in list */ ! 365: } ! 366: ! 367: Symbol * ! 368: install(s, t, v) ! 369: char *s; ! 370: { Symbol *sp; ! 371: extern char nesting; ! 372: ! 373: sp = (Symbol *) Emalloc(sizeof(Symbol)); ! 374: sp->name = Emalloc(strlen(s)+1); ! 375: strcpy(sp->name, s); ! 376: sp->type = t; /* NAME, VAR or keyword */ ! 377: sp->depth = nesting; ! 378: sp->u.val = v; ! 379: sp->next = symlist; ! 380: symlist = sp; ! 381: ! 382: return sp; ! 383: } ! 384: ! 385: Symbol * ! 386: newbltin(s, v, p) ! 387: char *s; ! 388: int (*v)(); ! 389: { Symbol *sp; ! 390: extern char nesting; ! 391: ! 392: sp = (Symbol *) Emalloc(sizeof(Symbol)); ! 393: sp->name = Emalloc(strlen(s)+1); ! 394: strcpy(sp->name, s); ! 395: sp->type = BLTN; ! 396: sp->depth = nesting; ! 397: sp->u.bl = (struct BL *) Emalloc(sizeof(struct BL)); ! 398: sp->u.bl->faddr = v; ! 399: sp->u.bl->nrparams = p; ! 400: sp->u.bl->usednew = 0; ! 401: sp->next = symlist; ! 402: symlist = sp; ! 403: ! 404: return sp; ! 405: } ! 406: ! 407: newcom(s, t) ! 408: char *s; ! 409: { Symbol *sp; ! 410: ! 411: sp = (Symbol *) Emalloc(sizeof(Symbol)); ! 412: sp->name = Emalloc(strlen(s)+1); ! 413: strcpy(sp->name, s); ! 414: sp->type = t; /* only commands */ ! 415: sp->next = comlist; ! 416: comlist = sp; ! 417: } ! 418: ! 419: decarray(s, d) ! 420: Symbol *s; ! 421: long d; ! 422: { register int i; ! 423: extern char nesting, isglobal; ! 424: ! 425: if (s->type == ARRAY) ! 426: { if (s->depth == nesting || (s->depth == 0 && isglobal)) ! 427: { fprintf(stderr, "warning: array %s re-declared\n", s->name); ! 428: if (isglobal) s->depth = 0; ! 429: if (s->u.ar->sz != d) ! 430: { free(s->u.ar->base); ! 431: goto newa; ! 432: } else goto olda; ! 433: } else if (s->depth < nesting) ! 434: { decarray(install(s->name, NAME, 0), d); ! 435: return; ! 436: } ! 437: } else ! 438: s->type = ARRAY; ! 439: ! 440: s->depth = (isglobal)?0:nesting; ! 441: s->u.ar = (struct AR *) Emalloc(sizeof(struct AR)); ! 442: newa: s->u.ar->sz = d; ! 443: s->u.ar->base = (long *) Emalloc(d * sizeof(long)); ! 444: olda: for (i = 0; i < d; i++) ! 445: s->u.ar->base[i] = 0; ! 446: } ! 447: ! 448: decsame(t, s, d) ! 449: short t; ! 450: Symbol *s; ! 451: long d; ! 452: { extern char nesting, isglobal; ! 453: ! 454: if (s->type == t) ! 455: { if (s->depth == nesting || (s->depth == 0 && isglobal)) ! 456: { fprintf(stderr, "warning: variable %s re-declared\n", s->name); ! 457: if (isglobal) s->depth = 0; ! 458: s->u.val = d; ! 459: } else if (s->depth < nesting) ! 460: install(s->name, t, d); ! 461: ! 462: return; ! 463: } ! 464: ! 465: s->type = t; ! 466: s->depth = (isglobal)?0:nesting; ! 467: s->u.val = d; ! 468: } ! 469: ! 470: decvar(s, d) ! 471: Symbol *s; ! 472: long d; ! 473: { ! 474: decsame(VARIABLE, s, d); ! 475: } ! 476: ! 477: automa(s, d) ! 478: Symbol *s; ! 479: long d; ! 480: { ! 481: decsame(AUTO, s, d); ! 482: } ! 483: ! 484: char *thisfun; ! 485: ! 486: prefunct(s, nrp) ! 487: Symbol *s; ! 488: { extern char *progr; ! 489: ! 490: if (s->type != FCT) ! 491: { s->type = FCT; ! 492: s->u.fu = (struct FU *) Emalloc(sizeof(struct FU)); ! 493: } else ! 494: { fprintf(stderr, "function %s redefined\n", s->name); ! 495: if (s->u.fu->usednew != -1) free(s->u.fu->fct); ! 496: } ! 497: s->u.fu->fct = progr; ! 498: thisfun = s->name; ! 499: s->u.fu->usednew = -1; ! 500: s->u.fu->nrparams = nrp; ! 501: } ! 502: ! 503: notrecurcall(s) ! 504: Symbol *s; ! 505: { ! 506: return strcmp(s->name, thisfun); ! 507: } ! 508: ! 509: notafunc() ! 510: { ! 511: extern char nesting; ! 512: return (nesting == 0 && thisfun == NULL); ! 513: } ! 514: ! 515: postfunct(s) ! 516: Symbol *s; ! 517: { extern char nesting, usednew, usedold, *progr; ! 518: ! 519: progr = (char *) Emalloc(NPROG * sizeof(char)); ! 520: thisfun = '\0'; ! 521: s->depth = nesting; ! 522: s->u.fu->usednew = usednew; ! 523: s->u.fu->usedold = usedold; ! 524: } ! 525: ! 526: #include "pico2.h" ! 527: ! 528: Node *mapred(n) ! 529: Node *n; ! 530: { return new(CCALL, new(ACOMMA, AREG(IREG), n, Z), Z, redcmap); ! 531: } ! 532: ! 533: Node *mapgrn(n) ! 534: Node *n; ! 535: { return new(CCALL, new(ACOMMA, AREG(IREG), n, Z), Z, grncmap); ! 536: } ! 537: ! 538: Node *mapblu(n) ! 539: Node *n; ! 540: { return new(CCALL, new(ACOMMA, AREG(IREG), n, Z), Z, blucmap); ! 541: } ! 542: ! 543: Node * ! 544: mapall(n) ! 545: Node *n; ! 546: { ! 547: if (n->type == COMP) ! 548: return new(CCALL, new(ACOMMA, AREG(IREG), n, Z), Z, setcmap); ! 549: else ! 550: return new(CCALL, new(ACOMMA, AREG(IREG), n, Z), Z, setzmap); ! 551: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.