Index: trunk/psModules/src/camera/pmFPAfile.c
===================================================================
--- trunk/psModules/src/camera/pmFPAfile.c	(revision 13523)
+++ trunk/psModules/src/camera/pmFPAfile.c	(revision 13810)
@@ -5,5 +5,5 @@
 #include <stdio.h>
 #include <string.h>
-#include <strings.h>		/* for strn?casecmp */
+#include <strings.h>            /* for strn?casecmp */
 #include <pslib.h>
 
@@ -164,24 +164,14 @@
 }
 
-// select the rule from the camera configuration, perform substitutions as needed
-psString pmFPAfileNameFromRule(const char *rule, const pmFPAfile *file, const pmFPAview *view)
-{
-    PS_ASSERT_PTR_NON_NULL(rule, NULL);
-    PS_ASSERT_INT_POSITIVE(strlen(rule), NULL);
-    PS_ASSERT_PTR_NON_NULL(file, NULL);
+psString pmFPANameFromRule(const char *rule, const pmFPA *fpa, const pmFPAview *view)
+{
+    PS_ASSERT_STRING_NON_EMPTY(rule, NULL);
     PS_ASSERT_PTR_NON_NULL(view, NULL);
 
-    char *newName = NULL;     // destination for resulting name
-
-    newName = psStringCopy (rule);
-
-    if (strstr (newName, "{OUTPUT}") != NULL) {
-        char *name = psMetadataLookupStr (NULL, file->names, "OUTPUT");
-        if (name != NULL) {
-            psStringSubstitute(&newName, name, "{OUTPUT}");
-        }
-    }
+    psString newName = NULL;            // New name, to be returned
+    newName = psStringCopy(rule);
+
     if (strstr (newName, "{CHIP.NAME}") != NULL) {
-        pmChip *chip = pmFPAviewThisChip (view, file->fpa);
+        pmChip *chip = pmFPAviewThisChip (view, fpa);
         if (chip != NULL) {
             char *name = psMetadataLookupStr (NULL, chip->concepts, "CHIP.NAME");
@@ -202,5 +192,5 @@
     }
     if (strstr (newName, "{CELL.NAME}") != NULL) {
-        pmCell *cell = pmFPAviewThisCell (view, file->fpa);
+        pmCell *cell = pmFPAviewThisCell (view, fpa);
         if (cell != NULL) {
             char *name = psMetadataLookupStr (NULL, cell->concepts, "CELL.NAME");
@@ -220,5 +210,5 @@
     }
     if (strstr (newName, "{EXTNAME}") != NULL) {
-        pmHDU *hdu = pmFPAviewThisHDU (view, file->fpa);
+        pmHDU *hdu = pmFPAviewThisHDU (view, fpa);
         if (hdu->extname && *hdu->extname) {
             psStringSubstitute(&newName, hdu->extname, "{EXTNAME}");
@@ -226,6 +216,6 @@
     }
     if (strstr (newName, "{FILTER}") != NULL) {
-        if (file->fpa != NULL) {
-            char *name = psMetadataLookupStr (NULL, file->fpa->concepts, "FPA.FILTER");
+        if (fpa != NULL) {
+            char *name = psMetadataLookupStr (NULL, fpa->concepts, "FPA.FILTER");
             if (name && *name) {
                 psStringSubstitute(&newName, name, "{FILTER}");
@@ -234,6 +224,6 @@
     }
     if (strstr (newName, "{FILTER.ID}") != NULL) {
-        if (file->fpa != NULL) {
-            char *name = psMetadataLookupStr (NULL, file->fpa->concepts, "FPA.FILTERID");
+        if (fpa != NULL) {
+            char *name = psMetadataLookupStr (NULL, fpa->concepts, "FPA.FILTERID");
             if (name && *name) {
                 psStringSubstitute(&newName, name, "{FILTER.ID}");
@@ -242,6 +232,6 @@
     }
     if (strstr (newName, "{CAMERA}") != NULL) {
-        if (file->fpa != NULL) {
-            char *name = psMetadataLookupStr (NULL, file->fpa->concepts, "FPA.INSTRUMENT");
+        if (fpa != NULL) {
+            char *name = psMetadataLookupStr (NULL, fpa->concepts, "FPA.INSTRUMENT");
             if (name && *name) {
                 psStringSubstitute(&newName, name, "{CAMERA}");
@@ -250,6 +240,6 @@
     }
     if (strstr (newName, "{INSTRUMENT}") != NULL) {
-        if (file->fpa != NULL) {
-            char *name = psMetadataLookupStr (NULL, file->fpa->concepts, "FPA.INSTRUMENT");
+        if (fpa != NULL) {
+            char *name = psMetadataLookupStr (NULL, fpa->concepts, "FPA.INSTRUMENT");
             if (name && *name) {
                 psStringSubstitute(&newName, name, "{INSTRUMENT}");
@@ -258,6 +248,6 @@
     }
     if (strstr (newName, "{DETECTOR}") != NULL) {
-        if (file->fpa != NULL) {
-            char *name = psMetadataLookupStr (NULL, file->fpa->concepts, "FPA.DETECTOR");
+        if (fpa != NULL) {
+            char *name = psMetadataLookupStr (NULL, fpa->concepts, "FPA.DETECTOR");
             if (name && *name) {
                 psStringSubstitute(&newName, name, "{DETECTOR}");
@@ -266,6 +256,6 @@
     }
     if (strstr (newName, "{TELESCOPE}") != NULL) {
-        if (file->fpa != NULL) {
-            char *name = psMetadataLookupStr (NULL, file->fpa->concepts, "FPA.TELESCOPE");
+        if (fpa != NULL) {
+            char *name = psMetadataLookupStr (NULL, fpa->concepts, "FPA.TELESCOPE");
             if (name && *name) {
                 psStringSubstitute(&newName, name, "{TELESCOPE}");
@@ -273,4 +263,28 @@
         }
     }
+    return newName;
+}
+
+// select the rule from the camera configuration, perform substitutions as needed
+psString pmFPAfileNameFromRule(const char *rule, const pmFPAfile *file, const pmFPAview *view)
+{
+    PS_ASSERT_PTR_NON_NULL(rule, NULL);
+    PS_ASSERT_INT_POSITIVE(strlen(rule), NULL);
+    PS_ASSERT_PTR_NON_NULL(file, NULL);
+    PS_ASSERT_PTR_NON_NULL(view, NULL);
+
+    psString newRule = NULL;            // Rule to pass on to pmFPANameFromRule
+    newRule = psStringCopy(rule);
+
+    if (strstr(newRule, "{OUTPUT}") != NULL) {
+        char *name = psMetadataLookupStr(NULL, file->names, "OUTPUT");
+        if (name) {
+            psStringSubstitute(&newRule, name, "{OUTPUT}");
+        }
+    }
+
+    psString newName = pmFPANameFromRule(newRule, file->fpa, view); // New name, to be returned
+    psFree(newRule);
+
     return newName;
 }
@@ -346,5 +360,5 @@
         status = pmChipCopyStructure (outChip, inChip, xBin, yBin);
         return status;
-    } 
+    }
     if (view->cell >= inChip->cells->n) {
         psError(PS_ERR_IO, true, "Requested cell == %d>= inChip->cells->n == %ld",
@@ -410,31 +424,31 @@
     switch (type) {
       case PM_FPA_FILE_SX:
-	return ("SX");
+        return ("SX");
       case PM_FPA_FILE_OBJ:
-	return ("OBJ");
+        return ("OBJ");
       case PM_FPA_FILE_CMP:
-	return ("CMP");
+        return ("CMP");
       case PM_FPA_FILE_CMF:
-	return ("CMF");
+        return ("CMF");
       case PM_FPA_FILE_RAW:
-	return ("RAW");
+        return ("RAW");
       case PM_FPA_FILE_IMAGE:
-	return ("IMAGE");
+        return ("IMAGE");
       case PM_FPA_FILE_PSF:
-	return ("PSF");
+        return ("PSF");
       case PM_FPA_FILE_JPEG:
-	return ("JPEG");
+        return ("JPEG");
       case PM_FPA_FILE_KAPA:
-	return ("KAPA");
+        return ("KAPA");
       case PM_FPA_FILE_MASK:
-	return ("MASK");
+        return ("MASK");
       case PM_FPA_FILE_WEIGHT:
-	return ("WEIGHT");
+        return ("WEIGHT");
       case PM_FPA_FILE_FRINGE:
-	return ("FRINGE");
+        return ("FRINGE");
       case PM_FPA_FILE_HEADER:
-	return ("HEADER");
+        return ("HEADER");
       default:
-	return ("NONE");
+        return ("NONE");
     }
     return ("NONE");
