|
|
1.1 root 1: /*
2: * Get entries from name list.
3: */
4:
5: #include <stdio.h>
6: #include <l.out.h>
7: #include <canon.h>
8:
9: nlist(fn, nlp)
10: char *fn;
11: struct nlist *nlp;
12: {
13: register struct nlist *np;
14: register int ntodo = 0;
15: struct FILE *lfp;
16: struct ldheader lh;
17: struct ldsym ste;
18: fsize_t symsize;
19: register int n;
20:
21: for (np = nlp; np->n_name[0] != '\0'; np++) {
22: np->n_type = np->n_value = 0;
23: ntodo++;
24: }
25: if ((lfp = fopen(fn, "r")) == NULL)
26: return;
27: n = fread(&lh, sizeof lh, 1, lfp);
28: canint(lh.l_magic);
29: if (n!=1 || lh.l_magic!=L_MAGIC) {
30: fclose(lfp);
31: return;
32: }
33: for (n=0; n<=L_SYM; n++)
34: cansize(lh.l_ssize[n]);
35: symsize = sizeof lh + lh.l_ssize[L_SHRI] + lh.l_ssize[L_SHRD]
36: + lh.l_ssize[L_PRVI] + lh.l_ssize[L_PRVD] + lh.l_ssize[L_DEBUG];
37: fseek(lfp, symsize, 0);
38: symsize = lh.l_ssize[L_SYM];
39: for ( ; symsize>0 && ntodo; symsize -= sizeof ste) {
40: if (fread(&ste, sizeof ste, 1, lfp) != 1)
41: break;
42: for (np = nlp; np->n_name[0] != '\0'; np++)
43: if (strncmp(np->n_name, ste.ls_id, NCPLN) == 0) {
44: canint(ste.ls_type);
45: canvaddr(ste.ls_addr);
46: np->n_type = ste.ls_type;
47: np->n_value = ste.ls_addr;
48: if (--ntodo == 0)
49: break;
50: }
51: }
52: fclose(lfp);
53: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.