xref: /csrg-svn/lib/libc/mips/gen/nlist.c (revision 26572)
121349Sdist /*
221349Sdist  * Copyright (c) 1980 Regents of the University of California.
321349Sdist  * All rights reserved.  The Berkeley software License Agreement
421349Sdist  * specifies the terms and conditions for redistribution.
521349Sdist  */
616668Sralph 
7*26572Sdonn #if defined(LIBC_SCCS) && !defined(lint)
8*26572Sdonn static char sccsid[] = "@(#)nlist.c	5.2 (Berkeley) 03/09/86";
9*26572Sdonn #endif LIBC_SCCS and not lint
1021349Sdist 
111972Swnj #include <sys/types.h>
121972Swnj #include <a.out.h>
131972Swnj #include <stdio.h>
141972Swnj 
151972Swnj /*
161972Swnj  * nlist - retreive attributes from name list (string table version)
171972Swnj  */
181972Swnj nlist(name, list)
191972Swnj 	char *name;
201972Swnj 	struct nlist *list;
211972Swnj {
221972Swnj 	register struct nlist *p, *q;
2316668Sralph 	register char *s1, *s2;
2416668Sralph 	register n, m;
2516668Sralph 	int maxlen, nreq;
261972Swnj 	FILE *f;
2716668Sralph 	FILE *sf;
281972Swnj 	off_t sa;		/* symbol address */
291972Swnj 	off_t ss;		/* start of strings */
301972Swnj 	struct exec buf;
311972Swnj 	struct nlist space[BUFSIZ/sizeof (struct nlist)];
321972Swnj 
331972Swnj 	maxlen = 0;
341972Swnj 	for (q = list, nreq = 0; q->n_un.n_name && q->n_un.n_name[0]; q++, nreq++) {
351972Swnj 		q->n_type = 0;
361972Swnj 		q->n_value = 0;
371972Swnj 		q->n_desc = 0;
381972Swnj 		q->n_other = 0;
3916668Sralph 		n = strlen(q->n_un.n_name);
4016668Sralph 		if (n > maxlen)
4116668Sralph 			maxlen = n;
421972Swnj 	}
431972Swnj 	f = fopen(name, "r");
441972Swnj 	if (f == NULL)
4517852Sralph 		return (-1);
461972Swnj 	fread((char *)&buf, sizeof buf, 1, f);
471972Swnj 	if (N_BADMAG(buf)) {
4815261Sralph 		fclose(f);
491972Swnj 		return (-1);
501972Swnj 	}
5116668Sralph 	sf = fopen(name, "r");
5216668Sralph 	if (sf == NULL) {
5316668Sralph 		/* ??? */
5416668Sralph 		fclose(f);
5516668Sralph 		return(-1);
5616668Sralph 	}
571972Swnj 	sa = N_SYMOFF(buf);
581972Swnj 	ss = sa + buf.a_syms;
591972Swnj 	n = buf.a_syms;
6016668Sralph 	fseek(f, sa, 0);
611972Swnj 	while (n) {
621972Swnj 		m = sizeof (space);
631972Swnj 		if (n < m)
641972Swnj 			m = n;
6516668Sralph 		if (fread((char *)space, m, 1, f) != 1)
6616668Sralph 			break;
671972Swnj 		n -= m;
681972Swnj 		for (q = space; (m -= sizeof(struct nlist)) >= 0; q++) {
691972Swnj 			char nambuf[BUFSIZ];
701972Swnj 
711972Swnj 			if (q->n_un.n_strx == 0 || q->n_type & N_STAB)
721972Swnj 				continue;
7316668Sralph 			fseek(sf, ss+q->n_un.n_strx, 0);
7416668Sralph 			fread(nambuf, maxlen+1, 1, sf);
7510085Ssam 			for (p = list; p->n_un.n_name && p->n_un.n_name[0]; p++) {
7616668Sralph 				s1 = p->n_un.n_name;
7716668Sralph 				s2 = nambuf;
7816668Sralph 				while (*s1) {
7916668Sralph 					if (*s1++ != *s2++)
801972Swnj 						goto cont;
811972Swnj 				}
8216668Sralph 				if (*s2)
831972Swnj 					goto cont;
841972Swnj 				p->n_value = q->n_value;
851972Swnj 				p->n_type = q->n_type;
861972Swnj 				p->n_desc = q->n_desc;
871972Swnj 				p->n_other = q->n_other;
881972Swnj 				if (--nreq == 0)
891972Swnj 					goto alldone;
901972Swnj 				break;
911972Swnj 		cont:		;
921972Swnj 			}
931972Swnj 		}
941972Swnj 	}
951972Swnj alldone:
961972Swnj 	fclose(f);
9716668Sralph 	fclose(sf);
9816672Sralph 	return (nreq);
991972Swnj }
100