update for HEAD-2003021201
[reactos.git] / lib / msvcrt / stdlib / mbstowcs.c
index 0aac3f1..752f2fc 100644 (file)
+#include <windows.h>
 #include <msvcrt/stdlib.h>
 
-size_t mbstowcs( wchar_t *wcstr, const char *mbstr, size_t count )
+#if 1
+size_t mbstowcs(wchar_t* wcstr, const char* mbstr, size_t count)
 {
-       return 0;
+       size_t size;
+    int i;
+
+    printf("\nmbstowcs(%p, %p, %d) called.\n\n", wcstr, mbstr, count);
+
+    if (count <= 0 || !mbstr)
+        return 0;
+
+    if (!*mbstr)
+        return 0;
+
+
+    if (wcstr == NULL) {
+        // return required size for the converted string
+        return strlen(mbstr); // TODO: fixme
+    }
+    for (size = 0, i = 0; i < count; size++) {
+        int result;
+
+////int mbtowc( wchar_t *wchar, const char *mbchar, size_t count )
+////        result = mbtowc(wcstr + size, mbstr + i, count - i);
+//        result = mbtowc(wcstr + size, mbstr + i, 1);
+
+/////////////////////////////////////////
+        if (mbstr[i] == 0) {
+            result = 0;
+        } else {
+            wcstr[size] = mbstr[i];
+            result = 1;
+        }
+/////////////////////////////////////////
+        if (result == -1) {
+            return -1;
+        } else if (result == 0) {
+            wcstr[size] = L'\0';
+            break;
+        } else {
+            i += result;
+        }
+
+    }
+       return size;
+}
+
+#else
+#if 1
+
+//int mbtowc(wchar_t *dst, const char *str, size_t n)
+size_t mbstowcs(wchar_t* wcstr, const char* mbstr, size_t count)
+{
+    size_t len;
+
+    if (count <= 0 || !mbstr)
+        return 0;
+    len = MultiByteToWideChar(CP_ACP, 0, mbstr, count, wcstr, (wcstr == NULL) ? 0 : count);
+
+    if (!len) {
+        DWORD err = GetLastError();
+        switch (err) {
+        case ERROR_INSUFFICIENT_BUFFER:
+            break;
+        case ERROR_INVALID_FLAGS:
+            break;
+        case ERROR_INVALID_PARAMETER:
+            break;
+        case ERROR_NO_UNICODE_TRANSLATION:
+            break;
+        default:
+            return 1;
+        }
+        return -1;
+    }
+    /* return the number of bytes from src that have been used */
+    if (!*mbstr)
+        return 0;
+//    if (count >= 2 && isleadbyte(*mbstr) && mbstr[1])
+//        return 2;
+    return len;
 }
 
-int mbtowc( wchar_t *wchar, const char *mbchar, size_t count )
+#else
+
+size_t mbstowcs(wchar_t* wcstr, const char* mbstr, size_t count)
 {
-       return 0;
-}
\ No newline at end of file
+       size_t size;
+    int i;
+
+    if (wcstr == NULL) {
+        // return required size for the converted string
+        return strlen(mbstr); // TODO: fixme
+    }
+    for (size = 0, i = 0; i < count; size++) {
+        int result;
+
+//int mbtowc( wchar_t *wchar, const char *mbchar, size_t count )
+//        result = mbtowc(wcstr + size, mbstr + i, count - i);
+        result = mbtowc(wcstr + size, mbstr + i, 1);
+        if (result == -1) {
+            return -1;
+        } else if (result == 0) {
+            wcstr[size] = L'\0';
+            break;
+        } else {
+            i += result;
+        }
+
+    }
+       return (size_t)size;
+}
+
+#endif
+#endif