shithub: scc

Download patch

ref: 248895ea200d3cc2865fea1e87265f196a0fe218
parent: 8e4d55811b9f52d2f8439a2507321f792c33b69f
author: Roberto E. Vargas Caballero <[email protected]>
date: Tue Nov 28 03:48:36 EST 2017

[objdump] Create dump() function and use a.out as default file name

--- a/objdump/Makefile
+++ b/objdump/Makefile
@@ -11,7 +11,7 @@
 objdump: $(OBJ) $(LIBDIR)/libscc.a
 	$(CC) $(SCC_LDFLAGS) $(OBJ) -lscc -o $@
 
-main.o: ../inc/scc.h ../inc/myro.h
+main.o: ../inc/scc.h ../inc/myro.h ../inc/arg.h
 
 $(LIBDIR)/libscc.a: $(LIB-OBJ)
 	cd $(LIBDIR) && $(MAKE)
--- a/objdump/main.c
+++ b/objdump/main.c
@@ -6,11 +6,13 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include "../inc/arg.h"
 #include "../inc/scc.h"
 #include "../inc/myro.h"
 
-char *strings;
-size_t strsiz;
+char *argv0;
+static char *strings;
+static size_t strsiz;
 
 static char *
 getstring(unsigned long off)
@@ -176,57 +178,75 @@
 	return (ferror(fp)) ? -1 : 0;
 }
 
-int
-main(int argc, char *argv[])
+void
+dump(char *fname)
 {
 	FILE *fp;
 	struct myrohdr hdr;
 
-	while (*++argv) {
-		free(strings);
-		strings = NULL;
+	puts(fname);
+	if ((fp = fopen(fname, "rb")) == NULL)
+		goto wrong_file;
+	if (rdmyrohdr(fp, &hdr) < 0)
+		goto wrong_file;
+	if (hdr.strsize > SIZE_MAX) {
+		fprintf(stderr,
+			"objdump: %s: overflow in header\n",
+			fname, strerror(errno));
+			goto close_file;
+	}
+	strsiz = hdr.strsize;
 
-		puts(*argv);
-
-		if ((fp = fopen(*argv, "rb")) == NULL)
+	if (strsiz > 0) {
+		strings = xmalloc(strsiz);
+		fread(strings, strsiz, 1, fp);
+		if (feof(fp))
 			goto wrong_file;
-		if (rdmyrohdr(fp, &hdr) < 0)
-			goto wrong_file;
-		if (hdr.strsize > SIZE_MAX) {
-			fprintf(stderr,
-				"objdump: %s: overflow in header\n",
-				*argv, strerror(errno));
-				goto close_file;
-		}
-		strsiz = hdr.strsize;
+	}
 
-		if (strsiz > 0) {
-			strings = xmalloc(strsiz);
-			fread(strings, strsiz, 1, fp);
-			if (feof(fp))
-				goto wrong_file;
-		}
+	printhdr(&hdr);
+	printstrings(&hdr);
+	if (printsections(&hdr, fp) < 0)
+		goto wrong_file;
+	if (printsymbols(&hdr, fp) < 0)
+		goto wrong_file;
+	if (printrelocs(&hdr, fp) < 0)
+		goto wrong_file;
+	if (printdata(&hdr, fp) < 0)
+		goto wrong_file;
 
-		printhdr(&hdr);
-		printstrings(&hdr);
-		if (printsections(&hdr, fp) < 0)
-			goto wrong_file;
-		if (printsymbols(&hdr, fp) < 0)
-			goto wrong_file;
-		if (printrelocs(&hdr, fp) < 0)
-			goto wrong_file;
-		if (printdata(&hdr, fp) < 0)
-			goto wrong_file;
+	goto close_file;
 
-		goto close_file;
-		
 wrong_file:
-		fprintf(stderr,
-			"objdump: %s: %s\n",
-			*argv, strerror(errno));
+	fprintf(stderr,
+		"objdump: %s: %s\n",
+		fname, strerror(errno));
 close_file:
-		if (fp)
-			fclose(fp);
+	if (fp)
+		fclose(fp);
+}
+
+void
+usage(void)
+{
+	fputs("usage: objdump file ...\n", stderr);
+	exit(1);
+}
+
+int
+main(int argc, char *argv[])
+{
+	ARGBEGIN {
+	default:
+		usage();
+	} ARGEND
+
+	if (argc == 1)
+		dump("a.out");
+	else while (*++argv) {
+		free(strings);
+		strings = NULL;
+		dump(*argv);
 	}
 
 	return 0;