sbase

suckless unix tools
git clone git://git.2f30.org/sbase
Log | Files | Refs | README | LICENSE

commit ac62259d242d7e54a2006140e863e9851fedcccb
parent 5dc6f3c1e672a4ddb44e2396212f40042a0dcfc2
Author: Wolfgang Corcoran-Mathe <first.lord.of.teal@gmail.com>
Date:   Mon,  3 Aug 2015 15:30:35 -0400

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.

Diffstat:
Mcomm.c | 9++++++---
1 file changed, 6 insertions(+), 3 deletions(-)

diff --git 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: