[hackers] [sbase] Audit cmp(1) || FRIGN

From: <git_AT_suckless.org>
Date: Wed, 11 Mar 2015 13:42:34 +0100 (CET)

commit 6cc6ede06ef4ac08dd1e911c26c7cc61a3e1a340
Author: FRIGN <dev_AT_frign.de>
Date: Wed Mar 11 11:16:40 2015 +0100

    Audit cmp(1)
    
    1) Remove the return-value-enum, which is not necessary for a simple
       program like this.
    2) Don't disallow both l and s to be specified. This is undefined
       behaviour defined by POSIX, so we don't start demanding things
       from the user.
    3) Replace exit() with return (we are in main).
    4) Refactor main loop to never return in the loop, but actually
       set the same-value and break, which increases readability.
    5) Remove the final fclose()'s. The OS will take care of them, no
       need to become cleansy here.
    6) Use idiomatic return-value using same. This concludes the
       increase of readability in the main-loop.

diff --git a/README b/README
index f5a17bb..132287b 100644
--- a/README
+++ b/README
_AT_@ -17,7 +17,7 @@ The following tools are implemented ('*' == finished, '#' == UTF-8 support,
 =*| chown yes none
 =*| chroot non-posix none
 =*| cksum yes none
-=* cmp yes none
+=*| cmp yes none
 #*| cols non-posix none
     col yes none
 =* comm yes none
diff --git a/cmp.c b/cmp.c
index 9d9f41e..1e48c52 100644
--- a/cmp.c
+++ b/cmp.c
_AT_@ -4,12 +4,10 @@
 
 #include "util.h"
 
-enum { Same = 0, Diff = 1, Error = 2 };
-
 static void
 usage(void)
 {
- enprintf(Error, "usage: %s [-l | -s] file1 file2\n", argv0);
+ enprintf(2, "usage: %s [-l | -s] file1 file2\n", argv0);
 }
 
 int
_AT_@ -30,7 +28,7 @@ main(int argc, char *argv[])
                 usage();
         } ARGEND;
 
- if (argc != 2 || (lflag && sflag))
+ if (argc != 2)
                 usage();
 
         for (n = 0; n < 2; n++) {
_AT_@ -38,11 +36,10 @@ main(int argc, char *argv[])
                         argv[n] = "<stdin>";
                         fp[n] = stdin;
                 } else {
- fp[n] = fopen(argv[n], "r");
- if (!fp[n]) {
+ if (!(fp[n] = fopen(argv[n], "r"))) {
                                 if (!sflag)
                                         weprintf("fopen %s:", argv[n]);
- exit(Error);
+ return 2;
                         }
                 }
         }
_AT_@ -57,25 +54,22 @@ main(int argc, char *argv[])
                         else if (b[0] == '\n')
                                 line++;
                         continue;
- }
- if (b[0] == EOF || b[1] == EOF) {
+ } else if (b[0] == EOF || b[1] == EOF) {
                         if (!sflag)
- fprintf(stderr, "cmp: EOF on %s\n",
- argv[(b[0] == EOF) ? 0 : 1]);
- exit(Diff);
- }
- if (!lflag) {
+ weprintf("cmp: EOF on %s\n", argv[(b[0] != EOF)]);
+ same = 0;
+ break;
+ } else if (!lflag) {
                         if (!sflag)
- printf("%s %s differ: byte %ld, line %ld\n",
+ printf("%s %s differ: byte %zu, line %zu\n",
                                        argv[0], argv[1], n, line);
- exit(Diff);
+ same = 0;
+ break;
                 } else {
- printf("%ld %o %o\n", n, b[0], b[1]);
+ printf("%zu %o %o\n", n, b[0], b[1]);
                         same = 0;
                 }
         }
- fclose(fp[0]);
- fclose(fp[1]);
 
- return same ? Same : Diff;
+ return !same;
 }
Received on Wed Mar 11 2015 - 13:42:34 CET

This archive was generated by hypermail 2.3.0 : Wed Mar 11 2015 - 13:48:16 CET