Annotation of researchv10no/cmd/adb/g/syminit.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * init the symbol table
        !             3:  */
        !             4: 
        !             5: #include "defs.h"
        !             6: #include "sym.h"
        !             7: #include "a.out.h"
        !             8: #include <sys/types.h>
        !             9: 
        !            10: #define        NSYMS   300
        !            11: #define        BIGBUF  (4*4096)
        !            12: 
        !            13: extern struct sym *symtab;
        !            14: 
        !            15: syminit(h)
        !            16: struct exec *h;
        !            17: {
        !            18:        register Sym *q;
        !            19:        register n, m;
        !            20:        Sym space[BIGBUF/sizeof(Sym)];
        !            21:        struct sym *sbuf;
        !            22:        register struct sym *cur;
        !            23:        struct sym *curgbl;
        !            24:        register int type, ltype;
        !            25:        off_t off;
        !            26:        char *malloc();
        !            27:        char *savename();
        !            28: 
        !            29:        symtab = NULL;
        !            30:        if (h->a_syms == 0)
        !            31:                return;         /* stripped */
        !            32:        off = h->a_text + h->a_data;
        !            33: #if NOTDEF
        !            34:        if ((h->a_flag & 01) == 0)
        !            35:                off += off;     /* space for reloc data */
        !            36: #endif
        !            37:        lseek(fsym, off + sizeof(*h), 0);
        !            38:        curgbl = sbuf = cur = NULL;
        !            39:        for (n = h->a_syms; n > 0 ;) {
        !            40:                m = read(fsym, (char *)space, min(n, sizeof(space)));
        !            41:                if (m <= 0)
        !            42:                        break;
        !            43:                n -= m;
        !            44:                for (q = space; m > 0; q++, m-= sizeof(space[0])) {
        !            45:                        switch (q->type) {
        !            46:                        case 'T':
        !            47:                        case 't':
        !            48:                                type = S_TEXT;
        !            49:                                break;
        !            50: 
        !            51:                        case 'D':
        !            52:                        case 'd':
        !            53:                        case 'B':
        !            54:                        case 'b':
        !            55:                                type = S_DATA;
        !            56:                                break;
        !            57: 
        !            58:                        default:
        !            59:                                continue;
        !            60:                        }
        !            61:                        if (sbuf == NULL || ++cur >= sbuf + NSYMS) {
        !            62:                                if ((sbuf = (struct sym *)malloc(sizeof(struct sym) * NSYMS)) == NULL) {
        !            63:                                        printf("out of mem for syms\n");
        !            64:                                        return;
        !            65:                                }
        !            66:                                cur = sbuf;
        !            67:                        }
        !            68:                        cur->y_type = type;
        !            69:                        cur->y_ltype = ltype;
        !            70:                        cur->y_value = q->value;
        !            71:                        cur->y_name = savename(q->name, sizeof(q->name));
        !            72:                        cur->y_locals = NULL;
        !            73:                        if (cur->y_type == S_TEXT && q->name[0] == '~') {
        !            74:                                cur->y_next = curgbl;
        !            75:                                curgbl = cur;
        !            76:                        }
        !            77:                        else if (cur->y_type == S_STAB) {
        !            78:                                if (curgbl == NULL)
        !            79:                                        continue;
        !            80:                                cur->y_next = curgbl->y_locals;
        !            81:                                curgbl->y_locals = cur;
        !            82:                        }
        !            83:                        else {
        !            84:                                cur->y_next = symtab;
        !            85:                                symtab = cur;
        !            86:                        }
        !            87:                }
        !            88:        }
        !            89:        for (; curgbl; curgbl = curgbl->y_next) {
        !            90:                if (curgbl->y_locals == NULL)
        !            91:                        continue;
        !            92:                for (cur = symtab; cur; cur = cur->y_next) {
        !            93:                        if (cur->y_type != S_TEXT)
        !            94:                                continue;
        !            95:                        if (cur->y_value == curgbl->y_value) {
        !            96:                                cur->y_locals = curgbl->y_locals;
        !            97:                                break;
        !            98:                        }
        !            99:                }
        !           100:        }
        !           101: }
        !           102: 
        !           103: static char *
        !           104: savename(n, sz)
        !           105: char *n;
        !           106: register int sz;
        !           107: {
        !           108:        char *p;
        !           109:        char *malloc();
        !           110: 
        !           111:        if ((p = malloc(sz+1)) == NULL)
        !           112:                return ("");
        !           113:        strncpy(p, n, sz);
        !           114:        p[sz] = 0;
        !           115:        return (p);
        !           116: }
        !           117: 
        !           118: eqsym(sp, n)
        !           119: struct sym *sp;
        !           120: char *n;
        !           121: {
        !           122: 
        !           123:        return (strncmp(sp->y_name, n, NNAME) == 0);
        !           124: }
        !           125: 
        !           126: min(a, b)
        !           127: {
        !           128:        if (a < b)
        !           129:                return (a);
        !           130:        else
        !           131:                return (b);
        !           132: }

unix.superglobalmegacorp.com

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