xref: /csrg-svn/lib/libc/mips/gen/nlist.c (revision 16672)
1*16672Sralph /* @(#)nlist.c	4.6 (Berkeley) 07/06/84 */
216668Sralph 
31972Swnj #include <sys/types.h>
41972Swnj #include <a.out.h>
51972Swnj #include <stdio.h>
61972Swnj 
71972Swnj /*
81972Swnj  * nlist - retreive attributes from name list (string table version)
91972Swnj  */
101972Swnj nlist(name, list)
111972Swnj 	char *name;
121972Swnj 	struct nlist *list;
131972Swnj {
141972Swnj 	register struct nlist *p, *q;
1516668Sralph 	register char *s1, *s2;
1616668Sralph 	register n, m;
1716668Sralph 	int maxlen, nreq;
181972Swnj 	FILE *f;
1916668Sralph 	FILE *sf;
201972Swnj 	off_t sa;		/* symbol address */
211972Swnj 	off_t ss;		/* start of strings */
221972Swnj 	struct exec buf;
231972Swnj 	struct nlist space[BUFSIZ/sizeof (struct nlist)];
241972Swnj 
251972Swnj 	maxlen = 0;
261972Swnj 	for (q = list, nreq = 0; q->n_un.n_name && q->n_un.n_name[0]; q++, nreq++) {
271972Swnj 		q->n_type = 0;
281972Swnj 		q->n_value = 0;
291972Swnj 		q->n_desc = 0;
301972Swnj 		q->n_other = 0;
3116668Sralph 		n = strlen(q->n_un.n_name);
3216668Sralph 		if (n > maxlen)
3316668Sralph 			maxlen = n;
341972Swnj 	}
351972Swnj 	f = fopen(name, "r");
361972Swnj 	if (f == NULL)
371972Swnj 		return (NULL);
381972Swnj 	fread((char *)&buf, sizeof buf, 1, f);
391972Swnj 	if (N_BADMAG(buf)) {
4015261Sralph 		fclose(f);
411972Swnj 		return (-1);
421972Swnj 	}
4316668Sralph 	sf = fopen(name, "r");
4416668Sralph 	if (sf == NULL) {
4516668Sralph 		/* ??? */
4616668Sralph 		fclose(f);
4716668Sralph 		return(-1);
4816668Sralph 	}
491972Swnj 	sa = N_SYMOFF(buf);
501972Swnj 	ss = sa + buf.a_syms;
511972Swnj 	n = buf.a_syms;
5216668Sralph 	fseek(f, sa, 0);
531972Swnj 	while (n) {
541972Swnj 		m = sizeof (space);
551972Swnj 		if (n < m)
561972Swnj 			m = n;
5716668Sralph 		if (fread((char *)space, m, 1, f) != 1)
5816668Sralph 			break;
591972Swnj 		n -= m;
601972Swnj 		for (q = space; (m -= sizeof(struct nlist)) >= 0; q++) {
611972Swnj 			char nambuf[BUFSIZ];
621972Swnj 
631972Swnj 			if (q->n_un.n_strx == 0 || q->n_type & N_STAB)
641972Swnj 				continue;
6516668Sralph 			fseek(sf, ss+q->n_un.n_strx, 0);
6616668Sralph 			fread(nambuf, maxlen+1, 1, sf);
6710085Ssam 			for (p = list; p->n_un.n_name && p->n_un.n_name[0]; p++) {
6816668Sralph 				s1 = p->n_un.n_name;
6916668Sralph 				s2 = nambuf;
7016668Sralph 				while (*s1) {
7116668Sralph 					if (*s1++ != *s2++)
721972Swnj 						goto cont;
731972Swnj 				}
7416668Sralph 				if (*s2)
751972Swnj 					goto cont;
761972Swnj 				p->n_value = q->n_value;
771972Swnj 				p->n_type = q->n_type;
781972Swnj 				p->n_desc = q->n_desc;
791972Swnj 				p->n_other = q->n_other;
801972Swnj 				if (--nreq == 0)
811972Swnj 					goto alldone;
821972Swnj 				break;
831972Swnj 		cont:		;
841972Swnj 			}
851972Swnj 		}
861972Swnj 	}
871972Swnj alldone:
881972Swnj 	fclose(f);
8916668Sralph 	fclose(sf);
90*16672Sralph 	return (nreq);
911972Swnj }
92