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