crt: Split mbrtowc.c into 3 files mbrlen.c mbrtowc.c and mbsrtowcs.c Put every function into its own file, so at the link time only used function are statically linked and not all of them. Signed-off-by: Martin Storsjö <martin@martin.st>
diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am index d2347cc..876b343 100644 --- a/mingw-w64-crt/Makefile.am +++ b/mingw-w64-crt/Makefile.am
@@ -346,7 +346,9 @@ misc/iswblank.c \ misc/_isblank_l.c \ misc/_iswblank_l.c \ + misc/mbrlen.c \ misc/mbrtowc.c \ + misc/mbsrtowcs.c \ misc/wcrtomb.c \ misc/wctrans.c \ misc/wctype.c \ @@ -908,7 +910,9 @@ misc/_set_fmode.c \ misc/imaxabs.c \ misc/invalid_parameter_handler.c \ + misc/mbrlen.c \ misc/mbrtowc.c \ + misc/mbsrtowcs.c \ misc/output_format.c \ misc/strnlen.c \ misc/wassert.c \
diff --git a/mingw-w64-crt/misc/mbrlen.c b/mingw-w64-crt/misc/mbrlen.c new file mode 100644 index 0000000..19afda5 --- /dev/null +++ b/mingw-w64-crt/misc/mbrlen.c
@@ -0,0 +1,20 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the mingw-w64 runtime package. + * No warranty is given; refer to the file DISCLAIMER.PD within this package. + */ +#include <wchar.h> + +size_t mbrlen ( + const char *__restrict__ mbs, + size_t count, + mbstate_t *__restrict__ state +) { + /* Use private `mbstate_t` if caller did not supply one */ + if (state == NULL) { + static mbstate_t state_mbrlen = {0}; + state = &state_mbrlen; + } + wchar_t wc = WEOF; + return mbrtowc (&wc, mbs, count, state); +}
diff --git a/mingw-w64-crt/misc/mbrtowc.c b/mingw-w64-crt/misc/mbrtowc.c index fff77cc..be5830a 100644 --- a/mingw-w64-crt/misc/mbrtowc.c +++ b/mingw-w64-crt/misc/mbrtowc.c
@@ -126,97 +126,3 @@ errno = EINVAL; return (size_t) -1; } - -size_t mbrlen ( - const char *__restrict__ mbs, - size_t count, - mbstate_t *__restrict__ state -) { - /* Use private `mbstate_t` if caller did not supply one */ - if (state == NULL) { - static mbstate_t state_mbrlen = {0}; - state = &state_mbrlen; - } - wchar_t wc = WEOF; - return mbrtowc (&wc, mbs, count, state); -} - -size_t mbsrtowcs ( - wchar_t *wcs, - const char **__restrict__ mbs, - size_t count, - mbstate_t *__restrict__ state -) { - /* Use private `mbstate_t` if caller did not supply one */ - if (state == NULL) { - static mbstate_t state_mbsrtowcs = {0}; - state = &state_mbsrtowcs; - } - - /* Treat `state` as array of bytes */ - union { - mbstate_t state; - char bytes[4]; - } conversion_state = {.state = *state}; - - /* Total number of wide character written to `wcs` */ - size_t wcConverted = 0; - /* Converted wide character */ - wchar_t wc = 0; - - /* Next multibyte character to convert */ - const char *mbc = *mbs; - - /* Maximum character length in `cp` */ - int mb_cur_max = ___mb_cur_max_func(); - - while (1) { - const size_t length = mbrtowc ( - &wc, mbc, mb_cur_max, &conversion_state.state - ); - - /* Conversion failed */ - if (length == (size_t) -1) { - if (wcs != NULL) { - *mbs = mbc; - *state = conversion_state.state; - } - return (size_t) -1; - } - - /* POSIX and ISO C are silent about this */ - if (wcs != NULL && count == 0) { - return 0; - } - - /* Store terminating L'\0' and stop */ - if (length == 0) { - if (wcs != NULL) { - *wcs = L'\0'; - *mbs = NULL; - } - break; - } - - /* Store converted `wc` in `wcs` */ - if (wcs != NULL) { - *wcs = wc; - wcs += 1; - } - - wcConverted += 1; - mbc += length; - - /* `count` wide characters have been stored in `wcs`, stop */ - if (wcs != NULL && wcConverted == count) { - *mbs = mbc; - break; - } - } - - if (wcs != NULL) { - *state = conversion_state.state; - } - - return wcConverted; -}
diff --git a/mingw-w64-crt/misc/mbsrtowcs.c b/mingw-w64-crt/misc/mbsrtowcs.c new file mode 100644 index 0000000..2e63672 --- /dev/null +++ b/mingw-w64-crt/misc/mbsrtowcs.c
@@ -0,0 +1,88 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the mingw-w64 runtime package. + * No warranty is given; refer to the file DISCLAIMER.PD within this package. + */ +#include <locale.h> +#include <wchar.h> +#include <stdlib.h> + +size_t mbsrtowcs ( + wchar_t *wcs, + const char **__restrict__ mbs, + size_t count, + mbstate_t *__restrict__ state +) { + /* Use private `mbstate_t` if caller did not supply one */ + if (state == NULL) { + static mbstate_t state_mbsrtowcs = {0}; + state = &state_mbsrtowcs; + } + + /* Treat `state` as array of bytes */ + union { + mbstate_t state; + char bytes[4]; + } conversion_state = {.state = *state}; + + /* Total number of wide character written to `wcs` */ + size_t wcConverted = 0; + /* Converted wide character */ + wchar_t wc = 0; + + /* Next multibyte character to convert */ + const char *mbc = *mbs; + + /* Maximum character length in `cp` */ + int mb_cur_max = ___mb_cur_max_func(); + + while (1) { + const size_t length = mbrtowc ( + &wc, mbc, mb_cur_max, &conversion_state.state + ); + + /* Conversion failed */ + if (length == (size_t) -1) { + if (wcs != NULL) { + *mbs = mbc; + *state = conversion_state.state; + } + return (size_t) -1; + } + + /* POSIX and ISO C are silent about this */ + if (wcs != NULL && count == 0) { + return 0; + } + + /* Store terminating L'\0' and stop */ + if (length == 0) { + if (wcs != NULL) { + *wcs = L'\0'; + *mbs = NULL; + } + break; + } + + /* Store converted `wc` in `wcs` */ + if (wcs != NULL) { + *wcs = wc; + wcs += 1; + } + + wcConverted += 1; + mbc += length; + + /* `count` wide characters have been stored in `wcs`, stop */ + if (wcs != NULL && wcConverted == count) { + *mbs = mbc; + break; + } + } + + if (wcs != NULL) { + *state = conversion_state.state; + } + + return wcConverted; +}