home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GEMini Atari
/
GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso
/
files
/
language
/
sozobon2
/
nm.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-10-23
|
3KB
|
192 lines
/* Copyright (c) 1988 by Sozobon, Limited. Author: Johann Ruegg
*
* Permission is granted to anyone to use this software for any purpose
* on any computer system, and to redistribute it freely, with the
* following restrictions:
* 1) No charge may be made other than reasonable charges for reproduction.
* 2) Modified versions must be clearly marked as such.
* 3) The authors are not responsible for any harmful consequences
* of using this software, even if they result from defects in it.
*
* Alternative ST symbol table lister.
*/
#include <stdio.h>
#include <ar.h>
struct hdr {
int magic;
long tsize, dsize, bsize;
long syms;
long f1,f2;
int f3;
} h;
struct sym {
char name[8];
char flags;
long value;
};
int gflag;
main(argc, argv)
char **argv;
{
int many;
many = argc > 2;
while (--argc) {
argv++;
if (*argv[0] == '-')
doopt(argv[0]);
else
doname(argv[0], many);
}
exit(0);
}
doopt(s)
char *s;
{
while (*++s)
switch (*s) {
case 'g':
gflag++;
}
}
doname(s, many)
char *s;
{
FILE *fd, *fopen();
int i;
fd = fopen(s, "rb");
if (fd == NULL) {
fprintf(stderr, "Can't open %s\n", s);
return;
}
if (many)
printf("\n%s:\n", s);
if (i = dohdr(fd)) {
if (i == -1)
doarch(fd);
else {
while (i--)
dosym(fd);
}
}
fclose(fd);
}
dohdr(fd)
FILE *fd;
{
int i;
long len;
fread(&h, 2, 1, fd);
if (h.magic == ARMAG1)
return -1;
i = fread((char *)&h + 2, sizeof(h) - 2, 1, fd);
if (i != 1 || h.magic != 0x601a) {
printf("Bad header\n");
return 0;
}
len = h.tsize + h.dsize;
fseek(fd, len, 1);
return h.syms / sizeof(struct sym);
}
dosym(fd)
FILE *fd;
{
struct sym s;
int i;
i = fread(&s, sizeof(s), 1, fd);
if (i != 1)
return;
if (gflag && not_glob(s.flags))
return;
printf("%.8s", s.name);
fill8(s.name);
printf("\t%8lx", s.value);
putchar(' ');
sflags(s.flags);
putchar('\n');
}
fill8(s)
char *s;
{
int i;
for (i=0; i<8; i++)
if (s[i] == 0)
putchar(' ');
}
char *fname[] = {
"?0?", "bss", "text", "?3?", "data",
"?5?", "?6?", "?7?"
};
not_glob(x)
{
x &= 0xff;
if (x & 0x20)
return 0;
x &= ~0x20;
if (x == 0x88)
return 0;
return 1;
}
sflags(x)
{
x &= 0xff;
if (x & 0x20)
printf("global ");
x &= ~0x20;
if (x == 0x88)
printf("external abs");
else if (x == 0xc0)
printf("equ abs");
else if (x == 0xd0)
printf("equ reg abs");
else {
x &= 7;
printf(fname[x]);
}
}
doarch(fd)
FILE *fd;
{
struct ar_hdr a;
int i;
long len, ftell();
more:
i = fread(&a, sizeof(a), 1, fd);
if (i != 1)
return;
printf("\n(%.18s):\n", a.ar_name);
len = a.ar_size + ftell(fd);
i = dohdr(fd);
if (i <= 0)
return;
while (i--)
dosym(fd);
fseek(fd, len, 0);
goto more;
}