Annotation of coherent/b/kernel/tools/coffnlist.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Get entries from coff nlist.
        !             3:  */
        !             4: #include <stdio.h>
        !             5: #include <coff.h>
        !             6: 
        !             7: /*
        !             8:  * Symbol name.
        !             9:  */
        !            10: static char *
        !            11: symName(sym, str_tab, work)
        !            12: SYMENT *sym;
        !            13: char *str_tab, *work;
        !            14: {
        !            15:        if (!sym->n_zeroes)
        !            16:                return (str_tab + sym->n_offset - 4);
        !            17: 
        !            18:        /* make sure it's zero terminated */
        !            19:        memcpy(work, sym->n_name, SYMNMLEN);
        !            20:        work[SYMNMLEN] = '\0';
        !            21:        return (work);
        !            22: }
        !            23: 
        !            24: coffnlist(fn, nlp, names, count)
        !            25: char *fn;      /* file name */
        !            26: SYMENT *nlp;   /* names to look up */
        !            27: char *names;   /* long names */
        !            28: int count;     /* size of passed table */
        !            29: {
        !            30:        FILEHDR head;
        !            31:        FILE *fp;
        !            32:        char *str_tab;
        !            33:        long str_length;
        !            34:        int aux, i;
        !            35: 
        !            36:        if (NULL == (fp = fopen(fn, "rb")))
        !            37:                return(0);
        !            38: 
        !            39:        if (1 != fread(&head, sizeof(head), 1, fp) ||
        !            40:            head.f_magic != C_386_MAGIC) {
        !            41:                fclose (fp);
        !            42:                return (0);
        !            43:        }
        !            44: 
        !            45:        fseek(fp, head.f_symptr + (SYMESZ * head.f_nsyms), 0);
        !            46:        if (1 != fread(&str_length, sizeof(str_length), 1, fp))
        !            47:                str_length = 0;
        !            48:        if (str_length) {
        !            49:                unsigned len;
        !            50: 
        !            51:                len = str_length -= 4;
        !            52:                if (len != str_length || NULL == (str_tab = malloc(len))) {
        !            53:                        fclose (fp);
        !            54:                        return (0);
        !            55:                }
        !            56: 
        !            57:                if (1 != fread(str_tab, len, 1, fp)) {
        !            58:                        free(str_tab);
        !            59:                        fclose (fp);
        !            60:                        return (0);
        !            61:                }
        !            62:        }
        !            63: 
        !            64:        fseek(fp, head.f_symptr, 0);
        !            65:        for (i = aux = 0; i < head.f_nsyms; i++) {
        !            66:                SYMENT sym;     /* symbol read in */
        !            67:                int taux, j;
        !            68: 
        !            69:                if (1 != fread(&sym, SYMESZ, 1, fp)) {
        !            70:                        free(str_tab);
        !            71:                        fclose (fp);
        !            72:                        return (0);
        !            73:                }
        !            74:                if (aux) {
        !            75:                        aux--;
        !            76:                        continue;
        !            77:                }
        !            78:                aux = sym.n_numaux;
        !            79:                for (j = taux = 0; j < count; j++) {
        !            80:                        static char n1[SYMNMLEN + 1], n2[SYMNMLEN + 1];
        !            81:                        register SYMENT *np;
        !            82: 
        !            83:                        if (taux) {
        !            84:                                taux--;
        !            85:                                continue;
        !            86:                        }
        !            87:                        np = nlp + j;
        !            88:                        taux = np->n_numaux;
        !            89:                        if (np->n_type != 0xFFFF ||
        !            90:                            strcmp(symName(np, names, n1),
        !            91:                                   symName(&sym, str_tab, n2)))
        !            92:                                continue;
        !            93:                        np->n_value  = sym.n_value;
        !            94:                        np->n_scnum  = sym.n_scnum;
        !            95:                        np->n_type   = sym.n_type;
        !            96:                        np->n_sclass = sym.n_sclass;
        !            97:                }
        !            98:        }
        !            99:        free(str_tab);
        !           100:        fclose (fp);
        !           101:        return (1);
        !           102: }
        !           103: 
        !           104: #ifdef TEST
        !           105: main()
        !           106: {
        !           107:        static SYMENT sym[3];
        !           108:        static char ptr[] = "a_very_long_name";
        !           109: 
        !           110:        strcpy(sym[0]._n._n_name, "x");
        !           111:        sym[0].n_type = -1;
        !           112: 
        !           113:        strcpy(sym[1]._n._n_name, "y");
        !           114:        sym[1].n_type = -1;
        !           115: 
        !           116:        sym[2]._n._n_n._n_zeroes = 0;
        !           117:        sym[2]._n._n_n._n_offset = sizeof(long);
        !           118:        sym[2].n_type = -1;
        !           119: 
        !           120:        coffnlist("tx.o", sym, ptr, 3);
        !           121: }
        !           122: #endif

unix.superglobalmegacorp.com

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