From 06c682423a4374536c081a2b5c77446b5aa04d1e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 21 Apr 2021 17:34:18 +1000 Subject: BLI_string: add a utility to replace strings using a table Useful to simplify versioning code when identifiers need updating in multiple places. --- source/blender/blenlib/BLI_string.h | 5 +++++ source/blender/blenlib/intern/string.c | 23 +++++++++++++++++++++++ 2 files changed, 28 insertions(+) (limited to 'source/blender/blenlib') 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. * -- cgit v1.2.3