From 0b8334787ce2366e410e7eca05501d3ad13de5d5 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sun, 30 Aug 2009 16:27:11 +0200 Subject: [PATCH] New module 'xstriconveh'. --- ChangeLog | 7 ++++ lib/xstriconveh.c | 86 +++++++++++++++++++++++++++++++++++++++ lib/xstriconveh.h | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++ modules/xstriconveh | 28 +++++++++++++ 4 files changed, 236 insertions(+) create mode 100644 lib/xstriconveh.c create mode 100644 lib/xstriconveh.h create mode 100644 modules/xstriconveh diff --git a/ChangeLog b/ChangeLog index bc42fb0ea..31aff1316 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2009-08-30 Bruno Haible + New module 'xstriconveh'. + * lib/xstriconveh.h: New file. + * lib/xstriconveh.c: New file. + * modules/xstriconveh: New file. + +2009-08-30 Bruno Haible + Make it easier to use mem_cd_iconveh. * lib/striconveh.h (iconveh_t): New type. (iconveh_open, iconveh_close): New declarations. diff --git a/lib/xstriconveh.c b/lib/xstriconveh.c new file mode 100644 index 000000000..46f850c13 --- /dev/null +++ b/lib/xstriconveh.c @@ -0,0 +1,86 @@ +/* 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 . */ + +#include + +/* Specification. */ +#include "xstriconveh.h" + +#include + +#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; +} diff --git a/lib/xstriconveh.h b/lib/xstriconveh.h new file mode 100644 index 000000000..e4b0bf878 --- /dev/null +++ b/lib/xstriconveh.h @@ -0,0 +1,115 @@ +/* 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 . */ + +#ifndef _XSTRICONVEH_H +#define _XSTRICONVEH_H + +#include + +/* 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 */ diff --git a/modules/xstriconveh b/modules/xstriconveh new file mode 100644 index 000000000..461d8a2ae --- /dev/null +++ b/modules/xstriconveh @@ -0,0 +1,28 @@ +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 -- 2.11.0