Index: /trunk/ippTools/src/guidetoolConfig.c
===================================================================
--- /trunk/ippTools/src/guidetoolConfig.c	(revision 6989)
+++ /trunk/ippTools/src/guidetoolConfig.c	(revision 6990)
@@ -7,39 +7,25 @@
 #include "pxtools.h"
 
-bool p1searchConfig(pxConfig *config, int argc, char **argv) {
+// this function can not fail -- exits on error
+
+pxConfig *p1searchConfig(pxConfig *config, int argc, char **argv) {
     if (!config) {
         config = pxConfigAlloc();
     }
 
-    if (! pmConfigRead(&config->site, &config->camera, &config->recipe, &argc, argv, RECIPE)) {
+    // setup site config
+    if (! pmConfigRead(&config->site, &config->camera, &config->recipe,
+        &argc, argv, RECIPE)) {
         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
+    // CLI options
+    // modes
     psMetadata *args = psMetadataAlloc();
     psMetadataAddStr(args , PS_LIST_TAIL, "-pending", 0,
         "examine pending image table, write ppImage output", "");
-    psMetadataAddStr(args , PS_LIST_TAIL, "-update",  0,
+    psMetadataAddStr(args , PS_LIST_TAIL, "-define",  0,
         "update pending image table", "");
-
 
     // -pending search
@@ -56,17 +42,47 @@
         "define class", "");
 
+    // -define inputs
+    psMetadata *defineArgs = psMetadataAlloc();
+    psMetadataAddStr(defineArgs, PS_LIST_TAIL, "-exp_id",  0,
+        "define class", "");
+    psMetadataAddStr(defineArgs, PS_LIST_TAIL, "-filter",  0,
+        "define filter of interest", "");
+    psMetadataAddStr(defineArgs, PS_LIST_TAIL, "-stat",  0,
+        "define URL", "");
+    psMetadataAddStr(defineArgs, PS_LIST_TAIL, "-recipe",  0,
+        "define URL", "");
+    psMetadataAddStr(defineArgs, PS_LIST_TAIL, "-mosiac",  0,
+        "define URL", "");
 
-    // -update inputs
-    psMetadata *updateArgs = psMetadataAlloc();
-    psMetadataAddStr(updateArgs, PS_LIST_TAIL, "-exp_id",  0,
-        "define class", "");
-    psMetadataAddStr(updateArgs, PS_LIST_TAIL, "-filter",  0,
-        "define filter of interest", "");
-    psMetadataAddStr(updateArgs, PS_LIST_TAIL, "-stat",  0,
-        "define URL", "");
-    psMetadataAddStr(updateArgs, PS_LIST_TAIL, "-recipe",  0,
-        "define URL", "");
-    psMetadataAddStr(updateArgs, PS_LIST_TAIL, "-mosiac",  0,
-        "define URL", "");
+    // find which mode we're running under
+    int N = 0;
+    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, "-define"))) {
+        psArgumentRemove (N, &argc, argv);
+        if (config->mode) {
+            psError(PS_ERR_UNKNOWN, true, "only one mode selection is allowed");
+        }
+        config->mode = PX_MODE_DEFINE;
+    }
+    
+    // parse CLI for these options
+    psMetadata *argSet = NULL;
+    switch (config->mode) {
+        case PX_MODE_PENDING:
+            argSet = pendingArgs;
+            break;
+        case PX_MODE_DEFINE:
+            argSet = defineArgs;
+            break;
+        default:
+            argSet = args;
+    }
 
     bool argErr = false;
@@ -74,5 +90,5 @@
         argErr = true;
         fprintf (stderr, "mode argument is required\n");
-    } else if (! psArgumentParse(args, &argc, argv) || argc != 1) {
+    } else if (! psArgumentParse(argSet, &argc, argv) || argc != 1) {
         argErr = true;
         fprintf (stderr, "error parsing arguments\n");
@@ -80,102 +96,59 @@
 
     if (argErr) {
-        printf("\nPan-STARRS Phase 0 Search Tool\n");
+        printf("\nPan-STARRS Phase 1 Search Tool\n");
         printf("Usage: %s <mode> [<options>]\n\n", argv[0]);
-        printf(" <mode> : -pending | -update\n\n");
+        printf(" <mode> : -pending | -define\n\n");
         fprintf (stdout, "-pending ");
         psArgumentHelp(pendingArgs);
-        fprintf (stdout, "-update ");
-        psArgumentHelp(updateArgs);
+        fprintf (stdout, "-define ");
+        psArgumentHelp(defineArgs);
         psFree(args);
         psFree(pendingArgs);
-        psFree(updateArgs);
+        psFree(defineArgs);
         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; \
-    }
-
-    switch (config->mode) {
-        bool status;
-        case PX_MODE_PENDING:
-            // -exp_id
-            config->exp_id = psMetadataLookupStr(&status, args, "-exp_id");
-            psMemIncrRefCounter(config->exp_id);
-            EMPTY_TO_NULL_STRING(config->exp_id);
-            // -inst
-            config->camera_name = psMetadataLookupStr(&status, args, "-inst");
-            psMemIncrRefCounter(config->camera_name);
-            EMPTY_TO_NULL_STRING(config->camera_name);
-            // -telescope
-            config->camera_name = psMetadataLookupStr(&status, args,
-                "-telescope");
-            psMemIncrRefCounter(config->telescope);
-            EMPTY_TO_NULL_STRING(config->telescope);
-            // -exp_type
-            config->class = psMetadataLookupStr(&status, args, "-exp_type");
-            psMemIncrRefCounter(config->exp_type);
-            EMPTY_TO_NULL_STRING(config->exp_type);
-            // -class
-            config->class = psMetadataLookupStr(&status, args, "-class");
-            psMemIncrRefCounter(config->class);
-            EMPTY_TO_NULL_STRING(config->class);
-            break;
-        case PX_MODE_UPDATE:
-            // -exp_id
-            config->exp_id = psMetadataLookupStr(&status, args, "-exp_id");
-            psMemIncrRefCounter(config->exp_id);
-            EMPTY_TO_NULL_STRING(config->exp_id);
-            // -filter
-            config->filter = psMetadataLookupStr(&status, args, "-filter");
-            psMemIncrRefCounter(config->filter);
-            EMPTY_TO_NULL_STRING(config->filter);
-
-            break;
-        default:
-            psAbort(argv[0], "invalid option (this should not happen)");
-    }
-
+    
     psFree(args);
     psFree(pendingArgs);
-    psFree(updateArgs);
+    psFree(defineArgs);
 
+    // setup search criterion
+#define addWhereStr(name) \
+    if ((str = psMetadataLookupStr(&status, args, "-" #name))) { \
+        if (!psMetadataAddStr(where, PS_LIST_TAIL, #name, 0, "==", str)) {\
+            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
+            psFree(where); \
+            exit(EXIT_FAILURE); \
+        } \
+    }
 
     psMetadata *where = psMetadataAlloc();
 
-    if (config->camera_name != NULL) {
-        if (!psMetadataAddStr(where, PS_LIST_TAIL, "camera", 0, "==",
-            config->camera_name)) {
+{
+    psString str = NULL;
+    int n = 0;
+    bool status = false;
+
+    addWhereStr(exp_id);
+    if ((str = psMetadataLookupStr(&status, args, "-inst"))) {
+        if (!psMetadataAddStr(where, PS_LIST_TAIL, "camera", 0, "==", str)) {
             psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
             psFree(where);
-            return NULL;
+            exit(EXIT_FAILURE);
         }
     }
-    if (config->filter != NULL) {
-        psMetadataAddStr(where, PS_LIST_TAIL, "filter", 0, "==",
-            config->filter);
+    addWhereStr(telescope);
+    addWhereStr(exp_type);
+    if ((n = psMetadataLookupStr(&status, args, "-imfiles"))) {
+        if (!psMetadataAddS32(where, PS_LIST_TAIL, "imfiles", 0, "==", n)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to add item imfiles");
+            psFree(where);
+            exit(EXIT_FAILURE);
+        }
     }
-    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);
-    }
-
-    /*
-    // psMetadataConfig does not support times yet
-    if (!psTimeIsZero(config->start) && !psTimeIsZero(config->stop)) {
-        psMetadataAddTime (where, PS_LIST_TAIL, "TIME_START", 0, "<", config->stop);
-        psMetadataAddTime (where, PS_LIST_TAIL, "TIME_STOP", 0, ">", config->start);
-    }
-    */
+    addWhereStr(filter);
+    addWhereStr(stats);
+    addWhereStr(recipe);
+}
 
     if (where->list->n < 1) {
@@ -186,11 +159,7 @@
     config->where = where;
 
-
-    // add the input and output images to the args list
-    //psMetadataAddStr (args, PS_LIST_TAIL, "-output", 0, "Name of the output image", argv[1]);
-
     // define Database handle, if used
     config->dbh = pmConfigDB(config->site);
 
-    return true;
+    return config;
 } 
