/* * * Copyright (c) 2005 * John Maddock * * Use, modification and distribution are subject to the * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * */ // most of the workarounds and headers we need are already in here: #include #include #include #include #include #include #ifdef BOOST_INTEL #pragma warning(disable:1418 981 983 2259) #endif #ifdef BOOST_NO_STDC_NAMESPACE namespace std{ using ::strxfrm; #ifndef BOOST_NO_WREGEX using ::wcsxfrm; #endif } #endif #include template int make_int(charT c) { return c; } int make_int(char c) { return static_cast(c); } template void print_string(const std::basic_string& s) { typedef typename std::basic_string::size_type size_type; std::cout.put(static_cast('"')); for(size_type i = 0; i < s.size(); ++i) { if((s[i] > ' ') && (s[i] <= 'z')) { std::cout.put(static_cast(s[i])); } else { std::cout << "\\x" << std::hex << make_int(s[i]); } } std::cout.put(static_cast('"')); } void print_c_char(char c) { char buf[50]; const char cbuf[2] = { c, 0, }; std::size_t len = std::strxfrm(buf, cbuf, 50); std:: cout << len << " "; std::string s(buf); print_string(s); } #ifndef BOOST_NO_WREGEX void print_c_char(wchar_t c) { wchar_t buf[50]; const wchar_t cbuf[2] = { c, 0, }; std::size_t len = std::wcsxfrm(buf, cbuf, 50); std:: cout << len << " "; std::wstring s(buf); print_string(s); } #endif template void print_c_info(charT, const char* name) { std::cout << "Info for " << name << " C API's:" << std::endl; std::cout << " \"a\" : "; print_c_char(charT('a')); std::cout << std::endl; std::cout << " \"A\" : "; print_c_char(charT('A')); std::cout << std::endl; std::cout << " \"z\" : "; print_c_char(charT('z')); std::cout << std::endl; std::cout << " \"Z\" : "; print_c_char(charT('Z')); std::cout << std::endl; std::cout << " \";\" : "; print_c_char(charT(';')); std::cout << std::endl; std::cout << " \"{\" : "; print_c_char(charT('{')); std::cout << std::endl; } template void print_cpp_char(charT c) { #ifndef BOOST_NO_STD_LOCALE std::locale l; const std::collate& col = BOOST_USE_FACET(std::collate, l); std::basic_string result = col.transform(&c, &c+1); std::cout << result.size() << " "; print_string(result); std::size_t n = result.find(charT(0)); if(n != std::basic_string::npos) { std::cerr << "(Error in location of null, found: " << n << ")"; } #endif } template void print_cpp_info(charT, const char* name) { std::cout << "Info for " << name << " C++ locale API's:" << std::endl; std::cout << " \"a\" : "; print_cpp_char(charT('a')); std::cout << std::endl; std::cout << " \"A\" : "; print_cpp_char(charT('A')); std::cout << std::endl; std::cout << " \"z\" : "; print_cpp_char(charT('z')); std::cout << std::endl; std::cout << " \"Z\" : "; print_cpp_char(charT('Z')); std::cout << std::endl; std::cout << " \";\" : "; print_cpp_char(charT(';')); std::cout << std::endl; std::cout << " \"{\" : "; print_cpp_char(charT('{')); std::cout << std::endl; } template void print_sort_syntax(const traits& pt, const char* name) { std::cout << "Sort Key Syntax for type " << name << ":\n"; typedef typename traits::char_type char_type; char_type delim; unsigned result = ::boost::BOOST_REGEX_DETAIL_NS::find_sort_syntax(&pt, &delim); std::cout << " "; switch(result) { case boost::BOOST_REGEX_DETAIL_NS::sort_C: std::cout << "sort_C"; break; case boost::BOOST_REGEX_DETAIL_NS::sort_fixed: std::cout << "sort_fixed" << " " << static_cast(delim); break; case boost::BOOST_REGEX_DETAIL_NS::sort_delim: { std::cout << "sort_delim" << " "; std::basic_string s(1, delim); print_string(s); } break; case boost::BOOST_REGEX_DETAIL_NS::sort_unknown: std::cout << "sort_unknown"; break; default: std::cout << "bad_value"; break; } std::cout << std::endl; typedef typename traits::string_type string_type; typedef typename traits::char_type char_type; char_type c[5] = { 'a', 'A', ';', '{', '}', }; for(int i = 0; i < 5; ++i) { string_type s(1, c[i]); string_type sk = pt.transform(s.c_str(), s.c_str() + s.size()); string_type skp = pt.transform_primary(s.c_str(), s.c_str() + s.size()); print_string(s); std::cout << " "; print_string(sk); std::cout << " "; print_string(skp); std::cout << std::endl; } } #ifndef BOOST_NO_STD_LOCALE template void print_ctype_info(charT, const char* name) { std::locale l; const std::ctype& ct = BOOST_USE_FACET(std::ctype, l); typedef typename std::ctype::mask mask_type; mask_type m = static_cast(std::ctype::lower | std::ctype::upper); bool result = ct.is(m, static_cast('a')) && ct.is(m , static_cast('A')); std::cout << "Checking std::ctype<" << name << ">::is(mask, c):" << std::endl; #ifdef BOOST_REGEX_BUGGY_CTYPE_FACET std::cout << " Boost.Regex believes this facet to be buggy..." << std::endl; #else std::cout << " Boost.Regex believes this facet to be correct..." << std::endl; #endif std::cout << " Actual behavior, appears to be " << (result ? "correct." : "buggy.") << std::endl; assert(ct.is(std::ctype::alnum, 'a')); assert(ct.is(std::ctype::alnum, 'A')); assert(ct.is(std::ctype::alnum, '0')); } #endif int cpp_main(int /*argc*/, char * /*argv*/[]) { print_c_info(char(0), "char"); #ifndef BOOST_NO_WREGEX print_c_info(wchar_t(0), "wchar_t"); #endif print_cpp_info(char(0), "char"); #ifndef BOOST_NO_WREGEX print_cpp_info(wchar_t(0), "wchar_t"); #endif #if !BOOST_WORKAROUND(BOOST_BORLANDC, < 0x560) boost::c_regex_traits a; print_sort_syntax(a, "boost::c_regex_traits"); #ifndef BOOST_NO_WREGEX boost::c_regex_traits b; print_sort_syntax(b, "boost::c_regex_traits"); #endif #endif #ifndef BOOST_NO_STD_LOCALE boost::cpp_regex_traits c; print_sort_syntax(c, "boost::cpp_regex_traits"); #ifndef BOOST_NO_WREGEX boost::cpp_regex_traits d; print_sort_syntax(d, "boost::cpp_regex_traits"); #endif print_ctype_info(char(0), "char"); #ifndef BOOST_NO_WREGEX print_ctype_info(wchar_t(0), "wchar_t"); #endif #endif return 0; }