Implement _osplatform

Import _makepath_s and _wmakepath_s from Wine.
Passes msvcrt data and dir tests.

svn path=/trunk/; revision=47999
This commit is contained in:
Sylvain Petreolle 2010-07-11 16:25:30 +00:00
parent b7bf7335b9
commit cbc71e8180
6 changed files with 249 additions and 3 deletions

View file

@ -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)

View file

@ -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

View file

@ -329,6 +329,7 @@
<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>
@ -341,6 +342,7 @@
<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">

View file

@ -11,6 +11,7 @@
#include <string.h>
unsigned int _osplatform = 0;
unsigned int _osver = 0;
unsigned int _winminor = 0;
unsigned int _winmajor = 0;

View file

@ -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;
}

View file

@ -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;
}