X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FMoof%2FStringTools.cc;fp=src%2FMoof%2FStringTools.cc;h=f4bd967a2c86cfcde22cabb24da4caeb03efa8b8;hb=c2321281bf12a7efaedde930422c7ddbc92080d4;hp=0000000000000000000000000000000000000000;hpb=87bc17e55b0c1dc73ecc66df856d3f08fd7a7724;p=chaz%2Fyoink diff --git a/src/Moof/StringTools.cc b/src/Moof/StringTools.cc new file mode 100644 index 0000000..f4bd967 --- /dev/null +++ b/src/Moof/StringTools.cc @@ -0,0 +1,159 @@ + +/******************************************************************************* + + Copyright (c) 2009, Charles McGarvey + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*******************************************************************************/ + +#include + +#include "ConvertUTF.h" + +#include "StringTools.hh" + + +namespace Mf { + + +std::wstring multiToWide(const std::string& multiStr) +{ + size_t length = multiStr.length(); + + if (sizeof(wchar_t) == 2) + { + wchar_t* wideStr = new wchar_t[length + 1]; + + const UTF8* srcStart = reinterpret_cast(multiStr.c_str()); + const UTF8* srcEnd = srcStart + length; + UTF16* targetStart = reinterpret_cast(wideStr); + UTF16* targetEnd = targetStart + length+1; + + ConversionResult res = ConvertUTF8toUTF16(&srcStart, srcEnd, + &targetStart, targetEnd, lenientConversion); + if (res != conversionOK) + { + delete[] wideStr; + throw std::runtime_error("bad conversion from multi to wide characters"); + } + + *targetStart = 0; + std::wstring convertedStr(wideStr); + delete[] wideStr; + + return convertedStr; + } + else if (sizeof(wchar_t) == 4) + { + wchar_t* wideStr = new wchar_t[length]; + + const UTF8* srcStart = reinterpret_cast(multiStr.c_str()); + const UTF8* srcEnd = srcStart + length; + UTF32* targetStart = reinterpret_cast(wideStr); + UTF32* targetEnd = targetStart + length; + + ConversionResult res = ConvertUTF8toUTF32(&srcStart, srcEnd, + &targetStart, targetEnd, lenientConversion); + if (res != conversionOK) + { + delete[] wideStr; + throw std::runtime_error("bad conversion from multi to wide characters"); + } + + *targetStart = 0; + std::wstring convertedStr(wideStr); + delete[] wideStr; + + return convertedStr; + } + else + { + throw std::runtime_error("unknown size of wide characters"); + } + return L""; +} + +std::string wideToMulti(const std::wstring& wideStr) +{ + size_t length = wideStr.length(); + + if (sizeof(wchar_t) == 2) + { + size_t multiLength = 3 * length + 1; + char* multiStr = new char[multiLength]; + + const UTF16* srcStart = reinterpret_cast(wideStr.c_str()); + const UTF16* srcEnd = srcStart + length; + UTF8* targetStart = reinterpret_cast(multiStr); + UTF8* targetEnd = targetStart + multiLength; + + ConversionResult res = ConvertUTF16toUTF8(&srcStart, srcEnd, + &targetStart, targetEnd, lenientConversion); + if (res != conversionOK) + { + delete[] multiStr; + throw std::runtime_error("bad conversion from wide to multi-characters"); + } + + *targetStart = 0; + std::string convertedStr(multiStr); + delete[] multiStr; + + return convertedStr; + } + else if (sizeof(wchar_t) == 4) + { + size_t multiLength = 4 * length + 1; + char* multiStr = new char[multiLength]; + + const UTF32* srcStart = reinterpret_cast(wideStr.c_str()); + const UTF32* srcEnd = srcStart + length; + UTF8* targetStart = reinterpret_cast(multiStr); + UTF8* targetEnd = targetStart + multiLength; + + ConversionResult res = ConvertUTF32toUTF8(&srcStart, srcEnd, + &targetStart, targetEnd, lenientConversion); + if (res != conversionOK) + { + delete[] multiStr; + throw std::runtime_error("bad conversion from wide to multi-characters"); + } + + *targetStart = 0; + std::string convertedStr(multiStr); + delete[] multiStr; + + return convertedStr; + } + else + { + throw std::runtime_error("unknown size of wide characters"); + } + return ""; +} + + +} // namespace Mf + +/** vim: set ts=4 sw=4 tw=80: *************************************************/ +