Bruno Haible wrote: > The module 'striconv' does not do this, but the 'striconveh' module uses > a conversion through UTF-8 if the direct conversion is not available. > I'm making the API easier to use.
And to make this API even more easier to use, here's a wrapper that deals with out-of-memory conditions. 2009-08-30 Bruno Haible <[email protected]> New module 'xstriconveh'. * lib/xstriconveh.h: New file. * lib/xstriconveh.c: New file. * modules/xstriconveh: New file. ============================== lib/xstriconveh.h ============================== /* Charset conversion with out-of-memory checking. Copyright (C) 2001-2007, 2009 Free Software Foundation, Inc. Written by Bruno Haible and Simon Josefsson. 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 the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ #ifndef _XSTRICONVEH_H #define _XSTRICONVEH_H #include <stddef.h> /* Get the 'enum iconv_ilseq_handler' and iconveh_t types, and the iconveh_open, iconveh_close declarations. */ #include "striconveh.h" #ifdef __cplusplus extern "C" { #endif #if HAVE_ICONV /* Convert an entire string from one encoding to another, using iconv. The original string is at [SRC,...,SRC+SRCLEN-1]. CD points to the conversion descriptor from FROMCODE to TOCODE, created by the function iconveh_open(). If OFFSETS is not NULL, it should point to an array of SRCLEN integers; this array is filled with offsets into the result, i.e. the character starting at SRC[i] corresponds to the character starting at (*RESULTP)[OFFSETS[i]], and other offsets are set to (size_t)(-1). *RESULTP and *LENGTH should initially be a scratch buffer and its size, or *RESULTP can initially be NULL. May erase the contents of the memory at *RESULTP. Upon memory allocation failure, report the error and exit. Return value: 0 if successful, otherwise -1 and errno set. If successful: The resulting string is stored in *RESULTP and its length in *LENGTHP. *RESULTP is set to a freshly allocated memory block, or is unchanged if no dynamic memory allocation was necessary. */ extern int xmem_cd_iconveh (const char *src, size_t srclen, const iconveh_t *cd, enum iconv_ilseq_handler handler, size_t *offsets, char **resultp, size_t *lengthp); /* Convert an entire string from one encoding to another, using iconv. The original string is the NUL-terminated string starting at SRC. CD points to the conversion descriptor from FROMCODE to TOCODE, created by the function iconveh_open(). Both the "from" and the "to" encoding must use a single NUL byte at the end of the string (i.e. not UCS-2, UCS-4, UTF-16, UTF-32). Allocate a malloced memory block for the result. Upon memory allocation failure, report the error and exit. Return value: the freshly allocated resulting NUL-terminated string if successful, otherwise NULL and errno set. */ extern char * xstr_cd_iconveh (const char *src, const iconveh_t *cd, enum iconv_ilseq_handler handler); #endif /* Convert an entire string from one encoding to another, using iconv. The original string is at [SRC,...,SRC+SRCLEN-1]. If OFFSETS is not NULL, it should point to an array of SRCLEN integers; this array is filled with offsets into the result, i.e. the character starting at SRC[i] corresponds to the character starting at (*RESULTP)[OFFSETS[i]], and other offsets are set to (size_t)(-1). *RESULTP and *LENGTH should initially be a scratch buffer and its size, or *RESULTP can initially be NULL. May erase the contents of the memory at *RESULTP. Upon memory allocation failure, report the error and exit. Return value: 0 if successful, otherwise -1 and errno set. If successful: The resulting string is stored in *RESULTP and its length in *LENGTHP. *RESULTP is set to a freshly allocated memory block, or is unchanged if no dynamic memory allocation was necessary. */ extern int xmem_iconveh (const char *src, size_t srclen, const char *from_codeset, const char *to_codeset, enum iconv_ilseq_handler handler, size_t *offsets, char **resultp, size_t *lengthp); /* Convert an entire string from one encoding to another, using iconv. The original string is the NUL-terminated string starting at SRC. Both the "from" and the "to" encoding must use a single NUL byte at the end of the string (i.e. not UCS-2, UCS-4, UTF-16, UTF-32). Allocate a malloced memory block for the result. Upon memory allocation failure, report the error and exit. Return value: the freshly allocated resulting NUL-terminated string if successful, otherwise NULL and errno set. */ extern char * xstr_iconveh (const char *src, const char *from_codeset, const char *to_codeset, enum iconv_ilseq_handler handler); #ifdef __cplusplus } #endif #endif /* _XSTRICONVEH_H */ ============================== lib/xstriconveh.c ============================== /* Charset conversion with out-of-memory checking. Copyright (C) 2009 Free Software Foundation, Inc. Written by Bruno Haible. 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 the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> /* Specification. */ #include "xstriconveh.h" #include <errno.h> #include "striconveh.h" #include "xalloc.h" #if HAVE_ICONV int xmem_cd_iconveh (const char *src, size_t srclen, const iconveh_t *cd, enum iconv_ilseq_handler handler, size_t *offsets, char **resultp, size_t *lengthp) { int retval = mem_cd_iconveh (src, srclen, cd, handler, offsets, resultp, lengthp); if (retval < 0 && errno == ENOMEM) xalloc_die (); return retval; } char * xstr_cd_iconveh (const char *src, const iconveh_t *cd, enum iconv_ilseq_handler handler) { char *result = str_cd_iconveh (src, cd, handler); if (result == NULL && errno == ENOMEM) xalloc_die (); return result; } #endif int xmem_iconveh (const char *src, size_t srclen, const char *from_codeset, const char *to_codeset, enum iconv_ilseq_handler handler, size_t *offsets, char **resultp, size_t *lengthp) { int retval = mem_iconveh (src, srclen, from_codeset, to_codeset, handler, offsets, resultp, lengthp); if (retval < 0 && errno == ENOMEM) xalloc_die (); return retval; } char * xstr_iconveh (const char *src, const char *from_codeset, const char *to_codeset, enum iconv_ilseq_handler handler) { char *result = str_iconveh (src, from_codeset, to_codeset, handler); if (result == NULL && errno == ENOMEM) xalloc_die (); return result; } ============================= modules/xstriconveh ============================= Description: Character set conversion of strings made easy, uses iconv, with out-of-memory checking. Files: lib/xstriconveh.h lib/xstriconveh.c Depends-on: striconveh xalloc configure.ac: Makefile.am: lib_SOURCES += xstriconveh.c Include: "xstriconveh.h" Link: $(LTLIBICONV) when linking with libtool, $(LIBICONV) otherwise License: GPL Maintainer: Bruno Haible
