Index: trunk/ppstamp/src/ppstampArguments.c
===================================================================
--- trunk/ppstamp/src/ppstampArguments.c	(revision 15323)
+++ trunk/ppstamp/src/ppstampArguments.c	(revision 15363)
@@ -6,8 +6,6 @@
 #include "ohana.h"
 
-static bool get2Angles(int argnum, int *pArgc, char **argv, bool bothDegrees, double *p1, double *p2);
-static bool get2Ints(int argnum, int *pArgc, char **argv, int *p1, int *p2);
-
-// XXX This usage output is kind of busy
+static bool get2Angles(int argnum, int *pArgc, char **argv, bool bothDegrees, bool makePositive, double *p1, double *p2);
+static bool get2Ints(int argnum, int *pArgc, char **argv, bool makePositive, int *p1, int *p2);
 
 static void usage (void)
@@ -15,14 +13,12 @@
     fprintf(stderr, "\n");
 
-    fprintf(stderr, "USAGE: ppstamp -celcenter RA DEC -arcrange dRA dDEC [-file INPUT.fits] [-list INPUT.txt] OUTPUT\n");
-    fprintf(stderr, "       ppstamp -celcenter RA DEC -celrange dRA dDEC [-file INPUT.fits] [-list INPUT.txt] OUTPUT\n");
-    fprintf(stderr, "       ppstamp -celcenter RA DEC -pixrange dx dy    [-file INPUT.fits] [-list INPUT.txt] OUTPUT\n");
-    fprintf(stderr, "       ppstamp -pixcenter x y    -pixrange dx dy    -chip chipname [-file INPUT.fits] [-list INPUT.txt] OUTPUT\n");
-    fprintf(stderr, "       ppstamp -pixcenter x y    -arcrange dRA dDEC -chip chipname [-file INPUT.fits] [-list INPUT.txt] OUTPUT\n");
-    fprintf(stderr, "       ppstamp -pixcenter x y    -celrange dRA dDEC -chip chipname [-file INPUT.fits] [-list INPUT.txt] OUTPUT\n");
-    fprintf(stderr, "\n");
-
-    fprintf(stderr, "celcenter & celrange may be specified in HH:MM:SS DD:MM:SS or as 2 values in decimal degrees\n");
-    fprintf(stderr, "arcrange may be specfied as 2 values DD:MM:SS DD:MM:SS or decimal degrees\n");
+    fprintf(stderr, "USAGE: ppstamp -skycenter RA DEC -pixrange dx dy    [-file INPUT.fits] [-list INPUT.txt] OUTPUT\n");
+    fprintf(stderr, "       ppstamp -skycenter RA DEC -arcrange dRA dDEC [-file INPUT.fits] [-list INPUT.txt] OUTPUT\n");
+    fprintf(stderr, "       ppstamp -pixcenter x y    -pixrange dx dy    [-chip chipname] [-file INPUT.fits] [-list INPUT.txt] OUTPUT\n");
+    fprintf(stderr, "       ppstamp -pixcenter x y    -arcrange dRA dDEC [-chip chipname] [-file INPUT.fits] [-list INPUT.txt] OUTPUT\n");
+    fprintf(stderr, "\n");
+
+    fprintf(stderr, "-skycenter is specified as HH:MM:SS DD:MM:SS or decimal degrees\n");
+    fprintf(stderr, "-arcrange values are seconds of arc\n");
     fprintf(stderr, "\n");
     fprintf(stderr, "Optional arguments:\n");
@@ -55,6 +51,6 @@
     pmConfig *config = pmConfigRead(&argc, argv, NULL);
     if (config == NULL) {
-        psErrorStackPrint(stderr, "Can't find site configuration!\n");
-        exit(EXIT_FAILURE);
+        psError(PPSTAMP_ERR_CONFIG, false, "Can't read site configuration!\n");
+        return(NULL);
     }
 
@@ -67,13 +63,16 @@
         psArgumentRemove(argnum, &argc, argv);
 
-        if (!get2Ints(argnum, &argc, argv, &options->centerX, &options->centerY)) {
-            psError(PS_ERR_BAD_PARAMETER_VALUE, true, "invalid pixcenter specification\n");
-            usage();
-        }
-    }
-
-    if ((argnum = psArgumentGet(argc, argv, "-celcenter"))) {
+        if (!get2Ints(argnum, &argc, argv, false, &options->centerX, &options->centerY)) {
+            psError(PPSTAMP_ERR_ARGUMENTS, true, "invalid pixcenter specification: %s %s\n",
+                argv[argnum], argv[argnum+1]);
+            usage();
+        }
+        psArgumentRemove(argnum, &argc, argv);
+        psArgumentRemove(argnum, &argc, argv);
+    }
+
+    if ((argnum = psArgumentGet(argc, argv, "-skycenter"))) {
         if (gotCenter) {
-            psError(PS_ERR_BAD_PARAMETER_VALUE, true, "can't specify both -pixcenter and -celcenter\n");;
+            psError(PPSTAMP_ERR_ARGUMENTS, true, "can't specify both -pixcenter and -skycenter\n");;
             usage();
         }
@@ -81,7 +80,11 @@
 
         double raDeg, decDeg;
-        if (!get2Angles(argnum, &argc, argv, false, &raDeg, &decDeg)) {
-            usage();
-        }
+        if (!get2Angles(argnum, &argc, argv, false, false, &raDeg, &decDeg)) {
+            psError(PPSTAMP_ERR_ARGUMENTS, true, "invalid skycenter specification: %s %s\n",
+                argv[argnum], argv[argnum+1]);
+            usage();
+        }
+        psArgumentRemove(argnum, &argc, argv);
+        psArgumentRemove(argnum, &argc, argv);
         options->centerRA  = DEG_TO_RAD(raDeg);
         options->centerDEC = DEG_TO_RAD(decDeg);
@@ -91,5 +94,5 @@
 
     if (!gotCenter) {
-        psError(PS_ERR_BAD_PARAMETER_VALUE, true, "must specify center of region of interest\n");
+        psError(PPSTAMP_ERR_ARGUMENTS, true, "must specify center of region of interest\n");
         usage();
     }
@@ -99,12 +102,16 @@
         options->celestialRange = false;
         psArgumentRemove(argnum, &argc, argv);
-        if (!get2Ints(argnum, &argc, argv, &options->dX, &options->dY)) {
-            usage();
-        }
+        if (!get2Ints(argnum, &argc, argv, true, &options->dX, &options->dY)) {
+            psError(PPSTAMP_ERR_ARGUMENTS, true, "invalid pixrange specification: %s %s\n",
+                argv[argnum], argv[argnum+1]);
+            usage();
+        }
+        psArgumentRemove(argnum, &argc, argv);
+        psArgumentRemove(argnum, &argc, argv);
     }
 
     if ((argnum = psArgumentGet(argc, argv, "-arcrange"))) {
         if (gotRange) {
-            psError(PS_ERR_BAD_PARAMETER_VALUE, true, "specify only one of -pixrange or -arcrange or -celrange\n");;
+            psError(PPSTAMP_ERR_ARGUMENTS, true, "specify only one of -pixrange or -arcrange\n");;
             usage();
         }
@@ -113,30 +120,35 @@
         options->celestialRange = true;
 
+        // arcrange values are seconds of arc
+        options->dRA  = DEG_TO_RAD(atof(argv[argnum]) * 3600.);
+        options->dDEC = DEG_TO_RAD(atof(argv[argnum+1]) * 3600.);
+
+        psArgumentRemove(argnum, &argc, argv);
+        psArgumentRemove(argnum, &argc, argv);
+    }
+    // I'm leaving in the -celrange option (HH:MM:SS DD:MM:SS), but not publicizing it
+    if ((argnum = psArgumentGet(argc, argv, "-celrange"))) {
+        if (gotRange) {
+            psError(PPSTAMP_ERR_ARGUMENTS, true, "specify one of -pixrange, -arcrange, or -celrange\n");;
+            usage();
+        }
+        psArgumentRemove(argnum, &argc, argv);
+        gotRange = true;
+        options->celestialRange = true;
+
         double deg1, deg2;
-        if (!get2Angles(argnum, &argc, argv, true, &deg1, &deg2)) {
-            usage();
-        }
+        if (!get2Angles(argnum, &argc, argv, false, true, &deg1, &deg2)) {
+            psError(PPSTAMP_ERR_ARGUMENTS, true, "invalid celrange specification: %s %s\n",
+                argv[argnum], argv[argnum+1]);
+            usage();
+        }
+        psArgumentRemove(argnum, &argc, argv);
+        psArgumentRemove(argnum, &argc, argv);
         options->dRA = DEG_TO_RAD(deg1);
         options->dDEC = DEG_TO_RAD(deg2);
     }
-    if ((argnum = psArgumentGet(argc, argv, "-celrange"))) {
-        if (gotRange) {
-            psError(PS_ERR_BAD_PARAMETER_VALUE, true, "specify one of -pixrange or -arcrange or -celrange\n");;
-            usage();
-        }
-        psArgumentRemove(argnum, &argc, argv);
-        gotRange = true;
-        options->celestialRange = true;
-
-        double deg1, deg2;
-        if (!get2Angles(argnum, &argc, argv, false, &deg1, &deg2)) {
-            usage();
-        }
-        options->dRA = DEG_TO_RAD(deg1);
-        options->dDEC = DEG_TO_RAD(deg2);
-    }
 
     if (!gotRange) {
-        psError(PS_ERR_BAD_PARAMETER_VALUE, true, "must specify range\n");
+        psError(PPSTAMP_ERR_ARGUMENTS, true, "must specify range\n");
         usage();
     }
@@ -151,16 +163,18 @@
     bool status = pmConfigFileSetsMD (config->arguments, &argc, argv, "INPUT", "-file", "-list");
     if (!status) {
-        // TODO: shall we print a specific message?
-        psError(PS_ERR_BAD_PARAMETER_VALUE, true, "must specify INPUT\n");
-        usage ();
+        psError(PPSTAMP_ERR_ARGUMENTS, true, "must specify INPUT\n");
+        usage();
     }
 
     // finally the output file
-    if (argc != 2) {
-        psError(PS_ERR_BAD_PARAMETER_VALUE, true, "must specify OUTPUT\n");
-        usage ();
-    }
-
-    // Add the input and output images (which remain on the command-line) to the arguments list
+    if (argc < 2) {
+        psError(PPSTAMP_ERR_ARGUMENTS, true, "must specify OUTPUT\n");
+        usage();
+    } else if (argc > 2) {
+        psError(PPSTAMP_ERR_ARGUMENTS, true, "unknown argument(s)\n");
+        usage();
+    }
+
+    // Add the output image (which remains on the command-line) to the arguments list
     psMetadataAddStr(config->arguments, PS_LIST_TAIL, "OUTPUT", 0, "Name of the output image", argv[1]);
 
@@ -173,4 +187,5 @@
 {
     char *p = string;
+
     if ((*p == '+') || (*p == '-')) {
         p++;
@@ -179,5 +194,5 @@
 }
 
-static bool get2Ints(int argnum, int *pArgc, char **argv, int *p1, int *p2)
+static bool get2Ints(int argnum, int *pArgc, char **argv, bool makePositive, int *p1, int *p2)
 {
     if (*pArgc < 2) {
@@ -188,19 +203,21 @@
         return false;
     }
-
     *p1 = atoi(argv[argnum]);
-    psArgumentRemove(argnum, pArgc, argv);
-
-    if (!validNumber(argv[argnum])) {
+
+    if (!validNumber(argv[argnum+1])) {
         return false;
     }
-
-    *p2 = atoi(argv[argnum]);
-    psArgumentRemove(argnum, pArgc, argv);
+    *p2 = atoi(argv[argnum+1]);
+
+    if (makePositive) {
+        *p1 = abs(*p1);
+        *p2 = abs(*p2);
+    }
 
     return true;
 }
 
-static bool get2Angles(int argnum, int *pArgc, char **argv, bool bothInDegrees, double *p1, double *p2)
+static bool get2Angles(int argnum, int *pArgc, char **argv, bool bothInDegrees, bool makePositive,
+    double *p1, double *p2)
 {
     bool rval;
@@ -221,6 +238,8 @@
     }
 
-    psArgumentRemove(argnum, pArgc, argv);
-    psArgumentRemove(argnum, pArgc, argv);
+    if (rval && makePositive) {
+        *p1 = abs(*p1);
+        *p2 = abs(*p2);
+    }
 
     return rval;
