Does comm(1) need to setlocale(3)?

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':

Reply via email to