Index: trunk/Ohana/src/opihi/dvo/avextract.c
===================================================================
--- trunk/Ohana/src/opihi/dvo/avextract.c	(revision 20819)
+++ trunk/Ohana/src/opihi/dvo/avextract.c	(revision 20936)
@@ -6,22 +6,24 @@
   int Nsecfilt, mode, VERBOSE;
   char **cstack, name[1024];
-  float *values;
   void *Signal;
 
   Catalog catalog;
+
+  Vector **vec;
+  dbStack *stack;
+  dbField *fields;
+  dbValue *values;
   SkyList *skylist;
   SkyRegionSelection *selection;
-  PhotCode *code;
-  Vector **vec;
-  dbField *fields;
-  dbStack *stack;
 
   /* defaults */
+  vec = NULL;
+  stack = NULL;
+  fields = NULL;
+  values = NULL;
   skylist = NULL;
   selection = NULL;
-  code = NULL;
+
   mode = MAG_AVE;
-  fields = NULL;
-  stack = NULL;
 
   if ((N = get_argument (argc, argv, "-h"))) goto help;
@@ -47,5 +49,11 @@
   // parse the fields to be extracted and returned
   fields = dbCmdlineFields (argc, argv, DVO_TABLE_AVERAGE, &last, &Nfields);
-  if (fields == NULL) return (FALSE);
+  if (fields == NULL) goto escape;
+  if (Nfields == 0) {
+    FreeSkyRegionSelection (selection);
+    dbFreeFields (fields, Nfields);
+    dvo_catalog_free (&catalog);
+    goto help;
+  }
 
   // examine line for 'where' or 'match to'.  'match to' is forbidden
@@ -66,5 +74,4 @@
   Nreturn = Nfields; 
   if (!dbCheckStack (stack, Nstack, DVO_TABLE_AVERAGE, &fields, &Nfields)) goto escape;
-  // XXX handle errors
 
   /* load region corresponding to selection above */
@@ -72,5 +79,5 @@
 
   /* create output storage vectors */
-  ALLOCATE (values, float, Nfields);
+  ALLOCATE (values, dbValue, Nfields);
   ALLOCATE (vec, Vector *, Nreturn);
   for (i = 0; i < Nreturn; i++) {
@@ -81,4 +88,5 @@
     }
     if ((vec[i] = SelectVector (name, ANYVECTOR, TRUE)) == NULL) goto escape;
+    ResetVector (vec[i], fields[i].type, NPTS);
   }
 
@@ -109,12 +117,19 @@
 
       m = catalog.average[j].measureOffset;
-      dbExtractAveragesInit (); // reset counters for saved fields 
+
+      // reset counters for saved fields, extract fields
+      dbExtractAveragesInit (); 
       for (n = 0; n < Nfields; n++) {
 	values[n] = dbExtractAverages (&catalog.average[j], &catalog.secfilt[j*Nsecfilt], &catalog.measure[m], &fields[n]);
       }
+
       // test the conditional statement
       if (!dbBooleanCond (stack, Nstack, values)) continue;
       for (n = 0; n < Nreturn; n++) {
-	vec[n][0].elements[Npts] = values[n];
+	if (vec[n][0].type == OPIHI_FLT) {
+	  vec[n][0].elements.Flt[Npts] = values[n].Flt;
+	} else {
+	  vec[n][0].elements.Int[Npts] = values[n].Int;
+	}
       }
       Npts++;
@@ -122,5 +137,9 @@
 	NPTS += 2000;
 	for (n = 0; n < Nreturn; n++) {
-	  REALLOCATE (vec[n][0].elements, float, NPTS);
+	  if (vec[n][0].type == OPIHI_FLT) {
+	    REALLOCATE (vec[n][0].elements.Flt, opihi_flt, NPTS);
+	  } else {
+	    REALLOCATE (vec[n][0].elements.Int, opihi_int, NPTS);
+	  }
 	}
       }
@@ -132,10 +151,16 @@
   for (n = 0; n < Nreturn; n++) {
     vec[n][0].Nelements = Npts;
-    REALLOCATE (vec[n][0].elements, float, MAX(1,Npts));
-  }
-
+    if (vec[n][0].type == OPIHI_FLT) {
+      REALLOCATE (vec[n][0].elements.Flt, opihi_flt, MAX(1,Npts));
+    } else {
+      REALLOCATE (vec[n][0].elements.Int, opihi_int, MAX(1,Npts));
+    }
+  }
+
+  if (vec) free (vec);
+  if (values) free (values);
   dbFreeFields (fields, Nfields);
   dbFreeStack (stack, Nstack);
-  free (stack);
+  if (stack) free (stack);
   SkyListFree (skylist);
   FreeSkyRegionSelection (selection);
@@ -143,7 +168,9 @@
 
  escape:
+  if (vec) free (vec);
+  if (values) free (values);
   dbFreeFields (fields, Nfields);
   dbFreeStack (stack, Nstack);
-  free (stack);
+  if (stack) free (stack);
   SkyListFree (skylist);
   FreeSkyRegionSelection (selection);
