Annotation of researchv10no/cmd/picasso/symtab.c, revision 1.1.1.1

1.1       root        1: /*     Copyright (c) 1988 AT&T */
                      2: /*       All Rights Reserved   */
                      3: 
                      4: /*     THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T     */
                      5: /*     The copyright notice above does not evidence any        */
                      6: /*     actual or intended publication of such source code.     */
                      7: 
                      8: /*     @(#)picasso:symtab.c    1.0     */
                      9: #include       <ctype.h>
                     10: #include       "picasso.h"
                     11: #include       "y.tab.h"
                     12: 
                     13: YYSTYPE getvar(s)      /* return value of variable s (usually pointer) */
                     14:        char *s;
                     15: {
                     16:        struct symtab *p;
                     17:        static YYSTYPE bug;
                     18: 
                     19:        p = lookup(s);
                     20:        if (p == NULL) {
                     21:                if (islower(s[0]))
                     22:                        yyerror("no such variable as %s", s);
                     23:                else
                     24:                        yyerror("no such place as %s", s);
                     25:                return(bug);
                     26:        }
                     27:        if (s != p->s_name) free(s);
                     28:        return(p->s_val);
                     29: }
                     30: 
                     31: double getsub(s, n)
                     32:        char    *s;
                     33:        int     n;
                     34: {
                     35:        struct  symtab  *p;
                     36: 
                     37:        p = lookup(s);
                     38:        if (p == NULL)
                     39:                fatal("array %s not declared", s);
                     40:        else if (n > p->s_dim)
                     41:                fatal("variable %s has dimension %d < %d", s, p->s_dim, n);
                     42:        else if (p->s_dim == 0)
                     43:                return p->s_val.f;
                     44:        else
                     45:                return p->s_val.a[n-1];
                     46: }
                     47: 
                     48: double setvar(s, n, v)
                     49:        char    *s;
                     50:        int     n;
                     51:        double  v;
                     52: {
                     53:        struct  symtab  *p;
                     54: 
                     55:        p = lookup(s);
                     56:        if (p == NULL)
                     57:                fatal("array %s not declared", s);
                     58:        else if (n > p->s_dim)
                     59:                fatal("variable %s has dimension %d < %d", s, p->s_dim, n);
                     60:        else if (p->s_dim == 0)
                     61:                p->s_val.f = v;
                     62:        else
                     63:                p->s_val.a[n-1] = v;
                     64:        if (s != p->s_name) free(s);
                     65:        return v;
                     66: }
                     67: 
                     68: double setsize(s, v)   /* kludge: textsize = v implies textspace = v * r */
                     69:        char    *s;
                     70:        double  v;
                     71: {
                     72:        double  r;
                     73:        struct  symtab  *p, *q;
                     74: 
                     75:        p = lookup(s);
                     76:        q = lookup("textspace");
                     77:        r = q->s_val.f/p->s_val.f;
                     78:        q->s_val.f = v * r;
                     79:        p->s_val.f = v;
                     80:        return v;
                     81: }
                     82: 
                     83: struct symtab *newvar(s, t)    /* allocate variable with name s, type t */
                     84:        char *s;                /* assumes s derives from a tostring     */ 
                     85:        int t;
                     86: {
                     87:        struct symtab *p;
                     88: 
                     89:        p = (struct symtab *) malloc(sizeof(struct symtab));
                     90:        if (p == NULL) {
                     91:                yyerror("out of symtab space with %s", s);
                     92:                exit(1);
                     93:        }
                     94:        p->s_name = s;
                     95:        p->s_type = t;
                     96:        p->s_dim  = 0;
                     97:        p->s_next = stack[nstack].p_symtab;
                     98:        stack[nstack].p_symtab = p;             /* stick it at front */
                     99:        return(p);
                    100: }
                    101: 
                    102: struct symtab *findvar(s, t)   /* make variable named s in table       */
                    103:        char *s;                /* will reuse local or global symbol    */
                    104: {
                    105:        struct symtab *p;
                    106: 
                    107:        if ((p = lookup(s)) == NULL)
                    108:                p = newvar(s, t);
                    109:        if (s != p->s_name) free(s);
                    110:        return(p);
                    111: }
                    112: 
                    113: double setarray(s)
                    114:        char    *s;
                    115: {
                    116:        struct  symtab  *p;
                    117: 
                    118:        p = findvar (s, VARNAME);
                    119:        if (p->s_dim < nexpr-1) {       /* existing array is too short */
                    120:                if (p->s_dim > 0)
                    121:                        free (p->s_val.a);
                    122:        }
                    123:        if ((p->s_dim = nexpr-1) > 0) {
                    124:                p->s_val.a = (float *)malloc((unsigned)nexpr * sizeof(float));
                    125:                if (p->s_val.a == NULL)
                    126:                        fatal("out of array space with %s", p->s_name);
                    127:        }
                    128:        if (p->s_dim == 0)
                    129:                p->s_val.f = exprlist[0];
                    130:        else
                    131:                memcpy ((char *)p->s_val.a, (char *)exprlist,
                    132:                                                nexpr * sizeof(float));
                    133:        nexpr = 0;
                    134:        return exprlist[0];
                    135: }
                    136: 
                    137: double getfval(s)      /* return float value of variable s */
                    138:        char *s;
                    139: {
                    140:        struct  symtab  *p;
                    141: 
                    142:        if ((p = lookup(s)) == NULL) {
                    143:                yyerror("%s undefined", s);
                    144:                return 0.;
                    145:        }
                    146:        else if (p->s_dim == 0)
                    147:                return p->s_val.f;
                    148:        else                                    /* should probably place all */
                    149:                return (double)*p->s_val.a;     /* array values in exprlist. */
                    150: }
                    151: 
                    152: setfval(s, f)  /* set variable s to f */
                    153:        char *s;
                    154:        double f;
                    155: {
                    156:        struct symtab *p;
                    157: 
                    158:        if ((p = lookup(s)) == NULL)
                    159:                p = newvar(s, VARNAME);
                    160:        if (p->s_dim == 0)
                    161:                p->s_val.f = f;
                    162:        else
                    163:                *p->s_val.a = f;
                    164: }
                    165: 
                    166: struct symtab *makevar(s, t, v)        /* make variable named s in table       */
                    167:        char    *s;             /* assumes s is static or from tostring */
                    168:        int     t;              /* if s is already defined as an array, */
                    169:        valtype v;              /* only its first element is set.       */
                    170: {
                    171:        struct symtab *p;
                    172:        obj *o;
                    173: 
                    174:        for (p = stack[nstack].p_symtab; p != NULL; p = p->s_next)
                    175:                if (strcmp(s, p->s_name) == 0)
                    176:                        break;
                    177:        if (p == NULL)
                    178:                p = newvar(s, t);
                    179: #if 1
                    180:        /* seems like a PLACENAME should always point to an object */
                    181:        if (t == PLACENAME) {
                    182:                for (o = objhead; o->o_next != objtail; o = o->o_next)
                    183:                        if (o == v.o)
                    184:                                break;
                    185:                v.o = o;
                    186:        }
                    187: #endif
                    188:        if (p->s_dim == 0)
                    189:                p->s_val  = v;
                    190:        else
                    191:                *p->s_val.a = v.f;
                    192:        if (s != p->s_name) free(s);
                    193:        return(p);
                    194: }
                    195: 
                    196: struct symtab *lookup(s)       /* find s in symtab */
                    197:        char *s;
                    198: {
                    199:        int i;
                    200:        struct symtab *p;
                    201: 
                    202:        for (i = nstack; i >= 0; i--)   /* look in each active symtab */
                    203:                for (p = stack[i].p_symtab; p != NULL; p = p->s_next)
                    204:                        if (strcmp(s, p->s_name) == 0)
                    205:                                return(p);
                    206:        return(NULL);
                    207: }
                    208: 
                    209: freesymtab(p)  /* free space used by symtab at p */
                    210:        struct symtab *p;
                    211: {
                    212:        struct symtab *q;
                    213: 
                    214:        for ( ; p != NULL; p = q) {
                    215:                q = p->s_next;
                    216:                free(p->s_name);        /* assumes done with tostring */
                    217:                if (p->s_dim)
                    218:                        free(p->s_val.a);
                    219:                free(p);
                    220:        }
                    221: }
                    222: 
                    223: freedef(s)     /* free definition for string s */
                    224:        char *s;
                    225: {
                    226:        struct symtab *p, *q, *op;
                    227: 
                    228:        for (p = op = q = stack[nstack].p_symtab; p != NULL; p = p->s_next) {
                    229:                if (strcmp(s, p->s_name) == 0) {        /* got it */
                    230:                        if (p->s_type != DEFNAME)
                    231:                                break;
                    232:                        if (p == op)    /* 1st elem */
                    233:                                stack[nstack].p_symtab = p->s_next;
                    234:                        else
                    235:                                q->s_next = p->s_next;
                    236:                        free(p->s_name);
                    237:                        free(p->s_val.p);
                    238:                        free(p);
                    239:                        return;
                    240:                }
                    241:                q = p;
                    242:        }
                    243:        yyerror("%s is not defined at this point", s);
                    244: }
                    245: 
                    246: static int     i, M;
                    247: 
                    248: first_xy (xsym, ysym, xp, yp)
                    249:        struct  symtab  *xsym, *ysym;
                    250:        double  *xp, *yp;
                    251: {
                    252:        if ((M = xsym->s_dim) == 0)
                    253:                *xp = xsym->s_val.f;
                    254:        else
                    255:                *xp = xsym->s_val.a[0];
                    256:        if (ysym->s_dim == 0)
                    257:                *yp = ysym->s_val.f;
                    258:        else
                    259:                *yp = ysym->s_val.a[0];
                    260:        if (ysym->s_dim > M)
                    261:                M = ysym->s_dim;
                    262:        i = 0;
                    263: }
                    264: 
                    265: next_xy (xsym, ysym, xp, yp)
                    266:        struct  symtab  *xsym, *ysym;
                    267:        double  *xp, *yp;
                    268: {
                    269:        if (++i > M)
                    270:                return 0;
                    271:        if (xsym->s_dim == 0)
                    272:                *xp = xsym->s_val.f;
                    273:        else
                    274:                *xp = xsym->s_val.a[i % (xsym->s_dim+1)];
                    275:        if (ysym->s_dim == 0)
                    276:                *yp = ysym->s_val.f;
                    277:        else
                    278:                *yp = ysym->s_val.a[i % (ysym->s_dim+1)];
                    279:        return 1;
                    280: }

unix.superglobalmegacorp.com

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