On 10/18/18 16:51, Martijn van Duren wrote:
> When reviewing otto@'s diff I found the following, which was also part
> of the r1.4 import. I managed to contact michaels and he told me that he
> couldn't recollect anything other then what was in the commit message
> and other local changes were most likely not intentional.
>
> I tested this behaviour with FreeBSD, NetBSD, gjoin and with csrg join
> prior to the current structure and the firs 3 all include a link on join
> and the latter segfaults if the join field is not available.
>
> POSIX doesn't mention how the code should work if a particular field is
> not available, so we get no guidance from there.
>
> Personally I think our current behaviour is more logical, most likely
> because I'm used to SQL joins, but considering no one else does it it
> might be wise to get back into the fold.
>
> Note that this still is in line with fixing PR-1356 and the other BSDs
> need to swap the return 1 and return -1 case to make things work on
> their versions of join.
And for the kids playing along at home, this works better with the
test files included:
$ cat /tmp/z1
a
b d
$ cat /tmp/z2
a
c d
>
> $ join -j 2 -e empty /tmp/z1 /tmp/z2
> d b c
> $ ./obj/join -j 2 -e empty /tmp/z1 /tmp/z2
> empty a a
> d b c
>
> thoughts?
>
> martijn@
>
> Index: join.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/join/join.c,v
> retrieving revision 1.29
> diff -u -p -r1.29 join.c
> --- join.c 18 Oct 2018 09:36:48 -0000 1.29
> +++ join.c 18 Oct 2018 14:43:10 -0000
> @@ -362,10 +362,10 @@ int
> cmp(LINE *lp1, u_long fieldno1, LINE *lp2, u_long fieldno2)
> {
> if (lp1->fieldcnt <= fieldno1)
> - return (-1);
> - else if (lp2->fieldcnt <= fieldno2)
> - return (1);
> - return (strcmp(lp1->fields[fieldno1], lp2->fields[fieldno2]));
> + return lp2->fieldcnt <= fieldno2 ? 0 : -1;
> + if (lp2->fieldcnt <= fieldno2)
> + return 1;
> + return strcmp(lp1->fields[fieldno1], lp2->fields[fieldno2]);
> }
>
> void
>