Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2010-07-21 14:39:51 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2010-07-21 14:39:51 +0400
commitedeef8bcd7af488bb11f03464d0bce7757eefcf8 (patch)
treeb30cdb8d3aa4db3751d294a7eb62d7367a883619 /source/blender/blenkernel/intern/library.c
parentea008f862dd10067d18c47e45604b39f9adf1f19 (diff)
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.
Diffstat (limited to 'source/blender/blenkernel/intern/library.c')
-rw-r--r--source/blender/blenkernel/intern/library.c40
1 files changed, 18 insertions, 22 deletions
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 8b035ff1bba..fdc98d9ed29 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -995,7 +995,7 @@ void IMAnames_to_pupstring(char **str, char *title, char *extraops, ListBase *lb
/* 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 @@ int splitIDname(char *name, char *left, int *nr)
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 ID *is_dupid(ListBase *lb, ID *id, char *name)
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 @@ static int check_for_dupid(ListBase *lb, ID *id, char *name)
/* 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 @@ static int check_for_dupid(ListBase *lb, ID *id, char *name)
}
/* 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 @@ static int check_for_dupid(ListBase *lb, ID *id, char *name)
/* 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 @@ void rename_id(ID *id, char *name)
new_id(lb, id, name);
}
+