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