Index: /trunk/ippTools/src/chiptool.c
===================================================================
--- /trunk/ippTools/src/chiptool.c	(revision 7847)
+++ /trunk/ippTools/src/chiptool.c	(revision 7848)
@@ -13,41 +13,37 @@
 static bool doneMode(pxConfig *config);
 
+# define MODECASE(caseName, func) \
+    case caseName: \
+    if (!func(config)) { \
+        goto FAIL; \
+    } \
+    break;
+
 int main(int argc, char **argv) {
+    psLibInit(NULL);
+
     pxConfig *config = p2searchConfig(NULL, argc, argv);
 
     switch (config->mode) {
-        case PX_MODE_QUICK:
-            if (!quickMode(config)) {
-                exit(EXIT_FAILURE);
-            }
-            break;
-        case PX_MODE_DEFINE:
-            if (!defineMode(config)) {
-                exit(EXIT_FAILURE);
-            }
-            break;
-        case PX_MODE_PENDING:
-            if (!pendingMode(config)) {
-                exit(EXIT_FAILURE);
-            }
-            break;
-    /*
-    if (config.mode == PX_MODE_UPDATE) {
-        bool status = p2updatePendingFrames(&config, pendingFrames);
-        if (!status) {
-            psAbort(argv[0], "p2updatePendingFrames() failed");
-        }
-    }
-    */
-        case PX_MODE_DONE:
-            if (!doneMode(config)) {
-                exit(EXIT_FAILURE);
-            }
-            break;
+        MODECASE(P2SEARCH_MODE_QUICK, quickMode);
+        MODECASE(P2SEARCH_MODE_DEFINE, defineMode);
+        MODECASE(P2SEARCH_MODE_PENDING, pendingMode);
+        MODECASE(P2SEARCH_MODE_DONE, doneMode);
         default:
             psAbort(argv[0], "invalid option (this should not happen)");
     }
 
+    psFree(config);
+    pmConfigDone();
+    psLibFinalize();
+
     exit(EXIT_SUCCESS);
+
+FAIL:
+    psFree(config);
+    pmConfigDone();
+    psLibFinalize();
+
+    exit(EXIT_FAILURE);
 }
 
Index: /trunk/ippTools/src/chiptool.h
===================================================================
--- /trunk/ippTools/src/chiptool.h	(revision 7847)
+++ /trunk/ippTools/src/chiptool.h	(revision 7848)
@@ -4,4 +4,12 @@
 #include "pxtools.h"
 
+typedef enum {
+    P2SEARCH_MODE_NONE      = 0x0,
+    P2SEARCH_MODE_QUICK,
+    P2SEARCH_MODE_DEFINE,
+    P2SEARCH_MODE_PENDING,
+    P2SEARCH_MODE_DONE
+} p2searchMode;
+
 pxConfig *p2searchConfig(pxConfig *config, int argc, char **argv);
 
Index: /trunk/ippTools/src/chiptoolConfig.c
===================================================================
--- /trunk/ippTools/src/chiptoolConfig.c	(revision 7847)
+++ /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);
 }
