[PATCH] od: properly concatenate multiple file arguments

From: Greg Reagle <greg.reagle_AT_umbc.edu>
Date: Fri, 2 Oct 2015 10:26:04 -0400

---
 od.c | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)
diff --git a/od.c b/od.c
index 31f8179..9e382d1 100644
--- a/od.c
+++ b/od.c
_AT_@ -68,13 +68,13 @@ printchar(FILE *f, unsigned char c)
 }
 
 static void
-od(FILE *in, char *in_name, FILE *out, char *out_name)
+od(FILE *in, char *in_name, FILE *out, char *out_name, int lastarg)
 {
-	off_t addr;
+	static off_t addr = 0;
 	size_t i, chunklen;
 	unsigned char buf[BUFSIZ];
 
-	for (addr = 0; (chunklen = fread(buf, 1, BUFSIZ, in)); ) {
+	for ( ; (chunklen = fread(buf, 1, BUFSIZ, in)); ) {
 		for (i = 0; i < chunklen && (maxbytes == -1 ||
 		     (addr - skip) < maxbytes); ++i, ++addr) {
 			if (addr - skip < 0)
_AT_@ -89,11 +89,13 @@ od(FILE *in, char *in_name, FILE *out, char *out_name)
 		if (feof(in) || ferror(in) || ferror(out))
 			break;
 	}
-	if (addr - skip > 0)
-		fputc('\n', out);
-	if (radix != 'n') {
-		printaddress(out, MAX(addr, skip));
-		fputc('\n', out);
+	if (lastarg) {
+		if (addr - skip > 0)
+			fputc('\n', out);
+		if (radix != 'n') {
+			printaddress(out, MAX(addr, skip));
+			fputc('\n', out);
+		}
 	}
 }
 
_AT_@ -139,7 +141,7 @@ main(int argc, char *argv[])
 	} ARGEND;
 
 	if (!argc) {
-		od(stdin, "<stdin>", stdout, "<stdout>");
+		od(stdin, "<stdin>", stdout, "<stdout>", 1);
 	} else {
 		for (; *argv; argc--, argv++) {
 			if (!strcmp(*argv, "-")) {
_AT_@ -150,7 +152,7 @@ main(int argc, char *argv[])
 				ret = 1;
 				continue;
 			}
-			od(fp, *argv, stdout, "<stdout>");
+			od(fp, *argv, stdout, "<stdout>", *(argv + 1) ? 0 : 1);
 			if (fp != stdin && fshut(fp, *argv))
 				ret = 1;
 		}
-- 
1.9.1
--------------080308000700020208050102--
Received on Mon Sep 17 2001 - 00:00:00 CEST

This archive was generated by hypermail 2.3.0 : Fri Oct 02 2015 - 16:48:15 CEST