cvs commit: src/usr.bin/rev

Jason Smethers jason at smethers.net
Tue Dec 14 13:42:36 PST 2004


Liam J. Foy wrote:
Hey guys. Regarding Joerg/Matt suggestion, I have re-wrote most of rev.
I have changed a few minor things however. Joerg has seen this and is ok
with it. If anyone can see any problems, please write back. If no
problems are noticed I will most likely commit it later tonight.
Patch:

Index: Makefile
===================================================================
RCS file: /home/dcvs/src/usr.bin/rev/Makefile,v
retrieving revision 1.1
diff -u -r1.1 Makefile
--- Makefile	17 Jun 2003 02:56:25 -0000	1.1
+++ Makefile	13 Dec 2004 22:25:53 -0000
@@ -2,4 +2,5 @@
 
 PROG=	rev
 
+WARNS?=	6
 .include <bsd.prog.mk>
Index: rev.c
===================================================================
RCS file: /home/dcvs/src/usr.bin/rev/rev.c,v
retrieving revision 1.5
diff -u -r1.5 rev.c
--- rev.c	13 Dec 2004 17:43:57 -0000	1.5
+++ rev.c	14 Dec 2004 17:16:07 -0000
@@ -38,21 +38,20 @@
 #include <sys/types.h>
 
 #include <err.h>
-#include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
 #include <unistd.h>
 
 static void	usage(void);
+static int	dorev(FILE *, const char *);
 
 int
 main(int argc, char **argv)
 {
-	const char *p, *t;
 	FILE *fp;
-	size_t len;
-	int ch, rval;
+	int ch, i, rval;
+
+	rval = 0;
 
 	while ((ch = getopt(argc, argv, "")) != -1)
 		switch(ch) {
@@ -64,36 +63,20 @@
 	argc -= optind;
 	argv += optind;
 
-	fp = stdin;
-	rval = 0;
-	do {
-		if (*argv) {
-			if ((fp = fopen(*argv, "r")) == NULL) {
-				warn("%s", *argv);
-				rval = 1;
-				++argv;
-				continue;
-			}
-		}
+	if (argc == 0)
+		rval += dorev(stdin, "stdin");
 
-		while ((p = fgetln(fp, &len)) != NULL) {
-			if (p[len - 1] == '\n')
-				--len;
-			t = p + len - 1;
-			for (t = p + len - 1; t >= p; --t)
-				putchar(*t);
-			putchar('\n');
-		}
-		if (ferror(fp)) {
-			warn("%s", *argv);
-			/* Reset error indicator */
-			clearerr(fp);
-			rval = 1;
+	for (i = 0; i < argc; ++i) {
+		if ((fp = fopen(argv[i], "r")) != NULL) {
+			rval += dorev(fp, argv[i]);
+			fclose(fp);
+		} else {
+			warn("failed to open %s", argv[i]);
+			rval++ ;
 		}
-		++argv;
-		fclose(fp);
-	} while (*argv);
-	exit(rval);
+	}
+
+	exit(rval != 0 ? 1 : 0);
 }
Why not simply use a return statement to exit main()? How antiquated a 
system do we expect the code in the project to run on? What systems out 
there don't support the functionality of exiting the program with a 
return statement instead of a call to exit()?

Second, OR'ing instead of adding the value returned by dorev() will 
achieve the functionality you want without doing any tests.

- Jason





More information about the Commits mailing list