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
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')
-rw-r--r--source/blender/blenkernel/BKE_library.h3
-rw-r--r--source/blender/blenkernel/intern/library.c40
2 files changed, 20 insertions, 23 deletions
diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h
index fcf7ae85738..cb61a08f3ba 100644
--- a/source/blender/blenkernel/BKE_library.h
+++ b/source/blender/blenkernel/BKE_library.h
@@ -63,7 +63,7 @@ void free_libblock_us(struct ListBase *lb, void *idv);
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 @@ void set_free_windowmanager_cb(void (*func)(struct bContext *, struct wmWindowMa
#define ID_FALLBACK_NAME "Untitled"
#endif
+
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);
}
+