Commit ca9f3576 authored by Alexandre Julliard's avatar Alexandre Julliard

ntdll: Add _makepath_s.

Implementation copied from msvcrt. Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
parent 0c986b2c
...@@ -1516,6 +1516,7 @@ ...@@ -1516,6 +1516,7 @@
@ cdecl _ltoa_s(long ptr long long) @ cdecl _ltoa_s(long ptr long long)
@ cdecl _ltow(long ptr long) @ cdecl _ltow(long ptr long)
@ cdecl _ltow_s(long ptr long long) @ cdecl _ltow_s(long ptr long long)
@ cdecl _makepath_s(ptr long str str str str)
@ cdecl _memccpy(ptr ptr long long) @ cdecl _memccpy(ptr ptr long long)
@ cdecl _memicmp(str str long) @ cdecl _memicmp(str str long)
@ varargs _snprintf(ptr long str) NTDLL__snprintf @ varargs _snprintf(ptr long str) NTDLL__snprintf
......
...@@ -1949,3 +1949,80 @@ void __cdecl _splitpath(const char* inpath, char * drv, char * dir, ...@@ -1949,3 +1949,80 @@ void __cdecl _splitpath(const char* inpath, char * drv, char * dir,
_splitpath_s( inpath, drv, drv ? _MAX_DRIVE : 0, dir, dir ? _MAX_DIR : 0, _splitpath_s( inpath, drv, drv ? _MAX_DRIVE : 0, dir, dir ? _MAX_DIR : 0,
fname, fname ? _MAX_FNAME : 0, ext, ext ? _MAX_EXT : 0 ); fname, fname ? _MAX_FNAME : 0, ext, ext ? _MAX_EXT : 0 );
} }
/*********************************************************************
* _makepath_s (NTDLL.@)
*/
errno_t __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) 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;
return ERANGE;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment