xref: /openbsd-src/gnu/usr.bin/binutils-2.17/binutils/sysdump.c (revision 3d8817e467ea46cf4772788d6804dd293abfb01a)
1*3d8817e4Smiod /* Sysroff object format dumper.
2*3d8817e4Smiod    Copyright 1994, 1995, 1998, 1999, 2000, 2001, 2002, 2003, 2005
3*3d8817e4Smiod    Free Software Foundation, Inc.
4*3d8817e4Smiod 
5*3d8817e4Smiod    This file is part of GNU Binutils.
6*3d8817e4Smiod 
7*3d8817e4Smiod    This program is free software; you can redistribute it and/or modify
8*3d8817e4Smiod    it under the terms of the GNU General Public License as published by
9*3d8817e4Smiod    the Free Software Foundation; either version 2 of the License, or
10*3d8817e4Smiod    (at your option) any later version.
11*3d8817e4Smiod 
12*3d8817e4Smiod    This program is distributed in the hope that it will be useful,
13*3d8817e4Smiod    but WITHOUT ANY WARRANTY; without even the implied warranty of
14*3d8817e4Smiod    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*3d8817e4Smiod    GNU General Public License for more details.
16*3d8817e4Smiod 
17*3d8817e4Smiod    You should have received a copy of the GNU General Public License
18*3d8817e4Smiod    along with this program; if not, write to the Free Software
19*3d8817e4Smiod    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
20*3d8817e4Smiod    02110-1301, USA.  */
21*3d8817e4Smiod 
22*3d8817e4Smiod 
23*3d8817e4Smiod /* Written by Steve Chamberlain <sac@cygnus.com>.
24*3d8817e4Smiod 
25*3d8817e4Smiod  This program reads a SYSROFF object file and prints it in an
26*3d8817e4Smiod  almost human readable form to stdout.  */
27*3d8817e4Smiod 
28*3d8817e4Smiod #include "bfd.h"
29*3d8817e4Smiod #include "bucomm.h"
30*3d8817e4Smiod #include "safe-ctype.h"
31*3d8817e4Smiod 
32*3d8817e4Smiod #include <stdio.h>
33*3d8817e4Smiod #include "libiberty.h"
34*3d8817e4Smiod #include "getopt.h"
35*3d8817e4Smiod #include "sysroff.h"
36*3d8817e4Smiod 
37*3d8817e4Smiod static int dump = 1;
38*3d8817e4Smiod static int segmented_p;
39*3d8817e4Smiod static int code;
40*3d8817e4Smiod static int addrsize = 4;
41*3d8817e4Smiod static FILE *file;
42*3d8817e4Smiod 
43*3d8817e4Smiod static void dh (unsigned char *, int);
44*3d8817e4Smiod static void itheader (char *, int);
45*3d8817e4Smiod static void p (void);
46*3d8817e4Smiod static void tabout (void);
47*3d8817e4Smiod static void pbarray (barray *);
48*3d8817e4Smiod static int getone (int);
49*3d8817e4Smiod static int opt (int);
50*3d8817e4Smiod static void must (int);
51*3d8817e4Smiod static void tab (int, char *);
52*3d8817e4Smiod static void dump_symbol_info (void);
53*3d8817e4Smiod static void derived_type (void);
54*3d8817e4Smiod static void module (void);
55*3d8817e4Smiod static void show_usage (FILE *, int);
56*3d8817e4Smiod 
57*3d8817e4Smiod extern int main (int, char **);
58*3d8817e4Smiod 
59*3d8817e4Smiod static char *
getCHARS(unsigned char * ptr,int * idx,int size,int max)60*3d8817e4Smiod getCHARS (unsigned char *ptr, int *idx, int size, int max)
61*3d8817e4Smiod {
62*3d8817e4Smiod   int oc = *idx / 8;
63*3d8817e4Smiod   char *r;
64*3d8817e4Smiod   int b = size;
65*3d8817e4Smiod 
66*3d8817e4Smiod   if (b >= max)
67*3d8817e4Smiod     return "*undefined*";
68*3d8817e4Smiod 
69*3d8817e4Smiod   if (b == 0)
70*3d8817e4Smiod     {
71*3d8817e4Smiod       /* Got to work out the length of the string from self.  */
72*3d8817e4Smiod       b = ptr[oc++];
73*3d8817e4Smiod       (*idx) += 8;
74*3d8817e4Smiod     }
75*3d8817e4Smiod 
76*3d8817e4Smiod   *idx += b * 8;
77*3d8817e4Smiod   r = xcalloc (b + 1, 1);
78*3d8817e4Smiod   memcpy (r, ptr + oc, b);
79*3d8817e4Smiod   r[b] = 0;
80*3d8817e4Smiod 
81*3d8817e4Smiod   return r;
82*3d8817e4Smiod }
83*3d8817e4Smiod 
84*3d8817e4Smiod static void
dh(unsigned char * ptr,int size)85*3d8817e4Smiod dh (unsigned char *ptr, int size)
86*3d8817e4Smiod {
87*3d8817e4Smiod   int i;
88*3d8817e4Smiod   int j;
89*3d8817e4Smiod   int span = 16;
90*3d8817e4Smiod 
91*3d8817e4Smiod   printf ("\n************************************************************\n");
92*3d8817e4Smiod 
93*3d8817e4Smiod   for (i = 0; i < size; i += span)
94*3d8817e4Smiod     {
95*3d8817e4Smiod       for (j = 0; j < span; j++)
96*3d8817e4Smiod 	{
97*3d8817e4Smiod 	  if (j + i < size)
98*3d8817e4Smiod 	    printf ("%02x ", ptr[i + j]);
99*3d8817e4Smiod 	  else
100*3d8817e4Smiod 	    printf ("   ");
101*3d8817e4Smiod 	}
102*3d8817e4Smiod 
103*3d8817e4Smiod       for (j = 0; j < span && j + i < size; j++)
104*3d8817e4Smiod 	{
105*3d8817e4Smiod 	  int c = ptr[i + j];
106*3d8817e4Smiod 
107*3d8817e4Smiod 	  if (c < 32 || c > 127)
108*3d8817e4Smiod 	    c = '.';
109*3d8817e4Smiod 	  printf ("%c", c);
110*3d8817e4Smiod 	}
111*3d8817e4Smiod 
112*3d8817e4Smiod       printf ("\n");
113*3d8817e4Smiod     }
114*3d8817e4Smiod }
115*3d8817e4Smiod 
116*3d8817e4Smiod static int
fillup(unsigned char * ptr)117*3d8817e4Smiod fillup (unsigned char *ptr)
118*3d8817e4Smiod {
119*3d8817e4Smiod   int size;
120*3d8817e4Smiod   int sum;
121*3d8817e4Smiod   int i;
122*3d8817e4Smiod 
123*3d8817e4Smiod   size = getc (file) - 2;
124*3d8817e4Smiod   fread (ptr, 1, size, file);
125*3d8817e4Smiod   sum = code + size + 2;
126*3d8817e4Smiod 
127*3d8817e4Smiod   for (i = 0; i < size; i++)
128*3d8817e4Smiod     sum += ptr[i];
129*3d8817e4Smiod 
130*3d8817e4Smiod   if ((sum & 0xff) != 0xff)
131*3d8817e4Smiod     printf ("SUM IS %x\n", sum);
132*3d8817e4Smiod 
133*3d8817e4Smiod   if (dump)
134*3d8817e4Smiod     dh (ptr, size);
135*3d8817e4Smiod 
136*3d8817e4Smiod   return size - 1;
137*3d8817e4Smiod }
138*3d8817e4Smiod 
139*3d8817e4Smiod static barray
getBARRAY(unsigned char * ptr,int * idx,int dsize ATTRIBUTE_UNUSED,int max ATTRIBUTE_UNUSED)140*3d8817e4Smiod getBARRAY (unsigned char *ptr, int *idx, int dsize ATTRIBUTE_UNUSED,
141*3d8817e4Smiod 	   int max ATTRIBUTE_UNUSED)
142*3d8817e4Smiod {
143*3d8817e4Smiod   barray res;
144*3d8817e4Smiod   int i;
145*3d8817e4Smiod   int byte = *idx / 8;
146*3d8817e4Smiod   int size = ptr[byte++];
147*3d8817e4Smiod 
148*3d8817e4Smiod   res.len = size;
149*3d8817e4Smiod   res.data = (unsigned char *) xmalloc (size);
150*3d8817e4Smiod 
151*3d8817e4Smiod   for (i = 0; i < size; i++)
152*3d8817e4Smiod     res.data[i] = ptr[byte++];
153*3d8817e4Smiod 
154*3d8817e4Smiod   return res;
155*3d8817e4Smiod }
156*3d8817e4Smiod 
157*3d8817e4Smiod static int
getINT(unsigned char * ptr,int * idx,int size,int max)158*3d8817e4Smiod getINT (unsigned char *ptr, int *idx, int size, int max)
159*3d8817e4Smiod {
160*3d8817e4Smiod   int n = 0;
161*3d8817e4Smiod   int byte = *idx / 8;
162*3d8817e4Smiod 
163*3d8817e4Smiod   if (byte >= max)
164*3d8817e4Smiod     return 0;
165*3d8817e4Smiod 
166*3d8817e4Smiod   if (size == -2)
167*3d8817e4Smiod     size = addrsize;
168*3d8817e4Smiod 
169*3d8817e4Smiod   if (size == -1)
170*3d8817e4Smiod     size = 0;
171*3d8817e4Smiod 
172*3d8817e4Smiod   switch (size)
173*3d8817e4Smiod     {
174*3d8817e4Smiod     case 0:
175*3d8817e4Smiod       return 0;
176*3d8817e4Smiod     case 1:
177*3d8817e4Smiod       n = (ptr[byte]);
178*3d8817e4Smiod       break;
179*3d8817e4Smiod     case 2:
180*3d8817e4Smiod       n = (ptr[byte + 0] << 8) + ptr[byte + 1];
181*3d8817e4Smiod       break;
182*3d8817e4Smiod     case 4:
183*3d8817e4Smiod       n = (ptr[byte + 0] << 24) + (ptr[byte + 1] << 16) + (ptr[byte + 2] << 8) + (ptr[byte + 3]);
184*3d8817e4Smiod       break;
185*3d8817e4Smiod     default:
186*3d8817e4Smiod       abort ();
187*3d8817e4Smiod     }
188*3d8817e4Smiod 
189*3d8817e4Smiod   *idx += size * 8;
190*3d8817e4Smiod   return n;
191*3d8817e4Smiod }
192*3d8817e4Smiod 
193*3d8817e4Smiod static int
getBITS(unsigned char * ptr,int * idx,int size,int max)194*3d8817e4Smiod getBITS (unsigned char *ptr, int *idx, int size, int max)
195*3d8817e4Smiod {
196*3d8817e4Smiod   int byte = *idx / 8;
197*3d8817e4Smiod   int bit = *idx % 8;
198*3d8817e4Smiod 
199*3d8817e4Smiod   if (byte >= max)
200*3d8817e4Smiod     return 0;
201*3d8817e4Smiod 
202*3d8817e4Smiod   *idx += size;
203*3d8817e4Smiod 
204*3d8817e4Smiod   return (ptr[byte] >> (8 - bit - size)) & ((1 << size) - 1);
205*3d8817e4Smiod }
206*3d8817e4Smiod 
207*3d8817e4Smiod static void
itheader(char * name,int code)208*3d8817e4Smiod itheader (char *name, int code)
209*3d8817e4Smiod {
210*3d8817e4Smiod   printf ("\n%s 0x%02x\n", name, code);
211*3d8817e4Smiod }
212*3d8817e4Smiod 
213*3d8817e4Smiod static int indent;
214*3d8817e4Smiod 
215*3d8817e4Smiod static void
p(void)216*3d8817e4Smiod p (void)
217*3d8817e4Smiod {
218*3d8817e4Smiod   int i;
219*3d8817e4Smiod 
220*3d8817e4Smiod   for (i = 0; i < indent; i++)
221*3d8817e4Smiod     printf ("| ");
222*3d8817e4Smiod 
223*3d8817e4Smiod   printf ("> ");
224*3d8817e4Smiod }
225*3d8817e4Smiod 
226*3d8817e4Smiod static void
tabout(void)227*3d8817e4Smiod tabout (void)
228*3d8817e4Smiod {
229*3d8817e4Smiod   p ();
230*3d8817e4Smiod }
231*3d8817e4Smiod 
232*3d8817e4Smiod static void
pbarray(barray * y)233*3d8817e4Smiod pbarray (barray *y)
234*3d8817e4Smiod {
235*3d8817e4Smiod   int x;
236*3d8817e4Smiod 
237*3d8817e4Smiod   printf ("%d (", y->len);
238*3d8817e4Smiod 
239*3d8817e4Smiod   for (x = 0; x < y->len; x++)
240*3d8817e4Smiod     printf ("(%02x %c)", y->data[x],
241*3d8817e4Smiod 	    ISPRINT (y->data[x]) ? y->data[x] : '.');
242*3d8817e4Smiod 
243*3d8817e4Smiod   printf (")\n");
244*3d8817e4Smiod }
245*3d8817e4Smiod 
246*3d8817e4Smiod #define SYSROFF_PRINT
247*3d8817e4Smiod #define SYSROFF_SWAP_IN
248*3d8817e4Smiod 
249*3d8817e4Smiod #include "sysroff.c"
250*3d8817e4Smiod 
251*3d8817e4Smiod /* FIXME: sysinfo, which generates sysroff.[ch] from sysroff.info, can't
252*3d8817e4Smiod    hack the special case of the tr block, which has no contents.  So we
253*3d8817e4Smiod    implement our own functions for reading in and printing out the tr
254*3d8817e4Smiod    block.  */
255*3d8817e4Smiod 
256*3d8817e4Smiod #define IT_tr_CODE	0x7f
257*3d8817e4Smiod 
258*3d8817e4Smiod static void
sysroff_swap_tr_in(void)259*3d8817e4Smiod sysroff_swap_tr_in (void)
260*3d8817e4Smiod {
261*3d8817e4Smiod   unsigned char raw[255];
262*3d8817e4Smiod 
263*3d8817e4Smiod   memset (raw, 0, 255);
264*3d8817e4Smiod   fillup (raw);
265*3d8817e4Smiod }
266*3d8817e4Smiod 
267*3d8817e4Smiod static void
sysroff_print_tr_out(void)268*3d8817e4Smiod sysroff_print_tr_out (void)
269*3d8817e4Smiod {
270*3d8817e4Smiod   itheader ("tr", IT_tr_CODE);
271*3d8817e4Smiod }
272*3d8817e4Smiod 
273*3d8817e4Smiod static int
getone(int type)274*3d8817e4Smiod getone (int type)
275*3d8817e4Smiod {
276*3d8817e4Smiod   int c = getc (file);
277*3d8817e4Smiod 
278*3d8817e4Smiod   code = c;
279*3d8817e4Smiod 
280*3d8817e4Smiod   if ((c & 0x7f) != type)
281*3d8817e4Smiod     {
282*3d8817e4Smiod       ungetc (c, file);
283*3d8817e4Smiod       return 0;
284*3d8817e4Smiod     }
285*3d8817e4Smiod 
286*3d8817e4Smiod   switch (c & 0x7f)
287*3d8817e4Smiod     {
288*3d8817e4Smiod     case IT_cs_CODE:
289*3d8817e4Smiod       {
290*3d8817e4Smiod 	struct IT_cs dummy;
291*3d8817e4Smiod 	sysroff_swap_cs_in (&dummy);
292*3d8817e4Smiod 	sysroff_print_cs_out (&dummy);
293*3d8817e4Smiod       }
294*3d8817e4Smiod       break;
295*3d8817e4Smiod 
296*3d8817e4Smiod     case IT_dln_CODE:
297*3d8817e4Smiod       {
298*3d8817e4Smiod 	struct IT_dln dummy;
299*3d8817e4Smiod 	sysroff_swap_dln_in (&dummy);
300*3d8817e4Smiod 	sysroff_print_dln_out (&dummy);
301*3d8817e4Smiod       }
302*3d8817e4Smiod       break;
303*3d8817e4Smiod 
304*3d8817e4Smiod     case IT_hd_CODE:
305*3d8817e4Smiod       {
306*3d8817e4Smiod 	struct IT_hd dummy;
307*3d8817e4Smiod 	sysroff_swap_hd_in (&dummy);
308*3d8817e4Smiod 	addrsize = dummy.afl;
309*3d8817e4Smiod 	sysroff_print_hd_out (&dummy);
310*3d8817e4Smiod       }
311*3d8817e4Smiod       break;
312*3d8817e4Smiod 
313*3d8817e4Smiod     case IT_dar_CODE:
314*3d8817e4Smiod       {
315*3d8817e4Smiod 	struct IT_dar dummy;
316*3d8817e4Smiod 	sysroff_swap_dar_in (&dummy);
317*3d8817e4Smiod 	sysroff_print_dar_out (&dummy);
318*3d8817e4Smiod       }
319*3d8817e4Smiod       break;
320*3d8817e4Smiod 
321*3d8817e4Smiod     case IT_dsy_CODE:
322*3d8817e4Smiod       {
323*3d8817e4Smiod 	struct IT_dsy dummy;
324*3d8817e4Smiod 	sysroff_swap_dsy_in (&dummy);
325*3d8817e4Smiod 	sysroff_print_dsy_out (&dummy);
326*3d8817e4Smiod       }
327*3d8817e4Smiod       break;
328*3d8817e4Smiod 
329*3d8817e4Smiod     case IT_dfp_CODE:
330*3d8817e4Smiod       {
331*3d8817e4Smiod 	struct IT_dfp dummy;
332*3d8817e4Smiod 	sysroff_swap_dfp_in (&dummy);
333*3d8817e4Smiod 	sysroff_print_dfp_out (&dummy);
334*3d8817e4Smiod       }
335*3d8817e4Smiod       break;
336*3d8817e4Smiod 
337*3d8817e4Smiod     case IT_dso_CODE:
338*3d8817e4Smiod       {
339*3d8817e4Smiod 	struct IT_dso dummy;
340*3d8817e4Smiod 	sysroff_swap_dso_in (&dummy);
341*3d8817e4Smiod 	sysroff_print_dso_out (&dummy);
342*3d8817e4Smiod       }
343*3d8817e4Smiod       break;
344*3d8817e4Smiod 
345*3d8817e4Smiod     case IT_dpt_CODE:
346*3d8817e4Smiod       {
347*3d8817e4Smiod 	struct IT_dpt dummy;
348*3d8817e4Smiod 	sysroff_swap_dpt_in (&dummy);
349*3d8817e4Smiod 	sysroff_print_dpt_out (&dummy);
350*3d8817e4Smiod       }
351*3d8817e4Smiod       break;
352*3d8817e4Smiod 
353*3d8817e4Smiod     case IT_den_CODE:
354*3d8817e4Smiod       {
355*3d8817e4Smiod 	struct IT_den dummy;
356*3d8817e4Smiod 	sysroff_swap_den_in (&dummy);
357*3d8817e4Smiod 	sysroff_print_den_out (&dummy);
358*3d8817e4Smiod       }
359*3d8817e4Smiod       break;
360*3d8817e4Smiod 
361*3d8817e4Smiod     case IT_dbt_CODE:
362*3d8817e4Smiod       {
363*3d8817e4Smiod 	struct IT_dbt dummy;
364*3d8817e4Smiod 	sysroff_swap_dbt_in (&dummy);
365*3d8817e4Smiod 	sysroff_print_dbt_out (&dummy);
366*3d8817e4Smiod       }
367*3d8817e4Smiod       break;
368*3d8817e4Smiod 
369*3d8817e4Smiod     case IT_dty_CODE:
370*3d8817e4Smiod       {
371*3d8817e4Smiod 	struct IT_dty dummy;
372*3d8817e4Smiod 	sysroff_swap_dty_in (&dummy);
373*3d8817e4Smiod 	sysroff_print_dty_out (&dummy);
374*3d8817e4Smiod       }
375*3d8817e4Smiod       break;
376*3d8817e4Smiod 
377*3d8817e4Smiod     case IT_un_CODE:
378*3d8817e4Smiod       {
379*3d8817e4Smiod 	struct IT_un dummy;
380*3d8817e4Smiod 	sysroff_swap_un_in (&dummy);
381*3d8817e4Smiod 	sysroff_print_un_out (&dummy);
382*3d8817e4Smiod       }
383*3d8817e4Smiod       break;
384*3d8817e4Smiod 
385*3d8817e4Smiod     case IT_sc_CODE:
386*3d8817e4Smiod       {
387*3d8817e4Smiod 	struct IT_sc dummy;
388*3d8817e4Smiod 	sysroff_swap_sc_in (&dummy);
389*3d8817e4Smiod 	sysroff_print_sc_out (&dummy);
390*3d8817e4Smiod       }
391*3d8817e4Smiod       break;
392*3d8817e4Smiod 
393*3d8817e4Smiod     case IT_er_CODE:
394*3d8817e4Smiod       {
395*3d8817e4Smiod 	struct IT_er dummy;
396*3d8817e4Smiod 	sysroff_swap_er_in (&dummy);
397*3d8817e4Smiod 	sysroff_print_er_out (&dummy);
398*3d8817e4Smiod       }
399*3d8817e4Smiod       break;
400*3d8817e4Smiod 
401*3d8817e4Smiod     case IT_ed_CODE:
402*3d8817e4Smiod       {
403*3d8817e4Smiod 	struct IT_ed dummy;
404*3d8817e4Smiod 	sysroff_swap_ed_in (&dummy);
405*3d8817e4Smiod 	sysroff_print_ed_out (&dummy);
406*3d8817e4Smiod       }
407*3d8817e4Smiod       break;
408*3d8817e4Smiod 
409*3d8817e4Smiod     case IT_sh_CODE:
410*3d8817e4Smiod       {
411*3d8817e4Smiod 	struct IT_sh dummy;
412*3d8817e4Smiod 	sysroff_swap_sh_in (&dummy);
413*3d8817e4Smiod 	sysroff_print_sh_out (&dummy);
414*3d8817e4Smiod       }
415*3d8817e4Smiod       break;
416*3d8817e4Smiod 
417*3d8817e4Smiod     case IT_ob_CODE:
418*3d8817e4Smiod       {
419*3d8817e4Smiod 	struct IT_ob dummy;
420*3d8817e4Smiod 	sysroff_swap_ob_in (&dummy);
421*3d8817e4Smiod 	sysroff_print_ob_out (&dummy);
422*3d8817e4Smiod       }
423*3d8817e4Smiod       break;
424*3d8817e4Smiod 
425*3d8817e4Smiod     case IT_rl_CODE:
426*3d8817e4Smiod       {
427*3d8817e4Smiod 	struct IT_rl dummy;
428*3d8817e4Smiod 	sysroff_swap_rl_in (&dummy);
429*3d8817e4Smiod 	sysroff_print_rl_out (&dummy);
430*3d8817e4Smiod       }
431*3d8817e4Smiod       break;
432*3d8817e4Smiod 
433*3d8817e4Smiod     case IT_du_CODE:
434*3d8817e4Smiod       {
435*3d8817e4Smiod 	struct IT_du dummy;
436*3d8817e4Smiod 	sysroff_swap_du_in (&dummy);
437*3d8817e4Smiod 
438*3d8817e4Smiod 	sysroff_print_du_out (&dummy);
439*3d8817e4Smiod       }
440*3d8817e4Smiod       break;
441*3d8817e4Smiod 
442*3d8817e4Smiod     case IT_dus_CODE:
443*3d8817e4Smiod       {
444*3d8817e4Smiod 	struct IT_dus dummy;
445*3d8817e4Smiod 	sysroff_swap_dus_in (&dummy);
446*3d8817e4Smiod 	sysroff_print_dus_out (&dummy);
447*3d8817e4Smiod       }
448*3d8817e4Smiod       break;
449*3d8817e4Smiod 
450*3d8817e4Smiod     case IT_dul_CODE:
451*3d8817e4Smiod       {
452*3d8817e4Smiod 	struct IT_dul dummy;
453*3d8817e4Smiod 	sysroff_swap_dul_in (&dummy);
454*3d8817e4Smiod 	sysroff_print_dul_out (&dummy);
455*3d8817e4Smiod       }
456*3d8817e4Smiod       break;
457*3d8817e4Smiod 
458*3d8817e4Smiod     case IT_dss_CODE:
459*3d8817e4Smiod       {
460*3d8817e4Smiod 	struct IT_dss dummy;
461*3d8817e4Smiod 	sysroff_swap_dss_in (&dummy);
462*3d8817e4Smiod 	sysroff_print_dss_out (&dummy);
463*3d8817e4Smiod       }
464*3d8817e4Smiod       break;
465*3d8817e4Smiod 
466*3d8817e4Smiod     case IT_hs_CODE:
467*3d8817e4Smiod       {
468*3d8817e4Smiod 	struct IT_hs dummy;
469*3d8817e4Smiod 	sysroff_swap_hs_in (&dummy);
470*3d8817e4Smiod 	sysroff_print_hs_out (&dummy);
471*3d8817e4Smiod       }
472*3d8817e4Smiod       break;
473*3d8817e4Smiod 
474*3d8817e4Smiod     case IT_dps_CODE:
475*3d8817e4Smiod       {
476*3d8817e4Smiod 	struct IT_dps dummy;
477*3d8817e4Smiod 	sysroff_swap_dps_in (&dummy);
478*3d8817e4Smiod 	sysroff_print_dps_out (&dummy);
479*3d8817e4Smiod       }
480*3d8817e4Smiod       break;
481*3d8817e4Smiod 
482*3d8817e4Smiod     case IT_tr_CODE:
483*3d8817e4Smiod       sysroff_swap_tr_in ();
484*3d8817e4Smiod       sysroff_print_tr_out ();
485*3d8817e4Smiod       break;
486*3d8817e4Smiod 
487*3d8817e4Smiod     case IT_dds_CODE:
488*3d8817e4Smiod       {
489*3d8817e4Smiod 	struct IT_dds dummy;
490*3d8817e4Smiod 
491*3d8817e4Smiod 	sysroff_swap_dds_in (&dummy);
492*3d8817e4Smiod 	sysroff_print_dds_out (&dummy);
493*3d8817e4Smiod       }
494*3d8817e4Smiod       break;
495*3d8817e4Smiod 
496*3d8817e4Smiod     default:
497*3d8817e4Smiod       printf ("GOT A %x\n", c);
498*3d8817e4Smiod       return 0;
499*3d8817e4Smiod       break;
500*3d8817e4Smiod     }
501*3d8817e4Smiod 
502*3d8817e4Smiod   return 1;
503*3d8817e4Smiod }
504*3d8817e4Smiod 
505*3d8817e4Smiod static int
opt(int x)506*3d8817e4Smiod opt (int x)
507*3d8817e4Smiod {
508*3d8817e4Smiod   return getone (x);
509*3d8817e4Smiod }
510*3d8817e4Smiod 
511*3d8817e4Smiod static void
must(int x)512*3d8817e4Smiod must (int x)
513*3d8817e4Smiod {
514*3d8817e4Smiod   if (!getone (x))
515*3d8817e4Smiod     printf ("WANTED %x!!\n", x);
516*3d8817e4Smiod }
517*3d8817e4Smiod 
518*3d8817e4Smiod static void
tab(int i,char * s)519*3d8817e4Smiod tab (int i, char *s)
520*3d8817e4Smiod {
521*3d8817e4Smiod   indent += i;
522*3d8817e4Smiod 
523*3d8817e4Smiod   if (s)
524*3d8817e4Smiod     {
525*3d8817e4Smiod       p ();
526*3d8817e4Smiod       printf (s);
527*3d8817e4Smiod       printf ("\n");
528*3d8817e4Smiod     }
529*3d8817e4Smiod }
530*3d8817e4Smiod 
531*3d8817e4Smiod static void
dump_symbol_info(void)532*3d8817e4Smiod dump_symbol_info (void)
533*3d8817e4Smiod {
534*3d8817e4Smiod   tab (1, "SYMBOL INFO");
535*3d8817e4Smiod 
536*3d8817e4Smiod   while (opt (IT_dsy_CODE))
537*3d8817e4Smiod     {
538*3d8817e4Smiod       if (opt (IT_dty_CODE))
539*3d8817e4Smiod 	{
540*3d8817e4Smiod 	  must (IT_dbt_CODE);
541*3d8817e4Smiod 	  derived_type ();
542*3d8817e4Smiod 	  must (IT_dty_CODE);
543*3d8817e4Smiod 	}
544*3d8817e4Smiod     }
545*3d8817e4Smiod 
546*3d8817e4Smiod   tab (-1, "");
547*3d8817e4Smiod }
548*3d8817e4Smiod 
549*3d8817e4Smiod static void
derived_type(void)550*3d8817e4Smiod derived_type (void)
551*3d8817e4Smiod {
552*3d8817e4Smiod   tab (1, "DERIVED TYPE");
553*3d8817e4Smiod 
554*3d8817e4Smiod   while (1)
555*3d8817e4Smiod     {
556*3d8817e4Smiod       if (opt (IT_dpp_CODE))
557*3d8817e4Smiod 	{
558*3d8817e4Smiod 	  dump_symbol_info ();
559*3d8817e4Smiod 	  must (IT_dpp_CODE);
560*3d8817e4Smiod 	}
561*3d8817e4Smiod       else if (opt (IT_dfp_CODE))
562*3d8817e4Smiod 	{
563*3d8817e4Smiod 	  dump_symbol_info ();
564*3d8817e4Smiod 	  must (IT_dfp_CODE);
565*3d8817e4Smiod 	}
566*3d8817e4Smiod       else if (opt (IT_den_CODE))
567*3d8817e4Smiod 	{
568*3d8817e4Smiod 	  dump_symbol_info ();
569*3d8817e4Smiod 	  must (IT_den_CODE);
570*3d8817e4Smiod 	}
571*3d8817e4Smiod       else if (opt (IT_den_CODE))
572*3d8817e4Smiod 	{
573*3d8817e4Smiod 	  dump_symbol_info ();
574*3d8817e4Smiod 	  must (IT_den_CODE);
575*3d8817e4Smiod 	}
576*3d8817e4Smiod       else if (opt (IT_dds_CODE))
577*3d8817e4Smiod 	{
578*3d8817e4Smiod 	  dump_symbol_info ();
579*3d8817e4Smiod 	  must (IT_dds_CODE);
580*3d8817e4Smiod 	}
581*3d8817e4Smiod       else if (opt (IT_dar_CODE))
582*3d8817e4Smiod 	{
583*3d8817e4Smiod 	}
584*3d8817e4Smiod       else if (opt (IT_dpt_CODE))
585*3d8817e4Smiod 	{
586*3d8817e4Smiod 	}
587*3d8817e4Smiod       else if (opt (IT_dul_CODE))
588*3d8817e4Smiod 	{
589*3d8817e4Smiod 	}
590*3d8817e4Smiod       else if (opt (IT_dse_CODE))
591*3d8817e4Smiod 	{
592*3d8817e4Smiod 	}
593*3d8817e4Smiod       else if (opt (IT_dot_CODE))
594*3d8817e4Smiod 	{
595*3d8817e4Smiod 	}
596*3d8817e4Smiod       else
597*3d8817e4Smiod 	break;
598*3d8817e4Smiod     }
599*3d8817e4Smiod 
600*3d8817e4Smiod   tab (-1, "");
601*3d8817e4Smiod }
602*3d8817e4Smiod 
603*3d8817e4Smiod static void
module(void)604*3d8817e4Smiod module (void)
605*3d8817e4Smiod {
606*3d8817e4Smiod   int c = 0;
607*3d8817e4Smiod   int l = 0;
608*3d8817e4Smiod 
609*3d8817e4Smiod   tab (1, "MODULE***\n");
610*3d8817e4Smiod 
611*3d8817e4Smiod   do
612*3d8817e4Smiod     {
613*3d8817e4Smiod       c = getc (file);
614*3d8817e4Smiod       ungetc (c, file);
615*3d8817e4Smiod 
616*3d8817e4Smiod       c &= 0x7f;
617*3d8817e4Smiod     }
618*3d8817e4Smiod   while (getone (c) && c != IT_tr_CODE);
619*3d8817e4Smiod 
620*3d8817e4Smiod   tab (-1, "");
621*3d8817e4Smiod 
622*3d8817e4Smiod   c = getc (file);
623*3d8817e4Smiod   while (c != EOF)
624*3d8817e4Smiod     {
625*3d8817e4Smiod       printf ("%02x ", c);
626*3d8817e4Smiod       l++;
627*3d8817e4Smiod       if (l == 32)
628*3d8817e4Smiod 	{
629*3d8817e4Smiod 	  printf ("\n");
630*3d8817e4Smiod 	  l = 0;
631*3d8817e4Smiod 	}
632*3d8817e4Smiod       c = getc (file);
633*3d8817e4Smiod     }
634*3d8817e4Smiod }
635*3d8817e4Smiod 
636*3d8817e4Smiod char *program_name;
637*3d8817e4Smiod 
638*3d8817e4Smiod static void
show_usage(FILE * file,int status)639*3d8817e4Smiod show_usage (FILE *file, int status)
640*3d8817e4Smiod {
641*3d8817e4Smiod   fprintf (file, _("Usage: %s [option(s)] in-file\n"), program_name);
642*3d8817e4Smiod   fprintf (file, _("Print a human readable interpretation of a SYSROFF object file\n"));
643*3d8817e4Smiod   fprintf (file, _(" The options are:\n\
644*3d8817e4Smiod   -h --help        Display this information\n\
645*3d8817e4Smiod   -v --version     Print the program's version number\n"));
646*3d8817e4Smiod 
647*3d8817e4Smiod   if (status == 0)
648*3d8817e4Smiod     fprintf (file, _("Report bugs to %s\n"), REPORT_BUGS_TO);
649*3d8817e4Smiod   exit (status);
650*3d8817e4Smiod }
651*3d8817e4Smiod 
652*3d8817e4Smiod int
main(int ac,char ** av)653*3d8817e4Smiod main (int ac, char **av)
654*3d8817e4Smiod {
655*3d8817e4Smiod   char *input_file = NULL;
656*3d8817e4Smiod   int opt;
657*3d8817e4Smiod   static struct option long_options[] =
658*3d8817e4Smiod   {
659*3d8817e4Smiod     {"help", no_argument, 0, 'h'},
660*3d8817e4Smiod     {"version", no_argument, 0, 'V'},
661*3d8817e4Smiod     {NULL, no_argument, 0, 0}
662*3d8817e4Smiod   };
663*3d8817e4Smiod 
664*3d8817e4Smiod #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
665*3d8817e4Smiod   setlocale (LC_MESSAGES, "");
666*3d8817e4Smiod #endif
667*3d8817e4Smiod #if defined (HAVE_SETLOCALE)
668*3d8817e4Smiod   setlocale (LC_CTYPE, "");
669*3d8817e4Smiod #endif
670*3d8817e4Smiod   bindtextdomain (PACKAGE, LOCALEDIR);
671*3d8817e4Smiod   textdomain (PACKAGE);
672*3d8817e4Smiod 
673*3d8817e4Smiod   program_name = av[0];
674*3d8817e4Smiod   xmalloc_set_program_name (program_name);
675*3d8817e4Smiod 
676*3d8817e4Smiod   expandargv (&ac, &av);
677*3d8817e4Smiod 
678*3d8817e4Smiod   while ((opt = getopt_long (ac, av, "HhVv", long_options, (int *) NULL)) != EOF)
679*3d8817e4Smiod     {
680*3d8817e4Smiod       switch (opt)
681*3d8817e4Smiod 	{
682*3d8817e4Smiod 	case 'H':
683*3d8817e4Smiod 	case 'h':
684*3d8817e4Smiod 	  show_usage (stdout, 0);
685*3d8817e4Smiod 	  /*NOTREACHED*/
686*3d8817e4Smiod 	case 'v':
687*3d8817e4Smiod 	case 'V':
688*3d8817e4Smiod 	  print_version ("sysdump");
689*3d8817e4Smiod 	  exit (0);
690*3d8817e4Smiod 	  /*NOTREACHED*/
691*3d8817e4Smiod 	case 0:
692*3d8817e4Smiod 	  break;
693*3d8817e4Smiod 	default:
694*3d8817e4Smiod 	  show_usage (stderr, 1);
695*3d8817e4Smiod 	  /*NOTREACHED*/
696*3d8817e4Smiod 	}
697*3d8817e4Smiod     }
698*3d8817e4Smiod 
699*3d8817e4Smiod   /* The input and output files may be named on the command line.  */
700*3d8817e4Smiod 
701*3d8817e4Smiod   if (optind < ac)
702*3d8817e4Smiod     input_file = av[optind];
703*3d8817e4Smiod 
704*3d8817e4Smiod   if (!input_file)
705*3d8817e4Smiod     fatal (_("no input file specified"));
706*3d8817e4Smiod 
707*3d8817e4Smiod   file = fopen (input_file, FOPEN_RB);
708*3d8817e4Smiod 
709*3d8817e4Smiod   if (!file)
710*3d8817e4Smiod     fatal (_("cannot open input file %s"), input_file);
711*3d8817e4Smiod 
712*3d8817e4Smiod   module ();
713*3d8817e4Smiod   return 0;
714*3d8817e4Smiod }
715