The functions strcasecmp, strncasecmp are provided by a single module:
'strcase'.
Similarly, the functions c_strcasecmp, c_strncasecmp are provided by a
single module: 'c-strcase'.
While this saves a little bit of module description and *.m4 code, it
has two drawbacks:
- It blurs the usual correspondence of 1 function = 1 module.
- It causes 2 compilation units to be compiled even when only one of
them is needed.
These patches straighten the situation, by creating a new module for
each of these functions. Of course, the modules 'strcase' and 'c-strcase'
remain functional, for backward compatibility.
2025-02-16 Bruno Haible <[email protected]>
c-strcasecmp, c-strncasecmp: New modules.
* modules/c-strcasecmp: New file.
* modules/c-strncasecmp: New file.
* modules/c-strcase: Merely depend on c-strcasecmp, c-strncasecmp.
* lib/strings.in.h (strcasecmp, strncasecmp): Update warning message.
* tests/test-c-strcasecmp.sh: New file, based on
tests/test-c-strcase.sh.
* tests/test-c-strncasecmp.sh: New file, based on
tests/test-c-strcase.sh.
* tests/test-c-strcase.sh: Remove file.
* modules/c-strcasecmp-tests: New file.
* modules/c-strncasecmp-tests: New file.
* modules/c-strcase-tests: Remove file.
* doc/c-strcasecmp.texi: New file, based on doc/c-strcase.texi.
* doc/c-strncasecmp.texi: New file, based on doc/c-strcase.texi.
* doc/c-strcase.texi: Remove file.
* doc/c-locale.texi: Include c-strcasecmp.texi and c-strncasecmp.texi
separately.
* modules/c-strcaseeq (Depends-on): Add c-strcasecmp. Remove c-strcase.
* modules/iconv_open (Depends-on): Likewise.
* modules/nl_langinfo-tests (Depends-on): Likewise.
* modules/propername (Depends-on): Likewise.
* modules/propername-lite (Depends-on): Likewise.
* modules/striconv (Depends-on): Likewise.
* modules/striconveh (Depends-on): Likewise.
* modules/striconveha (Depends-on): Likewise.
* modules/c-strcasestr (Depends-on): Add c-strncasecmp. Remove
c-strcase.
2025-02-16 Bruno Haible <[email protected]>
strings-h: Don't declare strcasecmp, strncasecmp without the module.
* lib/strings.in.h (strcasecmp): Don't declare if module 'strcasecmp' is
not present.
(strncasecmp): Don't declare if module 'strncasecmp' is not present.
* m4/strings_h.m4 (gl_STRINGS_H_REQUIRE_DEFAULTS): Initialize
GNULIB_STRCASECMP, GNULIB_STRNCASECMP.
* modules/strings-h (Makefile.am): Substitute GNULIB_STRCASECMP,
GNULIB_STRNCASECMP.
2025-02-16 Bruno Haible <[email protected]>
strcasecmp, strncasecmp: New modules.
* modules/strcasecmp: New file.
* modules/strncasecmp: New file.
* modules/strcase: Merely depend on strcasecmp, strncasecmp.
* m4/strcasecmp.m4: New file, based on m4/strcase.m4.
* m4/strncasecmp.m4: New file, based on m4/strcase.m4.
* m4/strcase.m4: Remove file.
* lib/strings.in.h (strcasecmp, strncasecmp): Fix typo in warning
message.
* lib/strcasecmp.c: Improve comment.
* lib/strncasecmp.c: Likewise.
* doc/posix-functions/strcasecmp.texi: Mention module strcasecmp, not
module strcase.
* doc/posix-functions/strncasecmp.texi: Mention module strncasecmp, not
module strcase.
* doc/strings.texi (Comparison of string APIs): Reference modules
strcasecmp, strncasecmp.
* modules/argp (Depends-on): Add strcasecmp. Remove strcase.
* modules/strcasestr-simple (Depends-on): Add strncasecmp. Remove
strcase.
* modules/strptime (Depends-on): Likewise.
>From b2927d1b1fa3fb09a2210a3df5691f7d48d6151b Mon Sep 17 00:00:00 2001
From: Bruno Haible <[email protected]>
Date: Sun, 16 Feb 2025 12:21:53 +0100
Subject: [PATCH 1/3] strcasecmp, strncasecmp: New modules.
* modules/strcasecmp: New file.
* modules/strncasecmp: New file.
* modules/strcase: Merely depend on strcasecmp, strncasecmp.
* m4/strcasecmp.m4: New file, based on m4/strcase.m4.
* m4/strncasecmp.m4: New file, based on m4/strcase.m4.
* m4/strcase.m4: Remove file.
* lib/strings.in.h (strcasecmp, strncasecmp): Fix typo in warning
message.
* lib/strcasecmp.c: Improve comment.
* lib/strncasecmp.c: Likewise.
* doc/posix-functions/strcasecmp.texi: Mention module strcasecmp, not
module strcase.
* doc/posix-functions/strncasecmp.texi: Mention module strncasecmp, not
module strcase.
* doc/strings.texi (Comparison of string APIs): Reference modules
strcasecmp, strncasecmp.
* modules/argp (Depends-on): Add strcasecmp. Remove strcase.
* modules/strcasestr-simple (Depends-on): Add strncasecmp. Remove
strcase.
* modules/strptime (Depends-on): Likewise.
---
ChangeLog | 24 ++++++++++++++++++++++
doc/posix-functions/strcasecmp.texi | 4 ++--
doc/posix-functions/strncasecmp.texi | 4 ++--
doc/strings.texi | 3 ++-
lib/strcasecmp.c | 2 +-
lib/strings.in.h | 8 ++++----
lib/strncasecmp.c | 2 +-
m4/strcasecmp.m4 | 21 +++++++++++++++++++
m4/{strcase.m4 => strncasecmp.m4} | 26 +++---------------------
modules/argp | 2 +-
modules/strcase | 23 +++------------------
modules/strcasecmp | 30 ++++++++++++++++++++++++++++
modules/strcasestr-simple | 2 +-
modules/strncasecmp | 30 ++++++++++++++++++++++++++++
modules/strptime | 2 +-
15 files changed, 126 insertions(+), 57 deletions(-)
create mode 100644 m4/strcasecmp.m4
rename m4/{strcase.m4 => strncasecmp.m4} (61%)
create mode 100644 modules/strcasecmp
create mode 100644 modules/strncasecmp
diff --git a/ChangeLog b/ChangeLog
index 53bb437073..37255b17ea 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,27 @@
+2025-02-16 Bruno Haible <[email protected]>
+
+ strcasecmp, strncasecmp: New modules.
+ * modules/strcasecmp: New file.
+ * modules/strncasecmp: New file.
+ * modules/strcase: Merely depend on strcasecmp, strncasecmp.
+ * m4/strcasecmp.m4: New file, based on m4/strcase.m4.
+ * m4/strncasecmp.m4: New file, based on m4/strcase.m4.
+ * m4/strcase.m4: Remove file.
+ * lib/strings.in.h (strcasecmp, strncasecmp): Fix typo in warning
+ message.
+ * lib/strcasecmp.c: Improve comment.
+ * lib/strncasecmp.c: Likewise.
+ * doc/posix-functions/strcasecmp.texi: Mention module strcasecmp, not
+ module strcase.
+ * doc/posix-functions/strncasecmp.texi: Mention module strncasecmp, not
+ module strcase.
+ * doc/strings.texi (Comparison of string APIs): Reference modules
+ strcasecmp, strncasecmp.
+ * modules/argp (Depends-on): Add strcasecmp. Remove strcase.
+ * modules/strcasestr-simple (Depends-on): Add strncasecmp. Remove
+ strcase.
+ * modules/strptime (Depends-on): Likewise.
+
2025-02-16 Bruno Haible <[email protected]>
ctype-h: Make ctype.h self-contained again (regr. 2025-02-14).
diff --git a/doc/posix-functions/strcasecmp.texi b/doc/posix-functions/strcasecmp.texi
index 2de26616b2..af640589d9 100644
--- a/doc/posix-functions/strcasecmp.texi
+++ b/doc/posix-functions/strcasecmp.texi
@@ -4,8 +4,8 @@
POSIX specification:@* @url{https://pubs.opengroup.org/onlinepubs/9799919799/functions/strcasecmp.html}
-Gnulib module: strcase
-@mindex strcase
+Gnulib module: strcasecmp
+@mindex strcasecmp
Portability problems fixed by Gnulib:
@itemize
diff --git a/doc/posix-functions/strncasecmp.texi b/doc/posix-functions/strncasecmp.texi
index 5273870215..1fc9e0307a 100644
--- a/doc/posix-functions/strncasecmp.texi
+++ b/doc/posix-functions/strncasecmp.texi
@@ -4,8 +4,8 @@
POSIX specification:@* @url{https://pubs.opengroup.org/onlinepubs/9799919799/functions/strncasecmp.html}
-Gnulib module: strcase
-@mindex strcase
+Gnulib module: strncasecmp
+@mindex strncasecmp
Portability problems fixed by Gnulib:
@itemize
diff --git a/doc/strings.texi b/doc/strings.texi
index 0493233ba0..a33067f1f8 100644
--- a/doc/strings.texi
+++ b/doc/strings.texi
@@ -324,11 +324,12 @@
@mindex mbs_startswith
@mindex stpcpy
@mindex stpncpy
-@mindex strcase
+@mindex strcasecmp
@mindex strcasestr
@mindex strcspn
@mindex strdup
@mindex string-desc
+@mindex strncasecmp
@mindex strncat
@mindex strndup
@mindex strnlen
diff --git a/lib/strcasecmp.c b/lib/strcasecmp.c
index 27329368ad..fe21a6d5b3 100644
--- a/lib/strcasecmp.c
+++ b/lib/strcasecmp.c
@@ -1,4 +1,4 @@
-/* Case-insensitive string comparison function.
+/* Case-insensitive string comparison function for unibyte locales.
Copyright (C) 1998-1999, 2005-2007, 2009-2025 Free Software Foundation, Inc.
This file is free software: you can redistribute it and/or modify
diff --git a/lib/strings.in.h b/lib/strings.in.h
index b09f3eed89..f99b7c95e8 100644
--- a/lib/strings.in.h
+++ b/lib/strings.in.h
@@ -89,8 +89,8 @@ extern int strcasecmp (char const *s1, char const *s2)
_GL_WARN_ON_USE (strcasecmp, "strcasecmp cannot work correctly on character "
"strings in multibyte locales - "
"use mbscasecmp if you care about "
- "internationalization, or use c_strcasecmp , "
- "gnulib module c-strcase) if you want a locale "
+ "internationalization, or use c_strcasecmp "
+ "(gnulib module c-strcase) if you want a locale "
"independent function");
# endif
#endif
@@ -112,8 +112,8 @@ extern int strncasecmp (char const *s1, char const *s2, size_t n)
_GL_WARN_ON_USE (strncasecmp, "strncasecmp cannot work correctly on character "
"strings in multibyte locales - "
"use mbsncasecmp or mbspcasecmp if you care about "
- "internationalization, or use c_strncasecmp , "
- "gnulib module c-strcase) if you want a locale "
+ "internationalization, or use c_strncasecmp "
+ "(gnulib module c-strcase) if you want a locale "
"independent function");
# endif
#endif
diff --git a/lib/strncasecmp.c b/lib/strncasecmp.c
index 815843859a..7a0115d050 100644
--- a/lib/strncasecmp.c
+++ b/lib/strncasecmp.c
@@ -1,4 +1,4 @@
-/* strncasecmp.c -- case insensitive string comparator
+/* Case-insensitive string comparison function for unibyte locales.
Copyright (C) 1998-1999, 2005-2007, 2009-2025 Free Software Foundation, Inc.
This file is free software: you can redistribute it and/or modify
diff --git a/m4/strcasecmp.m4 b/m4/strcasecmp.m4
new file mode 100644
index 0000000000..0bbcc5ebe2
--- /dev/null
+++ b/m4/strcasecmp.m4
@@ -0,0 +1,21 @@
+# strcasecmp.m4
+# serial 1
+dnl Copyright (C) 2002-2025 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl This file is offered as-is, without any warranty.
+
+AC_DEFUN([gl_FUNC_STRCASECMP],
+[
+ AC_REQUIRE([gl_STRINGS_H_DEFAULTS])
+ AC_CHECK_FUNCS([strcasecmp])
+ if test $ac_cv_func_strcasecmp = no; then
+ HAVE_STRCASECMP=0
+ fi
+])
+
+# Prerequisites of lib/strcasecmp.c.
+AC_DEFUN([gl_PREREQ_STRCASECMP], [
+ :
+])
diff --git a/m4/strcase.m4 b/m4/strncasecmp.m4
similarity index 61%
rename from m4/strcase.m4
rename to m4/strncasecmp.m4
index ecb2c91c8b..d27a4a0c5e 100644
--- a/m4/strcase.m4
+++ b/m4/strncasecmp.m4
@@ -1,26 +1,11 @@
-# strcase.m4
-# serial 12
-dnl Copyright (C) 2002, 2005-2025 Free Software Foundation, Inc.
+# strncasecmp.m4
+# serial 1
+dnl Copyright (C) 2002-2025 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
dnl This file is offered as-is, without any warranty.
-AC_DEFUN([gl_STRCASE],
-[
- gl_FUNC_STRCASECMP
- gl_FUNC_STRNCASECMP
-])
-
-AC_DEFUN([gl_FUNC_STRCASECMP],
-[
- AC_REQUIRE([gl_STRINGS_H_DEFAULTS])
- AC_CHECK_FUNCS([strcasecmp])
- if test $ac_cv_func_strcasecmp = no; then
- HAVE_STRCASECMP=0
- fi
-])
-
AC_DEFUN([gl_FUNC_STRNCASECMP],
[
AC_REQUIRE([gl_STRINGS_H_DEFAULTS])
@@ -36,11 +21,6 @@ AC_DEFUN([gl_FUNC_STRNCASECMP]
fi
])
-# Prerequisites of lib/strcasecmp.c.
-AC_DEFUN([gl_PREREQ_STRCASECMP], [
- :
-])
-
# Prerequisites of lib/strncasecmp.c.
AC_DEFUN([gl_PREREQ_STRNCASECMP], [
:
diff --git a/modules/argp b/modules/argp
index 8b4e3e297b..caff9430cb 100644
--- a/modules/argp
+++ b/modules/argp
@@ -28,7 +28,7 @@ sysexits-h
malloc-gnu
mempcpy
strndup
-strcase
+strcasecmp
extensions
vsnprintf
sleep
diff --git a/modules/strcase b/modules/strcase
index 4d90a042a5..91bdd02d39 100644
--- a/modules/strcase
+++ b/modules/strcase
@@ -1,32 +1,15 @@
Description:
-Case-insensitive string comparison functions.
+Case-insensitive string comparison functions for unibyte locales.
Files:
-lib/strcasecmp.c
-lib/strncasecmp.c
-m4/strcase.m4
Depends-on:
-strings-h
+strcasecmp
+strncasecmp
configure.ac:
-gl_STRCASE
-gl_CONDITIONAL([GL_COND_OBJ_STRCASECMP], [test $HAVE_STRCASECMP = 0])
-AM_COND_IF([GL_COND_OBJ_STRCASECMP], [
- gl_PREREQ_STRCASECMP
-])
-gl_CONDITIONAL([GL_COND_OBJ_STRNCASECMP], [test $HAVE_STRNCASECMP = 0])
-AM_COND_IF([GL_COND_OBJ_STRNCASECMP], [
- gl_PREREQ_STRNCASECMP
-])
Makefile.am:
-if GL_COND_OBJ_STRCASECMP
-lib_SOURCES += strcasecmp.c
-endif
-if GL_COND_OBJ_STRNCASECMP
-lib_SOURCES += strncasecmp.c
-endif
Include:
<strings.h>
diff --git a/modules/strcasecmp b/modules/strcasecmp
new file mode 100644
index 0000000000..b226990b2a
--- /dev/null
+++ b/modules/strcasecmp
@@ -0,0 +1,30 @@
+Description:
+Case-insensitive string comparison function for unibyte locales.
+
+Files:
+lib/strcasecmp.c
+m4/strcasecmp.m4
+
+Depends-on:
+strings-h
+
+configure.ac:
+gl_FUNC_STRCASECMP
+gl_CONDITIONAL([GL_COND_OBJ_STRCASECMP], [test $HAVE_STRCASECMP = 0])
+AM_COND_IF([GL_COND_OBJ_STRCASECMP], [
+ gl_PREREQ_STRCASECMP
+])
+
+Makefile.am:
+if GL_COND_OBJ_STRCASECMP
+lib_SOURCES += strcasecmp.c
+endif
+
+Include:
+<strings.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/modules/strcasestr-simple b/modules/strcasestr-simple
index 050bd81903..f944425ff0 100644
--- a/modules/strcasestr-simple
+++ b/modules/strcasestr-simple
@@ -9,7 +9,7 @@ m4/strcasestr.m4
Depends-on:
string-h
bool
-strcase
+strncasecmp
memchr
memcmp
extensions
diff --git a/modules/strncasecmp b/modules/strncasecmp
new file mode 100644
index 0000000000..5fca265bad
--- /dev/null
+++ b/modules/strncasecmp
@@ -0,0 +1,30 @@
+Description:
+Case-insensitive string comparison function for unibyte locales.
+
+Files:
+lib/strncasecmp.c
+m4/strncasecmp.m4
+
+Depends-on:
+strings-h
+
+configure.ac:
+gl_FUNC_STRNCASECMP
+gl_CONDITIONAL([GL_COND_OBJ_STRNCASECMP], [test $HAVE_STRNCASECMP = 0])
+AM_COND_IF([GL_COND_OBJ_STRNCASECMP], [
+ gl_PREREQ_STRNCASECMP
+])
+
+Makefile.am:
+if GL_COND_OBJ_STRNCASECMP
+lib_SOURCES += strncasecmp.c
+endif
+
+Include:
+<strings.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/modules/strptime b/modules/strptime
index 9ebb97e2fe..67296f76c8 100644
--- a/modules/strptime
+++ b/modules/strptime
@@ -11,7 +11,7 @@ time-h
extensions
sys_time-h [test $HAVE_STRPTIME = 0]
string-h [test $HAVE_STRPTIME = 0]
-strcase [test $HAVE_STRPTIME = 0]
+strncasecmp [test $HAVE_STRPTIME = 0]
bool [test $HAVE_STRPTIME = 0]
time_r [test $HAVE_STRPTIME = 0]
--
2.43.0
>From c17d70aaaebfc79e4d5cc9b490b0cc7d43b5cd42 Mon Sep 17 00:00:00 2001
From: Bruno Haible <[email protected]>
Date: Sun, 16 Feb 2025 12:30:58 +0100
Subject: [PATCH 2/3] strings-h: Don't declare strcasecmp, strncasecmp without
the module.
* lib/strings.in.h (strcasecmp): Don't declare if module 'strcasecmp' is
not present.
(strncasecmp): Don't declare if module 'strncasecmp' is not present.
* m4/strings_h.m4 (gl_STRINGS_H_REQUIRE_DEFAULTS): Initialize
GNULIB_STRCASECMP, GNULIB_STRNCASECMP.
* modules/strings-h (Makefile.am): Substitute GNULIB_STRCASECMP,
GNULIB_STRNCASECMP.
---
ChangeLog | 11 +++++++++++
lib/strings.in.h | 16 +++++++++-------
m4/strings_h.m4 | 4 +++-
modules/strings-h | 2 ++
4 files changed, 25 insertions(+), 8 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 37255b17ea..65b34ef3fc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2025-02-16 Bruno Haible <[email protected]>
+
+ strings-h: Don't declare strcasecmp, strncasecmp without the module.
+ * lib/strings.in.h (strcasecmp): Don't declare if module 'strcasecmp' is
+ not present.
+ (strncasecmp): Don't declare if module 'strncasecmp' is not present.
+ * m4/strings_h.m4 (gl_STRINGS_H_REQUIRE_DEFAULTS): Initialize
+ GNULIB_STRCASECMP, GNULIB_STRNCASECMP.
+ * modules/strings-h (Makefile.am): Substitute GNULIB_STRCASECMP,
+ GNULIB_STRNCASECMP.
+
2025-02-16 Bruno Haible <[email protected]>
strcasecmp, strncasecmp: New modules.
diff --git a/lib/strings.in.h b/lib/strings.in.h
index f99b7c95e8..d7bd1ae917 100644
--- a/lib/strings.in.h
+++ b/lib/strings.in.h
@@ -58,8 +58,8 @@ extern "C" {
#endif
- /* Find the index of the least-significant set bit. */
#if @GNULIB_FFS@
+/* Find the index of the least-significant set bit. */
# if !@HAVE_FFS@
_GL_FUNCDECL_SYS (ffs, int, (int i), );
# endif
@@ -72,15 +72,16 @@ _GL_WARN_ON_USE (ffs, "ffs is not portable - use the ffs module");
# endif
#endif
+#if @GNULIB_STRCASECMP@
/* Compare strings S1 and S2, ignoring case, returning less than, equal to or
greater than zero if S1 is lexicographically less than, equal to or greater
than S2.
Note: This function does not work in multibyte locales. */
-#if ! @HAVE_STRCASECMP@
+# if ! @HAVE_STRCASECMP@
extern int strcasecmp (char const *s1, char const *s2)
_GL_ARG_NONNULL ((1, 2));
-#endif
-#if defined GNULIB_POSIXCHECK
+# endif
+#elif defined GNULIB_POSIXCHECK
/* strcasecmp() does not work with multibyte strings:
POSIX says that it operates on "strings", and "string" in POSIX is defined
as a sequence of bytes, not of characters. */
@@ -95,15 +96,16 @@ _GL_WARN_ON_USE (strcasecmp, "strcasecmp cannot work correctly on character "
# endif
#endif
+#if @GNULIB_STRNCASECMP@
/* Compare no more than N bytes of strings S1 and S2, ignoring case,
returning less than, equal to or greater than zero if S1 is
lexicographically less than, equal to or greater than S2.
Note: This function cannot work correctly in multibyte locales. */
-#if ! @HAVE_DECL_STRNCASECMP@
+# if ! @HAVE_DECL_STRNCASECMP@
extern int strncasecmp (char const *s1, char const *s2, size_t n)
_GL_ARG_NONNULL ((1, 2));
-#endif
-#if defined GNULIB_POSIXCHECK
+# endif
+#elif defined GNULIB_POSIXCHECK
/* strncasecmp() does not work with multibyte strings:
POSIX says that it operates on "strings", and "string" in POSIX is defined
as a sequence of bytes, not of characters. */
diff --git a/m4/strings_h.m4 b/m4/strings_h.m4
index c6f40fcdfa..25596aa445 100644
--- a/m4/strings_h.m4
+++ b/m4/strings_h.m4
@@ -1,5 +1,5 @@
# strings_h.m4
-# serial 9
+# serial 10
dnl Copyright (C) 2007, 2009-2025 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
@@ -50,6 +50,8 @@ AC_DEFUN([gl_STRINGS_H_REQUIRE_DEFAULTS]
[
m4_defun(GL_MODULE_INDICATOR_PREFIX[_STRINGS_H_MODULE_INDICATOR_DEFAULTS], [
gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FFS])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRCASECMP])
+ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRNCASECMP])
])
m4_require(GL_MODULE_INDICATOR_PREFIX[_STRINGS_H_MODULE_INDICATOR_DEFAULTS])
AC_REQUIRE([gl_STRINGS_H_DEFAULTS])
diff --git a/modules/strings-h b/modules/strings-h
index ad05ba3314..7b3cc6ad44 100644
--- a/modules/strings-h
+++ b/modules/strings-h
@@ -33,6 +33,8 @@ strings.h: strings.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE
-e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
-e 's|@''NEXT_STRINGS_H''@|$(NEXT_STRINGS_H)|g' \
-e 's/@''GNULIB_FFS''@/$(GNULIB_FFS)/g' \
+ -e 's/@''GNULIB_STRCASECMP''@/$(GNULIB_STRCASECMP)/g' \
+ -e 's/@''GNULIB_STRNCASECMP''@/$(GNULIB_STRNCASECMP)/g' \
-e 's|@''HAVE_FFS''@|$(HAVE_FFS)|g' \
-e 's|@''HAVE_STRCASECMP''@|$(HAVE_STRCASECMP)|g' \
-e 's|@''HAVE_DECL_STRNCASECMP''@|$(HAVE_DECL_STRNCASECMP)|g' \
--
2.43.0
>From f656293f0e76f95fd77fbae7c1d356e6449d5d90 Mon Sep 17 00:00:00 2001
From: Bruno Haible <[email protected]>
Date: Sun, 16 Feb 2025 13:02:25 +0100
Subject: [PATCH 3/3] c-strcasecmp, c-strncasecmp: New modules.
* modules/c-strcasecmp: New file.
* modules/c-strncasecmp: New file.
* modules/c-strcase: Merely depend on c-strcasecmp, c-strncasecmp.
* lib/strings.in.h (strcasecmp, strncasecmp): Update warning message.
* tests/test-c-strcasecmp.sh: New file, based on
tests/test-c-strcase.sh.
* tests/test-c-strncasecmp.sh: New file, based on
tests/test-c-strcase.sh.
* tests/test-c-strcase.sh: Remove file.
* modules/c-strcasecmp-tests: New file.
* modules/c-strncasecmp-tests: New file.
* modules/c-strcase-tests: Remove file.
* doc/c-strcasecmp.texi: New file, based on doc/c-strcase.texi.
* doc/c-strncasecmp.texi: New file, based on doc/c-strcase.texi.
* doc/c-strcase.texi: Remove file.
* doc/c-locale.texi: Include c-strcasecmp.texi and c-strncasecmp.texi
separately.
* modules/c-strcaseeq (Depends-on): Add c-strcasecmp. Remove c-strcase.
* modules/iconv_open (Depends-on): Likewise.
* modules/nl_langinfo-tests (Depends-on): Likewise.
* modules/propername (Depends-on): Likewise.
* modules/propername-lite (Depends-on): Likewise.
* modules/striconv (Depends-on): Likewise.
* modules/striconveh (Depends-on): Likewise.
* modules/striconveha (Depends-on): Likewise.
* modules/c-strcasestr (Depends-on): Add c-strncasecmp. Remove
c-strcase.
---
ChangeLog | 31 +++++++++++++++++++
doc/c-locale.texi | 15 ++++++---
doc/c-strcasecmp.texi | 29 +++++++++++++++++
doc/{c-strcase.texi => c-strncasecmp.texi} | 19 +++++-------
lib/strings.in.h | 4 +--
modules/c-strcase | 7 ++---
modules/c-strcasecmp | 23 ++++++++++++++
modules/c-strcasecmp-tests | 21 +++++++++++++
modules/c-strcaseeq | 2 +-
modules/c-strcasestr | 2 +-
modules/c-strncasecmp | 23 ++++++++++++++
.../{c-strcase-tests => c-strncasecmp-tests} | 8 ++---
modules/iconv_open | 2 +-
modules/nl_langinfo-tests | 2 +-
modules/propername | 2 +-
modules/propername-lite | 2 +-
modules/striconv | 2 +-
modules/striconveh | 2 +-
modules/striconveha | 2 +-
tests/test-c-strcasecmp.sh | 18 +++++++++++
...est-c-strcase.sh => test-c-strncasecmp.sh} | 3 --
21 files changed, 179 insertions(+), 40 deletions(-)
create mode 100644 doc/c-strcasecmp.texi
rename doc/{c-strcase.texi => c-strncasecmp.texi} (62%)
create mode 100644 modules/c-strcasecmp
create mode 100644 modules/c-strcasecmp-tests
create mode 100644 modules/c-strncasecmp
rename modules/{c-strcase-tests => c-strncasecmp-tests} (63%)
create mode 100755 tests/test-c-strcasecmp.sh
rename tests/{test-c-strcase.sh => test-c-strncasecmp.sh} (69%)
diff --git a/ChangeLog b/ChangeLog
index 65b34ef3fc..5829c3bd9e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,34 @@
+2025-02-16 Bruno Haible <[email protected]>
+
+ c-strcasecmp, c-strncasecmp: New modules.
+ * modules/c-strcasecmp: New file.
+ * modules/c-strncasecmp: New file.
+ * modules/c-strcase: Merely depend on c-strcasecmp, c-strncasecmp.
+ * lib/strings.in.h (strcasecmp, strncasecmp): Update warning message.
+ * tests/test-c-strcasecmp.sh: New file, based on
+ tests/test-c-strcase.sh.
+ * tests/test-c-strncasecmp.sh: New file, based on
+ tests/test-c-strcase.sh.
+ * tests/test-c-strcase.sh: Remove file.
+ * modules/c-strcasecmp-tests: New file.
+ * modules/c-strncasecmp-tests: New file.
+ * modules/c-strcase-tests: Remove file.
+ * doc/c-strcasecmp.texi: New file, based on doc/c-strcase.texi.
+ * doc/c-strncasecmp.texi: New file, based on doc/c-strcase.texi.
+ * doc/c-strcase.texi: Remove file.
+ * doc/c-locale.texi: Include c-strcasecmp.texi and c-strncasecmp.texi
+ separately.
+ * modules/c-strcaseeq (Depends-on): Add c-strcasecmp. Remove c-strcase.
+ * modules/iconv_open (Depends-on): Likewise.
+ * modules/nl_langinfo-tests (Depends-on): Likewise.
+ * modules/propername (Depends-on): Likewise.
+ * modules/propername-lite (Depends-on): Likewise.
+ * modules/striconv (Depends-on): Likewise.
+ * modules/striconveh (Depends-on): Likewise.
+ * modules/striconveha (Depends-on): Likewise.
+ * modules/c-strcasestr (Depends-on): Add c-strncasecmp. Remove
+ c-strcase.
+
2025-02-16 Bruno Haible <[email protected]>
strings-h: Don't declare strcasecmp, strncasecmp without the module.
diff --git a/doc/c-locale.texi b/doc/c-locale.texi
index b9f6274873..41b17a3980 100644
--- a/doc/c-locale.texi
+++ b/doc/c-locale.texi
@@ -16,8 +16,9 @@
@menu
* c-ctype::
-* c-strcase::
* c-strcaseeq::
+* c-strcasecmp::
+* c-strncasecmp::
* c-strcasestr::
* c-strstr::
* c-strtod::
@@ -28,14 +29,18 @@
@subsubsection c-ctype
@include c-ctype.texi
-@node c-strcase
-@subsubsection c-strcase
-@include c-strcase.texi
-
@node c-strcaseeq
@subsubsection c-strcaseeq
@include c-strcaseeq.texi
+@node c-strcasecmp
+@subsubsection c-strcasecmp
+@include c-strcasecmp.texi
+
+@node c-strncasecmp
+@subsubsection c-strncasecmp
+@include c-strncasecmp.texi
+
@node c-strcasestr
@subsubsection c-strcasestr
@include c-strcasestr.texi
diff --git a/doc/c-strcasecmp.texi b/doc/c-strcasecmp.texi
new file mode 100644
index 0000000000..971d021707
--- /dev/null
+++ b/doc/c-strcasecmp.texi
@@ -0,0 +1,29 @@
+@c Documentation of gnulib module 'c-strcasecmp'.
+
+@c Copyright (C) 2008--2025 Free Software Foundation, Inc.
+
+@c Permission is granted to copy, distribute and/or modify this document
+@c under the terms of the GNU Free Documentation License, Version 1.3 or
+@c any later version published by the Free Software Foundation; with no
+@c Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A
+@c copy of the license is at <https://www.gnu.org/licenses/fdl-1.3.en.html>.
+
+@mindex c-strcasecmp
+The @code{c-strcasecmp} module contains a case-insensitive string comparison
+function operating on single-byte character strings, like the functions in
+@code{<strings.h>}, that operate as if the locale encoding was ASCII.
+(The "C" locale on many systems has the locale encoding "ASCII".)
+
+The function is:
+@smallexample
+extern int c_strcasecmp (const char *s1, const char *s2);
+@end smallexample
+
+For case conversion here, only ASCII characters are considered to be
+upper case or lower case.
+
+Note: The function @code{strcasecmp} from @code{<strings.h>}
+supports only unibyte locales;
+@mindex mbscasecmp
+for multibyte locales,
+you need the function @code{mbscasecmp}.
diff --git a/doc/c-strcase.texi b/doc/c-strncasecmp.texi
similarity index 62%
rename from doc/c-strcase.texi
rename to doc/c-strncasecmp.texi
index 5c31fecc36..61ed3d5ae0 100644
--- a/doc/c-strcase.texi
+++ b/doc/c-strncasecmp.texi
@@ -1,4 +1,4 @@
-@c Documentation of gnulib module 'c-strcase'.
+@c Documentation of gnulib module 'c-strncasecmp'.
@c Copyright (C) 2008--2025 Free Software Foundation, Inc.
@@ -8,26 +8,23 @@
@c Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A
@c copy of the license is at <https://www.gnu.org/licenses/fdl-1.3.en.html>.
-@mindex c-strcase
-The @code{c-strcase} module contains case-insensitive string comparison
-functions operating on single-byte character strings, like the functions in
+@mindex c-strncasecmp
+The @code{c-strncasecmp} module contains a case-insensitive string comparison
+function operating on single-byte character strings, like the functions in
@code{<strings.h>}, that operate as if the locale encoding was ASCII.
(The "C" locale on many systems has the locale encoding "ASCII".)
-The functions are:
+The function is:
@smallexample
-extern int c_strcasecmp (const char *s1, const char *s2);
extern int c_strncasecmp (const char *s1, const char *s2, size_t n);
@end smallexample
For case conversion here, only ASCII characters are considered to be
upper case or lower case.
-Note: The functions @code{strcasecmp}, @code{strncasecmp} from
-@code{<strings.h>} support only unibyte locales;
-@mindex mbscasecmp
+Note: The function @code{strncasecmp} from @code{<strings.h>}
+supports only unibyte locales;
@mindex mbsncasecmp
@mindex mbspcasecmp
for multibyte locales,
-you need the functions @code{mbscasecmp}, @code{mbsncasecmp},
-@code{mbspcasecmp}.
+you need the function @code{mbsncasecmp} or @code{mbspcasecmp}.
diff --git a/lib/strings.in.h b/lib/strings.in.h
index d7bd1ae917..cad01dc34b 100644
--- a/lib/strings.in.h
+++ b/lib/strings.in.h
@@ -91,7 +91,7 @@ _GL_WARN_ON_USE (strcasecmp, "strcasecmp cannot work correctly on character "
"strings in multibyte locales - "
"use mbscasecmp if you care about "
"internationalization, or use c_strcasecmp "
- "(gnulib module c-strcase) if you want a locale "
+ "(gnulib module c-strcasecmp) if you want a locale "
"independent function");
# endif
#endif
@@ -115,7 +115,7 @@ _GL_WARN_ON_USE (strncasecmp, "strncasecmp cannot work correctly on character "
"strings in multibyte locales - "
"use mbsncasecmp or mbspcasecmp if you care about "
"internationalization, or use c_strncasecmp "
- "(gnulib module c-strcase) if you want a locale "
+ "(gnulib module c-strncasecmp) if you want a locale "
"independent function");
# endif
#endif
diff --git a/modules/c-strcase b/modules/c-strcase
index 1af2c8ee9e..10fc5a5ab3 100644
--- a/modules/c-strcase
+++ b/modules/c-strcase
@@ -2,17 +2,14 @@ Description:
Case-insensitive string comparison functions in C locale.
Files:
-lib/c-strcase.h
-lib/c-strcasecmp.c
-lib/c-strncasecmp.c
Depends-on:
-c-ctype
+c-strcasecmp
+c-strncasecmp
configure.ac:
Makefile.am:
-lib_SOURCES += c-strcase.h c-strcasecmp.c c-strncasecmp.c
Include:
"c-strcase.h"
diff --git a/modules/c-strcasecmp b/modules/c-strcasecmp
new file mode 100644
index 0000000000..d9afa54213
--- /dev/null
+++ b/modules/c-strcasecmp
@@ -0,0 +1,23 @@
+Description:
+Case-insensitive string comparison functions in C locale.
+
+Files:
+lib/c-strcase.h
+lib/c-strcasecmp.c
+
+Depends-on:
+c-ctype
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += c-strcasecmp.c
+
+Include:
+"c-strcase.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/modules/c-strcasecmp-tests b/modules/c-strcasecmp-tests
new file mode 100644
index 0000000000..6f5b0d2a0e
--- /dev/null
+++ b/modules/c-strcasecmp-tests
@@ -0,0 +1,21 @@
+Files:
+tests/test-c-strcasecmp.sh
+tests/test-c-strcasecmp.c
+tests/macros.h
+m4/locale-fr.m4
+m4/locale-tr.m4
+m4/codeset.m4
+
+Depends-on:
+c-ctype
+setlocale
+
+configure.ac:
+gt_LOCALE_FR
+gt_LOCALE_TR_UTF8
+
+Makefile.am:
+TESTS += test-c-strcasecmp.sh
+TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@' LOCALE_TR_UTF8='@LOCALE_TR_UTF8@'
+check_PROGRAMS += test-c-strcasecmp
+test_c_strcasecmp_LDADD = $(LDADD) $(SETLOCALE_LIB)
diff --git a/modules/c-strcaseeq b/modules/c-strcaseeq
index 7569bc6697..90c3605805 100644
--- a/modules/c-strcaseeq
+++ b/modules/c-strcaseeq
@@ -5,7 +5,7 @@ Files:
lib/c-strcaseeq.h
Depends-on:
-c-strcase
+c-strcasecmp
c-ctype
configure.ac:
diff --git a/modules/c-strcasestr b/modules/c-strcasestr
index 0bc5a81b1b..3cc0b979b8 100644
--- a/modules/c-strcasestr
+++ b/modules/c-strcasestr
@@ -8,7 +8,7 @@ lib/str-two-way.h
Depends-on:
c-ctype
-c-strcase
+c-strncasecmp
bool
memchr
memcmp
diff --git a/modules/c-strncasecmp b/modules/c-strncasecmp
new file mode 100644
index 0000000000..f2b0cf00f8
--- /dev/null
+++ b/modules/c-strncasecmp
@@ -0,0 +1,23 @@
+Description:
+Case-insensitive string comparison functions in C locale.
+
+Files:
+lib/c-strcase.h
+lib/c-strncasecmp.c
+
+Depends-on:
+c-ctype
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += c-strncasecmp.c
+
+Include:
+"c-strcase.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+all
diff --git a/modules/c-strcase-tests b/modules/c-strncasecmp-tests
similarity index 63%
rename from modules/c-strcase-tests
rename to modules/c-strncasecmp-tests
index 23a3eb8aba..7e7c94535f 100644
--- a/modules/c-strcase-tests
+++ b/modules/c-strncasecmp-tests
@@ -1,6 +1,5 @@
Files:
-tests/test-c-strcase.sh
-tests/test-c-strcasecmp.c
+tests/test-c-strncasecmp.sh
tests/test-c-strncasecmp.c
tests/macros.h
m4/locale-fr.m4
@@ -16,8 +15,7 @@ gt_LOCALE_FR
gt_LOCALE_TR_UTF8
Makefile.am:
-TESTS += test-c-strcase.sh
+TESTS += test-c-strncasecmp.sh
TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@' LOCALE_TR_UTF8='@LOCALE_TR_UTF8@'
-check_PROGRAMS += test-c-strcasecmp test-c-strncasecmp
-test_c_strcasecmp_LDADD = $(LDADD) $(SETLOCALE_LIB)
+check_PROGRAMS += test-c-strncasecmp
test_c_strncasecmp_LDADD = $(LDADD) $(SETLOCALE_LIB)
diff --git a/modules/iconv_open b/modules/iconv_open
index 4993a07044..b3ed95c40f 100644
--- a/modules/iconv_open
+++ b/modules/iconv_open
@@ -18,7 +18,7 @@ gperf
iconv-h
iconv
c-ctype [test $REPLACE_ICONV_OPEN = 1]
-c-strcase [test $REPLACE_ICONV_OPEN = 1]
+c-strcasecmp [test $REPLACE_ICONV_OPEN = 1]
stdint-h [test $REPLACE_ICONV_UTF = 1]
unistr/u8-mbtoucr [test $REPLACE_ICONV_UTF = 1]
unistr/u8-uctomb [test $REPLACE_ICONV_UTF = 1]
diff --git a/modules/nl_langinfo-tests b/modules/nl_langinfo-tests
index 66bae5ffaf..a1125e290c 100644
--- a/modules/nl_langinfo-tests
+++ b/modules/nl_langinfo-tests
@@ -12,7 +12,7 @@ m4/intl-thread-locale.m4
m4/musl.m4
Depends-on:
-c-strcase
+c-strcasecmp
c-strcasestr
setlocale
thread
diff --git a/modules/propername b/modules/propername
index 6e4ab3a4af..87de812dc8 100644
--- a/modules/propername
+++ b/modules/propername
@@ -14,7 +14,7 @@ mbchar
mbuiter
iconv
localcharset
-c-strcase
+c-strcasecmp
xstriconv
xalloc
gettext-h
diff --git a/modules/propername-lite b/modules/propername-lite
index 53f0187238..771ea21b61 100644
--- a/modules/propername-lite
+++ b/modules/propername-lite
@@ -7,7 +7,7 @@ lib/propername.h
Depends-on:
localcharset
-c-strcase
+c-strcasecmp
gettext-h
configure.ac:
diff --git a/modules/striconv b/modules/striconv
index 542287dcea..53b4b55ea5 100644
--- a/modules/striconv
+++ b/modules/striconv
@@ -10,7 +10,7 @@ iconv
iconv_open
free-posix
strdup
-c-strcase
+c-strcasecmp
configure.ac:
if test $gl_cond_libtool = false; then
diff --git a/modules/striconveh b/modules/striconveh
index a55a26d7bf..ff746cc959 100644
--- a/modules/striconveh
+++ b/modules/striconveh
@@ -17,7 +17,7 @@ unistr/u8-mbtoucr
unistr/u8-uctomb
free-posix
strdup
-c-strcase
+c-strcasecmp
c-strcaseeq
memmove
diff --git a/modules/striconveha b/modules/striconveha
index aa58691596..090855ccc9 100644
--- a/modules/striconveha
+++ b/modules/striconveha
@@ -11,7 +11,7 @@ bool
striconveh
malloca
strdup
-c-strcase
+c-strcasecmp
configure.ac:
diff --git a/tests/test-c-strcasecmp.sh b/tests/test-c-strcasecmp.sh
new file mode 100755
index 0000000000..8049c7b181
--- /dev/null
+++ b/tests/test-c-strcasecmp.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+# Test in the C locale.
+${CHECKER} ./test-c-strcasecmp${EXEEXT} || exit 1
+
+# Test in an ISO-8859-1 or ISO-8859-15 locale.
+: "${LOCALE_FR=fr_FR}"
+if test $LOCALE_FR != none; then
+ LC_ALL=$LOCALE_FR ${CHECKER} ./test-c-strcasecmp${EXEEXT} locale || exit 1
+fi
+
+# Test in a Turkish UTF-8 locale.
+: "${LOCALE_TR_UTF8=tr_TR.UTF-8}"
+if test $LOCALE_TR_UTF8 != none; then
+ LC_ALL=$LOCALE_TR_UTF8 ${CHECKER} ./test-c-strcasecmp${EXEEXT} locale || exit 1
+fi
+
+exit 0
diff --git a/tests/test-c-strcase.sh b/tests/test-c-strncasecmp.sh
similarity index 69%
rename from tests/test-c-strcase.sh
rename to tests/test-c-strncasecmp.sh
index 9f491e0f96..30067d153e 100755
--- a/tests/test-c-strcase.sh
+++ b/tests/test-c-strncasecmp.sh
@@ -1,20 +1,17 @@
#!/bin/sh
# Test in the C locale.
-${CHECKER} ./test-c-strcasecmp${EXEEXT} || exit 1
${CHECKER} ./test-c-strncasecmp${EXEEXT} || exit 1
# Test in an ISO-8859-1 or ISO-8859-15 locale.
: "${LOCALE_FR=fr_FR}"
if test $LOCALE_FR != none; then
- LC_ALL=$LOCALE_FR ${CHECKER} ./test-c-strcasecmp${EXEEXT} locale || exit 1
LC_ALL=$LOCALE_FR ${CHECKER} ./test-c-strncasecmp${EXEEXT} locale || exit 1
fi
# Test in a Turkish UTF-8 locale.
: "${LOCALE_TR_UTF8=tr_TR.UTF-8}"
if test $LOCALE_TR_UTF8 != none; then
- LC_ALL=$LOCALE_TR_UTF8 ${CHECKER} ./test-c-strcasecmp${EXEEXT} locale || exit 1
LC_ALL=$LOCALE_TR_UTF8 ${CHECKER} ./test-c-strncasecmp${EXEEXT} locale || exit 1
fi
--
2.43.0