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;
+}