delete extraneous definitions
[unix-history] / usr / src / lib / libc / gen / nlist.c
CommitLineData
78e0b1de 1/* @(#)nlist.c 4.7 (Berkeley) %G% */
329a2d40 2
8fb9f90e 3#include <sys/types.h>
8fb9f90e
BJ
4#include <a.out.h>
5#include <stdio.h>
6
7/*
8 * nlist - retreive attributes from name list (string table version)
9 */
10nlist(name, list)
11 char *name;
12 struct nlist *list;
13{
14 register struct nlist *p, *q;
329a2d40
RC
15 register char *s1, *s2;
16 register n, m;
17 int maxlen, nreq;
8fb9f90e 18 FILE *f;
329a2d40 19 FILE *sf;
8fb9f90e
BJ
20 off_t sa; /* symbol address */
21 off_t ss; /* start of strings */
22 struct exec buf;
23 struct nlist space[BUFSIZ/sizeof (struct nlist)];
8fb9f90e
BJ
24
25 maxlen = 0;
26 for (q = list, nreq = 0; q->n_un.n_name && q->n_un.n_name[0]; q++, nreq++) {
27 q->n_type = 0;
28 q->n_value = 0;
29 q->n_desc = 0;
30 q->n_other = 0;
329a2d40
RC
31 n = strlen(q->n_un.n_name);
32 if (n > maxlen)
33 maxlen = n;
8fb9f90e
BJ
34 }
35 f = fopen(name, "r");
36 if (f == NULL)
78e0b1de 37 return (-1);
8fb9f90e
BJ
38 fread((char *)&buf, sizeof buf, 1, f);
39 if (N_BADMAG(buf)) {
8623fcd2 40 fclose(f);
8fb9f90e
BJ
41 return (-1);
42 }
329a2d40
RC
43 sf = fopen(name, "r");
44 if (sf == NULL) {
45 /* ??? */
46 fclose(f);
47 return(-1);
48 }
8fb9f90e
BJ
49 sa = N_SYMOFF(buf);
50 ss = sa + buf.a_syms;
51 n = buf.a_syms;
329a2d40 52 fseek(f, sa, 0);
8fb9f90e
BJ
53 while (n) {
54 m = sizeof (space);
55 if (n < m)
56 m = n;
329a2d40
RC
57 if (fread((char *)space, m, 1, f) != 1)
58 break;
8fb9f90e
BJ
59 n -= m;
60 for (q = space; (m -= sizeof(struct nlist)) >= 0; q++) {
61 char nambuf[BUFSIZ];
62
63 if (q->n_un.n_strx == 0 || q->n_type & N_STAB)
64 continue;
329a2d40
RC
65 fseek(sf, ss+q->n_un.n_strx, 0);
66 fread(nambuf, maxlen+1, 1, sf);
883840c4 67 for (p = list; p->n_un.n_name && p->n_un.n_name[0]; p++) {
329a2d40
RC
68 s1 = p->n_un.n_name;
69 s2 = nambuf;
70 while (*s1) {
71 if (*s1++ != *s2++)
8fb9f90e 72 goto cont;
8fb9f90e 73 }
329a2d40 74 if (*s2)
8fb9f90e
BJ
75 goto cont;
76 p->n_value = q->n_value;
77 p->n_type = q->n_type;
78 p->n_desc = q->n_desc;
79 p->n_other = q->n_other;
80 if (--nreq == 0)
81 goto alldone;
82 break;
83 cont: ;
84 }
85 }
86 }
87alldone:
88 fclose(f);
329a2d40 89 fclose(sf);
303c6723 90 return (nreq);
8fb9f90e 91}