cvs commit: src/usr.bin/rev

Liam J. Foy liamfoy at sepulcrum.org
Tue Dec 14 09:32:25 PST 2004


On Mon, 2004-12-13 at 13:28 -0800, Matthew Dillon wrote:
> :Hehe. Sorry for the late reply everyone. I have been busy with bits
> :and bobs. Sorry everyone about the mistake I made. I think
> :- Hide quoted text -
> :
> :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       13 Dec 2004 18:53:33 -0000
> :@@ -90,7 +90,9 @@
> :                       clearerr(fp);
> :                       rval = 1;
> :               }
> :-               ++argv;
> :+               if (argv != NULL)
> :+                       ++argv;
> :+
> :               fclose(fp);
> :       } while (*argv);
> :       exit(rval);
> :
> :will fix it correct? thanks to tomokazu for noticing it.
> :
> :Cheers,
> :
> :-- 
> :Liam J. Foy
> 
>     Why don't you get rid of the do {...} while entirely and just make it
>     a standard for() loop, with a 0-argument check for stdin and make
>     the fgetln() loop its own procedure that you simply pass a FILE *
>     into.  The original code was very badly written.
> 
>     e.g.
> 
>     for (i = 1; i < argc; ++i) {
> 	if ((fp = fopen ...) != NULL ) {
> 	    dofile(fp);
> 	    fclose(fp);
> 	} else {
> 	    warn ...
> 	}
>     }
>     if (argc == 1)
> 	dofile(stdin);
> 
>     dofile(FILE *fp) 
>     {
> 	...
>     }
> 
> 					-Matt
> 					Matthew Dillon 
> 					<dillon at xxxxxxxxxxxxx>

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);
 }
 
 static void
@@ -102,3 +85,28 @@
 	fprintf(stderr, "usage: rev [file ...]\n");
 	exit(1);
 }
+
+static int 
+dorev(FILE *fp, const char *filepath)
+{
+	const char *p, *t;
+	size_t len;
+	
+	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", filepath);
+		/* Reset error indicator */
+		clearerr(fp);
+		return (1);
+	}
+
+	return (0);
+}

Cheers,

-- 
Liam J. Foy
<liamfoy at xxxxxxxxxxxxx>
Say it in the living years...






More information about the Commits mailing list