From: Sylvain Petreolle Date: Sun, 11 Jul 2010 16:25:30 +0000 (+0000) Subject: Implement _osplatform X-Git-Tag: backups/Ash_Shell@48412~1^2~280 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=cbc71e8180695efbf19be71627699d8d364d4bab Implement _osplatform Import _makepath_s and _wmakepath_s from Wine. Passes msvcrt data and dir tests. svn path=/trunk/; revision=47999 --- diff --git a/reactos/dll/win32/msvcrt/dllmain.c b/reactos/dll/win32/msvcrt/dllmain.c index 99822fc46a7..95efb2bbb96 100644 --- a/reactos/dll/win32/msvcrt/dllmain.c +++ b/reactos/dll/win32/msvcrt/dllmain.c @@ -35,6 +35,7 @@ extern int BlockEnvToEnvironW(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; @@ -72,6 +73,7 @@ DllMain(PVOID hinstDll, ULONG dwReason, PVOID reserved) _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) diff --git a/reactos/dll/win32/msvcrt/msvcrt.spec b/reactos/dll/win32/msvcrt/msvcrt.spec index 3ccd0390796..c0328e1b98b 100644 --- a/reactos/dll/win32/msvcrt/msvcrt.spec +++ b/reactos/dll/win32/msvcrt/msvcrt.spec @@ -597,7 +597,7 @@ @ 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) @@ -756,7 +756,7 @@ @ 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) @@ -1086,7 +1086,7 @@ # 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 diff --git a/reactos/lib/sdk/crt/crt.rbuild b/reactos/lib/sdk/crt/crt.rbuild index 7b4bc6fdc72..9821329f510 100644 --- a/reactos/lib/sdk/crt/crt.rbuild +++ b/reactos/lib/sdk/crt/crt.rbuild @@ -329,6 +329,7 @@ gcvt.c getenv.c makepath.c + makepath_s.c mbtowc.c mbstowcs.c obsol.c @@ -341,6 +342,7 @@ wputenv.c wsenv.c wmakpath.c + wmakpath_s.c diff --git a/reactos/lib/sdk/crt/misc/environ.c b/reactos/lib/sdk/crt/misc/environ.c index 845721c5cc8..3018d1cc340 100644 --- a/reactos/lib/sdk/crt/misc/environ.c +++ b/reactos/lib/sdk/crt/misc/environ.c @@ -11,6 +11,7 @@ #include +unsigned int _osplatform = 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 index 00000000000..b96f1f6c178 --- /dev/null +++ b/reactos/lib/sdk/crt/stdlib/makepath_s.c @@ -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 +#include +#include + +/********************************************************************* + * _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 index 00000000000..581a0e2a22c --- /dev/null +++ b/reactos/lib/sdk/crt/stdlib/wmakpath_s.c @@ -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 +#include +#include + +/********************************************************************* + * _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; +} +