update for HEAD-2003091401
[reactos.git] / lib / msvcrt / stdlib / mbstowcs.c
1 #include <windows.h>
2 #include <msvcrt/stdlib.h>
3
4 #if 1
5 /*
6  * @unimplemented
7  */
8 size_t mbstowcs(wchar_t* wcstr, const char* mbstr, size_t count)
9 {
10         size_t size;
11     int i;
12
13     printf("\nmbstowcs(%p, %p, %d) called.\n\n", wcstr, mbstr, count);
14
15     if (count <= 0 || !mbstr)
16         return 0;
17
18     if (!*mbstr)
19         return 0;
20
21
22     if (wcstr == NULL) {
23         // return required size for the converted string
24         return strlen(mbstr); // TODO: fixme
25     }
26     for (size = 0, i = 0; i < count; size++) {
27         int result;
28
29 ////int mbtowc( wchar_t *wchar, const char *mbchar, size_t count )
30 ////        result = mbtowc(wcstr + size, mbstr + i, count - i);
31 //        result = mbtowc(wcstr + size, mbstr + i, 1);
32
33 /////////////////////////////////////////
34         if (mbstr[i] == 0) {
35             result = 0;
36         } else {
37             wcstr[size] = mbstr[i];
38             result = 1;
39         }
40 /////////////////////////////////////////
41         if (result == -1) {
42             return -1;
43         } else if (result == 0) {
44             wcstr[size] = L'\0';
45             break;
46         } else {
47             i += result;
48         }
49
50     }
51         return size;
52 }
53
54 #else
55 #if 1
56
57 //int mbtowc(wchar_t *dst, const char *str, size_t n)
58 size_t mbstowcs(wchar_t* wcstr, const char* mbstr, size_t count)
59 {
60     size_t len;
61
62     if (count <= 0 || !mbstr)
63         return 0;
64     len = MultiByteToWideChar(CP_ACP, 0, mbstr, count, wcstr, (wcstr == NULL) ? 0 : count);
65
66     if (!len) {
67         DWORD err = GetLastError();
68         switch (err) {
69         case ERROR_INSUFFICIENT_BUFFER:
70             break;
71         case ERROR_INVALID_FLAGS:
72             break;
73         case ERROR_INVALID_PARAMETER:
74             break;
75         case ERROR_NO_UNICODE_TRANSLATION:
76             break;
77         default:
78             return 1;
79         }
80         return -1;
81     }
82     /* return the number of bytes from src that have been used */
83     if (!*mbstr)
84         return 0;
85 //    if (count >= 2 && isleadbyte(*mbstr) && mbstr[1])
86 //        return 2;
87     return len;
88 }
89
90 #else
91
92 size_t mbstowcs(wchar_t* wcstr, const char* mbstr, size_t count)
93 {
94         size_t size;
95     int i;
96
97     if (wcstr == NULL) {
98         // return required size for the converted string
99         return strlen(mbstr); // TODO: fixme
100     }
101     for (size = 0, i = 0; i < count; size++) {
102         int result;
103
104 //int mbtowc( wchar_t *wchar, const char *mbchar, size_t count )
105 //        result = mbtowc(wcstr + size, mbstr + i, count - i);
106         result = mbtowc(wcstr + size, mbstr + i, 1);
107         if (result == -1) {
108             return -1;
109         } else if (result == 0) {
110             wcstr[size] = L'\0';
111             break;
112         } else {
113             i += result;
114         }
115
116     }
117         return (size_t)size;
118 }
119
120 #endif
121 #endif