Annotation of researchv9/jtools/src/Jpic/symtab.c, revision 1.1

1.1     ! root        1: #include       <stdio.h>
        !             2: #include       <ctype.h>
        !             3: #include       "pic.h"
        !             4: #include       "y.tab.h"
        !             5: extern char    *tostring();
        !             6: 
        !             7: getvar(s)      /* return value of variable s */
        !             8: char *s;
        !             9: {
        !            10:        struct symtab *p;
        !            11: 
        !            12:        p = lookup(s);
        !            13:        if (p == NULL) {
        !            14:                if (islower(s[0]))
        !            15:                        yyerror("no such variable as %s", s);
        !            16:                else
        !            17:                        yyerror("no such place as %s", s);
        !            18:                return(0);
        !            19:        }
        !            20:        return(p->s_val);
        !            21: }
        !            22: 
        !            23: struct symtab *makevar(s, t, v)        /* make variable named s in table */
        !            24: char *s;                       /* assumes s is static or from tostring */
        !            25: int t;
        !            26: int v;
        !            27: {
        !            28:        int i;
        !            29:        struct symtab *p;
        !            30: 
        !            31:        for (p = stack[nstack].p_symtab; p != NULL; p = p->s_next)
        !            32:                if (strcmp(s, p->s_name) == 0)
        !            33:                        break;
        !            34:        if (p == NULL) {        /* it's a new one */
        !            35:                p = (struct symtab *) malloc(sizeof(struct symtab));
        !            36:                if (p == NULL) {
        !            37:                        yyerror("out of symtab space with %s", s);
        !            38:                        exit(1);
        !            39:                }
        !            40:                p->s_next = stack[nstack].p_symtab;
        !            41:                stack[nstack].p_symtab = p;     /* stick it at front */
        !            42:        }
        !            43:        p->s_name = s;
        !            44:        p->s_type = t;
        !            45:        p->s_val = v;
        !            46:        return(p);
        !            47: }
        !            48: 
        !            49: struct symtab *lookup(s)       /* find s in symtab */
        !            50: char *s;
        !            51: {
        !            52:        int i;
        !            53:        struct symtab *p;
        !            54: 
        !            55:        for (i = nstack; i >= 0; i--)   /* look in each active symtab */
        !            56:                for (p = stack[i].p_symtab; p != NULL; p = p->s_next)
        !            57:                        if (strcmp(s, p->s_name) == 0)
        !            58:                                return(p);
        !            59:        return(NULL);
        !            60: }
        !            61: 
        !            62: freesymtab(p)  /* free space used by symtab at p */
        !            63: struct symtab *p;
        !            64: {
        !            65:        for ( ; p != NULL; p = p->s_next) {
        !            66:                free(p->s_name);        /* assumes done with tostring */
        !            67:                free(p);
        !            68:        }
        !            69: }

unix.superglobalmegacorp.com

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