scc-dump.c - scc - simple c99 compiler
(HTM) git clone git://git.simple-cc.org/scc
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Submodules
(DIR) README
(DIR) LICENSE
---
scc-dump.c (1245B)
---
1 #include <errno.h>
2 #include <stdarg.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6
7 #include <scc/arg.h>
8 #include <scc/mach.h>
9
10 char *argv0;
11 static char *filename;
12 static int status;
13
14 static void
15 error(char *fmt, ...)
16 {
17 va_list va;
18
19 va_start(va, fmt);
20 fprintf(stderr, "objdump: %s: ", filename);
21 vfprintf(stderr, fmt, va);
22 putc('\n', stderr);
23 va_end(va);
24
25 status = EXIT_FAILURE;
26 }
27
28 /*
29 * TODO: Dummy implementation used only in the assembler tests
30 */
31 static void
32 dump(char *fname)
33 {
34 int c, n;
35 FILE *fp;
36
37 filename = fname;
38 if ((fp = fopen(fname, "rb")) == NULL) {
39 error("%s", strerror(errno));
40 return;
41 }
42
43 puts("data:");
44 for (n = 1; (c = getc(fp)) != EOF; n++)
45 printf("%02X%c", c, (n%16 == 0) ? '\n' : ' ');
46 if (n%16 != 0)
47 putchar('\n');
48
49 if (ferror(fp))
50 error("%s", strerror(errno));
51
52 fclose(fp);
53 }
54
55 static void
56 usage(void)
57 {
58 fputs("usage: objdump file ...\n", stderr);
59 exit(1);
60 }
61
62 int
63 main(int argc, char *argv[])
64 {
65 ARGBEGIN {
66 default:
67 usage();
68 } ARGEND
69
70 if (argc == 0)
71 dump("a.out");
72 else while (*argv) {
73 dump(*argv++);
74 }
75
76 if (fclose(stdout) == EOF) {
77 fprintf(stderr,
78 "objdump: writing output: %s\n",
79 strerror(errno));
80 return EXIT_FAILURE;
81 }
82
83 return status;
84 }