[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