/* * @implemented */ size_t mbstowcs (wchar_t *wcstr, const char *mbstr, size_t count) { NTSTATUS Status; ULONG Size; ULONG Length; Length = (ULONG)strlen (mbstr); if (wcstr == NULL) { RtlMultiByteToUnicodeSize (&Size, mbstr, Length); return (size_t)Size; } Status = RtlMultiByteToUnicodeN (wcstr, (ULONG)count * sizeof(WCHAR), &Size, mbstr, Length); if (!NT_SUCCESS(Status)) return -1; return (size_t)Size; }
/********************************************************************* * mbstowcs (NTDLL.@) */ INT __cdecl NTDLL_mbstowcs( LPWSTR dst, LPCSTR src, INT n ) { DWORD len; if (!dst) { RtlMultiByteToUnicodeSize( &len, src, strlen(src) ); } else { if (n <= 0) return 0; RtlMultiByteToUnicodeN( dst, n*sizeof(WCHAR), &len, src, strlen(src) ); if (len / sizeof(WCHAR) < n) dst[len / sizeof(WCHAR)] = 0; } return len / sizeof(WCHAR); }
static inline int pf_output_stringA( pf_output *out, LPCSTR str, int len ) { int space = out->len - out->used; if( len < 0 ) len = strlen( str ); if( !out->unicode ) { LPSTR p = out->buf.A + out->used; if( space >= len ) { memcpy( p, str, len ); out->used += len; return len; } if( space > 0 ) memcpy( p, str, space ); out->used += len; } else { LPWSTR p = out->buf.W + out->used; ULONG n; RtlMultiByteToUnicodeSize( &n, str, len ); if (space >= n / sizeof(WCHAR)) { RtlMultiByteToUnicodeN( p, n, NULL, str, len ); out->used += n / sizeof(WCHAR); return len; } if (space > 0) RtlMultiByteToUnicodeN( p, space * sizeof(WCHAR), NULL, str, len ); out->used += n; } return -1; }