diff options
| author | Nico Weber <nicolasweber@gmx.de> | 2012-07-03 02:24:52 +0000 |
|---|---|---|
| committer | Nico Weber <nicolasweber@gmx.de> | 2012-07-03 02:24:52 +0000 |
| commit | 4b18c3ff40a21a8fa87ab95a905f1d77a79dae43 (patch) | |
| tree | fc6df02845d6cfd89e4782cecee94482a32c23ca /clang/lib/CodeGen | |
| parent | b8124d1af1d2883820267e61358a93058fb5336a (diff) | |
| download | bcm5719-llvm-4b18c3ff40a21a8fa87ab95a905f1d77a79dae43.tar.gz bcm5719-llvm-4b18c3ff40a21a8fa87ab95a905f1d77a79dae43.zip | |
Share ConvertUTF8toWide() between Lex and CodeGen.
llvm-svn: 159634
Diffstat (limited to 'clang/lib/CodeGen')
| -rw-r--r-- | clang/lib/CodeGen/CGExpr.cpp | 39 |
1 files changed, 2 insertions, 37 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 5f708d7a73f..7fbe0d02b5a 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -1732,47 +1732,12 @@ GetAddrOfConstantWideString(StringRef Str, return GV; } -// FIXME: Mostly copied from StringLiteralParser::CopyStringFragment static void ConvertUTF8ToWideString(unsigned CharByteWidth, StringRef Source, SmallString<32>& Target) { Target.resize(CharByteWidth * (Source.size() + 1)); char* ResultPtr = &Target[0]; - - assert(CharByteWidth==1 || CharByteWidth==2 || CharByteWidth==4); - ConversionResult result = conversionOK; - // Copy the character span over. - if (CharByteWidth == 1) { - if (!isLegalUTF8String(reinterpret_cast<const UTF8*>(&*Source.begin()), - reinterpret_cast<const UTF8*>(&*Source.end()))) - result = sourceIllegal; - memcpy(ResultPtr, Source.data(), Source.size()); - ResultPtr += Source.size(); - } else if (CharByteWidth == 2) { - UTF8 const *sourceStart = (UTF8 const *)Source.data(); - // FIXME: Make the type of the result buffer correct instead of - // using reinterpret_cast. - UTF16 *targetStart = reinterpret_cast<UTF16*>(ResultPtr); - ConversionFlags flags = strictConversion; - result = ConvertUTF8toUTF16( - &sourceStart,sourceStart + Source.size(), - &targetStart,targetStart + 2*Source.size(),flags); - if (result==conversionOK) - ResultPtr = reinterpret_cast<char*>(targetStart); - } else if (CharByteWidth == 4) { - UTF8 const *sourceStart = (UTF8 const *)Source.data(); - // FIXME: Make the type of the result buffer correct instead of - // using reinterpret_cast. - UTF32 *targetStart = reinterpret_cast<UTF32*>(ResultPtr); - ConversionFlags flags = strictConversion; - result = ConvertUTF8toUTF32( - &sourceStart,sourceStart + Source.size(), - &targetStart,targetStart + 4*Source.size(),flags); - if (result==conversionOK) - ResultPtr = reinterpret_cast<char*>(targetStart); - } - assert((result != targetExhausted) - && "ConvertUTF8toUTFXX exhausted target buffer"); - assert(result == conversionOK); + bool success = ConvertUTF8toWide(CharByteWidth, Source, ResultPtr); + assert(success); Target.resize(ResultPtr - &Target[0]); } |

