Mercurial > hg > octave-lyh > gnulib-hg
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++;