Index: trunk/psphot/src/output.c
===================================================================
--- trunk/psphot/src/output.c	(revision 4398)
+++ trunk/psphot/src/output.c	(revision 4641)
@@ -1,27 +1,61 @@
 # include "psphot.h"
 
-// output functions
-// we have several fixed modes (sx, obj, cmp)
-
-// we require a fixed number of chars already allocated
-init_line (char *line, int *Nline) {
-  *Nline = 0;
-}
-
-add_to_line (char *line, int *Nline, char *format, ...) {
-
-    va_list ap;
-
-    va_start (ap, format);
-    Nchar = vsprintf (&line[*Nline], format, ap);
-    *Nline += Nchar;
+// output functions: we have several fixed modes (sx, obj, cmp)
+
+void output (psImageData *imdata, psMetadata *config, psArray *sources) {
+
+  char *outputMode = psMetadataLookupPtr (&status, config, "OUTPUT_MODE");
+
+  if (outputMode == NULL) {
+    WriteSourcesText (imdata, config, sources);
+    exit (0);
+  }
+
+  if (!strcasecmp (outputMode, "OBJ")) {
+    WriteSourcesOBJ (imdata, config, sources);
+    exit (0);
+  }
+  
+  if (!strcasecmp (outputMode, "SX")) {
+    WriteSourcesSX (imdata, config, sources);
+    exit (0);
+  }
+  
+  if (!strcasecmp (outputMode, "CMP")) {
+    WriteSourcesCMP (imdata, config, sources);
+    exit (0);
+  }
+  
+  if (!strcasecmp (outputMode, "CMF")) {
+    WriteSourcesCMF (imdata, config, sources);
+    exit (0);
+  }
+  
+  psAbort ("psphot", "unknown output mode %s", outputMode);
+}
+
+bool WriteSourceText (psImageData *imdata, psMetadata *config, psArray *sources) {
+
+  char *filename = psMetadataLookupPtr (&status, config, "OUTPUT");
+
+  DumpImage (imdata->image, filename);
+
+  // get these names from config?
+  DumpModelPSF (sources, "psfsources.dat");
+  DumpModelFLT (sources, "fltsources.dat");
+  DumpModelNULL (sources, "nullsources.dat");
+  DumpMoments (sources, "moments.dat");
+
+  exit (0);
 }
 
 // dophot-style output list with fixed line width
-bool WriteSourcesOBJ (psArray *sources, char *filename) {
+bool WriteSourcesOBJ (psImageData *imdata, psMetadata *config, psArray *sources) {
 
 # define NCHAR 104
 
     char line[NCHAR];
+
+    char *filename = psMetadataLookupPtr (&status, config, "OUTPUT");
 
     FILE *f = fopen (filename, "w");
@@ -63,9 +97,11 @@
 
 // elixir/sextractor-style output list with fixed line width
-bool WriteSourcesSX (psArray *sources, char *filename) {
+bool WriteSourcesSX (psImageData *imdata, psMetadata *config, psArray *sources) {
 
 # define NCHAR 104
 
     char line[NCHAR];
+
+    char *filename = psMetadataLookupPtr (&status, config, "OUTPUT");
 
     FILE *f = fopen (filename, "w");
@@ -108,5 +144,5 @@
 
 // elixir-style pseudo FITS table (header + ascii list)
-bool WriteSourcesCMP (psMetadata *header, psArray *sources, char *filename) {
+bool WriteSourcesCMP (psImageData *imdata, psMetadata *config, psArray *sources) {
 
 
@@ -114,4 +150,6 @@
 
     char line[NCHAR];
+
+    char *filename = psMetadataLookupPtr (&status, config, "OUTPUT");
 
     FILE *f = fopen (filename, "w");
@@ -121,5 +159,5 @@
     }
 
-    // write header to file
+    // write imdata->header to file
 
     // write sources with models first 
@@ -155,5 +193,25 @@
 
 // elixir-style FITS table output (header + table in 1st extension)
-bool WriteSourcesCMF (psArray *sources, char *filename) {
-    // ???
-}
+bool WriteSourcesCMF (psImageData *imdata, psMetadata *config, psArray *sources) {
+
+    char *filename = psMetadataLookupPtr (&status, config, "OUTPUT");
+
+    // write imdata->header to file
+
+    // write FITS table to file (use autocode tools)
+}
+
+// we require a fixed number of chars already allocated
+init_line (char *line, int *Nline) {
+  *Nline = 0;
+}
+
+add_to_line (char *line, int *Nline, char *format, ...) {
+
+    va_list ap;
+
+    va_start (ap, format);
+    Nchar = vsprintf (&line[*Nline], format, ap);
+    *Nline += Nchar;
+}
+
