summaryrefslogtreecommitdiff
path: root/Source/kwsys/testEncoding.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/kwsys/testEncoding.cxx')
-rw-r--r--Source/kwsys/testEncoding.cxx161
1 files changed, 82 insertions, 79 deletions
diff --git a/Source/kwsys/testEncoding.cxx b/Source/kwsys/testEncoding.cxx
index 80ec040f4d..03f2ec9e33 100644
--- a/Source/kwsys/testEncoding.cxx
+++ b/Source/kwsys/testEncoding.cxx
@@ -1,87 +1,74 @@
-/*============================================================================
- KWSys - Kitware System Library
- Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
-
- Distributed under the OSI-approved BSD License (the "License");
- see accompanying file Copyright.txt for details.
-
- This software is distributed WITHOUT ANY WARRANTY; without even the
- implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the License for more information.
-============================================================================*/
+/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+ file Copyright.txt or https://cmake.org/licensing#kwsys for details. */
#include "kwsysPrivate.h"
#if defined(_MSC_VER)
-# pragma warning (disable:4786)
+#pragma warning(disable : 4786)
#endif
#include KWSYS_HEADER(Encoding.hxx)
#include KWSYS_HEADER(Encoding.h)
+#include <algorithm>
#include <iostream>
#include <locale.h>
-#include <string.h>
#include <stdlib.h>
+#include <string.h>
// Work-around CMake dependency scanning limitation. This must
// duplicate the above list of headers.
#if 0
-# include "Encoding.hxx.in"
-# include "Encoding.h.in"
+#include "Encoding.h.in"
+#include "Encoding.hxx.in"
#endif
//----------------------------------------------------------------------------
-static const unsigned char helloWorldStrings[][32] =
-{
+static const unsigned char helloWorldStrings[][32] = {
// English
- {'H','e','l','l','o',' ','W','o','r','l','d',0},
+ { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', 0 },
// Japanese
- {0xE3, 0x81, 0x93, 0xE3, 0x82, 0x93, 0xE3, 0x81, 0xAB, 0xE3,
- 0x81, 0xA1, 0xE3, 0x81, 0xAF, 0xE4, 0xB8, 0x96, 0xE7, 0x95,
- 0x8C, 0},
- // Arabic
- {0xD9, 0x85, 0xD8, 0xB1, 0xD8, 0xAD, 0xD8, 0xA8, 0xD8, 0xA7,
- 0x20, 0xD8, 0xA7, 0xD9, 0x84, 0xD8, 0xB9, 0xD8, 0xA7, 0xD9,
- 0x84, 0xD9, 0x85, 0},
+ { 0xE3, 0x81, 0x93, 0xE3, 0x82, 0x93, 0xE3, 0x81, 0xAB, 0xE3, 0x81,
+ 0xA1, 0xE3, 0x81, 0xAF, 0xE4, 0xB8, 0x96, 0xE7, 0x95, 0x8C, 0 },
+ // Arabic
+ { 0xD9, 0x85, 0xD8, 0xB1, 0xD8, 0xAD, 0xD8, 0xA8, 0xD8, 0xA7, 0x20, 0xD8,
+ 0xA7, 0xD9, 0x84, 0xD8, 0xB9, 0xD8, 0xA7, 0xD9, 0x84, 0xD9, 0x85, 0 },
// Yiddish
- {0xD7, 0x94, 0xD7, 0xA2, 0xD7, 0x9C, 0xD7, 0x90, 0x20, 0xD7,
- 0x95, 0xD7, 0x95, 0xD7, 0xA2, 0xD7, 0x9C, 0xD7, 0x98, 0},
+ { 0xD7, 0x94, 0xD7, 0xA2, 0xD7, 0x9C, 0xD7, 0x90, 0x20, 0xD7,
+ 0x95, 0xD7, 0x95, 0xD7, 0xA2, 0xD7, 0x9C, 0xD7, 0x98, 0 },
// Russian
- {0xD0, 0xBF, 0xD1, 0x80, 0xD0, 0xB8, 0xD0, 0xB2, 0xD0, 0xB5,
- 0xD1, 0x82, 0x20, 0xD0, 0xBC, 0xD0, 0xB8, 0xD1, 0x80, 0},
+ { 0xD0, 0xBF, 0xD1, 0x80, 0xD0, 0xB8, 0xD0, 0xB2, 0xD0, 0xB5,
+ 0xD1, 0x82, 0x20, 0xD0, 0xBC, 0xD0, 0xB8, 0xD1, 0x80, 0 },
// Latin
- {0x4D, 0x75, 0x6E, 0x64, 0x75, 0x73, 0x20, 0x73, 0x61, 0x6C,
- 0x76, 0x65, 0},
+ { 0x4D, 0x75, 0x6E, 0x64, 0x75, 0x73, 0x20, 0x73, 0x61, 0x6C, 0x76, 0x65,
+ 0 },
// Swahili
- {0x68, 0x75, 0x6A, 0x61, 0x6D, 0x62, 0x6F, 0x20, 0x44, 0x75,
- 0x6E, 0x69, 0x61, 0},
+ { 0x68, 0x75, 0x6A, 0x61, 0x6D, 0x62, 0x6F, 0x20, 0x44, 0x75, 0x6E, 0x69,
+ 0x61, 0 },
// Icelandic
- {0x48, 0x61, 0x6C, 0x6C, 0xC3, 0xB3, 0x20, 0x68, 0x65, 0x69,
- 0x6D, 0x75, 0x72, 0},
- {0}
+ { 0x48, 0x61, 0x6C, 0x6C, 0xC3, 0xB3, 0x20, 0x68, 0x65, 0x69, 0x6D, 0x75,
+ 0x72, 0 },
+ { 0 }
};
//----------------------------------------------------------------------------
static int testHelloWorldEncoding()
{
int ret = 0;
- for(int i=0; helloWorldStrings[i][0] != 0; i++)
- {
+ for (int i = 0; helloWorldStrings[i][0] != 0; i++) {
std::string str = reinterpret_cast<const char*>(helloWorldStrings[i]);
std::cout << str << std::endl;
std::wstring wstr = kwsys::Encoding::ToWide(str);
std::string str2 = kwsys::Encoding::ToNarrow(wstr);
wchar_t* c_wstr = kwsysEncoding_DupToWide(str.c_str());
char* c_str2 = kwsysEncoding_DupToNarrow(c_wstr);
- if(!wstr.empty() && (str != str2 || strcmp(c_str2, str.c_str())))
- {
+ if (!wstr.empty() && (str != str2 || strcmp(c_str2, str.c_str()))) {
std::cout << "converted string was different: " << str2 << std::endl;
std::cout << "converted string was different: " << c_str2 << std::endl;
ret++;
- }
+ }
free(c_wstr);
free(c_str2);
- }
+ }
return ret;
}
@@ -91,80 +78,98 @@ static int testRobustEncoding()
// unicode correctly/gracefully
int ret = 0;
- char cstr[] = {(char)-1, 0};
+ char cstr[] = { (char)-1, 0 };
// this conversion could fail
std::wstring wstr = kwsys::Encoding::ToWide(cstr);
wstr = kwsys::Encoding::ToWide(NULL);
- if(wstr != L"")
- {
+ if (wstr != L"") {
const wchar_t* wcstr = wstr.c_str();
std::cout << "ToWide(NULL) returned";
- for(size_t i=0; i<wstr.size(); i++)
- {
+ for (size_t i = 0; i < wstr.size(); i++) {
std::cout << " " << std::hex << (int)wcstr[i];
- }
+ }
std::cout << std::endl;
ret++;
- }
+ }
wstr = kwsys::Encoding::ToWide("");
- if(wstr != L"")
- {
+ if (wstr != L"") {
const wchar_t* wcstr = wstr.c_str();
std::cout << "ToWide(\"\") returned";
- for(size_t i=0; i<wstr.size(); i++)
- {
+ for (size_t i = 0; i < wstr.size(); i++) {
std::cout << " " << std::hex << (int)wcstr[i];
- }
+ }
std::cout << std::endl;
ret++;
- }
+ }
#ifdef _WIN32
// 16 bit wchar_t - we make an invalid surrogate pair
- wchar_t cwstr[] = {0xD801, 0xDA00, 0};
+ wchar_t cwstr[] = { 0xD801, 0xDA00, 0 };
// this conversion could fail
std::string win_str = kwsys::Encoding::ToNarrow(cwstr);
#endif
std::string str = kwsys::Encoding::ToNarrow(NULL);
- if(str != "")
- {
+ if (str != "") {
std::cout << "ToNarrow(NULL) returned " << str << std::endl;
ret++;
- }
+ }
str = kwsys::Encoding::ToNarrow(L"");
- if(wstr != L"")
- {
+ if (wstr != L"") {
std::cout << "ToNarrow(\"\") returned " << str << std::endl;
ret++;
- }
+ }
return ret;
}
+static int testWithNulls()
+{
+ int ret = 0;
+ std::vector<std::string> strings;
+ strings.push_back(std::string("ab") + '\0' + 'c');
+ strings.push_back(std::string("d") + '\0' + '\0' + 'e');
+ strings.push_back(std::string() + '\0' + 'f');
+ strings.push_back(std::string() + '\0' + '\0' + "gh");
+ strings.push_back(std::string("ij") + '\0');
+ strings.push_back(std::string("k") + '\0' + '\0');
+ strings.push_back(std::string("\0\0\0\0", 4) + "lmn" +
+ std::string("\0\0\0\0", 4));
+ for (std::vector<std::string>::iterator it = strings.begin();
+ it != strings.end(); ++it) {
+ std::wstring wstr = kwsys::Encoding::ToWide(*it);
+ std::string str = kwsys::Encoding::ToNarrow(wstr);
+ std::string s(*it);
+ std::replace(s.begin(), s.end(), '\0', ' ');
+ std::cout << "'" << s << "' (" << it->size() << ")" << std::endl;
+ if (str != *it) {
+ std::replace(str.begin(), str.end(), '\0', ' ');
+ std::cout << "string with null was different: '" << str << "' ("
+ << str.size() << ")" << std::endl;
+ ret++;
+ }
+ }
+ return ret;
+}
+
static int testCommandLineArguments()
{
int status = 0;
- char const* argv[2] = {
- "./app.exe",
- (char const*)helloWorldStrings[1]
- };
+ char const* argv[2] = { "./app.exe", (char const*)helloWorldStrings[1] };
kwsys::Encoding::CommandLineArguments args(2, argv);
kwsys::Encoding::CommandLineArguments arg2 =
kwsys::Encoding::CommandLineArguments(args);
char const* const* u8_argv = args.argv();
- for(int i=0; i<args.argc(); i++)
- {
+ for (int i = 0; i < args.argc(); i++) {
char const* u8_arg = u8_argv[i];
- if(strcmp(argv[i], u8_arg) != 0)
- {
- std::cout << "argv[" << i << "] " << argv[i] << " != "
- << u8_arg << std::endl;
+ if (strcmp(argv[i], u8_arg) != 0) {
+ std::cout << "argv[" << i << "] " << argv[i] << " != " << u8_arg
+ << std::endl;
status++;
}
}
@@ -176,23 +181,21 @@ static int testCommandLineArguments()
}
//----------------------------------------------------------------------------
-int testEncoding(int, char*[])
+int testEncoding(int, char* [])
{
const char* loc = setlocale(LC_ALL, "");
- if(loc)
- {
+ if (loc) {
std::cout << "Locale: " << loc << std::endl;
- }
- else
- {
+ } else {
std::cout << "Locale: None" << std::endl;
- }
+ }
int ret = 0;
ret |= testHelloWorldEncoding();
ret |= testRobustEncoding();
ret |= testCommandLineArguments();
+ ret |= testWithNulls();
return ret;
}