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