Unbreak LLVM on the MSVC compiler:
[oota-llvm.git] / utils / TableGen / TGLexer.cpp
index fae7ca48a92230d6ce82ccb740d2c7fdf65d8d89..0d83e7cdf1bbbb5935717fa039c48effafd4adf5 100644 (file)
@@ -2,8 +2,8 @@
 //
 //                     The LLVM Compiler Infrastructure
 //
-// This file was developed by Chris Lattner 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.
 //
 //===----------------------------------------------------------------------===//
 //
 #include <ostream>
 #include "llvm/Config/config.h"
 #include <cctype>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <cerrno>
 using namespace llvm;
 
 TGLexer::TGLexer(MemoryBuffer *StartBuf) : CurLineNo(1), CurBuf(StartBuf) {
@@ -254,12 +258,12 @@ bool TGLexer::LexInclude() {
   std::string Filename = CurStrVal;
 
   // Try to find the file.
-  MemoryBuffer *NewBuf = MemoryBuffer::getFile(&Filename[0], Filename.size());
+  MemoryBuffer *NewBuf = MemoryBuffer::getFile(Filename.c_str());
 
   // If the file didn't exist directly, see if it's in an include path.
   for (unsigned i = 0, e = IncludeDirectories.size(); i != e && !NewBuf; ++i) {
     std::string IncFile = IncludeDirectories[i] + "/" + Filename;
-    NewBuf = MemoryBuffer::getFile(&IncFile[0], IncFile.size());
+    NewBuf = MemoryBuffer::getFile(IncFile.c_str());
   }
     
   if (NewBuf == 0) {
@@ -340,7 +344,18 @@ tgtok::TokKind TGLexer::LexNumber() {
       if (CurPtr == NumStart)
         return ReturnError(CurPtr-2, "Invalid hexadecimal number");
 
+      errno = 0;
       CurIntVal = strtoll(NumStart, 0, 16);
+      if (errno == EINVAL)
+        return ReturnError(CurPtr-2, "Invalid hexadecimal number");
+      if (errno == ERANGE) {
+        errno = 0;
+        CurIntVal = (int64_t)strtoull(NumStart, 0, 16);
+        if (errno == EINVAL)
+          return ReturnError(CurPtr-2, "Invalid hexadecimal number");
+        if (errno == ERANGE)
+          return ReturnError(CurPtr-2, "Hexadecimal number out of range");
+      }
       return tgtok::IntVal;
     } else if (CurPtr[0] == 'b') {
       ++CurPtr;