Index: trunk/Ohana/src/opihi/cmd.data/read_vectors.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/read_vectors.c	(revision 41284)
+++ trunk/Ohana/src/opihi/cmd.data/read_vectors.c	(revision 41305)
@@ -35,5 +35,5 @@
 
 // vector types
-enum {COLTYPE_NONE, COLTYPE_FLT, COLTYPE_INT, COLTYPE_TIME, COLTYPE_CHAR, COLTYPE_STR};
+enum {COLTYPE_NONE, COLTYPE_FLT, COLTYPE_INT, COLTYPE_TIME, COLTYPE_DATE, COLTYPE_CHAR, COLTYPE_STR, COLTYPE_HMS};
 
 static int      Nvec     = 0;
@@ -91,9 +91,11 @@
     gprint (GP_ERR, "     -skip N : skip N lines before reading\n");
     gprint (GP_ERR, "     column names may include a type: name:type\n");
-    gprint (GP_ERR, "       type is int, float, char, str, time\n");
+    gprint (GP_ERR, "       type is int, float, char, str, time, date, hms\n");
     gprint (GP_ERR, "       for char, values are placed into a list $name:0 - $name:n\n");
     gprint (GP_ERR, "       for str, values are placed into a string-typed vector\n");
+    gprint (GP_ERR, "       for hms, values are sexigesimal values HH:MM:SS (good for degrees as well)\n");
+    gprint (GP_ERR, "       for date, values are human-readable date strings YYYY/MM/DD\n");
     gprint (GP_ERR, "       for time, values are human-readable date/time strings YYYY/MM/DD,hh:mm:ss\n");
-    gprint (GP_ERR, "       the resulting vector is a float based on the TIMEFORMAT, TIMEREF values\n");
+    gprint (GP_ERR, "         date & time values are stored as a float using the TIMEFORMAT, TIMEREF values for the conversion\n");
 
     gprint (GP_ERR, "     -fits options:\n");
@@ -154,5 +156,7 @@
       if (!strcasecmp(ptr, "char"))  { coltype[i] = COLTYPE_CHAR; }
       if (!strcasecmp(ptr, "str"))   { coltype[i] = COLTYPE_STR; }
+      if (!strcasecmp(ptr, "date"))  { coltype[i] = COLTYPE_DATE; }
       if (!strcasecmp(ptr, "time"))  { coltype[i] = COLTYPE_TIME; }
+      if (!strcasecmp(ptr, "hms"))   { coltype[i] = COLTYPE_HMS; }
       if (!coltype[i]) goto bad_colname;
     }
@@ -212,6 +216,7 @@
 	break;
       case COLTYPE_FLT:
+      case COLTYPE_HMS:
       case COLTYPE_TIME:
-	// note that COLTYPE_TIME is a type of float
+      case COLTYPE_DATE:
 	ResetVector (vec[i], OPIHI_FLT, NELEM);
 	break;
@@ -292,4 +297,5 @@
 	time_t tvalue;
 	int readStatus = FALSE;
+	int dataStatus = FALSE;
 	// need to make the if cases for coltype[i]
 	switch (coltype[i]) {
@@ -341,4 +347,29 @@
 	    vec[i][0].elements.Flt[Nelem] = readStatus ? dvalue : NAN;
 	    break;
+	  case COLTYPE_DATE: {
+	    char *string = NULL;
+	    if (IsCSV) {
+	      char *ptr = ptrparse_csv (col[i], c0);
+	      string = strcreate (ptr); // create separate string (NULL-safe)
+	      ptr = (string == NULL) ? NULL : strchr (string, ',');
+	      if (ptr != NULL) *ptr = 0; // place an EOL here so parsing does not go past the comma
+	    } else {
+	      char *ptr = ptrparse (col[i], c0); // NULL-safe
+	      string = getword (ptr); // NULL-safe
+	    }	      
+	    tvalue = ohana_date_to_sec (string); // NULL-safe (returns 0)
+	    dvalue = TimeValue (tvalue, TimeReference, TimeFormat);
+	    vec[i][0].elements.Flt[Nelem] = string ? dvalue : NAN;
+	    FREE (string);
+	    break;
+	  }
+	  case COLTYPE_HMS: {
+	    char *ptr = IsCSV ? ptrparse_csv (col[i], c0) : ptrparse (col[i], c0);
+	    char *string = strcreate (ptr); // make a copy so we can munge it in ohana_dms_to_ddd
+	    dataStatus = ohana_dms_to_ddd (&dvalue, string);
+	    vec[i][0].elements.Flt[Nelem] = ((string != NULL) && dataStatus) ? dvalue : NAN;
+	    FREE (string);
+	    break;
+	  }
 	}
 	if (!readStatus && VERBOSE) {
@@ -366,5 +397,7 @@
 	      break;
 	    case COLTYPE_FLT:
+	    case COLTYPE_HMS:
 	    case COLTYPE_TIME:
+	    case COLTYPE_DATE:
 	      ResetVector (vec[i], OPIHI_FLT, NELEM);
 	      break;
@@ -390,5 +423,7 @@
 	break;
       case COLTYPE_FLT:
+      case COLTYPE_HMS:
       case COLTYPE_TIME:
+      case COLTYPE_DATE:
 	ResetVector (vec[i], OPIHI_FLT, Nelem);
 	break;
