Merge pull request #85 from hughbe/popen-pclose

Add and use platform abstractions for popen and pclose
diff --git a/include/llbuild/Basic/PlatformUtility.h b/include/llbuild/Basic/PlatformUtility.h
index fcb0c6d..7b92b67 100644
--- a/include/llbuild/Basic/PlatformUtility.h
+++ b/include/llbuild/Basic/PlatformUtility.h
@@ -18,11 +18,15 @@
 #ifndef LLBUILD_BASIC_PLATFORMUTILITY_H
 #define LLBUILD_BASIC_PLATFORMUTILITY_H
 
+#include <cstdio>
+
 namespace llbuild {
 namespace basic {
 namespace sys {
-  bool chdir(const char *fileName);
-  int unlink(const char *fileName);
+bool chdir(const char *fileName);
+int pclose(FILE *stream);
+FILE *popen(const char *command, const char *mode);
+int unlink(const char *fileName);
 }
 }
 }
diff --git a/lib/Basic/PlatformUtility.cpp b/lib/Basic/PlatformUtility.cpp
index d5c7035..5d5f06b 100644
--- a/lib/Basic/PlatformUtility.cpp
+++ b/lib/Basic/PlatformUtility.cpp
@@ -13,6 +13,7 @@
 #include "LeanWindows.h"
 #include <io.h>
 #else
+#include <stdio.h>
 #include <unistd.h>
 #endif
 
@@ -27,6 +28,22 @@
 #endif
 }
 
+int sys::pclose(FILE *stream) {
+#if defined(_WIN32)
+  return ::_pclose(stream);
+#else
+  return ::pclose(stream);
+#endif
+}
+
+FILE *sys::popen(const char *command, const char *mode) {
+#if defined(_WIN32)
+  return ::_popen(command, mode);
+#else
+  return ::popen(command, mode);
+#endif
+}
+
 int sys::unlink(const char *fileName) {
 #if defined(_WIN32)
   return ::_unlink(fileName);
diff --git a/lib/BuildSystem/SwiftTools.cpp b/lib/BuildSystem/SwiftTools.cpp
index 24a1a82..597fc48 100644
--- a/lib/BuildSystem/SwiftTools.cpp
+++ b/lib/BuildSystem/SwiftTools.cpp
@@ -15,6 +15,7 @@
 #include "llbuild/Basic/FileSystem.h"
 #include "llbuild/Basic/Hashing.h"
 #include "llbuild/Basic/LLVM.h"
+#include "llbuild/Basic/PlatformUtility.h"
 #include "llbuild/BuildSystem/BuildExecutionQueue.h"
 #include "llbuild/BuildSystem/BuildFile.h"
 #include "llbuild/BuildSystem/BuildKey.h"
@@ -126,7 +127,7 @@
       commandOS << " " << "--version";
 
       // Read the result.
-      FILE *fp = ::popen(commandOS.str().str().c_str(), "r");
+      FILE *fp = basic::sys::popen(commandOS.str().str().c_str(), "r");
       SmallString<4096> result;
       if (fp) {
         char buf[4096];
@@ -138,7 +139,7 @@
           }
           result.append(StringRef(buf, numRead));
         }
-        pclose(fp);
+        basic::sys::pclose(fp);
       }
 
       // For now, we can get away with just encoding this as a successful