[Bf-blender-cvs] [35b0e1f5138] temp-dna-rename: Detect duplicate names
Campbell Barton
noreply at git.blender.org
Wed Feb 13 00:32:41 CET 2019
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);
More information about the Bf-blender-cvs
mailing list