Index: trunk/psLib/src/types/psMetadata.c
===================================================================
--- trunk/psLib/src/types/psMetadata.c	(revision 7915)
+++ trunk/psLib/src/types/psMetadata.c	(revision 7918)
@@ -12,6 +12,6 @@
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.117 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2006-07-15 02:57:12 $
+ *  @version $Revision: 1.118 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2006-07-17 22:41:38 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -919,8 +919,4 @@
 
     psMetadataIterator* newIter = psAlloc(sizeof(psMetadataIterator));
-    newIter->regex = NULL;
-    newIter->iter = NULL;
-
-    // Set deallocator
     psMemSetDeallocator(newIter, (psFreeFunc) metadataIteratorFree);
 
@@ -929,9 +925,8 @@
     if (regex) {
         newIter->regex = psAlloc(sizeof(regex_t));
-        int regRtn = regcomp(newIter->regex,regex,0);
+        int regRtn = regcomp(newIter->regex, regex, 0);
         if (regRtn != 0) {
             char errMsg[256];
             regerror(regRtn, newIter->regex, errMsg, 256);
-            regfree(newIter->regex);
             psError(PS_ERR_BAD_PARAMETER_VALUE, true,
                     PS_ERRORTEXT_psMetadata_REGEX_INVALID,
@@ -940,4 +935,11 @@
             return NULL;
         }
+        if (!psMetadataIteratorSet(newIter, location)) {
+            psError(PS_ERR_UNKNOWN, false, "Unable to set location=%d for metadata iterator.\n", location);
+            psFree(newIter);
+            return NULL;
+        }
+    } else {
+        newIter->regex = NULL;
     }
 
@@ -948,25 +950,25 @@
                            long location)
 {
-    int match;
-    psMetadataItem* cursor;
-
-    PS_ASSERT_PTR_NON_NULL(iterator,NULL);
-
-    psListIterator* iter = iterator->iter;
-    PS_ASSERT_PTR_NON_NULL(iterator->iter,NULL);
-
-    regex_t* regex = iterator->regex;
+    PS_ASSERT_PTR_NON_NULL(iterator, NULL);
+    psListIterator *listIter = iterator->iter;
+    PS_ASSERT_PTR_NON_NULL(listIter, NULL);
+
+    regex_t *regex = iterator->regex;
 
     // handle trivial case where no regex subsetting is required.
     if (regex == NULL) {
-        return psListIteratorSet(iter,location);
-    }
-
+        return psListIteratorSet(listIter, location);
+    }
+
+    // If there's a regex, then we need to count into the list.
+    // We count ONLY those entries that match the regex
+
+    // Here we count in from the tail
     if (location < 0) {
-        // match from the tail
-        match = 0;
-        psListIteratorSet(iter,PS_LIST_TAIL);
-        while ( (cursor=(psMetadataItem*)iter->cursor) != NULL) {
-            if (regexec(regex, cursor->name, 0, NULL, 0) == 0) {
+        psListIteratorSet(listIter, PS_LIST_TAIL);
+        psMetadataItem *item;           // Item from iteration
+        int match = 0;                  // Match number
+        while (listIter->cursor && (item = listIter->cursor->data)) {
+            if (regexec(regex, item->name, 0, NULL, 0) == 0) {
                 // this key is a match
                 match--;
@@ -975,14 +977,15 @@
                 }
             }
-            (void)psListGetAndDecrement(iter);
+            (void)psListGetAndDecrement(listIter);
         }
         return (match == location);
     }
 
-    // find the n-th match from the head
-    match = -1;
-    psListIteratorSet(iter,PS_LIST_HEAD);
-    while ( (cursor=(psMetadataItem*)iter->cursor) != NULL) {
-        if (regexec(regex, cursor->name, 0, NULL, 0) == 0) {
+    // Here we count in from the head
+    psListIteratorSet(listIter, PS_LIST_HEAD);
+    psMetadataItem *item;               // Item from iteration
+    int match = -1;                     // Match number
+    while (listIter->cursor && (item = listIter->cursor->data)) {
+        if (regexec(regex, item->name, 0, NULL, 0) == 0) {
             // this key is a match
             match++;
@@ -991,5 +994,5 @@
             }
         }
-        (void)psListGetAndIncrement(iter);
+        (void)psListGetAndIncrement(listIter);
     }
     return (match == location);
@@ -998,10 +1001,7 @@
 psMetadataItem* psMetadataGetAndIncrement(psMetadataIterator* iterator)
 {
-    psMetadataItem* oldValue;
-
     PS_ASSERT_PTR_NON_NULL(iterator,NULL);
-
-    psListIterator* iter = iterator->iter;
-    PS_ASSERT_PTR_NON_NULL(iterator->iter,NULL);
+    psListIterator* listIter = iterator->iter;
+    PS_ASSERT_PTR_NON_NULL(listIter,NULL);
 
     regex_t* regex = iterator->regex;
@@ -1009,27 +1009,23 @@
     // handle trivial case where no regex subsetting is required.
     if (regex == NULL) {
-        return (psMetadataItem*)psListGetAndIncrement(iter);
-    }
-
-    oldValue = (psMetadataItem*)iter->cursor;
-
-    while (psListGetAndIncrement(iter) != NULL) {
-        if (iter->cursor != NULL &&
-                regexec(regex, ((psMetadataItem*)iter->cursor->data)->name, 0, NULL, 0) == 0) {
+        return (psMetadataItem*)psListGetAndIncrement(listIter);
+    }
+
+    // Iterate until we find something matching the regex
+    psMetadataItem *newItem;            // New MD item from iteration
+    while ((newItem = psListGetAndIncrement(listIter))) {
+        if (regexec(regex, newItem->name, 0, NULL, 0) == 0) {
             // this key is a match
             break;
         }
     }
-    return oldValue;
+    return newItem;
 }
 
 psMetadataItem* psMetadataGetAndDecrement(psMetadataIterator* iterator)
 {
-    psMetadataItem* oldValue;
-
-    PS_ASSERT_PTR_NON_NULL(iterator,NULL);
-
-    psListIterator* iter = iterator->iter;
-    PS_ASSERT_PTR_NON_NULL(iterator->iter,NULL);
+    PS_ASSERT_PTR_NON_NULL(iterator, NULL);
+    psListIterator* listIter = iterator->iter;
+    PS_ASSERT_PTR_NON_NULL(listIter, NULL);
 
     regex_t* regex = iterator->regex;
@@ -1037,17 +1033,16 @@
     // handle trivial case where no regex subsetting is required.
     if (regex == NULL) {
-        return (psMetadataItem*)psListGetAndDecrement(iter);
-    }
-
-    oldValue = (psMetadataItem*)iter->cursor;
-
-    while (psListGetAndDecrement(iter) != NULL) {
-        if (iter->cursor != NULL &&
-                regexec(regex, ((psMetadataItem*)iter->cursor)->name, 0, NULL, 0) == 0) {
+        return (psMetadataItem*)psListGetAndDecrement(listIter);
+    }
+
+    // Iterate until we find something matching the regex
+    psMetadataItem *newItem;            // New MD item from iteration
+    while ((newItem = psListGetAndDecrement(listIter))) {
+        if (regexec(regex, newItem->name, 0, NULL, 0) == 0) {
             // this key is a match
             break;
         }
     }
-    return oldValue;
+    return newItem;
 }
 
