home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / libc / gen / nlist.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  1.0 KB  |  55 lines

  1. #include <a.out.h>
  2. int a_magic[] = {A_MAGIC1, A_MAGIC2, A_MAGIC3, A_MAGIC4, 0};
  3. #define SPACE 100        /* number of symbols read at a time */
  4.  
  5. nlist(name, list)
  6. char *name;
  7. struct nlist *list;
  8. {
  9.     register struct nlist *p, *q;
  10.     int f, n, m, i;
  11.     long sa;
  12.     struct exec buf;
  13.     struct nlist space[SPACE];
  14.  
  15.     for(p = list; p->n_name[0]; p++) {
  16.         p->n_type = 0;
  17.         p->n_value = 0;
  18.     }
  19.     f = open(name, 0);
  20.     if(f < 0)
  21.         return(-1);
  22.     read(f, (char *)&buf, sizeof buf);
  23.     for(i=0; a_magic[i]; i++)
  24.         if(a_magic[i] == buf.a_magic) break;
  25.     if(a_magic[i] == 0){
  26.         close(f);
  27.         return(-1);
  28.     }
  29.     sa = buf.a_text + (long)buf.a_data;
  30.     if(buf.a_flag != 1) sa *= 2;
  31.     sa += sizeof buf;
  32.     lseek(f, sa, 0);
  33.     n = buf.a_syms;
  34.  
  35.     while(n){
  36.         m = sizeof space;
  37.         if(n < sizeof space)
  38.             m = n;
  39.         read(f, (char *)space, m);
  40.         n -= m;
  41.         for(q = space; (m -= sizeof(struct nlist)) >= 0; q++) {
  42.             for(p = list; p->n_name[0]; p++) {
  43.                 for(i=0;i<8;i++)
  44.                     if(p->n_name[i] != q->n_name[i]) goto cont;
  45.                 p->n_value = q->n_value;
  46.                 p->n_type = q->n_type;
  47.                 break;
  48.         cont:        ;
  49.             }
  50.         }
  51.     }
  52.     close(f);
  53.     return(0);
  54. }
  55.