[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [36442] trunk/blender/source/blender: reverse string lookup listbase function BLI_findstring counterparts, added BLI_rfindstring, BLI_rfindstring_ptr, these search from the end of the listbase (like pythons rfind).

Campbell Barton ideasman42 at gmail.com
Mon May 2 15:35:05 CEST 2011


Revision: 36442
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36442
Author:   campbellbarton
Date:     2011-05-02 13:35:04 +0000 (Mon, 02 May 2011)
Log Message:
-----------
reverse string lookup listbase function BLI_findstring counterparts, added BLI_rfindstring, BLI_rfindstring_ptr, these search from the end of the listbase (like pythons rfind).

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/blender.c
    trunk/blender/source/blender/blenkernel/intern/context.c
    trunk/blender/source/blender/blenlib/BLI_listbase.h
    trunk/blender/source/blender/blenlib/intern/listbase.c
    trunk/blender/source/blender/editors/interface/interface.c

Modified: trunk/blender/source/blender/blenkernel/intern/blender.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/blender.c	2011-05-02 12:50:26 UTC (rev 36441)
+++ trunk/blender/source/blender/blenkernel/intern/blender.c	2011-05-02 13:35:04 UTC (rev 36442)
@@ -619,25 +619,15 @@
 /* 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;
+	UndoElem *uel= BLI_rfindstring(&undobase, name, offsetof(UndoElem, name));
 
-	for(uel= undobase.last; uel; uel= uel->prev)
-		if(strcmp(name, uel->name)==0)
-			break;
-
 	if(uel && uel->prev) {
 		curundo= uel->prev;
 		BKE_undo_step(C, 0);
@@ -648,12 +638,7 @@
 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;
 	}
 	

Modified: trunk/blender/source/blender/blenkernel/intern/context.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/context.c	2011-05-02 12:50:26 UTC (rev 36441)
+++ trunk/blender/source/blender/blenkernel/intern/context.c	2011-05-02 13:35:04 UTC (rev 36442)
@@ -451,12 +451,10 @@
 
 		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) {

Modified: trunk/blender/source/blender/blenlib/BLI_listbase.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_listbase.h	2011-05-02 12:50:26 UTC (rev 36441)
+++ trunk/blender/source/blender/blenlib/BLI_listbase.h	2011-05-02 13:35:04 UTC (rev 36442)
@@ -45,9 +45,16 @@
 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);

Modified: trunk/blender/source/blender/blenlib/intern/listbase.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/listbase.c	2011-05-02 12:50:26 UTC (rev 36441)
+++ trunk/blender/source/blender/blenlib/intern/listbase.c	2011-05-02 13:35:04 UTC (rev 36442)
@@ -366,14 +366,30 @@
 
 	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 @@
 
 	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;

Modified: trunk/blender/source/blender/editors/interface/interface.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface.c	2011-05-02 12:50:26 UTC (rev 36441)
+++ trunk/blender/source/blender/editors/interface/interface.c	2011-05-02 13:35:04 UTC (rev 36442)
@@ -1919,14 +1919,7 @@
 
 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)




More information about the Bf-blender-cvs mailing list