Annotation of researchv10no/cmd/PDP11/11nm.c, revision 1.1.1.1

1.1       root        1: /*
                      2: **     print symbol tables for PDP11-format
                      3: **     object or character archive files
                      4: **
                      5: **     nm [-goprun] [name ...]
                      6: */
                      7: 
                      8: 
                      9: 
                     10: #include       "ar.h"          /*god: char archives*/
                     11: #include       "a.out.h"       /*god: pdp11 a.out fmt */
                     12: #include       <stdio.h>
                     13: #include       <ctype.h>
                     14: #ifndef A_DOT_OUT              /*god*/
                     15: #define A_DOT_OUT "a.out"
                     16: #endif
                     17: #define        BADMAG(x) x!=A_MAGIC1 && x!=A_MAGIC2 && x!=A_MAGIC3 && x!=A_MAGIC4
                     18: #define        SELECT  arch_flg ? arp.ar_name : *argv
                     19: int    numsort_flg;
                     20: int    undef_flg;
                     21: int    revsort_flg = 1;
                     22: int    globl_flg;
                     23: int    nosort_flg;
                     24: int    arch_flg;
                     25: int    prep_flg;
                     26: struct ar_hdr  arp;
                     27: long   arsize;
                     28: struct exec    exp;
                     29: FILE   *fi;
                     30: long   off;
                     31: long   atol();
                     32: long   ftell();
                     33: char   *malloc();
                     34: char   *realloc();
                     35: 
                     36: char   *progname;      /*god: for error messages, hold name here*/
                     37: 
                     38: main(argc, argv)
                     39: char **argv;
                     40: {
                     41:        int narg;
                     42:        int  compare();
                     43:        union {
                     44:                char    a[SARMAG+1];
                     45:                short   i;      /*god*/
                     46:        } magbuf;
                     47:        int didone;
                     48: 
                     49:        didone=0;
                     50: 
                     51:        progname = argv[0];     /*god*/
                     52: 
                     53:        if (--argc>0 && argv[1][0]=='-' && argv[1][1]!=0) {
                     54:                argv++;
                     55:                while (*++*argv) switch (**argv) {
                     56:                case 'n':               /* sort numerically */
                     57:                        numsort_flg++;
                     58:                        continue;
                     59: 
                     60:                case 'g':               /* globl symbols only */
                     61:                        globl_flg++;
                     62:                        continue;
                     63: 
                     64:                case 'u':               /* undefined symbols only */
                     65:                        undef_flg++;
                     66:                        continue;
                     67: 
                     68:                case 'r':               /* sort in reverse order */
                     69:                        revsort_flg = -1;
                     70:                        continue;
                     71: 
                     72:                case 'p':               /* don't sort -- symbol table order */
                     73:                        nosort_flg++;
                     74:                        continue;
                     75: 
                     76:                case 'o':               /* prepend a name to each line */
                     77:                        prep_flg++;
                     78:                        continue;
                     79: 
                     80:                default:                /* oops */
                     81:                        fprintf(stderr, "%s: invalid argument -%c\n",
                     82:                                        progname, *argv[0]);
                     83:                        exit(1);
                     84:                }
                     85:                argc--;
                     86:        }
                     87:        if (argc == 0) {
                     88:                argc = 1;
                     89:                argv[1] = A_DOT_OUT;
                     90:        }
                     91:        narg = argc;
                     92:        while(argc--) {
                     93:                fi = fopen(*++argv,"r");
                     94:                if (fi == NULL) {
                     95:                        fprintf(stderr, "%s: cannot open %s\n",
                     96:                                        progname, *argv);
                     97:                        continue;
                     98:                }
                     99:                off = SARMAG;
                    100:                fread((char *)&magbuf, 1, sizeof(magbuf), fi);  /* get magic no. */
                    101:                if (strncmp(magbuf.a, ARMAG, SARMAG)==0)
                    102:                        arch_flg++;
                    103:                else if (BADMAG(magbuf.i)) {
                    104:                        fprintf(stderr, "%s: %s-- bad format\n",
                    105:                                        progname, *argv);
                    106:                        continue;
                    107:                }
                    108:                fseek(fi, 0L, 0);
                    109:                if (arch_flg) {
                    110:                        nextel(fi);
                    111:                        if (narg > 1)
                    112:                                printf("\n%s:\n", *argv);
                    113:                }
                    114:                do {
                    115:                        long o;
                    116:                        register i, n, c;
                    117:                        struct nlist *symp = NULL;
                    118:                        struct nlist sym;
                    119: 
                    120:                        fread((char *)&exp, 1, sizeof(struct exec), fi);
                    121:                        if (BADMAG(exp.a_magic)) {              /* archive element not in  */
                    122:                                continue;       /* proper format - skip it */
                    123:                        }
                    124:                        o = (long)exp.a_text + exp.a_data;
                    125:                        if ((exp.a_flag & 01) == 0)
                    126:                                o *= 2;
                    127:                        fseek(fi, o, 1);
                    128:                        n = exp.a_syms / sizeof(struct nlist);
                    129:                        if (n == 0) {
                    130:                                fprintf(stderr, "%s: %s-- no name list\n",
                    131:                                                progname, SELECT);
                    132:                                continue;
                    133:                        }
                    134:                        i = 0;
                    135:                        while (--n >= 0) {
                    136:                                fread((char *)&sym, 1, sizeof(sym), fi);
                    137:                                if (globl_flg && (sym.n_type&N_EXT)==0)
                    138:                                        continue;
                    139:                                switch (sym.n_type&N_TYPE) {
                    140: 
                    141:                                case N_UNDF:
                    142:                                        c = 'u';
                    143:                                        if (sym.n_value)
                    144:                                                c = 'c';
                    145:                                        break;
                    146: 
                    147:                                default:
                    148:                                case N_ABS:
                    149:                                        c = 'a';
                    150:                                        break;
                    151: 
                    152:                                case N_TEXT:
                    153:                                        c = 't';
                    154:                                        break;
                    155: 
                    156:                                case N_DATA:
                    157:                                        c = 'd';
                    158:                                        break;
                    159: 
                    160:                                case N_BSS:
                    161:                                        c = 'b';
                    162:                                        break;
                    163: 
                    164:                                case N_FN:
                    165:                                        c = 'f';
                    166:                                        break;
                    167: 
                    168:                                case N_REG:
                    169:                                        c = 'r';
                    170:                                        break;
                    171:                                }
                    172:                                didone=1;
                    173:                                if (undef_flg && c!='u')
                    174:                                        continue;
                    175:                                if (sym.n_type&N_EXT)
                    176:                                        c = toupper(c);
                    177:                                sym.n_type = c;
                    178:                                if (symp==NULL)
                    179:                                        symp = (struct nlist *)malloc(sizeof(struct nlist));
                    180:                                else {
                    181:                                        symp = (struct nlist *)realloc(symp, (i+1)*sizeof(struct nlist));
                    182:                                }
                    183:                                if (symp == NULL) {
                    184:                                        fprintf(stderr,
                    185:                                                "%s: out of memory on %s\n",
                    186:                                                progname, *argv);
                    187:                                        exit(2);
                    188:                                }
                    189:                                symp[i++] = sym;
                    190:                        }
                    191:                        if (nosort_flg==0)
                    192:                                qsort(symp, i, sizeof(struct nlist), compare);
                    193:                        if ((arch_flg || narg>1) && prep_flg==0)
                    194:                                printf("\n%s:\n", SELECT);
                    195:                        for (n=0; n<i; n++) {
                    196:                                if (prep_flg) {
                    197:                                        if (arch_flg)
                    198:                                                printf("%s:", *argv);
                    199:                                        printf("%s:", SELECT);
                    200:                                }
                    201:                                c = symp[n].n_type;
                    202:                                if (!undef_flg) {
                    203:                                        if (c=='u' || c=='U')
                    204:                                                printf("      ");
                    205:                                        else
                    206:                                                printf(FORMAT, symp[n].n_value);
                    207:                                        printf(" %c ", c);
                    208:                                }
                    209:                                printf("%.8s\n", symp[n].n_name);
                    210:                        }
                    211:                        if (symp)
                    212:                                free((char *)symp);
                    213:                } while(arch_flg && nextel(fi));
                    214:                fclose(fi);
                    215:        }
                    216:        exit(!didone);
                    217: }
                    218: 
                    219: compare(p1, p2)
                    220: struct nlist *p1, *p2;
                    221: {
                    222:        register i;
                    223: 
                    224:        if (numsort_flg) {
                    225:                if (p1->n_value > p2->n_value)
                    226:                        return(revsort_flg);
                    227:                if (p1->n_value < p2->n_value)
                    228:                        return(-revsort_flg);
                    229:        }
                    230:        for(i=0; i<sizeof(p1->n_name); i++)
                    231:                if (p1->n_name[i] != p2->n_name[i]) {
                    232:                        if (p1->n_name[i] > p2->n_name[i])
                    233:                                return(revsort_flg);
                    234:                        else
                    235:                                return(-revsort_flg);
                    236:                }
                    237:        return(0);
                    238: }
                    239: 
                    240: nextel(af)
                    241: FILE *af;
                    242: {
                    243:        register char *cp;
                    244:        register r;
                    245: 
                    246:        fseek(af, off, 0);
                    247:        r = fread((char *)&arp, 1, sizeof(struct ar_hdr), af);  /* read archive header */
                    248:        if (r != sizeof(struct ar_hdr))
                    249:                return(0);
                    250:        for (cp = arp.ar_name; cp < &arp.ar_name[sizeof(arp.ar_name)]; cp++)
                    251:                if (*cp == ' ')
                    252:                        *cp = '\0';
                    253:        arsize = atol(arp.ar_size);
                    254:        if (arsize & 1)
                    255:                ++arsize;
                    256:        off = ftell(af) + arsize;       /* offset to next element */
                    257:        return(1);
                    258: }

unix.superglobalmegacorp.com

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