Index: trunk/ippTools/src/chiptool.c
===================================================================
--- trunk/ippTools/src/chiptool.c	(revision 6978)
+++ 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);
 }
 
