Ensure stdin/stdout is in binary mode on windows when pickling.
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Fri, 27 Jan 2012 14:28:06 +0000 (14:28 +0000)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Fri, 27 Jan 2012 14:28:06 +0000 (14:28 +0000)
cli/cli_pickle.cpp
scripts/unpickle.py

index 460a3c3..f435e20 100644 (file)
 
 #include <string.h>
 
+#ifdef _WIN32
+#include <fcntl.h>
+#include <io.h>
+#endif
+
 #include "pickle.hpp"
 
 #include "cli.hpp"
@@ -183,7 +188,15 @@ command(int argc, char *argv[])
             return 1;
         }
     }
-        
+
+#ifdef _WIN32
+    // Set stdout in binary mode
+    fflush(stdout);
+    int mode = _setmode(_fileno(stdout), _O_BINARY);
+    if (mode == -1) {
+        std::cerr << "warning: failed to set stdout in binary mode\n";
+    }
+#endif
 
     for (; i < argc; ++i) {
         trace::Parser parser;
@@ -205,6 +218,14 @@ command(int argc, char *argv[])
         }
     }
 
+#ifdef _WIN32
+    std::cout.flush();
+    fflush(stdout);
+    if (mode != -1) {
+        _setmode(_fileno(stdout), mode);
+    }
+#endif
+
     return 0;
 }
 
index efb8608..a3c274c 100755 (executable)
@@ -52,6 +52,15 @@ def main():
     if args:
         optparser.error('unexpected arguments')
 
+    # Change stdin to binary mode
+    try:
+        import msvcrt
+    except ImportError:
+        pass
+    else:
+        import os
+        msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
+
     calls = 0
     startTime = time.time()
     while True: