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

Brecht Van Lommel brecht at blender.org
Wed Jul 21 12:39:51 CEST 2010


Revision: 30576
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30576
Author:   blendix
Date:     2010-07-21 12:39:51 +0200 (Wed, 21 Jul 2010)

Log Message:
-----------
Revert revision 30441: [#22876] Add new scene, stacker ".00" bug

This commit broke unique datablock naming, tried to fix it properly but the
code here is too tricky to change now, will just reopen the bug report.

Revision Links:
--------------
    http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30441

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-21 10:33:31 UTC (rev 30575)
+++ trunk/blender/source/blender/blenkernel/BKE_library.h	2010-07-21 10:39:51 UTC (rev 30576)
@@ -63,7 +63,7 @@
 void free_main(struct Main *mainvar);
 void tag_main(struct Main *mainvar, int tag);
 
-int splitIDname(char *name, char *left, int *nr);
+void 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,3 +85,4 @@
 #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-21 10:33:31 UTC (rev 30575)
+++ trunk/blender/source/blender/blenkernel/intern/library.c	2010-07-21 10:39:51 UTC (rev 30576)
@@ -995,7 +995,7 @@
 
 
 /* used by buttons.c library.c mball.c */
-int splitIDname(char *name, char *left, int *nr)
+void splitIDname(char *name, char *left, int *nr)
 {
 	int a;
 	
@@ -1003,21 +1003,19 @@
 	strncpy(left, name, 21);
 	
 	a= strlen(name);
-	if(a>1 && name[a-1]=='.') return a;
+	if(a>1 && name[a-1]=='.') return;
 	
 	while(a--) {
 		if( name[a]=='.' ) {
 			left[a]= 0;
 			*nr= atol(name+a+1);
-			return a;
+			return;
 		}
 		if( isdigit(name[a])==0 ) break;
 		
 		left[a]= 0;
 	}
 	strcpy(left, name);	
-
-	return a;
 }
 
 static void sort_alpha_id(ListBase *lb, ID *id)
@@ -1079,7 +1077,8 @@
 static int check_for_dupid(ListBase *lb, ID *id, char *name)
 {
 	ID *idtest;
-	int nr= 0, nrtest, a, left_len;
+	int nr= 0, nrtest, a;
+	const int maxtest=32;
 	char left[32], leftest[32], in_use[32];
 
 	/* make sure input name is terminated properly */
@@ -1096,25 +1095,22 @@
 
 		/* 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, sizeof(in_use));
+		memset(in_use, 0, maxtest);
 
 		/* get name portion, number portion ("name.number") */
-		left_len= splitIDname(name, left, &nr);
+		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;
 
-		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))
+		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)
 						in_use[nrtest]= 1;	/* mark as used */
 					if(nr <= nrtest)
 						nr= nrtest+1;		/* track largest unused */
@@ -1123,7 +1119,7 @@
 		}
 
 		/* decide which value of nr to use */
-		for(a=0; a < sizeof(in_use); a++) {
+		for(a=0; a<maxtest; a++) {
 			if(a>=nr) break;	/* stop when we've check up to biggest */
 			if( in_use[a]==0 ) { /* found an unused value */
 				nr = a;
@@ -1133,9 +1129,8 @@
 
 		/* 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.
-		 * Check the null terminators match as well so we dont get Cube.000 -> Cube.00 */
-		if (nr==0 && name[left_len] == left[left_len]) {
+		 * shave off the end chars until we have a unique name */
+		if (nr==0) {
 			int len = strlen(name)-1;
 			idtest= is_dupid(lb, id, name);
 			
@@ -1394,3 +1389,4 @@
 	
 	new_id(lb, id, name);				
 }
+





More information about the Bf-blender-cvs mailing list