[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [30441] trunk/blender/source/blender/ blenkernel: [#22876] Add new scene, stacker ".00" bug

Campbell Barton ideasman42 at gmail.com
Sat Jul 17 18:17:30 CEST 2010


Revision: 30441
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30441
Author:   campbellbarton
Date:     2010-07-17 18:17:30 +0200 (Sat, 17 Jul 2010)

Log Message:
-----------
[#22876] Add new scene, stacker ".00" bug
finding duplicates is a bit faster now too since it doesnt split the name and number before comparing ID's prefix.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_library.h
    trunk/blender/source/blender/blenkernel/intern/library.c

Modified: trunk/blender/source/blender/blenkernel/BKE_library.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_library.h	2010-07-17 15:42:01 UTC (rev 30440)
+++ trunk/blender/source/blender/blenkernel/BKE_library.h	2010-07-17 16:17:30 UTC (rev 30441)
@@ -63,7 +63,7 @@
 void free_main(struct Main *mainvar);
 void tag_main(struct Main *mainvar, int tag);
 
-void splitIDname(char *name, char *left, int *nr);
+int splitIDname(char *name, char *left, int *nr);
 void rename_id(struct ID *id, char *name);
 void test_idbutton(char *name);
 void text_idbutton(struct ID *id, char *text);
@@ -85,4 +85,3 @@
 #define ID_FALLBACK_NAME "Untitled"
 
 #endif
-

Modified: trunk/blender/source/blender/blenkernel/intern/library.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/library.c	2010-07-17 15:42:01 UTC (rev 30440)
+++ trunk/blender/source/blender/blenkernel/intern/library.c	2010-07-17 16:17:30 UTC (rev 30441)
@@ -995,7 +995,7 @@
 
 
 /* used by buttons.c library.c mball.c */
-void splitIDname(char *name, char *left, int *nr)
+int splitIDname(char *name, char *left, int *nr)
 {
 	int a;
 	
@@ -1003,19 +1003,21 @@
 	strncpy(left, name, 21);
 	
 	a= strlen(name);
-	if(a>1 && name[a-1]=='.') return;
+	if(a>1 && name[a-1]=='.') return a;
 	
 	while(a--) {
 		if( name[a]=='.' ) {
 			left[a]= 0;
 			*nr= atol(name+a+1);
-			return;
+			return a;
 		}
 		if( isdigit(name[a])==0 ) break;
 		
 		left[a]= 0;
 	}
 	strcpy(left, name);	
+
+	return a;
 }
 
 static void sort_alpha_id(ListBase *lb, ID *id)
@@ -1077,8 +1079,7 @@
 static int check_for_dupid(ListBase *lb, ID *id, char *name)
 {
 	ID *idtest;
-	int nr= 0, nrtest, a;
-	const int maxtest=32;
+	int nr= 0, nrtest, a, left_len;
 	char left[32], leftest[32], in_use[32];
 
 	/* make sure input name is terminated properly */
@@ -1095,22 +1096,25 @@
 
 		/* we have a dup; need to make a new name */
 		/* quick check so we can reuse one of first 32 ids if vacant */
-		memset(in_use, 0, maxtest);
+		memset(in_use, 0, sizeof(in_use));
 
 		/* get name portion, number portion ("name.number") */
-		splitIDname( name, left, &nr);
+		left_len= splitIDname(name, left, &nr);
 
 		/* if new name will be too long, truncate it */
 		if(nr>999 && strlen(left)>16) left[16]= 0;
 		else if(strlen(left)>17) left[17]= 0;
 
-		for( idtest = lb->first; idtest; idtest = idtest->next ) {
-			if( id != idtest && idtest->lib == NULL ) {
-				splitIDname(idtest->name+2, leftest, &nrtest);
-				/* if base names match... */
-				/* optimized */
-				if( *left == *leftest && strcmp(left, leftest)==0 ) {
-					if(nrtest < maxtest)
+		if(left_len) {
+			for(idtest= lb->first; idtest; idtest= idtest->next) {
+				if(		(id != idtest) &&
+						(idtest->lib == NULL) &&
+						(*name == *(idtest->name+2)) &&
+						(strncmp(name, idtest->name+2, left_len)==0) &&
+						(splitIDname(idtest->name+2, leftest, &nrtest) == left_len)
+
+				) {
+					if(nrtest < sizeof(in_use))
 						in_use[nrtest]= 1;	/* mark as used */
 					if(nr <= nrtest)
 						nr= nrtest+1;		/* track largest unused */
@@ -1119,7 +1123,7 @@
 		}
 
 		/* decide which value of nr to use */
-		for(a=0; a<maxtest; a++) {
+		for(a=0; a < sizeof(in_use); a++) {
 			if(a>=nr) break;	/* stop when we've check up to biggest */
 			if( in_use[a]==0 ) { /* found an unused value */
 				nr = a;
@@ -1129,8 +1133,9 @@
 
 		/* If the original name has no numeric suffix, 
 		 * rather than just chopping and adding numbers, 
-		 * shave off the end chars until we have a unique name */
-		if (nr==0) {
+		 * shave off the end chars until we have a unique name.
+		 * Check the null terminators match as well so we dont get Cube.000 -> Cube.00 */
+		if (nr==0 && name[left_len] == left[left_len]) {
 			int len = strlen(name)-1;
 			idtest= is_dupid(lb, id, name);
 			
@@ -1389,4 +1394,3 @@
 	
 	new_id(lb, id, name);				
 }
-





More information about the Bf-blender-cvs mailing list