#include #include #undef mbsinit int mbsinit(ps) const mbstate_t *ps; { return _mbsinit_(ps); } #undef mbrlen size_t mbrlen(s, n, ps) const char *s; size_t n; mbstate_t *ps; { return _mbrtowc_(NULL, s, n, ps); } #undef mbrtowc size_t mbrtowc(pwc, s, n, ps) wchar_t *pwc; const char *s; size_t n; mbstate_t *ps; { return _mbrtowc_(pwc, s, n, ps); } #undef wcrtomb size_t wcrtomb(s, wc, ps) char *s; const wchar_t wc; mbstate_t *ps; { return _wcrtomb_(s, wc, ps); } size_t mbsrtowcs(pwcs, s, n, ps) wchar_t *pwcs; const char *s; size_t n; mbstate_t *ps; { wchar_t *pwc; size_t i; for (pwc = pwcs; 0 < n; ++pwc, --n) { i = _mbrtowc_(pwc, s, _mb_cur_max_, ps); if (i < 0) return -1; else if (i == 0 || *pwc == 0) return pwc - pwcs; s += i; } return pwc - pwcs; } size_t wcsrtombs(s, pwcs, n, ps) char *s; const wchar_t *pwcs; size_t n; mbstate_t *ps; { char *sc; size_t i; for (sc = s; 0 < n; n-=i, ++pwcs) { if (_mb_cur_max_ <= n) { if ((i = _wcrtomb_(sc, *pwcs, ps)) <= 0) return -1; } else { char buf[10]; if ((i = _wcrtomb_(buf, *pwcs, ps)) <= 0) return -1; else if (i <= n) memcpy(sc,buf,i); else { memcpy(sc,buf,n); return (sc-s+n); } } sc += i; if (sc[-1] == '\0') return sc-s-1; } return sc-s; }