1: /*
   2:  * Copyright (c) 1980 Regents of the University of California.
   3:  * All rights reserved.  The Berkeley software License Agreement
   4:  * specifies the terms and conditions for redistribution.
   5:  */
   6: 
   7: #if defined(LIBC_SCCS) && !defined(lint)
   8: static char sccsid[] = "@(#)nlist.c	5.2 (Berkeley) 3/9/86";
   9: #endif LIBC_SCCS and not lint
  10: 
  11: #include <sys/types.h>
  12: #include <a.out.h>
  13: #include <stdio.h>
  14: 
  15: /*
  16:  * nlist - retreive attributes from name list (string table version)
  17:  */
  18: nlist(name, list)
  19:     char *name;
  20:     struct nlist *list;
  21: {
  22:     register struct nlist *p, *q;
  23:     register char *s1, *s2;
  24:     register n, m;
  25:     int maxlen, nreq;
  26:     FILE *f;
  27:     FILE *sf;
  28:     off_t sa;       /* symbol address */
  29:     off_t ss;       /* start of strings */
  30:     struct exec buf;
  31:     struct nlist space[BUFSIZ/sizeof (struct nlist)];
  32: 
  33:     maxlen = 0;
  34:     for (q = list, nreq = 0; q->n_un.n_name && q->n_un.n_name[0]; q++, nreq++) {
  35:         q->n_type = 0;
  36:         q->n_value = 0;
  37:         q->n_desc = 0;
  38:         q->n_other = 0;
  39:         n = strlen(q->n_un.n_name);
  40:         if (n > maxlen)
  41:             maxlen = n;
  42:     }
  43:     f = fopen(name, "r");
  44:     if (f == NULL)
  45:         return (-1);
  46:     fread((char *)&buf, sizeof buf, 1, f);
  47:     if (N_BADMAG(buf)) {
  48:         fclose(f);
  49:         return (-1);
  50:     }
  51:     sf = fopen(name, "r");
  52:     if (sf == NULL) {
  53:         /* ??? */
  54:         fclose(f);
  55:         return(-1);
  56:     }
  57:     sa = N_SYMOFF(buf);
  58:     ss = sa + buf.a_syms;
  59:     n = buf.a_syms;
  60:     fseek(f, sa, 0);
  61:     while (n) {
  62:         m = sizeof (space);
  63:         if (n < m)
  64:             m = n;
  65:         if (fread((char *)space, m, 1, f) != 1)
  66:             break;
  67:         n -= m;
  68:         for (q = space; (m -= sizeof(struct nlist)) >= 0; q++) {
  69:             char nambuf[BUFSIZ];
  70: 
  71:             if (q->n_un.n_strx == 0 || q->n_type & N_STAB)
  72:                 continue;
  73:             fseek(sf, ss+q->n_un.n_strx, 0);
  74:             fread(nambuf, maxlen+1, 1, sf);
  75:             for (p = list; p->n_un.n_name && p->n_un.n_name[0]; p++) {
  76:                 s1 = p->n_un.n_name;
  77:                 s2 = nambuf;
  78:                 while (*s1) {
  79:                     if (*s1++ != *s2++)
  80:                         goto cont;
  81:                 }
  82:                 if (*s2)
  83:                     goto cont;
  84:                 p->n_value = q->n_value;
  85:                 p->n_type = q->n_type;
  86:                 p->n_desc = q->n_desc;
  87:                 p->n_other = q->n_other;
  88:                 if (--nreq == 0)
  89:                     goto alldone;
  90:                 break;
  91:         cont:       ;
  92:             }
  93:         }
  94:     }
  95: alldone:
  96:     fclose(f);
  97:     fclose(sf);
  98:     return (nreq);
  99: }

Defined functions

nlist defined in line 18; used 40 times

Defined variables

sccsid defined in line 8; never used
Last modified: 1986-03-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 652
Valid CSS Valid XHTML 1.0 Strict