Index: /trunk/src/kObjCache/kObjCache.c
===================================================================
--- /trunk/src/kObjCache/kObjCache.c	(revision 2616)
+++ /trunk/src/kObjCache/kObjCache.c	(revision 2617)
@@ -129,4 +129,9 @@
 static char g_szLine[KOBJCACHE_MAX_LINE_LEN + 16];
 
+/** How many times we've moved memory around. */
+static size_t g_cMemMoves = 0;
+/** How much memory we've moved. */
+static size_t g_cbMemMoved = 0;
+
 
 /*******************************************************************************
@@ -1205,4 +1210,6 @@
     assert(pCppRd->offRead >= offStart);
 
+    g_cMemMoves++;
+    g_cbMemMoved += cbToMove + 1;
     memmove(pszStart, pszStart + cbRemove, cbToMove + 1);
 
@@ -1221,6 +1228,6 @@
     if (offDelta)
     {
-        size_t cbLeft = pCppRd->offRead - offStart - cchReplaced;
-        assert(cbLeft <= pCppRd->offRead);
+        size_t cbToMove = pCppRd->offRead - offStart - cchReplaced;
+        assert(cbToMove <= pCppRd->offRead);
 
         if (cchReplacement > cchReplaced)
@@ -1228,7 +1235,9 @@
                 kOCCppRdGrowBuffer(pCppRd);
 
+        g_cMemMoves++;
+        g_cbMemMoved += cbToMove + 1;
         memmove(pCppRd->pszBuf + offStart + cchReplacement,
                 pCppRd->pszBuf + offStart + cchReplaced,
-                cbLeft + 1);
+                cbToMove + 1);
 
         pCppRd->offRead += offDelta;
@@ -1247,4 +1256,19 @@
 
 
+static void kOCCppRdOptCommitEx(PKOCCPPRD pCppRd, size_t offCur)
+{
+    pCppRd->cchOptimized = offCur;
+    pCppRd->uOptLineNo = pCppRd->uCurLineNo;
+}
+
+
+static void kOCCppRdOptCommit(PKOCCPPRD pCppRd)
+{
+    pCppRd->cchOptimized = pCppRd->offCur;
+    pCppRd->uOptLineNo = pCppRd->uCurLineNo;
+}
+
+
+
 static char *kOCCppRdOptGetEol(PKOCCPPRD pCppRd, char *pszCur, size_t cbLeft)
 {
@@ -1340,7 +1364,5 @@
         pszCur += offDelta;
 
-        pCppRd->cchOptimized = cchOptimized + cchLineDir;
-        pCppRd->uOptLineNo = pCppRd->uCurLineNo;
-
+        kOCCppRdOptCommitEx(pCppRd, cchOptimized + cchLineDir);
         /* pCppRd->offCur is adjusted by the replace call */
     }
@@ -1546,8 +1568,5 @@
                 pCppRd->uCurLineNo++;
                 if (!fEmptyLine)
-                {
-                    pCppRd->cchOptimized = pCppRd->offCur;
-                    pCppRd->uOptLineNo = pCppRd->uCurLineNo;
-                }
+                    kOCCppRdOptCommit(pCppRd);
                 else
                     pCppRd->cEmptyLines++;
@@ -2919,6 +2938,7 @@
  * @param   pszMsg          The operation message for info/error messages.
  * @param   pszPipeName     The pipe name if it is supposed to be named. (Windows only.)
- */
-static void kOCEntryCreatePipe(PKOCENTRY pEntry, int *paFDs, const char *pszPipeName, const char *pszMsg)
+ * @param   fText           Whether to read text mode or binary mode.
+ */
+static void kOCEntryCreatePipe(PKOCENTRY pEntry, int *paFDs, const char *pszPipeName, const char *pszMsg, int fText)
 {
     paFDs[0] = paFDs[1] = -1;
@@ -2942,6 +2962,6 @@
             FatalDie("%s - _open_osfhandle failed: %d\n", pszMsg, strerror(errno));
     }
-    else if (   _pipe(paFDs, 256*1024, _O_NOINHERIT | _O_BINARY) < 0
-             && _pipe(paFDs,        0, _O_NOINHERIT | _O_BINARY) < 0)
+    else if (   _pipe(paFDs, 256*1024, _O_NOINHERIT | (fText ? _O_BINARY : _O_TEXT)) < 0
+             && _pipe(paFDs,        0, _O_NOINHERIT | (fText ? _O_BINARY : _O_TEXT)) < 0)
 #else
     if (pipe(paFDs) < 0)
@@ -2972,5 +2992,5 @@
     pid_t pid;
 
-    kOCEntryCreatePipe(pEntry, fds, NULL, pszMsg);
+    kOCEntryCreatePipe(pEntry, fds, NULL, pszMsg, pEntry->fOptimizeCpp);
     pid = kOCEntrySpawnChild(pEntry, &pEntry->New.cMsCpp, papszArgv, cArgv, -1, fds[1 /* write */], pszMsg);
 
@@ -2996,5 +3016,5 @@
     pid_t pid;
 
-    kOCEntryCreatePipe(pEntry, fds, pEntry->pszNmPipeCompile, pszMsg);
+    kOCEntryCreatePipe(pEntry, fds, pEntry->pszNmPipeCompile, pszMsg, 0 /*fText*/);
     pid = kOCEntrySpawnChild(pEntry, &pEntry->New.cMsCompile, papszArgv, cArgv, fds[0 /* read */], -1, pszMsg);
 #ifdef __WIN__
@@ -3030,5 +3050,5 @@
      * The producer.
      */
-    kOCEntryCreatePipe(pEntry, fds, NULL, pszMsg);
+    kOCEntryCreatePipe(pEntry, fds, NULL, pszMsg, pEntry->fOptimizeCpp);
     pidConsumer = kOCEntrySpawnChild(pEntry, &pEntry->New.cMsCpp, papszProdArgv, cProdArgv, -1, fds[1 /* write */], pszMsg);
     fdIn = fds[0 /* read */];
@@ -3037,5 +3057,5 @@
      * The consumer.
      */
-    kOCEntryCreatePipe(pEntry, fds, pEntry->pszNmPipeCompile, pszMsg);
+    kOCEntryCreatePipe(pEntry, fds, pEntry->pszNmPipeCompile, pszMsg, 0 /*fText*/);
     pidProducer = kOCEntrySpawnChild(pEntry, &pEntry->New.cMsCompile, papszConsArgv, cConsArgv, fds[0 /* read */], -1, pszMsg);
     fdOut = fds[1 /* write */];
@@ -5119,4 +5139,10 @@
     kObjCacheUnlock(pCache);
     kObjCacheDestroy(pCache);
+    if (fOptimizePreprocessorOutput)
+    {
+        InfoMsg(1, "g_cbMemMoved=%#x (%d)\n", g_cbMemMoved, g_cbMemMoved);
+        InfoMsg(1, "g_cMemMoves=%#x (%d)\n", g_cMemMoves, g_cMemMoves);
+    }
+
     return 0;
 }
