Index: trunk/Ohana/src/opihi/dvo/cmpread.c
===================================================================
--- trunk/Ohana/src/opihi/dvo/cmpread.c	(revision 4689)
+++ trunk/Ohana/src/opihi/dvo/cmpread.c	(revision 5144)
@@ -1,67 +1,61 @@
 # include "dvo1.h"
-# define D_NSTARS 1000
-# define BYTES_STAR 66
-# define BLOCK 1000
+
+/* add others as needed */
+enum {F_NONE, F_RA, F_DEC, F_X, F_Y, F_MAG, F_DMAG, F_TYPE, F_SKY, F_FX, F_FY, F_APMAG, F_GALMAG};
 
 int cmpread (int argc, char **argv) {
   
-  int i, nstar, Nin, Nextra;
-  int doneread, done, Nskip, Nbytes, nbytes, Ninstar, RAnDEC;
-  char *c, *c2, *name, *file;
-  float *R, *D, *V;
-  double tR, tD, tmp, X, Y;
+  int i, field, extend, Nbytes, Nstars;
+  double tR, tD;
+  float value;
   FILE *f;
-  char *buffer;
-  int Nfield, Nra, Ndec;
-  Vector *rvec, *dvec, *vec;
+  Vector *vec;
   Header header;
   Coords coords;
+  CMPstars *stars;
 
-  if ((argc != 4) && (argc != 6)) {
-    fprintf (stderr, "USAGE: cmpread name Nfield <filename>\n");
-    fprintf (stderr, "USAGE: cmpread ra N dec N <filename>\n");
+  if (argc != 3) {
+    fprintf (stderr, "USAGE: cmpread field <filename>\n");
     return (FALSE);
   }
 
-  R = D = V = NULL;
-  file = NULL;
-  name = NULL;
-  Nfield = Nra = Ndec = 0;
-  RAnDEC = FALSE;
-
-  if (argc == 4) {
-    name = strcreate (argv[1]);
-    Nfield = atof (argv[2]);
-    file = strcreate (argv[3]);
-    RAnDEC = FALSE;
-  } else {
-    Nra  = atof (argv[2]);
-    Ndec = atof (argv[4]);
-    file = strcreate (argv[5]);
-    RAnDEC = TRUE;
-  }    
-
-  if (!fits_read_header (file, &header)) {
-    fprintf (stderr, "ERROR: can't read header for %s\n", file);
-    free (file);
-    if (!RAnDEC) free (name);
+  field = F_NONE;
+  if (!strcasecmp (argv[1], "ra"))   field = F_RA;
+  if (!strcasecmp (argv[1], "dec"))  field = F_DEC;
+  if (!strcasecmp (argv[1], "mag"))  field = F_MAG;
+  if (!strcasecmp (argv[1], "dmag")) field = F_DMAG;
+  if (!strcasecmp (argv[1], "x"))    field = F_X;
+  if (!strcasecmp (argv[1], "y"))    field = F_Y;
+  if (!strcasecmp (argv[1], "type")) field = F_TYPE;
+  if (!strcasecmp (argv[1], "sky"))  field = F_SKY;
+  if (!strcasecmp (argv[1], "fx"))   field = F_FX;
+  if (!strcasecmp (argv[1], "fy"))   field = F_FY;
+  if (!strcasecmp (argv[1], "apmag"))  field = F_APMAG;
+  if (!strcasecmp (argv[1], "galmag"))  field = F_GALMAG;
+  if (field == F_NONE) {
+    fprintf (stderr, "invalid cmp field: %s\n", argv[1]);
     return (FALSE);
   }
 
-  /* find expected number of stars */
-  fits_scan (&header, "NSTARS", "%d", 1, &nstar);
-  if (nstar == 0) {
-    fprintf (stderr, "ERROR: can't get NSTARS from header\n");
-    free (file);
-    if (!RAnDEC) free (name);
-    fits_free_header (&header);
+  if ((vec = SelectVector (argv[1],  ANYVECTOR, TRUE)) == NULL) return (FALSE);
+
+  /* load FITS header */
+  if (!fits_read_header (argv[2], &header)) {
+    fprintf (stderr, "ERROR: can't read header for %s\n", argv[2]);
     return (FALSE);
   }
 
-  f = fopen (file, "r");
+  if ((field == F_RA) || (field == F_DEC)) {
+    if (!GetCoords (&coords, &header)) {
+      fprintf (stderr, "can't get WCS info from header\n");
+      fits_free_header (&header);
+      return (FALSE);
+    }
+  }
+
+  /* re-open file to load data */
+  f = fopen (argv[2], "r");
   if (f == NULL) {
-    fprintf (stderr, "ERROR: can't read data from %s\n", file);
-    free (file);
-    if (!RAnDEC) free (name);
+    fprintf (stderr, "ERROR: can't read data from %s\n", argv[2]);
     fits_free_header (&header);
     return (FALSE);
@@ -69,86 +63,80 @@
   fseek (f, header.size, SEEK_SET); 
 
-  if (RAnDEC) {
-    if ((rvec = SelectVector ("ra",  ANYVECTOR, TRUE)) == NULL) return (FALSE);
-    if ((dvec = SelectVector ("dec",  ANYVECTOR, TRUE)) == NULL) return (FALSE);
-    REALLOCATE (rvec[0].elements, float, nstar);
-    REALLOCATE (dvec[0].elements, float, nstar);
-    R = rvec[0].elements;
-    D = dvec[0].elements;
-    rvec[0].Nelements = dvec[0].Nelements = nstar;
-    if (!GetCoords (&coords, &header)) {
-      fprintf (stderr, "can't get WCS info from header\n");
-      return (FALSE);
-    }
-  } else {
-    if ((vec = SelectVector (name, ANYVECTOR, TRUE)) == NULL) return (FALSE);
-    REALLOCATE (vec[0].elements, float, nstar);
-    V = vec[0].elements;
-    vec[0].Nelements = nstar;
+  /* find expected number of stars */
+  if (!fits_scan (&header, "NSTARS", "%d", 1, &Nstars)) {
+    fprintf (stderr, "ERROR: can't get NSTARS from header\n");
+    fits_free_header (&header);
+    return (FALSE);
   }
 
-  /* load in stars by blocks of 1000 */
-  Nin = 0;
-  ALLOCATE (buffer, char, (BLOCK*BYTES_STAR) + 1);
-  buffer[BLOCK*BYTES_STAR] = 0;
-  Nextra = 0;
-  doneread = FALSE;
-  while (!doneread) {
-    Nbytes = BYTES_STAR * BLOCK - Nextra;
-    nbytes = fread (&buffer[Nextra], 1, Nbytes, f);
-    if (nbytes == 0) {
-      doneread = TRUE;
-      continue;
+  /* read from FITS table or from text table */
+  extend = FALSE;
+  fits_scan (&header, "EXTEND",  "%t", 1, &extend);
+  if (extend) {
+    fprintf (stderr, "reading from FITS cmp file %s\n", argv[2]);
+    Nbytes = fits_matrix_size (&header);
+    fseek (f, Nbytes, SEEK_CUR); 
+    stars = cmpReadFits (f, &Nstars);
+  } else {
+    /* allocate space for stars */
+    fprintf (stderr, "reading from TEXT cmp file %s\n", argv[2]);
+    if (!fits_scan (&header, "NSTARS", "%d", 1, &Nstars)) {
+      fprintf (stderr, "ERROR: failed to find NSTARS\n");
+      exit (1);
     }
-    nbytes += Nextra;
-    /* check line-by-line integrity */
-    c = buffer;
-    done = FALSE;
-    while ((c < buffer + nbytes) && (!done)) { 
-      for (c2 = c; *c2 == '\n'; c2++);
-      if (c2 > c) { /* extra return chars */
-	memmove (c, c2, (int)(buffer + nbytes - c2));
-	Nskip = c2 - c;
-	nbytes -= Nskip;
-	bzero (buffer + nbytes, Nskip);
-      }
-      c2 = strchr (c, '\n');
-      if (c2 == (char *) NULL) {
-	done = TRUE;	
-	continue;
-      }
-      c2++;
-      if ((c2 - c) != BYTES_STAR) { /* bad line, delete it */
-	memmove (c, c2, (int)(buffer + nbytes - c2));
-	Nskip = c2 - c;
-	nbytes -= Nskip;
-	bzero (buffer + nbytes, Nskip);
-      } else {
-	c = c2;
-      }
-    }
-    Ninstar = nbytes / BYTES_STAR;
-    Nextra = nbytes % BYTES_STAR;
-    for (i = 0; i < Ninstar; i++, Nin++) {
-      if (RAnDEC) {
-	dparse (&X, Nra,  &buffer[i*BYTES_STAR]);
-	dparse (&Y, Ndec, &buffer[i*BYTES_STAR]);
-	XY_to_RD (&tR, &tD, X, Y, &coords);
-	R[Nin] = tR; D[Nin] = tD;
-      } else {
-	dparse (&tmp, Nfield, &buffer[i*BYTES_STAR]);
-	V[Nin] = tmp;
-      }
-    }
+    stars = cmpReadText (f, &Nstars);
   }
   fclose (f);
 
+  REALLOCATE (vec[0].elements, float, Nstars);
+  vec[0].Nelements = Nstars;
+  bzero (vec[0].elements, Nstars*sizeof(float));
+
+  for (i = 0; i < Nstars; i++) {
+    switch (field) {
+      case F_RA:
+	XY_to_RD (&tR, &tD, stars[i].X, stars[i].Y, &coords);
+	value = tR;
+	break;
+      case F_DEC:
+	XY_to_RD (&tR, &tD, stars[i].X, stars[i].Y, &coords);
+	value = tD;
+	break;
+      case F_X:
+	value = stars[i].X;
+	break;
+      case F_Y:
+	value = stars[i].Y;
+	break;
+      case F_MAG:
+	value = stars[i].M;
+	break;
+      case F_APMAG:
+	value = stars[i].Map;
+	break;
+      case F_GALMAG:
+	value = stars[i].Mgal;
+	break;
+      case F_DMAG:
+	value = stars[i].dM;
+	break;
+      case F_TYPE:
+	value = stars[i].dophot;
+	break;
+      case F_SKY:
+	value = stars[i].sky;
+	break;
+      case F_FX:
+	value = stars[i].fx;
+	break;
+      case F_FY:
+	value = stars[i].fy;
+	break;
+    }
+    vec[0].elements[i] = value;
+  }      
+  free (stars);
   fits_free_header (&header);
-  free (buffer);
-  free (file);
-  if (!RAnDEC) free (name);
-
-  fprintf (stderr, "loaded %d objects\n", Nin);
+  fprintf (stderr, "loaded %d objects\n", Nstars);
   return (TRUE);
 }
-
