diff options
Diffstat (limited to 'binutils/sysdump.c')
-rw-r--r-- | binutils/sysdump.c | 156 |
1 files changed, 93 insertions, 63 deletions
diff --git a/binutils/sysdump.c b/binutils/sysdump.c index 0b0d49524ff..8ac0f279d66 100644 --- a/binutils/sysdump.c +++ b/binutils/sysdump.c @@ -1,5 +1,6 @@ /* Sysroff object format dumper. - Copyright 1994, 1995, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. + Copyright 1994, 1995, 1998, 1999, 2000, 2001, 2002 + Free Software Foundation, Inc. This file is part of GNU Binutils. @@ -22,7 +23,7 @@ /* Written by Steve Chamberlain <sac@cygnus.com>. This program reads a SYSROFF object file and prints it in an - almost human readable form to stdout. */ + almost human readable form to stdout. */ #include "bfd.h" #include "bucomm.h" @@ -52,7 +53,6 @@ static void dump_symbol_info PARAMS ((void)); static void derived_type PARAMS ((void)); static void module PARAMS ((void)); static void show_usage PARAMS ((FILE *, int)); -static void show_help PARAMS ((void)); extern char *getCHARS PARAMS ((unsigned char *, int *, int, int)); extern int fillup PARAMS ((char *)); @@ -73,14 +73,13 @@ getCHARS (ptr, idx, size, max) int oc = *idx / 8; char *r; int b = size; + if (b >= max) - { - return "*undefined*"; - } + return "*undefined*"; if (b == 0) { - /* Got to work out the length of the string from self */ + /* Got to work out the length of the string from self. */ b = ptr[oc++]; (*idx) += 8; } @@ -89,6 +88,7 @@ getCHARS (ptr, idx, size, max) r = xcalloc (b + 1, 1); memcpy (r, ptr + oc, b); r[b] = 0; + return r; } @@ -116,10 +116,12 @@ dh (ptr, size) for (j = 0; j < span && j + i < size; j++) { int c = ptr[i + j]; + if (c < 32 || c > 127) c = '.'; printf ("%c", c); } + printf ("\n"); } } @@ -131,18 +133,17 @@ fillup (ptr) int size; int sum; int i; + size = getc (file) - 2; fread (ptr, 1, size, file); sum = code + size + 2; + for (i = 0; i < size; i++) - { - sum += ptr[i]; - } + sum += ptr[i]; if ((sum & 0xff) != 0xff) - { - printf ("SUM IS %x\n", sum); - } + printf ("SUM IS %x\n", sum); + if (dump) dh (ptr, size); @@ -160,12 +161,13 @@ getBARRAY (ptr, idx, dsize, max) int i; int byte = *idx / 8; int size = ptr[byte++]; + res.len = size; res.data = (unsigned char *) xmalloc (size); + for (i = 0; i < size; i++) - { - res.data[i] = ptr[byte++]; - } + res.data[i] = ptr[byte++]; + return res; } @@ -180,13 +182,14 @@ getINT (ptr, idx, size, max) int byte = *idx / 8; if (byte >= max) - { - return 0; - } + return 0; + if (size == -2) size = addrsize; + if (size == -1) size = 0; + switch (size) { case 0: @@ -203,6 +206,7 @@ getINT (ptr, idx, size, max) default: abort (); } + *idx += size * 8; return n; } @@ -233,14 +237,15 @@ itheader (name, code) } static int indent; + static void p () { int i; + for (i = 0; i < indent; i++) - { - printf ("| "); - } + printf ("| "); + printf ("> "); } @@ -255,12 +260,13 @@ pbarray (y) barray *y; { int x; + printf ("%d (", y->len); + for (x = 0; x < y->len; x++) - { - printf ("(%02x %c)", y->data[x], - ISPRINT (y->data[x]) ? y->data[x] : '.'); - } + printf ("(%02x %c)", y->data[x], + ISPRINT (y->data[x]) ? y->data[x] : '.'); + printf (")\n"); } @@ -269,27 +275,26 @@ pbarray (y) #include "sysroff.c" -/* - * FIXME: sysinfo, which generates sysroff.[ch] from sysroff.info, can't - * hack the special case of the tr block, which has no contents. So we - * implement our own functions for reading in and printing out the tr - * block. - */ +/* FIXME: sysinfo, which generates sysroff.[ch] from sysroff.info, can't + hack the special case of the tr block, which has no contents. So we + implement our own functions for reading in and printing out the tr + block. */ #define IT_tr_CODE 0x7f + void sysroff_swap_tr_in() { - char raw[255]; + char raw[255]; - memset(raw, 0, 255); - fillup(raw); + memset (raw, 0, 255); + fillup (raw); } void sysroff_print_tr_out() { - itheader("tr", IT_tr_CODE); + itheader ("tr", IT_tr_CODE); } static int @@ -297,6 +302,7 @@ getone (type) int type; { int c = getc (file); + code = c; if ((c & 0x7f) != type) @@ -314,6 +320,7 @@ getone (type) sysroff_print_cs_out (&dummy); } break; + case IT_dln_CODE: { struct IT_dln dummy; @@ -321,6 +328,7 @@ getone (type) sysroff_print_dln_out (&dummy); } break; + case IT_hd_CODE: { struct IT_hd dummy; @@ -329,6 +337,7 @@ getone (type) sysroff_print_hd_out (&dummy); } break; + case IT_dar_CODE: { struct IT_dar dummy; @@ -336,6 +345,7 @@ getone (type) sysroff_print_dar_out (&dummy); } break; + case IT_dsy_CODE: { struct IT_dsy dummy; @@ -343,6 +353,7 @@ getone (type) sysroff_print_dsy_out (&dummy); } break; + case IT_dfp_CODE: { struct IT_dfp dummy; @@ -350,6 +361,7 @@ getone (type) sysroff_print_dfp_out (&dummy); } break; + case IT_dso_CODE: { struct IT_dso dummy; @@ -357,6 +369,7 @@ getone (type) sysroff_print_dso_out (&dummy); } break; + case IT_dpt_CODE: { struct IT_dpt dummy; @@ -364,6 +377,7 @@ getone (type) sysroff_print_dpt_out (&dummy); } break; + case IT_den_CODE: { struct IT_den dummy; @@ -371,6 +385,7 @@ getone (type) sysroff_print_den_out (&dummy); } break; + case IT_dbt_CODE: { struct IT_dbt dummy; @@ -378,6 +393,7 @@ getone (type) sysroff_print_dbt_out (&dummy); } break; + case IT_dty_CODE: { struct IT_dty dummy; @@ -385,6 +401,7 @@ getone (type) sysroff_print_dty_out (&dummy); } break; + case IT_un_CODE: { struct IT_un dummy; @@ -392,6 +409,7 @@ getone (type) sysroff_print_un_out (&dummy); } break; + case IT_sc_CODE: { struct IT_sc dummy; @@ -399,6 +417,7 @@ getone (type) sysroff_print_sc_out (&dummy); } break; + case IT_er_CODE: { struct IT_er dummy; @@ -406,6 +425,7 @@ getone (type) sysroff_print_er_out (&dummy); } break; + case IT_ed_CODE: { struct IT_ed dummy; @@ -413,6 +433,7 @@ getone (type) sysroff_print_ed_out (&dummy); } break; + case IT_sh_CODE: { struct IT_sh dummy; @@ -420,6 +441,7 @@ getone (type) sysroff_print_sh_out (&dummy); } break; + case IT_ob_CODE: { struct IT_ob dummy; @@ -427,6 +449,7 @@ getone (type) sysroff_print_ob_out (&dummy); } break; + case IT_rl_CODE: { struct IT_rl dummy; @@ -434,6 +457,7 @@ getone (type) sysroff_print_rl_out (&dummy); } break; + case IT_du_CODE: { struct IT_du dummy; @@ -442,6 +466,7 @@ getone (type) sysroff_print_du_out (&dummy); } break; + case IT_dus_CODE: { struct IT_dus dummy; @@ -449,6 +474,7 @@ getone (type) sysroff_print_dus_out (&dummy); } break; + case IT_dul_CODE: { struct IT_dul dummy; @@ -456,6 +482,7 @@ getone (type) sysroff_print_dul_out (&dummy); } break; + case IT_dss_CODE: { struct IT_dss dummy; @@ -463,6 +490,7 @@ getone (type) sysroff_print_dss_out (&dummy); } break; + case IT_hs_CODE: { struct IT_hs dummy; @@ -470,6 +498,7 @@ getone (type) sysroff_print_hs_out (&dummy); } break; + case IT_dps_CODE: { struct IT_dps dummy; @@ -477,24 +506,27 @@ getone (type) sysroff_print_dps_out (&dummy); } break; + case IT_tr_CODE: - { - sysroff_swap_tr_in (); - sysroff_print_tr_out (); - } + sysroff_swap_tr_in (); + sysroff_print_tr_out (); break; + case IT_dds_CODE: { struct IT_dds dummy; + sysroff_swap_dds_in (&dummy); sysroff_print_dds_out (&dummy); } break; + default: printf ("GOT A %x\n", c); return 0; break; } + return 1; } @@ -552,9 +584,7 @@ must (x) int x; { if (!getone (x)) - { - printf ("WANTED %x!!\n", x); - } + printf ("WANTED %x!!\n", x); } static void @@ -563,6 +593,7 @@ tab (i, s) char *s; { indent += i; + if (s) { p (); @@ -575,6 +606,7 @@ static void dump_symbol_info () { tab (1, "SYMBOL INFO"); + while (opt (IT_dsy_CODE)) { if (opt (IT_dty_CODE)) @@ -584,6 +616,7 @@ dump_symbol_info () must (IT_dty_CODE); } } + tab (-1, ""); } @@ -591,6 +624,7 @@ static void derived_type () { tab (1, "DERIVED TYPE"); + while (1) { if (opt (IT_dpp_CODE)) @@ -730,18 +764,17 @@ show_usage (file, status) FILE *file; int status; { - fprintf (file, _("Usage: %s [-hV] in-file\n"), program_name); + fprintf (file, _("Usage: %s [option(s)] in-file\n"), program_name); + fprintf (file, _("Print a human readable interpretation of a SYSROFF object file\n")); + fprintf (file, _(" The options are:\n\ + -h --help Display this information\n\ + -v --version Print the program's version number\n")); + + if (status == 0) + fprintf (file, _("Report bugs to %s\n"), REPORT_BUGS_TO); exit (status); } -static void -show_help () -{ - printf (_("%s: Print a human readable interpretation of a SYSROFF object file\n"), - program_name); - show_usage (stdout, 0); -} - int main (ac, av) int ac; @@ -768,13 +801,15 @@ main (ac, av) program_name = av[0]; xmalloc_set_program_name (program_name); - while ((opt = getopt_long (ac, av, "hV", long_options, (int *) NULL)) != EOF) + while ((opt = getopt_long (ac, av, "HhVv", long_options, (int *) NULL)) != EOF) { switch (opt) { + case 'H': case 'h': - show_help (); + show_usage (stdout, 0); /*NOTREACHED*/ + case 'v': case 'V': print_version ("sysdump"); exit (0); @@ -790,20 +825,15 @@ main (ac, av) /* The input and output files may be named on the command line. */ if (optind < ac) - { - input_file = av[optind]; - } + input_file = av[optind]; if (!input_file) - { - fatal (_("no input file specified")); - } + fatal (_("no input file specified")); file = fopen (input_file, FOPEN_RB); + if (!file) - { - fatal (_("cannot open input file %s"), input_file); - } + fatal (_("cannot open input file %s"), input_file); module (); return 0; |