Commit: 35b0e1f513847ad8d8271309ce9213fb392e8bdd
Author: Campbell Barton
Date:   Wed Feb 13 10:31:43 2019 +1100
Branches: temp-dna-rename
https://developer.blender.org/rB35b0e1f513847ad8d8271309ce9213fb392e8bdd

Detect duplicate names

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

M       source/blender/makesdna/intern/dna_utils.c
M       source/blender/makesdna/intern/dna_utils.h
M       source/blender/makesdna/intern/makesdna.c

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

diff --git a/source/blender/makesdna/intern/dna_utils.c 
b/source/blender/makesdna/intern/dna_utils.c
index 9b6affa0bb8..19bf312e6cd 100644
--- a/source/blender/makesdna/intern/dna_utils.c
+++ b/source/blender/makesdna/intern/dna_utils.c
@@ -107,6 +107,18 @@ uint DNA_elem_id_offset_end(const char *elem_dna)
        return elem_dna_offset;
 }
 
+/**
+ * \a elem_dst must be at least the size of \a elem_src.
+ */
+void DNA_elem_id_strip(char *elem_dst, const char *elem_src)
+{
+       const uint elem_src_offset = DNA_elem_id_offset_start(elem_src);
+       const char *elem_src_trim = elem_src + elem_src_offset;
+       const uint elem_src_trim_len = DNA_elem_id_offset_end(elem_src_trim);
+       memcpy(elem_dst, elem_src_trim, elem_src_trim_len);
+       elem_dst[elem_src_trim_len] = '\0';
+}
+
 /**
  * Check if 'var' matches '*var[3]' for eg,
  * return true if it does, with start/end offsets.
diff --git a/source/blender/makesdna/intern/dna_utils.h 
b/source/blender/makesdna/intern/dna_utils.h
index 0b734c86798..57beddaed4f 100644
--- a/source/blender/makesdna/intern/dna_utils.h
+++ b/source/blender/makesdna/intern/dna_utils.h
@@ -27,6 +27,7 @@ int DNA_elem_array_size(const char *str);
 
 uint DNA_elem_id_offset_start(const char *elem_dna);
 uint DNA_elem_id_offset_end(const char *elem_dna);
+void DNA_elem_id_strip(char *elem_dst, const char *elem_src);
 bool DNA_elem_id_match(
         const char *elem_search, const int elem_search_len,
         const char *elem_dna,
diff --git a/source/blender/makesdna/intern/makesdna.c 
b/source/blender/makesdna/intern/makesdna.c
index 20851b524a6..7b6fed74f53 100644
--- a/source/blender/makesdna/intern/makesdna.c
+++ b/source/blender/makesdna/intern/makesdna.c
@@ -1028,7 +1028,7 @@ void printStructLengths(void)
 
 static int make_structDNA(const char *baseDirectory, FILE *file, FILE 
*file_offsets)
 {
-       int len, i;
+       int i;
        const short *sp;
        /* str contains filenames. Since we now include paths, I stretched      
 */
        /* it a bit. Hope this is enough :) -nzc-                               
 */
@@ -1148,7 +1148,7 @@ static int make_structDNA(const char *baseDirectory, FILE 
*file, FILE *file_offs
        }
        else {
                const char nil_bytes[4] = {0};
-               int len_align;
+               int len, len_align;
 
                dna_write(file, "SDNA", 4);
 
@@ -1251,6 +1251,36 @@ static int make_structDNA(const char *baseDirectory, 
FILE *file, FILE *file_offs
                fprintf(file_offsets, "};\n");
        }
 
+       /* Check versioning errors which could cause duplicate names,
+        * do last because names are stripped. */
+       {
+               GSet *names_unique = BLI_gset_str_new_ex(__func__, 512);
+               char name_buf[512];
+
+               for (int struct_nr = 0; struct_nr < nr_structs; struct_nr++) {
+                       sp = structs[struct_nr];
+                       const char *struct_name = types[sp[0]];
+                       const int len = sp[1];
+                       sp += 2;
+                       for (int a = 0; a < len; a++, sp += 2) {
+                               char *name = names[sp[1]];
+                               const int name_len = strlen(name);
+                               BLI_assert(name_len < sizeof(name_buf));
+                               DNA_elem_id_strip(name_buf, name);
+                               strcpy(name, name_buf);
+
+                               if (!BLI_gset_add(names_unique, name)) {
+                                       fprintf(stderr, "Error: duplicate name 
found '%s.%s', "
+                                              "likely cause is 
'versioning_dna.c'\n",
+                                              struct_name, name);
+                                       return 1;
+                               }
+                       }
+                       BLI_gset_clear(names_unique, NULL);
+               }
+               BLI_gset_free(names_unique, NULL);
+       }
+
        MEM_freeN(structdata);
        MEM_freeN(names);
        MEM_freeN(types);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to