commit ac62259d242d7e54a2006140e863e9851fedcccb
Author:     Wolfgang Corcoran-Mathe <first.lord.of.t...@gmail.com>
AuthorDate: Mon Aug 3 15:30:35 2015 -0400
Commit:     sin <s...@2f30.org>
CommitDate: Tue Aug 4 12:35:44 2015 +0100

    comm: Print first trailing unpaired line in file 1
    
    Previously, a line read from file 1 before a strcmp was
    performed would be overwritten and lost. Something like
    this:
    
        comm one_line_file empty_file
    
    produced no output.
    
    This patch is a bit inelegant, but quite simple.

diff --git a/comm.c b/comm.c
index e0ec7b7..138b5ea 100644
--- a/comm.c
+++ b/comm.c
@@ -33,7 +33,7 @@ main(int argc, char *argv[])
 {
        FILE *fp[2];
        size_t linelen[2] = { 0, 0 };
-       int ret = 0, i, diff = 0;
+       int ret = 0, i, diff = 0, seenline = 0;
        char *line[2] = { NULL, NULL };
 
        ARGBEGIN {
@@ -62,11 +62,13 @@ main(int argc, char *argv[])
                for (i = 0; i < 2; i++) {
                        if (diff && i == (diff < 0))
                                continue;
-                       if (getline(&line[i], &linelen[i], fp[i]) > 0)
+                       if (getline(&line[i], &linelen[i], fp[i]) > 0) {
+                               seenline = 1;
                                continue;
+                       }
                        if (ferror(fp[i]))
                                eprintf("getline %s:", argv[i]);
-                       if (diff && line[!i][0])
+                       if ((diff || seenline) && line[!i][0])
                                printline(!i, line[!i]);
                        while (getline(&line[!i], &linelen[!i], fp[!i]) > 0)
                                printline(!i, line[!i]);
@@ -76,6 +78,7 @@ main(int argc, char *argv[])
                }
                diff = strcmp(line[0], line[1]);
                LIMIT(diff, -1, 1);
+               seenline = 0;
                printline((2 - diff) % 3, line[MAX(0, diff)]);
        }
 end:

Reply via email to