Index: /trunk/ippTools/src/dettoolConfig.c
===================================================================
--- /trunk/ippTools/src/dettoolConfig.c	(revision 7814)
+++ /trunk/ippTools/src/dettoolConfig.c	(revision 7815)
@@ -282,14 +282,5 @@
 
     // find which mode we're running under
-    int N = 0;
-    config->mode = DETTOOL_MODE_NONE;
-    if ((N = psArgumentGet (argc, argv, "-define"))) {
-        psArgumentRemove (N, &argc, argv);
-        if (config->mode) {
-            psError(PS_ERR_UNKNOWN, true, "only one mode selection is allowed");
-        }
-        config->mode = DETTOOL_MODE_DEFINE;
-        config->args = psMemIncrRefCounter(defineArgs);
-    }
+    PXTOOL_MODE("-define",          DETTOOL_MODE_DEFINE,        defineArgs);
     PXTOOL_MODE("-raw",             DETTOOL_MODE_RAW,           rawArgs);
     PXTOOL_MODE("-runs",            DETTOOL_MODE_RUNS,          runsArgs);
Index: /trunk/ippTools/src/regtool.c
===================================================================
--- /trunk/ippTools/src/regtool.c	(revision 7814)
+++ /trunk/ippTools/src/regtool.c	(revision 7815)
@@ -14,27 +14,35 @@
 static p2PendingExpRow *newToP2PendingExp(newExpRow *newExp);
 
+# define MODECASE(caseName, func) \
+    case caseName: \
+    if (!func(config)) { \
+        goto FAIL; \
+    } \
+    break;
+
 int main(int argc, char **argv)
 {
+    psLibInit(NULL);
+
     pxConfig *config = p0searchConfig(NULL, argc, argv);
 
     switch (config->mode) {
-        case PX_MODE_PENDING:
-            if (!pendingMode(config)) {
-                goto FAIL;
-            }
-            break;
-        case PX_MODE_UPDATE:
-            if (!updateMode(config)) {
-                goto FAIL;
-            }
-            break;
+        MODECASE(P0SEARCH_MODE_PENDING, pendingMode);
+        MODECASE(P0SEARCH_MODE_UPDATE, updateMode);
         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/regtool.h
===================================================================
--- /trunk/ippTools/src/regtool.h	(revision 7814)
+++ /trunk/ippTools/src/regtool.h	(revision 7815)
@@ -4,4 +4,10 @@
 #include "pxtools.h"
 
+typedef enum {
+    P0SEARCH_MODE_NODE      = 0x0,
+    P0SEARCH_MODE_PENDING,
+    P0SEARCH_MODE_UPDATE
+} p0searchMode;
+
 pxConfig *p0searchConfig(pxConfig *config, int argc, char **argv);
 
Index: /trunk/ippTools/src/regtoolConfig.c
===================================================================
--- /trunk/ippTools/src/regtoolConfig.c	(revision 7814)
+++ /trunk/ippTools/src/regtoolConfig.c	(revision 7815)
@@ -6,5 +6,7 @@
 
 #include "pxtools.h"
-
+#include "dettool.h"
+
+// this function can not fail -- exits on error
 bool p0searchConfig(pxConfig *config, int argc, char **argv) {
     if (!config) {
@@ -12,38 +14,13 @@
     }
 
-    config->modules = pmConfigRead(&argc, argv);
-
-    if (! config->modules) {
-        psError(PS_ERR_UNKNOWN, false, "Can't find site configuration!\n");
-        exit(EXIT_FAILURE);
-    }
-
-    int N;
-    config->mode = PX_MODE_NONE;
-    if ((N = psArgumentGet (argc, argv, "-pending"))) {
-        psArgumentRemove (N, &argc, argv);
-        if (config->mode) {
-            psError(PS_ERR_UNKNOWN, true, "only one mode selection is allowed");
-        }
-        config->mode = PX_MODE_PENDING;
-    }
-    if ((N = psArgumentGet (argc, argv, "-update"))) {
-        psArgumentRemove (N, &argc, argv);
-        if (config->mode) {
-            psError(PS_ERR_UNKNOWN, true, "only one mode selection is allowed");
-        }
-        config->mode = PX_MODE_UPDATE;
-    }
-
-    // paul's argument parsing convention requires: -key value
-    // Parse other command-line arguments
-    psMetadata *args = psMetadataAlloc();
-    psMetadataAddStr(args , PS_LIST_TAIL, "-pending", 0,
-        "examine pending image table, write ppImage output", "");
-    psMetadataAddStr(args , PS_LIST_TAIL, "-update",  0,
-        "update pending image table", "");
-
-
-    // -pending search
+    // setup site config
+    config->modules = pmConfigRead(argc, argv);
+    if (!config->modules) {
+        psError(PS_ERR_UNKNOWN, false, "Can't find site configuration");
+        goto FAIL;
+    }
+    argc = config->argc;
+
+    // -pending
     psMetadata *pendingArgs = psMetadataAlloc();
     psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-exp_id",  0,
@@ -59,5 +36,5 @@
 
 
-    // -update inputs
+    // -update
     psMetadata *updateArgs = psMetadataAlloc();
     psMetadataAddStr(updateArgs, PS_LIST_TAIL, "-exp_id",  0,
@@ -72,6 +49,21 @@
         "define URL", "");
 
+#define PXTOOL_MODE(option, modeval, argset) \
+    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); \
+    }
+
+    // find which mode we're running under
+    PXTOOL_MODE("-pending",     P0SEARCH_MODE_PENDING,      pendingArgs);
+    PXTOOL_MODE("-update",      P0SEARCH_MODE_UPDATE,       updatergs);
+
+
     bool argErr = false;
-    if (config->mode == PX_MODE_NONE) {
+    if (config->mode == P0SEARCH_MODE_NONE) {
         argErr = true;
         fprintf (stderr, "mode argument is required\n");
@@ -83,21 +75,37 @@
     if (argErr) {
         printf("\nPan-STARRS Phase 0 Search Tool\n");
-        printf("Usage: %s <mode> [<options>]\n\n", argv[0]);
+        printf("Usage: %s <mode> [-update|-pending]\n\n", argv[0]);
         printf(" <mode> : -pending | -update\n\n");
         fprintf (stdout, "-pending ");
         psArgumentHelp(pendingArgs);
+        psFree(pendingArgs);
         fprintf (stdout, "-update ");
         psArgumentHelp(updateArgs);
-        psFree(args);
-        psFree(pendingArgs);
         psFree(updateArgs);
-        exit(EXIT_FAILURE);
-    }
-
-    // XXX why is "" being returned when -[foo] isn't specified?
-#define EMPTY_TO_NULL_STRING(var) \
-    if (var != NULL && strcmp(var, "") == 0) { \
-        var = NULL; \
-    }
+
+        goto FAIL;
+    }
+
+    psFree(pendingArgs);
+    psFree(updateArgs);
+
+    // setup search criterion
+#define addWhereStr(name) \
+    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();
+
+{
+    psString str = NULL;
+    int n = 0;
+    bool status = false;
+    bool boolean = false;
+
 
     switch (config->mode) {
@@ -196,7 +204,18 @@
     if (!config->dbh) {
         psError(PS_ERR_UNKNOWN, false, "Can't configure database");
-        exit(EXIT_FAILURE);
-    }
-
-    return true;
+        goto FAIL;
+    }
+
+    // save argv/argc
+    config->argv = argv;
+    config->argc = argc;
+
+
+    return config;
+
+FAIL:
+    psFree(config);
+    pmConfigDone();
+    psLibFinalize();
+    exit(EXIT_FAILURE);
 }
