Hi,
Jan Stary wrote on Thu, Jan 10, 2019 at 09:30:19PM +0100:
> Does comm(1) need to setlocale(3)?
schwarze@cvs $ grep -A 2 '\<comm\>' ~/TODO-UTF8.txt
comm - character case folding (non-standard '-f' flag)
[requires wcscasecmp(3)]
So yes, it does need setlocale(LC_CTYPE, ""),
and no, this diff is not OK.
It would merely hide an open TODO item.
Yours,
Ingo
> It uses strcoll(3) by default, which ignores the locale
> and does what strcmp(3) does, or strcasecmp(3) with -f,
> which ignores the locale too.
>
> So remove the setlocale(3), remove the header,
> the LC_ that have been commented out since the initial revision in 1995,
> and just use strcmp(3) or strcasecmp(3).
>
> Jan
>
>
>
> Index: comm.1
> ===================================================================
> RCS file: /cvs/src/usr.bin/comm/comm.1,v
> retrieving revision 1.15
> diff -u -p -r1.15 comm.1
> --- comm.1 3 Sep 2010 11:09:28 -0000 1.15
> +++ comm.1 10 Jan 2019 20:24:35 -0000
> @@ -83,14 +83,6 @@ printed in column number three will have
> .Nm
> assumes that the files are lexically sorted; all characters
> participate in line comparisons.
> -.\" .Sh ENVIRONMENT
> -.\" .Bl -tag -width indent
> -.\" .It Ev LANG
> -.\" .It Ev LC_ALL
> -.\" .It Ev LC_CTYPE
> -.\" .It Ev LC_COLLATE
> -.\" .It Ev LC_MESSAGES
> -.\" .El
> .Sh EXIT STATUS
> .Ex -std comm
> .Sh SEE ALSO
> Index: comm.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/comm/comm.c,v
> retrieving revision 1.10
> diff -u -p -r1.10 comm.c
> --- comm.c 9 Oct 2015 01:37:07 -0000 1.10
> +++ comm.c 10 Jan 2019 20:24:35 -0000
> @@ -35,7 +35,6 @@
>
> #include <err.h>
> #include <limits.h>
> -#include <locale.h>
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> @@ -59,13 +58,11 @@ main(int argc, char *argv[])
> char **p, line1[MAXLINELEN], line2[MAXLINELEN];
> int (*compare)(const char * ,const char *);
>
> - setlocale(LC_ALL, "");
> -
> if (pledge("stdio rpath", NULL) == -1)
> err(1, "pledge");
>
> flag1 = flag2 = flag3 = 1;
> - compare = strcoll;
> + compare = strcmp;
> while ((ch = getopt(argc, argv, "123f")) != -1)
> switch(ch) {
> case '1':
>