Index: trunk/psLib/src/sys/psMemory.c
===================================================================
--- trunk/psLib/src/sys/psMemory.c	(revision 30595)
+++ trunk/psLib/src/sys/psMemory.c	(revision 31152)
@@ -27,4 +27,5 @@
 #include <string.h>
 #include <assert.h>
+#include <unistd.h>
 
 #if defined(PS_MEM_BACKTRACE) && defined(HAVE_BACKTRACE)
@@ -1090,2 +1091,35 @@
     return (memBlock1->freeFunc == memBlock2->freeFunc);
 }
+
+bool static dumpMemory = false;
+
+void psMemDumpSetState (bool state) {
+    dumpMemory = state;
+}
+
+void psMemDump(const char *name)
+{
+    if (!dumpMemory) return;
+
+    char filename[1024];	  // don't make your sub-names too long!
+    static int num = 0;		  // Counter, to make files unique and give an idea of sequence
+
+    snprintf (filename, 1024, "memdump_%s_%03d.txt", name, num);
+    FILE *memFile = fopen(filename, "w");
+
+    psMemBlock **leaks = NULL;
+    int numLeaks = psMemCheckLeaks(0, &leaks, NULL, true);
+    fprintf(memFile, "# MemBlock Size Source\n");
+    unsigned long total = 0;            // Total memory used
+    for (int i = 0; i < numLeaks; i++) {
+        psMemBlock *mb = leaks[i];
+        fprintf(memFile, "%12lu\t%12zd\t%s:%d\n", mb->id, mb->userMemorySize, mb->file, mb->lineno);
+        total += mb->userMemorySize;
+    }
+    fclose(memFile);
+    psFree(leaks);
+
+    // fprintf(stderr, "Memdump %s %d: Memory use: %ld, sbrk: %p\n", name, num, total, (void *) sbrk(0));
+    fprintf(stderr, "Memdump %s %d: Memory use: %ld\n", name, num, total);
+    num++;
+}
Index: trunk/psLib/src/sys/psMemory.h
===================================================================
--- trunk/psLib/src/sys/psMemory.h	(revision 30595)
+++ trunk/psLib/src/sys/psMemory.h	(revision 31152)
@@ -647,4 +647,7 @@
   );
 
+void psMemDumpSetState (bool state);
+void psMemDump(const char *name);
+
 // Ensure this is a psLib pointer
 #define PS_ASSERT_PTR_HEAVY(PTR, RVAL) \
Index: trunk/psLib/src/sys/psString.c
===================================================================
--- trunk/psLib/src/sys/psString.c	(revision 30595)
+++ trunk/psLib/src/sys/psString.c	(revision 31152)
@@ -456,4 +456,17 @@
 
 
+psString psStringFileBasename (const char *fullname) {
+ 
+    char *file;
+
+    const char *ptr = strrchr (fullname, '/');
+    if (ptr) {
+	file = psStringCopy(ptr + 1);
+    } else {
+	file = psStringCopy(fullname);
+    }
+  return (file);
+}
+
 psString psStringStripCVS(const char *string, const char *tagName)
 {
Index: trunk/psLib/src/sys/psString.h
===================================================================
--- trunk/psLib/src/sys/psString.h	(revision 30595)
+++ trunk/psLib/src/sys/psString.h	(revision 31152)
@@ -335,4 +335,6 @@
 char *psStrcasestr (const char *haystack, const char *needle);
 
+psString psStringFileBasename (const char *fullname);
+
 /// @}
 #endif // #ifndef PS_STRING_H
