summaryrefslogtreecommitdiffstats
path: root/common/collection/collection_iter.c
diff options
context:
space:
mode:
authorDmitri Pal <dpal@redhat.com>2009-09-27 22:18:41 -0400
committerStephen Gallagher <sgallagh@redhat.com>2009-10-05 10:32:07 -0400
commitea7d823fa584b36e9a34a43c32dc476beede5ea2 (patch)
treebf3080e4b0b14c26cf4080d6c6d11d6781a0b471 /common/collection/collection_iter.c
parent26a9c1f22f31a87a83fbb59caea7c7565563f479 (diff)
downloadsssd-ea7d823fa584b36e9a34a43c32dc476beede5ea2.tar.gz
sssd-ea7d823fa584b36e9a34a43c32dc476beede5ea2.tar.xz
sssd-ea7d823fa584b36e9a34a43c32dc476beede5ea2.zip
COLLECTION Enhancing hashing and iteration functions
Diffstat (limited to 'common/collection/collection_iter.c')
-rw-r--r--common/collection/collection_iter.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/common/collection/collection_iter.c b/common/collection/collection_iter.c
index f66fc3085..0baefe83a 100644
--- a/common/collection/collection_iter.c
+++ b/common/collection/collection_iter.c
@@ -382,8 +382,13 @@ void col_pin_iterator(struct collection_iterator *iterator)
{
TRACE_FLOW_STRING("col_iterator_add_pin", "Entry");
- while ((iterator->stack[iterator->stack_depth - 1] == NULL) &&
- (iterator->stack_depth)) {
+ if ((!iterator) || (!iterator->stack)) {
+ TRACE_FLOW_STRING("Invalid itertor", "Ingoring");
+ return;
+ }
+
+ while ((iterator->stack_depth) &&
+ (iterator->stack[iterator->stack_depth - 1] == NULL)) {
iterator->stack_depth--;
}
@@ -399,3 +404,24 @@ void col_pin_iterator(struct collection_iterator *iterator)
TRACE_FLOW_STRING("col_iterator_add_pin", "Exit");
}
+
+
+/* Rewinds iterator to the beginning */
+void col_rewind_iterator(struct collection_iterator *iterator)
+{
+ TRACE_FLOW_STRING("col_rewind_iterator", "Entry");
+
+ if ((!iterator) || (!iterator->stack)) {
+ TRACE_FLOW_STRING("Invalid itertor", "Ingoring");
+ return;
+ }
+
+ iterator->pin = iterator->top;
+ iterator->stack[0] = iterator->top;
+ iterator->stack_depth = 1;
+ iterator->item_level = 0;
+ iterator->pin_level = 0;
+ iterator->can_break = 0;
+
+ TRACE_FLOW_STRING("col_rewind_iterator", "Exit");
+}