BSD 3 development
[unix-history] / usr / src / libc / gen / nlist.c
#include <a.out.h>
int a_magic[] = {A_MAGIC1, A_MAGIC2, A_MAGIC3, A_MAGIC4, 0};
#define SPACE 100 /* number of symbols read at a time */
nlist(name, list)
char *name;
struct nlist *list;
{
register struct nlist *p, *q;
register int f, n, m, i, nreq;
long sa;
struct exec buf;
struct nlist space[SPACE];
for(p = list, nreq = 0; p->n_name[0]; p++, nreq++) {
p->n_type = 0;
p->n_value = 0;
}
f = open(name, 0);
if(f < 0)
return(-1);
read(f, (char *)&buf, sizeof buf);
for(i=0; a_magic[i]; i++)
if(a_magic[i] == buf.a_magic) break;
if(a_magic[i] == 0){
close(f);
return(-1);
}
sa = buf.a_text + (long)buf.a_data;
sa += buf.a_trsize + buf.a_drsize;
sa += sizeof buf;
lseek(f, sa, 0);
n = buf.a_syms;
while(n){
m = sizeof space;
if(n < sizeof space)
m = n;
read(f, (char *)space, m);
n -= m;
for(q = space; (m -= sizeof(struct nlist)) >= 0; q++) {
for(p = list; p->n_name[0]; p++) {
for(i=0;i<8;i++)
if(p->n_name[i] != q->n_name[i]) goto cont;
p->n_value = q->n_value;
p->n_type = q->n_type;
if(--nreq == 0)
goto alldone;
break;
cont: ;
}
}
}
alldone:
close(f);
return(0);
}