size_t _Locale_mbtowc(struct _Locale_ctype *l, wchar_t *to, const char *from, size_t n, mbstate_t *shift_state) { int ret; if (to) ret = __mbrtowc(to, from, n, shift_state); else ret = __mbrlen(from, n, shift_state); return ret; }
int __mbtowc(wchar_t* pwc, const char* s, size_t n) { static mbstate_t internalMbState; int result = __mbrtowc(pwc, s, n, &internalMbState); if (result == -2) { __set_errno(EILSEQ); result = -1; } return result; }
int mblen(const char *s, size_t n) { static const mbstate_t initial; static mbstate_t mbs; size_t rval; if (s == NULL) { /* No support for state dependent encodings. */ mbs = initial; return (0); } rval = __mbrtowc(NULL, s, n, &mbs); if (rval == (size_t)-1 || rval == (size_t)-2) return (-1); return ((int)rval); }
/* Convert the multibyte character at S, which is no longer than N characters, to its `wchar_t' representation, placing this n *PWC and returning its length. Attention: this function should NEVER be intentionally used. The interface is completely stupid. The state is shared between all conversion functions. You should use instead the restartable version `mbrtowc'. */ int mbtowc (wchar_t *pwc, const char *s, size_t n) { int result; static mbstate_t state; /* If S is NULL the function has to return null or not null depending on the encoding having a state depending encoding or not. */ if (s == NULL) { const struct gconv_fcts *fcts; /* Get the conversion functions. */ fcts = get_gconv_fcts (_NL_CURRENT_DATA (LC_CTYPE)); /* This is an extension in the Unix standard which does not directly violate ISO C. */ memset (&state, '\0', sizeof state); result = fcts->towc->__stateful; } else if (*s == '\0') { if (pwc != NULL) *pwc = L'\0'; result = 0; } else { result = __mbrtowc (pwc, s, n, &state); /* The `mbrtowc' functions tell us more than we need. Fold the -1 and -2 result into -1. */ if (result < 0) result = -1; } return result; }
/* Return the length of the multibyte character (if there is one) at S which is no longer than N characters. The ISO C standard says that the `mblen' function must not change the state of the `mbtowc' function. */ int mblen (const char *s, size_t n) { int result; /* If S is NULL the function has to return null or not null depending on the encoding having a state depending encoding or not. */ if (s == NULL) { const struct gconv_fcts *fcts; /* Get the conversion functions. */ fcts = get_gconv_fcts (_NL_CURRENT_DATA (LC_CTYPE)); /* Reset the state. */ memset (&state, '\0', sizeof state); result = fcts->towc->__stateful; } else if (*s == '\0') /* According to the ISO C 89 standard this is the expected behaviour. */ result = 0; else { memset (&state, '\0', sizeof state); result = __mbrtowc (NULL, s, n, &state); /* The `mbrtowc' functions tell us more than we need. Fold the -1 and -2 result into -1. */ if (result < 0) result = -1; } return result; }
/* Convert the multibyte character at S, which is no longer than N characters, to its `wchar_t' representation, placing this n *PWC and returning its length. Attention: this function should NEVER be intentionally used. The interface is completely stupid. The state is shared between all conversion functions. You should use instead the restartable version `mbrtowc'. */ int mbtowc (wchar_t *pwc, const char *s, size_t n) { int result; /* If S is NULL the function has to return null or not null depending on the encoding having a state depending encoding or not. */ if (s == NULL) { /* Make sure we use the correct value. */ update_conversion_ptrs (); /* This is an extension in the Unix standard which does not directly violate ISO C. */ memset (&__no_r_state, '\0', sizeof __no_r_state); result = __wcsmbs_gconv_fcts.towc->__stateful; } else if (*s == '\0') { if (pwc != NULL) *pwc = L'\0'; result = 0; } else { result = __mbrtowc (pwc, s, n, &__no_r_state); /* The `mbrtowc' functions tell us more than we need. Fold the -1 and -2 result into -1. */ if (result < 0) result = -1; } return result; }