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.
This commit is contained in:
@@ -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
|
||||
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user