[Bf-blender-cvs] [06c682423a4] blender-v2.93-release: BLI_string: add a utility to replace strings using a table

Campbell Barton noreply at git.blender.org
Wed Apr 21 09:43:27 CEST 2021


Commit: 06c682423a4374536c081a2b5c77446b5aa04d1e
Author: Campbell Barton
Date:   Wed Apr 21 17:34:18 2021 +1000
Branches: blender-v2.93-release
https://developer.blender.org/rB06c682423a4374536c081a2b5c77446b5aa04d1e

BLI_string: add a utility to replace strings using a table

Useful to simplify versioning code when identifiers need updating
in multiple places.

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

M	source/blender/blenlib/BLI_string.h
M	source/blender/blenlib/intern/string.c

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

diff --git a/source/blender/blenlib/BLI_string.h b/source/blender/blenlib/BLI_string.h
index 096e7818013..5a80680c350 100644
--- a/source/blender/blenlib/BLI_string.h
+++ b/source/blender/blenlib/BLI_string.h
@@ -68,6 +68,11 @@ char *BLI_str_replaceN(const char *__restrict str,
 
 void BLI_str_replace_char(char *string, char src, char dst) ATTR_NONNULL();
 
+bool BLI_str_replace_table_exact(char *string,
+                                 const size_t string_len,
+                                 const char *replace_table[][2],
+                                 int replace_table_len);
+
 size_t BLI_snprintf(char *__restrict dst, size_t maxncpy, const char *__restrict format, ...)
     ATTR_NONNULL(1, 3) ATTR_PRINTF_FORMAT(3, 4);
 size_t BLI_snprintf_rlen(char *__restrict dst, size_t maxncpy, const char *__restrict format, ...)
diff --git a/source/blender/blenlib/intern/string.c b/source/blender/blenlib/intern/string.c
index ccc11af9f2b..3d40c6ef146 100644
--- a/source/blender/blenlib/intern/string.c
+++ b/source/blender/blenlib/intern/string.c
@@ -539,6 +539,29 @@ void BLI_str_replace_char(char *str, char src, char dst)
   }
 }
 
+/**
+ * Simple exact-match string replacement.
+ *
+ * \param replace_table: Array of source, destination pairs.
+ *
+ * \note Larger tables should use a hash table.
+ */
+bool BLI_str_replace_table_exact(char *string,
+                                 const size_t string_len,
+                                 const char *replace_table[][2],
+                                 int replace_table_len)
+{
+  for (int i = 0; i < replace_table_len; i++) {
+    if (STREQ(string, replace_table[i][0])) {
+      BLI_strncpy(string, replace_table[i][1], string_len);
+      return true;
+    }
+  }
+  return false;
+}
+
+/** \} */
+
 /**
  * Compare two strings without regard to case.
  *



More information about the Bf-blender-cvs mailing list