[Libguestfs] [PATCH 1/3] lib: Further generalize iconv wrapper function.

Richard W.M. Jones rjones at redhat.com
Mon Nov 25 08:44:14 UTC 2013


On Sun, Nov 24, 2013 at 11:25:51PM +0100, Hilko Bengen wrote:
> ---
>  lib/hivex-internal.h |  8 +++++---
>  lib/utf16.c          | 11 +++++++----
>  2 files changed, 12 insertions(+), 7 deletions(-)
> 
> diff --git a/lib/hivex-internal.h b/lib/hivex-internal.h
> index 4135f58..64fd49a 100644
> --- a/lib/hivex-internal.h
> +++ b/lib/hivex-internal.h
> @@ -268,11 +268,13 @@ extern size_t * _hivex_return_offset_list (offset_list *list);
>  extern void _hivex_print_offset_list (offset_list *list, FILE *fp);
>  
>  /* utf16.c */
> -extern char* _hivex_to_utf8 (/* const */ char *input, size_t len, char* input_encoding);
> +extern char* _hivex_recode (char *input_encoding,
> +                            const char *input, size_t input_len,
> +                            char *output_encoding, size_t *output_len);
>  #define _hivex_windows_utf16_to_utf8(_input, _len) \
> -  _hivex_to_utf8 (_input, _len, "UTF-16LE")
> +  _hivex_recode ("UTF-16LE", _input, _len, "UTF-8", NULL)
>  #define _hivex_windows_latin1_to_utf8(_input, _len) \
> -  _hivex_to_utf8 (_input, _len, "LATIN1")
> +  _hivex_recode ("LATIN1", _input, _len, "UTF-8", NULL)
>  extern size_t _hivex_utf16_string_len_in_bytes_max (const char *str, size_t len);
>  
>  /* util.c */
> diff --git a/lib/utf16.c b/lib/utf16.c
> index eca2343..6b8bf9a 100644
> --- a/lib/utf16.c
> +++ b/lib/utf16.c
> @@ -29,18 +29,19 @@
>  #include "hivex-internal.h"
>  
>  char *
> -_hivex_to_utf8 (/* const */ char *input, size_t len, char* input_encoding)
> +_hivex_recode (char *input_encoding, const char *input, size_t input_len,
> +               char *output_encoding, size_t *output_len)
>  {
> -  iconv_t ic = iconv_open ("UTF-8", input_encoding);
> +  iconv_t ic = iconv_open (output_encoding, input_encoding);
>    if (ic == (iconv_t) -1)
>      return NULL;
>  
>    /* iconv(3) has an insane interface ... */
>  
> -  size_t outalloc = len;
> +  size_t outalloc = input_len;
>  
>   again:;
> -  size_t inlen = len;
> +  size_t inlen = input_len;
>    size_t outlen = outalloc;
>    char *out = malloc (outlen + 1);
>    if (out == NULL) {
> @@ -79,6 +80,8 @@ _hivex_to_utf8 (/* const */ char *input, size_t len, char* input_encoding)
>  
>    *outp = '\0';
>    iconv_close (ic);
> +  if (output_len != NULL)
> +    *output_len = outp - out;
>  
>    return out;
>  }
> -- 
> 1.8.4.4

ACK.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Fedora Windows cross-compiler. Compile Windows programs, test, and
build Windows installers. Over 100 libraries supported.
http://fedoraproject.org/wiki/MinGW




More information about the Libguestfs mailing list