diff options
author | Bruno Haible <bruno@clisp.org> | 2009-04-26 15:31:18 +0200 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2009-04-26 15:31:18 +0200 |
commit | 7723389f98b6159511dea9bd60bf41ec99f0ae14 (patch) | |
tree | 85c45c416585ebb55d87397625683a33497363b3 /lib/uniconv | |
parent | a5bd4a560247e63db562041f9d136ba83a8b95fb (diff) | |
download | gnulib-7723389f98b6159511dea9bd60bf41ec99f0ae14.tar.gz |
Simplify calling convention of u*_conv_to_encoding.
Diffstat (limited to 'lib/uniconv')
-rw-r--r-- | lib/uniconv/u-conv-to-enc.h | 61 | ||||
-rw-r--r-- | lib/uniconv/u8-conv-to-enc.c | 49 |
2 files changed, 74 insertions, 36 deletions
diff --git a/lib/uniconv/u-conv-to-enc.h b/lib/uniconv/u-conv-to-enc.h index 144ea40171..f8840c2577 100644 --- a/lib/uniconv/u-conv-to-enc.h +++ b/lib/uniconv/u-conv-to-enc.h @@ -14,15 +14,17 @@ You should have received a copy of the GNU Lesser General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ -int +char * FUNC (const char *tocode, enum iconv_ilseq_handler handler, const UNIT *src, size_t srclen, size_t *offsets, - char **resultp, size_t *lengthp) + char *resultbuf, size_t *lengthp) { #if HAVE_UTF_NAME size_t *scaled_offsets; + char *result; + size_t length; int retval; if (offsets != NULL && srclen > 0) @@ -32,42 +34,59 @@ FUNC (const char *tocode, if (scaled_offsets == NULL) { errno = ENOMEM; - return -1; + return NULL; } } else scaled_offsets = NULL; + result = resultbuf; + length = *lengthp; retval = mem_iconveha ((const char *) src, srclen * sizeof (UNIT), UTF_NAME, tocode, handler == iconveh_question_mark, handler, - scaled_offsets, resultp, lengthp); + scaled_offsets, &result, &length); + if (retval < 0) + { + int saved_errno = errno; + free (scaled_offsets); + errno = saved_errno; + return NULL; + } if (offsets != NULL) { - if (retval >= 0) - { - /* Convert scaled_offsets[srclen * sizeof (UNIT)] to - offsets[srclen]. */ - size_t i; + /* Convert scaled_offsets[srclen * sizeof (UNIT)] to + offsets[srclen]. */ + size_t i; - for (i = 0; i < srclen; i++) - offsets[i] = scaled_offsets[i * sizeof (UNIT)]; - } + for (i = 0; i < srclen; i++) + offsets[i] = scaled_offsets[i * sizeof (UNIT)]; free (scaled_offsets); } - return retval; + + if (result == NULL) /* when (resultbuf == NULL && length == 0) */ + { + result = (char *) malloc (1); + if (result == NULL) + { + errno = ENOMEM; + return NULL; + } + } + *lengthp = length; + return result; #else uint8_t tmpbuf[4096]; size_t tmpbufsize = SIZEOF (tmpbuf); uint8_t *utf8_src; size_t utf8_srclen; size_t *scaled_offsets; - int retval; + char *result; utf8_src = U_TO_U8 (src, srclen, tmpbuf, &tmpbufsize); if (utf8_src == NULL) - return -1; + return NULL; utf8_srclen = tmpbufsize; if (offsets != NULL && utf8_srclen > 0) @@ -78,22 +97,22 @@ FUNC (const char *tocode, if (utf8_src != tmpbuf) free (utf8_src); errno = ENOMEM; - return -1; + return NULL; } } else scaled_offsets = NULL; - retval = u8_conv_to_encoding (tocode, handler, utf8_src, utf8_srclen, - scaled_offsets, resultp, lengthp); - if (retval < 0) + result = u8_conv_to_encoding (tocode, handler, utf8_src, utf8_srclen, + scaled_offsets, resultbuf, lengthp); + if (result == NULL) { int saved_errno = errno; free (scaled_offsets); if (utf8_src != tmpbuf) free (utf8_src); errno = saved_errno; - return -1; + return NULL; } if (offsets != NULL) { @@ -134,6 +153,6 @@ FUNC (const char *tocode, } if (utf8_src != tmpbuf) free (utf8_src); - return retval; + return result; #endif } diff --git a/lib/uniconv/u8-conv-to-enc.c b/lib/uniconv/u8-conv-to-enc.c index 85404d4be9..5aec163a11 100644 --- a/lib/uniconv/u8-conv-to-enc.c +++ b/lib/uniconv/u8-conv-to-enc.c @@ -29,47 +29,66 @@ #include "striconveha.h" #include "unistr.h" -int +char * u8_conv_to_encoding (const char *tocode, enum iconv_ilseq_handler handler, const uint8_t *src, size_t srclen, size_t *offsets, - char **resultp, size_t *lengthp) + char *resultbuf, size_t *lengthp) { - char *result; - if (STRCASEEQ (tocode, "UTF-8", 'U','T','F','-','8',0,0,0,0)) { + char *result; + /* Conversion from UTF-8 to UTF-8. No need to go through iconv(). */ #if CONFIG_UNICODE_SAFETY if (u8_check (src, srclen)) { errno = EILSEQ; - return -1; + return NULL; } #endif /* Memory allocation. */ - if ((*resultp != NULL && *lengthp >= srclen) || srclen == 0) - result = *resultp; + if (resultbuf != NULL && *lengthp >= srclen) + result = resultbuf; else { - result = (char *) malloc (srclen); + result = (char *) malloc (srclen > 0 ? srclen : 1); if (result == NULL) { errno = ENOMEM; - return -1; + return NULL; } } memcpy (result, (const char *) src, srclen); - *resultp = result; *lengthp = srclen; - return 0; + return result; } else - return mem_iconveha ((const char *) src, srclen, - "UTF-8", tocode, - handler == iconveh_question_mark, handler, - offsets, resultp, lengthp); + { + char *result = resultbuf; + size_t length = *lengthp; + int retval = + mem_iconveha ((const char *) src, srclen, + "UTF-8", tocode, + handler == iconveh_question_mark, handler, + offsets, &result, &length); + + if (retval < 0) + return NULL; + + if (result == NULL) /* when (resultbuf == NULL && length == 0) */ + { + result = (char *) malloc (1); + if (result == NULL) + { + errno = ENOMEM; + return NULL; + } + } + *lengthp = length; + return result; + } } |