Index: trunk/ippTools/src/chiptoolConfig.c
===================================================================
--- trunk/ippTools/src/chiptoolConfig.c	(revision 7037)
+++ trunk/ippTools/src/chiptoolConfig.c	(revision 7848)
@@ -6,6 +6,8 @@
 
 #include "pxtools.h"
+#include "p2search.h"
 
-bool p2searchConfig(pxConfig *config, int argc, char **argv) {
+// this function can not fail -- exits on error
+pxConfig *p2searchConfig(pxConfig *config, int argc, char **argv) {
     if (!config) {
         config = pxConfigAlloc();
@@ -14,128 +16,113 @@
     config->modules = pmConfigRead(&argc, argv);
     if (! config->modules) {
-        psErrorStackPrint(stderr, "Can't find site configuration!\n");
-        exit(EXIT_FAILURE);
+        psError(PS_ERR_UNKNOWN, false, "Can't find site configuration");
+        goto FAIL;
     }
 
-    // Parse other command-line arguments
-    psMetadata *arguments = psMetadataAlloc(); // The arguments, with default values
+    // -quick
+    psMetadata *quickArgs = psMetadataAlloc();
+    
+    // -define
+    psMetadata *defineArgs = psMetadataAlloc();
 
-    int N;
-    config->mode = PX_MODE_NONE;
-    if ((N = psArgumentGet (argc, argv, "-quick"))) {
-        psArgumentRemove (N, &argc, argv);
-        if (config->mode) {
-            psAbort (argv[0], "only one mode selection is allowed");
-        }
-        config->mode = PX_MODE_QUICK;
-    }
-    if ((N = psArgumentGet (argc, argv, "-define"))) {
-        psArgumentRemove (N, &argc, argv);
-        if (config->mode) {
-            psAbort (argv[0], "only one mode selection is allowed");
-        }
-        config->mode = PX_MODE_DEFINE;
-    }
-    if ((N = psArgumentGet (argc, argv, "-pending"))) {
-        psArgumentRemove (N, &argc, argv);
-        if (config->mode) {
-            psAbort (argv[0], "only one mode selection is allowed");
-        }
-        config->mode = PX_MODE_PENDING;
-    }
-    /*
-    if ((N = psArgumentGet (argc, argv, "-update"))) {
-        psArgumentRemove (N, &argc, argv);
-        if (config->mode) {
-            psAbort (argv[0], "only one mode selection is allowed");
-        }
-        config->mode = PX_MODE_UPDATE;
-    }
-    */
-    if ((N = psArgumentGet (argc, argv, "-done"))) {
-        psArgumentRemove (N, &argc, argv);
-        if (config->mode) {
-            psAbort (argv[0], "only one mode selection is allowed");
-        }
-        config->mode = PX_MODE_DONE;
+    // -pending
+    psMetadata *pendingArgs = psMetadataAlloc();
+    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-inst",  0, "define camera of interest", "");
+    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-filter",  0, "define filter of interest", "");
+    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-exp_id",  0, "define exposure ID", "");
+    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-class",  0, "define class", "");
+    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-class_id",  0, "define class ID", "");
+    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-uri",  0, "define URL", "");
+ 
+    // -done
+    psMetadata *doneArgs = psMetadataAlloc();
+
+#define PXTOOL_MODE(option, modeval, argset) \
+{ \
+    int N = 0; \
+    if ((N = psArgumentGet (argc, argv, option))) { \
+        psArgumentRemove (N, &argc, argv); \
+        if (config->mode) { \
+            psError(PS_ERR_UNKNOWN, true, "only one mode selection is allowed"); \
+        } \
+        config->mode = modeval; \
+        config->args = psMemIncrRefCounter(argset); \
+    } \
+}
+
+    PXTOOL_MODE("-quick",       P2SEARCH_MODE_QUICK,        quickArgs);
+    PXTOOL_MODE("-define",      P2SEARCH_MODE_DEFINE,       defineArgs);
+    PXTOOL_MODE("-pending",     P2SEARCH_MODE_PENDING,      pendingArgs);
+    PXTOOL_MODE("-done",        P2SEARCH_MODE_DONE,         doneArgs);
+
+    bool argErr = false;
+    if (config->mode == P2SEARCH_MODE_NONE) {
+            argErr = true;
+        fprintf (stderr, "mode argument is required\n");
+    } else if (! psArgumentParse(config->args, &argc, argv) || argc != 1) {
+        argErr = true;
+        fprintf (stderr, "error parsing arguments\n");
     }
 
-    // paul's argument parsing convention requires: -key value
-    psMetadataAddBool(arguments, PS_LIST_TAIL, "-quick",   0, "examine raw image table, write ppImage output", false);
-    psMetadataAddStr(arguments, PS_LIST_TAIL, "-define",  0, "examine raw image table, add to pending image table", "");
-    psMetadataAddStr(arguments, PS_LIST_TAIL, "-pending", 0, "examine pending image table, write ppImage output", "");
-//    psMetadataAddStr(arguments, PS_LIST_TAIL, "-update",  0, "update pending image table", "");
-    psMetadataAddStr(arguments, PS_LIST_TAIL, "-done",  0, "mov image from pending to done table", "");
-//    psMetadataAddStr(arguments, PS_LIST_TAIL, "-time",    0, "define time range of interest", "");
-    psMetadataAddStr(arguments, PS_LIST_TAIL, "-inst",  0, "define camera of interest", "");
-    psMetadataAddStr(arguments, PS_LIST_TAIL, "-filter",  0, "define filter of interest", "");
-    psMetadataAddStr(arguments, PS_LIST_TAIL, "-exp_id",  0, "define exposure ID", "");
-    psMetadataAddStr(arguments, PS_LIST_TAIL, "-class",  0, "define class", "");
-    psMetadataAddStr(arguments, PS_LIST_TAIL, "-class_id",  0, "define class ID", "");
-    psMetadataAddStr(arguments, PS_LIST_TAIL, "-uri",  0, "define URL", "");
+    if (argErr) {
+        printf("\nPan-STARRS Phase 2 Search Tool\n\n");
+        printf("Usage: %s [mode] [options]\n\n", argv[0]);
+        printf(" [mode] : -quick | -define | -pending | -done\n\n");
+        fprintf (stdout, "-quick ");
+        psArgumentHelp(quickArgs);
+        psFree(quickArgs);
+        fprintf (stdout, "-define ");
+        psArgumentHelp(defineArgs);
+        psFree(defineArgs);
+        fprintf (stdout, "-pending ");
+        psArgumentHelp(pendingArgs);
+        psFree(pendingArgs);
+        fprintf (stdout, "-done ");
+        psArgumentHelp(doneArgs);
+        psFree(doneArgs);
 
-    if (config->mode == PX_MODE_NONE) {
-        fprintf (stderr, "search mode not specified\n");
-        psArgumentHelp(arguments);
-        psFree(arguments);
-        exit(EXIT_FAILURE);
+        goto FAIL;
     }
 
-    if (! psArgumentParse(arguments, &argc, argv) || argc != 1) {
-        printf("\nPan-STARRS Phase 2 Search Tool\n\n");
-        printf("Usage: %s [mode] [options]\n\n", argv[0]);
-        printf(" [mode] : -quick | -define | -pending | -donee\n\n");
-        psArgumentHelp(arguments);
-        psFree(arguments);
-        exit(EXIT_FAILURE);
+    psFree(quickArgs)
+    psFree(defineArgs)
+    psFree(pendingArgs)
+    psFree(doneArgs)
+
+    // setup search criterion
+#define addWhereStr(name) \
+{ \
+    psString str = NULL; \
+    bool status = false; \
+    if ((str = psMetadataLookupStr(&status, config->args, "-" #name))) { \
+        if (!psMetadataAddStr(config->where, PS_LIST_TAIL, #name, 0, "==", str)) {\
+            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
+            goto FAIL; \
+        } \
+    } \
+}
+
+
+
+    // generate SQL where claus
+    config->where = psMetadataAlloc();
+
+    addWhereStr(exp_id);
+    // convert '-inst' to 'camera'
+    {
+        psString str = NULL;
+        bool status = false;
+        if ((str = psMetadataLookupStr(&status, config->args, "-inst"))) {
+            if (!psMetadataAddStr(config->where, PS_LIST_TAIL, "camera", 0, "==", str)) {
+                psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
+                goto FAIL;
+            }
+        }
     }
 
-    bool status;
-    config->camera_name = psMetadataLookupStr(&status, arguments,
-        "-inst");
-    config->exp_id = psMetadataLookupStr(&status, arguments, "-exp_id");
-    config->class = psMetadataLookupStr(&status, arguments, "-class");
-    config->class_id = psMetadataLookupStr(&status, arguments,
-        "-class_id");
-    config->uri = psMetadataLookupStr(&status, arguments, "-uri");
 
-    // XXX why is "" being returned when -[foo] isn't specified?
-#define EMPTY_TO_NULL_STRING(var) \
-    if (strcmp(var, "") == 0) { \
-        var = NULL; \
-    }
-
-    EMPTY_TO_NULL_STRING(config->camera_name);
-    EMPTY_TO_NULL_STRING(config->exp_id);
-    EMPTY_TO_NULL_STRING(config->class);
-    EMPTY_TO_NULL_STRING(config->class_id);
-    EMPTY_TO_NULL_STRING(config->uri);
-
-    psMetadata *where = psMetadataAlloc();
-
-    if (config->camera_name != NULL) {
-        if (!psMetadataAddStr(where, PS_LIST_TAIL, "camera", 0, "==",
-            config->camera_name)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
-            psFree(where);
-            return NULL;
-        }
-    }
-    if (config->filter != NULL) {
-        psMetadataAddStr(where, PS_LIST_TAIL, "filter", 0, "==",
-            config->filter);
-    }
-    if (config->exp_id != NULL) {
-        psMetadataAddStr(where, PS_LIST_TAIL, "exp_id", 0, "==",
-            config->exp_id);
-    }
-    if (config->class != NULL) {
-        psMetadataAddStr(where, PS_LIST_TAIL, "class", 0, "==",
-            config->class);
-    }
-    if (config->class_id != NULL) {
-        psMetadataAddStr(where, PS_LIST_TAIL, "class_id", 0, "==",
-             config->class_id);
-    }
+    addWhereStr(filter);
+    addWhereStr(class);
+    addWhereStr(class_id);
 
     /*
@@ -147,14 +134,8 @@
     */
 
-    if (where->list->n < 1) {
-        psFree(where);
-        where = NULL;
+    if (config->where->list->n < 1) {
+        psFree(config->where);
+        config->where = NULL;
     }
-
-    config->where = where;
-
-
-    // add the input and output images to the arguments list
-    //psMetadataAddStr (arguments, PS_LIST_TAIL, "-output", 0, "Name of the output image", argv[1]);
 
     // define Database handle, if used
@@ -162,7 +143,17 @@
     if (!config->dbh) {
         psError(PS_ERR_UNKNOWN, false, "Can't configure database");
-        exit(EXIT_FAILURE);
+        goto FAIL;
     }
 
-    return true;
+    // save argv/argc
+    config->argv = argv;
+    config->argc = argc;
+
+    return config;
+
+FAIL:
+    psFree(config);
+    pmConfigDone();
+    psLibFinalize();
+    exit(EXIT_FAILURE);
 }
