more getting windows to build.
[oota-llvm.git] / lib / System / Win32 / Win32.h
index fb2c7e96fdf4bae0ec7e6ecc4871a1da40d091aa..8f505b1a6cdb496ce83428b69440221388aa9f75 100644 (file)
@@ -1,33 +1,57 @@
 //===- Win32/Win32.h - Common Win32 Include File ----------------*- C++ -*-===//
-// 
+//
 //                     The LLVM Compiler Infrastructure
 //
-// This file was developed by Reid Spencer and is distributed under the 
-// University of Illinois Open Source License. See LICENSE.TXT for details.
-// 
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
 //===----------------------------------------------------------------------===//
 //
-// This file defines things specific to Unix implementations.
+// This file defines things specific to Win32 implementations.
 //
 //===----------------------------------------------------------------------===//
 
 //===----------------------------------------------------------------------===//
-//=== WARNING: Implementation here must contain only generic UNIX code that
-//===          is guaranteed to work on all UNIX variants.
+//=== WARNING: Implementation here must contain only generic Win32 code that
+//===          is guaranteed to work on *all* Win32 variants.
 //===----------------------------------------------------------------------===//
 
+// Require at least Windows 2000 API.
+#define _WIN32_WINNT 0x0500
+
 #include "llvm/Config/config.h"     // Get autoconf configuration settings
 #include "windows.h"
 #include <cassert>
 #include <string>
 
-inline void ThrowError(const std::string& msg) {
+inline bool MakeErrMsg(std::string* ErrMsg, const std::string& prefix) {
+  if (!ErrMsg)
+    return true;
   char *buffer = NULL;
   FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
       NULL, GetLastError(), 0, (LPSTR)&buffer, 1, NULL);
-  std::string s(msg);
-  s += buffer;
+  *ErrMsg = prefix + buffer;
   LocalFree(buffer);
-  throw s;
+  return true;
 }
 
+class AutoHandle {
+  HANDLE handle;
+
+public:
+  AutoHandle(HANDLE h) : handle(h) {}
+
+  ~AutoHandle() {
+    if (handle)
+      CloseHandle(handle);
+  }
+
+  operator HANDLE() {
+    return handle;
+  }
+
+  AutoHandle &operator=(HANDLE h) {
+    handle = h;
+    return *this;
+  }
+};