Skip to content

Commit

Permalink
New module 'wcscoll'.
Browse files Browse the repository at this point in the history
* modules/wcscoll: New file.
* lib/wchar.in.h (wcscoll): New declaration.
* lib/wcscoll.c: New file.
* lib/wcscoll-impl.h: New file.
* m4/wcscoll.m4: New file.
* m4/wchar_h.m4 (gl_WCHAR_H): Test whether wcscoll is declared.
(gl_WCHAR_H_DEFAULTS): Initialize GNULIB_WCSCOLL, HAVE_WCSCOLL.
* modules/wchar (Makefile.am): Substitute GNULIB_WCSCOLL, HAVE_WCSCOLL.
* tests/test-wchar-c++.cc: Test the declaration of wcscoll.
* doc/posix-functions/wcscoll.texi: Mention the new module.
  • Loading branch information
bhaible committed Feb 7, 2011
1 parent e1cc6ea commit 7aae655
Show file tree
Hide file tree
Showing 10 changed files with 229 additions and 5 deletions.
14 changes: 14 additions & 0 deletions ChangeLog
@@ -1,3 +1,17 @@
2011-02-06 Bruno Haible <bruno@clisp.org>

New module 'wcscoll'.
* modules/wcscoll: New file.
* lib/wchar.in.h (wcscoll): New declaration.
* lib/wcscoll.c: New file.
* lib/wcscoll-impl.h: New file.
* m4/wcscoll.m4: New file.
* m4/wchar_h.m4 (gl_WCHAR_H): Test whether wcscoll is declared.
(gl_WCHAR_H_DEFAULTS): Initialize GNULIB_WCSCOLL, HAVE_WCSCOLL.
* modules/wchar (Makefile.am): Substitute GNULIB_WCSCOLL, HAVE_WCSCOLL.
* tests/test-wchar-c++.cc: Test the declaration of wcscoll.
* doc/posix-functions/wcscoll.texi: Mention the new module.

2011-02-06 Bruno Haible <bruno@clisp.org>

New module 'wcsncasecmp'.
Expand Down
8 changes: 4 additions & 4 deletions doc/posix-functions/wcscoll.texi
Expand Up @@ -4,18 +4,18 @@

POSIX specification:@* @url{http://www.opengroup.org/onlinepubs/9699919799/functions/wcscoll.html}

Gnulib module: ---
Gnulib module: wcscoll

Portability problems fixed by Gnulib:
@itemize
@item
This function is missing on some platforms:
IRIX 5.3, Solaris 2.5.1.
@end itemize

Portability problems not fixed by Gnulib:
@itemize
@item
This function is missing on some platforms:
IRIX 5.3, Solaris 2.5.1.
@item
On AIX and Windows platforms, @code{wchar_t} is a 16-bit type and therefore cannot
accommodate all Unicode characters.
@end itemize
17 changes: 17 additions & 0 deletions lib/wchar.in.h
Expand Up @@ -720,6 +720,23 @@ _GL_WARN_ON_USE (wcsncasecmp, "wcsncasecmp is unportable - "
#endif


/* Compare S1 and S2, both interpreted as appropriate to the LC_COLLATE
category of the current locale. */
#if @GNULIB_WCSCOLL@
# if !@HAVE_WCSCOLL@
_GL_FUNCDECL_SYS (wcscoll, int, (const wchar_t *s1, const wchar_t *s2));
# endif
_GL_CXXALIAS_SYS (wcscoll, int, (const wchar_t *s1, const wchar_t *s2));
_GL_CXXALIASWARN (wcscoll);
#elif defined GNULIB_POSIXCHECK
# undef wcscoll
# if HAVE_RAW_DECL_WCSCOLL
_GL_WARN_ON_USE (wcscoll, "wcscoll is unportable - "
"use gnulib module wcscoll for portability");
# endif
#endif


#endif /* _GL_WCHAR_H */
#endif /* _GL_WCHAR_H */
#endif
111 changes: 111 additions & 0 deletions lib/wcscoll-impl.h
@@ -0,0 +1,111 @@
/* Compare two wide strings using the current locale.
Copyright (C) 2011 Free Software Foundation, Inc.
Written by Bruno Haible <bruno@clisp.org>, 2011.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */

int
wcscoll (const wchar_t *s1, const wchar_t *s2)
{
char mbbuf1[1024];
char mbbuf2[1024];
char *mbs1;
char *mbs2;

{
int saved_errno = errno;

/* Convert s1 to a multibyte string, trying to avoid malloc(). */
{
size_t ret;

ret = wcstombs (mbbuf1, s1, sizeof (mbbuf1));
if (ret == (size_t)-1)
goto failed1;
if (ret < sizeof (mbbuf1))
mbs1 = mbbuf1;
else
{
size_t need = wcstombs (NULL, s1, 0);
if (need == (size_t)-1)
goto failed1;
mbs1 = (char *) malloc (need + 1);
if (mbs1 == NULL)
goto out_of_memory1;
ret = wcstombs (mbs1, s1, need + 1);
if (ret != need)
abort ();
}
}

/* Convert s2 to a multibyte string, trying to avoid malloc(). */
{
size_t ret;

ret = wcstombs (mbbuf2, s2, sizeof (mbbuf2));
if (ret == (size_t)-1)
goto failed2;
if (ret < sizeof (mbbuf2))
mbs2 = mbbuf2;
else
{
size_t need = wcstombs (NULL, s2, 0);
if (need == (size_t)-1)
goto failed2;
mbs2 = (char *) malloc (need + 1);
if (mbs2 == NULL)
goto out_of_memory2;
ret = wcstombs (mbs2, s2, need + 1);
if (ret != need)
abort ();
}
}

/* No error so far. */
errno = saved_errno;
}

/* Compare the two multibyte strings. */
{
int result = strcoll (mbs1, mbs2);

if (mbs1 != mbbuf1)
{
int saved_errno = errno;
free (mbs1);
errno = saved_errno;
}
if (mbs2 != mbbuf2)
{
int saved_errno = errno;
free (mbs2);
errno = saved_errno;
}
return result;
}

out_of_memory2:
if (mbs1 != mbbuf1)
free (mbs1);
out_of_memory1:
errno = ENOMEM;
return 0;

failed2:
if (mbs1 != mbbuf1)
free (mbs1);
failed1:
errno = EILSEQ;
return 0;
}
27 changes: 27 additions & 0 deletions lib/wcscoll.c
@@ -0,0 +1,27 @@
/* Compare two wide strings using the current locale.
Copyright (C) 2011 Free Software Foundation, Inc.
Written by Bruno Haible <bruno@clisp.org>, 2011.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */

#include <config.h>

/* Specification. */
#include <wchar.h>

#include <errno.h>
#include <stdlib.h>
#include <string.h>

#include "wcscoll-impl.h"
4 changes: 3 additions & 1 deletion m4/wchar_h.m4
Expand Up @@ -52,7 +52,7 @@ AC_DEFUN([gl_WCHAR_H],
[btowc wctob mbsinit mbrtowc mbrlen mbsrtowcs mbsnrtowcs wcrtomb
wcsrtombs wcsnrtombs wcwidth wmemchr wmemcmp wmemcpy wmemmove wmemset
wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat wcscmp
wcsncmp wcscasecmp wcsncasecmp
wcsncmp wcscasecmp wcsncasecmp wcscoll
])
])

Expand Down Expand Up @@ -164,6 +164,7 @@ AC_DEFUN([gl_WCHAR_H_DEFAULTS],
GNULIB_WCSNCMP=0; AC_SUBST([GNULIB_WCSNCMP])
GNULIB_WCSCASECMP=0; AC_SUBST([GNULIB_WCSCASECMP])
GNULIB_WCSNCASECMP=0; AC_SUBST([GNULIB_WCSNCASECMP])
GNULIB_WCSCOLL=0; AC_SUBST([GNULIB_WCSCOLL])
dnl Assume proper GNU behavior unless another module says otherwise.
HAVE_BTOWC=1; AC_SUBST([HAVE_BTOWC])
HAVE_MBSINIT=1; AC_SUBST([HAVE_MBSINIT])
Expand Down Expand Up @@ -191,6 +192,7 @@ AC_DEFUN([gl_WCHAR_H_DEFAULTS],
HAVE_WCSNCMP=1; AC_SUBST([HAVE_WCSNCMP])
HAVE_WCSCASECMP=1; AC_SUBST([HAVE_WCSCASECMP])
HAVE_WCSNCASECMP=1; AC_SUBST([HAVE_WCSNCASECMP])
HAVE_WCSCOLL=1; AC_SUBST([HAVE_WCSCOLL])
HAVE_DECL_WCTOB=1; AC_SUBST([HAVE_DECL_WCTOB])
HAVE_DECL_WCWIDTH=1; AC_SUBST([HAVE_DECL_WCWIDTH])
REPLACE_MBSTATE_T=0; AC_SUBST([REPLACE_MBSTATE_T])
Expand Down
15 changes: 15 additions & 0 deletions m4/wcscoll.m4
@@ -0,0 +1,15 @@
# wcscoll.m4 serial 1
dnl Copyright (C) 2011 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.

AC_DEFUN([gl_FUNC_WCSCOLL],
[
AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
AC_CHECK_FUNCS_ONCE([wcscoll])
if test $ac_cv_func_wcscoll = no; then
HAVE_WCSCOLL=0
AC_LIBOBJ([wcscoll])
fi
])
2 changes: 2 additions & 0 deletions modules/wchar
Expand Up @@ -58,6 +58,7 @@ wchar.h: wchar.in.h $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
-e 's|@''GNULIB_WCSNCMP''@|$(GNULIB_WCSNCMP)|g' \
-e 's|@''GNULIB_WCSCASECMP''@|$(GNULIB_WCSCASECMP)|g' \
-e 's|@''GNULIB_WCSNCASECMP''@|$(GNULIB_WCSNCASECMP)|g' \
-e 's|@''GNULIB_WCSCOLL''@|$(GNULIB_WCSCOLL)|g' \
-e 's|@''HAVE_WINT_T''@|$(HAVE_WINT_T)|g' \
-e 's|@''HAVE_BTOWC''@|$(HAVE_BTOWC)|g' \
-e 's|@''HAVE_MBSINIT''@|$(HAVE_MBSINIT)|g' \
Expand Down Expand Up @@ -85,6 +86,7 @@ wchar.h: wchar.in.h $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
-e 's|@''HAVE_WCSNCMP''@|$(HAVE_WCSNCMP)|g' \
-e 's|@''HAVE_WCSCASECMP''@|$(HAVE_WCSCASECMP)|g' \
-e 's|@''HAVE_WCSNCASECMP''@|$(HAVE_WCSNCASECMP)|g' \
-e 's|@''HAVE_WCSCOLL''@|$(HAVE_WCSCOLL)|g' \
-e 's|@''HAVE_DECL_WCTOB''@|$(HAVE_DECL_WCTOB)|g' \
-e 's|@''HAVE_DECL_WCWIDTH''@|$(HAVE_DECL_WCWIDTH)|g' \
-e 's|@''REPLACE_MBSTATE_T''@|$(REPLACE_MBSTATE_T)|g' \
Expand Down
31 changes: 31 additions & 0 deletions modules/wcscoll
@@ -0,0 +1,31 @@
Description:
wcscoll() function: compare two wide strings using the current locale.

Status:
obsolete

Notice:
This module is obsolete.

Files:
lib/wcscoll.c
lib/wcscoll-impl.h
m4/wcscoll.m4

Depends-on:
wchar

configure.ac:
gl_FUNC_WCSCOLL
gl_WCHAR_MODULE_INDICATOR([wcscoll])

Makefile.am:

Include:
<wchar.h>

License:
LGPL

Maintainer:
Bruno Haible
5 changes: 5 additions & 0 deletions tests/test-wchar-c++.cc
Expand Up @@ -158,6 +158,11 @@ SIGNATURE_CHECK (GNULIB_NAMESPACE::wcsncasecmp, int,
(const wchar_t *, const wchar_t *, size_t));
#endif

#if GNULIB_TEST_WCSCOLL
SIGNATURE_CHECK (GNULIB_NAMESPACE::wcscoll, int,
(const wchar_t *, const wchar_t *));
#endif


int
main ()
Expand Down

0 comments on commit 7aae655

Please sign in to comment.