changeset 10225:263c02b12cef

Avoid question marks in proper_name_utf8 result.
author Bruno Haible <bruno@clisp.org>
date Sat, 21 Jun 2008 17:50:05 +0200
parents bc89433c293a
children 79eaf2932dad
files ChangeLog lib/propername.c
diffstat 2 files changed, 37 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-06-21  Bruno Haible  <bruno@clisp.org>
+
+	* lib/propername.c (proper_name_utf8): Don't use the transliterated
+	result if it contains question marks.
+	Reported by Michael Geng <linux@michaelgeng.de>.
+
 2008-06-19  Bruno Haible  <bruno@clisp.org>
 
 	Fix CVS-ism.
--- a/lib/propername.c
+++ b/lib/propername.c
@@ -205,15 +205,32 @@
 # 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 @@
     }
 }
 
-#ifdef TEST
+#ifdef TEST1
 # include <locale.h>
 int
 main (int argc, char *argv[])
@@ -281,3 +298,15 @@
   return 0;
 }
 #endif
+
+#ifdef TEST2
+# include <locale.h>
+# include <stdio.h>
+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