Index: /trunk/ippTools/src/dettoolConfig.c
===================================================================
--- /trunk/ippTools/src/dettoolConfig.c	(revision 13564)
+++ /trunk/ippTools/src/dettoolConfig.c	(revision 13565)
@@ -49,4 +49,5 @@
 }
 
+
 static void printUsageMode(int argc, char **argv, const char *modeName, psMetadata *argSet) 
 {
@@ -56,4 +57,130 @@
     psArgumentHelpSimple(stderr, argSet);
 }
+
+
+static bool parseOptions(int argc, char **argv, pxConfig *config, psMetadata *modes, psMetadata *argSets)
+{
+    // figure out what mode we're running in
+    psMetadataIterator *iter = psMetadataIteratorAlloc(modes, PS_LIST_HEAD, NULL);
+    psMetadataItem *item = NULL; // Item from iterator
+    while ((item = psMetadataGetAndIncrement(iter))) {
+        int N = 0;
+        if ((N = psArgumentGet(argc, argv, item->name))) {
+            psArgumentRemove(N, &argc, argv);
+            // check for duplicate mode specification
+            if (config->mode) {
+                psError(PS_ERR_UNKNOWN, true, "only one mode selection is allowed");
+                fprintf(stderr, "only one mode selection is allowed\n");
+                printUsage(argc, argv, modes);
+                return NULL;
+            }
+
+            config->mode = item->data.U32;
+            config->modeName = psStringCopy(item->name);
+
+            bool status = false;
+            psMetadata *argset = psMetadataLookupMetadata(&status, argSets, item->name);
+            // make sure we can find the argSet for the sepcified mode
+            if (!status) {
+                psError(PS_ERR_UNKNOWN, true, "can not find arguments for mode");
+                fprintf(stderr, "can not find arugments for mode");
+                return NULL;
+            }
+
+            config->args = psMemIncrRefCounter(argset);
+        }
+
+    }
+
+    psFree(iter);
+
+    // make sure we found a mode
+    if (config->mode == DETTOOL_MODE_NONE) {
+        psError(PS_ERR_UNKNOWN, true, "mode argument is required");
+        fprintf(stderr, "mode argument is required\n");
+        printUsage(argc, argv, modes);
+        return NULL;
+    }
+
+    // actually parse the command line
+    if (!psArgumentParse(config->args, &argc, argv)) {
+        psError(PS_ERR_UNKNOWN, true, "error parsing arguments");
+        fprintf(stderr, "error parsing arguments\n");
+        printUsageMode(argc, argv, config->modeName, config->args);
+        return NULL;
+    }
+
+    // look for left overs on the command line
+    if (argc != 1) {
+        psError(PS_ERR_UNKNOWN, true, "extra arguments: ");
+        fprintf(stderr, "extra arguments: ");
+        for (int i = 1; i < argc; i++) {
+            fprintf (stderr, "%s ", argv[i]);
+        }
+        fprintf(stderr, "\n");
+        printUsageMode(argc, argv, config->modeName, config->args);
+        return NULL;
+    }
+
+    // make sure that all required parameters have been specified
+    iter = psMetadataIteratorAlloc(config->args, PS_LIST_HEAD, NULL);
+    item = NULL; // Item from iterator
+    while ((item = psMetadataGetAndIncrement(iter))) {
+        if (strstr(item->comment, "require") == NULL) {
+            continue;
+        }
+
+        switch (item->type) {
+            case PS_DATA_BOOL:
+                psError(PS_ERR_UNKNOWN, false, "boolean type can not be required");
+                fprintf(stderr, "boolean type can not be required\n");
+                return NULL;
+                break;
+            case PS_DATA_S8:
+            case PS_DATA_S16:
+            case PS_DATA_S32:
+            case PS_DATA_S64:
+                if (item->data.S64 != 0) {
+                    break;
+                }
+                goto ARG_REQUIRED;
+            case PS_DATA_U8:
+            case PS_DATA_U16:
+            case PS_DATA_U32:
+            case PS_DATA_U64:
+                if (item->data.U64 != 0) {
+                    break;
+                }
+                goto ARG_REQUIRED;
+            case PS_DATA_F32:
+            case PS_DATA_F64:
+                if (!isnan(item->data.F64)) {
+                    break;
+                }
+                goto ARG_REQUIRED;
+            case PS_DATA_STRING:
+            case PS_DATA_METADATA:
+                if (item->data.V) {
+                    break;
+                }
+                goto ARG_REQUIRED;
+            default:
+                psError(PS_ERR_UNKNOWN, false, "unknown argument type");
+                fprintf(stderr, "unknown argument type\n");
+                return NULL;
+            ARG_REQUIRED:                
+                psError(PS_ERR_UNKNOWN, false, "argument %s is required", item->name);
+                fprintf(stderr, "argument %s is required\n", item->name);
+                printUsageMode(argc, argv, config->modeName, config->args);
+                return NULL;
+        }
+
+    }
+
+    psFree(iter);
+
+    return true;
+}
+
 
 pxConfig *dettoolConfig(pxConfig *config, int argc, char **argv) {
@@ -855,144 +982,11 @@
 
 
-    // figure out what mode we're running in
-    char *modeName = NULL;
-    psMetadataIterator *iter = psMetadataIteratorAlloc(modes, PS_LIST_HEAD, NULL);
-    psMetadataItem *item = NULL; // Item from iterator
-    while ((item = psMetadataGetAndIncrement(iter))) {
-        int N = 0;
-        if ((N = psArgumentGet(argc, argv, item->name))) {
-            psArgumentRemove(N, &argc, argv);
-            // check for duplicate mode specification
-            if (config->mode) {
-                psError(PS_ERR_UNKNOWN, true, "only one mode selection is allowed");
-                fprintf(stderr, "only one mode selection is allowed\n");
-                printUsage(argc, argv, modes);
-                psFree(argSets);
-                psFree(modes);
-                psFree(config);
-                return NULL;
-            }
-
-            config->mode = item->data.U32;
-            modeName = item->name;
-
-            bool status = false;
-            psMetadata *argset = psMetadataLookupMetadata(&status, argSets, item->name);
-            // make sure we can find the argSet for the sepcified mode
-            if (!status) {
-                psError(PS_ERR_UNKNOWN, true, "can not find arguments for mode");
-                fprintf(stderr, "can not find arugments for mode");
-                psFree(argSets);
-                psFree(modes);
-                psFree(config);
-                return NULL;
-            }
-
-            config->args = psMemIncrRefCounter(argset);
-        }
-
-    }
-
-    psFree(iter);
-    psFree(argSets);
-
-    // make sure we found a mode
-    if (config->mode == DETTOOL_MODE_NONE) {
-        psError(PS_ERR_UNKNOWN, true, "mode argument is required");
-        fprintf(stderr, "mode argument is required\n");
-        printUsage(argc, argv, modes);
-
+    if (!parseOptions(argc, argv, config, modes, argSets)) {
+        psError(PS_ERR_UNKNOWN, true, "option parsing failed");
+        psFree(argSets);
         psFree(modes);
         psFree(config);
         return NULL;
     }
-
-    psFree(modes);
-
-    // actually parse the command line
-    if (!psArgumentParse(config->args, &argc, argv)) {
-        psError(PS_ERR_UNKNOWN, true, "error parsing arguments");
-        fprintf(stderr, "error parsing arguments\n");
-        printUsageMode(argc, argv, modeName, config->args);
-
-        psFree(config);
-        return NULL;
-    }
-
-    // look for left overs on the command line
-    if (argc != 1) {
-        psError(PS_ERR_UNKNOWN, true, "extra arguments: ");
-        fprintf(stderr, "extra arguments: ");
-        for (int i = 1; i < argc; i++) {
-            fprintf (stderr, "%s ", argv[i]);
-        }
-        fprintf(stderr, "\n");
-        printUsageMode(argc, argv, modeName, config->args);
-
-        psFree(config);
-        return NULL;
-    }
-
-    // make sure that all require parameters have been specified
-    iter = psMetadataIteratorAlloc(config->args, PS_LIST_HEAD, NULL);
-    item = NULL; // Item from iterator
-    while ((item = psMetadataGetAndIncrement(iter))) {
-        if (strstr(item->comment, "require") == NULL) {
-            continue;
-        }
-
-        switch (item->type) {
-            case PS_DATA_BOOL:
-                psError(PS_ERR_UNKNOWN, false, "boolean type can not be required");
-                fprintf(stderr, "boolean type can not be required\n");
-                psFree(iter);
-                psFree(config);
-                return NULL;
-                break;
-            case PS_DATA_S8:
-            case PS_DATA_S16:
-            case PS_DATA_S32:
-            case PS_DATA_S64:
-                if (item->data.S64 != 0) {
-                    break;
-                }
-                goto ARG_REQUIRED;
-            case PS_DATA_U8:
-            case PS_DATA_U16:
-            case PS_DATA_U32:
-            case PS_DATA_U64:
-                if (item->data.U64 != 0) {
-                    break;
-                }
-                goto ARG_REQUIRED;
-            case PS_DATA_F32:
-            case PS_DATA_F64:
-                if (!isnan(item->data.F64)) {
-                    break;
-                }
-                goto ARG_REQUIRED;
-            case PS_DATA_STRING:
-            case PS_DATA_METADATA:
-                if (item->data.V) {
-                    break;
-                }
-                goto ARG_REQUIRED;
-            default:
-                psError(PS_ERR_UNKNOWN, false, "unknown argument type");
-                fprintf(stderr, "unknown argument type\n");
-                psFree(iter);
-                psFree(config);
-                return NULL;
-            ARG_REQUIRED:                
-                psError(PS_ERR_UNKNOWN, false, "argument %s is required", item->name);
-                fprintf(stderr, "argument %s is required\n", item->name);
-                printUsageMode(argc, argv, modeName, config->args);
-                psFree(iter);
-                psFree(config);
-                return NULL;
-        }
-
-    }
-    psFree(iter);
 
     // setup search criterion
