Index: trunk/psphot/src/psphotParseCamera.c
===================================================================
--- trunk/psphot/src/psphotParseCamera.c	(revision 6571)
+++ trunk/psphot/src/psphotParseCamera.c	(revision 6715)
@@ -1,24 +1,22 @@
 # include "psphot.h"
-
-# define METADATA_ADD_DEFAULT(CONFIG, TYPE, NAME, VALUE, COMMENT)\
-    { psMetadataItem *ITEM; \
-      ITEM = psMetadataLookup (CONFIG, NAME); \
-      if (ITEM == NULL) { \
-	psMetadataAdd##TYPE (CONFIG, PS_LIST_TAIL, NAME, 0, COMMENT, VALUE); \
-      } }
 
 bool psphotParseCamera (pmConfig *config) {
 
+    bool status;
+    psFits *fits = NULL;
+    psMetadata *phu = NULL;
+    psMetadata *format = NULL;
+
     // psphot is supplied with a list of input images (may be only one image)
-    psArray *infiles = psMetadataLookupPtr(NULL, config->arguments, "INPUT");
+    psArray *infiles = psMetadataLookupPtr(&status, config->arguments, "INPUT");
+    if (!status) psAbort (__func__, "missing INPUT entry");
     if (infiles->n < 1) psAbort (__func__, "empty input list");
 
     // if no camera has been specified, use the first image as a template for the rest.
     if (config->camera == NULL) {
-	psFits *fits = psFitsOpen (infiles->data[0], "r");
-	psMetadata *phu = psFitsReadHeader (NULL, fits);
-	config->camera = pmConfigCameraFromHeader (config->site, phu);
+	fits = psFitsOpen (infiles->data[0], "r");
+	phu = psFitsReadHeader (NULL, fits);
+	format = pmConfigCameraFormatFromHeader (config, phu);
 	psFitsClose (fits);
-	psFree (phu);
     }
     // There's no point in continuing if we can't recognize what we've got
@@ -28,45 +26,65 @@
     }
 
-    // XXX place the "data" element on the pmConfig structure?
+    // files
     config->files = psMetadataAlloc ();
 
     // build the template fpa, set up the basic view
-    pmFPA *input = pmFPAConstruct (camera);
+    // XXX : 216 leaks in pmFPAConstruct / psFree (input)
+    pmFPA *input = pmFPAConstruct (config->camera);
 
     // assign the I/O files (potentially) needed by psphot
-    pmFPAfile *file = pmFPAfileDefine (config->files, camera, input, "PSPHOT.INPUT");
+    // the output file is just a view to the file on config->files 
+    pmFPAfile *file = pmFPAfileDefine (config->files, format, input, "PSPHOT.INPUT");
+    if (!file) {
+	exit(EXIT_FAILURE);
+    }
 
-    pmFPAview *view = pmFPAviewAlloc (input, config->camera, 0);
     for (int i = 0; i < infiles->n; i++) {
-	// XXX save the phu from above?
-	psFits *fits = psFitsOpen (infiles->data[i], "r");
-	psMetadata *phu = psFitsReadHeader (NULL, fits);
-	pmConfigValidateCamera (config->camera, phu);
+	if (phu == NULL) {
+	    fits = psFitsOpen (infiles->data[i], "r");
+	    phu = psFitsReadHeader (NULL, fits);
+	    pmConfigValidateCameraFormat (format, phu);
+	    psFitsClose (fits);
+	}
 
 	// set the view to the corresponding entry for this phu
-	// XXX should I save the phu data at the appropriate location in the fpa?
-	pmFPAsetView (view, phu);
+	pmFPAview *view = pmFPAAddSource (input, phu, format);
 
 	// XXX is this the correct psMD to save the filename?
-	name = pmFPAviewNameFromRule (file->filextra, view);
+	char *name = pmFPAfileNameFromRule (file->filextra, file, view);
 	psMetadataAddStr (file->names, PS_LIST_TAIL, name, 0, "", infiles->data[i]);
+
+	psFree (view);
+	psFree (name);
+	psFree (phu);
+	phu = NULL;
     }
-    pmFPAfileDefine (config->files, camera, input, "PSPHOT.OUTPUT");
-    pmFPAfileDefine (config->files, camera, input, "PSPHOT.RESID");
-    pmFPAfileDefine (config->files, camera, input, "PSPHOT.PSF_INPUT");
-    pmFPAfileDefine (config->files, camera, input, "PSPHOT.PSF_OUTPUT");
+
+    pmFPAfileDefine (config->files, format, input, "PSPHOT.OUTPUT");
+
+    // pmFPAfileDefine (config->files, format, input, "PSPHOT.RESID");
+    // pmFPAfileDefine (config->files, format, input, "PSPHOT.PSF_INPUT");
+    // pmFPAfileDefine (config->files, format, input, "PSPHOT.PSF_OUTPUT");
 
     // build the template fpa, set up the basic view
     // supply the backgnd with a different camera?
-    pmFPAfileDefine (config->files, camera, NULL, "PSPHOT.BACKSUB");
-    pmFPAfileDefine (config->files, camera, NULL, "PSPHOT.BACKGND");
-    pmFPAfileDefine (config->files, camera, NULL, "PSPHOT.BACKMDL");
-    pmFPAfileDefine (config->files, camera, NULL, "PSPHOT.PSF_SAMPLE");
+    // allow alternate format?
+    // pmFPAfileConstruct (config->files, format, config->camera, "PSPHOT.BACKSUB");
+    // pmFPAfileConstruct (config->files, format, config->camera, "PSPHOT.BACKGND");
+    // pmFPAfileConstruct (config->files, format, config->camera, "PSPHOT.BACKMDL");
+    // pmFPAfileConstruct (config->files, format, config->camera, "PSPHOT.PSF_SAMPLE");
+
+    // psphot is supplied with the output name
+    char *output = psMetadataLookupPtr(&status, config->arguments, "OUTPUT");
+    file = psMetadataLookupPtr (&status, config->files, "PSPHOT.OUTPUT");
+    if (!status) psAbort (__func__, "missing OUTPUT entry");
+    psMetadataAddStr (file->names, PS_LIST_TAIL, "OUTPUT", 0, "", output);
 
     // recipe override values (command-line options):
-    psMetadata *options = psMetadataLookupPtr (status, config->arguments, "PSPHOT.OPTIONS");
-    psMetadata *recipe = psMetadataLookupPtr (status, config->recipes, "PSPHOT");
+    psMetadata *options = psMetadataLookupPtr (&status, config->arguments, "PSPHOT.OPTIONS");
+    psMetadata *recipe = psMetadataLookupPtr (&status, config->recipes, "PSPHOT");
     psMetadataIterator *iter = psMetadataIteratorAlloc (options, PS_LIST_HEAD, NULL);
-    while ((psMetadataItem *item = psMetadataGetAndIncrement (iter)) != NULL) {
+    psMetadataItem *item = NULL;
+    while ((item = psMetadataGetAndIncrement (iter)) != NULL) {
 	psMetadataAddItem (recipe, item, PS_LIST_TAIL, PS_META_REPLACE);
     }
@@ -74,11 +92,11 @@
 
     // set default recipe values here
-    // XXX this needs re-thinking...
-    METADATA_ADD_DEFAULT (recipe, Str, "FITMODE",     "NONE", "");
-    METADATA_ADD_DEFAULT (recipe, Str, "PHOTCODE",    "NONE", "");
-    METADATA_ADD_DEFAULT (recipe, Str, "BREAK_POINT", "NONE", "");
+    psMetadataAddStr (recipe, PS_LIST_TAIL, "FITMODE", PS_META_NO_REPLACE, "default fitting mode", "NONE");
+    psMetadataAddStr (recipe, PS_LIST_TAIL, "PHOTCODE", PS_META_NO_REPLACE, "default photcode", "NONE");
+    psMetadataAddStr (recipe, PS_LIST_TAIL, "BREAK_POINT", PS_META_NO_REPLACE, "default break point", "NONE");
 
     // Chip selection: if we are using a single chip, select it for each FPA
     // Chip numbers to work on: -chip 1,2,3,5,8,10
+    # if (0)
     char *chips = psMetadataLookupStr(NULL, config->arguments, "CHIP_SELECTIONS"); 
     if (chips != NULL) {
@@ -102,4 +120,9 @@
         }
     }
+    # endif
+
+    psFree (input);
+    psFree (format);
+
     psTrace(__func__, 1, "Done with psphotParseCamera...\n");
     return true;
