changeset 7930:8929067c3772

Make the striconveha module actually work.
author Bruno Haible <bruno@clisp.org>
date Wed, 24 Jan 2007 00:48:01 +0000
parents dd05f4bdf2f2
children 0a4679777f66
files ChangeLog lib/striconveha.c
diffstat 2 files changed, 50 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2007-01-23  Bruno Haible  <bruno@clisp.org>
+
+	* lib/striconveha.c (mem_iconveha): Fix endless recursion. Try all
+	encodings without forgiving before trying any encoding with handler.
+	(str_iconveha): Try all encodings without forgiving before trying any
+	encoding with handler.
+
 2007-01-23  Paul Eggert  <eggert@cs.ucla.edu>
 
 	Import the following changes from libc.
--- a/lib/striconveha.c
+++ b/lib/striconveha.c
@@ -163,13 +163,32 @@
       for (alias = autodetect_list; alias != NULL; alias = alias->next)
 	if (strcmp (from_codeset, alias->name) == 0)
 	  {
-	    const char * const *encodings = alias->encodings_to_try;
+	    const char * const *encodings;
 
+	    if (handler != iconveh_error)
+	      {
+		/* First try all encodings without any forgiving.  */
+		encodings = alias->encodings_to_try;
+		do
+		  {
+		    retval = mem_iconveha (src, srclen,
+					   *encodings, to_codeset,
+					   iconveh_error, offsets,
+					   resultp, lengthp);
+		    if (!(retval < 0 && errno == EILSEQ))
+		      return retval;
+		    encodings++;
+		  }
+		while (*encodings != NULL);
+	      }
+
+	    encodings = alias->encodings_to_try;
 	    do
 	      {
 		retval = mem_iconveha (src, srclen,
-				       from_codeset, to_codeset, handler,
-				       offsets, resultp, lengthp);
+				       *encodings, to_codeset,
+				       handler, offsets,
+				       resultp, lengthp);
 		if (!(retval < 0 && errno == EILSEQ))
 		  return retval;
 		encodings++;
@@ -204,11 +223,30 @@
       for (alias = autodetect_list; alias != NULL; alias = alias->next)
 	if (strcmp (from_codeset, alias->name) == 0)
 	  {
-	    const char * const *encodings = alias->encodings_to_try;
+	    const char * const *encodings;
 
+	    if (handler != iconveh_error)
+	      {
+		/* First try all encodings without any forgiving.  */
+		encodings = alias->encodings_to_try;
+		do
+		  {
+		    result = str_iconveha (src,
+					   *encodings, to_codeset,
+					   iconveh_error);
+		    if (!(result == NULL && errno == EILSEQ))
+		      return result;
+		    encodings++;
+		  }
+		while (*encodings != NULL);
+	      }
+
+	    encodings = alias->encodings_to_try;
 	    do
 	      {
-		result = str_iconveha (src, *encodings, to_codeset, handler);
+		result = str_iconveha (src,
+				       *encodings, to_codeset,
+				       handler);
 		if (!(result == NULL && errno == EILSEQ))
 		  return result;
 		encodings++;