Add a default constructor to AsmWriterOperand to make VS2008sp1 happy. (AsmWriterOper...
[oota-llvm.git] / utils / TableGen / TGLexer.cpp
index 2af35b05d6d834dbe00dfee8507432427be678d2..0d83e7cdf1bbbb5935717fa039c48effafd4adf5 100644 (file)
 #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) {
@@ -256,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) {
@@ -342,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;