+2010-05-24 Bruno Haible <bruno@clisp.org>
+
+ Don't use conversion with transliteration in u{8,16,32}_strcoll.
+ * lib/unistr/u-strcoll.h (FUNC): Use U_STRCONV_TO_ENCODING with
+ iconveh_error argument.
+ * lib/unistr/u8-strcoll.c: Define U_STRCONV_TO_ENCODING instead of
+ U_STRCONV_TO_LOCALE.
+ * lib/unistr/u16-strcoll.c: Likewise.
+ * lib/unistr/u32-strcoll.c: Likewise.
+ * modules/unistr/u8-strcoll (Depends-on): Add
+ uniconv/u8-strconv-to-enc, localcharset. Remove
+ uniconv/u8-strconv-to-locale.
+ (configure.ac): Bump version number.
+ * modules/unistr/u16-strcoll (Depends-on): Add
+ uniconv/u16-strconv-to-enc, localcharset. Remove
+ uniconv/u16-strconv-to-locale.
+ (configure.ac): Bump version number.
+ * modules/unistr/u32-strcoll (Depends-on): Add
+ uniconv/u32-strconv-to-enc, localcharset. Remove
+ uniconv/u32-strconv-to-locale.
+ (configure.ac): Bump version number.
+
2010-05-24 Bruno Haible <bruno@clisp.org>
Avoid a test failure on NetBSD 5.0.
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;
+ const char *encoding = locale_charset ();
char *sl1;
char *sl2;
int result;
- sl1 = U_STRCONV_TO_LOCALE (s1);
+ /* Pass iconveh_error here, not iconveh_question_mark. Otherwise the
+ conversion to locale encoding can do transliteration or map some
+ characters to question marks, leading to results that depend on the
+ iconv() implementation and are not obvious. */
+ sl1 = U_STRCONV_TO_ENCODING (s1, encoding, iconveh_error);
if (sl1 != NULL)
{
- sl2 = U_STRCONV_TO_LOCALE (s2);
+ sl2 = U_STRCONV_TO_ENCODING (s2, encoding, iconveh_error);
if (sl2 != NULL)
{
/* Compare sl1 and sl2. */
/* strcoll succeeded. */
free (sl1);
free (sl2);
- /* The conversion to locale encoding can do transliteration or
- map some characters to question marks. Therefore sl1 and sl2
- may be equal when s1 and s2 were in fact different. Return a
- nonzero result in this case. */
+ /* The conversion to locale encoding can drop Unicode TAG
+ characters. Therefore sl1 and sl2 may be equal when s1
+ and s2 were in fact different. Return a nonzero result
+ in this case. */
if (result == 0)
result = U_STRCMP (s1, s2);
}
else
{
final_errno = errno;
- sl2 = U_STRCONV_TO_LOCALE (s2);
+ sl2 = U_STRCONV_TO_ENCODING (s2, encoding, iconveh_error);
if (sl2 != NULL)
{
/* s2 could be converted to locale encoding, s1 not. */
#define FUNC u16_strcoll
#define UNIT uint16_t
#define U_STRCMP u16_strcmp
-#define U_STRCONV_TO_LOCALE u16_strconv_to_locale
+#define U_STRCONV_TO_ENCODING u16_strconv_to_encoding
#include "u-strcoll.h"
#define FUNC u32_strcoll
#define UNIT uint32_t
#define U_STRCMP u32_strcmp
-#define U_STRCONV_TO_LOCALE u32_strconv_to_locale
+#define U_STRCONV_TO_ENCODING u32_strconv_to_encoding
#include "u-strcoll.h"
#define FUNC u8_strcoll
#define UNIT uint8_t
#define U_STRCMP u8_strcmp
-#define U_STRCONV_TO_LOCALE u8_strconv_to_locale
+#define U_STRCONV_TO_ENCODING u8_strconv_to_encoding
#include "u-strcoll.h"
Depends-on:
unistr/base
unistr/u16-strcmp
-uniconv/u16-strconv-to-locale
+uniconv/u16-strconv-to-enc
+localcharset
configure.ac:
-gl_LIBUNISTRING_LIBSOURCE([0.9.3], [unistr/u16-strcoll.c])
+gl_LIBUNISTRING_LIBSOURCE([0.9.4], [unistr/u16-strcoll.c])
Makefile.am:
Depends-on:
unistr/base
unistr/u32-strcmp
-uniconv/u32-strconv-to-locale
+uniconv/u32-strconv-to-enc
+localcharset
configure.ac:
-gl_LIBUNISTRING_LIBSOURCE([0.9.3], [unistr/u32-strcoll.c])
+gl_LIBUNISTRING_LIBSOURCE([0.9.4], [unistr/u32-strcoll.c])
Makefile.am:
Depends-on:
unistr/base
unistr/u8-strcmp
-uniconv/u8-strconv-to-locale
+uniconv/u8-strconv-to-enc
+localcharset
configure.ac:
-gl_LIBUNISTRING_LIBSOURCE([0.9.3], [unistr/u8-strcoll.c])
+gl_LIBUNISTRING_LIBSOURCE([0.9.4], [unistr/u8-strcoll.c])
Makefile.am: