Index: trunk/Ohana/src/opihi/cmd.astro/coords.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/coords.c	(revision 11891)
+++ trunk/Ohana/src/opihi/cmd.astro/coords.c	(revision 12524)
@@ -1,13 +1,14 @@
 # include "astro.h"
 
-enum {NONE, SKY, PIXEL};
+enum {NONE, SKY, PIXEL, VECTOR, SCALAR};
 
 int coords (int argc, char **argv) {
 
-  int mode, N, Quiet;
-  double X, Y, R, D;
+  int i, mode, form, N, Quiet;
+  double Xin, Yin, Xout, Yout;
   char *MOSAIC;
   Coords coords, moscoords;
   Buffer *buf, *mosbuffer;
+  Vector *xvec, *yvec;
 
   MOSAIC = NULL;
@@ -28,10 +29,7 @@
   }
 
+  form = NONE;
   mode = NONE;
   if ((N = get_argument (argc, argv, "-p"))) {
-    remove_argument (N, &argc, argv);
-    X = atof(argv[N]);
-    remove_argument (N, &argc, argv);
-    Y = atof(argv[N]);
     remove_argument (N, &argc, argv);
     mode = SKY;
@@ -40,12 +38,24 @@
     if (mode == SKY) goto syntax;
     remove_argument (N, &argc, argv);
-    R = atof(argv[N]);
-    remove_argument (N, &argc, argv);
-    D = atof(argv[N]);
-    remove_argument (N, &argc, argv);
     mode = PIXEL;
   }
   if (mode == NONE) goto syntax;
-  if (argc != 2) goto syntax;
+  if (argc != 4) goto syntax;
+
+  if (SelectScalar (argv[2], &Xin)) {
+    if (!SelectScalar (argv[3], &Yin)) {
+      gprint (GP_ERR, "syntax error: mixed vector and scalar?\n");
+      return (FALSE);
+    }
+    form = SCALAR;
+  } else {
+    if ((xvec = SelectVector (argv[2], OLDVECTOR, TRUE)) == NULL) return (FALSE);
+    if ((yvec = SelectVector (argv[3], OLDVECTOR, TRUE)) == NULL) return (FALSE);
+    if (xvec[0].Nelements != yvec[0].Nelements) {
+      fprintf (stderr, "mis-matched vector lengths\n");
+      return (FALSE);
+    }
+    form = VECTOR;
+  }      
 
   if ((buf = SelectBuffer (argv[1], OLDBUFFER, TRUE)) == NULL) goto escape;
@@ -61,17 +71,30 @@
   }
   
+  if (form == SCALAR) {
+    if (mode == SKY) {
+      XY_to_RD (&Xout, &Yout, Xin, Yin, &coords);
+      if (!Quiet) gprint (GP_LOG, "%10.6f %10.6f\n", Xout, Yout);
+      set_variable ("RA", Xout);
+      set_variable ("DEC", Yout);
+      return (TRUE);
+    }
+    if (mode == PIXEL) {
+      RD_to_XY (&Xout, &Yout, Xin, Yin, &coords);
+      if (!Quiet) gprint (GP_LOG, "%7.2f %7.2f\n", Xout, Yout);
+      set_variable ("Xc", Xout);
+      set_variable ("Yc", Yout);
+      return (TRUE);
+    }
+  }
   if (mode == SKY) {
-    XY_to_RD (&R, &D, X, Y, &coords);
-    if (!Quiet) gprint (GP_LOG, "%10.6f %10.6f\n", R, D);
-    set_variable ("RA", R);
-    set_variable ("DEC", D);
+    for (i = 0; i < xvec[0].Nelements; i++) {
+      fXY_to_RD (&xvec[0].elements[i], &yvec[0].elements[i], xvec[0].elements[i], yvec[0].elements[i], &coords);
+    }
     return (TRUE);
   }
-    
   if (mode == PIXEL) {
-    RD_to_XY (&X, &Y, R, D, &coords);
-    if (!Quiet) gprint (GP_LOG, "%7.2f %7.2f\n", X, Y);
-    set_variable ("Xc", X);
-    set_variable ("Yc", Y);
+    for (i = 0; i < xvec[0].Nelements; i++) {
+      fRD_to_XY (&xvec[0].elements[i], &yvec[0].elements[i], xvec[0].elements[i], yvec[0].elements[i], &coords);
+    }
     return (TRUE);
   }
@@ -79,5 +102,5 @@
 
  syntax:
-  gprint (GP_ERR, "USAGE: coords [buffer] (-c R D) / (-p X Y)\n");
+  gprint (GP_ERR, "USAGE: coords [buffer] (-c R D) | (-p X Y)\n");
   gprint (GP_ERR, "only one of -p or -c can be used\n");
  escape:
