New module 'unistr/u8-strcoll'.
authorBruno Haible <bruno@clisp.org>
Sat, 7 Feb 2009 22:27:20 +0000 (23:27 +0100)
committerBruno Haible <bruno@clisp.org>
Sat, 7 Feb 2009 22:27:20 +0000 (23:27 +0100)
ChangeLog
lib/unistr/u-strcoll.h [new file with mode: 0644]
lib/unistr/u8-strcoll.c [new file with mode: 0644]
modules/unistr/u8-strcoll [new file with mode: 0644]

index fec9492..2499490 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2009-02-07  Bruno Haible  <bruno@clisp.org>
 
+       New module 'unistr/u8-strcoll'.
+       * modules/unistr/u8-strcoll: New file.
+       * lib/unistr/u8-strcoll.c: New file.
+       * lib/unistr/u-strcoll.h: New file.
+
+2009-02-07  Bruno Haible  <bruno@clisp.org>
+
        * test-mbrtowc4.sh (LOCALE_ZH_CN): Fix default value.
        * test-mbsnrtowcs4.sh (LOCALE_ZH_CN): Likewise.
        * test-mbsrtowcs4.sh (LOCALE_ZH_CN): Likewise.
diff --git a/lib/unistr/u-strcoll.h b/lib/unistr/u-strcoll.h
new file mode 100644 (file)
index 0000000..af404a0
--- /dev/null
@@ -0,0 +1,81 @@
+/* Compare UTF-8/UTF-16/UTF-32 strings using the collation rules of the current
+   locale.
+   Copyright (C) 2009 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+int
+FUNC (const UNIT *s1, const UNIT *s2)
+{
+  /* When this function succeeds, it sets errno back to its original value.
+     When it fails, it sets errno, but also returns a meaningful return value,
+     for the sake of callers which ignore errno.  */
+  int final_errno = errno;
+  char *sl1;
+  char *sl2;
+  int result;
+
+  sl1 = U_STRCONV_TO_LOCALE (s1);
+  if (sl1 != NULL)
+    {
+      sl2 = U_STRCONV_TO_LOCALE (s2);
+      if (sl2 != NULL)
+       {
+         /* Compare sl1 and sl2.  */
+         errno = 0;
+         result = strcoll (sl1, sl2);
+         if (errno == 0)
+           {
+             /* strcoll succeeded.  */
+             free (sl1);
+             free (sl2);
+           }
+         else
+           {
+             /* strcoll failed.  */
+             final_errno = errno;
+             free (sl1);
+             free (sl2);
+             result = U_STRCMP (s1, s2);
+           }
+       }
+      else
+       {
+         /* s1 could be converted to locale encoding, s2 not.  */
+         final_errno = errno;
+         free (sl1);
+         result = -1;
+       }
+    }
+  else
+    {
+      final_errno = errno;
+      sl2 = U_STRCONV_TO_LOCALE (s2);
+      if (sl2 != NULL)
+       {
+         /* s2 could be converted to locale encoding, s1 not.  */
+         free (sl2);
+         result = 1;
+       }
+      else
+       {
+         /* Neither s1 nor s2 could be converted to locale encoding.  */
+         result = U_STRCMP (s1, s2);
+       }
+    }
+
+  errno = final_errno;
+  return result;
+}
diff --git a/lib/unistr/u8-strcoll.c b/lib/unistr/u8-strcoll.c
new file mode 100644 (file)
index 0000000..ca08609
--- /dev/null
@@ -0,0 +1,33 @@
+/* Compare UTF-8 strings using the collation rules of the current locale.
+   Copyright (C) 2009 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "unistr.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "uniconv.h"
+
+#define FUNC u8_strcoll
+#define UNIT uint8_t
+#define U_STRCMP u8_strcmp
+#define U_STRCONV_TO_LOCALE u8_strconv_to_locale
+#include "u-strcoll.h"
diff --git a/modules/unistr/u8-strcoll b/modules/unistr/u8-strcoll
new file mode 100644 (file)
index 0000000..385c388
--- /dev/null
@@ -0,0 +1,26 @@
+Description:
+Compare UTF-8 strings using the collation rules of the current locale.
+
+Files:
+lib/unistr/u8-strcoll.c
+lib/unistr/u-strcoll.h
+
+Depends-on:
+unistr/base
+unistr/u8-strcmp
+uniconv/u8-strconv-to-locale
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += unistr/u8-strcoll.c
+
+Include:
+"unistr.h"
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible
+