From: Bruno Haible Date: Sat, 21 Jun 2008 15:50:05 +0000 (+0200) Subject: Avoid question marks in proper_name_utf8 result. X-Git-Tag: v0.1~7245 X-Git-Url: http://erislabs.org.uk/gitweb/?a=commitdiff_plain;h=6b9110352459e246e99a5c2d396f5dc42d0cd32b;p=gnulib.git Avoid question marks in proper_name_utf8 result. --- diff --git a/ChangeLog b/ChangeLog index bdb444afc..81c0893f8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-06-21 Bruno Haible + + * lib/propername.c (proper_name_utf8): Don't use the transliterated + result if it contains question marks. + Reported by Michael Geng . + 2008-06-19 Bruno Haible Fix CVS-ism. diff --git a/lib/propername.c b/lib/propername.c index 0d3681e26..5cd4d8f49 100644 --- a/lib/propername.c +++ b/lib/propername.c @@ -205,15 +205,32 @@ proper_name_utf8 (const char *name_ascii, const char *name_utf8) # if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 \ || _LIBICONV_VERSION >= 0x0105 { + char *converted_translit; + size_t len = strlen (locale_code); char *locale_code_translit = XNMALLOC (len + 10 + 1, char); memcpy (locale_code_translit, locale_code, len); memcpy (locale_code_translit + len, "//TRANSLIT", 10 + 1); - name_converted_translit = alloc_name_converted_translit = + converted_translit = xstr_iconv (name_utf8, "UTF-8", locale_code_translit); free (locale_code_translit); + + if (converted_translit != NULL) + { +# if !_LIBICONV_VERSION + /* Don't use the transliteration if it added question marks. + glibc's transliteration falls back to question marks; libiconv's + transliteration does not. + mbschr is equivalent to strchr in this case. */ + if (strchr (converted_translit, '?') != NULL) + free (converted_translit); + else +# endif + name_converted_translit = alloc_name_converted_translit = + converted_translit; + } } # endif #endif @@ -270,7 +287,7 @@ proper_name_utf8 (const char *name_ascii, const char *name_utf8) } } -#ifdef TEST +#ifdef TEST1 # include int main (int argc, char *argv[]) @@ -281,3 +298,15 @@ main (int argc, char *argv[]) return 0; } #endif + +#ifdef TEST2 +# include +# include +int +main (int argc, char *argv[]) +{ + setlocale (LC_ALL, ""); + printf ("%s\n", proper_name_utf8 ("Franc,ois Pinard", "Fran\303\247ois Pinard")); + return 0; +} +#endif