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/Basic | |
| 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/Basic')
| -rw-r--r-- | clang/lib/Basic/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | clang/lib/Basic/ConvertUTFWrapper.cpp | 54 |
2 files changed, 55 insertions, 0 deletions
diff --git a/clang/lib/Basic/CMakeLists.txt b/clang/lib/Basic/CMakeLists.txt index 01695397360..611ae144389 100644 --- a/clang/lib/Basic/CMakeLists.txt +++ b/clang/lib/Basic/CMakeLists.txt @@ -3,6 +3,7 @@ set(LLVM_LINK_COMPONENTS mc) add_clang_library(clangBasic Builtins.cpp ConvertUTF.c + ConvertUTFWrapper.cpp Diagnostic.cpp DiagnosticIDs.cpp FileManager.cpp diff --git a/clang/lib/Basic/ConvertUTFWrapper.cpp b/clang/lib/Basic/ConvertUTFWrapper.cpp new file mode 100644 index 00000000000..42b4f580790 --- /dev/null +++ b/clang/lib/Basic/ConvertUTFWrapper.cpp @@ -0,0 +1,54 @@ +//===-- ConvertUTFWrapper.cpp - Wrap ConvertUTF.h with clang data types -----=== +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "clang/Basic/ConvertUTF.h" +#include "clang/Basic/LLVM.h" + +namespace clang { + +bool ConvertUTF8toWide(unsigned WideCharWidth, llvm::StringRef Source, + char *&ResultPtr) { + assert(WideCharWidth == 1 || WideCharWidth == 2 || WideCharWidth == 4); + ConversionResult result = conversionOK; + // Copy the character span over. + if (WideCharWidth == 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 (WideCharWidth == 2) { + const UTF8 *sourceStart = (const UTF8*)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 (WideCharWidth == 4) { + const UTF8 *sourceStart = (const UTF8*)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"); + return result == conversionOK; +} + +} |

