Annotation of researchv8dc/cmd/cyntax/cem/table.c, revision 1.1

1.1     ! root        1: #include       "cem.h"
        !             2: #define        STD_OBJ 1
        !             3: #include       "stdobj.h"
        !             4: #include       "symbol.h"
        !             5: #include       "type.h"
        !             6: 
        !             7: /*
        !             8:  *     Type table routines.
        !             9:  */
        !            10: 
        !            11: extern char    *strchr();
        !            12: 
        !            13: /*
        !            14:  *     Comparison routines.  "Identical type" equivalence.
        !            15:  *     We believe file modtimes unless we are told to doubt.
        !            16:  */
        !            17: 
        !            18: static int
        !            19: cmp_enum(p, q)
        !            20: type   *p;
        !            21: type   *q;
        !            22: {
        !            23:        register e_data *e;
        !            24:        register e_data *f;
        !            25:        register e_elt  *g;
        !            26:        register e_elt  *h;
        !            27:        register int    i;
        !            28: 
        !            29:        e = p->d.e;
        !            30:        f = q->d.e;
        !            31: 
        !            32:        if (modtimes && e->e_line == f->e_line && match_times(e->e_file, f->e_file))
        !            33:                return 0;
        !            34: 
        !            35:        if (e->e_name != f->e_name)
        !            36:        {
        !            37:                if (e->e_name == NULL)
        !            38:                        return -f->e_name->sy_index;
        !            39:                else if (f->e_name == NULL)
        !            40:                        return e->e_name->sy_index;
        !            41:                else
        !            42:                        return e->e_name->sy_index - f->e_name->sy_index;
        !            43:        }
        !            44: 
        !            45:        if ((i = e->e_low - f->e_low) != 0 || (i = e->e_high - f->e_high) != 0)
        !            46:                return i;
        !            47: 
        !            48:        g = e->e_list;
        !            49:        h = f->e_list;
        !            50: 
        !            51:        while (g != NULL)
        !            52:        {
        !            53:                if (h == NULL)
        !            54:                        return -1;
        !            55: 
        !            56:                if (g->e_name != h->e_name)
        !            57:                        return g->e_name->sy_index - h->e_name->sy_index;
        !            58: 
        !            59:                if ((i = g->e_value - h->e_value) != 0)
        !            60:                        return i;
        !            61: 
        !            62:                g = g->e_next;
        !            63:                h = h->e_next;
        !            64:        }
        !            65: 
        !            66:        if (h != NULL)
        !            67:                return 1;
        !            68: 
        !            69:        return 0;
        !            70: }
        !            71: 
        !            72: static int
        !            73: cmp_struct(p, q)
        !            74: type   *p;
        !            75: type   *q;
        !            76: {
        !            77:        register s_data *e;
        !            78:        register s_data *f;
        !            79:        register s_elt  *g;
        !            80:        register s_elt  *h;
        !            81:        register int    i;
        !            82: 
        !            83:        e = p->d.s;
        !            84:        f = q->d.s;
        !            85: 
        !            86:        if (modtimes && e->s_line == f->s_line && match_times(e->s_file, f->s_file))
        !            87:                return 0;
        !            88: 
        !            89:        if (e->s_name != f->s_name)
        !            90:        {
        !            91:                if (e->s_name == NULL)
        !            92:                        return -f->s_name->sy_index;
        !            93:                else if (f->s_name == NULL)
        !            94:                        return e->s_name->sy_index;
        !            95:                else
        !            96:                        return e->s_name->sy_index - f->s_name->sy_index;
        !            97:        }
        !            98: 
        !            99:        if ((i = e->s_size - f->s_size) != 0)
        !           100:                return i;
        !           101: 
        !           102:        g = e->s_list;
        !           103:        h = f->s_list;
        !           104: 
        !           105:        while (g != NULL)
        !           106:        {
        !           107:                if (h == NULL)
        !           108:                        return -1;
        !           109: 
        !           110:                if (g->s_name != h->s_name)
        !           111:                        return g->s_name->sy_index - h->s_name->sy_index;
        !           112: 
        !           113:                if (g->s_type != h->s_type)
        !           114:                        return g->s_type->t_index - h->s_type->t_index;
        !           115: 
        !           116:                g = g->s_next;
        !           117:                h = h->s_next;
        !           118:        }
        !           119: 
        !           120:        if (h != NULL)
        !           121:                return 1;
        !           122: 
        !           123:        return 0;
        !           124: }
        !           125: 
        !           126: static int
        !           127: cmp_union(p, q)
        !           128: type   *p;
        !           129: type   *q;
        !           130: {
        !           131:        register u_data *e;
        !           132:        register u_data *f;
        !           133:        register u_elt  *g;
        !           134:        register u_elt  *h;
        !           135:        register int    i;
        !           136: 
        !           137:        e = p->d.u;
        !           138:        f = q->d.u;
        !           139: 
        !           140:        if (modtimes && e->u_line == f->u_line && match_times(e->u_file, f->u_file))
        !           141:                return 0;
        !           142: 
        !           143:        if (e->u_name != f->u_name)
        !           144:        {
        !           145:                if (e->u_name == NULL)
        !           146:                        return -f->u_name->sy_index;
        !           147:                else if (f->u_name == NULL)
        !           148:                        return e->u_name->sy_index;
        !           149:                else
        !           150:                        return e->u_name->sy_index - f->u_name->sy_index;
        !           151:        }
        !           152: 
        !           153:        if ((i = e->u_size - f->u_size) != 0)
        !           154:                return i;
        !           155: 
        !           156:        g = e->u_list;
        !           157:        h = f->u_list;
        !           158: 
        !           159:        while (g != NULL)
        !           160:        {
        !           161:                if (h == NULL)
        !           162:                        return -1;
        !           163: 
        !           164:                if (g->u_name != h->u_name)
        !           165:                        return g->u_name->sy_index - h->u_name->sy_index;
        !           166: 
        !           167:                if (g->u_type != h->u_type)
        !           168:                        return g->u_type->t_index - h->u_type->t_index;
        !           169: 
        !           170:                g = g->u_next;
        !           171:                h = h->u_next;
        !           172:        }
        !           173: 
        !           174:        if (h != NULL)
        !           175:                return 1;
        !           176: 
        !           177:        return 0;
        !           178: }
        !           179: 
        !           180: /*
        !           181:  *     We win a lot by trusting the file/modtime linenumber
        !           182:  *     of a struct/unions declaration.
        !           183:  */
        !           184: #define        THASHSZ 37
        !           185: #define        TPRIME0 7
        !           186: #define        TPRIME1 31
        !           187: 
        !           188: /*
        !           189:  *     Type hashing by filename/modtime and line number.
        !           190:  */
        !           191: static type    *
        !           192: type_hash(h0, h1, t)
        !           193: long   h0;
        !           194: long   h1;
        !           195: type   *t;
        !           196: {
        !           197:        typedef struct thash    thash;
        !           198: 
        !           199:        struct thash
        !           200:        {
        !           201:                long    h0;
        !           202:                long    h1;
        !           203:                type    *t;
        !           204:                thash   *next;
        !           205:        };
        !           206: 
        !           207:        register long   i;
        !           208:        register thash  *p;
        !           209:        static thash    *thasht[THASHSZ];
        !           210: 
        !           211:        i = TPRIME0 * h0 + TPRIME1 * h1;
        !           212: 
        !           213:        if (i < 0)
        !           214:                i = -i;
        !           215: 
        !           216:        i %= THASHSZ;
        !           217: 
        !           218:        for (p = thasht[i]; p != NULL; p = p->next)
        !           219:        {
        !           220:                if (p->h0 == h0 && p->h1 == h1)
        !           221:                        return p->t;
        !           222: 
        !           223:        }
        !           224: 
        !           225:        if (t == NULL)
        !           226:                return NULL;
        !           227: 
        !           228:        p = talloc(thash);
        !           229:        p->h0 = h0;
        !           230:        p->h1 = h1;
        !           231:        p->t = t;
        !           232:        p->next = thasht[i];
        !           233:        thasht[i] = p;
        !           234:        return t;
        !           235: }
        !           236: 
        !           237: /*
        !           238:  *     Lookup a type hashing by filename/modtime and line number.
        !           239:  */
        !           240: type   *
        !           241: lookup_hash(s, l)
        !           242: symbol *s;
        !           243: long   l;
        !           244: {
        !           245:        if (modtimes && strchr(s->sy_name, TIME_SEP) != NULL)
        !           246:                return type_hash(s->sy_index, l, (type *)NULL);
        !           247:        else
        !           248:                return NULL;
        !           249: }
        !           250: 
        !           251: /*
        !           252:  *     Enter a type hashing by filename/modtime and line number.
        !           253:  */
        !           254: void
        !           255: enter_hash(s, l, t)
        !           256: symbol *s;
        !           257: long   l;
        !           258: type   *t;
        !           259: {
        !           260:        if (modtimes && strchr(s->sy_name, TIME_SEP) != NULL)
        !           261:                type_hash(s->sy_index, l, t);
        !           262: }
        !           263: 
        !           264: /*
        !           265:  *     Type table manager.  Pass it a type and it will return you the
        !           266:  *     (strongly) equivalent type that characterises it.  i.e. it
        !           267:  *     'interns' a type.  Type comparison is then pointer comparison.
        !           268:  */
        !           269: type   *
        !           270: find_type(t)
        !           271: register type  *t;
        !           272: {
        !           273:        typedef struct ttnode   ttnode;
        !           274: 
        !           275:        struct ttnode
        !           276:        {
        !           277:                type    *tt_type;
        !           278:                ttnode  *tt_left;
        !           279:                ttnode  *tt_right;
        !           280:        };
        !           281: 
        !           282:        register type   *p;
        !           283:        register type   *q;
        !           284:        register int    i;
        !           285:        register ttnode **n;
        !           286:        register ttnode *tt;
        !           287: 
        !           288:        static ttnode   *type_table[(int)t_types];
        !           289: 
        !           290:        n = &type_table[(int)t->t_type];
        !           291: 
        !           292:        while (*n != NULL)
        !           293:        {
        !           294:                p = t;
        !           295:                q = (*n)->tt_type;
        !           296: 
        !           297:                if ((i = ((int)p->t_type) - ((int)q->t_type)) == 0)
        !           298:                {
        !           299:                        switch (p->t_type)
        !           300:                        {
        !           301:                        case t_arrayof:
        !           302:                                if ((i = p->d.dim - q->d.dim) == 0)
        !           303:                                        i = p->t_subtype->t_index - q->t_subtype->t_index;
        !           304: 
        !           305:                                break;
        !           306: 
        !           307:                        case t_basetype:
        !           308:                                i = p->d.mask - q->d.mask;
        !           309:                                break;
        !           310: 
        !           311:                        case t_bitfield:
        !           312:                                if ((i = p->d.size - q->d.size) == 0)
        !           313:                                        i = p->t_subtype->t_index - q->t_subtype->t_index;
        !           314: 
        !           315:                                break;
        !           316: 
        !           317:                        case t_dimless:
        !           318:                        case t_ftnreturning:
        !           319:                        case t_ptrto:
        !           320:                                i = p->t_subtype->t_index - q->t_subtype->t_index;
        !           321:                                break;
        !           322: 
        !           323:                        case t_enum:
        !           324:                                i = cmp_enum(p, q);
        !           325:                                break;
        !           326: 
        !           327:                        case t_structof:
        !           328:                                i = cmp_struct(p, q);
        !           329:                                break;
        !           330: 
        !           331:                        case t_unionof:
        !           332:                                i = cmp_union(p, q);
        !           333:                                break;
        !           334: 
        !           335:                        default:
        !           336:                                fprintf(stderr, "%s: find_type - bad type\n", my_name);
        !           337:                                exit(1);
        !           338:                        }
        !           339: 
        !           340:                        if (i == 0)
        !           341:                        {
        !           342:                                delete_type(t);
        !           343:                                return (*n)->tt_type;
        !           344:                        }
        !           345:                }
        !           346: 
        !           347:                n = i < 0 ? &((*n)->tt_left) : &((*n)->tt_right);
        !           348:        }
        !           349: 
        !           350:        switch (t->t_type)
        !           351:        {
        !           352:        case t_structof:
        !           353:                enter_hash(t->d.s->s_file, t->d.s->s_line, t);
        !           354:                break;
        !           355: 
        !           356:        case t_unionof:
        !           357:                enter_hash(t->d.u->u_file, t->d.u->u_line, t);
        !           358:        }
        !           359: 
        !           360:        tt = talloc(ttnode);
        !           361:        *n = tt;
        !           362:        tt->tt_type = t;
        !           363:        tt->tt_left = NULL;
        !           364:        tt->tt_right = NULL;
        !           365:        t->t_index = new_type_index++;
        !           366:        return t;
        !           367: }

unix.superglobalmegacorp.com

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