From 8bda5a9b0ee0e57039f8093ab0506ce5d2844daa Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sat, 5 Feb 2011 02:24:20 +0100 Subject: [PATCH] wcsrtombs: Prepare for new module wwcsrtombs. * lib/wcsrtombs-impl.h: New file, extracted from lib/wcsrtombs.c. * lib/wcsrtombs.c: Include it. * modules/wcsrtombs (Files): Add lib/wcsrtombs-impl.h. --- ChangeLog | 5 +++ lib/wcsrtombs-impl.h | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/wcsrtombs.c | 74 +----------------------------------------- modules/wcsrtombs | 1 + 4 files changed, 97 insertions(+), 73 deletions(-) create mode 100644 lib/wcsrtombs-impl.h diff --git a/ChangeLog b/ChangeLog index 9e421b74d..6d23fb96e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2011-02-04 Bruno Haible + wcsrtombs: Prepare for new module wwcsrtombs. + * lib/wcsrtombs-impl.h: New file, extracted from lib/wcsrtombs.c. + * lib/wcsrtombs.c: Include it. + * modules/wcsrtombs (Files): Add lib/wcsrtombs-impl.h. + mbsnrtowcs: Prepare for new module mbsnrtowwcs. * lib/mbsnrtowcs-impl.h: New file, extracted from lib/mbsnrtowcs.c. * lib/mbsnrtowcs.c: Include it. diff --git a/lib/wcsrtombs-impl.h b/lib/wcsrtombs-impl.h new file mode 100644 index 000000000..a0a522ec9 --- /dev/null +++ b/lib/wcsrtombs-impl.h @@ -0,0 +1,90 @@ +/* Convert wide string to string. + 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 + 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 . */ + +size_t +wcsrtombs (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps) +{ + if (ps == NULL) + ps = &_gl_wcsrtombs_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); + } +} diff --git a/lib/wcsrtombs.c b/lib/wcsrtombs.c index be88e31c6..72423b524 100644 --- a/lib/wcsrtombs.c +++ b/lib/wcsrtombs.c @@ -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 = &_gl_wcsrtombs_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 diff --git a/modules/wcsrtombs b/modules/wcsrtombs index 876f3690f..235b06b04 100644 --- a/modules/wcsrtombs +++ b/modules/wcsrtombs @@ -3,6 +3,7 @@ wcsrtombs() function: convert wide string to string. Files: lib/wcsrtombs.c +lib/wcsrtombs-impl.h lib/wcsrtombs-state.c m4/wcsrtombs.m4 m4/mbrtowc.m4 -- 2.11.0