[Bf-blender-cvs] [a16ef95ff6c] blender-v3.4-release: Fix T102914: bpy.ops.wm.append no longer supports / in paths for WIN32

Campbell Barton noreply at git.blender.org
Tue Dec 6 03:12:46 CET 2022


Commit: a16ef95ff6ce617009c942264c64c7214c6e9eb7
Author: Campbell Barton
Date:   Tue Dec 6 10:41:16 2022 +1100
Branches: blender-v3.4-release
https://developer.blender.org/rBa16ef95ff6ce617009c942264c64c7214c6e9eb7

Fix T102914: bpy.ops.wm.append no longer supports / in paths for  WIN32

Support both forward and back slashes on WIN32.

Forward slashes for paths in WIN32 was removed in [0] (for BLI_path_join)
& [1] (for BLI_path_name_at_index), this is correct on UNIX as back
slashes can be used in paths but not on WIN32 which can use both.

Note that other path functions such as BLI_path_append &
BLI_path_slash_ensure should be updated too, but this is out of scope
for a bug-fix.

Documenting and ensuring Windows path handling functions all handle
forward slashes can be done separately.

[0]: 8f7ab1bf46d5e8610b167180b7631ff62e718a08
[1]: 511ae2226473df57e47b439392da387cd355abef

Reviewed By: harley

Ref D16700

===================================================================

M	source/blender/blenlib/intern/path_util.c

===================================================================

diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c
index 25549de182a..b379cd58619 100644
--- a/source/blender/blenlib/intern/path_util.c
+++ b/source/blender/blenlib/intern/path_util.c
@@ -51,6 +51,23 @@ static bool BLI_path_is_abs(const char *name);
 
 // #define DEBUG_STRSIZE
 
+/**
+ * On UNIX it only makes sense to treat `/` as a path separator.
+ * On WIN32 either may be used.
+ */
+static bool is_sep_native_compat(const char ch)
+{
+  if (ch == SEP) {
+    return true;
+  }
+#ifdef WIN32
+  if (ch == ALTSEP) {
+    return true;
+  }
+#endif
+  return false;
+}
+
 /* implementation */
 
 int BLI_path_sequence_decode(const char *string, char *head, char *tail, ushort *r_digits_len)
@@ -1532,7 +1549,7 @@ size_t BLI_path_join_array(char *__restrict dst,
   bool has_trailing_slash = false;
   if (ofs != 0) {
     size_t len = ofs;
-    while ((len != 0) && (path[len - 1] == SEP)) {
+    while ((len != 0) && is_sep_native_compat(path[len - 1])) {
       len -= 1;
     }
 
@@ -1546,18 +1563,18 @@ size_t BLI_path_join_array(char *__restrict dst,
     path = path_array[path_index];
     has_trailing_slash = false;
     const char *path_init = path;
-    while (path[0] == SEP) {
+    while (is_sep_native_compat(path[0])) {
       path++;
     }
     size_t len = strlen(path);
     if (len != 0) {
-      while ((len != 0) && (path[len - 1] == SEP)) {
+      while ((len != 0) && is_sep_native_compat(path[len - 1])) {
         len -= 1;
       }
 
       if (len != 0) {
         /* the very first path may have a slash at the end */
-        if (ofs && (dst[ofs - 1] != SEP)) {
+        if (ofs && !is_sep_native_compat(dst[ofs - 1])) {
           dst[ofs++] = SEP;
           if (ofs == dst_last) {
             break;
@@ -1580,7 +1597,7 @@ size_t BLI_path_join_array(char *__restrict dst,
   }
 
   if (has_trailing_slash) {
-    if ((ofs != dst_last) && (ofs != 0) && (dst[ofs - 1] != SEP)) {
+    if ((ofs != dst_last) && (ofs != 0) && !is_sep_native_compat(dst[ofs - 1])) {
       dst[ofs++] = SEP;
     }
   }
@@ -1608,7 +1625,7 @@ static bool path_name_at_index_forward(const char *__restrict path,
   int i = 0;
   while (true) {
     const char c = path[i];
-    if (ELEM(c, SEP, '\0')) {
+    if ((c == '\0') || is_sep_native_compat(c)) {
       if (prev + 1 != i) {
         prev += 1;
         /* Skip '/./' (behave as if they don't exist). */
@@ -1643,7 +1660,7 @@ static bool path_name_at_index_backward(const char *__restrict path,
   int i = prev - 1;
   while (true) {
     const char c = i >= 0 ? path[i] : '\0';
-    if (ELEM(c, SEP, '\0')) {
+    if ((c == '\0') || is_sep_native_compat(c)) {
       if (prev - 1 != i) {
         i += 1;
         /* Skip '/./' (behave as if they don't exist). */



More information about the Bf-blender-cvs mailing list