/*
 * Dump minix a.out
 *	++jrb
 */
#include <stdio.h>
#include "minix-out.h"

main(argc, argv)
int argc;
char **argv;
{
    void dmp();
    
    if(argc < 2)
	dmp("a.out");
    else
    {
	while(--argc)
	    dmp(*++argv);
    }
}

#include <ctype.h>
#ifdef __GNU__
inline
#endif
void putsym(class, id)
int class, id;
{
    register int i = class & 0370;

    if(i ==  0020)
	putchar(toupper(id));
    else
	putchar(id);
    if(i == 0030)
	printf(" static");
    putchar('\n');
}

void dmp(name)
char *name;
{
    register FILE *fp;
    extern FILE *fopen();
    extern void *malloc();
    
    struct aexec head;
    struct asym *sym, *p;
    register int i,j;
    
    if((fp = fopen(name, "r")) == (FILE *)NULL)
    {
	perror(name);
	exit(1);
    }
    printf("%s:\n", name);
    if(fread(&head, sizeof(head), 1, fp) != 1)
    {
	perror(name);
	exit(2);
    }
    if(head.a_magic != CMAGIC)
    {
	fprintf(stderr,"%s: bad magic (%lx)\n", name, head.a_magic);
	exit(3);
    }
    printf("\tText %ld\tData %ld\tBss %ld\tSyms %d\n\n", head.a_text,
	   head.a_data, head.a_bss, (int)(head.a_syms/sizeof(struct asym)));
    if(fseek(fp,(long)(head.a_text + head.a_data), 1))
    {
	perror(name);
	exit(4);
    }
    
    if((sym = (struct asym *)malloc((unsigned int)head.a_syms)) == NULL)
    {
	perror("malloc");
	exit(5);
    }
    
    if(fread(sym, (int)(head.a_syms), 1, fp) != 1)
    {
	perror(name);
	exit(6);
    }
    fclose(fp);
    
    for(p = sym, i = 0; i < head.a_syms/sizeof(struct asym); i++, p++)
    {
	printf("\t%d:\t", i);
	for(j = 0; j < 8; j++)
	    putchar(p->a_name[j]);
	putchar('\t');
	printf("%ld\t", p->a_value);
	switch(p->a_sclass & 07)
	{
	  case 0:
	    putsym(p->a_sclass,'u');
	    break;
	    
	  case 1:
	    putsym(p->a_sclass,'a');
	    break;
	    
	  case 2:
	    putsym(p->a_sclass,'t');
	    break;
	    
	  case 3:
	    putsym(p->a_sclass,'d');
	    break;
	    
	  case 4:
	    putsym(p->a_sclass,'b');
	    break;
	    
	  case 5:
	    putsym(p->a_sclass,'c');
	    break;

	  default:
	    printf("unknown class %o\n", p->a_sclass);
	}
    }
}

	    

	
	
