Index: /tags/ipp-20110622/ppTranslate/src/ppMops.c
===================================================================
--- /tags/ipp-20110622/ppTranslate/src/ppMops.c	(revision 32188)
+++ /tags/ipp-20110622/ppTranslate/src/ppMops.c	(revision 32189)
@@ -65,6 +65,11 @@
     psFree(merged);
     psFree(args);
+    psFree(detections);
 
     psLibFinalize();
+
+    fprintf (stderr, "found %d leaks at %s\n", 
+    	psMemCheckLeaks2 (0,
+		NULL, stdout, false, 500), "ppMops");
 
     return PS_EXIT_SUCCESS;
Index: /tags/ipp-20110622/ppTranslate/src/ppMopsArguments.c
===================================================================
--- /tags/ipp-20110622/ppTranslate/src/ppMopsArguments.c	(revision 32188)
+++ /tags/ipp-20110622/ppTranslate/src/ppMopsArguments.c	(revision 32189)
@@ -123,4 +123,5 @@
     psTrace("ppMops.args", 1, "Done parsing command-line arguments\n");
 
+psFree(arguments);
     return args;
 }
Index: /tags/ipp-20110622/ppTranslate/src/ppMopsGetSkyChipPsfVersion.c
===================================================================
--- /tags/ipp-20110622/ppTranslate/src/ppMopsGetSkyChipPsfVersion.c	(revision 32188)
+++ /tags/ipp-20110622/ppTranslate/src/ppMopsGetSkyChipPsfVersion.c	(revision 32189)
@@ -9,9 +9,12 @@
 	  "EXTTYPE value: [%s]\n", version);
   if (strcmp(version, "PS1_DV1") == 0) {
+    psFree(headerSkyChip);
     return 1;
   } else if (strcmp(version, "PS1_DV2") == 0) {
+    psFree(headerSkyChip);
     return 2;
   }
   psWarning("Unsupported EXTTYPE in SkyChip.psf table: [%s]", version);
+  psFree(headerSkyChip);
   return 0;
 }
Index: /tags/ipp-20110622/ppTranslate/src/ppMopsMerge.c
===================================================================
--- /tags/ipp-20110622/ppTranslate/src/ppMopsMerge.c	(revision 32188)
+++ /tags/ipp-20110622/ppTranslate/src/ppMopsMerge.c	(revision 32189)
@@ -36,4 +36,5 @@
     ppMopsDetections *merged = NULL;    // Merged list
     int num = 0;                                                         // Number of merged files
+    psVector *coords = psVectorAlloc(2, PS_TYPE_F64); // Coordinates of interest
     for (int i = 0; i < detections->n; i++) {
         ppMopsDetections *det = detections->data[i]; // Detections of interest
@@ -110,5 +111,4 @@
         }
 
-        psVector *coords = psVectorAlloc(2, PS_TYPE_F64); // Coordinates of interest
         for (int j = 0; j < det->num; j++) {
             coords->data.F64[0] = det->ra->data.F64[j];
@@ -162,4 +162,5 @@
         ppMopsDetectionsPurge(merged);
     }
+    psFree(coords);
 
     if (num == 0) {
Index: /tags/ipp-20110622/ppTranslate/src/ppTranslateVersion.c
===================================================================
--- /tags/ipp-20110622/ppTranslate/src/ppTranslateVersion.c	(revision 32188)
+++ /tags/ipp-20110622/ppTranslate/src/ppTranslateVersion.c	(revision 32189)
@@ -77,4 +77,5 @@
     psFree(version);
     psFree(source);
+    psFree(time);
 
     return true;
Index: /tags/ipp-20110622/psLib/src/sys/psMemory.c
===================================================================
--- /tags/ipp-20110622/psLib/src/sys/psMemory.c	(revision 32188)
+++ /tags/ipp-20110622/psLib/src/sys/psMemory.c	(revision 32189)
@@ -889,5 +889,7 @@
                       psMemBlock ***array,
                       FILE * fd,
-                      bool persistence)
+                      bool persistence,
+		      int maxDisplayedLeaksCount          ///< List at most maxDisplayedLeaksCount (-1 for all)
+		  )
 {
     psS32 nleak = 0;
@@ -896,5 +898,7 @@
 
     // XXX move this elsewhere?
-    fprintf (stderr, "set %d locks, cleared %d locks, retry on %d locks (memID %ld)\n", setLock, clearLock, retryLock, memid);
+    if (fd != NULL) {
+      fprintf (fd, "set %d locks, cleared %d locks, retry on %d locks (memID %ld)\n", setLock, clearLock, retryLock, memid);
+    }
 
     // make sure that the memblock list is free of corruption before we crawl
@@ -915,4 +919,22 @@
     for (memBlock = topBlock; memBlock->nextBlock != NULL; memBlock = memBlock->nextBlock) { }
 
+    int maxToDisplay = maxDisplayedLeaksCount;
+    psMemBlock *memBlockBackup = memBlock;
+    if (maxToDisplay == -1 ) {
+      for (; memBlock != NULL; memBlock = memBlock->previousBlock) {
+	if ( (memBlock->refCounter > 0) &&
+	     ( (persistence) || (!persistence && !memBlock->persistent) ) &&
+	     (memBlock->id >= id0)) {
+	  nleak++;
+	}
+      }
+      maxToDisplay=nleak;
+    }
+    if (fd != NULL) {
+      fprintf(fd, "Number of leaks to display: %d\n", maxToDisplay);
+    }
+    memBlock = memBlockBackup;
+
+    nleak=0;
     // iterate through the block list starting with the oldest block
     for (; memBlock != NULL; memBlock = memBlock->previousBlock) {
@@ -924,5 +946,5 @@
 
 	    // only print a max of 500 leaks (make this an argument)
-            if ((nleak < 500) && (fd != NULL)) {
+            if ( (nleak <= maxToDisplay) && (fd != NULL) ) {
                 if (nleak == 1) {
                     fprintf(fd, "# func at (file:line)  ID: X  Ref: X\n");
Index: /tags/ipp-20110622/psLib/src/sys/psMemory.h
===================================================================
--- /tags/ipp-20110622/psLib/src/sys/psMemory.h	(revision 32188)
+++ /tags/ipp-20110622/psLib/src/sys/psMemory.h	(revision 32189)
@@ -367,4 +367,11 @@
     bool persistence                   ///< make check across all object even persistent ones
 );
+int psMemCheckLeaks2(
+    psMemId id0,                       ///< don't list blocks with id < id0
+    psMemBlock ***array,               ///< pointer to array of pointers to leaked blocks, or NULL
+    FILE * fd,                         ///< print list of leaks to fd (or NULL)
+    bool persistence,                  ///< make check across all object even persistent ones
+    int maxDisplayedLeaksCount         ///< List at most maxDisplayedLeaksCount (-1 for all)
+);
 #else // ifdef DOXYGEN
 int p_psMemCheckLeaks(
@@ -375,9 +382,12 @@
     psMemBlock ***array,                ///< pointer to array of pointers to leaked blocks, or NULL
     FILE * fd,                          ///< print list of leaks to fd (or NULL)
-    bool persistence                    ///< make check across all object even persistent ones
-);
-#ifndef SWIG
+    bool persistence,                   ///< make check across all object even persistent ones
+    int maxDisplayedLeaksCount          ///< List at most maxDisplayedLeaksCount (-1 for all)
+);
+#ifndef SWIG
+#define psMemCheckLeaks2(id0, array, fd, persistence, maxDisplayedLeaksCount) \
+      p_psMemCheckLeaks(__FILE__, __LINE__, __func__, id0, array, fd, persistence, maxDisplayedLeaksCount)
 #define psMemCheckLeaks(id0, array, fd, persistence) \
-      p_psMemCheckLeaks(__FILE__, __LINE__, __func__, id0, array, fd, persistence)
+      p_psMemCheckLeaks(__FILE__, __LINE__, __func__, id0, array, fd, persistence, 500)
 #endif // ifndef SWIG
 #endif // ifdef DOXYGEN
