Ultrix-3.1/sys/sas/nlist.c

Compare this file to the similar file:
Show the results in this format:

/*
 * SCCSID: @(#)nlist.c	3.0	4/21/86
 */
/**********************************************************************
 *   Copyright (c) Digital Equipment Corporation 1984, 1985, 1986.    *
 *   All Rights Reserved. 					      *
 *   Reference "/usr/src/COPYRIGHT" for applicable restrictions.      *
 **********************************************************************/

#include <a.out.h>
#ifndef	K450
int a_magic[] = {A_MAGIC1, A_MAGIC2, A_MAGIC3, A_MAGIC4, 0430, 0431, 0};
#else	K450
int a_magic[] = {A_MAGIC1, A_MAGIC2, A_MAGIC3, A_MAGIC4, 0430, 0431, 0450, 0451, 0};
#endif	K450
#define SPACE 100               /* number of symbols read at a time */

struct exec buf;
struct nlist space[SPACE];

nlist(name, list)
char *name;
struct nlist *list;
{
        register struct nlist *p, *q;
        int f, n, m, i;
        long sa;
	unsigned ovsizes[8];
	long soff;

        for(p = list; p->n_name[0]; p++) {
                p->n_type = 0;
                p->n_value = 0;
        }
        f = open(name, 0);
        if(f < 0)
                return(-1);
	lseek(f, (long)0, 0);
        read(f, (char *)&buf, sizeof buf);
	soff = sizeof buf;
        for(i=0; a_magic[i]; i++)
                if(a_magic[i] == buf.a_magic) break;
        if(a_magic[i] == 0){
                close(f);
                return(-1);
        }
#ifndef	K450
	if (buf.a_magic == 0430 || buf.a_magic == 0431) {
#else	K450
	if (buf.a_magic >= 0430) {
#endif	K450
		read(f, (char *)ovsizes, sizeof ovsizes);
		soff += sizeof ovsizes;
		for (i = 1; i < 8; i++) {
#ifndef	K450
			lseek(f, (long)(soff+ovsizes[i]), 0);
#endif	K450
			soff += ovsizes[i];
		}
	}
#ifdef	K450
	if (buf.a_magic >= 0450) {
		read(f, (char *)ovsizes, sizeof ovsizes);
		soff += sizeof ovsizes;
		for (i = 0; i < 8; i++)
			soff += ovsizes[i];
	}
#endif	K450
        sa = buf.a_text + (long)buf.a_data;
        if(buf.a_flag != 1) sa *= 2;
        lseek(f, (long)(sa+soff), 0);
	soff += sa;
        n = buf.a_syms;

        while(n){
                m = sizeof space;
                if(n < sizeof space)
                        m = n;
                read(f, (char *)space, m);
                n -= m;
                for(q = space; (m -= sizeof(struct nlist)) >= 0; q++) {
                        for(p = list; p->n_name[0]; p++) {
                                for(i=0;i<8;i++)
                                        if(p->n_name[i] != q->n_name[i]) goto cont;
                                p->n_value = q->n_value;
                                p->n_type = q->n_type;
                                break;
                cont:           ;
                        }
                }
        }
        close(f);
        return(0);
}