Index: trunk/psModules/src/objects/pmSourceIO.c
===================================================================
--- trunk/psModules/src/objects/pmSourceIO.c	(revision 15227)
+++ trunk/psModules/src/objects/pmSourceIO.c	(revision 15562)
@@ -3,6 +3,6 @@
  *  @author EAM, IfA
  *
- *  @version $Revision: 1.52 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2007-10-05 22:46:34 $
+ *  @version $Revision: 1.53 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2007-11-10 01:09:20 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -47,4 +47,6 @@
 int pmSourceGetDophotType (pmSource *source)
 {
+    PS_ASSERT_PTR_NON_NULL(source, -1);
+
     switch (source->type) {
 
@@ -74,4 +76,6 @@
 bool pmSourceSetDophotType (pmSource *source, int type)
 {
+    PS_ASSERT_PTR_NON_NULL(source, false);
+
     if (type == 4) {
         source->mode |= PM_SOURCE_MODE_FAIL;
@@ -106,4 +110,7 @@
 bool pmFPAviewWriteObjects (const pmFPAview *view, pmFPAfile *file, const pmConfig *config)
 {
+    PS_ASSERT_PTR_NON_NULL(view, false);
+    PS_ASSERT_PTR_NON_NULL(file, false);
+    PS_ASSERT_PTR_NON_NULL(file->fpa, false);
 
     pmFPA *fpa = file->fpa;
@@ -165,4 +172,8 @@
 bool pmFPAWriteObjects (pmFPA *fpa, const pmFPAview *view, pmFPAfile *file, const pmConfig *config)
 {
+    PS_ASSERT_PTR_NON_NULL(view, false);
+    PS_ASSERT_PTR_NON_NULL(fpa, false);
+    PS_ASSERT_PTR_NON_NULL(fpa->chips, false);
+
     pmFPAview *thisView = pmFPAviewAlloc (view->nRows);
     *thisView = *view;
@@ -184,4 +195,8 @@
 bool pmChipWriteObjects (pmChip *chip, const pmFPAview *view, pmFPAfile *file, const pmConfig *config)
 {
+    PS_ASSERT_PTR_NON_NULL(chip, false);
+    PS_ASSERT_PTR_NON_NULL(chip->cells, false);
+    PS_ASSERT_PTR_NON_NULL(view, false);
+
     pmFPAview *thisView = pmFPAviewAlloc (view->nRows);
     *thisView = *view;
@@ -203,4 +218,8 @@
 bool pmCellWriteObjects (pmCell *cell, const pmFPAview *view, pmFPAfile *file, const pmConfig *config)
 {
+    PS_ASSERT_PTR_NON_NULL(cell, false);
+    PS_ASSERT_PTR_NON_NULL(cell->readouts, false);
+    PS_ASSERT_PTR_NON_NULL(view, false);
+
     pmFPAview *thisView = pmFPAviewAlloc (view->nRows);
     *thisView = *view;
@@ -222,12 +241,18 @@
 bool pmReadoutWriteObjects (pmReadout *readout, const pmFPAview *view, pmFPAfile *file, const pmConfig *config)
 {
+    PS_ASSERT_PTR_NON_NULL(readout, false);
+    PS_ASSERT_PTR_NON_NULL(view, false);
+    PS_ASSERT_PTR_NON_NULL(file, false);
+    PS_ASSERT_PTR_NON_NULL(file->fpa, false);
 
     bool status;
-    char *exttype;
-    char *dataname;
-    char *headname;
     pmHDU *hdu;
     psMetadata *updates;
     psMetadata *outhead;
+
+    char *exttype  = NULL;
+    char *dataname = NULL;
+    char *xsrcname = NULL;
+    char *headname = NULL;
 
     // XXX if sources is NULL, skip the cell or write out empty tables?
@@ -284,4 +309,14 @@
         // get the current header
         hdu = pmFPAviewThisHDU (view, file->fpa);
+
+	// determine the output table format
+	psMetadata *recipe = psMetadataLookupMetadata(&status, config->recipes, "PSPHOT");
+	if (!status) {
+	  psError(PS_ERR_UNKNOWN, true, "missing recipe PSPHOT in config data");
+	  return false;
+	}
+
+	// if this is not TRUE, the output files only contain the psf measurements.
+	bool XSRC_OUTPUT = psMetadataLookupBool(&status, recipe, "SAVE.XSRC");
 
         // define the EXTNAME values for the different data segments:
@@ -312,4 +347,14 @@
             }
             dataname = pmFPAfileNameFromRule (rule, file, view);
+
+	    if (XSRC_OUTPUT) {
+	      // EXTNAME for extended source data table
+	      rule = psMetadataLookupStr(&status, menu, "CMF.XSRC");
+	      if (!rule) {
+                psError(PS_ERR_UNKNOWN, true, "missing entry for CMF.XSRC in EXTNAME.RULES in camera.config");
+                return false;
+	      }
+	      xsrcname = pmFPAfileNameFromRule (rule, file, view);
+	    }
         }
 
@@ -350,10 +395,4 @@
             outhead = psMetadataAlloc ();
 
-            // determine the output table format
-            psMetadata *recipe = psMetadataLookupMetadata(&status, config->recipes, "PSPHOT");
-            if (!status) {
-                psError(PS_ERR_UNKNOWN, true, "missing recipe PSPHOT in config data");
-                return false;
-            }
             exttype = psMemIncrRefCounter (psMetadataLookupStr(&status, recipe, "OUTPUT.FORMAT"));
             if (!exttype) {
@@ -375,7 +414,6 @@
             }
             if (!strcmp (exttype, "PS1_DEV_1")) {
-                status = pmSourcesWrite_PS1_DEV_1 (file->fits, sources, file->header, outhead, dataname);
+                status = pmSourcesWrite_PS1_DEV_1 (file->fits, sources, file->header, outhead, dataname, xsrcname);
             }
-
             if (!status) {
                 psError(PS_ERR_IO, false, "writing CMF data to %s with format %s\n", file->filename, exttype);
@@ -403,5 +441,8 @@
 
 // if this file needs to have a PHU written out, write one
-bool pmSource_CMF_WritePHU (const pmFPAview *view, pmFPAfile *file, const pmConfig *config) {
+bool pmSource_CMF_WritePHU (const pmFPAview *view, pmFPAfile *file, const pmConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(view, false);
+    PS_ASSERT_PTR_NON_NULL(file, false);
 
     bool status;
@@ -512,4 +553,8 @@
 bool pmFPAviewReadObjects (const pmFPAview *view, pmFPAfile *file, const pmConfig *config)
 {
+    PS_ASSERT_PTR_NON_NULL(view, false);
+    PS_ASSERT_PTR_NON_NULL(file, false);
+    PS_ASSERT_PTR_NON_NULL(file->fpa, false);
+
     pmFPA *fpa = file->fpa;
 
@@ -551,4 +596,9 @@
 bool pmFPAReadObjects (pmFPA *fpa, const pmFPAview *view, pmFPAfile *file, const pmConfig *config)
 {
+    PS_ASSERT_PTR_NON_NULL(view, false);
+    PS_ASSERT_PTR_NON_NULL(file, false);
+    PS_ASSERT_PTR_NON_NULL(file->fpa, false);
+    PS_ASSERT_PTR_NON_NULL(file->fpa->chips, false);
+
     pmFPAview *thisView = pmFPAviewAlloc (view->nRows);
     *thisView = *view;
@@ -572,4 +622,8 @@
 bool pmChipReadObjects (pmChip *chip, const pmFPAview *view, pmFPAfile *file, const pmConfig *config)
 {
+    PS_ASSERT_PTR_NON_NULL(view, false);
+    PS_ASSERT_PTR_NON_NULL(chip, false);
+    PS_ASSERT_PTR_NON_NULL(chip->cells, false);
+
     pmFPAview *thisView = pmFPAviewAlloc (view->nRows);
     *thisView = *view;
@@ -596,4 +650,8 @@
 bool pmCellReadObjects (pmCell *cell, const pmFPAview *view, pmFPAfile *file, const pmConfig *config)
 {
+    PS_ASSERT_PTR_NON_NULL(view, false);
+    PS_ASSERT_PTR_NON_NULL(cell, false);
+    PS_ASSERT_PTR_NON_NULL(cell->readouts, false);
+
     pmFPAview *thisView = pmFPAviewAlloc (view->nRows);
     *thisView = *view;
@@ -637,4 +695,6 @@
 bool pmReadoutReadObjects (pmReadout *readout, const pmFPAview *view, pmFPAfile *file, const pmConfig *config)
 {
+    PS_ASSERT_PTR_NON_NULL(view, false);
+    PS_ASSERT_PTR_NON_NULL(file, false);
 
     bool status;
@@ -774,4 +834,8 @@
 bool pmFPAviewCheckDataStatusForSources (const pmFPAview *view, const pmFPAfile *file)
 {
+    PS_ASSERT_PTR_NON_NULL(view, false);
+    PS_ASSERT_PTR_NON_NULL(file, false);
+    PS_ASSERT_PTR_NON_NULL(file->fpa, false);
+
     pmFPA *fpa = file->fpa;
 
@@ -811,5 +875,8 @@
 }
 
-bool pmFPACheckDataStatusForSources (const pmFPA *fpa) {
+bool pmFPACheckDataStatusForSources (const pmFPA *fpa)
+{
+    PS_ASSERT_PTR_NON_NULL(fpa, false);
+    PS_ASSERT_PTR_NON_NULL(fpa->chips, false);
 
     for (int i = 0; i < fpa->chips->n; i++) {
@@ -821,5 +888,8 @@
 }
 
-bool pmChipCheckDataStatusForSources (const pmChip *chip) {
+bool pmChipCheckDataStatusForSources (const pmChip *chip)
+{
+    PS_ASSERT_PTR_NON_NULL(chip, false);
+    PS_ASSERT_PTR_NON_NULL(chip->cells, false);
 
     for (int i = 0; i < chip->cells->n; i++) {
@@ -831,5 +901,8 @@
 }
 
-bool pmCellCheckDataStatusForSources (const pmCell *cell) {
+bool pmCellCheckDataStatusForSources (const pmCell *cell)
+{
+    PS_ASSERT_PTR_NON_NULL(cell, false);
+    PS_ASSERT_PTR_NON_NULL(cell->readouts, false);
 
     for (int i = 0; i < cell->readouts->n; i++) {
@@ -841,5 +914,7 @@
 }
 
-bool pmReadoutCheckDataStatusForSources (const pmReadout *readout) {
+bool pmReadoutCheckDataStatusForSources (const pmReadout *readout)
+{
+    PS_ASSERT_PTR_NON_NULL(readout, false);
 
     bool status;
