Index: trunk/psModules/src/camera/pmFPAfile.c
===================================================================
--- trunk/psModules/src/camera/pmFPAfile.c	(revision 16352)
+++ trunk/psModules/src/camera/pmFPAfile.c	(revision 16355)
@@ -482,2 +482,53 @@
   return ("NONE");
 }
+
+
+psArray *pmFPAfileSelect(psMetadata *files, const char *name)
+{
+    PS_ASSERT_PTR_NON_NULL(files, NULL);
+
+    psList *list = psListAlloc(NULL);   // List of files selected
+
+    psString regex = NULL;              // Regular expression
+    if (name) {
+        psStringAppend(&regex, "^%s$", name);
+    }
+    psMetadataIterator *iter = psMetadataIteratorAlloc(files, PS_LIST_HEAD, regex); // Iterator
+    psFree(regex);
+    psMetadataItem *item;               // Item from iteration
+    while ((item = psMetadataGetAndIncrement(iter))) {
+        pmFPAfile *file = item->data.V; // File of iterest
+        psListAdd(list, PS_LIST_TAIL, file);
+    }
+    psFree(iter);
+
+    psArray *array = psListToArray(list); // Array generated from list
+    psFree(list);
+
+    return array;
+}
+
+pmFPAfile *pmFPAfileSelectSingle(psMetadata *files, const char *name, int num)
+{
+    PS_ASSERT_PTR_NON_NULL(files, NULL);
+    PS_ASSERT_INT_NONNEGATIVE(num, NULL);
+
+    psString regex = NULL;              // Regular expression
+    if (name) {
+        psStringAppend(&regex, "^%s$", name);
+    }
+
+    psMetadataIterator *iter = psMetadataIteratorAlloc(files, PS_LIST_HEAD, regex); // Iterator
+    psFree(regex);
+    psMetadataItem *item;               // Item from iteration
+    int i = 0;                          // Counter
+    while ((item = psMetadataGetAndIncrement(iter))) {
+        if (i++ == num) {
+            return item->data.V;
+        }
+    }
+    psFree(iter);
+
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true, "Unable to find instance %d of file %s", num, name);
+    return NULL;
+}
Index: trunk/psModules/src/camera/pmFPAfile.h
===================================================================
--- trunk/psModules/src/camera/pmFPAfile.h	(revision 16352)
+++ trunk/psModules/src/camera/pmFPAfile.h	(revision 16355)
@@ -4,6 +4,6 @@
  * @author EAM, IfA
  *
- * @version $Revision: 1.27 $ $Name: not supported by cvs2svn $
- * @date $Date: 2008-02-07 00:08:53 $
+ * @version $Revision: 1.28 $ $Name: not supported by cvs2svn $
+ * @date $Date: 2008-02-07 23:45:56 $
  * Copyright 2004-2005 Institute for Astronomy, University of Hawaii
  */
@@ -128,4 +128,21 @@
 const char *pmFPAfileStringFromType(pmFPAfileType type);
 
+/// Select files with the same name from the list of files
+///
+/// Returns all files if name is NULL.
+psArray *pmFPAfileSelect(psMetadata *files, ///< All files
+                         const char *name ///< Name of file(s) to return, or NULL for all
+    );
+
+/// Select a specific instance of a file from the list of files
+///
+/// Returns the num-th instance of all files if name is NULL.
+pmFPAfile *pmFPAfileSelectSingle(psMetadata *files, ///< All files
+                                 const char *name, ///< Name of file
+                                 int num ///< Instance number of specific instance
+    );
+
+
+
 /// @}
 # endif
Index: trunk/psModules/src/camera/pmFPAfileIO.c
===================================================================
--- trunk/psModules/src/camera/pmFPAfileIO.c	(revision 16352)
+++ trunk/psModules/src/camera/pmFPAfileIO.c	(revision 16355)
@@ -912,43 +912,21 @@
 }
 
-// set the state of the specified pmFPAfile to active (state == true) or inactive
+
+// set the state of the specified pmFPAfile(s) to active (state == true) or inactive
 // if name is NULL, set the state for all pmFPAfiles
-bool pmFPAfileActivate (psMetadata *files, bool state, const char *name)
+bool pmFPAfileActivate(psMetadata *files, bool state, const char *name)
 {
     PS_ASSERT_PTR_NON_NULL(files, false);
 
-    // Do this as an iteration rather than a lookup, since we may want to turn on/off multiple files at once
-    // (if there are multiple files defined with the same name).
-
-    if (!name) {
-        psMetadataItem *item = NULL;
-        psMetadataIterator *iter = psMetadataIteratorAlloc (files, PS_LIST_HEAD, NULL);
-        while ((item = psMetadataGetAndIncrement (iter)) != NULL) {
-            pmFPAfile *file = item->data.V;
-            if (state) {
-                file->state &= PS_NOT_U8(PM_FPA_STATE_INACTIVE);
-            } else {
-                file->state |= PM_FPA_STATE_INACTIVE;
-            }
-        }
-        psFree (iter);
-        return true;
-    }
-
-    if (!psMetadataLookup(files, name)) {
-        // We activated every example of that file that we could find.
-        return true;
-    }
-
-    psString regex = NULL;              // Regular expression for psMetadataIteratorAlloc
-    if (name) {
-        psStringAppend(&regex, "^%s$", name);
-    }
-
-    int num = 0;                        // Number of files activated
-    psMetadataItem *item = NULL;        // Item from iteration
-    psMetadataIterator *iter = psMetadataIteratorAlloc(files, PS_LIST_HEAD, regex); // Iterator
-    while ((item = psMetadataGetAndIncrement(iter))) {
-        pmFPAfile *file = item->data.V; // File of interest
+    psArray *selected = pmFPAfileSelect(files, name);
+    if (!selected) {
+        psError(PS_ERR_UNKNOWN, false, "Unable to select files with name %s", name);
+        return false;
+    }
+    for (int i = 0; i < selected->n; i++) {
+        pmFPAfile *file = selected->data[i]; // File of interest
+        if (!file) {
+            continue;
+        }
         if (state) {
             file->state &= PS_NOT_U8(PM_FPA_STATE_INACTIVE);
@@ -956,8 +934,6 @@
             file->state |= PM_FPA_STATE_INACTIVE;
         }
-        num++;
-    }
-    psFree(iter);
-    psFree(regex);
+    }
+    psFree(selected);
 
     return true;
@@ -971,24 +947,15 @@
     PS_ASSERT_INT_NONNEGATIVE(num, NULL);
 
-    psString regex = NULL;              // Regular expression for psMetadataIteratorAlloc
-    psStringAppend(&regex, "^%s$", name);
-
-    int i = 0;                          // Counter
-    psMetadataItem *item = NULL;        // Item from iteration
-    psMetadataIterator *iter = psMetadataIteratorAlloc(files, PS_LIST_HEAD, regex); // Iterator
-    psFree(regex);
-    while ((item = psMetadataGetAndIncrement(iter))) {
-        if (i++ == num) {
-            pmFPAfile *file = item->data.V; // File of interest
-            if (state) {
-                file->state &= PS_NOT_U8(PM_FPA_STATE_INACTIVE);
-            } else {
-                file->state |= PM_FPA_STATE_INACTIVE;
-            }
-            psFree(iter);
-            return file;
-        }
-    }
-    psFree(iter);
-    return NULL;
-}
+    pmFPAfile *file = pmFPAfileSelectSingle(files, name, num);
+    if (!file) {
+        psError(PS_ERR_UNKNOWN, false, "Unable to select instance %d of file %s", num, name);
+        return NULL;
+    }
+    if (state) {
+        file->state &= PS_NOT_U8(PM_FPA_STATE_INACTIVE);
+    } else {
+        file->state |= PM_FPA_STATE_INACTIVE;
+    }
+
+    return file;
+}
