Cleanup/refactor: Add new BLI_string_util.
authorBastien Montagne <montagne29@wanadoo.fr>
Mon, 16 Jan 2017 16:33:34 +0000 (17:33 +0100)
committerBastien Montagne <montagne29@wanadoo.fr>
Mon, 16 Jan 2017 19:36:23 +0000 (20:36 +0100)
Things like `BLI_uniquename` had nothing, but really nothing to do in
BLI_path_util files!

Also, got rid of length limitation in `BLI_uniquename_cb`, we can use
alloca here to avoid overhead of malloc while keeping free size (within
reasonable limits of course).

49 files changed:
source/blender/blenkernel/intern/action.c
source/blender/blenkernel/intern/anim_sys.c
source/blender/blenkernel/intern/constraint.c
source/blender/blenkernel/intern/customdata.c
source/blender/blenkernel/intern/deform.c
source/blender/blenkernel/intern/dynamicpaint.c
source/blender/blenkernel/intern/fcurve.c
source/blender/blenkernel/intern/freestyle.c
source/blender/blenkernel/intern/gpencil.c
source/blender/blenkernel/intern/ipo.c
source/blender/blenkernel/intern/key.c
source/blender/blenkernel/intern/library.c
source/blender/blenkernel/intern/linestyle.c
source/blender/blenkernel/intern/mask.c
source/blender/blenkernel/intern/mball.c
source/blender/blenkernel/intern/mball_tessellate.c
source/blender/blenkernel/intern/modifier.c
source/blender/blenkernel/intern/nla.c
source/blender/blenkernel/intern/node.c
source/blender/blenkernel/intern/scene.c
source/blender/blenkernel/intern/seqmodifier.c
source/blender/blenkernel/intern/tracking.c
source/blender/blenkernel/intern/tracking_util.c
source/blender/blenlib/BLI_path_util.h
source/blender/blenlib/BLI_string_utils.h [new file with mode: 0644]
source/blender/blenlib/CMakeLists.txt
source/blender/blenlib/intern/path_util.c
source/blender/blenlib/intern/string_utils.c [new file with mode: 0644]
source/blender/blenloader/intern/versioning_260.c
source/blender/collada/AnimationImporter.cpp
source/blender/editors/armature/armature_naming.c
source/blender/editors/armature/pose_lib.c
source/blender/editors/gpencil/gpencil_data.c
source/blender/editors/object/object_edit.c
source/blender/editors/space_logic/logic_ops.c
source/blender/editors/space_logic/logic_window.c
source/blender/editors/space_outliner/outliner_draw.c
source/blender/editors/transform/transform_orientations.c
source/blender/makesrna/intern/rna_actuator.c
source/blender/makesrna/intern/rna_controller.c
source/blender/makesrna/intern/rna_gpencil.c
source/blender/makesrna/intern/rna_key.c
source/blender/makesrna/intern/rna_linestyle.c
source/blender/makesrna/intern/rna_particle.c
source/blender/makesrna/intern/rna_pose.c
source/blender/makesrna/intern/rna_property.c
source/blender/makesrna/intern/rna_scene.c
source/blender/makesrna/intern/rna_sensor.c
source/blender/nodes/composite/nodes/node_composite_outputFile.c

index dcbb667adcacd181fd9ac521eac89217cff156d9..2ade4cf08d56bcacc5cb12af13952101adca8b8b 100644 (file)
@@ -44,6 +44,7 @@
 
 #include "BLI_blenlib.h"
 #include "BLI_math.h"
+#include "BLI_string_utils.h"
 #include "BLI_utildefines.h"
 #include "BLI_ghash.h"
 
index 212793923927c4423fb6a7fe5d6f832cff9efdc8..0b637355ecfa72388c7727bdf20f3a3f57fa65ec 100644 (file)
@@ -43,6 +43,7 @@
 #include "BLI_alloca.h"
 #include "BLI_dynstr.h"
 #include "BLI_listbase.h"
+#include "BLI_string_utils.h"
 
 #include "BLT_translation.h"
 
index cb74dbcd8d153de42a7624e809d1b8c5c7febf35..58ad171ee207f0bed967e960634e7accdd4edd06 100644 (file)
@@ -42,7 +42,7 @@
 #include "BLI_math.h"
 #include "BLI_kdopbvh.h"
 #include "BLI_utildefines.h"
-
+#include "BLI_string_utils.h"
 #include "BLT_translation.h"
 
 #include "DNA_armature_types.h"
index 612f1f477e16c4ef2962d2f8c2f107ebd91debf4..98d37fb07bf00eee9926c9a0f5ab1c819643d1b9 100644 (file)
@@ -45,8 +45,9 @@
 #include "DNA_ID.h"
 
 #include "BLI_utildefines.h"
-#include "BLI_string.h"
 #include "BLI_path_util.h"
+#include "BLI_string.h"
+#include "BLI_string_utils.h"
 #include "BLI_math.h"
 #include "BLI_math_color_blend.h"
 #include "BLI_mempool.h"
index 7052e0a7d25d13cb8afd5fd12c0fff993574b5cf..abc14c42d4041243616d68ca6c6228ca73c315ab 100644 (file)
@@ -45,8 +45,8 @@
 
 #include "BLI_listbase.h"
 #include "BLI_math.h"
-#include "BLI_path_util.h"
 #include "BLI_string.h"
+#include "BLI_string_utils.h"
 #include "BLI_utildefines.h"
 
 #include "BLT_translation.h"
index de3dfd772f6892511a6b8a130bf3e40f3142a600..dc9f3b57f1f1cfcb734860e1aebce18444dc0dfe 100644 (file)
@@ -32,6 +32,7 @@
 #include "BLI_blenlib.h"
 #include "BLI_math.h"
 #include "BLI_kdtree.h"
+#include "BLI_string_utils.h"
 #include "BLI_task.h"
 #include "BLI_threads.h"
 #include "BLI_utildefines.h"
index a89d423e7a63539f5170d2deb033b8b0eedfd246..c67a61a5aad7f2382ee79e0fb149610b86456b8d 100644 (file)
@@ -47,6 +47,7 @@
 #include "BLI_math.h"
 #include "BLI_easing.h"
 #include "BLI_threads.h"
+#include "BLI_string_utils.h"
 #include "BLI_utildefines.h"
 
 #include "BLT_translation.h"
index 21fc1674dc53b517dad96a018df86df7120ee944..0a0b023df82dcc4fdb4c074aec3bd7f11e83671c 100644 (file)
@@ -40,6 +40,7 @@
 
 #include "BLI_blenlib.h"
 #include "BLI_math.h"
+#include "BLI_string_utils.h"
 
 // function declarations
 static FreestyleLineSet *alloc_lineset(void);
index cd2eac078cfc3a35ed08bf1f65a608bf2d972a66..30fc8915d4611dfc542e73bab4156ee61d1ceae1 100644 (file)
@@ -39,6 +39,7 @@
 #include "BLI_blenlib.h"
 #include "BLI_utildefines.h"
 #include "BLI_math_vector.h"
+#include "BLI_string_utils.h"
 
 #include "BLT_translation.h"
 
index 730d5a9375847170bb2ad595de81abcf48595b62..f3a85dcee2be97049f78db5ddb2e19ac19e9a14c 100644 (file)
@@ -62,6 +62,7 @@
 
 #include "BLI_blenlib.h"
 #include "BLI_dynstr.h"
+#include "BLI_string_utils.h"
 #include "BLI_utildefines.h"
 
 #include "BLT_translation.h"
index 6cdeaf5e59b33a4865bbd6ae6faa5706314df0fb..8a7c1dd28336a9a7a83c331f4e1a84ea28a4a810 100644 (file)
@@ -38,6 +38,7 @@
 
 #include "BLI_blenlib.h"
 #include "BLI_math_vector.h"
+#include "BLI_string_utils.h"
 #include "BLI_utildefines.h"
 
 #include "BLT_translation.h"
index 64535f229a918ef03f418b9aee4319caccfabc9f..ea6137952497bfd52cb89da8b9273dee4be82b94 100644 (file)
@@ -76,6 +76,7 @@
 #include "BLI_ghash.h"
 #include "BLI_linklist.h"
 #include "BLI_memarena.h"
+#include "BLI_string_utils.h"
 
 #include "BLI_threads.h"
 #include "BLT_translation.h"
index bd21215f91e6e5e1f23983d6b5478e2a4f91727e..1eb909bd9f943043c7d5130de6de2deb0a5d1919 100644 (file)
@@ -41,6 +41,7 @@
 
 #include "BLI_blenlib.h"
 #include "BLI_math.h"
+#include "BLI_string_utils.h"
 #include "BLI_utildefines.h"
 
 #include "BKE_context.h"
index 21023d9f53cedf36bf1542de783281f83cc32921..6f23b82c6df69e281471e0e204b3dfada9518551 100644 (file)
@@ -36,8 +36,8 @@
 
 #include "BLI_utildefines.h"
 #include "BLI_ghash.h"
-#include "BLI_path_util.h"
 #include "BLI_string.h"
+#include "BLI_string_utils.h"
 #include "BLI_listbase.h"
 #include "BLI_math.h"
 
index 8d024ea9aa531811570ff8a05daa2a7561aa3b07..97033a9555d4610ae4e0e8f6cd7f1ece55dcde47 100644 (file)
@@ -49,6 +49,7 @@
 
 #include "BLI_blenlib.h"
 #include "BLI_math.h"
+#include "BLI_string_utils.h"
 #include "BLI_utildefines.h"
 
 #include "BKE_global.h"
index 2068854421f57a85f3f73608d7830119eed2bedf..5c0b09f0ff0684503666907429b73dd8421c6889 100644 (file)
@@ -41,8 +41,8 @@
 #include "DNA_scene_types.h"
 
 #include "BLI_listbase.h"
-#include "BLI_path_util.h"
 #include "BLI_math.h"
+#include "BLI_string_utils.h"
 #include "BLI_utildefines.h"
 #include "BLI_memarena.h"
 
index 41e4c21d8141615832b04040513934b53d2e1294..2276d56b9c6f63c92a892b97a521e4c28c9170bf 100644 (file)
 #include "DNA_object_types.h"
 
 #include "BLI_utildefines.h"
-#include "BLI_path_util.h"
 #include "BLI_listbase.h"
 #include "BLI_linklist.h"
+#include "BLI_path_util.h"
 #include "BLI_string.h"
+#include "BLI_string_utils.h"
 
 #include "BLT_translation.h"
 
index c321bc92a7150ed73b6d483adf988fbddaf58e4f..148fc3827e09857d0f5c94ac89059a64ffbcda76 100644 (file)
@@ -40,9 +40,9 @@
 #include "MEM_guardedalloc.h"
 
 #include "BLI_utildefines.h"
-#include "BLI_path_util.h"
 #include "BLI_listbase.h"
 #include "BLI_string.h"
+#include "BLI_string_utils.h"
 #include "BLI_ghash.h"
 
 #include "BLT_translation.h"
index f16e8f328d4f2eec8c4121b49d8dfd7c783079c2..3f3b48966535d9df6d29beff6d5cac333efcb29a 100644 (file)
 #include "DNA_world_types.h"
 #include "DNA_linestyle_types.h"
 
-#include "BLI_string.h"
-#include "BLI_math.h"
 #include "BLI_listbase.h"
+#include "BLI_math.h"
 #include "BLI_path_util.h"
+#include "BLI_string.h"
+#include "BLI_string_utils.h"
 #include "BLI_utildefines.h"
 
 #include "BLT_translation.h"
index 091b8100d27d72268e60e221d0da2e8336597608..39a97b08df10310cc681ff3e8612afe918ab7693 100644 (file)
@@ -56,6 +56,7 @@
 #include "BLI_utildefines.h"
 #include "BLI_callbacks.h"
 #include "BLI_string.h"
+#include "BLI_string_utils.h"
 #include "BLI_threads.h"
 #include "BLI_task.h"
 
index 95c6b7736e15bf64910f8f59466d125dbf148f40..89c2f76c661d09eeadffe5edebea02ca29a4d428 100644 (file)
@@ -34,8 +34,8 @@
 #include "MEM_guardedalloc.h"
 
 #include "BLI_listbase.h"
-#include "BLI_path_util.h"
 #include "BLI_string.h"
+#include "BLI_string_utils.h"
 #include "BLI_utildefines.h"
 #include "BLI_math.h"
 
index 96ab86931226f90e6d042b94975e810be03ac8c4..990d250b854f6e0f8b68d5d39c592ebe1983ec0e 100644 (file)
@@ -49,8 +49,8 @@
 #include "BLI_math.h"
 #include "BLI_math_base.h"
 #include "BLI_listbase.h"
-#include "BLI_path_util.h"
 #include "BLI_string.h"
+#include "BLI_string_utils.h"
 #include "BLI_threads.h"
 
 #include "BLT_translation.h"
index a90b1dee927abfb0a34596f65aab5b6365789339..c34da4f6814714b4fd3469aa04a42687fc8c2b84 100644 (file)
@@ -42,8 +42,8 @@
 #include "BLI_math.h"
 #include "BLI_listbase.h"
 #include "BLI_ghash.h"
-#include "BLI_path_util.h"
 #include "BLI_string.h"
+#include "BLI_string_utils.h"
 
 #include "BLT_translation.h"
 
index 2eb7a8da95129c44dfeffe18d2427ba610891551..baa1f792018e461797446c4d5fd29a369b88ac76 100644 (file)
@@ -91,12 +91,8 @@ bool BLI_testextensie_glob(const char *str, const char *ext_fnmatch) ATTR_NONNUL
 bool BLI_replace_extension(char *path, size_t maxlen, const char *ext) ATTR_NONNULL();
 bool BLI_ensure_extension(char *path, size_t maxlen, const char *ext) ATTR_NONNULL();
 bool BLI_ensure_filename(char *filepath, size_t maxlen, const char *filename) ATTR_NONNULL();
-bool BLI_uniquename(struct ListBase *list, void *vlink, const char *defname, char delim, int name_offs, int len);
-bool BLI_uniquename_cb(bool (*unique_check)(void *arg, const char *name),
-                       void *arg, const char *defname, char delim, char *name, int name_len);
 int BLI_stringdec(const char *string, char *head, char *start, unsigned short *numlen);
 void BLI_stringenc(char *string, const char *head, const char *tail, unsigned short numlen, int pic);
-int BLI_split_name_num(char *left, int *nr, const char *name, const char delim);
 
 /* removes trailing slash */
 void BLI_cleanup_file(const char *relabase, char *path) ATTR_NONNULL(2);
diff --git a/source/blender/blenlib/BLI_string_utils.h b/source/blender/blenlib/BLI_string_utils.h
new file mode 100644 (file)
index 0000000..81c06fb
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2017 by the Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __BLI_STRING_UTILS_H__
+#define __BLI_STRING_UTILS_H__
+
+/** \file BLI_string_utils.h
+ *  \ingroup bli
+ */
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "BLI_compiler_attrs.h"
+
+struct ListBase;
+
+typedef bool (*UniquenameCheckCallback)(void *arg, const char *name);
+
+int BLI_split_name_num(char *left, int *nr, const char *name, const char delim);
+
+bool BLI_uniquename_cb(
+        UniquenameCheckCallback unique_check, void *arg, const char *defname, char delim, char *name, size_t name_len);
+bool BLI_uniquename(
+        struct ListBase *list, void *vlink, const char *defname, char delim, int name_offs, size_t len);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* __BLI_STRING_UTILS_H__ */
index 6e717a3ae7ed98648f550f3fec3efada5ae61374..3277519c66e5a19f1b80666d439ec1353648db1d 100644 (file)
@@ -109,6 +109,7 @@ set(SRC
        intern/string.c
        intern/string_cursor_utf8.c
        intern/string_utf8.c
+       intern/string_utils.c
        intern/system.c
        intern/task.c
        intern/threads.c
@@ -195,6 +196,7 @@ set(SRC
        BLI_string.h
        BLI_string_cursor_utf8.h
        BLI_string_utf8.h
+       BLI_string_utils.h
        BLI_sys_types.h
        BLI_system.h
        BLI_task.h
index f0d0bd00dea0303a2fdcdd2340ed93082fbc452e..6644e6605a10feffecd2311f7f29aba39b0a1075 100644 (file)
@@ -63,9 +63,6 @@
 
 #include "MEM_guardedalloc.h"
 
-/* local */
-#define UNIQUE_NAME_MAX 128
-
 /* Declarations */
 
 #ifdef WIN32
@@ -147,162 +144,6 @@ void BLI_stringenc(char *string, const char *head, const char *tail, unsigned sh
        sprintf(string, "%s%.*d%s", head, numlen, MAX2(0, pic), tail);
 }
 
-/**
- * Looks for a numeric suffix preceded by delim character on the end of
- * name, puts preceding part into *left and value of suffix into *nr.
- * Returns the length of *left.
- *
- * Foo.001 -> "Foo", 1
- * Returning the length of "Foo"
- *
- * \param left  Where to return copy of part preceding delim
- * \param nr  Where to return value of numeric suffix
- * \param name  String to split
- * \param delim  Delimiter character
- * \return  Length of \a left
- */
-int BLI_split_name_num(char *left, int *nr, const char *name, const char delim)
-{
-       const int name_len = strlen(name);
-
-       *nr = 0;
-       memcpy(left, name, (name_len + 1) * sizeof(char));
-
-       /* name doesn't end with a delimiter "foo." */
-       if ((name_len > 1 && name[name_len - 1] == delim) == 0) {
-               int a = name_len;
-               while (a--) {
-                       if (name[a] == delim) {
-                               left[a] = '\0';  /* truncate left part here */
-                               *nr = atol(name + a + 1);
-                               /* casting down to an int, can overflow for large numbers */
-                               if (*nr < 0)
-                                       *nr = 0;
-                               return a;
-                       }
-                       else if (isdigit(name[a]) == 0) {
-                               /* non-numeric suffix - give up */
-                               break;
-                       }
-               }
-       }
-
-       return name_len;
-}
-
-/**
- * Ensures name is unique (according to criteria specified by caller in unique_check callback),
- * incrementing its numeric suffix as necessary. Returns true if name had to be adjusted.
- *
- * \param unique_check  Return true if name is not unique
- * \param arg  Additional arg to unique_check--meaning is up to caller
- * \param defname  To initialize name if latter is empty
- * \param delim  Delimits numeric suffix in name
- * \param name  Name to be ensured unique
- * \param name_len  Maximum length of name area
- * \return true if there if the name was changed
- */
-bool BLI_uniquename_cb(bool (*unique_check)(void *arg, const char *name),
-                       void *arg, const char *defname, char delim, char *name, int name_len)
-{
-       if (name[0] == '\0') {
-               BLI_strncpy(name, defname, name_len);
-       }
-
-       if (unique_check(arg, name)) {
-               char numstr[16];
-               char tempname[UNIQUE_NAME_MAX];
-               char left[UNIQUE_NAME_MAX];
-               int number;
-               int len = BLI_split_name_num(left, &number, name, delim);
-               do {
-                       /* add 1 to account for \0 */
-                       const int numlen = BLI_snprintf(numstr, sizeof(numstr), "%c%03d", delim, ++number) + 1;
-
-                       /* highly unlikely the string only has enough room for the number
-                        * but support anyway */
-                       if ((len == 0) || (numlen >= name_len)) {
-                               /* number is know not to be utf-8 */
-                               BLI_strncpy(tempname, numstr, name_len);
-                       }
-                       else {
-                               char *tempname_buf;
-                               tempname_buf = tempname + BLI_strncpy_utf8_rlen(tempname, left, name_len - numlen);
-                               memcpy(tempname_buf, numstr, numlen);
-                       }
-               } while (unique_check(arg, tempname));
-
-               BLI_strncpy(name, tempname, name_len);
-               
-               return true;
-       }
-       
-       return false;
-}
-
-/* little helper macro for BLI_uniquename */
-#ifndef GIVE_STRADDR
-#  define GIVE_STRADDR(data, offset) ( ((char *)data) + offset)
-#endif
-
-/* Generic function to set a unique name. It is only designed to be used in situations
- * where the name is part of the struct, and also that the name is at most UNIQUE_NAME_MAX chars long.
- * 
- * For places where this is used, see constraint.c for example...
- *
- *  name_offs: should be calculated using offsetof(structname, membername) macro from stddef.h
- *  len: maximum length of string (to prevent overflows, etc.)
- *  defname: the name that should be used by default if none is specified already
- *  delim: the character which acts as a delimiter between parts of the name
- */
-static bool uniquename_find_dupe(ListBase *list, void *vlink, const char *name, int name_offs)
-{
-       Link *link;
-
-       for (link = list->first; link; link = link->next) {
-               if (link != vlink) {
-                       if (STREQ(GIVE_STRADDR(link, name_offs), name)) {
-                               return true;
-                       }
-               }
-       }
-
-       return false;
-}
-
-static bool uniquename_unique_check(void *arg, const char *name)
-{
-       struct {ListBase *lb; void *vlink; int name_offs; } *data = arg;
-       return uniquename_find_dupe(data->lb, data->vlink, name, data->name_offs);
-}
-
-/**
- * Ensures that the specified block has a unique name within the containing list,
- * incrementing its numeric suffix as necessary. Returns true if name had to be adjusted.
- *
- * \param list  List containing the block
- * \param vlink  The block to check the name for
- * \param defname  To initialize block name if latter is empty
- * \param delim  Delimits numeric suffix in name
- * \param name_offs  Offset of name within block structure
- * \param name_len  Maximum length of name area
- */
-bool BLI_uniquename(ListBase *list, void *vlink, const char *defname, char delim, int name_offs, int name_len)
-{
-       struct {ListBase *lb; void *vlink; int name_offs; } data;
-       data.lb = list;
-       data.vlink = vlink;
-       data.name_offs = name_offs;
-
-       assert((name_len > 1) && (name_len <= UNIQUE_NAME_MAX));
-
-       /* See if we are given an empty string */
-       if (ELEM(NULL, vlink, defname))
-               return false;
-
-       return BLI_uniquename_cb(uniquename_unique_check, &data, defname, delim, GIVE_STRADDR(vlink, name_offs), name_len);
-}
-
 static int BLI_path_unc_prefix_len(const char *path); /* defined below in same file */
 
 /* ******************** string encoding ***************** */
diff --git a/source/blender/blenlib/intern/string_utils.c b/source/blender/blenlib/intern/string_utils.c
new file mode 100644 (file)
index 0000000..a7427b6
--- /dev/null
@@ -0,0 +1,207 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2017 by the Blender FOundation.
+ * All rights reserved.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ * 
+ */
+
+/** \file blender/blenlib/intern/string_utils.c
+ *  \ingroup bli
+ */
+
+#include <ctype.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_listbase.h"
+#include "BLI_string.h"
+#include "BLI_string_utf8.h"
+#include "BLI_string_utils.h"
+#include "BLI_utildefines.h"
+
+#include "DNA_listBase.h"
+
+
+#ifdef __GNUC__
+#  pragma GCC diagnostic error "-Wsign-conversion"
+#endif
+
+/**
+ * Looks for a numeric suffix preceded by delim character on the end of
+ * name, puts preceding part into *left and value of suffix into *nr.
+ * Returns the length of *left.
+ *
+ * Foo.001 -> "Foo", 1
+ * Returning the length of "Foo"
+ *
+ * \param left  Where to return copy of part preceding delim
+ * \param nr  Where to return value of numeric suffix
+ * \param name  String to split
+ * \param delim  Delimiter character
+ * \return  Length of \a left
+ */
+int BLI_split_name_num(char *left, int *nr, const char *name, const char delim)
+{
+       const size_t name_len = strlen(name);
+
+       *nr = 0;
+       memcpy(left, name, (name_len + 1) * sizeof(char));
+
+       /* name doesn't end with a delimiter "foo." */
+       if ((name_len > 1 && name[name_len - 1] == delim) == 0) {
+               int a = name_len;
+               while (a--) {
+                       if (name[a] == delim) {
+                               left[a] = '\0';  /* truncate left part here */
+                               *nr = atol(name + a + 1);
+                               /* casting down to an int, can overflow for large numbers */
+                               if (*nr < 0)
+                                       *nr = 0;
+                               return a;
+                       }
+                       else if (isdigit(name[a]) == 0) {
+                               /* non-numeric suffix - give up */
+                               break;
+                       }
+               }
+       }
+
+       return name_len;
+}
+
+
+/* Unique name utils. */
+
+/**
+ * Ensures name is unique (according to criteria specified by caller in unique_check callback),
+ * incrementing its numeric suffix as necessary. Returns true if name had to be adjusted.
+ *
+ * \param unique_check  Return true if name is not unique
+ * \param arg  Additional arg to unique_check--meaning is up to caller
+ * \param defname  To initialize name if latter is empty
+ * \param delim  Delimits numeric suffix in name
+ * \param name  Name to be ensured unique
+ * \param name_len  Maximum length of name area
+ * \return true if there if the name was changed
+ */
+bool BLI_uniquename_cb(
+        UniquenameCheckCallback unique_check, void *arg, const char *defname, char delim, char *name, size_t name_len)
+{
+       if (name[0] == '\0') {
+               BLI_strncpy(name, defname, name_len);
+       }
+
+       if (unique_check(arg, name)) {
+               char numstr[16];
+               char *tempname = alloca(name_len);
+               char *left = alloca(name_len);
+               int number;
+               int len = BLI_split_name_num(left, &number, name, delim);
+               do {
+                       /* add 1 to account for \0 */
+                       const size_t numlen = BLI_snprintf(numstr, sizeof(numstr), "%c%03d", delim, ++number) + 1;
+
+                       /* highly unlikely the string only has enough room for the number
+                        * but support anyway */
+                       if ((len == 0) || (numlen >= name_len)) {
+                               /* number is know not to be utf-8 */
+                               BLI_strncpy(tempname, numstr, name_len);
+                       }
+                       else {
+                               char *tempname_buf;
+                               tempname_buf = tempname + BLI_strncpy_utf8_rlen(tempname, left, name_len - numlen);
+                               memcpy(tempname_buf, numstr, numlen);
+                       }
+               } while (unique_check(arg, tempname));
+
+               BLI_strncpy(name, tempname, name_len);
+
+               return true;
+       }
+
+       return false;
+}
+
+/* little helper macro for BLI_uniquename */
+#ifndef GIVE_STRADDR
+#  define GIVE_STRADDR(data, offset) ( ((char *)data) + offset)
+#endif
+
+/* Generic function to set a unique name. It is only designed to be used in situations
+ * where the name is part of the struct.
+ *
+ * For places where this is used, see constraint.c for example...
+ *
+ *  name_offs: should be calculated using offsetof(structname, membername) macro from stddef.h
+ *  len: maximum length of string (to prevent overflows, etc.)
+ *  defname: the name that should be used by default if none is specified already
+ *  delim: the character which acts as a delimiter between parts of the name
+ */
+static bool uniquename_find_dupe(ListBase *list, void *vlink, const char *name, int name_offs)
+{
+       Link *link;
+
+       for (link = list->first; link; link = link->next) {
+               if (link != vlink) {
+                       if (STREQ(GIVE_STRADDR(link, name_offs), name)) {
+                               return true;
+                       }
+               }
+       }
+
+       return false;
+}
+
+static bool uniquename_unique_check(void *arg, const char *name)
+{
+       struct {ListBase *lb; void *vlink; int name_offs; } *data = arg;
+       return uniquename_find_dupe(data->lb, data->vlink, name, data->name_offs);
+}
+
+/**
+ * Ensures that the specified block has a unique name within the containing list,
+ * incrementing its numeric suffix as necessary. Returns true if name had to be adjusted.
+ *
+ * \param list  List containing the block
+ * \param vlink  The block to check the name for
+ * \param defname  To initialize block name if latter is empty
+ * \param delim  Delimits numeric suffix in name
+ * \param name_offs  Offset of name within block structure
+ * \param name_len  Maximum length of name area
+ */
+bool BLI_uniquename(ListBase *list, void *vlink, const char *defname, char delim, int name_offs, size_t name_len)
+{
+       struct {ListBase *lb; void *vlink; int name_offs; } data;
+       data.lb = list;
+       data.vlink = vlink;
+       data.name_offs = name_offs;
+
+       BLI_assert(name_len > 1);
+
+       /* See if we are given an empty string */
+       if (ELEM(NULL, vlink, defname))
+               return false;
+
+       return BLI_uniquename_cb(uniquename_unique_check, &data, defname, delim, GIVE_STRADDR(vlink, name_offs), name_len);
+}
index 907baab0aee953b5eaf80d319bfebf1e361c102f..ab3d14af882027d86fdf02ae2fe3c5283c8e620e 100644 (file)
@@ -56,6 +56,7 @@
 
 #include "BLI_blenlib.h"
 #include "BLI_math.h"
+#include "BLI_string_utils.h"
 
 #include "BLT_translation.h"
 
index 5cd01eff2633720297086905b51539b99cc75f80..3801c9300df0ad28c6137122cdea7b58a5300ac9 100644 (file)
@@ -35,8 +35,8 @@
 
 #include "BLI_listbase.h"
 #include "BLI_math.h"
-#include "BLI_path_util.h"
 #include "BLI_string.h"
+#include "BLI_string_utils.h"
 
 #include "BLT_translation.h"
 
index 4cffd99ce1b03698b3aaa289c65cb1db340b08c0..c5cef632ffe26820451e48c04b64f8bfb5b30912 100644 (file)
@@ -37,6 +37,7 @@
 
 #include "BLI_blenlib.h"
 #include "BLI_ghash.h"
+#include "BLI_string_utils.h"
 #include "BLI_utildefines.h"
 
 #include "BLT_translation.h"
index 9309592bb460325e0c4dd198745e9747c52349f3..e3c64b523b1c35f410e2d40b0e0acb86fb4d24c6 100644 (file)
@@ -34,6 +34,7 @@
 
 #include "BLI_blenlib.h"
 #include "BLI_dlrbTree.h"
+#include "BLI_string_utils.h"
 
 #include "BLT_translation.h"
 
index ae83e8996495be32c4e8f36da981890e2b8b7366..6980ad46241ab54caa765d83235b76255e7bf062 100644 (file)
@@ -42,6 +42,7 @@
 #include "BLI_utildefines.h"
 #include "BLI_ghash.h"
 #include "BLI_math.h"
+#include "BLI_string_utils.h"
 
 #include "BLT_translation.h"
 
index 111afcdc7a7c943174a78d87adb5209ce9491d39..edd7b5dd1be3a12d2eacd5b3029ef6951aeaf813 100644 (file)
@@ -41,6 +41,7 @@
 #include "BLI_math.h"
 #include "BLI_utildefines.h"
 #include "BLI_ghash.h"
+#include "BLI_string_utils.h"
 
 #include "BLT_translation.h"
 
index 074368a82c535608619e262df812102089e82e90..1559515221ef5d2576097f24aa4f2ddaecdebb4a 100644 (file)
@@ -37,6 +37,7 @@
 #include "DNA_scene_types.h"
 
 #include "BLI_blenlib.h"
+#include "BLI_string_utils.h"
 #include "BLI_utildefines.h"
 
 #include "BLT_translation.h"
index 874e54ba5e7cc59d4f5f7776b9e9712561fb5756..3de44174d6a615a65ea69add6348f48c8845c59b 100644 (file)
@@ -47,8 +47,8 @@
 #include "MEM_guardedalloc.h"
 
 #include "BLI_blenlib.h"
+#include "BLI_string_utils.h"
 #include "BLI_utildefines.h"
-#include "BLI_path_util.h"
 
 #include "BKE_action.h"
 #include "BKE_context.h"
index 33a5a7ca7b72d7493c1fd4d05c0a8c3f21490907..99242fd12f9e7c9561ddf32b11e8d9c7bdee0ccf 100644 (file)
@@ -40,6 +40,7 @@
 
 #include "BLI_math.h"
 #include "BLI_blenlib.h"
+#include "BLI_string_utils.h"
 #include "BLI_utildefines.h"
 #include "BLI_mempool.h"
 
index 90a4aa3614dad07454dd9ecf252af98b93aa417f..058af768885fa0f5805da855804fe8c0e44bb2ce 100644 (file)
@@ -42,7 +42,7 @@
 #include "BLI_math.h"
 #include "BLI_listbase.h"
 #include "BLI_string.h"
-#include "BLI_path_util.h"
+#include "BLI_string_utils.h"
 #include "BLI_utildefines.h"
 
 #include "BKE_action.h"
index a09853eaddc70f985ca01bc5c2b1617a8153de48..004acbe4dbd5911ad7b34980ef7703dd586f3f56 100644 (file)
@@ -32,8 +32,9 @@
 #include "DNA_actuator_types.h"
 #include "DNA_scene_types.h" /* for MAXFRAME */
 
-#include "BLI_utildefines.h"
 #include "BLI_math.h"
+#include "BLI_string_utils.h"
+#include "BLI_utildefines.h"
 
 #include "BLT_translation.h"
 
index ed7009165845bf00671aa6c510bb38d7e8f5714b..3fa9d7ef2707deeffaa03c1818e56eb7f4a80c06 100644 (file)
@@ -29,6 +29,7 @@
 #include "DNA_object_types.h"
 #include "DNA_controller_types.h"
 
+#include "BLI_string_utils.h"
 #include "BLI_utildefines.h"
 
 #include "BLT_translation.h"
index 14da990278c04cfe42a74331be6f4763f014d69c..9c66a86dcee5bd676ab26f6668d5a46d974c83cd 100644 (file)
@@ -31,6 +31,7 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "BLI_string_utils.h"
 #include "BLI_utildefines.h"
 
 #include "BLT_translation.h"
index 2d66998648534ca68587854bb3720210f2d2d67b..a5abc8a3be20ffda012b382abee4109bec3f9832 100644 (file)
@@ -33,6 +33,7 @@
 #include "DNA_lattice_types.h"
 #include "DNA_mesh_types.h"
 
+#include "BLI_string_utils.h"
 #include "BLI_utildefines.h"
 
 #include "BLT_translation.h"
index 622c61beaeb9fda75bf96ebb28d2522dc98e5e62..1199cccc4e6aba6e0d11ab23b12302e7a23e5507 100644 (file)
@@ -27,6 +27,9 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+#include "BLI_utildefines.h"
+#include "BLI_string_utils.h"
+
 #include "RNA_define.h"
 #include "RNA_enum_types.h"
 
index 362baed1e7c842333179da1dad6be25c2da80525..95dab13571dff4f63ed3c39d9fcaeca48b214d9b 100644 (file)
@@ -45,6 +45,8 @@
 #include "RNA_define.h"
 #include "RNA_enum_types.h"
 
+#include "BLI_string_utils.h"
+
 #include "BLT_translation.h"
 
 #include "rna_internal.h"
index 99d57147248a1ea2c213b4ccf7d8ed4eec3e5bed..28ce63a61bd517954cf16c5969e2b46e17918f86 100644 (file)
@@ -40,6 +40,7 @@
 #include "DNA_scene_types.h"
 
 #include "BLI_math.h"
+#include "BLI_string_utils.h"
 
 #include "BLT_translation.h"
 
index 07bdbb033575392c5431c331cf7f2d3570a8aabb..fb70870f49b8c9012fbec12fdc31dba57b2966db 100644 (file)
@@ -31,6 +31,7 @@
 #include "DNA_object_types.h"
 
 #include "BLI_path_util.h"
+#include "BLI_string_utils.h"
 
 #include "BLT_translation.h"
 
index ddfb5dc6d611bcc141561aafbaf5acd9319a8495..6947a4104c88c57c5f3fe0493813176103bc9633 100644 (file)
@@ -40,6 +40,7 @@
 #include "IMB_imbuf_types.h"
 
 #include "BLI_math.h"
+#include "BLI_string_utils.h"
 
 #include "BLT_translation.h"
 
index ee24a4344865e311463b9f9e04321f4de2f00cd7..d0afab7a1e32432ba67b7ab19a52b3170b7815b3 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "BLI_utildefines.h"
 #include "BLI_math.h"
+#include "BLI_string_utils.h"
 
 #include "BLT_translation.h"
 
index 7d1087435c2c1f13d3a1a97bfa7c337af1742a98..6a96f1b30d8c3a4017da6e062b147b7882bbb508 100644 (file)
@@ -32,7 +32,7 @@
 
 #include <string.h>
 #include "BLI_utildefines.h"
-#include "BLI_path_util.h"
+#include "BLI_string_utils.h"
 
 #include "BKE_context.h"