X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Funicodeio.c;h=62aee248bb26798895d25489ec04404f468be0f0;hb=43593319b31e6b0175b8eec4433bac744959822d;hp=9d50a408581a854c38a2e4f736f7e72e29b78831;hpb=bae05e823b4a65a90f48e7bafbfefd7b3e4fe114;p=gnulib.git diff --git a/lib/unicodeio.c b/lib/unicodeio.c index 9d50a4085..62aee248b 100644 --- a/lib/unicodeio.c +++ b/lib/unicodeio.c @@ -1,6 +1,6 @@ /* Unicode character output to streams with locale dependent encoding. - Copyright (C) 2000-2003, 2006, 2008 Free Software Foundation, Inc. + Copyright (C) 2000-2003, 2006, 2008-2013 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -62,11 +62,11 @@ Assumes that the locale doesn't change between two calls. */ long unicode_to_mb (unsigned int code, - long (*success) (const char *buf, size_t buflen, - void *callback_arg), - long (*failure) (unsigned int code, const char *msg, - void *callback_arg), - void *callback_arg) + long (*success) (const char *buf, size_t buflen, + void *callback_arg), + long (*failure) (unsigned int code, const char *msg, + void *callback_arg), + void *callback_arg) { static int initialized; static int is_utf8; @@ -84,12 +84,12 @@ unicode_to_mb (unsigned int code, is_utf8 = !strcmp (charset, UTF8_NAME); #if HAVE_ICONV if (!is_utf8) - { - utf8_to_local = iconv_open (charset, UTF8_NAME); - if (utf8_to_local == (iconv_t)(-1)) - /* For an unknown encoding, assume ASCII. */ - utf8_to_local = iconv_open ("ASCII", UTF8_NAME); - } + { + utf8_to_local = iconv_open (charset, UTF8_NAME); + if (utf8_to_local == (iconv_t)(-1)) + /* For an unknown encoding, assume ASCII. */ + utf8_to_local = iconv_open ("ASCII", UTF8_NAME); + } #endif initialized = 1; } @@ -99,7 +99,7 @@ unicode_to_mb (unsigned int code, { #if HAVE_ICONV if (utf8_to_local == (iconv_t)(-1)) - return failure (code, N_("iconv function not usable"), callback_arg); + return failure (code, N_("iconv function not usable"), callback_arg); #else return failure (code, N_("iconv function not available"), callback_arg); #endif @@ -127,24 +127,26 @@ unicode_to_mb (unsigned int code, /* Convert the character from UTF-8 to the locale's charset. */ res = iconv (utf8_to_local, - (ICONV_CONST char **)&inptr, &inbytesleft, - &outptr, &outbytesleft); + (ICONV_CONST char **)&inptr, &inbytesleft, + &outptr, &outbytesleft); if (inbytesleft > 0 || res == (size_t)(-1) - /* Irix iconv() inserts a NUL byte if it cannot convert. */ + /* Irix iconv() inserts a NUL byte if it cannot convert. */ # if !defined _LIBICONV_VERSION && (defined sgi || defined __sgi) - || (res > 0 && code != 0 && outptr - outbuf == 1 && *outbuf == '\0') + || (res > 0 && code != 0 && outptr - outbuf == 1 && *outbuf == '\0') # endif ) - return failure (code, NULL, callback_arg); + return failure (code, NULL, callback_arg); /* Avoid glibc-2.1 bug and Solaris 7 bug. */ # if defined _LIBICONV_VERSION \ - || !((__GLIBC__ - 0 == 2 && __GLIBC_MINOR__ - 0 <= 1) || defined __sun) + || !(((__GLIBC__ - 0 == 2 && __GLIBC_MINOR__ - 0 <= 1) \ + && !defined __UCLIBC__) \ + || defined __sun) /* Get back to the initial shift state. */ res = iconv (utf8_to_local, NULL, NULL, &outptr, &outbytesleft); if (res == (size_t)(-1)) - return failure (code, NULL, callback_arg); + return failure (code, NULL, callback_arg); # endif return success (outbuf, outptr - outbuf, callback_arg); @@ -162,26 +164,33 @@ fwrite_success_callback (const char *buf, size_t buflen, void *callback_arg) { FILE *stream = (FILE *) callback_arg; + /* The return value of fwrite can be ignored here, because under normal + conditions (STREAM is an open stream and not wide-character oriented) + when fwrite() returns a value != buflen it also sets STREAM's error + indicator. */ fwrite (buf, 1, buflen, stream); return 0; } /* Simple failure callback that displays an error and exits. */ static long -exit_failure_callback (unsigned int code, const char *msg, void *callback_arg) +exit_failure_callback (unsigned int code, const char *msg, + void *callback_arg _GL_UNUSED) { if (msg == NULL) error (1, 0, _("cannot convert U+%04X to local character set"), code); else error (1, 0, _("cannot convert U+%04X to local character set: %s"), code, - gettext (msg)); + gettext (msg)); return -1; } /* Simple failure callback that displays a fallback representation in plain ASCII, using the same notation as ISO C99 strings. */ static long -fallback_failure_callback (unsigned int code, const char *msg, void *callback_arg) +fallback_failure_callback (unsigned int code, + const char *msg _GL_UNUSED, + void *callback_arg) { FILE *stream = (FILE *) callback_arg; @@ -199,8 +208,8 @@ void print_unicode_char (FILE *stream, unsigned int code, int exit_on_error) { unicode_to_mb (code, fwrite_success_callback, - exit_on_error - ? exit_failure_callback - : fallback_failure_callback, - stream); + exit_on_error + ? exit_failure_callback + : fallback_failure_callback, + stream); }