NASM 0.94
[nasm.git] / rdoff / rdfdump.c
blobbc55a97487696e18cc1ec47ef7c76596c0999b94
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
5 FILE *infile;
7 long translatelong(long in) { /* translate from little endian to
8 local representation */
9 long r;
10 unsigned char *i;
12 i = (unsigned char *)&in;
13 r = i[3];
14 r = (r << 8) + i[2];
15 r = (r << 8) + i[1];
16 r = (r << 8) + *i;
18 return r;
21 int translateshort(short in) {
22 int r;
23 unsigned char *i;
25 i = (unsigned char *)&in;
26 r = (i[1] << 8) + *i;
28 return r;
30 void print_header(long length) {
31 char buf[129],t,s,l;
32 long o,ll;
33 short rs;
35 while (length > 0) {
36 fread(&t,1,1,infile);
37 switch(t) {
38 case 1: /* relocation record */
39 fread(&s,1,1,infile);
40 fread(&o,4,1,infile);
41 fread(&l,1,1,infile);
42 fread(&rs,2,1,infile);
43 printf(" relocation: location (%04x:%08lx), length %d, "
44 "referred seg %04x\n",(int)s,translatelong(o),(int)l,
45 translateshort(rs));
46 length -= 9;
47 break;
48 case 2: /* import record */
49 fread(&rs,2,1,infile);
50 ll = 0;
51 do {
52 fread(&buf[ll],1,1,infile);
53 } while (buf[ll++]);
54 printf(" import: segment %04x = %s\n",translateshort(rs),buf);
55 length -= ll + 3;
56 break;
57 case 3: /* export record */
58 fread(&s,1,1,infile);
59 fread(&o,4,1,infile);
60 l = 0;
61 do {
62 fread(&buf[ll],1,1,infile);
63 } while (buf[ll++]);
64 printf(" export: (%04x:%08lx) = %s\n",(int)s,translatelong(o),buf);
65 length -= ll + 6;
66 break;
67 case 4: /* DLL record */
68 l = 0;
69 do {
70 fread(&buf[ll],1,1,infile);
71 } while (buf[ll++]);
72 printf(" dll: %s\n",buf);
73 length -= ll + 1;
74 break;
75 case 5: /* BSS reservation */
76 fread(&ll,4,1,infile);
77 printf(" bss reservation: %08lx bytes\n",translatelong(ll));
78 length -= 5;
79 break;
80 default:
81 printf(" unrecognised record (type %d)\n",(int)t);
82 length --;
87 int main(int argc,char **argv) {
88 char id[7];
89 long l;
90 int verbose = 0;
92 puts("RDOFF Dump utility v1.1 (C) Copyright 1996 Julian R Hall");
94 if (argc < 2) {
95 fputs("Usage: rdfdump [-v] <filename>\n",stderr);
96 exit(1);
99 if (! strcmp (argv[1], "-v") )
101 verbose = 1;
102 if (argc < 3)
104 fputs("required parameter missing\n",stderr);
105 exit(1);
107 argv++;
110 infile = fopen(argv[1],"rb");
111 if (! infile) {
112 fprintf(stderr,"rdfdump: Could not open %s",argv[1]);
113 exit(1);
116 fread(id,6,1,infile);
117 if (strncmp(id,"RDOFF",5)) {
118 fputs("rdfdump: File does not contain valid RDOFF header\n",stderr);
119 exit(1);
122 printf("File %s: RDOFF version %c\n\n",argv[1],id[5]);
123 if (id[5] < '1' || id[5] > '1') {
124 fprintf(stderr,"rdfdump: unknown RDOFF version '%c'\n",id[5]);
125 exit(1);
128 fread(&l,4,1,infile);
129 l = translatelong(l);
130 printf("Header (%ld bytes):\n",l);
131 print_header(l);
133 fread(&l,4,1,infile);
134 l = translatelong(l);
135 printf("\nText segment length = %ld bytes\n",l);
136 while(l--) {
137 fread(id,1,1,infile);
138 if (verbose) printf(" %02x",(int) (unsigned char)id[0]);
140 if (verbose) printf("\n\n");
142 fread(&l,4,1,infile);
143 l = translatelong(l);
144 printf("Data segment length = %ld bytes\n",l);
146 if (verbose)
148 while (l--) {
149 fread(id,1,1,infile);
150 printf(" %02x",(int) (unsigned char) id[0]);
152 printf("\n");
154 fclose(infile);
155 return 0;