Annotation of researchv10no/cmd/pico/sym.c, revision 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.