wint_t btowc (int c) { mbstate_t mbs; int retval = 0; wchar_t pwc; unsigned char b; if (c == EOF) return WEOF; b = (unsigned char)c; /* Put mbs in initial state. */ memset (&mbs, '\0', sizeof (mbs)); _REENT_CHECK_MISC(_REENT); retval = __mbtowc (_REENT, &pwc, &b, 1, __locale_charset (), &mbs); if (retval != 0 && retval != 1) return WEOF; return (wint_t)pwc; }
size_t _Locale_mbtowc(struct _Locale_ctype *ltype, wchar_t *to, const char *from, size_t n, mbstate_t *shift_state) { CPINFO ci; int result; GetCPInfo(ltype->cp, &ci); if(ci.MaxCharSize == 1) { // Single byte encoding. *shift_state = (mbstate_t)0; result = MultiByteToWideChar(ltype->cp, MB_PRECOMPOSED, from, 1, to, 1); if(result == 0) return (size_t)-1; return result; } else { // Multi byte encoding. size_t retval, count = 0; while(n--) { retval = __mbtowc(ltype, to, *from, shift_state); if(retval == -2) { from++; count++; } else if(retval == -1) return -1; else return count+retval; } if(retval == -2) return (size_t)-2; return n; } }