mirror of
https://github.com/reactos/reactos.git
synced 2025-08-02 04:35:53 +00:00
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:
parent
b7bf7335b9
commit
cbc71e8180
6 changed files with 249 additions and 3 deletions
|
@ -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">
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include <string.h>
|
||||
|
||||
|
||||
unsigned int _osplatform = 0;
|
||||
unsigned int _osver = 0;
|
||||
unsigned int _winminor = 0;
|
||||
unsigned int _winmajor = 0;
|
||||
|
|
120
reactos/lib/sdk/crt/stdlib/makepath_s.c
Normal file
120
reactos/lib/sdk/crt/stdlib/makepath_s.c
Normal 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;
|
||||
}
|
121
reactos/lib/sdk/crt/stdlib/wmakpath_s.c
Normal file
121
reactos/lib/sdk/crt/stdlib/wmakpath_s.c
Normal 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;
|
||||
}
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue