Module: wine Branch: master Commit: ca9f3576471a46942f768dc07f69fa2c9d9acb89 URL: https://source.winehq.org/git/wine.git/?a=commit;h=ca9f3576471a46942f768dc07...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Jun 30 11:07:13 2022 +0200
ntdll: Add _makepath_s.
Implementation copied from msvcrt.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/ntdll.spec | 1 + dlls/ntdll/string.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+)
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index cc78f4539f3..a4494f79452 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -1516,6 +1516,7 @@ @ cdecl _ltoa_s(long ptr long long) @ cdecl _ltow(long ptr long) @ cdecl _ltow_s(long ptr long long) +@ cdecl _makepath_s(ptr long str str str str) @ cdecl _memccpy(ptr ptr long long) @ cdecl _memicmp(str str long) @ varargs _snprintf(ptr long str) NTDLL__snprintf diff --git a/dlls/ntdll/string.c b/dlls/ntdll/string.c index 2e3bbc043e5..a48496b65c6 100644 --- a/dlls/ntdll/string.c +++ b/dlls/ntdll/string.c @@ -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, 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; +}