Index: /trunk/Ohana/src/delstar/Makefile
===================================================================
--- /trunk/Ohana/src/delstar/Makefile	(revision 4679)
+++ /trunk/Ohana/src/delstar/Makefile	(revision 4680)
@@ -17,18 +17,29 @@
 INCS	= 	-I$(INC) -I$(LINC) -I$(XINC)
 LIBS	= 	-L$(LLIB) -lFITS -lohana -lm 
-CFLAGS	=	-o $*.$(ARCH).o $(INCS)
+CFLAGS	=	-o $*.$(ARCH).o $(INCS) -O2
 CCFLAGS	=	$(INCS) $(LIBS) 
 
 DELSTAR = \
-$(SRC)/delstar.$(ARCH).o 	$(SRC)/gcatalog.$(ARCH).o   	\
-$(SRC)/gregions.$(ARCH).o 	$(SRC)/gimages.$(ARCH).o    	\
-$(SRC)/dimages.$(ARCH).o        $(SRC)/gtimes.$(ARCH).o     	\
-$(SRC)/find_matches.$(ARCH).o 	$(SRC)/wcatalog.$(ARCH).o   	\
-$(SRC)/ConfigInit.$(ARCH).o 	$(SRC)/args.$(ARCH).o	        \
-$(SRC)/aregion.$(ARCH).o	$(SRC)/delete_missed.$(ARCH).o  \
-$(SRC)/sort_lists.$(ARCH).o	$(SRC)/parse_time.$(ARCH).o     \
-$(SRC)/gcatstats.$(ARCH).o	$(SRC)/find_images.$(ARCH).o	\
-$(SRC)/match_images.$(ARCH).o	$(SRC)/delete_orphans.$(ARCH).o \
-$(SRC)/convert.$(ARCH).o
+$(SRC)/delstar.$(ARCH).o          \
+$(SRC)/SetSignals.$(ARCH).o       \
+$(SRC)/ConfigInit.$(ARCH).o 	  \
+$(SRC)/args.$(ARCH).o	          \
+$(SRC)/image-db.$(ARCH).o   	  \
+$(SRC)/delete_imagename.$(ARCH).o \
+$(SRC)/delete_imagefile.$(ARCH).o \
+$(SRC)/delete_times.$(ARCH).o 	  \
+$(SRC)/gimages.$(ARCH).o   	  \
+$(SRC)/gregion_image.$(ARCH).o    \
+$(SRC)/gregion_patch.$(ARCH).o    \
+$(SRC)/RegionOps.$(ARCH).o   	  \
+$(SRC)/gcatalog.$(ARCH).o   	  \
+$(SRC)/wcatalog.$(ARCH).o   	  \
+$(SRC)/find_image_db.$(ARCH).o    \
+$(SRC)/find_matches.$(ARCH).o 	  \
+$(SRC)/parse_time.$(ARCH).o       \
+$(SRC)/convert.$(ARCH).o \
+$(SRC)/sort_lists.$(ARCH).o \
+$(SRC)/check_permissions.$(ARCH).o \
+$(SRC)/dimages.$(ARCH).o          
 
 OBJ = $(DELSTAR)
@@ -63,4 +74,2 @@
 .c.$(ARCH).o:
 	$(CC) $(CFLAGS) -c $<
-
-
Index: /trunk/Ohana/src/delstar/include/delstar.h
===================================================================
--- /trunk/Ohana/src/delstar/include/delstar.h	(revision 4679)
+++ /trunk/Ohana/src/delstar/include/delstar.h	(revision 4680)
@@ -2,4 +2,12 @@
 # include <dvo.h>
 # include <signal.h>
+
+typedef struct {
+  Coords coords;
+  float *X, *Y;
+  int *N;
+  double RA[2], DEC[2];
+  double Area, density, spacing;
+} CatStats;
 
 /* global variables set in parameter file */
@@ -15,32 +23,68 @@
 int    MISSED;
 
-time_t START;
-time_t END;
+time_t    START;
+time_t    END;
+PhotCode *PHOTCODE;
 
 int    MODE;
-enum {MODE_IMAGENAME, MODE_IMAGEFILE, MODE_TRANGE, MODE_ORPHAN, MODE_MISSED};
+enum {MODE_IMAGENAME, MODE_IMAGEFILE, MODE_TIME, MODE_ORPHAN, MODE_MISSED};
 
-typedef struct {
-  Coords coords;
-  float *X, *Y;
-  int *N;
-  double RA[2], DEC[2];
-  double Area, density, spacing;
-} CatStats;
+enum {TIME_NONE, TIME_JD, TIME_MJD, TIME_DATE, TIME_DAYS, TIME_HOURS, TIME_MINUTES, TIME_SECONDS};
 
 char DateKeyword[64], DateMode[64], UTKeyword[64], MJDKeyword[64], JDKeyword[64];
 
-/*** values for time formats */
-enum {TIME_NONE, TIME_JD, TIME_MJD, TIME_DATE, TIME_DAYS, TIME_HOURS, TIME_MINUTES, TIME_SECONDS};
-
 /*** conversion functions ***/
-int           chk_time              PROTO((char *line));
-time_t        date_to_sec           PROTO((char *date));
-time_t        jd_to_sec             PROTO((double jd));
-time_t        mjd_to_sec            PROTO((double mjd));
-char         *sec_to_date           PROTO((time_t second));
-double        sec_to_jd             PROTO((time_t second));
-double        sec_to_mjd            PROTO((time_t second));
-int           str_to_dtime          PROTO((char *line, double *second));
-int           str_to_radec          PROTO((double *ra, double *dec, char *str1, char *str2));
-int           str_to_time           PROTO((char *line, time_t *second));
+FILE 	  *GetDB		  PROTO((int *state));
+Image 	  *GetImages		  PROTO((int *nimage));
+GSCRegion *LoadRegions		  PROTO((int *nregions));
+Image 	  *find_images		  PROTO((FILE *f, CatStats *catstats, int *Nimages));
+int 	  *find_images_data	  PROTO((Image *timage, int *nlist));
+int 	  *find_images_name	  PROTO((char *filename, int *nlist));
+int 	  *find_images_time	  PROTO((time_t start, time_t end, PhotCode *code, int *nlist));
+Image 	  *gimages		  PROTO((char *filename));
+GSCRegion *gregion_image	  PROTO((Image *image, int *Nregions));
+GSCRegion *gregion_patch	  PROTO((GSCRegion *patch, int *nregions));
+Image 	  *gtimes		  PROTO((int *NIMAGE));
+char      *sec_to_date            PROTO((time_t second));
+void	   ConfigInit		  PROTO((int *argc, char **argv));
+int	   FindDecBand		  PROTO((double dec, double *DEC0, double *DEC1));
+int	   FindRegionByPoint	  PROTO((GSCRegion *region, double ra, double dec, GSCRegion *gsc, int Ngsc));
+int	   FindRegionDecBandStart PROTO((GSCRegion *region, int Nregion, double dec));
+int	   FindRegionDecBandStop  PROTO((GSCRegion *region, int Nregion, double dec));
+int 	   SetImages		  PROTO((Image *new, int Nnew));
+void 	   SetProtect		  PROTO((int mode));
+int 	   SetSignals		  PROTO(());
+int 	   Shutdown		  PROTO((char *format, ...));
+void 	   TrapSignal		  PROTO((int sig));
+int 	   args			  PROTO((int *argc, char **argv));
+void	   check_permissions	  PROTO((char *basefile));
+int        chk_time               PROTO((char *line));
+time_t     date_to_sec            PROTO((char *date));
+void 	   delete_imagefile	  PROTO((char *filename));
+void 	   delete_imagename	  PROTO((char *name));
+void 	   delete_times		  PROTO(());
+int 	   dimages		  PROTO((int *imlist, int Nimlist));
+int 	   dms_to_ddd		  PROTO((double *Value, char *string));
+int 	   edge_check		  PROTO((double *x1, double *y1, double *x2, double *y2));
+void 	   find_matches		  PROTO((Catalog *catalog, int photcode, int start, int end));
+int	   gcatalog		  PROTO((Catalog *catalog));
+void 	   help			  PROTO(());
+int 	   hms_to_deg		  PROTO((double *h0, double *h1, double *d0, double *d1, char *string));
+time_t     jd_to_sec              PROTO((double jd));
+int 	   load_image_db	  PROTO(());
+void 	   lock_image_db	  PROTO(());
+void 	   match_images		  PROTO((Catalog *catalog, Image *image, int Nimage));
+time_t     mjd_to_sec             PROTO((double mjd));
+double     opening_angle	  PROTO((double x1, double y1, double x2, double y2, double x3, double y3));
+int	   parse_time		  PROTO((Header *header));
+int 	   save_image_db	  PROTO(());
+double     sec_to_jd              PROTO((time_t second));
+double     sec_to_mjd             PROTO((time_t second));
+void 	   sort_lists		  PROTO((float *X, float *Y, int *S, int N));
+void 	   sort_regions		  PROTO((GSCRegion *region, int N));
+int        str_to_dtime           PROTO((char *line, double *second));
+int        str_to_radec           PROTO((double *ra, double *dec, char *str1, char *str2));
+int        str_to_time            PROTO((char *line, time_t *second));
+void 	   unlock_image_db	  PROTO(());
+void 	   usage		  PROTO(());
+int 	   wcatalog		  PROTO((Catalog *catalog));
Index: /trunk/Ohana/src/delstar/src/ConfigInit.c
===================================================================
--- /trunk/Ohana/src/delstar/src/ConfigInit.c	(revision 4679)
+++ /trunk/Ohana/src/delstar/src/ConfigInit.c	(revision 4680)
@@ -1,5 +1,5 @@
 # include "delstar.h"
 
-ConfigInit (int *argc, char **argv) {
+void ConfigInit (int *argc, char **argv) {
 
   char *config, *file;
Index: /trunk/Ohana/src/delstar/src/RegionOps.c
===================================================================
--- /trunk/Ohana/src/delstar/src/RegionOps.c	(revision 4679)
+++ /trunk/Ohana/src/delstar/src/RegionOps.c	(revision 4680)
@@ -127,5 +127,5 @@
 
   /* bracket value of interest */
-  Nlo = 0; Nhi = Nregion;
+  Nlo = 0; Nhi = Nregion - 1;
   while (Nhi - Nlo > 10) {
     N = 0.5*(Nlo + Nhi);
@@ -161,5 +161,5 @@
 
   /* bracket value of interest */
-  Nlo = 0; Nhi = Nregion;
+  Nlo = 0; Nhi = Nregion - 1;
   while (Nhi - Nlo > 10) {
     N = 0.5*(Nlo + Nhi);
@@ -174,7 +174,9 @@
 
   /* find the last entry < dec */
-  for (N = Nlo; N < Nhi; N++) {
+  for (N = Nlo; N <= Nhi; N++) {
     if (region[N].DEC[0] > D1) return (N);
   }
+  fprintf (stderr, "fail dec band stop: %f: %f  %f, %d - %d, %f %f\n", 
+	   dec, D0, D1, Nlo, Nhi, region[Nlo].DEC[0], region[Nlo].DEC[1]);
   return (-1);
   /* this will fail if transition value is not in the data range */
Index: /trunk/Ohana/src/delstar/src/args.c
===================================================================
--- /trunk/Ohana/src/delstar/src/args.c	(revision 4679)
+++ /trunk/Ohana/src/delstar/src/args.c	(revision 4680)
@@ -3,10 +3,12 @@
 void help () {
 
-  fprintf (stderr, "USAGE: delstar (filename) or (start range) or -orphan (region)\n");
-  fprintf (stderr, "       delstar -trange (start) (range)\n");
-  fprintf (stderr, "       delstar -orphan (region)\n");
-  fprintf (stderr, "       delstar -missed (region)\n");
+  fprintf (stderr, "USAGE:\n");
+  fprintf (stderr, "  delstar (filename) or (start range) or -orphan (region)\n");
+  fprintf (stderr, "  delstar -time (start) (stop/range)\n");
+  fprintf (stderr, "  delstar -orphan (region)\n");
+  fprintf (stderr, "  delstar -missed (region)\n\n");
   fprintf (stderr, "  optional flags:\n");
-  fprintf (stderr, "  -v (verbose mode)\n");
+  fprintf (stderr, "  -v               : verbose mode\n");
+  fprintf (stderr, "  -photcode (code) : restrict by photcode\n");
   fprintf (stderr, "\n"); 
   exit (2);
@@ -15,9 +17,5 @@
 
 void usage () {
-  fprintf (stderr, "USAGE: delstar (filename)\n");
-  fprintf (stderr, "USAGE: delstar -name (imagename)\n");
-  fprintf (stderr, "USAGE: delstar -trange (start) (range)\n");
-  fprintf (stderr, "USAGE: delstar -orphan (region)\n");
-  fprintf (stderr, "USAGE: delstar -missed (region)\n");
+  fprintf (stderr, "USAGE: delstar (filename) / [optional mode] : -h for help\n");
   exit (2);
 }
@@ -25,6 +23,7 @@
 int args (int *argc, char **argv) {
   
-
   int N;
+  double trange;
+  time_t tmp;
 
   /* check for help request */
@@ -58,8 +57,7 @@
   if ((N = get_argument (*argc, argv, "-time"))) {
     if (MODE != MODE_IMAGEFILE) usage();
-    MODE = MODE_TRANGE;
+    MODE = MODE_TIME;
     remove_argument (N, argc, argv);
 
-    /* tstart */
     if (!str_to_time (argv[N], &START)) usage ();
     remove_argument (N, argc, argv);
@@ -73,5 +71,5 @@
 	END = START + trange;
       }
-      remove_argument (Na, argc, argv);
+      remove_argument (N, argc, argv);
       goto goodtime;
     }
@@ -82,20 +80,17 @@
 	END   = START;
       }
-      remove_argument (Na, argc, argv);
+      remove_argument (N, argc, argv);
       goto goodtime;
     }
     usage ();
-
-  goodtime:
-    fprintf (stderr, "start: %d\n", start);
-    fprintf (stderr, "end: %d\n", end);
   }
+goodtime:
 
   /* restrict to a single photcode (not compatible with -image) */
   PHOTCODE = NULL;
-  if ((N = get_argument (argc, argv, "-photcode"))) {
-    remove_argument (N, &argc, argv);
+  if ((N = get_argument (*argc, argv, "-photcode"))) {
+    remove_argument (N, argc, argv);
     PHOTCODE = GetPhotcodebyName (argv[N]);
-    remove_argument (N, &argc, argv);
+    remove_argument (N, argc, argv);
   }
 
Index: /trunk/Ohana/src/delstar/src/convert.c
===================================================================
--- /trunk/Ohana/src/delstar/src/convert.c	(revision 4679)
+++ /trunk/Ohana/src/delstar/src/convert.c	(revision 4680)
@@ -319,2 +319,42 @@
 }
 
+/**********/
+int hms_to_deg (double *h0, double *h1, double *d0, double *d1, char *string) {
+  
+  int flag_d0, flag_d1, flag_h0, flag_h1;
+  double tmp;
+  
+  *d0 = *h0 = *d1 = *h1 = 0;
+
+  flag_h0 = dparse (h0, 1, string);
+  flag_h1 = dparse (h1, 4, string);
+  flag_d0 = dparse (d0, 7, string);
+  flag_d1 = dparse (d1, 9, string);
+  *h0 *= flag_h0;
+  *h1 *= flag_h1;
+  *d0 *= flag_d0;
+  *d1 *= flag_d1;
+
+  dparse (&tmp, 2, string);
+  *h0 += tmp/60.0;
+  dparse (&tmp, 3, string);
+  *h0 += tmp/3600.0;
+  
+  dparse (&tmp, 5, string);
+  *h1 += tmp/60.0;
+  dparse (&tmp, 6, string);
+  *h1 += tmp/3600.0;
+  
+  dparse (&tmp, 8, string);
+  *d0 += tmp/60.0;
+
+  dparse (&tmp, 10, string);
+  *d1 += tmp/60.0;
+
+  *h0 *= 15*flag_h0;
+  *h1 *= 15*flag_h1;
+  *d0 *= flag_d0;
+  *d1 *= flag_d1;
+
+  return (TRUE);
+}
Index: /trunk/Ohana/src/delstar/src/delete_imagename.c
===================================================================
--- /trunk/Ohana/src/delstar/src/delete_imagename.c	(revision 4679)
+++ /trunk/Ohana/src/delstar/src/delete_imagename.c	(revision 4680)
@@ -3,45 +3,60 @@
 void delete_imagename (char *name) {
 
-  int i, Nregions;
+  int i, j, k;
+  int Nregions, Nimlist, Nimage;
+  int *imlist;
+  double trange;
+  time_t start, stop;
   Image *image;
   GSCRegion *region;
   Catalog catalog;
 
-  fprintf (stderr, "this function needs to be debugged\n");
-  exit (2);
+  image = GetImages (&Nimage);
 
   /* find image in db by name */
-  image = find_image (filename);
+  imlist = find_images_name (name, &Nimlist);
+  if (!Nimlist) Shutdown ("image %s not found in db", name);
   
-  fprintf (stderr, "deleting %s\n", image[0].name);
-  region = gregions (image, &Nregions);
+  for (k = 0; k < Nimlist; k++) {
 
-  for (i = 0; i < Nregions; i++) {
-    fprintf (stderr, "deleting from %s\n", region[i].filename);
-    catalog.filename = region[i].filename;  /* don't free region before catalog! */
-    switch (lock_catalog (&catalog, LCK_SOFT)) {
-      case 0:
-	fprintf (stderr, "ERROR: can't lock file\n");
-	exit (1);
-      case 1:
-	gcatalog (&catalog);
-	break;
-      case 2:
-	fprintf (stderr, "no data in %s, skipping\n", catalog.filename);
-	catalog.Naverage = 0;
-	catalog.Nmeasure = 0;
-	break;
-      default:
-	fprintf (stderr, "weird lock_catalog exit state\n");
-	exit (1);
+    j = imlist[k];
+    if (VERBOSE) fprintf (stderr, "deleting %s\n", image[j].name);
+    region = gregion_image (&image[j], &Nregions);
+
+    for (i = 0; i < Nregions; i++) {
+      if (VERBOSE) fprintf (stderr, "deleting from %s\n", region[i].filename);
+      catalog.filename = region[i].filename;  /* don't free region before catalog! */
+      switch (lock_catalog (&catalog, LCK_XCLD)) {
+	case 0:
+	  fprintf (stderr, "ERROR: can't lock file %s\n", catalog.filename);
+	  exit (1);
+	case 1:
+	  gcatalog (&catalog);
+	  break;
+	case 2:
+	  if (VERBOSE) fprintf (stderr, "no data in %s, skipping\n", catalog.filename);
+	  unlock_catalog (&catalog);
+	  continue;
+	default:
+	  fprintf (stderr, "weird lock_catalog exit state\n");
+	  exit (1);
+      }
+
+      /* trate is in 0.1 msec / row  - stop is the latest exposure end time */
+      /* pad exposure time by 1 sec to require a valid time */
+      trange = 1e-4*image[j].NY*image[j].trate + image[j].exptime + 1;  
+      start = image[j].tzero;
+      stop  = image[j].tzero + trange;
+      find_matches (&catalog, image[j].source, start, stop);
+      wcatalog (&catalog);
+      unlock_catalog (&catalog);
     }
-    find_matches (&catalog, image);
-    wcatalog (&catalog);
   }
 
-  dimages (image, 1); 
+  /* delete the identified images */
+  dimages (imlist, Nimlist); 
 
-  /* this probably gets moved inside dimages */
-  unlock_image_db (ImageCat, f, LCK_HARD, &dbstate);
+  save_image_db ();
+  unlock_image_db ();
   fprintf (stderr, "SUCCESS\n");
   exit (0);
Index: /trunk/Ohana/src/delstar/src/delete_missed.c
===================================================================
--- /trunk/Ohana/src/delstar/src/delete_missed.c	(revision 4679)
+++ /trunk/Ohana/src/delstar/src/delete_missed.c	(revision 4680)
@@ -1,3 +1,5 @@
 # include "delstar.h"
+
+/* drop all MISSED values for the given catalog */
 
 delete_missed (Catalog *catalog) {
Index: /trunk/Ohana/src/delstar/src/delete_times.c
===================================================================
--- /trunk/Ohana/src/delstar/src/delete_times.c	(revision 4679)
+++ /trunk/Ohana/src/delstar/src/delete_times.c	(revision 4680)
@@ -3,36 +3,55 @@
 void delete_times () {
 
-    Nregions = 0;
-    NREGIONS = 10;
-    ALLOCATE (region, GSCRegion, NREGIONS);
+  int i, j, k, n;
+  int Nimage, Nimlist, found, code;
+  int Ntregions, Nregions, NREGIONS;
+  int *imlist;
+  GSCRegion *region, *tregion;
+  Image *image;
+  Catalog catalog;
 
-    /* find image for time range, delete each image */ 
-    image = gtimes (&Nimage);
-    for (j = 0; j < Nimage; j++) {
-      fprintf (stderr, "finding regions for %s\n", image[j].name);
-      tregion = gregions (&image[j], &Ntregions);
-      for (i = 0; i < Ntregions; i++) {
-	found = FALSE;
-	for (k = 0; (k < Nregions) && !found; k++) {
-	  found = !strcmp (region[k].filename, tregion[i].filename);
-	}
-	if (!found) {
-	  strcpy (region[Nregions].filename, tregion[i].filename);
-	  region[Nregions].RA[0] = tregion[i].RA[0];
-	  region[Nregions].RA[1] = tregion[i].RA[1];
-	  region[Nregions].DEC[0] = tregion[i].DEC[0];
-	  region[Nregions].DEC[1] = tregion[i].DEC[1];
-	  Nregions ++;
-	  if (Nregions >= NREGIONS) {
-	    NREGIONS += 10;
-	    REALLOCATE (region, GSCRegion, NREGIONS);
-	  }
+  code = (PHOTCODE == NULL) ? -1 : PHOTCODE[0].code;
+
+  Nregions = 0;
+  NREGIONS = 10;
+  ALLOCATE (region, GSCRegion, NREGIONS);
+
+  image = GetImages (&Nimage);
+
+  /* find images for time range, delete each image */ 
+  imlist = find_images_time (START, END, PHOTCODE, &Nimlist);
+
+  /* find all overlapping regions */
+  for (n = 0; n < Nimlist; n++) {
+    j = imlist[n];
+    if (VERBOSE) fprintf (stderr, "finding regions for %s\n", image[j].name);
+
+    tregion = gregion_image (&image[j], &Ntregions);
+    for (i = 0; i < Ntregions; i++) {
+      found = FALSE;
+      for (k = 0; (k < Nregions) && !found; k++) {
+	found = !strcmp (region[k].filename, tregion[i].filename);
+      }
+      if (!found) {
+	strcpy (region[Nregions].filename, tregion[i].filename);
+	region[Nregions].RA[0] = tregion[i].RA[0];
+	region[Nregions].RA[1] = tregion[i].RA[1];
+	region[Nregions].DEC[0] = tregion[i].DEC[0];
+	region[Nregions].DEC[1] = tregion[i].DEC[1];
+	Nregions ++;
+	if (Nregions >= NREGIONS) {
+	  NREGIONS += 10;
+	  REALLOCATE (region, GSCRegion, NREGIONS);
 	}
       }
     }
-    for (i = 0; i < Nregions; i++) {
-      fprintf (stderr, "deleting from %s\n", region[i].filename);
-      catalog.filename = region[i].filename;  /* don't free region before catalog! */
-      switch (lock_catalog (&catalog, LCK_SOFT)) {
+    free (tregion);
+  }
+
+  /* delete from all identified regions */
+  for (i = 0; i < Nregions; i++) {
+    if (VERBOSE) fprintf (stderr, "deleting from %s\n", region[i].filename);
+    catalog.filename = region[i].filename;  /* don't free region before catalog! */
+    switch (lock_catalog (&catalog, LCK_XCLD)) {
       case 0:
 	fprintf (stderr, "ERROR: can't lock file\n");
@@ -43,16 +62,22 @@
       case 2:
 	fprintf (stderr, "no data in %s, skipping\n", catalog.filename);
-	catalog.Naverage = 0;
-	catalog.Nmeasure = 0;
-	break;
+	unlock_catalog (&catalog);
+	continue;
       default:
 	fprintf (stderr, "weird lock_catalog exit state\n");
 	exit (1);
-      }
-      find_matches (&catalog, &image[0], start, end);
-      wcatalog (&catalog);
     }
-    dimages (image, Nimage);
-    fprintf (stderr, "SUCCESS\n");
-    exit (0);
+
+    find_matches (&catalog, code, START, END);
+    wcatalog (&catalog);
+    unlock_catalog (&catalog);
+  }
+
+  /* delete the identified images */
+  dimages (imlist, Nimlist); 
+
+  save_image_db ();
+  unlock_image_db ();
+  fprintf (stderr, "SUCCESS\n");
+  exit (0);
 }
Index: /trunk/Ohana/src/delstar/src/delstar.c
===================================================================
--- /trunk/Ohana/src/delstar/src/delstar.c	(revision 4679)
+++ /trunk/Ohana/src/delstar/src/delstar.c	(revision 4680)
@@ -1,11 +1,12 @@
 # include "delstar.h"
 
-main (int argc, char **argv) {
+int main (int argc, char **argv) {
 
   SetSignals ();
-  ConfigInit (argc, argv);
+  ConfigInit (&argc, argv);
   args (&argc, argv);
 
   lock_image_db ();
+  load_image_db ();
 
   /* delete orphaned measurements (no image) from catalog */ 
@@ -17,12 +18,14 @@
       delete_imagename (argv[1]);
       break;
-    case MODE_ORPHANS:
-      delete_orphans (argv[1]);
+    case MODE_TIME:
+      delete_times ();
+      break;
+    case MODE_ORPHAN:
+      fprintf (stderr, "delete orphans not available\n");
+      // delete_orphans (argv[1]);
       break;
     case MODE_MISSED:
-      delete_missed (argv[1]);
-      break;
-    case MODE_TIME:
-      delete_time ();
+      fprintf (stderr, "delete missed not available\n");
+      // delete_missed (argv[1]);
       break;
     default:
Index: /trunk/Ohana/src/delstar/src/dimages.c
===================================================================
--- /trunk/Ohana/src/delstar/src/dimages.c	(revision 4679)
+++ /trunk/Ohana/src/delstar/src/dimages.c	(revision 4680)
@@ -1,84 +1,32 @@
-# include "addstar.h"
+# include "delstar.h"
 
-int dimages (Image *image, int Nimages) {
+/* delete images by sequence number */
+
+int dimages (int *imlist, int Nimlist) {
   
-  int i, j, Ntimage, ntimage, mode;
-  int start, end, tstart, tend, status;
-  char line[256];
-  struct stat filestat;
-  Image *timage;
-  Header header;
+  int i, j, Nimage;
+  Image *image;
 
-  /* get image db file pointer */
-  f = GetDB (&dbstate);
-  if (dbstate == LCK_EMPTY) {
-    Shutdown ("database is empty");
-  }
-  fseek (f, 0, SEEK_SET);
+  image = GetImages (&Nimage);
 
-  /* use cp to make backup copy */
-  sprintf (line, "cp %s %s~\0", ImageCat, ImageCat);
-  status = system (line);
-  if (status) {
-    fprintf (stderr, "ERROR: unable to create %s~, exiting\n", ImageCat);
-    Shutdown ();
-  }
-  mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
-  sprintf (line, "%s~\0", ImageCat);
-  chmod (line, mode);
-
-  /* check if image datafile exists, get header */
-  fseek (f, 0, SEEK_SET); 
-  if (!fits_fread_header (f, &header)) {
-    fprintf (stderr, "Can't find image catalog\n");
-    exit (1);
-  }
-  fseek (f, header.size, SEEK_SET); 
-
-  fits_scan (&header, "NIMAGES", "%d", 1, &Ntimage);
-  ALLOCATE (timage, Image, Ntimage);
-  ntimage = Fread (timage, sizeof(Image), Ntimage, f, "image");
-  if (Ntimage != ntimage) {
-    fprintf (stderr, "failed to read in entire image file %s\n", ImageCat);
-    exit (1);
-  }
-
-  /* need to delete on basis of both image time & photcode */
-  /* first, mark the deleted images with a flag (NX = 0) */
-  for (i = 0; i < Ntimage; i++) {
-    for (j = 0; j < Nimages; j++) {
-      tstart = timage[i].tzero;
-      tend = timage[i].tzero + timage[i].trate * timage[i].NY;
-      start = image[j].tzero;
-      end = image[j].tzero + image[j].trate * image[j].NY;
-      if ((tstart <= end) && (tend >= start) && (timage[i].source == image[j].source)) {
-	fprintf (stderr, "deleting %s\n", timage[i].name);
-	timage[i].NX = 0;
-      }
-    }
+  /* first, mark the deleted images with a flag (name = 0) */
+  for (i = 0; i < Nimlist; i++) {
+    j = imlist[i];
+    image[j].name[0] = 0;
+    /* this puts a restriction on the DB: image name must not be NULL */
   }
 
   /* delete the marked images */
-  for (i = 0, j = 0; j < Ntimage; j++) {
-    if (timage[j].NX) {
-      if (i != j) {
-	timage[i] = timage[j];
-      }
-      i++;
+  for (i = 0, j = 0; j < Nimage; j++) {
+    if (!image[j].name[0]) continue;
+    if (i != j) {
+      image[i] = image[j];
     }
+    i++;
   }
-  Ntimage = i;
-  REALLOCATE (timage, Image, Ntimage);
-  fits_modify (&header, "NIMAGES", "%d", 1, Ntimage);
+  Nimage = i;
+  REALLOCATE (image, Image, Nimage);
 
-  /* should make a backup copy of the ImageCat file */
-  fseek (f, 0, SEEK_SET);
-  Fwrite (header.buffer, 1, header.size, f, "char");
-  Fwrite (timage, sizeof(Image), Ntimage, f, "image");
-
+  SetImages (image, Nimage);
   return (TRUE);
 }
-
-/* this is kind of silly: we match images in both gimages and dimages 
- *
- */
Index: /trunk/Ohana/src/delstar/src/find_images.c
===================================================================
--- /trunk/Ohana/src/delstar/src/find_images.c	(revision 4679)
+++ /trunk/Ohana/src/delstar/src/find_images.c	(revision 4680)
@@ -1,4 +1,3 @@
 # include "delstar.h"
-double opening_angle ();
 
 Image *find_images (FILE *f, CatStats *catstats, int *Nimages) {
@@ -133,7 +132,5 @@
 }
 
-int edge_check (x1, y1, x2, y2)
-double *x1, *y1, *x2, *y2;
-{
+int edge_check (double *x1, double *y1, double *x2, double *y2) {
 
   double theta1, theta2;
@@ -169,7 +166,5 @@
 }
 
-double opening_angle (x1, y1, x2, y2, x3, y3)
-double x1, y1, x2, y2, x3, y3;
-{
+double opening_angle (double x1, double y1, double x2, double y2, double x3, double y3) {
 
   double dx1, dy1, dx2, dy2, ct, st, theta;
Index: /trunk/Ohana/src/delstar/src/find_matches.c
===================================================================
--- /trunk/Ohana/src/delstar/src/find_matches.c	(revision 4679)
+++ /trunk/Ohana/src/delstar/src/find_matches.c	(revision 4680)
@@ -1,15 +1,13 @@
 # include "delstar.h"
 
-find_matches (Catalog *catalog, Image *image, int start, int end) {
-
-  int i, j, k, n, m, N, M, found;
-  int *N1, *N2,  *next, *next_miss, *ave_miss, last, last_miss;
-  int Nave, NAVE, Nmeas, NMEAS, Nmiss, NMISS, Nmatch, photcode;
+void find_matches (Catalog *catalog, int photcode, int start, int end) {
+
+  int i, j, k, n, m, N, M, drop;
+  int *next, *next_miss, *ave_miss, last, last_miss;
+  int Nave, Nmeas, Nmiss;
   int Nmeasfound, Nsecfilt;
   int this, prev;
-  unsigned int flags;
   Measure *tmpmeasure;
   Missing *tmpmissing;
-  Coords tcoords;
 
   /** allocate local arrays **/
@@ -43,105 +41,75 @@
     }
   }
-  photcode = -1;
-  if ((start == 0) && (end == 0)) {
-    start = image[0].tzero;
-    end   = image[0].tzero + 1e-4*image[0].NY*image[0].trate;  /* trate is in 0.1 msec / row */
-    photcode = image[0].source;
-  }
-  if (VERBOSE) fprintf (stderr, "deleting for range %d to %d (photcode %d)\n", start, end, photcode);
+
+  if (VERBOSE) fprintf (stderr, "deleting for range %d to %d, photcode %d\n", start, end, photcode);
   Nmeasfound = 0;
   Nsecfilt = catalog[0].Nsecfilt;
 
-  /* fprintf (stderr, "fixing the measures...\n"); */
-  /** find measure in time range of image **/
+  if (VERBOSE) fprintf (stderr, "fixing measure...\n"); 
+
+  /** find measure in time range **/
   this = prev = -1;
   for (i = 0; (i < Nmeas); i++) {
-    if ((i % 10000) == 0) fprintf (stderr, ". ");
-    if ((catalog[0].measure[i].t >= start) && (catalog[0].measure[i].t <= end) && (photcode == catalog[0].measure[i].source)) { 
-      Nmeasfound ++;
-      /* this star is in this image */
-      this = next[i];
-      next[i] = -2; /* we delete this one */
-      if (prev != -1) { next[prev] = this; }
+    if (VERBOSE && !(i % 10000)) fprintf (stderr, ". ");
+    drop = TRUE;
+    drop &= (catalog[0].measure[i].t >= start);
+    drop &= (catalog[0].measure[i].t <= end);
+    drop &= ((photcode == -1) || (photcode == catalog[0].measure[i].source));
+    if (!drop) {
+      prev = i;
+      continue;
+    }
+    Nmeasfound ++;
+
+    /* this star is in this image */
+    this = next[i];
+    next[i] = -2; /* we delete this one */
+    if (prev != -1) { next[prev] = this; }
+
 # if (0) 
-      /* why is this section disabled? */
+    /* why is this section disabled? */
+    /* fix the list links: connect the previous valid link to the next valid link */
+    for (j = i; (j >= 0) && (next[j] == -2); j--); /* find previous entry to fix link */
+    if (j >= 0) { /* if j < 0, there is no previous valid link, ignore this step */
+      if (next[j] != i) {
+	fprintf (stderr, "error? (1)  this link seems to have been lost\n");
+	fprintf (stderr, "j: %d, next[j]: %d, i: %d\n", j, next[j], i);
+	exit (1);
+      }
+      /* find next valid entry to fix link */
+      for (k = i; (k < Nmeas) && (next[k] == -2); k++);
+      if (k < Nmeas)
+	next[j] = k;
+      else 
+	next[j] = -1;  /* last link in list gets a -1 */
+    }
+# endif      
+
+    /*** fix the corresponding average entry ***/
+    n = catalog[0].measure[i].averef;
+    if (catalog[0].average[n].Nm == 0) { /* this should never happen */
+      fprintf (stderr, "error? we deleted one too many objects?\n");
+      exit (1);
+    }
+    catalog[0].average[n].Nm --;
+    /* this was only entry in list: will be deleted below.  meanwhile, delete all missing entries*/
+    if ((catalog[0].average[n].Nm < 1) && (catalog[0].average[n].Nn > 0)) { 
+      m = catalog[0].average[n].missing;
+      for (j = 0; j < catalog[0].average[n].Nn; j++) {
+	M = next_miss[m];
+	next_miss[m] = -2;
+	m = M;
+      }
+      m = catalog[0].average[n].missing;
       /* fix the list links: connect the previous valid link to the next valid link */
-      for (j = i; (j >= 0) && (next[j] == -2); j--); /* find previous entry to fix link */
+      for (j = m; (j >= 0) && (next_miss[j] == -2); j--); /* find previous entry to fix link */
       if (j >= 0) { /* if j < 0, there is no previous valid link, ignore this step */
-	if (next[j] != i) {
-	  fprintf (stderr, "error? (1)  this link seems to have been lost\n");
-	  fprintf (stderr, "j: %d, next[j]: %d, i: %d\n", j, next[j], i);
-	  exit (1);
-	}
-	/* find next valid entry to fix link */
-	for (k = i; (k < Nmeas) && (next[k] == -2); k++);
-	if (k < Nmeas)
-	  next[j] = k;
-	else 
-	  next[j] = -1;  /* last link in list gets a -1 */
-      }
-# endif      
-      /*** fix the corresponding average entry ***/
-      n = catalog[0].measure[i].averef;
-      if (catalog[0].average[n].Nm == 0) { /* this should never happen */
-	fprintf (stderr, "error? we deleted one too many objects?\n");
-	exit (1);
-      }
-      catalog[0].average[n].Nm --;
-      /* this was only entry in list: will be deleted below.  meanwhile, delete all missing entries*/
-      if ((catalog[0].average[n].Nm < 1) && (catalog[0].average[n].Nn > 0)) { 
-	m = catalog[0].average[n].missing;
-	for (j = 0; j < catalog[0].average[n].Nn; j++) {
-	  M = next_miss[m];
-	  next_miss[m] = -2;
-	  m = M;
-	}
-	m = catalog[0].average[n].missing;
-	/* fix the list links: connect the previous valid link to the next valid link */
-	for (j = m; (j >= 0) && (next_miss[j] == -2); j--); /* find previous entry to fix link */
-	if (j >= 0) { /* if j < 0, there is no previous valid link, ignore this step */
-	  if (next_miss[j] != m) {
-	    fprintf (stderr, "error? (2) this link seems to have been lost\n");
-	    fprintf (stderr, "j: %d, next_miss[j]: %d, i: %d\n", j, next_miss[j], i);
-	    exit (1);
-	  }
-	  /* find next valid entry to fix link */
-	  for (k = m; (k < Nmiss) && (next_miss[k] == -2); k++);
-	  if (k < Nmiss)
-	    next_miss[j] = k;
-	  else 
-	    next_miss[j] = -1;  /* last link in list gets a -1 */
-	}
-      }
-      /* this was first entry in list */
-      if ((catalog[0].average[n].offset == i) && (catalog[0].average[n].Nm > 0)) { 
-	m = catalog[0].average[n].offset;
-	/* find next valid entry -- notice lack of error checking... */
-	for (j = 0; (j < Nmeas) && (next[m+j] == -2); j++);
-	catalog[0].average[n].offset = m + j;
-      }
-    } else {
-      prev = i;
-    }
-  }
-  fprintf (stderr, "found %d meas to remove\n", Nmeasfound);
-
-  /* fprintf (stderr, "fixing the missing...\n"); */
-  /** find missing in time range of image **/
-  for (i = 0; (i < Nmiss); i++) {
-    if ((next_miss[i] != -2) && (catalog[0].missing[i].t >= start) && (catalog[0].missing[i].t <= end)) { 
-      /* this star is in this image */
-
-      next_miss[i] = -2; /* we delete this one */
-      /* fix the list links: connect the previous valid link to the next valid link */
-      for (j = i; (j >= 0) && (next_miss[j] == -2); j--); /* find previous entry to fix link */
-      if (j >= 0) { /* if j < 0, there is no previous valid link, ignore this step */
-	if (next_miss[j] != i) {
-	  fprintf (stderr, "error? (3) this link seems to have been lost\n");
+	if (next_miss[j] != m) {
+	  fprintf (stderr, "error? (2) this link seems to have been lost\n");
 	  fprintf (stderr, "j: %d, next_miss[j]: %d, i: %d\n", j, next_miss[j], i);
 	  exit (1);
 	}
 	/* find next valid entry to fix link */
-	for (k = i; (k < Nmiss) && (next_miss[k] == -2); k++);
+	for (k = m; (k < Nmiss) && (next_miss[k] == -2); k++);
 	if (k < Nmiss)
 	  next_miss[j] = k;
@@ -149,51 +117,56 @@
 	  next_miss[j] = -1;  /* last link in list gets a -1 */
       }
+    }
+    /* this was first entry in list */
+    if ((catalog[0].average[n].offset == i) && (catalog[0].average[n].Nm > 0)) { 
+      m = catalog[0].average[n].offset;
+      /* find next valid entry -- notice lack of error checking... */
+      for (j = 0; (j < Nmeas) && (next[m+j] == -2); j++);
+      catalog[0].average[n].offset = m + j;
+    }
+  } 
+  fprintf (stderr, "found %d meas to remove\n", Nmeasfound);
+
+  if (VERBOSE) fprintf (stderr, "fixing missing..."); 
+  /** find missing in time range of image **/
+  for (i = 0; (i < Nmiss); i++) {
+    if (next_miss[i] == -2) continue;
+    if (catalog[0].missing[i].t < start) continue;
+    if (catalog[0].missing[i].t > end) continue;
+
+    next_miss[i] = -2; /* we delete this one */
+    /* fix the list links: connect the previous valid link to the next valid link */
+    for (j = i; (j >= 0) && (next_miss[j] == -2); j--); /* find previous entry to fix link */
+    if (j >= 0) { /* if j < 0, there is no previous valid link, ignore this step */
+      if (next_miss[j] != i) {
+	fprintf (stderr, "error? (3) this link seems to have been lost\n");
+	fprintf (stderr, "j: %d, next_miss[j]: %d, i: %d\n", j, next_miss[j], i);
+	exit (1);
+      }
+      /* find next valid entry to fix link */
+      for (k = i; (k < Nmiss) && (next_miss[k] == -2); k++);
+      if (k < Nmiss)
+	next_miss[j] = k;
+      else 
+	next_miss[j] = -1;  /* last link in list gets a -1 */
+    }
       
-      /* find the corresponding avearge entry 
-      found = FALSE;
-      for (n = 0; !found && (n < Nave); n++) {
-	if ((catalog[0].average[n].missing > 0) && (catalog[0].average[n].missing <= i) && (catalog[0].average[n].missing + catalog[0].average[n].Nn > i)) 
-	  found = TRUE;
-      }
-      n--; */
-      /*** fix the corresponding average entry ***/
-      n = ave_miss[i];
-      if (catalog[0].average[n].Nn == 0) { /* this should never happen */
-	fprintf (stderr, "error? we deleted one too many missing?\n");
-	exit (1);
-      }
-      catalog[0].average[n].Nn --;
-      /* this was first entry in list */
-      if ((catalog[0].average[n].missing == i) && (catalog[0].average[n].Nn > 0)) { 
-	m = catalog[0].average[n].missing;
-	for (j = 0; (j < Nmiss) && (next_miss[m+j] == -2); j++);
-	catalog[0].average[n].missing = m + j;
-      }
-
-    }
-  }
-
-  /* currently not worked out, but we will need to delete the references to blended image and cat stars */
-# if 0
-  /*** handle multiple stars */
-  /* this image star matches more than one catalog star */
-  if (stars[N].found > -1) {
-    catalog[0].measure[stars[N].found].flags |= BLEND_IMAGE;
-    catalog[0].measure[Nmeas].flags |= BLEND_IMAGE;
-  } 
-  if (stars[N].found == -2) { /* this image star matches a catalog star on a neighboring catalog */
-    catalog[0].measure[Nmeas].flags |= BLEND_IMAGE_NEIGHBOR;
-  } 
-  if (stars[N].found == -1) { /* this image star matches only this star */
-    stars[N].found = Nmeas;  /* save first match, in case coincidences are found */
-  }
-  /* this catalog star matches more than one image star */
-  if (catalog[0].found[n] > -1) {
-    catalog[0].measure[catalog[0].found[n]].flags |= BLEND_CATALOG;
-    catalog[0].measure[Nmeas].flags |= BLEND_CATALOG;
-  } else {
-    catalog[0].found[n] = Nmeas;
-  }
-# endif  
+    /*** fix the corresponding average entry ***/
+    n = ave_miss[i];
+    if (catalog[0].average[n].Nn == 0) { /* this should never happen */
+      fprintf (stderr, "error? we deleted one too many missing?\n");
+      exit (1);
+    }
+    catalog[0].average[n].Nn --;
+    /* this was first entry in list */
+    if ((catalog[0].average[n].missing == i) && (catalog[0].average[n].Nn > 0)) { 
+      m = catalog[0].average[n].missing;
+      for (j = 0; (j < Nmiss) && (next_miss[m+j] == -2); j++);
+      catalog[0].average[n].missing = m + j;
+    }
+  }
+
+  /* we should delete the references to blended image and cat stars ?? */
+  /* or drop since we are changing this concept ?? */
 
   /* fix Average list: delete entries with Nm == 0 */
@@ -266,5 +239,5 @@
   free (next_miss);
   free (ave_miss);
-
+  return;
 }
 
Index: /trunk/Ohana/src/delstar/src/gimages.c
===================================================================
--- /trunk/Ohana/src/delstar/src/gimages.c	(revision 4679)
+++ /trunk/Ohana/src/delstar/src/gimages.c	(revision 4680)
@@ -1,5 +1,7 @@
 # include "delstar.h"
 
-/* load information about image from image header */
+/* load information about image from image header
+ * this should be the same as addstar/gstars, but it is not...
+ */
 
 Image *gimages (char *filename) {
@@ -7,15 +9,13 @@
   FILE *f;
   Header header;
-  char line[64], photcode[64], *c;
-  struct tm timeptr;
-  double tmp, jd;
+  char photcode[64], *c;
+  double tmp;
   Image *image;
-  int Nsec, Nc;
+  int Nc;
 
   ALLOCATE (image, Image, 1);
   /* load header */
   if (!fits_read_header (filename, &header)) {
-    fprintf (stderr, "ERROR: can't find image file %s\n", filename);
-    Shutdown ();
+    Shutdown ("ERROR: can't find image file %s", filename);
   }
 
@@ -23,6 +23,5 @@
   f = fopen (filename, "r");
   if (f == NULL) {
-    fprintf (stderr, "ERROR: can't find data file %s\n", filename);
-    Shutdown ();
+    Shutdown ("ERROR: can't find data file %s", filename);
   }
   fseek (f, header.size, SEEK_SET); 
@@ -38,6 +37,5 @@
   /* get astrometry information */
   if (!GetCoords (&image[0].coords, &header)) {
-    fprintf (stderr, "ERROR: no astrometric solution in header\n");
-    Shutdown ();
+    Shutdown ("ERROR: no astrometric solution in header");
   }
   while (image[0].coords.crval1 < 0) image[0].coords.crval1 += 360.0;
@@ -56,6 +54,5 @@
   Nc = GetPhotcodeCodebyName (photcode);
   if (!Nc) {
-    fprintf (stderr, "ERROR: photcode %s not found in photcode table\n", photcode);
-    Shutdown ();
+    Shutdown ("ERROR: photcode %s not found in photcode table", photcode);
   }
   image[0].source = Nc;
Index: /trunk/Ohana/src/delstar/src/gtimes.c
===================================================================
--- /trunk/Ohana/src/delstar/src/gtimes.c	(revision 4679)
+++ /trunk/Ohana/src/delstar/src/gtimes.c	(revision 4680)
@@ -55,6 +55,6 @@
   { 
     double Ra, Dec;
-    fprintf (stderr, "found the following images:\n");
-    for (i = 0; i < npimage; i++) {
+    if (VERBOSE) fprintf (stderr, "found the following images:\n");
+    for (i = 0; VERBOSE && (i < npimage); i++) {
       XY_to_RD (&Ra, &Dec, 0.5*pimage[i].NX, 0.5*pimage[i].NY, &pimage[i].coords);
       fprintf (stderr, "%3d %s %8.4f %8.4f %d %d\n", i, pimage[i].name, Ra, Dec,
Index: /trunk/Ohana/src/delstar/src/image-db.c
===================================================================
--- /trunk/Ohana/src/delstar/src/image-db.c	(revision 4679)
+++ /trunk/Ohana/src/delstar/src/image-db.c	(revision 4680)
@@ -7,7 +7,23 @@
 static int dbstate = LCK_UNLOCK;
 
+static Header header;
+static Image *image = NULL;
+static int   Nimage;
+
 FILE *GetDB (int *state) {
   *state = dbstate;
   return (f);
+}
+
+Image *GetImages (int *nimage) {
+  *nimage = Nimage;
+  return (image);
+}
+
+int SetImages (Image *new, int Nnew) {
+  Nimage = Nnew;
+  image  =  new;
+  fits_modify (&header, "NIMAGES", "%d", 1, Nimage);
+  return (TRUE);
 }
 
@@ -23,5 +39,4 @@
   va_start (argp, format);
   vfprintf (stderr, formatplus, argp);
-  free (formatplus);
   va_end (argp);
 
@@ -37,20 +52,65 @@
   f = fsetlockfile (ImageCat, 3600.0, LOCK, &dbstate);
   if (f == NULL) {
-    fprintf (stderr, "ERROR: can't lock image catalog\n");
-    exit (1);
+    Shutdown ("ERROR: can't lock image catalog");
+  }
+  if (dbstate == LCK_EMPTY) {
+    Shutdown ("ERROR: database is empty");
   }
   fseek (f, 0, SEEK_SET);
 }
 
-void unlock_image_db (Image *image) {
+int load_image_db () {
+
+  int nimage;
+
+  /* read header */
+  fseek (f, 0, SEEK_SET);
+  if (!fits_fread_header (f, &header)) {
+    Shutdown ("can't read image catalog %s", ImageCat);
+  }
+  fseek (f, header.size, SEEK_SET); 
+
+  Nimage = 0;
+  fits_scan (&header, "NIMAGES", "%d", 1, &Nimage);
+  ALLOCATE (image, Image, Nimage);
+
+  nimage = Fread (image, sizeof(Image), Nimage, f, "image");
+  if (nimage != Nimage) {
+    Shutdown ("error reading images from db file");
+  }
+  
+  return (TRUE);
+}
+
+int save_image_db () {
+
+  int status;
+  char line[1024];
+  mode_t mode;
+
+  /* use cp to make backup copy */
+  sprintf (line, "cp %s %s~", ImageCat, ImageCat);
+  status = system (line);
+  if (status) {
+    Shutdown ("ERROR: unable to create %s~, exiting", ImageCat);
+  }
+  mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
+  sprintf (line, "%s~", ImageCat);
+  chmod (line, mode);
+
+  /* update header */
+  fits_modify (&header, "NIMAGES", "%d", 1, Nimage);
+
+  /* write out data to already opened file */
+  fseek (f, 0, SEEK_SET);
+  Fwrite (header.buffer, 1, header.size, f, "char");
+  Fwrite (image, sizeof(Image), Nimage, f, "image");
+
+  return (TRUE);
+}
+
+void unlock_image_db () {
 
   mode_t mode;
-
-  /* protect wimage from interrupt signals */
-  if (MODE == M_IMAGE) {
-    SetProtect (TRUE);
-    wimage (image); 
-    SetProtect (FALSE);
-  }
 
   fclearlockfile (ImageCat, f, LOCK, &dbstate);
Index: /trunk/Ohana/src/delstar/src/match_images.c
===================================================================
--- /trunk/Ohana/src/delstar/src/match_images.c	(revision 4679)
+++ /trunk/Ohana/src/delstar/src/match_images.c	(revision 4680)
@@ -1,9 +1,5 @@
 # include "delstar.h"
 
-match_images (catalog, image, Nimage)
-Catalog catalog[];
-Image   image[];
-int Nimage;
-{
+void match_images (Catalog *catalog, Image *image, int Nimage) {
   
   int j, k, found;
Index: /trunk/Ohana/src/delstar/src/parse_time.c
===================================================================
--- /trunk/Ohana/src/delstar/src/parse_time.c	(revision 4679)
+++ /trunk/Ohana/src/delstar/src/parse_time.c	(revision 4680)
@@ -1,5 +1,5 @@
 # include "delstar.h"
 
-parse_time (Header *header) {
+int parse_time (Header *header) {
 
   double jd;
@@ -38,6 +38,5 @@
   for (Ny = 0, c = strchr (DateMode, 'Y'); c != (char ) NULL; c = strchr (c + 1, 'Y'), Ny++);
   if ((Ny != 2) && (Ny != 4)) {
-    fprintf (stderr, "error in DATE-MODE format: %s\n", DateMode);
-    Shutdown ();
+    Shutdown ("error in DATE-MODE format: %s", DateMode);
   }
   py = strchr (DateMode, 'Y');
@@ -45,14 +44,11 @@
   pd = strchr (DateMode, 'D');
   if ((py == (char *) NULL) || (pm == (char *) NULL) || (pd == (char *) NULL)) {
-    fprintf (stderr, "error in DATE-MODE format: %s\n", DateMode);
-    Shutdown ();
+    Shutdown ("error in DATE-MODE format: %s", DateMode);
   }
   if ((py > pm) && (py < pd)) {
-    fprintf (stderr, "error in DATE-MODE format: %s\n", DateMode);
-    Shutdown ();
+    Shutdown ("error in DATE-MODE format: %s", DateMode);
   }
   if ((py > pd) && (py < pm)) {
-    fprintf (stderr, "error in DATE-MODE format: %s\n", DateMode);
-    Shutdown ();
+    Shutdown ("error in DATE-MODE format: %s", DateMode);
   }
   mode = 0;
@@ -62,6 +58,5 @@
   if ((py > pm) && (pm > pd)) { mode = 4; }  /* dd-mm-yyyy */
   if (!mode) {
-    fprintf (stderr, "error in DATE-MODE format: %s\n", DateMode);
-    Shutdown ();
+    Shutdown ("error in DATE-MODE format: %s", DateMode);
   }
 
@@ -90,6 +85,5 @@
   }
   if (Nf != 3) {
-    fprintf (stderr, "error in date entry (%s) or DATE-MODE format (%s)\n", line, DateMode);
-    Shutdown ();
+    Shutdown ("error in date entry (%s) or DATE-MODE format (%s)", line, DateMode);
   }
 
Index: /trunk/Ohana/src/delstar/src/sort_lists.c
===================================================================
--- /trunk/Ohana/src/delstar/src/sort_lists.c	(revision 4679)
+++ /trunk/Ohana/src/delstar/src/sort_lists.c	(revision 4680)
@@ -1,7 +1,6 @@
+# include "delstar.h"
 
-sort_lists (X, Y, S, N) 
-float *X, *Y;
-int *S, N;
-{
+void sort_lists (float *X, float *Y, int *S, int N) {
+
   int l,j,ir,i;
   double tX, tY, tS;
@@ -15,6 +14,5 @@
       tY = Y[l];
       tS = S[l];
-    }
-    else {
+    } else {
       tX = X[ir];
       X[ir] = X[0];
@@ -47,2 +45,36 @@
   }
 }
+
+void sort_regions (GSCRegion *region, int N) {
+
+  int l,j,ir,i;
+  GSCRegion tmp;
+  
+  l = N >> 1;
+  ir = N - 1;
+  for (;;) {
+    if (l > 0) {
+      l--;
+      tmp = region[l];
+    } else {
+      tmp = region[ir];
+      region[ir] = region[0];
+      if (--ir == 0) {
+	region[0] = tmp;
+	return;
+      }
+    }
+    i = l;
+    j = (l << 1) + 1;
+    while (j <= ir) {
+      if (j < ir && region[j].DEC[0] < region[j+1].DEC[0]) j++;
+      if (tmp.DEC[0] < region[j].DEC[0]) {
+	region[i] = region[j];
+	j += (i=j) + 1;
+      }
+      else j = ir + 1;
+    }
+    region[i] = tmp;
+  }
+}
+
Index: /trunk/Ohana/src/delstar/src/wcatalog.c
===================================================================
--- /trunk/Ohana/src/delstar/src/wcatalog.c	(revision 4679)
+++ /trunk/Ohana/src/delstar/src/wcatalog.c	(revision 4680)
@@ -1,8 +1,6 @@
 # include "delstar.h"
 
-wcatalog (Catalog *catalog) {
+int wcatalog (Catalog *catalog) {
   
-  int status;
-
   /* we'll leave these for now, but they are LONEOS specific */
   fits_modify (&catalog[0].header, "MARKSTAR", "%t", 1, FALSE);
@@ -34,4 +32,6 @@
   }
   fits_free_header (&catalog[0].header);
+  
+  return (TRUE);
 }
 
