Index: /trunk/Ohana/src/opihi/dvo/avextract.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/avextract.c	(revision 14286)
+++ /trunk/Ohana/src/opihi/dvo/avextract.c	(revision 14287)
@@ -3,9 +3,10 @@
 int avextract (int argc, char **argv) {
   
-  int i, j, n, m, Npts, NPTS, last, Nfields, Nreturn, Ncstack, Nstack;
-  int Nsecfilt, mode;
+  int i, j, n, m, N, Npts, NPTS, last, Nfields, Nreturn, Ncstack, Nstack;
+  int Nsecfilt, mode, VERBOSE;
   char *RegionName, *RegionList, *p;
   char **cstack, name[1024];
   float *values;
+  void *Signal;
 
   Catalog catalog;
@@ -24,4 +25,10 @@
   fields = NULL;
   stack = NULL;
+
+  VERBOSE = FALSE;
+  if ((N = get_argument (argc, argv, "-v"))) {
+    remove_argument (N, &argc, argv);
+    VERBOSE = TRUE;
+  }
 
   dvo_catalog_init (&catalog, TRUE);
@@ -69,6 +76,8 @@
   NPTS = 1;
 
-  // XXX need to add interrupt test to this loop
-  for (i = 0; i < skylist[0].Nregions; i++) {
+  // grab data from all selected sky regions
+  Signal = signal (SIGINT, handle_interrupt);
+  interrupt = FALSE;
+  for (i = 0; (i < skylist[0].Nregions) && !interrupt; i++) {
     /* lock, load, unlock catalog */
     catalog.filename = skylist[0].filename[i];
@@ -76,12 +85,14 @@
     catalog.Nsecfilt = 0;
 
+    if (VERBOSE) gprint (GP_ERR, "trying %s (%d of %d)\n", catalog.filename, i, skylist[0].Nregions);
+      
     // an error exit status here is a significant error
     if (!dvo_catalog_open (&catalog, NULL, FALSE, "r")) {
-      fprintf (stderr, "ERROR: failure to open catalog file %s\n", catalog.filename);
+      gprint (GP_ERR, "ERROR: failure to open catalog file %s\n", catalog.filename);
       exit (2);
     }
     dvo_catalog_unlock (&catalog);
 
-    for (j = 0; j < catalog.Naverage; j++) {
+    for (j = 0; (j < catalog.Naverage) && !interrupt; j++) {
       m = catalog.average[j].offset;
       // extract the relevant values
@@ -105,4 +116,6 @@
     dvo_catalog_free (&catalog);
   }
+  signal (SIGINT, Signal);
+  interrupt = FALSE;
   for (n = 0; n < Nreturn; n++) {
     vec[n][0].Nelements = Npts;
Index: /trunk/Ohana/src/opihi/dvo/dbCheckStack.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/dbCheckStack.c	(revision 14286)
+++ /trunk/Ohana/src/opihi/dvo/dbCheckStack.c	(revision 14287)
@@ -1,13 +1,15 @@
 # include "dvoshell.h"
 
-int dbCheckStack (dbStack *stack, int Nstack, int table, dbField **inFields, int *Nfields) {
+int dbCheckStack (dbStack *stack, int Nstack, int table, dbField **inFields, int *inNfields) {
 
-  int i, j, status, NFIELDS;
+  int i, j, status, NFIELDS, Nfields;
   char *c;
   dbField *fields;
 
-  NFIELDS = *Nfields + 10;
-  REALLOCATE (*inFields, dbField, NFIELDS);
   fields = *inFields;
+  Nfields = *inNfields;
+
+  NFIELDS = Nfields + 10;
+  REALLOCATE (fields, dbField, NFIELDS);
 
   for (i = 0; i < Nstack; i++) {
@@ -22,8 +24,10 @@
 
       // this must be a field : is it already in the list?
-      for (j = 0; (j < *Nfields) && strcasecmp (stack[i].name, fields[j].name); j++);
-      if (j < *Nfields) {
+      for (j = 0; (j < Nfields) && strcasecmp (stack[i].name, fields[j].name); j++);
+      if (j < Nfields) {
 	stack[i].field = j;
 	stack[i].type  = 'F';
+	stack[i].name  = NULL;
+	stack[i].Float = 0.0;
 	continue;
       }
@@ -31,8 +35,8 @@
       // this must be a field : is it a valid name?
       if (table == DVO_TABLE_MEASURE) {
-	status = ParseMeasureField (&fields[*Nfields], stack[i].name);
+	status = ParseMeasureField (&fields[Nfields], stack[i].name);
       } 
       if (table == DVO_TABLE_AVERAGE) {
-	status = ParseAverageField (&fields[*Nfields], stack[i].name);
+	status = ParseAverageField (&fields[Nfields], stack[i].name);
       } 
       if (!status) {
@@ -40,12 +44,17 @@
 	return (FALSE);
       }
-      stack[i].field = *Nfields;
+      stack[i].field = Nfields;
       stack[i].type  = 'F';
+      stack[i].name  = NULL;
+      stack[i].Float = 0.0;
 
-      *Nfields ++;
-      CHECK_REALLOCATE (*inFields, dbField, NFIELDS, *Nfields, 10);
-      fields = *inFields;
+      Nfields ++;
+      CHECK_REALLOCATE (fields, dbField, NFIELDS, Nfields, 10);
     }
   }
+
+  *inNfields = Nfields;
+  *inFields = fields;
+
   return (TRUE);
 }
Index: /trunk/Ohana/src/opihi/dvo/dbFields.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/dbFields.c	(revision 14286)
+++ /trunk/Ohana/src/opihi/dvo/dbFields.c	(revision 14287)
@@ -7,5 +7,5 @@
   if (fields == NULL) return;
 
-  for (i = 0; i <= Nfields; i++) {
+  for (i = 0; i < Nfields; i++) {
     if (fields[i].name != NULL) free (fields[i].name);
     if (fields[i].photcode != NULL) {
@@ -68,4 +68,8 @@
   }
   code = GetPhotcodebyName (tmpstring);
+  if (!code) {
+      return NULL;
+  }
+
 
   // enforce compatibility
Index: /trunk/Ohana/src/opihi/dvo/mextract.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/mextract.c	(revision 14286)
+++ /trunk/Ohana/src/opihi/dvo/mextract.c	(revision 14287)
@@ -4,9 +4,10 @@
   
   int i, j, k, m, n, N, N1, Npts, NPTS, last, Nfields, Nreturn, Ncstack, Nstack;
-  int param, mode, Nsecfilt;
+  int Nsecfilt, VERBOSE, loadImages, mosaicMode;
   char *RegionName, *RegionList, *p;
   double *M1;
   char **cstack, name[1024];
   float *values;
+  void *Signal;
 
   Catalog catalog;
@@ -22,7 +23,12 @@
   RegionList = NULL;
   code = NULL;
-  mode = MAG_REL;
   fields = NULL;
   stack = NULL;
+
+  VERBOSE = FALSE;
+  if ((N = get_argument (argc, argv, "-v"))) {
+    remove_argument (N, &argc, argv);
+    VERBOSE = TRUE;
+  }
 
   dvo_catalog_init (&catalog, TRUE);
@@ -50,4 +56,8 @@
   // construct the db Boolean math stack (frees cstack)
   stack = dbRPN (Ncstack, cstack, &Nstack);
+  if ((Ncstack > 0) && (Nstack < 1)) {
+    print_error ();
+    goto escape;
+  }
 
   Nreturn = Nfields; 
@@ -59,5 +69,13 @@
 
   // XXX is this still needed?
-  // if (!SetImageSelection (param, ((RegionName == NULL) && (RegionList == NULL)))) goto escape;
+  loadImages = FALSE;
+  mosaicMode = FALSE;
+  for (i = 0; !loadImages && (i < Nfields); i++) {
+    if (fields[i].ID == MEAS_XCCD) loadImages = TRUE;
+    if (fields[i].ID == MEAS_YCCD) loadImages = TRUE;
+    if (fields[i].ID == MEAS_XMOSAIC) loadImages = mosaicMode = TRUE;
+    if (fields[i].ID == MEAS_YMOSAIC) loadImages = mosaicMode = TRUE;
+  }
+  if (loadImages && !SetImageSelection (mosaicMode, ((RegionName == NULL) && (RegionList == NULL)))) goto escape;
 
   /* create storage vector */
@@ -76,6 +94,8 @@
   NPTS = 1;
 
-  // XXX need to add interrupt test to this loop
-  for (i = 0; i < skylist[0].Nregions; i++) {
+  // grab data from all selected sky regions
+  Signal = signal (SIGINT, handle_interrupt);
+  interrupt = FALSE;
+  for (i = 0; (i < skylist[0].Nregions) && !interrupt; i++) {
     /* lock, load, unlock catalog */
     catalog.filename = skylist[0].filename[i];
@@ -83,7 +103,9 @@
     catalog.Nsecfilt = Nsecfilt;
 
+    if (VERBOSE) gprint (GP_ERR, "trying %s (%d of %d)\n", catalog.filename, i, skylist[0].Nregions);
+      
     // an error exit status here is a significant error
     if (!dvo_catalog_open (&catalog, NULL, FALSE, "r")) {
-      fprintf (stderr, "ERROR: failure to open catalog file %s\n", catalog.filename);
+      gprint (GP_ERR, "ERROR: failure to open catalog file %s\n", catalog.filename);
       exit (2);
     }
@@ -92,5 +114,5 @@
     /* XXX need to call dvo_catalog_chipcoords here passing the loaded images */
 
-    for (j = 0; j < catalog.Naverage; j++) {
+    for (j = 0; (j < catalog.Naverage) && !interrupt; j++) {
       m = catalog.average[j].offset;
       for (k = 0; k < catalog.average[j].Nm; k++, m++) {
@@ -117,13 +139,17 @@
     dvo_catalog_free (&catalog);
   }
+  signal (SIGINT, Signal);
+  interrupt = FALSE;
+
   for (n = 0; n < Nreturn; n++) {
     vec[n][0].Nelements = Npts;
     REALLOCATE (vec[n][0].elements, float, MAX(1,Npts));
   }
-
   dbFreeFields (fields, Nfields);
   dbFreeStack (stack, Nstack);
+
   FreeImageSelection ();
   SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
+
   if (RegionName != NULL) free (RegionName);
   if (RegionList != NULL) free (RegionList);
