#include <precomp.h> /********************************************************************* * _mbstowcs_l (MSVCRT.@) */ size_t CDECL _mbstowcs_l(wchar_t *wcstr, const char *mbstr, size_t count, _locale_t locale) { MSVCRT_pthreadlocinfo locinfo; size_t i, size; if(!mbstr) { _set_errno(EINVAL); return -1; } if(!locale) locinfo = get_locinfo(); else locinfo = ((MSVCRT__locale_t)locale)->locinfo; if(!locinfo->lc_codepage) { if(!wcstr) return strlen(mbstr); for(i=0; i<count; i++) { wcstr[i] = (unsigned char)mbstr[i]; if(!wcstr[i]) break; } return i; } /* Ignore count parameter */ if(!wcstr) return MultiByteToWideChar(locinfo->lc_codepage, 0, mbstr, -1, NULL, 0)-1; for(i=0, size=0; i<count; i++) { if(mbstr[size] == '\0') break; size += (_isleadbyte_l((unsigned char)mbstr[size], locale) ? 2 : 1); } if(size) { size = MultiByteToWideChar(locinfo->lc_codepage, 0, mbstr, size, wcstr, count); if(!size) { if(count) wcstr[0] = '\0'; _set_errno(EILSEQ); return -1; } } if(size<count) wcstr[size] = '\0'; return size; } /* * @implemented */ size_t mbstowcs (wchar_t *widechar, const char *multibyte, size_t number) { return _mbstowcs_l(widechar, multibyte, number, NULL); }