Alexandre Julliard : ntdll: Add _makepath_s.
Alexandre Julliard
julliard at winehq.org
Thu Jun 30 16:34:20 CDT 2022
Module: wine
Branch: master
Commit: ca9f3576471a46942f768dc07f69fa2c9d9acb89
URL: https://source.winehq.org/git/wine.git/?a=commit;h=ca9f3576471a46942f768dc07f69fa2c9d9acb89
Author: Alexandre Julliard <julliard at 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 at 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;
+}
More information about the wine-cvs
mailing list