AUSAM/source/S/nm.c

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

#
int	fout;
int	cflg;
int	nflg;
int	uflg;
int	rflg	1;
int	gflg;
int	pflg;
struct	nl
{
	char	name[8];
	int	typ;
	unsigned val;
} *nlp;
int	fi;
unsigned buf[8];
main(argc, argv)
char **argv;
{
	int n, i, j;
	int compare();
	long	ls;

	if (--argc > 0 && *argv[1] == '-') {
		argv++;
		while (*++*argv) switch (**argv) {
		case 'n':
			nflg++;
			continue;

		case 'c':
			cflg++;
			continue;

		case 'g':
			gflg++;
			continue;

		case 'u':
			uflg++;
			continue;

		case 'r':
			rflg = -1;
			continue;

		case 'p':
			pflg ++;
			continue;

		default:
			continue;
		}
		argc--;
	}
	if (argc==0)
		fi = open("a.out", 0); else
		fi = open(*++argv, 0);
	if(fi < 0) {
		printf("cannot open input\n");
		exit();
	}
	read(fi, buf, 020);
/* ilj mar 1976 */
	if(buf[0]!=0407 && buf[0]!=0410 && buf[0]!=0411 && buf[0]!=0412) {
		printf("bad format\n");
		exit();
	}
	lseek(fi, (ls = buf[1]), 1);		/* text */
	lseek(fi, (ls = buf[2]), 1);		/* data */
	if(buf[7] != 1) {
		lseek(fi, (ls = buf[1]), 1);
		lseek(fi, (ls = buf[2]), 1);	/* reloc */
	}
	n = ldiv(0, buf[4], 12);
	if(n == 0) {
		printf("no name list\n");
		exit();
	}
	nlp = sbrk(12*n);
	read(fi, nlp, n*12);
	if (pflg==0)
		qsort(nlp, n, 12, compare);
	fout = dup(1);
	close(1);
	for(i=0; i<n; i++) {
		if(gflg && (nlp->typ&040)==0)
			goto out;
		if(cflg) {
			if(nlp->name[0] != '_')
				goto out;
			for(j=0; j<7; j++)
				nlp->name[j] = nlp->name[j+1];
			nlp->name[7] = '\0';
		}
		j = nlp->typ&037;
#ifdef	unsw_orig
		if(j > 4)
			j = 1;
		if(j==0 && nlp->val)
			j = 5;
		if(uflg && j!=0)
			goto out;
		if(!uflg) {
			if(j==0)
				printf("      "); else
				printo(nlp->val);
			printf("%c ", (nlp->typ&040? "UATDBC":"uatdbc")[j]);
		}
#endif
#ifndef	unsw_orig
		if (uflg && j!=0) goto out ;
		if (!uflg) {
			if (j == 0 && !nlp->val) {
				printf("      ") ;
			} else {
				printo(nlp->val) ;
			}
			if (j > 4) {
				switch (j) {

				case 037:
					j = 6 ;
					break ;

				case 024:
					j = 7 ;
					break ;

				default:
					j = 8 ;
					break ;
				}
			} else {
				if (j == 0 && nlp->val) j = 5 ;
			}
			printf("%c ", (nlp->typ&040 ? "UATDBCFZ?" : "uatdbcfz?")[j]) ;
		}
#endif
		printf("%.8s\n", nlp);
	out:
		nlp++;
	}
	flush();
}

compare(p1, p2)
struct nl *p1, *p2;
{
	int a, i;

	a = 0;
	if(nflg) {
		if(p1->val > p2->val) {
			a = 1;
			goto out;
		}
		if(p1->val < p2->val) {
			a = -1;
			goto out;
		}
	}
	for(i=0; i<8; i++)
	if(p1->name[i] != p2->name[i]) {
		if(p1->name[i] > p2->name[i])
			a = 1; else
			a = -1;
		goto out;
	}
out:
	return(a*rflg);
}

printo(v)
{
	int i;

	printf("%c", v<0?'1':'0');
	for(i=0; i<5; i++) {
		printf("%c", ((v>>12)&7)+'0');
		v =<<3;
	}
}