[llvm] r227143 - Have the UTF conversion wrappers append a null terminator.

Zachary Turner zturner at google.com
Mon Jan 26 14:05:50 PST 2015


Author: zturner
Date: Mon Jan 26 16:05:50 2015
New Revision: 227143

URL: http://llvm.org/viewvc/llvm-project?rev=227143&view=rev
Log:
Have the UTF conversion wrappers append a null terminator.

This is especially useful for the UTF8 -> UTF16 direction, since
there is no equivalent of llvm::SmallString<> for wide characters.
This means that anyone who wants a null terminated string is forced
to manually push and pop their own null terminator.

Reviewed by: Reid Kleckner.

Modified:
    llvm/trunk/lib/Support/ConvertUTFWrapper.cpp

Modified: llvm/trunk/lib/Support/ConvertUTFWrapper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/ConvertUTFWrapper.cpp?rev=227143&r1=227142&r2=227143&view=diff
==============================================================================
--- llvm/trunk/lib/Support/ConvertUTFWrapper.cpp (original)
+++ llvm/trunk/lib/Support/ConvertUTFWrapper.cpp Mon Jan 26 16:05:50 2015
@@ -109,8 +109,9 @@ bool convertUTF16ToUTF8String(ArrayRef<c
   if (Src[0] == UNI_UTF16_BYTE_ORDER_MARK_NATIVE)
     Src++;
 
-  // Just allocate enough space up front.  We'll shrink it later.
-  Out.resize(SrcBytes.size() * UNI_MAX_UTF8_BYTES_PER_CODE_POINT);
+  // Just allocate enough space up front.  We'll shrink it later.  Allocate
+  // enough that we can fit a null terminator without reallocating.
+  Out.resize(SrcBytes.size() * UNI_MAX_UTF8_BYTES_PER_CODE_POINT + 1);
   UTF8 *Dst = reinterpret_cast<UTF8 *>(&Out[0]);
   UTF8 *DstEnd = Dst + Out.size();
 
@@ -124,6 +125,8 @@ bool convertUTF16ToUTF8String(ArrayRef<c
   }
 
   Out.resize(reinterpret_cast<char *>(Dst) - &Out[0]);
+  Out.push_back(0);
+  Out.pop_back();
   return true;
 }
 
@@ -140,8 +143,10 @@ bool convertUTF8ToUTF16String(StringRef
 
   // Allocate the same number of UTF-16 code units as UTF-8 code units. Encoding
   // as UTF-16 should always require the same amount or less code units than the
-  // UTF-8 encoding.
-  DstUTF16.resize(SrcUTF8.size());
+  // UTF-8 encoding.  Allocate one extra byte for the null terminator though,
+  // so that someone calling DstUTF16.data() gets a null terminated string.
+  // We resize down later so we don't have to worry that this over allocates.
+  DstUTF16.resize(SrcUTF8.size()+1);
   UTF16 *Dst = &DstUTF16[0];
   UTF16 *DstEnd = Dst + DstUTF16.size();
 
@@ -155,6 +160,8 @@ bool convertUTF8ToUTF16String(StringRef
   }
 
   DstUTF16.resize(Dst - &DstUTF16[0]);
+  DstUTF16.push_back(0);
+  DstUTF16.pop_back();
   return true;
 }
 





More information about the llvm-commits mailing list