Implement _osplatform
authorSylvain Petreolle <spetreolle@yahoo.fr>
Sun, 11 Jul 2010 16:25:30 +0000 (16:25 +0000)
committerSylvain Petreolle <spetreolle@yahoo.fr>
Sun, 11 Jul 2010 16:25:30 +0000 (16:25 +0000)
Import _makepath_s and _wmakepath_s from Wine.
Passes msvcrt data and dir tests.

svn path=/trunk/; revision=47999

reactos/dll/win32/msvcrt/dllmain.c
reactos/dll/win32/msvcrt/msvcrt.spec
reactos/lib/sdk/crt/crt.rbuild
reactos/lib/sdk/crt/misc/environ.c
reactos/lib/sdk/crt/stdlib/makepath_s.c [new file with mode: 0644]
reactos/lib/sdk/crt/stdlib/wmakpath_s.c [new file with mode: 0644]

index 99822fc..95efb2b 100644 (file)
@@ -35,6 +35,7 @@ extern int BlockEnvToEnvironW(void);
 extern void FreeEnvironment(char **environment);
 extern void _atexit_cleanup(void);
 
 extern void FreeEnvironment(char **environment);
 extern void _atexit_cleanup(void);
 
+extern unsigned int _osplatform;
 extern unsigned int _osver;
 extern unsigned int _winminor;
 extern unsigned int _winmajor;
 extern unsigned int _osver;
 extern unsigned int _winminor;
 extern unsigned int _winmajor;
@@ -72,6 +73,7 @@ DllMain(PVOID hinstDll, ULONG dwReason, PVOID reserved)
         _winver     = (osvi.dwMajorVersion << 8) | osvi.dwMinorVersion;
         _winmajor   = osvi.dwMajorVersion;
         _winminor   = osvi.dwMinorVersion;
         _winver     = (osvi.dwMajorVersion << 8) | osvi.dwMinorVersion;
         _winmajor   = osvi.dwMajorVersion;
         _winminor   = osvi.dwMinorVersion;
+        _osplatform = osvi.dwPlatformId;
         _osver      = osvi.dwBuildNumber;
         hHeap = HeapCreate(0, 100000, 0);
         if (hHeap == NULL)
         _osver      = osvi.dwBuildNumber;
         hHeap = HeapCreate(0, 100000, 0);
         if (hHeap == NULL)
index 3ccd039..c0328e1 100644 (file)
 @ cdecl _ltow(long ptr long)
 # stub _ltow_s
 @ cdecl _makepath(ptr str str str str)
 @ cdecl _ltow(long ptr long)
 # stub _ltow_s
 @ cdecl _makepath(ptr str str str str)
-# stub _makepath_s
+@ cdecl _makepath_s(ptr long str str str str)
 # stub _malloc_dbg
 @ cdecl _matherr(ptr)
 @ cdecl _mbbtombc(long)
 # stub _malloc_dbg
 @ cdecl _matherr(ptr)
 @ cdecl _mbbtombc(long)
 @ cdecl _onexit(ptr)
 @ varargs _open(str long)
 @ cdecl _open_osfhandle(long long)
 @ cdecl _onexit(ptr)
 @ varargs _open(str long)
 @ cdecl _open_osfhandle(long long)
-# stub _osplatform
+@ extern _osplatform _osplatform
 @ extern _osver _osver
 @ stub _outp #(long long)
 @ stub _outpd #(long long)
 @ extern _osver _osver
 @ stub _outp #(long long)
 @ stub _outpd #(long long)
 # stub _winput_s
 @ extern _winver
 @ cdecl _wmakepath(wstr wstr wstr wstr wstr)
 # stub _winput_s
 @ extern _winver
 @ cdecl _wmakepath(wstr wstr wstr wstr wstr)
-# stub _wmakepath_s
+@ cdecl _wmakepath_s(ptr long wstr wstr wstr wstr)
 @ cdecl _wmkdir(wstr)
 @ cdecl _wmktemp(wstr)
 # stub _wmktemp_s
 @ cdecl _wmkdir(wstr)
 @ cdecl _wmktemp(wstr)
 # stub _wmktemp_s
index 7b4bc6f..9821329 100644 (file)
                <file>gcvt.c</file>
                <file>getenv.c</file>
                <file>makepath.c</file>
                <file>gcvt.c</file>
                <file>getenv.c</file>
                <file>makepath.c</file>
+               <file>makepath_s.c</file>
                <file>mbtowc.c</file>
                <file>mbstowcs.c</file>
                <file>obsol.c</file>
                <file>mbtowc.c</file>
                <file>mbstowcs.c</file>
                <file>obsol.c</file>
                <file>wputenv.c</file>
                <file>wsenv.c</file>
                <file>wmakpath.c</file>
                <file>wputenv.c</file>
                <file>wsenv.c</file>
                <file>wmakpath.c</file>
+               <file>wmakpath_s.c</file>
        </directory>
        <directory name="string">
                <if property="ARCH" value="i386">
        </directory>
        <directory name="string">
                <if property="ARCH" value="i386">
index 845721c..3018d1c 100644 (file)
@@ -11,6 +11,7 @@
 #include <string.h>
 
 
 #include <string.h>
 
 
+unsigned int _osplatform = 0;
 unsigned int _osver = 0;
 unsigned int _winminor = 0;
 unsigned int _winmajor = 0;
 unsigned int _osver = 0;
 unsigned int _winminor = 0;
 unsigned int _winmajor = 0;
diff --git a/reactos/lib/sdk/crt/stdlib/makepath_s.c b/reactos/lib/sdk/crt/stdlib/makepath_s.c
new file mode 100644 (file)
index 0000000..b96f1f6
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * PROJECT:     ReactOS CRT library
+ * LICENSE:     See COPYING in the top level directory
+ * FILE:        lib/sdk/crt/stdlib/makepath_s.c
+ * PURPOSE:     Creates a path
+ * PROGRAMMERS: Wine team
+ *              Copyright 1996,1998 Marcus Meissner
+ *              Copyright 1996 Jukka Iivonen
+ *              Copyright 1997,2000 Uwe Bonnes
+ *              Copyright 2000 Jon Griffiths
+ *
+ */
+
+#include <precomp.h>
+#include <stdlib.h>
+#include <string.h>
+
+/*********************************************************************
+ *             _makepath_s (MSVCRT.@)
+ *
+ * Safe version of _makepath.
+ */
+int CDECL _makepath_s(char *path, size_t size, const char *drive,
+                      const char *directory, const char *filename,
+                      const char *extension)
+{
+    char *p = path;
+
+    if (!path || !size)
+    {
+        *_errno() = EINVAL;
+        return EINVAL;
+    }
+
+    if (drive && drive[0])
+    {
+        if (size <= 2)
+            goto range;
+
+        *p++ = drive[0];
+        *p++ = ':';
+        size -= 2;
+    }
+
+    if (directory && directory[0])
+    {
+        unsigned int len = strlen(directory);
+        unsigned int needs_separator = directory[len - 1] != '/' && directory[len - 1] != '\\';
+        unsigned int copylen = min(size - 1, len);
+
+        if (size < 2)
+            goto range;
+
+        memmove(p, directory, copylen);
+
+        if (size <= len)
+            goto range;
+
+        p += copylen;
+        size -= copylen;
+
+        if (needs_separator)
+        {
+            if (size < 2)
+                goto range;
+
+            *p++ = '\\';
+            size -= 1;
+        }
+    }
+
+    if (filename && filename[0])
+    {
+        unsigned int len = strlen(filename);
+        unsigned int copylen = min(size - 1, len);
+
+        if (size < 2)
+            goto range;
+
+        memmove(p, filename, copylen);
+
+        if (size <= len)
+            goto range;
+
+        p += len;
+        size -= len;
+    }
+
+    if (extension && extension[0])
+    {
+        unsigned int len = strlen(extension);
+        unsigned int needs_period = extension[0] != '.';
+        unsigned int copylen;
+
+        if (size < 2)
+            goto range;
+
+        if (needs_period)
+        {
+            *p++ = '.';
+            size -= 1;
+        }
+
+        copylen = min(size - 1, len);
+        memcpy(p, extension, copylen);
+
+        if (size <= len)
+            goto range;
+
+        p += copylen;
+    }
+
+    *p = '\0';
+    return 0;
+
+range:
+    path[0] = '\0';
+    *_errno() = ERANGE;
+    return ERANGE;
+}
diff --git a/reactos/lib/sdk/crt/stdlib/wmakpath_s.c b/reactos/lib/sdk/crt/stdlib/wmakpath_s.c
new file mode 100644 (file)
index 0000000..581a0e2
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+ * PROJECT:     ReactOS CRT library
+ * LICENSE:     See COPYING in the top level directory
+ * FILE:        lib/sdk/crt/stdlib/wmakpath_s.c
+ * PURPOSE:     Creates a path
+ * PROGRAMMERS: Wine team
+ *              Copyright 1996,1998 Marcus Meissner
+ *              Copyright 1996 Jukka Iivonen
+ *              Copyright 1997,2000 Uwe Bonnes
+ *              Copyright 2000 Jon Griffiths
+ *
+ */
+
+#include <precomp.h>
+#include <stdlib.h>
+#include <string.h>
+
+/*********************************************************************
+ *             _wmakepath_s (MSVCRT.@)
+ *
+ * Safe version of _wmakepath.
+ */
+int CDECL _wmakepath_s(wchar_t *path, size_t size, const wchar_t *drive,
+                       const wchar_t *directory, const wchar_t *filename,
+                       const wchar_t *extension)
+{
+    wchar_t *p = path;
+
+    if (!path || !size)
+    {
+        *_errno() = EINVAL;
+        return EINVAL;
+    }
+
+    if (drive && drive[0])
+    {
+        if (size <= 2)
+            goto range;
+
+        *p++ = drive[0];
+        *p++ = ':';
+        size -= 2;
+    }
+
+    if (directory && directory[0])
+    {
+        unsigned int len = strlenW(directory);
+        unsigned int needs_separator = directory[len - 1] != '/' && directory[len - 1] != '\\';
+        unsigned int copylen = min(size - 1, len);
+
+        if (size < 2)
+            goto range;
+
+        memmove(p, directory, copylen * sizeof(wchar_t));
+
+        if (size <= len)
+            goto range;
+
+        p += copylen;
+        size -= copylen;
+
+        if (needs_separator)
+        {
+            if (size < 2)
+                goto range;
+
+            *p++ = '\\';
+            size -= 1;
+        }
+    }
+
+    if (filename && filename[0])
+    {
+        unsigned int len = strlenW(filename);
+        unsigned int copylen = min(size - 1, len);
+
+        if (size < 2)
+            goto range;
+
+        memmove(p, filename, copylen * sizeof(wchar_t));
+
+        if (size <= len)
+            goto range;
+
+        p += len;
+        size -= len;
+    }
+
+    if (extension && extension[0])
+    {
+        unsigned int len = strlenW(extension);
+        unsigned int needs_period = extension[0] != '.';
+        unsigned int copylen;
+
+        if (size < 2)
+            goto range;
+
+        if (needs_period)
+        {
+            *p++ = '.';
+            size -= 1;
+        }
+
+        copylen = min(size - 1, len);
+        memcpy(p, extension, copylen * sizeof(wchar_t));
+
+        if (size <= len)
+            goto range;
+
+        p += copylen;
+    }
+
+    *p = '\0';
+    return 0;
+
+range:
+    path[0] = '\0';
+    *_errno() = ERANGE;
+    return ERANGE;
+}
+