Research V7 development
[unix-history] / usr / src / libc / gen / nlist.c
CommitLineData
74bfa9a8
DR
1#include <a.out.h>
2int a_magic[] = {A_MAGIC1, A_MAGIC2, A_MAGIC3, A_MAGIC4, 0};
3#define SPACE 100 /* number of symbols read at a time */
4
5nlist(name, list)
6char *name;
7struct nlist *list;
8{
9 register struct nlist *p, *q;
10 int f, n, m, i;
11 long sa;
12 struct exec buf;
13 struct nlist space[SPACE];
14
15 for(p = list; p->n_name[0]; p++) {
16 p->n_type = 0;
17 p->n_value = 0;
18 }
19 f = open(name, 0);
20 if(f < 0)
21 return(-1);
22 read(f, (char *)&buf, sizeof buf);
23 for(i=0; a_magic[i]; i++)
24 if(a_magic[i] == buf.a_magic) break;
25 if(a_magic[i] == 0){
26 close(f);
27 return(-1);
28 }
29 sa = buf.a_text + (long)buf.a_data;
30 if(buf.a_flag != 1) sa *= 2;
31 sa += sizeof buf;
32 lseek(f, sa, 0);
33 n = buf.a_syms;
34
35 while(n){
36 m = sizeof space;
37 if(n < sizeof space)
38 m = n;
39 read(f, (char *)space, m);
40 n -= m;
41 for(q = space; (m -= sizeof(struct nlist)) >= 0; q++) {
42 for(p = list; p->n_name[0]; p++) {
43 for(i=0;i<8;i++)
44 if(p->n_name[i] != q->n_name[i]) goto cont;
45 p->n_value = q->n_value;
46 p->n_type = q->n_type;
47 break;
48 cont: ;
49 }
50 }
51 }
52 close(f);
53 return(0);
54}