reverse string lookup listbase function BLI_findstring counterparts, added BLI_rfinds...
authorCampbell Barton <ideasman42@gmail.com>
Mon, 2 May 2011 13:35:04 +0000 (13:35 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 2 May 2011 13:35:04 +0000 (13:35 +0000)
source/blender/blenkernel/intern/blender.c
source/blender/blenkernel/intern/context.c
source/blender/blenlib/BLI_listbase.h
source/blender/blenlib/intern/listbase.c
source/blender/editors/interface/interface.c

index ce6a95430e3005025cd3407009d4d0086db3da4c..75c6303d800dddbdfd81b7bfd91c4f85a6cba1ff 100644 (file)
@@ -619,24 +619,14 @@ void BKE_reset_undo(void)
 /* based on index nr it does a restore */
 void BKE_undo_number(bContext *C, int nr)
 {
-       UndoElem *uel;
-       int a=1;
-       
-       for(uel= undobase.first; uel; uel= uel->next, a++) {
-               if(a==nr) break;
-       }
-       curundo= uel;
+       curundo= BLI_findlink(&undobase, nr - 1);
        BKE_undo_step(C, 0);
 }
 
 /* go back to the last occurance of name in stack */
 void BKE_undo_name(bContext *C, const char *name)
 {
-       UndoElem *uel;
-
-       for(uel= undobase.last; uel; uel= uel->prev)
-               if(strcmp(name, uel->name)==0)
-                       break;
+       UndoElem *uel= BLI_rfindstring(&undobase, name, offsetof(UndoElem, name));
 
        if(uel && uel->prev) {
                curundo= uel->prev;
@@ -648,12 +638,7 @@ void BKE_undo_name(bContext *C, const char *name)
 int BKE_undo_valid(const char *name)
 {
        if(name) {
-               UndoElem *uel;
-               
-               for(uel= undobase.last; uel; uel= uel->prev)
-                       if(strcmp(name, uel->name)==0)
-                               break;
-               
+               UndoElem *uel= BLI_rfindstring(&undobase, name, offsetof(UndoElem, name));
                return uel && uel->prev;
        }
        
index 8929b1aa4747ee403c639c19d64b4369a4382a72..2aeb726f623304bff7bf1282c6b4b7dc0429502c 100644 (file)
@@ -451,12 +451,10 @@ static int ctx_data_get(bContext *C, const char *member, bContextDataResult *res
 
                C->data.recursion= 1;
 
-               for(entry=C->wm.store->entries.last; entry; entry=entry->prev) {
-                       if(strcmp(entry->name, member) == 0) {
-                               result->ptr= entry->ptr;
-                               done= 1;
-                               break;
-                       }
+               entry= BLI_rfindstring(&C->wm.store->entries, member, offsetof(bContextStoreEntry, name));
+               if(entry) {
+                       result->ptr= entry->ptr;
+                       done= 1;
                }
        }
        if(done!=1 && recursion < 2 && C->wm.region) {
index 73af9a3738c2bc0dde15db31650eb814975c0a02..90556ea4b053e087969f024b86cea68a910d0324 100644 (file)
@@ -45,9 +45,16 @@ extern "C" {
 void BLI_insertlink(struct ListBase *listbase, void *vprevlink, void *vnewlink);
 void *BLI_findlink(const struct ListBase *listbase, int number);
 int BLI_findindex(const struct ListBase *listbase, void *vlink);
+int BLI_findstringindex(const struct ListBase *listbase, const char *id, const int offset);
+
+/* find forwards */
 void *BLI_findstring(const struct ListBase *listbase, const char *id, const int offset);
 void *BLI_findstring_ptr(const struct ListBase *listbase, const char *id, const int offset);
-int BLI_findstringindex(const struct ListBase *listbase, const char *id, const int offset);
+
+/* find backwards */
+void *BLI_rfindstring(const struct ListBase *listbase, const char *id, const int offset);
+void *BLI_rfindstring_ptr(const struct ListBase *listbase, const char *id, const int offset);
+
 void BLI_freelistN(struct ListBase *listbase);
 void BLI_addtail(struct ListBase *listbase, void *vlink);
 void BLI_remlink(struct ListBase *listbase, void *vlink);
index 15bdb4a446fc1d2b3fb626c617a1070cf14adf74..05f71e0c01fa2f264e9a2494bc045ef080af30e4 100644 (file)
@@ -366,14 +366,30 @@ void *BLI_findstring(const ListBase *listbase, const char *id, const int offset)
 
        if (listbase == NULL) return NULL;
 
-       link= listbase->first;
-       while (link) {
+       for (link= listbase->first; link; link= link->next) {
                id_iter= ((const char *)link) + offset;
 
-               if(id[0] == id_iter[0] && strcmp(id, id_iter)==0)
+               if (id[0] == id_iter[0] && strcmp(id, id_iter)==0) {
                        return link;
+               }
+       }
 
-               link= link->next;
+       return NULL;
+}
+/* same as above but find reverse */
+void *BLI_rfindstring(const ListBase *listbase, const char *id, const int offset)
+{
+       Link *link= NULL;
+       const char *id_iter;
+
+       if (listbase == NULL) return NULL;
+
+       for (link= listbase->last; link; link= link->prev) {
+               id_iter= ((const char *)link) + offset;
+
+               if (id[0] == id_iter[0] && strcmp(id, id_iter)==0) {
+                       return link;
+               }
        }
 
        return NULL;
@@ -386,15 +402,32 @@ void *BLI_findstring_ptr(const ListBase *listbase, const char *id, const int off
 
        if (listbase == NULL) return NULL;
 
-       link= listbase->first;
-       while (link) {
+       for (link= listbase->first; link; link= link->next) {
                /* exact copy of BLI_findstring(), except for this line */
                id_iter= *((const char **)(((const char *)link) + offset));
 
-               if(id[0] == id_iter[0] && strcmp(id, id_iter)==0)
+               if (id[0] == id_iter[0] && strcmp(id, id_iter)==0) {
                        return link;
+               }
+       }
 
-               link= link->next;
+       return NULL;
+}
+/* same as above but find reverse */
+void *BLI_rfindstring_ptr(const ListBase *listbase, const char *id, const int offset)
+{
+       Link *link= NULL;
+       const char *id_iter;
+
+       if (listbase == NULL) return NULL;
+
+       for (link= listbase->last; link; link= link->prev) {
+               /* exact copy of BLI_rfindstring(), except for this line */
+               id_iter= *((const char **)(((const char *)link) + offset));
+
+               if (id[0] == id_iter[0] && strcmp(id, id_iter)==0) {
+                       return link;
+               }
        }
 
        return NULL;
index 108f06a5cb624f294e420828a00189e915ab7a53..e70b793cfb01e2510e441b84c8c1ad4d42c704d7 100644 (file)
@@ -1919,14 +1919,7 @@ uiBlock *uiBeginBlock(const bContext *C, ARegion *region, const char *name, shor
 
 uiBlock *uiGetBlock(const char *name, ARegion *ar)
 {
-       uiBlock *block= ar->uiblocks.first;
-       
-       while(block) {
-               if( strcmp(name, block->name)==0 ) return block;
-               block= block->next;
-       }
-       
-       return NULL;
+       return BLI_findstring(&ar->uiblocks, name, offsetof(uiBlock, name));
 }
 
 void uiBlockSetEmboss(uiBlock *block, char dt)