]> granicus.if.org Git - clang/commitdiff
[libclang] Change clang_VirtualFileOverlay_writeToBuffer to return a malloc'ed buffer.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Mon, 3 Mar 2014 06:38:52 +0000 (06:38 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Mon, 3 Mar 2014 06:38:52 +0000 (06:38 +0000)
Returning CXString is not appropriate if we want to switch to a non-string format buffer.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@202675 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang-c/BuildSystem.h
tools/libclang/BuildSystem.cpp
unittests/libclang/LibclangTest.cpp

index ab581fdccedd78d263d0d6204e6abfd0b5e26bab..a1f243fd48fcdc3aa561076c6f9fd1fcb9a52fa2 100644 (file)
@@ -62,13 +62,15 @@ clang_VirtualFileOverlay_addFileMapping(CXVirtualFileOverlay,
  * \brief Write out the \c CXVirtualFileOverlay object to a char buffer.
  *
  * \param options is reserved, always pass 0.
- * \param out_buffer pointer to receive the CXString object, which should be
- * disposed using \c clang_disposeString().
+ * \param out_buffer_ptr pointer to receive the buffer pointer, which should be
+ * disposed using \c free().
+ * \param out_buffer_size pointer to receive the buffer size.
  * \returns 0 for success, non-zero to indicate an error.
  */
 CINDEX_LINKAGE enum CXErrorCode
 clang_VirtualFileOverlay_writeToBuffer(CXVirtualFileOverlay, unsigned options,
-                                       CXString *out_buffer);
+                                       char **out_buffer_ptr,
+                                       unsigned *out_buffer_size);
 
 /**
  * \brief Dispose a \c CXVirtualFileOverlay object.
index 311319ab966f7c7f15f287e4ac8dc7b2c6004b1d..5fd95b0a859996b808d10dd39e850aeb40852b6c 100644 (file)
@@ -162,9 +162,10 @@ private:
 }
 
 enum CXErrorCode
-clang_VirtualFileOverlay_writeToBuffer(CXVirtualFileOverlay VFO,
-                                       unsigned, CXString *out_buffer) {
-  if (!VFO || !out_buffer)
+clang_VirtualFileOverlay_writeToBuffer(CXVirtualFileOverlay VFO, unsigned,
+                                       char **out_buffer_ptr,
+                                       unsigned *out_buffer_size) {
+  if (!VFO || !out_buffer_ptr || !out_buffer_size)
     return CXError_InvalidArguments;
 
   llvm::SmallVector<EntryTy, 16> Entries;
@@ -186,7 +187,10 @@ clang_VirtualFileOverlay_writeToBuffer(CXVirtualFileOverlay VFO,
   JSONVFSPrinter Printer(OS);
   Printer.print(Entries);
 
-  *out_buffer = cxstring::createDup(OS.str());
+  StringRef Data = OS.str();
+  *out_buffer_ptr = (char*)malloc(Data.size());
+  *out_buffer_size = Data.size();
+  memcpy(*out_buffer_ptr, Data.data(), Data.size());
   return CXError_Success;
 }
 
index f855ecdd3c67cb597978dd8e4605a56f88432725..3809c1ce8894510eb8c8b18b9e9333ea36abf32b 100644 (file)
@@ -51,10 +51,12 @@ struct TestVFO {
   ~TestVFO() {
     if (!Contents)
       return;
-    CXString Buf;
-    clang_VirtualFileOverlay_writeToBuffer(VFO, 0, &Buf);
-    EXPECT_STREQ(Contents, clang_getCString(Buf));
-    clang_disposeString(Buf);
+    char *BufPtr;
+    unsigned BufSize;
+    clang_VirtualFileOverlay_writeToBuffer(VFO, 0, &BufPtr, &BufSize);
+    std::string BufStr(BufPtr, BufSize);
+    EXPECT_STREQ(Contents, BufStr.c_str());
+    free(BufPtr);
     clang_VirtualFileOverlay_dispose(VFO);
   }
 };