X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fwcsrtombs.c;h=ebbca78f6553266843902675cc9668cb57b27049;hb=21492d6c3ca00ff0827528640804732f2ed66470;hp=1b33926684277756a3aba2bd5275ec55189d2449;hpb=999b44930f573035ae2c6531ea4b0f83ee9cd698;p=gnulib.git diff --git a/lib/wcsrtombs.c b/lib/wcsrtombs.c index 1b3392668..ebbca78f6 100644 --- a/lib/wcsrtombs.c +++ b/lib/wcsrtombs.c @@ -1,5 +1,5 @@ /* Convert wide string to string. - Copyright (C) 2008 Free Software Foundation, Inc. + Copyright (C) 2008, 2010-2011 Free Software Foundation, Inc. Written by Bruno Haible , 2008. This program is free software: you can redistribute it and/or modify @@ -20,9 +20,9 @@ /* Specification. */ #include -static mbstate_t internal_state; +extern mbstate_t _gl_wcsrtombs_state; -#if HAVE_WCSRTOMBS && !WCSRTOMBS_TERMINATION_BUG +#if HAVE_WCSRTOMBS && !WCSRTOMBS_TERMINATION_BUG && !defined GNULIB_defined_mbstate_t /* Override the system's wcsrtombs() function. */ # undef wcsrtombs @@ -31,13 +31,13 @@ size_t rpl_wcsrtombs (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps) { if (ps == NULL) - ps = &internal_state; + ps = &_gl_wcsrtombs_state; # if WCSRTOMBS_NULL_ARG_BUG if (dest == NULL) { const wchar_t *temp_src = *srcp; - return wcsrtombs (NULL, &temp_src, len, ps); + return wcsrtombs (NULL, &temp_src, (size_t)-1, ps); } else # endif @@ -51,78 +51,6 @@ rpl_wcsrtombs (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps) # include # include -size_t -wcsrtombs (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps) -{ - if (ps == NULL) - ps = &internal_state; - { - const wchar_t *src = *srcp; - size_t cur_max = MB_CUR_MAX; - char buf[64]; - - if (!(cur_max <= sizeof (buf))) - abort (); - - if (dest != NULL) - { - char *destptr = dest; - - for (; len > 0; src++) - { - wchar_t wc = *src; - size_t ret = wcrtomb (len >= cur_max ? destptr : buf, wc, ps); - - if (ret == (size_t)(-1)) - goto bad_input; - if (!(ret <= cur_max)) - abort (); - if (len < ret) - break; - if (len < cur_max) - memcpy (destptr, buf, ret); - if (wc == 0) - { - src = NULL; - /* Here mbsinit (ps). */ - break; - } - destptr += ret; - len -= ret; - } - *srcp = src; - return destptr - dest; - } - else - { - /* Ignore dest and len, don't store *srcp at the end, and - don't clobber *ps. */ - mbstate_t state = *ps; - size_t totalcount = 0; - - for (;; src++) - { - wchar_t wc = *src; - size_t ret = wcrtomb (buf, wc, &state); - - if (ret == (size_t)(-1)) - goto bad_input2; - if (wc == 0) - { - /* Here mbsinit (&state). */ - break; - } - totalcount += ret; - } - return totalcount; - } - - bad_input: - *srcp = src; - bad_input2: - errno = EILSEQ; - return (size_t)(-1); - } -} +# include "wcsrtombs-impl.h" #endif