teach EscapeString and UnescapeString to handle ".
[oota-llvm.git] / lib / Support / MemoryBuffer.cpp
index 7a60b85b91e5cddbb66037b405950c4071257991..a4963d92fb65f7e0a539fdd0a1d773128d3fa2c7 100644 (file)
 #if !defined(_MSC_VER) && !defined(__MINGW32__)
 #include <unistd.h>
 #include <sys/uio.h>
-#include <sys/fcntl.h>
 #else
 #include <io.h>
 #endif
+#include <fcntl.h>
 using namespace llvm;
 
 //===----------------------------------------------------------------------===//
@@ -38,7 +38,7 @@ using namespace llvm;
 
 MemoryBuffer::~MemoryBuffer() {
   if (MustDeleteBuffer)
-    delete [] BufferStart;
+    free((void*)BufferStart);
 }
 
 /// initCopyOf - Initialize this source buffer with a copy of the specified
@@ -46,7 +46,7 @@ MemoryBuffer::~MemoryBuffer() {
 /// successfully.
 void MemoryBuffer::initCopyOf(const char *BufStart, const char *BufEnd) {
   size_t Size = BufEnd-BufStart;
-  BufferStart = new char[Size+1];
+  BufferStart = (char *)malloc((Size+1) * sizeof(char));
   BufferEnd = BufferStart+Size;
   memcpy(const_cast<char*>(BufferStart), BufStart, Size);
   *const_cast<char*>(BufferEnd) = 0;   // Null terminate buffer.
@@ -106,9 +106,10 @@ MemoryBuffer *MemoryBuffer::getMemBufferCopy(const char *StartPtr,
 /// that is completely initialized to zeros.  Note that the caller should
 /// initialize the memory allocated by this method.  The memory is owned by
 /// the MemoryBuffer object.
-MemoryBuffer *MemoryBuffer::getNewUninitMemBuffer(unsigned Size,
+MemoryBuffer *MemoryBuffer::getNewUninitMemBuffer(size_t Size,
                                                   const char *BufferName) {
-  char *Buf = new char[Size+1];
+  char *Buf = (char *)malloc((Size+1) * sizeof(char));
+  if (!Buf) return 0;
   Buf[Size] = 0;
   MemoryBufferMem *SB = new MemoryBufferMem(Buf, Buf+Size, BufferName);
   // The memory for this buffer is owned by the MemoryBuffer.
@@ -120,9 +121,10 @@ MemoryBuffer *MemoryBuffer::getNewUninitMemBuffer(unsigned Size,
 /// is completely initialized to zeros.  Note that the caller should
 /// initialize the memory allocated by this method.  The memory is owned by
 /// the MemoryBuffer object.
-MemoryBuffer *MemoryBuffer::getNewMemBuffer(unsigned Size,
+MemoryBuffer *MemoryBuffer::getNewMemBuffer(size_t Size,
                                             const char *BufferName) {
   MemoryBuffer *SB = getNewUninitMemBuffer(Size, BufferName);
+  if (!SB) return 0;
   memset(const_cast<char*>(SB->getBufferStart()), 0, Size+1);
   return SB;
 }
@@ -175,7 +177,7 @@ MemoryBuffer *MemoryBuffer::getFile(const char *Filename, std::string *ErrStr,
                                     int64_t FileSize) {
   int OpenFlags = 0;
 #ifdef O_BINARY
-  Flags |= O_BINARY;  // Open input file in binary mode on win32.
+  OpenFlags |= O_BINARY;  // Open input file in binary mode on win32.
 #endif
   int FD = ::open(Filename, O_RDONLY|OpenFlags);
   if (FD == -1) {
@@ -209,12 +211,19 @@ MemoryBuffer *MemoryBuffer::getFile(const char *Filename, std::string *ErrStr,
       return new MemoryBufferMMapFile(Filename, Pages, FileSize);
     }
   }
-  
-  OwningPtr<MemoryBuffer> SB;
-  SB.reset(MemoryBuffer::getNewUninitMemBuffer(FileSize, Filename));
+
+  MemoryBuffer *Buf = MemoryBuffer::getNewUninitMemBuffer(FileSize, Filename);
+  if (!Buf) {
+    // Failed to create a buffer.
+    if (ErrStr) *ErrStr = "could not allocate buffer";
+    ::close(FD);
+    return 0;
+  }
+
+  OwningPtr<MemoryBuffer> SB(Buf);
   char *BufPtr = const_cast<char*>(SB->getBufferStart());
   
-  unsigned BytesLeft = FileSize;
+  size_t BytesLeft = FileSize;
   while (BytesLeft) {
     ssize_t NumRead = ::read(FD, BufPtr, BytesLeft);
     if (NumRead != -1) {