Annotation of researchv10no/cmd/pico/sym.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.