diff --git a/src/c_regex_traits.cpp b/src/c_regex_traits.cpp deleted file mode 100644 index cb711a53..00000000 --- a/src/c_regex_traits.cpp +++ /dev/null @@ -1,1073 +0,0 @@ -/* - * - * Copyright (c) 1998-2002 - * Dr 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) - * - */ - - /* - * LOCATION: see http://www.boost.org for most recent version. - * FILE c_regex_traits.cpp - * VERSION see - * DESCRIPTION: Implements the c_regex_traits traits class - */ - -#define BOOST_REGEX_SOURCE - -#include - -# ifdef BOOST_MSVC -# pragma warning(disable: 4702) -# endif - -#include -#include -#include -#include -#include -#include -#include -#ifdef BOOST_REGEX_V3 -#include -#include -#else -#include -#include -#endif -#include - -#include "primary_transform.hpp" - - -#if defined(BOOST_HAS_NL_TYPES_H) -#include -#endif - -// Fixes a very strange bug in Comeau 4.2.45.2 that would otherwise result in -// an instantiation loop -#if defined(__COMO__) && __COMO_VERSION__ <= 4245 -void c_regex_adopted_no_longer_needed_loop_shutter_upper() { } -#endif - -namespace{ - -// -// helper function to get the locale name, -// works around possibly broken setlocale implementations: -// -const char* re_get_locale(int id) -{ - static const char* def = "Unknown"; - const char* pl = std::setlocale(id, 0); - return pl ? pl : def; -} - -// -// character classes: -// -boost::uint_fast32_t re_char_class_id[] = { - boost::re_detail::c_traits_base::char_class_alnum, - boost::re_detail::c_traits_base::char_class_alpha, - boost::re_detail::c_traits_base::char_class_cntrl, - boost::re_detail::c_traits_base::char_class_digit, - boost::re_detail::c_traits_base::char_class_graph, - boost::re_detail::c_traits_base::char_class_lower, - boost::re_detail::c_traits_base::char_class_print, - boost::re_detail::c_traits_base::char_class_punct, - boost::re_detail::c_traits_base::char_class_space, - boost::re_detail::c_traits_base::char_class_upper, - boost::re_detail::c_traits_base::char_class_xdigit, - boost::re_detail::c_traits_base::char_class_blank, - boost::re_detail::c_traits_base::char_class_word, - boost::re_detail::c_traits_base::char_class_unicode, -}; - -const char* re_char_class_names[] = { -"alnum", -"alpha", -"cntrl", -"digit", -"graph", -"lower", -"print", -"punct", -"space", -"upper", -"xdigit", -"blank", -"word", -"unicode", -}; - -std::string* re_cls_name; -std::string* pclasses; -unsigned int classes_count = 0; -const unsigned int re_classes_max = 14; - -// -// collate names: - -struct collate_name_t -{ - std::string name; - std::string value; - collate_name_t(const char* p1, const char* p2, const char* p3, const char* p4) - : name(p1, p2), value(p3, p4) {} -}; - -std::string* re_coll_name; -std::list* pcoll_names; -unsigned int collate_count = 0; - -// -// message handling: -#ifndef BOOST_RE_MESSAGE_BASE -#define BOOST_RE_MESSAGE_BASE 0 -#endif - -#if defined(BOOST_HAS_NL_TYPES_H) -nl_catd message_cat = (nl_catd)-1; -#endif - -unsigned int message_count = 0; -std::string* mess_locale; - -BOOST_REGEX_DECL char* re_custom_error_messages[] = { - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, -}; - -#if !defined(LC_MESSAGES) -#define LC_MESSAGES LC_CTYPE -#endif - -char re_zero; -char re_ten; - -unsigned int entry_count = 0; - -std::string* ctype_name; -std::string* collate_name; -enum syntax_map_size -{ - map_size = UCHAR_MAX + 1 -}; - -std::size_t BOOST_REGEX_CALL _re_get_message(char* buf, std::size_t len, std::size_t id); - -#ifndef BOOST_NO_WREGEX - -BOOST_REGEX_DECL boost::regex_wchar_type re_zero_w; -BOOST_REGEX_DECL boost::regex_wchar_type re_ten_w; - -unsigned int nlsw_count = 0; -std::string* wlocale_name = 0; - -struct syntax_map_t -{ - boost::regex_wchar_type c; - unsigned int type; -}; - -std::list* syntax; - -std::size_t BOOST_REGEX_CALL re_get_message(boost::regex_wchar_type* buf, std::size_t len, std::size_t id) -{ - std::size_t size = _re_get_message(static_cast(0), 0, id); - if(len < size) - return size; - boost::scoped_array cb(new char[size]); - _re_get_message(cb.get(), size, id); - size = boost::c_regex_traits::strwiden(buf, len, cb.get()); - return size; -} -#endif - -inline std::size_t BOOST_REGEX_CALL re_get_message(char* buf, std::size_t len, std::size_t id) -{ - return _re_get_message(buf, len, id); -} - -void BOOST_REGEX_CALL re_init_classes() -{ - BOOST_RE_GUARD_STACK - if(classes_count == 0) - { - re_cls_name = new std::string("xxxxxxxx"); -#ifndef BOOST_NO_EXCEPTIONS - try{ -#endif - pclasses = new std::string[re_classes_max]; - BOOST_REGEX_NOEH_ASSERT(pclasses) -#ifndef BOOST_NO_EXCEPTIONS - } - catch(...) - { - delete re_cls_name; - throw; - } -#endif - } - ++classes_count; -} - -void BOOST_REGEX_CALL re_free_classes() -{ - BOOST_RE_GUARD_STACK - if(--classes_count == 0) - { - delete re_cls_name; - delete[] pclasses; - } -} - -void BOOST_REGEX_CALL re_update_classes() -{ - BOOST_RE_GUARD_STACK - if(*re_cls_name != re_get_locale(LC_CTYPE)) - { - *re_cls_name = re_get_locale(LC_CTYPE); - char buf[256]; - unsigned int i; - for(i = 0; i < re_classes_max; ++i) - { - re_get_message(buf, 256, i+300); - pclasses[i] = buf; - } - } -} - -void BOOST_REGEX_CALL re_init_collate() -{ - BOOST_RE_GUARD_STACK - if(collate_count == 0) - { - re_coll_name = new std::string("xxxxxxxx"); -#ifndef BOOST_NO_EXCEPTIONS - try{ -#endif - pcoll_names = new std::list(); - BOOST_REGEX_NOEH_ASSERT(pcoll_names) -#ifndef BOOST_NO_EXCEPTIONS - } - catch(...) - { - delete re_coll_name; - throw; - } -#endif - } - ++collate_count; -} - -void BOOST_REGEX_CALL re_free_collate() -{ - BOOST_RE_GUARD_STACK - if(--collate_count == 0) - { - delete re_coll_name; - delete pcoll_names; - } -} - -void BOOST_REGEX_CALL re_update_collate() -{ - BOOST_RE_GUARD_STACK - if(*re_coll_name != re_get_locale(LC_COLLATE)) - { - *re_coll_name = re_get_locale(LC_COLLATE); - char buf[256]; - unsigned int i = 400; - re_get_message(buf, 256, i); - while(*buf) - { - char* p1, *p2, *p3, *p4;; - p1 = buf; - while(*p1 && std::isspace((unsigned char)*p1))++p1; - p2 = p1; - while(*p2 && !std::isspace((unsigned char)*p2))++p2; - p3 = p2; - while(*p3 && std::isspace((unsigned char)*p3))++p3; - p4 = p3; - while(*p4 && !std::isspace((unsigned char)*p4))++p4; - pcoll_names->push_back(collate_name_t(p1, p2, p3, p4)); - ++i; - re_get_message(buf, 256, i); - } - } -} - -std::size_t BOOST_REGEX_CALL _re_get_message(char* buf, std::size_t len, std::size_t id) -{ - BOOST_RE_GUARD_STACK - // get the customised message if any: - #if defined(BOOST_HAS_NL_TYPES_H) - if(message_cat != (nl_catd)-1) - { - const char* m = catgets(message_cat, 0, id, 0); - if(m) - { - std::size_t size = std::strlen(m) + 1; - if(size > len) - return size; - std::strcpy(buf, m); - return size; - } - } - #endif - - // - // now get the default message if any: - return boost::re_detail::re_get_default_message(buf, len, id); -} - -void BOOST_REGEX_CALL re_message_init() -{ - BOOST_RE_GUARD_STACK - if(message_count == 0) - { - mess_locale = new std::string("xxxxxxxxxxxxxxxx"); - } - ++message_count; -} - -void BOOST_REGEX_CALL re_message_update() -{ - BOOST_RE_GUARD_STACK - // - // called whenever the global locale changes: - // - std::string l(re_get_locale(LC_MESSAGES)); - if(*mess_locale != l) - { - *mess_locale = l; -#if defined(BOOST_HAS_NL_TYPES_H) - if(message_cat != (nl_catd)-1) - { - catclose(message_cat); - message_cat = (nl_catd)-1; - } - if(*boost::re_detail::c_traits_base::get_catalogue()) - { - message_cat = catopen(boost::re_detail::c_traits_base::get_catalogue(), 0); - if(message_cat == (nl_catd)-1) - { - std::string m("Unable to open message catalog: "); - std::runtime_error err(m + boost::re_detail::c_traits_base::get_catalogue()); - boost::throw_exception(err); - } - } -#endif - for(int i = 0; i < boost::REG_E_UNKNOWN; ++i) - { - if(re_custom_error_messages[i]) - { - boost::re_detail::re_strfree(re_custom_error_messages[i]); - re_custom_error_messages[i] = 0; - } - } - } -} - -void BOOST_REGEX_CALL re_message_free() -{ - BOOST_RE_GUARD_STACK - --message_count; - if(message_count == 0) - { -#if defined(BOOST_HAS_NL_TYPES_H) - if(message_cat != (nl_catd)-1) - catclose(message_cat); -#endif - delete mess_locale; - for(int i = 0; i < boost::REG_E_UNKNOWN; ++i) - { - if(re_custom_error_messages[i]) - { - boost::re_detail::re_strfree(re_custom_error_messages[i]); - re_custom_error_messages[i] = 0; - } - } - } -} - - -const char* BOOST_REGEX_CALL re_get_error_str(unsigned int id) -{ - BOOST_RE_GUARD_STACK -#ifdef BOOST_HAS_THREADS - boost::re_detail::cs_guard g(*boost::re_detail::p_re_lock); -#endif - if(re_custom_error_messages[id] == 0) - { - char buf[256]; - _re_get_message(buf, 256, id + 200); - if(*buf) - { - re_custom_error_messages[id] = boost::re_detail::re_strdup(buf); - return re_custom_error_messages[id]; - } - return boost::re_detail::re_default_error_messages[id]; - } - return re_custom_error_messages[id]; -} - -} // namespace - -namespace boost{ -namespace re_detail{ - -char c_traits_base::regex_message_catalogue[BOOST_REGEX_MAX_PATH] = {0}; - -std::string BOOST_REGEX_CALL c_traits_base::error_string(unsigned id) -{ - return re_get_error_str(id); -} - -void BOOST_REGEX_CALL c_traits_base::do_update_collate() -{ - BOOST_RE_GUARD_STACK - re_update_collate(); - std::string s; - const char* p = "zero"; - if(c_regex_traits::lookup_collatename(s, p, p+4)) - { - jm_assert(s.size() == 1); - re_zero = *s.c_str(); - } - else - re_zero = '0'; - - p = "ten"; - if(c_regex_traits::lookup_collatename(s, p, p+3)) - { - jm_assert(s.size() == 1); - re_ten = *s.c_str(); - } - else - re_ten = 'a'; -} - -void BOOST_REGEX_CALL c_traits_base::do_update_ctype() -{ - BOOST_RE_GUARD_STACK - // start by updating the syntax map: - unsigned int i; - char buf[map_size+2]; - std::memset(syntax_map, syntax_char, map_size); - for(i = 1; i < syntax_max; ++i) - { - char* ptr = buf; - re_get_message(static_cast(buf), map_size, i+100); - for(; *ptr; ++ptr) - { - syntax_map[(unsigned char)*ptr] = (unsigned char)i; - } - } - - // now update the character class map, - // and lower case map: - std::memset(class_map, 0, sizeof(class_map)); - for(i = 0; i < map_size; ++i) - { - if(std::isalpha(i)) - class_map[i] |= char_class_alpha; - if(std::iscntrl(i)) - class_map[i] |= char_class_cntrl; - if(std::isdigit(i)) - class_map[i] |= char_class_digit; - if(std::islower(i)) - class_map[i] |= char_class_lower; - if(std::isupper(i)) - class_map[i] |= char_class_upper; - if(std::ispunct(i)) - class_map[i] |= char_class_punct; - if(std::isspace(i)) - class_map[i] |= char_class_space; - if(std::isxdigit(i)) - class_map[i] |= char_class_xdigit; - } - class_map[(unsigned char)'_'] |= char_class_underscore; - class_map[(unsigned char)' '] |= char_class_blank; - class_map[(unsigned char)'\t'] |= char_class_blank; - for(i = 0; i < map_size; ++i) - { - lower_case_map[i] = (char)std::tolower(i); - } - re_update_classes(); -} - -boost::uint_fast32_t BOOST_REGEX_CALL c_traits_base::do_lookup_class(const char* p) -{ - BOOST_RE_GUARD_STACK - unsigned int i; - for(i = 0; i < re_classes_max; ++i) - { - if(pclasses[i] == p) - { - return re_char_class_id[i]; - } - } - for(i = 0; i < re_classes_max; ++i) - { - if(std::strcmp(re_char_class_names[i], p) == 0) - { - return re_char_class_id[i]; - } - } - return 0; -} - -bool BOOST_REGEX_CALL c_traits_base::do_lookup_collate(std::string& buf, const char* p) -{ - BOOST_RE_GUARD_STACK - std::list::iterator first, last; - first = pcoll_names->begin(); - last = pcoll_names->end(); - while(first != last) - { - if((*first).name == p) - { - buf = (*first).value; - return true; - } - ++first; - } - - bool result = re_detail::re_lookup_def_collate_name(buf, p); - if((result == 0) && (std::strlen(p) == 1)) - { - result = true; - buf = *p; - } - return result; -} - -std::string BOOST_REGEX_CALL c_traits_base::set_message_catalogue(const std::string& l) -{ - if(sizeof(regex_message_catalogue) <= l.size()) - return l; - std::string old(regex_message_catalogue); - std::strcpy(regex_message_catalogue, l.c_str()); - return old; -} - -unsigned char c_traits_base::syntax_map[map_size]; -unsigned short c_traits_base::class_map[map_size]; -char c_traits_base::lower_case_map[map_size]; - -} // namespace re_detail - -#ifndef BOOST_NO_WREGEX -bool BOOST_REGEX_CALL c_regex_traits::lookup_collatename(std::basic_string& out, const regex_wchar_type* first, const regex_wchar_type* last) -{ - BOOST_RE_GUARD_STACK - std::basic_string s(first, last); - std::size_t len = strnarrow(static_cast(0), 0, s.c_str()); - scoped_array buf(new char[len]); - strnarrow(buf.get(), len, s.c_str()); - std::string t_out; - bool result = base_type::do_lookup_collate(t_out, buf.get()); - if(t_out.size() == 0) result = false; - if(result) - { - if(t_out[0]) - { - len = strwiden(static_cast(0), 0, t_out.c_str()); - scoped_array wb(new regex_wchar_type[len]); - strwiden(wb.get(), len, t_out.c_str()); - out = wb.get(); - } - else - out.append(1, (regex_wchar_type)0); - } - return result; -} -#endif - -c_regex_traits c_regex_traits::i; - -void BOOST_REGEX_CALL c_regex_traits::init() -{ - BOOST_RE_GUARD_STACK -#ifdef BOOST_HAS_THREADS - re_detail::re_init_threads(); - re_detail::cs_guard g(*re_detail::p_re_lock); -#endif - // just keep track of entry_count - if(entry_count == 0) - { - ctype_name = new std::string("xxxxxxxxxxxxxxxx"); -#ifndef BOOST_NO_EXCEPTIONS - try{ -#endif - collate_name = new std::string("xxxxxxxxxxxxxxxx"); - BOOST_REGEX_NOEH_ASSERT(collate_name) -#ifndef BOOST_NO_EXCEPTIONS - } - catch(...) - { - delete ctype_name; - throw; - } -#endif - } - re_message_init(); - re_init_classes(); - re_init_collate(); - ++entry_count; -} - -void BOOST_REGEX_CALL c_regex_traits::update() -{ - BOOST_RE_GUARD_STACK - #ifdef BOOST_HAS_THREADS - re_detail::cs_guard g(*re_detail::p_re_lock); - #endif - re_message_update(); - if(*collate_name != re_get_locale(LC_COLLATE)) - { - do_update_collate(); - *collate_name = re_get_locale(LC_COLLATE); - } - if(*ctype_name != re_get_locale(LC_CTYPE)) - { - do_update_ctype(); - *ctype_name = re_get_locale(LC_CTYPE); - } - sort_type = re_detail::find_sort_syntax(&i, &sort_delim); -} - -void BOOST_REGEX_CALL c_regex_traits::m_free() -{ - BOOST_RE_GUARD_STACK - #ifdef BOOST_HAS_THREADS - re_detail::cs_guard g(*re_detail::p_re_lock); - #endif - re_message_free(); - re_free_classes(); - re_free_collate(); - --entry_count; - // add reference to static member here to ensure - // that the linker includes it in the .exe: - if((entry_count == 0) && (0 != &c_regex_traits::i)) - { - delete ctype_name; - delete collate_name; - } -#ifdef BOOST_HAS_THREADS - g.acquire(false); - re_detail::re_free_threads(); -#endif -} - -void BOOST_REGEX_CALL c_regex_traits::transform(std::string& out, const std::string& in) -{ - BOOST_RE_GUARD_STACK - std::size_t n = std::strxfrm(0, in.c_str(), 0); - if(n == (std::size_t)(-1)) - { - out = in; - return; - } - scoped_array buf(new char[n+1]); - n = std::strxfrm(buf.get(), in.c_str(), n+1); - if(n == (std::size_t)(-1)) - { - out = in; - return; - } - out = buf.get(); -} - -void BOOST_REGEX_CALL c_regex_traits::transform_primary(std::string& out, const std::string& in) -{ - transform(out, in); - switch(sort_type) - { - case re_detail::sort_C: - case re_detail::sort_unknown: - break; - case re_detail::sort_fixed: - out.erase((int)sort_delim); - break; - case re_detail::sort_delim: - for(unsigned int j = 0; j < out.size(); ++j) - { - if((out[j] == sort_delim) && (j+1 < out.size())) - { - out.erase(j+1); - break; - } - } - } -} - -unsigned c_regex_traits::sort_type; -char c_regex_traits::sort_delim; - - -int BOOST_REGEX_CALL c_regex_traits::toi(char c) -{ - if(is_class(c, char_class_digit)) - return c - re_zero; - if(is_class(c, char_class_xdigit)) - return 10 + translate(c, true) - translate(re_ten, true); - return -1; // error!! -} - -int BOOST_REGEX_CALL c_regex_traits::toi(const char*& first, const char* last, int radix) -{ - unsigned int maxval; - if(radix < 0) - { - // if radix is less than zero, then restrict - // return value to charT. NB assumes sizeof(charT) <= sizeof(int) - radix *= -1; - maxval = 1u << (sizeof(*first) * CHAR_BIT - 1); - maxval /= radix; - maxval *= 2; - maxval -= 1; - } - else - { - maxval = (unsigned int)-1; - maxval /= radix; - } - - unsigned int result = 0; - unsigned int type = (radix > 10) ? char_class_xdigit : char_class_digit; - while((first != last) && is_class(*first, type) && (result <= maxval)) - { - result *= radix; - result += toi(*first); - ++first; - } - return result; -} - -#ifndef BOOST_NO_WREGEX - -unsigned int BOOST_REGEX_CALL c_regex_traits::syntax_type(size_type c) -{ - BOOST_RE_GUARD_STACK - std::list::const_iterator first, last; - first = syntax->begin(); - last = syntax->end(); - while(first != last) - { - if((uchar_type)(*first).c == c) - return (*first).type; - ++first; - } - return 0; -} - -void BOOST_REGEX_CALL c_regex_traits::init() -{ - BOOST_RE_GUARD_STACK - re_detail::re_init_threads(); -#ifdef BOOST_HAS_THREADS - re_detail::cs_guard g(*re_detail::p_re_lock); -#endif - re_message_init(); - re_init_classes(); - re_init_collate(); - if(nlsw_count == 0) - { - wlocale_name = new std::string("xxxxxxxxxxxxxxxx"); -#ifndef BOOST_NO_EXCEPTIONS - try{ -#endif - syntax = new std::list(); - BOOST_REGEX_NOEH_ASSERT(syntax) -#ifndef BOOST_NO_EXCEPTIONS - } - catch(...) - { - delete wlocale_name; - throw; - } -#endif - } - ++nlsw_count; -} - -bool BOOST_REGEX_CALL c_regex_traits::do_lookup_collate(std::basic_string& out, const regex_wchar_type* first, const regex_wchar_type* last) -{ - BOOST_RE_GUARD_STACK - std::basic_string s(first, last); - std::size_t len = strnarrow(static_cast(0), 0, s.c_str()); - scoped_array buf(new char[len]); - strnarrow(buf.get(), len, s.c_str()); - std::string t_out; - bool result = base_type::do_lookup_collate(t_out, buf.get()); - if(result) - { - len = strwiden(static_cast(0), 0, t_out.c_str()); - scoped_array wb(new regex_wchar_type[len]); - strwiden(wb.get(), len, t_out.c_str()); - out = wb.get(); - } - return result; -} - - -void BOOST_REGEX_CALL c_regex_traits::update() -{ - BOOST_RE_GUARD_STACK -#ifdef BOOST_HAS_THREADS - re_detail::cs_guard g(*re_detail::p_re_lock); -#endif - re_message_update(); - re_update_classes(); - re_update_collate(); - std::string l(re_get_locale(LC_CTYPE)); - if(*wlocale_name != l) - { - *wlocale_name = l; - std::basic_string s; - const regex_wchar_type* p = (const regex_wchar_type*)L"zero"; - if(do_lookup_collate(s, p, p+4)) - { - jm_assert(s.size() == 1); - re_zero_w = *s.c_str(); - } - else - re_zero_w = L'0'; - - p = (const regex_wchar_type*)L"ten"; - if(do_lookup_collate(s, p, p+3)) - { - jm_assert(s.size() == 1); - re_ten_w = *s.c_str(); - } - else - re_ten_w = L'a'; - - unsigned int i; - regex_wchar_type buf[256]; - syntax_map_t sm; - syntax->clear(); - for(i = 1; i < syntax_max; ++i) - { - regex_wchar_type* ptr = buf; - re_get_message(static_cast(buf), 256, i+100); - for(; *ptr; ++ptr) - { - sm.c = *ptr; - sm.type = i; - syntax->push_back(sm); - } - } - sort_type = re_detail::find_sort_syntax(&init_, &sort_delim); - } -} - -void BOOST_REGEX_CALL c_regex_traits::m_free() -{ - BOOST_RE_GUARD_STACK -#ifdef BOOST_HAS_THREADS - re_detail::cs_guard g(*re_detail::p_re_lock); -#endif - --nlsw_count; - re_message_free(); - re_free_classes(); - re_free_collate(); - // add reference to static member here to ensure - // that the linker includes it in the .exe: - if((nlsw_count == 0) && (0 != &c_regex_traits::init_)) - { - // cleanup: - delete wlocale_name; - delete syntax; - } -#ifdef BOOST_HAS_THREADS - g.acquire(false); - re_detail::re_free_threads(); -#endif -} - -bool BOOST_REGEX_CALL c_regex_traits::do_iswclass(regex_wchar_type c, boost::uint_fast32_t f) -{ - BOOST_RE_GUARD_STACK - if((c & ~0xFF) == 0) - return BOOST_REGEX_MAKE_BOOL(re_detail::wide_unicode_classes[(uchar_type)c] & f); - if((f & char_class_alpha) && std::iswalpha(c)) - return true; - if((f & char_class_cntrl) && std::iswcntrl(c)) - return true; - if((f & char_class_digit) && std::iswdigit(c)) - return true; - if((f & char_class_lower) && std::iswlower(c)) - return true; - if((f & char_class_punct) && std::iswpunct(c)) - return true; - if((f & char_class_space) && std::iswspace(c)) - return true; - if((f & char_class_upper) && std::iswupper(c)) - return true; - if((f & char_class_xdigit) && std::iswxdigit(c)) - return true; - if(f & char_class_unicode) - return true; - return false; -} - -void BOOST_REGEX_CALL c_regex_traits::transform(std::basic_string& out, const std::basic_string& in) -{ - BOOST_RE_GUARD_STACK -#ifndef BOOST_MSVC - std::size_t n = std::wcsxfrm(0, in.c_str(), 0); -#else - // broken wcsxfrm under VC6 doesn't check size of - // output buffer, we have no choice but to guess! - std::size_t n = 100 * in.size(); -#endif - if((n == (std::size_t)(-1)) || (n == 0)) - { - out = in; - return; - } - scoped_array buf(new regex_wchar_type[n+1]); - n = std::wcsxfrm((wchar_t*)buf.get(), (const wchar_t*)in.c_str(), n+1); - if(n == (std::size_t)(-1)) - { - out = in; - return; - } - out = buf.get(); -} - -void BOOST_REGEX_CALL c_regex_traits::transform_primary(std::basic_string& out, const std::basic_string& in) -{ - transform(out, in); - switch(sort_type) - { - case re_detail::sort_C: - case re_detail::sort_unknown: - break; - case re_detail::sort_fixed: - if((unsigned)sort_delim < out.size()) - out.erase((int)sort_delim); - break; - case re_detail::sort_delim: - for(unsigned int i = 0; i < out.size(); ++i) - { - if((out[i] == sort_delim) && (i+1 < out.size())) - { - out.erase(i+1); - break; - } - } - } -} - -unsigned c_regex_traits::sort_type; -regex_wchar_type c_regex_traits::sort_delim; - - -int BOOST_REGEX_CALL c_regex_traits::toi(regex_wchar_type c) -{ - if(is_class(c, char_class_digit)) - return c - re_zero_w; - if(is_class(c, char_class_xdigit)) - return 10 + translate(c, true) - translate(re_ten_w, true); - return -1; // error!! -} - -int BOOST_REGEX_CALL c_regex_traits::toi(const regex_wchar_type*& first, const regex_wchar_type* last, int radix) -{ - unsigned int maxval; - if(radix < 0) - { - // if radix is less than zero, then restrict - // return value to charT. NB assumes sizeof(charT) <= sizeof(int) - radix *= -1; - maxval = 1u << (sizeof(*first) * CHAR_BIT - 1); - maxval /= radix; - maxval *= 2; - maxval -= 1; - } - else - { - maxval = (unsigned int)-1; - maxval /= radix; - } - - unsigned int result = 0; - unsigned int type = (radix > 10) ? char_class_xdigit : char_class_digit; - while((first != last) && is_class(*first, type) && (result <= maxval)) - { - result *= radix; - result += toi(*first); - ++first; - } - return result; -} - -boost::uint_fast32_t BOOST_REGEX_CALL c_regex_traits::lookup_classname(const regex_wchar_type* first, const regex_wchar_type* last) -{ - std::basic_string s(first, last); - std::size_t len = strnarrow(static_cast(0), 0, s.c_str()); - scoped_array buf(new char[len]); - strnarrow(buf.get(), len, s.c_str()); - boost::uint_fast32_t result = do_lookup_class(buf.get()); - return result; -} - -c_regex_traits c_regex_traits::init_; - -std::size_t BOOST_REGEX_CALL c_regex_traits::strnarrow(char *s1, std::size_t len, const regex_wchar_type *s2) -{ - BOOST_RE_GUARD_STACK - std::size_t size = std::wcslen((const wchar_t*)s2) + 1; - if(size > len) - return size; - return std::wcstombs(s1, (const wchar_t*)s2, len); -} - -std::size_t BOOST_REGEX_CALL c_regex_traits::strwiden(regex_wchar_type *s1, std::size_t len, const char *s2) -{ - BOOST_RE_GUARD_STACK - std::size_t size = std::strlen(s2) + 1; - if(size > len) - return size; - size = std::mbstowcs((wchar_t*)s1, s2, len); - s1[size] = 0; - return size + 1; -} - -#endif // BOOST_NO_WREGEX - -} // namespace boost - - - - - diff --git a/src/c_regex_traits_common.cpp b/src/c_regex_traits_common.cpp deleted file mode 100644 index 1dc0b4b4..00000000 --- a/src/c_regex_traits_common.cpp +++ /dev/null @@ -1,559 +0,0 @@ -/* - * - * Copyright (c) 1998-2002 - * Dr 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) - * - */ - - /* - * LOCATION: see http://www.boost.org for most recent version. - * FILE: c_regex_traits_common.cpp - * VERSION: see - * DESCRIPTION: Implements common code and data for the - * c_regex_traits traits classes. - */ - - -#define BOOST_REGEX_SOURCE - -#include -#include -#include -#include -#include -#ifdef BOOST_REGEX_V3 -#include -#else -#include -#endif - - -namespace boost{ - namespace re_detail{ - -// -// these are the POSIX collating names: -// -BOOST_REGEX_DECL const char* def_coll_names[] = { -"NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "alert", "backspace", "tab", "newline", -"vertical-tab", "form-feed", "carriage-return", "SO", "SI", "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", -"SYN", "ETB", "CAN", "EM", "SUB", "ESC", "IS4", "IS3", "IS2", "IS1", "space", "exclamation-mark", -"quotation-mark", "number-sign", "dollar-sign", "percent-sign", "ampersand", "apostrophe", -"left-parenthesis", "right-parenthesis", "asterisk", "plus-sign", "comma", "hyphen", -"period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", -"colon", "semicolon", "less-than-sign", "equals-sign", "greater-than-sign", -"question-mark", "commercial-at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", -"Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "left-square-bracket", "backslash", -"right-square-bracket", "circumflex", "underscore", "grave-accent", "a", "b", "c", "d", "e", "f", -"g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "left-curly-bracket", -"vertical-line", "right-curly-bracket", "tilde", "DEL", "", -}; - -// these multi-character collating elements -// should keep most Western-European locales -// happy - we should really localise these a -// little more - but this will have to do for -// now: - -BOOST_REGEX_DECL const char* def_multi_coll[] = { - "ae", - "Ae", - "AE", - "ch", - "Ch", - "CH", - "ll", - "Ll", - "LL", - "ss", - "Ss", - "SS", - "nj", - "Nj", - "NJ", - "dz", - "Dz", - "DZ", - "lj", - "Lj", - "LJ", - "", -}; - - - -BOOST_REGEX_DECL bool BOOST_REGEX_CALL re_lookup_def_collate_name(std::string& buf, const char* name) -{ - BOOST_RE_GUARD_STACK - unsigned int i = 0; - while(*def_coll_names[i]) - { - if(std::strcmp(def_coll_names[i], name) == 0) - { - buf = (char)i; - return true; - } - ++i; - } - i = 0; - while(*def_multi_coll[i]) - { - if(std::strcmp(def_multi_coll[i], name) == 0) - { - buf = def_multi_coll[i]; - return true; - } - ++i; - } - return false; -} - -// -// messages: -BOOST_REGEX_DECL const char * re_default_error_messages[] = -{ "Success", /* REG_NOERROR */ - "No match", /* REG_NOMATCH */ - "Invalid regular expression", /* REG_BADPAT */ - "Invalid collation character", /* REG_ECOLLATE */ - "Invalid character class name", /* REG_ECTYPE */ - "Trailing backslash", /* REG_EESCAPE */ - "Invalid back reference", /* REG_ESUBREG */ - "Unmatched [ or [^", /* REG_EBRACK */ - "Unmatched ( or \\(", /* REG_EPAREN */ - "Unmatched \\{", /* REG_EBRACE */ - "Invalid content of \\{\\}", /* REG_BADBR */ - "Invalid range end", /* REG_ERANGE */ - "Memory exhausted", /* REG_ESPACE */ - "Invalid preceding regular expression", /* REG_BADRPT */ - "Premature end of regular expression", /* REG_EEND */ - "Regular expression too big", /* REG_ESIZE */ - "Unmatched ) or \\)", /* REG_ERPAREN */ - "Empty expression", /* REG_EMPTY */ - "Unknown error", /* REG_E_UNKNOWN */ - "", - "", - "", -}; - -const mss default_messages[] = { - { 100+ c_regex_traits::syntax_open_bracket, "(", }, - { 100+ c_regex_traits::syntax_close_bracket, ")", }, - { 100+ c_regex_traits::syntax_dollar, "$", }, - { 100+ c_regex_traits::syntax_caret, "^", }, - { 100+ c_regex_traits::syntax_dot, ".", }, - { 100+ c_regex_traits::syntax_star, "*", }, - { 100+ c_regex_traits::syntax_plus, "+", }, - { 100+ c_regex_traits::syntax_question, "?", }, - { 100+ c_regex_traits::syntax_open_set, "[", }, - { 100+ c_regex_traits::syntax_close_set, "]", }, - { 100+ c_regex_traits::syntax_or, "|", }, - { 100+ c_regex_traits::syntax_slash, "\\", }, - { 100+ c_regex_traits::syntax_hash, "#", }, - { 100+ c_regex_traits::syntax_dash, "-", }, - { 100+ c_regex_traits::syntax_open_brace, "{", }, - { 100+ c_regex_traits::syntax_close_brace, "}", }, - { 100+ c_regex_traits::syntax_digit, "0123456789", }, - { 100+ c_regex_traits::syntax_b, "b", }, - { 100+ c_regex_traits::syntax_B, "B", }, - { 100+ c_regex_traits::syntax_left_word, "<", }, - { 100+ c_regex_traits::syntax_right_word, ">", }, - { 100+ c_regex_traits::syntax_w, "w", }, - { 100+ c_regex_traits::syntax_W, "W", }, - { 100+ c_regex_traits::syntax_start_buffer, "`A", }, - { 100+ c_regex_traits::syntax_end_buffer, "'z", }, - { 100+ c_regex_traits::syntax_newline, "\n", }, - { 100+ c_regex_traits::syntax_comma, ",", }, - { 100+ c_regex_traits::syntax_a, "a", }, - { 100+ c_regex_traits::syntax_f, "f", }, - { 100+ c_regex_traits::syntax_n, "n", }, - { 100+ c_regex_traits::syntax_r, "r", }, - { 100+ c_regex_traits::syntax_t, "t", }, - { 100+ c_regex_traits::syntax_v, "v", }, - { 100+ c_regex_traits::syntax_x, "x", }, - { 100+ c_regex_traits::syntax_c, "c", }, - { 100+ c_regex_traits::syntax_colon, ":", }, - { 100+ c_regex_traits::syntax_equal, "=", }, - - { 100 + c_regex_traits::syntax_e, "e", }, - { 100 + c_regex_traits::syntax_l, "l", }, - { 100 + c_regex_traits::syntax_L, "L", }, - { 100 + c_regex_traits::syntax_u, "u", }, - { 100 + c_regex_traits::syntax_U, "U", }, - { 100 + c_regex_traits::syntax_s, "s", }, - { 100 + c_regex_traits::syntax_S, "S", }, - { 100 + c_regex_traits::syntax_d, "d", }, - { 100 + c_regex_traits::syntax_D, "D", }, - { 100 + c_regex_traits::syntax_E, "E", }, - { 100 + c_regex_traits::syntax_Q, "Q", }, - { 100 + c_regex_traits::syntax_X, "X", }, - { 100 + c_regex_traits::syntax_C, "C", }, - { 100 + c_regex_traits::syntax_Z, "Z", }, - { 100 + c_regex_traits::syntax_G, "G", }, - - { 100 + c_regex_traits::syntax_not, "!", }, - - { 0, "", }, - }; - -BOOST_REGEX_DECL std::size_t BOOST_REGEX_CALL re_get_default_message(char* buf, std::size_t len, std::size_t id) -{ - BOOST_RE_GUARD_STACK - const mss* pm = default_messages; - while(pm->id) - { - if(pm->id == id) - { - std::size_t size = re_strlen(pm->what) + 1; - if(size > len) - return size; - re_strcpy(buf, pm->what); - return size; - } - ++pm; - } - if(buf && len) - *buf = 0; - return 1; -} - -#ifndef BOOST_NO_WREGEX -const regex_wchar_type combining_ranges[] = { 0x0300, 0x0361, - 0x0483, 0x0486, - 0x0903, 0x0903, - 0x093E, 0x0940, - 0x0949, 0x094C, - 0x0982, 0x0983, - 0x09BE, 0x09C0, - 0x09C7, 0x09CC, - 0x09D7, 0x09D7, - 0x0A3E, 0x0A40, - 0x0A83, 0x0A83, - 0x0ABE, 0x0AC0, - 0x0AC9, 0x0ACC, - 0x0B02, 0x0B03, - 0x0B3E, 0x0B3E, - 0x0B40, 0x0B40, - 0x0B47, 0x0B4C, - 0x0B57, 0x0B57, - 0x0B83, 0x0B83, - 0x0BBE, 0x0BBF, - 0x0BC1, 0x0BCC, - 0x0BD7, 0x0BD7, - 0x0C01, 0x0C03, - 0x0C41, 0x0C44, - 0x0C82, 0x0C83, - 0x0CBE, 0x0CBE, - 0x0CC0, 0x0CC4, - 0x0CC7, 0x0CCB, - 0x0CD5, 0x0CD6, - 0x0D02, 0x0D03, - 0x0D3E, 0x0D40, - 0x0D46, 0x0D4C, - 0x0D57, 0x0D57, - 0x0F7F, 0x0F7F, - 0x20D0, 0x20E1, - 0x3099, 0x309A, - 0xFE20, 0xFE23, - 0xffff, 0xffff, }; - -BOOST_REGEX_DECL bool BOOST_REGEX_CALL is_combining(regex_wchar_type c) -{ - BOOST_RE_GUARD_STACK - const regex_wchar_type* p = combining_ranges + 1; - while(*p < c) p += 2; - --p; - if((c >= *p) && (c <= *(p+1))) - return true; - return false; -} - -BOOST_REGEX_DECL unsigned short wide_unicode_classes[] = { - c_traits_base::char_class_cntrl, // '' 0 - c_traits_base::char_class_cntrl, // '' 1 - c_traits_base::char_class_cntrl, // '' 2 - c_traits_base::char_class_cntrl, // '' 3 - c_traits_base::char_class_cntrl, // '' 4 - c_traits_base::char_class_cntrl, // '' 5 - c_traits_base::char_class_cntrl, // '' 6 - c_traits_base::char_class_cntrl, // '' 7 - c_traits_base::char_class_cntrl, // '' 8 - c_traits_base::char_class_cntrl | c_traits_base::char_class_space | c_traits_base::char_class_blank, // '' 9 - c_traits_base::char_class_cntrl | c_traits_base::char_class_space, // '' 10 - c_traits_base::char_class_cntrl | c_traits_base::char_class_space, // '' 11 - c_traits_base::char_class_cntrl | c_traits_base::char_class_space, // '' 12 - c_traits_base::char_class_cntrl | c_traits_base::char_class_space, // '' 13 - c_traits_base::char_class_cntrl, // '.' 14 - c_traits_base::char_class_cntrl, // '.' 15 - c_traits_base::char_class_cntrl, // '.' 16 - c_traits_base::char_class_cntrl, // '.' 17 - c_traits_base::char_class_cntrl, // '.' 18 - c_traits_base::char_class_cntrl, // '.' 19 - c_traits_base::char_class_cntrl, // '.' 20 - c_traits_base::char_class_cntrl, // '.' 21 - c_traits_base::char_class_cntrl, // '.' 22 - c_traits_base::char_class_cntrl, // '.' 23 - c_traits_base::char_class_cntrl, // '.' 24 - c_traits_base::char_class_cntrl, // '' 25 - c_traits_base::char_class_cntrl, // '' 26 - c_traits_base::char_class_cntrl, // '' 27 - c_traits_base::char_class_cntrl, // '.' 28 - c_traits_base::char_class_cntrl, // '.' 29 - c_traits_base::char_class_cntrl, // '.' 30 - c_traits_base::char_class_cntrl, // '.' 31 - c_traits_base::char_class_space | c_traits_base::char_class_blank, // ' ' 32 - c_traits_base::char_class_punct, // '!' 33 - c_traits_base::char_class_punct, // '"' 34 - c_traits_base::char_class_punct, // '#' 35 - c_traits_base::char_class_punct, // '$' 36 - c_traits_base::char_class_punct, // '%' 37 - c_traits_base::char_class_punct, // '&' 38 - c_traits_base::char_class_punct, // ''' 39 - c_traits_base::char_class_punct, // '(' 40 - c_traits_base::char_class_punct, // ')' 41 - c_traits_base::char_class_punct, // '*' 42 - c_traits_base::char_class_punct, // '+' 43 - c_traits_base::char_class_punct, // ',' 44 - c_traits_base::char_class_punct, // '-' 45 - c_traits_base::char_class_punct, // '.' 46 - c_traits_base::char_class_punct, // '/' 47 - c_traits_base::char_class_digit | c_traits_base::char_class_xdigit, // '0' 48 - c_traits_base::char_class_digit | c_traits_base::char_class_xdigit, // '1' 49 - c_traits_base::char_class_digit | c_traits_base::char_class_xdigit, // '2' 50 - c_traits_base::char_class_digit | c_traits_base::char_class_xdigit, // '3' 51 - c_traits_base::char_class_digit | c_traits_base::char_class_xdigit, // '4' 52 - c_traits_base::char_class_digit | c_traits_base::char_class_xdigit, // '5' 53 - c_traits_base::char_class_digit | c_traits_base::char_class_xdigit, // '6' 54 - c_traits_base::char_class_digit | c_traits_base::char_class_xdigit, // '7' 55 - c_traits_base::char_class_digit | c_traits_base::char_class_xdigit, // '8' 56 - c_traits_base::char_class_digit | c_traits_base::char_class_xdigit, // '9' 57 - c_traits_base::char_class_punct, // ':' 58 - c_traits_base::char_class_punct, // ';' 59 - c_traits_base::char_class_punct, // '<' 60 - c_traits_base::char_class_punct, // '=' 61 - c_traits_base::char_class_punct, // '>' 62 - c_traits_base::char_class_punct, // '?' 63 - c_traits_base::char_class_punct, // '@' 64 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper | c_traits_base::char_class_xdigit, // 'A' 65 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper | c_traits_base::char_class_xdigit, // 'B' 66 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper | c_traits_base::char_class_xdigit, // 'C' 67 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper | c_traits_base::char_class_xdigit, // 'D' 68 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper | c_traits_base::char_class_xdigit, // 'E' 69 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper | c_traits_base::char_class_xdigit, // 'F' 70 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // 'G' 71 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // 'H' 72 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // 'I' 73 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // 'J' 74 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // 'K' 75 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // 'L' 76 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // 'M' 77 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // 'N' 78 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // 'O' 79 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // 'P' 80 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // 'Q' 81 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // 'R' 82 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // 'S' 83 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // 'T' 84 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // 'U' 85 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // 'V' 86 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // 'W' 87 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // 'X' 88 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // 'Y' 89 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // 'Z' 90 - c_traits_base::char_class_punct, // '[' 91 - c_traits_base::char_class_punct, // '\' 92 - c_traits_base::char_class_punct, // ']' 93 - c_traits_base::char_class_punct, // '^' 94 - c_traits_base::char_class_punct | c_traits_base::char_class_underscore, // '_' 95 - c_traits_base::char_class_punct, // '`' 96 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower | c_traits_base::char_class_xdigit, // 'a' 97 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower | c_traits_base::char_class_xdigit, // 'b' 98 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower | c_traits_base::char_class_xdigit, // 'c' 99 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower | c_traits_base::char_class_xdigit, // 'd' 100 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower | c_traits_base::char_class_xdigit, // 'e' 101 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower | c_traits_base::char_class_xdigit, // 'f' 102 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // 'g' 103 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // 'h' 104 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // 'i' 105 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // 'j' 106 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // 'k' 107 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // 'l' 108 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // 'm' 109 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // 'n' 110 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // 'o' 111 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // 'p' 112 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // 'q' 113 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // 'r' 114 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // 's' 115 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // 't' 116 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // 'u' 117 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // 'v' 118 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // 'w' 119 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // 'x' 120 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // 'y' 121 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // 'z' 122 - c_traits_base::char_class_punct, // '{' 123 - c_traits_base::char_class_punct, // '|' 124 - c_traits_base::char_class_punct, // '}' 125 - c_traits_base::char_class_punct, // '~' 126 - - c_traits_base::char_class_cntrl, // '' 127 - c_traits_base::char_class_cntrl, // '' 128 - c_traits_base::char_class_cntrl, // '' 129 - c_traits_base::char_class_cntrl, // '' 130 - c_traits_base::char_class_cntrl, // '' 131 - c_traits_base::char_class_cntrl, // '' 132 - c_traits_base::char_class_cntrl, // '' 133 - c_traits_base::char_class_cntrl, // '' 134 - c_traits_base::char_class_cntrl, // '' 135 - c_traits_base::char_class_cntrl, // '' 136 - c_traits_base::char_class_cntrl, // '' 137 - c_traits_base::char_class_cntrl, // '' 138 - c_traits_base::char_class_cntrl, // '' 139 - c_traits_base::char_class_cntrl, // '' 140 - c_traits_base::char_class_cntrl, // '' 141 - c_traits_base::char_class_cntrl, // '' 142 - c_traits_base::char_class_cntrl, // '' 143 - c_traits_base::char_class_cntrl, // '' 144 - c_traits_base::char_class_cntrl, // '' 145 - c_traits_base::char_class_cntrl, // '' 146 - c_traits_base::char_class_cntrl, // '' 147 - c_traits_base::char_class_cntrl, // '' 148 - c_traits_base::char_class_cntrl, // '' 149 - c_traits_base::char_class_cntrl, // '' 150 - c_traits_base::char_class_cntrl, // '' 151 - c_traits_base::char_class_cntrl, // '' 152 - c_traits_base::char_class_cntrl, // '' 153 - c_traits_base::char_class_cntrl, // '' 154 - c_traits_base::char_class_cntrl, // '' 155 - c_traits_base::char_class_cntrl, // '' 156 - c_traits_base::char_class_cntrl, // '' 157 - c_traits_base::char_class_cntrl, // '' 158 - c_traits_base::char_class_cntrl, // '' 159 - c_traits_base::char_class_space | c_traits_base::char_class_blank, // '' 160 - c_traits_base::char_class_punct, // '' 161 - c_traits_base::char_class_punct, // '' 162 - c_traits_base::char_class_punct, // '' 163 - c_traits_base::char_class_punct, // '' 164 - c_traits_base::char_class_punct, // '' 165 - c_traits_base::char_class_punct, // '' 166 - c_traits_base::char_class_punct, // '' 167 - c_traits_base::char_class_punct, // '' 168 - c_traits_base::char_class_punct, // '' 169 - c_traits_base::char_class_punct, // '' 170 - c_traits_base::char_class_punct, // '' 171 - c_traits_base::char_class_punct, // '' 172 - c_traits_base::char_class_punct, // '' 173 - c_traits_base::char_class_punct, // '' 174 - c_traits_base::char_class_punct, // '' 175 - c_traits_base::char_class_punct, // '' 176 - c_traits_base::char_class_punct, // '' 177 - c_traits_base::char_class_punct, // '' 178 - c_traits_base::char_class_punct, // '' 179 - c_traits_base::char_class_punct, // '' 180 - c_traits_base::char_class_punct, // '' 181 - c_traits_base::char_class_punct, // '' 182 - c_traits_base::char_class_punct, // '' 183 - c_traits_base::char_class_punct, // '' 184 - c_traits_base::char_class_punct, // '' 185 - c_traits_base::char_class_punct, // '' 186 - c_traits_base::char_class_punct, // '' 187 - c_traits_base::char_class_punct, // '' 188 - c_traits_base::char_class_punct, // '' 189 - c_traits_base::char_class_punct, // '' 190 - c_traits_base::char_class_punct, // '' 191 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 192 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 193 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 194 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 195 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 196 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 197 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 198 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 199 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 200 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 201 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 202 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 203 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 204 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 205 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 206 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 207 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 208 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 209 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 210 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 211 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 212 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 213 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 214 - c_traits_base::char_class_punct, // '' 215 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 216 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 217 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 218 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 219 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 220 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 221 - c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '' 222 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 223 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 224 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 225 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 226 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 227 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 228 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 229 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 230 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 231 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 232 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 233 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 234 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 235 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 236 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 237 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 238 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 239 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 240 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 241 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 242 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 243 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 244 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 245 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 246 - c_traits_base::char_class_punct, // '' 247 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 248 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 249 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 250 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 251 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 252 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 253 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 254 - c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '' 255 -}; - -BOOST_REGEX_DECL regex_wchar_type wide_lower_case_map[] = { - 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, - 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, - 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, - 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, - 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, - 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xd7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf, - 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, - 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, -}; -#endif // BOOST_NO_WREGEX - - } // namespace re_detail -} // namespace boost - - - - diff --git a/src/cpp_regex_traits.cpp b/src/cpp_regex_traits.cpp deleted file mode 100644 index 7bd7bf09..00000000 --- a/src/cpp_regex_traits.cpp +++ /dev/null @@ -1,906 +0,0 @@ -/* - * - * Copyright (c) 1998-2002 - * Dr 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) - * - */ - - /* - * LOCATION: see http://www.boost.org for most recent version. - * FILE: c_regex_traits.cpp - * VERSION: see - * DESCRIPTION: Implements the cpp_regex_traits traits class - */ - - -#define BOOST_REGEX_SOURCE - -#include - -#if defined(BOOST_REGEX_HAS_SHORT_WCHAR_T) && !defined(_NATIVE_WCHAR_T_DEFINED) -# pragma message ("disabling support for class cpp_regex_traits - rebuild with /Zc:wchar_t if you really need this") -# define BOOST_NO_WREGEX -#endif - -#if !defined(BOOST_NO_STD_LOCALE) - -# ifdef BOOST_MSVC -# pragma warning(disable:4786 4702 4127 4244) -# endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "primary_transform.hpp" - -# ifdef BOOST_MSVC -# pragma warning(disable:4786 4702 4127 4244) -# endif - -namespace{ - const unsigned int re_classes_max = 14; - const unsigned int char_set_size = CHAR_MAX - CHAR_MIN + 1; - -boost::uint_fast32_t re_char_class_id[] = { - boost::re_detail::cpp_regex_traits_base::char_class_alnum, - boost::re_detail::cpp_regex_traits_base::char_class_alpha, - boost::re_detail::cpp_regex_traits_base::char_class_cntrl, - boost::re_detail::cpp_regex_traits_base::char_class_digit, - boost::re_detail::cpp_regex_traits_base::char_class_graph, - boost::re_detail::cpp_regex_traits_base::char_class_lower, - boost::re_detail::cpp_regex_traits_base::char_class_print, - boost::re_detail::cpp_regex_traits_base::char_class_punct, - boost::re_detail::cpp_regex_traits_base::char_class_space, - boost::re_detail::cpp_regex_traits_base::char_class_upper, - boost::re_detail::cpp_regex_traits_base::char_class_xdigit, - boost::re_detail::cpp_regex_traits_base::char_class_blank, - boost::re_detail::cpp_regex_traits_base::char_class_word, - boost::re_detail::cpp_regex_traits_base::char_class_unicode, -}; - -const char* re_char_class_names[] = { -"alnum", -"alpha", -"cntrl", -"digit", -"graph", -"lower", -"print", -"punct", -"space", -"upper", -"xdigit", -"blank", -"word", -"unicode", -}; - -template > -class parser_buf : public ::std::basic_streambuf -{ - typedef ::std::basic_streambuf base_type; - typedef typename base_type::int_type int_type; - typedef typename base_type::char_type char_type; - typedef typename base_type::pos_type pos_type; - typedef ::std::streamsize streamsize; - typedef typename base_type::off_type off_type; -public: - parser_buf() : base_type() { setbuf(0, 0); } - const charT* getnext() { return this->gptr(); } -protected: - std::basic_streambuf* setbuf(char_type* s, streamsize n); - typename parser_buf::pos_type seekpos(pos_type sp, ::std::ios_base::openmode which); - typename parser_buf::pos_type seekoff(off_type off, ::std::ios_base::seekdir way, ::std::ios_base::openmode which); -private: - parser_buf& operator=(const parser_buf&); - parser_buf(const parser_buf&); -}; - -template -std::basic_streambuf* -parser_buf::setbuf(char_type* s, streamsize n) -{ - this->setg(s, s, s + n); - return this; -} - -template -typename parser_buf::pos_type -parser_buf::seekoff(off_type off, ::std::ios_base::seekdir way, ::std::ios_base::openmode which) -{ - if(which & ::std::ios_base::out) - return pos_type(off_type(-1)); - std::ptrdiff_t size = this->egptr() - this->eback(); - std::ptrdiff_t pos = this->gptr() - this->eback(); - charT* g = this->eback(); - switch(way) - { - case ::std::ios_base::beg: - if((off < 0) || (off > size)) - return pos_type(off_type(-1)); - else - this->setg(g, g + off, g + size); - break; - case ::std::ios_base::end: - if((off < 0) || (off > size)) - return pos_type(off_type(-1)); - else - this->setg(g, g + size - off, g + size); - break; - case ::std::ios_base::cur: - { - std::ptrdiff_t newpos = pos + off; - if((newpos < 0) || (newpos > size)) - return pos_type(off_type(-1)); - else - this->setg(g, g + newpos, g + size); - break; - } - default: ; - } - return static_cast(this->gptr() - this->eback()); -} - -template -typename parser_buf::pos_type -parser_buf::seekpos(pos_type sp, ::std::ios_base::openmode which) -{ - if(which & ::std::ios_base::out) - return pos_type(off_type(-1)); - off_type size = this->egptr() - this->eback(); - charT* g = this->eback(); - if(off_type(sp) <= size) - { - this->setg(g, g + off_type(sp), g + size); - } - return pos_type(off_type(-1)); -} - - -} // namespace - -namespace boost{ - namespace re_detail{ - -template <> -struct message_data -{ - unsigned char syntax_map[CHAR_MAX-CHAR_MIN]; - std::map > collating_elements; - std::map > classes; - //std::string _zero; - //std::string _ten; - parser_buf sbuf; - std::istream is; - std::string error_strings[boost::REG_E_UNKNOWN+1]; - - message_data(const std::locale& l, std::string regex_message_catalogue); -private: - message_data(const message_data&); - message_data& operator=(const message_data&); -}; - - -message_data::message_data(const std::locale& l, std::string regex_message_catalogue) - : is(&sbuf) -{ - is.imbue(l); -#ifndef BOOST_NO_STD_MESSAGES - - const std::messages* pm = 0; -#ifndef __IBMCPP__ - std::messages::catalog cat = static_cast::catalog>(-1); -#else - std::messages::catalog cat = reinterpret_cast::catalog>(-1); -#endif - if(regex_message_catalogue.size()) - { - pm = &BOOST_USE_FACET(std::messages, l); - cat = pm->open(regex_message_catalogue, l); - if(cat < 0) - { - std::string m("Unable to open message catalog: "); - std::runtime_error err(m + regex_message_catalogue); - boost::throw_exception(err); - } - } -#endif - std::memset(syntax_map, cpp_regex_traits::syntax_char, 256); - unsigned i; - scoped_array a; - std::size_t array_size = 0; - std::size_t new_size; - for(i = 1; i < cpp_regex_traits::syntax_max; ++i) - { - new_size = re_get_default_message(0, 0, i+100); - if(new_size > array_size) - { - a.reset(new char[new_size]); - array_size = new_size; - } - re_get_default_message(a.get(), array_size, i+100); - std::string s = a.get(); -#ifndef BOOST_NO_STD_MESSAGES - if((int)cat >= 0) - s = pm->get(cat, 0, i+100, s); -#endif - for(std::size_t j = 0; j < s.size(); ++j) - { - syntax_map[(unsigned char)s[j]] = (unsigned char)(i); - } - } - -#ifndef BOOST_NO_STD_MESSAGES - // load any custom collate names: - // - // for some reason Borland C++ Builder 6 won't let us use - // std::isspace(char, std::locale) unless we call it - // unqualifed - weird. This seems to be affecting other - // STLport users as well (gcc3.1+STLport5), so enable the - // workaround for all STLport users... - // -#if (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) && !defined(BOOST_MSVC) - using namespace std; - using stlport::isspace; -# define BOOST_REGEX_STD -#else -# define BOOST_REGEX_STD std:: -#endif - - std::string c1, c2; - i = 400; - if((int)cat >= 0) - { - c2 = pm->get(cat, 0, i, c1); - while(c2.size()) - { - const char* p1, *p2, *p3, *p4;; - p1 = c2.c_str(); - while(*p1 && BOOST_REGEX_STD isspace((char)*p1, l))++p1; - p2 = p1; - while(*p2 && !BOOST_REGEX_STD isspace((char)*p2, l))++p2; - p3 = p2; - while(*p3 && BOOST_REGEX_STD isspace((char)*p3, l))++p3; - p4 = p3; - while(*p4 && !BOOST_REGEX_STD isspace((char)*p4, l))++p4; - collating_elements[std::string(p1, p2)] = std::string(p3, p4); - - ++i; - c2 = pm->get(cat, 0, i, c1); - } - } -#endif - std::string m; - std::string s; -#ifndef BOOST_NO_STD_MESSAGES - if((int)cat >= 0) - { - for(i = 0; i < re_classes_max; ++i) - { - s = pm->get(cat, 0, i+300, m); - if(s.size()) - classes[s] = i; - } - for(i = 0; i <= boost::REG_E_UNKNOWN ; ++i) - { - s = pm->get(cat, 0, i+200, m); - error_strings[i] = s; - } - } - - if((int)cat >= 0) - pm->close(cat); -#endif -} - -std::string BOOST_REGEX_CALL cpp_regex_traits_base::set_message_catalogue(const std::string& l) -{ - if(sizeof(regex_message_cat) <= l.size()) - return l; - std::string old(regex_message_cat); - std::strcpy(regex_message_cat, l.c_str()); - return old; -} - -char cpp_regex_traits_base::regex_message_cat[BOOST_REGEX_MAX_PATH] = {0}; - - -} // namespace re_detail - - -cpp_regex_traits::cpp_regex_traits() -{ - pmd = new re_detail::message_data(locale_inst, regex_message_cat); - psyntax = pmd->syntax_map; -#ifndef BOOST_NO_EXCEPTIONS - try{ -#endif - lower_map = new char[char_set_size]; - BOOST_REGEX_NOEH_ASSERT(lower_map) -#ifndef BOOST_NO_EXCEPTIONS - } - catch(...) - { - delete pmd; - throw; - } -#endif - for(unsigned int i = 0; i < char_set_size; ++i) - lower_map[i] = static_cast(i); - pctype = &BOOST_USE_FACET(std::ctype, locale_inst); - pctype->tolower(&lower_map[0], &lower_map[char_set_size]); - pcollate = &BOOST_USE_FACET(std::collate, locale_inst); - sort_type = re_detail::find_sort_syntax(this, &(this->sort_delim)); -} - -void cpp_regex_traits::swap(cpp_regex_traits& that) -{ - std::swap(locale_inst, that.locale_inst); // this one goes first - std::swap(pmd, that.pmd); - std::swap(psyntax, that.psyntax); - std::swap(lower_map, that.lower_map); - std::swap(pctype, that.pctype); - std::swap(pcollate, that.pcollate); - std::swap(sort_type, that.sort_type); - std::swap(sort_delim, that.sort_delim); -} - -cpp_regex_traits::~cpp_regex_traits() -{ - delete pmd; - delete[] lower_map; -} - -int BOOST_REGEX_CALL cpp_regex_traits::toi(char c)const -{ - pmd->sbuf.pubsetbuf(&c, 1); - pmd->is.clear(); - pmd->is >> std::dec; - int val; - if(pmd->is >> val) - { - return val; - } - else - return 0; -} - -int BOOST_REGEX_CALL cpp_regex_traits::toi(const char*& first, const char* last, int radix)const -{ - pmd->sbuf.pubsetbuf(const_cast(first), static_cast(last-first)); - pmd->is.clear(); - if(std::abs(radix) == 16) pmd->is >> std::hex; - else if(std::abs(radix) == 8) pmd->is >> std::oct; - else pmd->is >> std::dec; - int val; - if(pmd->is >> val) - { - first = first + ((last - first) - pmd->sbuf.in_avail()); - return val; - } - else - return 0; -} - -boost::uint_fast32_t BOOST_REGEX_CALL cpp_regex_traits::lookup_classname(const char* first, const char* last)const -{ - BOOST_RE_GUARD_STACK - unsigned int i; - std::string s(first, last); - - std::map >::const_iterator pos = pmd->classes.find(s); - if(pos != pmd->classes.end()) - return re_char_class_id[(*pos).second]; - - for(i = 0; i < re_classes_max; ++i) - { - if(s == re_char_class_names[i]) - return re_char_class_id[i]; - } - return 0; -} - -bool BOOST_REGEX_CALL cpp_regex_traits::lookup_collatename(std::string& s, const char* first, const char* last)const -{ - BOOST_RE_GUARD_STACK - std::string name(first, last); - std::map >::const_iterator pos = pmd->collating_elements.find(name); - if(pos != pmd->collating_elements.end()) - { - s = (*pos).second; - return true; - } - return re_detail::re_lookup_def_collate_name(s, name.c_str()); -} - -void BOOST_REGEX_CALL cpp_regex_traits::transform_primary(std::string& out, const std::string& in)const -{ - transform(out, in); - switch(sort_type) - { - case re_detail::sort_C: - case re_detail::sort_unknown: - break; - case re_detail::sort_fixed: - if((unsigned)sort_delim < out.size()) - out.erase((int)sort_delim); - break; - case re_detail::sort_delim: - for(unsigned int i = 0; i < out.size(); ++i) - { - if((out[i] == sort_delim) && (i+1 < out.size())) - { - out.erase(i+1); - break; - } - } - } -} - - -std::string BOOST_REGEX_CALL cpp_regex_traits::error_string(unsigned id)const -{ - if((id <= boost::REG_E_UNKNOWN) && (pmd->error_strings[id].size())) - return pmd->error_strings[id]; - return boost::re_detail::re_default_error_messages[id]; -} - -cpp_regex_traits::locale_type BOOST_REGEX_CALL cpp_regex_traits::imbue(locale_type l) -{ - locale_type old_l(locale_inst); - locale_inst = l; - re_detail::message_data* npmd = new re_detail::message_data(locale_inst, regex_message_cat); - delete pmd; - pmd = npmd; - psyntax = pmd->syntax_map; - for(unsigned int i = 0; i < char_set_size; ++i) - lower_map[i] = static_cast(i); - pctype = &BOOST_USE_FACET(std::ctype, locale_inst); - pctype->tolower(&lower_map[0], &lower_map[char_set_size]); - pcollate = &BOOST_USE_FACET(std::collate, locale_inst); - sort_type = re_detail::find_sort_syntax(this, &(this->sort_delim)); - return old_l; -} - -#if !defined(BOOST_NO_WREGEX) && !defined(BOOST_NO_STD_WSTREAMBUF) - -namespace re_detail{ - -std::string BOOST_REGEX_CALL to_narrow(const std::basic_string& is, const std::codecvt& cvt) -{ - BOOST_RE_GUARD_STACK - std::basic_string::size_type bufsize = is.size() * 2; - // - // declare buffer first as VC6 workaround for internal compiler error! - char* pc = new char[bufsize]; - scoped_array t(pc); - #if defined(BOOST_MSVC) && !defined(DINKUMWARE_CE) - std::mbstate_t state = 0; - #else - std::mbstate_t state = std::mbstate_t(); - #endif - - const wchar_t* next_in; - char* next_out; - while(true) - { - switch(cvt.out(state, is.c_str(), is.c_str() + is.size(), next_in, t.get(), t.get() + bufsize, next_out)) - { - case std::codecvt_base::ok: - return std::string(t.get(), next_out); - case std::codecvt_base::partial: - bufsize *= 2; - t.reset(new char[bufsize]); - continue; - case std::codecvt_base::error: - // not much we can do here but guess: - case std::codecvt_base::noconv: - std::string out; - for(unsigned i = 0; i < is.size(); ++i) - { - out.append(1, (char)is[i]); - } - return out; - } - } -} - -std::wstring BOOST_REGEX_CALL to_wide(const std::string& is, const std::codecvt& cvt) -{ - BOOST_RE_GUARD_STACK - std::string::size_type bufsize = is.size() + 2; - std::string::size_type maxsize = is.size() * 100; - // - // declare buffer first as VC6 workaround for internal compiler error! - wchar_t* pc = new wchar_t[bufsize]; - scoped_array t(pc); - #if defined(BOOST_MSVC) && !defined(DINKUMWARE_CE) - std::mbstate_t state = 0; - #else - std::mbstate_t state = std::mbstate_t(); - #endif - - - wchar_t* next_out; - const char* next_in; - while(true) - { - switch(cvt.in(state, is.c_str(), is.c_str() + is.size(), next_in, t.get(), t.get() + bufsize, next_out)) - { - case std::codecvt_base::ok: - return std::wstring(t.get(), next_out); - case std::codecvt_base::partial: - bufsize *= 2; - if(bufsize < maxsize) - { - t.reset(new wchar_t[bufsize]); - continue; - } - // - // error fall through: - case std::codecvt_base::error: - // not much we can do here but guess: - case std::codecvt_base::noconv: - std::wstring out; - for(unsigned i = 0; i < is.size(); ++i) - { - out.append(1, is[i]); - } - return out; - } - } -} - - - -template <> -struct message_data -{ -#ifndef BOOST_NO_STD_MESSAGES - typedef std::messages::string_type string_type; -#else - typedef std::wstring string_type; -#endif - - string_type name; - - struct syntax_map - { - wchar_t c; - unsigned int type; - }; - - std::list syntax; - std::map classes; - std::map collating_elements; - unsigned char syntax_[CHAR_MAX-CHAR_MIN+1]; - - parser_buf sbuf; - std::wistream is; - std::string error_strings[boost::REG_E_UNKNOWN+1]; - - message_data(const std::locale& l, const std::string& regex_message_catalogue); -private: - message_data(const message_data&); - message_data& operator=(const message_data&); -}; - -message_data::message_data(const std::locale& l, const std::string& regex_message_catalogue) - : is(&sbuf) -{ - is.imbue(l); - syntax_map m; - typedef std::codecvt cvt_type; - const cvt_type& cvt = BOOST_USE_FACET(cvt_type, l); -#ifndef BOOST_NO_STD_MESSAGES - const std::messages& msgs = BOOST_USE_FACET(std::messages, l); -#ifndef __IBMCPP__ - std::messages::catalog cat = static_cast::catalog>(-1); -#else - std::messages::catalog cat = reinterpret_cast::catalog>(-1); -#endif - if(regex_message_catalogue.size()) - { - cat = msgs.open(regex_message_catalogue, l); - if(cat < 0) - { - std::string mess("Unable to open message catalog: "); - std::runtime_error err(mess + regex_message_catalogue); - boost::throw_exception(err); - } - } -#endif - scoped_array a; - std::size_t array_size = 0; - std::size_t new_size; - std::size_t i; - std::memset(syntax_, cpp_regex_traits::syntax_char, sizeof(syntax_)); - for(i = 1; i < cpp_regex_traits::syntax_max; ++i) - { - new_size = re_get_default_message(0, 0, i+100); - if(new_size > array_size) - { - a.reset(new char[new_size]); - array_size = new_size; - } - re_get_default_message(a.get(), array_size, i+100); - std::string ns = a.get(); - string_type s = to_wide(ns, cvt); -#ifndef BOOST_NO_STD_MESSAGES - if((int)cat >= 0) - s = BOOST_USE_FACET(std::messages, l).get(cat, 0, (int)i+100, s); -#endif - for(unsigned int j = 0; j < s.size(); ++j) - { -#if defined(WCHAR_MIN) && (WCHAR_MIN == 0) - if(s[j] <= UCHAR_MAX) -#else - if((s[j] <= UCHAR_MAX) && (s[j] >= 0)) -#endif - syntax_[s[j]] = static_cast(i); - else - { - m.c = s[j]; - m.type = static_cast(i); - syntax.push_back(m); - } - } - } - -#ifndef BOOST_NO_STD_MESSAGES - // load any custom collate names: - string_type c1, c2; - i = 400; - if((int)cat >= 0) - { - c2 = msgs.get(cat, 0, (int)i, c1); - while(c2.size()) - { - const wchar_t* p1, *p2, *p3, *p4;; - p1 = c2.c_str(); - while(*p1 && BOOST_REGEX_STD isspace((wchar_t)*p1, l))++p1; - p2 = p1; - while(*p2 && !BOOST_REGEX_STD isspace((wchar_t)*p2, l))++p2; - p3 = p2; - while(*p3 && BOOST_REGEX_STD isspace((wchar_t)*p3, l))++p3; - p4 = p3; - while(*p4 && !BOOST_REGEX_STD isspace((wchar_t)*p4, l))++p4; - collating_elements[std::basic_string(p1, p2)] = std::basic_string(p3, p4); - - ++i; - c2 = msgs.get(cat, 0, (int)i, c1); - } - } - - if((int)cat >= 0) - { - c2.erase(); - for(i = 0; i < re_classes_max; ++i) - { - c1 = msgs.get(cat, 0, static_cast(i+300), c2); - if(c1.size()) - classes[c1] = i; - } - for(i = 0; i <= boost::REG_E_UNKNOWN ; ++i) - { - c1 = msgs.get(cat, 0, static_cast(i+200), c2); - error_strings[i] = to_narrow(c1, cvt); - } - } - - if((int)cat >= 0) - msgs.close(cat); -#endif -} - -} // namespace re_detail - -unsigned int BOOST_REGEX_CALL cpp_regex_traits::do_syntax_type(size_type c)const -{ - std::list::syntax_map>::const_iterator i, j; - i = pmd->syntax.begin(); - j = pmd->syntax.end(); - while(i != j) - { - if(((uchar_type)(*i).c) == c) - return (*i).type; - ++i; - } - return 0; -} - -void BOOST_REGEX_CALL cpp_regex_traits::transform_primary(std::basic_string& out, const std::basic_string& in)const -{ - transform(out, in); - switch(sort_type) - { - case re_detail::sort_C: - case re_detail::sort_unknown: - break; - case re_detail::sort_fixed: - if((unsigned)sort_delim < out.size()) - out.erase((int)sort_delim); - break; - case re_detail::sort_delim: - for(unsigned int i = 0; i < out.size(); ++i) - { - if((out[i] == sort_delim) && (i+1 < out.size())) - { - out.erase(i+1); - break; - } - } - } -} - -int BOOST_REGEX_CALL cpp_regex_traits::toi(wchar_t c)const -{ - pmd->sbuf.pubsetbuf(&c, 1); - pmd->is.clear(); - pmd->is >> std::dec; - int val; - if(pmd->is >> val) - { - return val; - } - else - return 0; -} - -int BOOST_REGEX_CALL cpp_regex_traits::toi(const wchar_t*& first, const wchar_t* last, int radix)const -{ - pmd->sbuf.pubsetbuf(const_cast(first), static_cast(last-first)); - pmd->is.clear(); - if(std::abs(radix) == 16) pmd->is >> std::hex; - else if(std::abs(radix) == 8) pmd->is >> std::oct; - else pmd->is >> std::dec; - int val; - if(pmd->is >> val) - { - first = first + ((last - first) - pmd->sbuf.in_avail()); - return val; - } - else - return 0; -} - -boost::uint_fast32_t BOOST_REGEX_CALL cpp_regex_traits::lookup_classname(const wchar_t* first, const wchar_t* last)const -{ - BOOST_RE_GUARD_STACK - unsigned int i; - std::wstring s(first, last); - - std::map::const_iterator pos = pmd->classes.find(s); - if(pos != pmd->classes.end()) - return re_char_class_id[(*pos).second]; - - std::string ns = re_detail::to_narrow(s, *pcdv); - - for(i = 0; i < re_classes_max; ++i) - { - if(ns == re_char_class_names[i]) - return re_char_class_id[i]; - } - return 0; -} - -bool BOOST_REGEX_CALL cpp_regex_traits::lookup_collatename(std::basic_string& s, const wchar_t* first, const wchar_t* last)const -{ - BOOST_RE_GUARD_STACK - std::wstring name(first, last); - std::map::const_iterator pos = pmd->collating_elements.find(name); - if(pos != pmd->collating_elements.end()) - { - s = (*pos).second; - return true; - } - std::string ns = re_detail::to_narrow(name, *pcdv); - std::string ns2; - bool result = re_detail::re_lookup_def_collate_name(ns2, ns.c_str()); - s = re_detail::to_wide(ns2, *pcdv); - return result; -} - -std::string BOOST_REGEX_CALL cpp_regex_traits::error_string(unsigned id)const -{ - if((id <= boost::REG_E_UNKNOWN) && (pmd->error_strings[id].size())) - return pmd->error_strings[id]; - return boost::re_detail::re_default_error_messages[id]; -} - -cpp_regex_traits::cpp_regex_traits() -{ - pmd = new re_detail::message_data(locale_inst, std::string(regex_message_cat)); - psyntax = pmd->syntax_; -#ifndef BOOST_NO_EXCEPTIONS - try{ -#endif - lower_map = new wchar_t[char_set_size]; - BOOST_REGEX_NOEH_ASSERT(lower_map) -#ifndef BOOST_NO_EXCEPTIONS - } - catch(...) - { - delete pmd; - throw; - } -#endif - for(unsigned int i = 0; i < char_set_size; ++i) - lower_map[i] = static_cast(i); - pctype = &BOOST_USE_FACET(std::ctype, locale_inst); - pctype->tolower(&lower_map[0], &lower_map[char_set_size]); - pcollate = &BOOST_USE_FACET(std::collate, locale_inst); - typedef std::codecvt cvt_t; - pcdv = &BOOST_USE_FACET(cvt_t, locale_inst); - sort_type = re_detail::find_sort_syntax(this, &(this->sort_delim)); -} - -cpp_regex_traits::~cpp_regex_traits() -{ - delete pmd; - delete[] lower_map; -} - -cpp_regex_traits::locale_type BOOST_REGEX_CALL cpp_regex_traits::imbue(locale_type l) -{ - locale_type old_l(locale_inst); - locale_inst = l; - re_detail::message_data* npmd = new re_detail::message_data(locale_inst, std::string(regex_message_cat)); - delete pmd; - pmd = npmd; - psyntax = pmd->syntax_; - for(unsigned int i = 0; i < char_set_size; ++i) - lower_map[i] = static_cast(i); - pctype = &BOOST_USE_FACET(std::ctype, locale_inst); - pctype->tolower(&lower_map[0], &lower_map[char_set_size]); - pcollate = &BOOST_USE_FACET(std::collate, locale_inst); - typedef std::codecvt cvt_t; - pcdv = &BOOST_USE_FACET(cvt_t, locale_inst); - sort_type = re_detail::find_sort_syntax(this, &(this->sort_delim)); - return old_l; -} - -std::size_t BOOST_REGEX_CALL cpp_regex_traits::strwiden(wchar_t *s1, std::size_t len, const char *s2)const -{ - std::string s(s2); - std::wstring ws = re_detail::to_wide(s2, *pcdv); - if(len > ws.size()) - std::wcscpy(s1, ws.c_str()); - return ws.size()+1; -} - -void cpp_regex_traits::swap(cpp_regex_traits& that) -{ - std::swap(locale_inst, that.locale_inst); // this one must go first - std::swap(pmd, that.pmd); - std::swap(psyntax, that.psyntax); - std::swap(lower_map, that.lower_map); - std::swap(pctype, that.pctype); - std::swap(pcollate, that.pcollate); - std::swap(pcdv, that.pcdv); - std::swap(sort_type, that.sort_type); - std::swap(sort_delim, that.sort_delim); -} - -#endif // BOOST_NO_WREGEX - - -} // namespace boost - -#endif - - - - diff --git a/src/w32_regex_traits.cpp b/src/w32_regex_traits.cpp deleted file mode 100644 index 2f3f0456..00000000 --- a/src/w32_regex_traits.cpp +++ /dev/null @@ -1,1104 +0,0 @@ -/* - * - * Copyright (c) 1998-2002 - * Dr 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) - * - */ - - /* - * LOCATION: see http://www.boost.org for most recent version. - * FILE: w32_regex_traits.cpp - * VERSION: see - * DESCRIPTION: Implements the w32_regex_traits traits class - */ - -#define BOOST_REGEX_SOURCE - -#include -#include -#include -#include -#include -#include -#if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32) -#include -#ifdef BOOST_REGEX_V3 -#include -#include -#else -#include -#include -#endif -#include - - -// -// VC6 needs to link to user32.lib, as do all compilers that -// claim to be VC6/7 compatible: -// -#if defined(_MSC_VER) && !defined(__BORLANDC__) -#pragma comment(lib, "user32.lib") -#endif - -namespace{ - -// -// character classes: - -boost::uint_fast32_t re_char_class_id[] = { - boost::re_detail::w32_traits_base::char_class_alnum, - boost::re_detail::w32_traits_base::char_class_alpha, - boost::re_detail::w32_traits_base::char_class_cntrl, - boost::re_detail::w32_traits_base::char_class_digit, - boost::re_detail::w32_traits_base::char_class_graph, - boost::re_detail::w32_traits_base::char_class_lower, - boost::re_detail::w32_traits_base::char_class_print, - boost::re_detail::w32_traits_base::char_class_punct, - boost::re_detail::w32_traits_base::char_class_space, - boost::re_detail::w32_traits_base::char_class_upper, - boost::re_detail::w32_traits_base::char_class_xdigit, - boost::re_detail::w32_traits_base::char_class_blank, - boost::re_detail::w32_traits_base::char_class_word, - boost::re_detail::w32_traits_base::char_class_unicode, -}; - -const char* re_char_class_names[] = { -"alnum", -"alpha", -"cntrl", -"digit", -"graph", -"lower", -"print", -"punct", -"space", -"upper", -"xdigit", -"blank", -"word", -"unicode", -}; - -std::string* pclasses = 0; -const unsigned int re_classes_max = 14; - -// -// collate names: - -struct collate_name_t -{ - std::string name; - std::string value; - collate_name_t(){} - collate_name_t(const char* p1, const char* p2, const char* p3, const char* p4) - : name(p1, p2), value(p3, p4) {} -}; - -std::list* pcoll_names = 0; - -// -// message handling: -#ifndef BOOST_RE_MESSAGE_BASE -#define BOOST_RE_MESSAGE_BASE 0 -#endif - -HINSTANCE hresmod = 0; - -BOOST_REGEX_DECL char* re_custom_error_messages[] = { - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, -}; - -char re_zero; -char re_ten; - -unsigned int entry_count = 0; -bool is_init = false; - -enum syntax_map_size -{ - map_size = UCHAR_MAX + 1 -}; - -#ifndef BOOST_NO_WREGEX - -BOOST_REGEX_DECL boost::regex_wchar_type re_zero_w; -BOOST_REGEX_DECL boost::regex_wchar_type re_ten_w; - -bool isPlatformNT = false; - -struct syntax_map_t -{ - boost::regex_wchar_type c; - unsigned int type; -}; - -std::list* syntax; - -#endif - -std::size_t BOOST_REGEX_CALL _re_get_message(char* buf, std::size_t len, unsigned id); - -std::size_t BOOST_REGEX_CALL get_message(boost::regex_wchar_type* buf, std::size_t len, unsigned id) -{ - std::size_t size = _re_get_message(static_cast(0), 0, id); - if(len < size) - return size; - boost::scoped_array cb(new char[size]); - _re_get_message(cb.get(), size, id); - size = boost::w32_regex_traits::strwiden(buf, len, cb.get()); - return size; -} - -inline std::size_t BOOST_REGEX_CALL get_message(char* buf, std::size_t len, unsigned id) -{ - return _re_get_message(buf, len, id); -} - -std::size_t BOOST_REGEX_CALL _re_get_message(char* buf, std::size_t len, unsigned id) -{ - BOOST_RE_GUARD_STACK - // get the customised message if any: - if(len < 255) - return 255; - std::size_t size = 0; - if(hresmod) - size = LoadStringA(hresmod, BOOST_RE_MESSAGE_BASE + id, buf, 255); - if(size) - return size; - - // - // now get the default message if any: - return boost::re_detail::re_get_default_message(buf, len, id); -} - -const char* BOOST_REGEX_CALL re_get_error_str(unsigned int id) -{ - BOOST_RE_GUARD_STACK -#ifdef BOOST_HAS_THREADS - boost::re_detail::cs_guard g(*boost::re_detail::p_re_lock); -#endif - if(re_custom_error_messages[id] == 0) - { - char buf[256]; - _re_get_message(buf, 256, id + 200); - if(*buf) - { - re_custom_error_messages[id] = boost::re_detail::re_strdup(buf); - return re_custom_error_messages[id]; - } - return boost::re_detail::re_default_error_messages[id]; - } - return re_custom_error_messages[id]; -} - -} // namespace - -namespace boost{ - -namespace re_detail{ - -char w32_traits_base::regex_message_catalogue[BOOST_REGEX_MAX_PATH] = {0}; - -void BOOST_REGEX_CALL w32_traits_base::do_init() -{ - BOOST_RE_GUARD_STACK - if(is_init == 0) - { - // - // update the messages first: - is_init = true; - if(*regex_message_catalogue) - { - hresmod = LoadLibraryA(regex_message_catalogue); - if(hresmod == NULL) - { - std::string s("Unable to open dll: "); - std::runtime_error err(s + regex_message_catalogue); - boost::throw_exception(err); - } - } - unsigned int i; - for(i = 0; i < REG_E_UNKNOWN; ++i) - { - if(re_custom_error_messages[i]) - { - re_detail::re_strfree(re_custom_error_messages[i]); - re_custom_error_messages[i] = 0; - } - } -#ifndef BOOST_NO_WREGEX - // - // wide character strings: - syntax = new std::list(); - OSVERSIONINFO VersionInformation = {0}; - VersionInformation.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx(&VersionInformation); - if(VersionInformation.dwPlatformId == VER_PLATFORM_WIN32_NT) - isPlatformNT = true; -#endif - // - // now the character classes: - pclasses = new std::string[re_classes_max]; - char buf[map_size+2]; - for(i = 0; i < re_classes_max; ++i) - { - get_message(buf, 256, i+300); - pclasses[i] = buf; - } - // start by updating the syntax map: - std::memset(syntax_map, syntax_char, map_size); - for(i = 1; i < syntax_max; ++i) - { - char* ptr = buf; - get_message(buf, map_size, i+100); - for(; *ptr; ++ptr) - { - syntax_map[(unsigned char)*ptr] = (unsigned char)i; - } - } - - // now update the character class map, - // and lower case map: - for(i = 0; i < map_size; ++i) - { - buf[i] = (char)i; - } - buf[map_size] = (char)0; - GetStringTypeA(GetUserDefaultLCID(), CT_CTYPE1, buf, map_size, class_map); - for(i = 0; i < map_size; ++i) - { - class_map[i] &= char_class_win; - } - class_map[(unsigned char)'_'] |= char_class_underscore; - LCMapStringA(GetUserDefaultLCID(), LCMAP_LOWERCASE, buf, map_size, lower_case_map, map_size); - // - // update our collating elements: - pcoll_names = new std::list(); - i = 400; - get_message(buf, 256, i); - while(*buf) - { - char* p1, *p2, *p3, *p4;; - p1 = buf; - while(*p1 && isspace(*p1))++p1; - p2 = p1; - while(*p2 && !isspace(*p2))++p2; - p3 = p2; - while(*p3 && isspace(*p3))++p3; - p4 = p3; - while(*p4 && !isspace(*p4))++p4; - pcoll_names->push_back(collate_name_t(p1, p2, p3, p4)); - ++i; - get_message(buf, 256, i); - } - std::string s; - const char* p = "zero"; - if(w32_regex_traits::lookup_collatename(s, p, p+4)) - { - jm_assert(s.size() == 1); - re_zero = *s.c_str(); - } - else - re_zero = '0'; - - p = "ten"; - if(w32_regex_traits::lookup_collatename(s, p, p+3)) - { - jm_assert(s.size() == 1); - re_ten = *s.c_str(); - } - else - re_ten = 'a'; -#ifndef BOOST_NO_WREGEX - // - // wide string data: - std::basic_string ws; - const regex_wchar_type* wp = (const regex_wchar_type*)L"zero"; - if(w32_regex_traits::lookup_collatename(ws, wp, wp+4)) - { - jm_assert(ws.size() == 1); - re_zero_w = *ws.c_str(); - } - else - re_zero_w = (regex_wchar_type)L'0'; - - wp = (const regex_wchar_type*)L"ten"; - if(w32_regex_traits::lookup_collatename(ws, wp, wp+3)) - { - jm_assert(ws.size() == 1); - re_ten_w = *ws.c_str(); - } - else - re_ten_w = L'a'; - - regex_wchar_type wbuf[256]; - syntax_map_t sm; - syntax->clear(); - for(i = 1; i < syntax_max; ++i) - { - regex_wchar_type* ptr = wbuf; - get_message(wbuf, 256, i+100); - for(; *ptr; ++ptr) - { - sm.c = *ptr; - sm.type = i; - syntax->push_back(sm); - } - } -#endif // BOOST_NO_WREGEX - } -} - -void BOOST_REGEX_CALL w32_traits_base::do_free() -{ - BOOST_RE_GUARD_STACK - delete[] pclasses; - pclasses = 0; - delete pcoll_names; - pcoll_names = 0; -#ifndef BOOST_NO_WREGEX - delete syntax; - syntax = 0; -#endif - if(hresmod) - { - FreeLibrary(hresmod); - hresmod = 0; - } - for(int i = 0; i < REG_E_UNKNOWN; ++i) - { - if(re_custom_error_messages[i]) - { - re_detail::re_strfree(re_custom_error_messages[i]); - re_custom_error_messages[i] = 0; - } - } - is_init = false; -} - -std::string BOOST_REGEX_CALL w32_traits_base::error_string(unsigned id) -{ - return re_get_error_str(id); -} - -boost::uint_fast32_t BOOST_REGEX_CALL w32_traits_base::do_lookup_class(const char* p) -{ - BOOST_RE_GUARD_STACK - unsigned int i; - for(i = 0; i < re_classes_max; ++i) - { - if(pclasses[i] == p) - { - return re_char_class_id[i]; - } - } - for(i = 0; i < re_classes_max; ++i) - { - if(std::strcmp(re_char_class_names[i], p) == 0) - { - return re_char_class_id[i]; - } - } - return 0; -} - -bool BOOST_REGEX_CALL w32_traits_base::do_lookup_collate(std::string& buf, const char* p) -{ - BOOST_RE_GUARD_STACK - std::list::iterator first, last; - first = pcoll_names->begin(); - last = pcoll_names->end(); - while(first != last) - { - if((*first).name == p) - { - buf = (*first).value; - return true; - } - ++first; - } - - bool result = re_detail::re_lookup_def_collate_name(buf, p); - if((result == 0) && (std::strlen(p) == 1)) - { - result = true; - buf = *p; - } - return result; -} - -std::string BOOST_REGEX_CALL w32_traits_base::set_message_catalogue(const std::string& l) -{ - BOOST_RE_GUARD_STACK - #ifdef BOOST_HAS_THREADS - re_detail::cs_guard g(*re_detail::p_re_lock); - #endif - if(sizeof(regex_message_catalogue) <= l.size()) - return l; - std::string old(regex_message_catalogue); - std::strcpy(regex_message_catalogue, l.c_str()); - return old; -} - -unsigned char w32_traits_base::syntax_map[map_size]; -unsigned short w32_traits_base::class_map[map_size]; -char w32_traits_base::lower_case_map[map_size]; - -} // namespace re_detail - -w32_regex_traits w32_regex_traits::i; - -void BOOST_REGEX_CALL w32_regex_traits::update() -{ - BOOST_RE_GUARD_STACK - #ifdef BOOST_HAS_THREADS - re_detail::cs_guard g(*re_detail::p_re_lock); - #endif - do_init(); -} - -w32_regex_traits::w32_regex_traits() -{ - BOOST_RE_GUARD_STACK - #ifdef BOOST_HAS_THREADS - re_detail::re_init_threads(); - re_detail::cs_guard g(*re_detail::p_re_lock); - #endif - ++entry_count; -} - -w32_regex_traits::~w32_regex_traits() -{ - BOOST_RE_GUARD_STACK -#ifdef BOOST_HAS_THREADS - re_detail::cs_guard g(*re_detail::p_re_lock); -#endif - // add reference to static member here to ensure - // that the linker includes it in the .exe: - if((--entry_count == 0) && (0 != &w32_regex_traits::i) && is_init) - do_free(); -#ifdef BOOST_HAS_THREADS - g.acquire(false); - re_detail::re_free_threads(); -#endif -} - -void BOOST_REGEX_CALL w32_regex_traits::transform(std::string& out, const std::string& in) -{ - BOOST_RE_GUARD_STACK - size_t n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, in.c_str(), -1, 0, 0); - if(n == (size_t)(-1)) - { - out = in; - return; - } - scoped_array buf(new char[n+1]); - n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, in.c_str(), -1, buf.get(), (int)n); - if(n == (size_t)(-1)) - { - out = in; - return; - } - out = buf.get(); -} - -void BOOST_REGEX_CALL w32_regex_traits::transform_primary(std::string& out, const std::string& in) -{ - transform(out, in); - for(unsigned int i = 0; i < out.size(); ++i) - { - if((out[i] == 1) && (i+1 < out.size())) - { - out.erase(i+1); - break; - } - } -} - - -int BOOST_REGEX_CALL w32_regex_traits::toi(char c) -{ - if(is_class(c, char_class_digit)) - return c - re_zero; - if(is_class(c, char_class_xdigit)) - return 10 + translate(c, true) - translate(re_ten, true); - return -1; // error!! -} - -int BOOST_REGEX_CALL w32_regex_traits::toi(const char*& first, const char* last, int radix) -{ - unsigned int maxval; - if(radix < 0) - { - // if radix is less than zero, then restrict - // return value to charT. NB assumes sizeof(charT) <= sizeof(int) - radix *= -1; - maxval = 1 << (sizeof(*first) * CHAR_BIT - 1); - maxval /= radix; - maxval *= 2; - maxval -= 1; - } - else - { - maxval = (unsigned int)-1; - maxval /= radix; - } - - unsigned int result = 0; - unsigned int type = (radix > 10) ? char_class_xdigit : char_class_digit; - while((first != last) && is_class(*first, type) && (result <= maxval)) - { - result *= radix; - result += toi(*first); - ++first; - } - return result; -} - -#ifndef BOOST_NO_WREGEX - -bool BOOST_REGEX_CALL w32_regex_traits::lookup_collatename(std::basic_string& out, const regex_wchar_type* first, const regex_wchar_type* last) -{ - BOOST_RE_GUARD_STACK - std::basic_string s(first, last); - std::size_t len = strnarrow(static_cast(0), 0, s.c_str()); - scoped_array buf(new char[len]); - strnarrow(buf.get(), len, s.c_str()); - std::string t_out; - bool result = base_type::do_lookup_collate(t_out, buf.get()); - if(t_out.size() == 0) result = false; - if(result) - { - if(t_out[0]) - { - len = strwiden(static_cast(0), 0, t_out.c_str()); - scoped_array wb(new regex_wchar_type[len]); - strwiden(wb.get(), len, t_out.c_str()); - out = wb.get(); - } - else - out.append(1,(regex_wchar_type)0); - } - return result; -} - -unsigned int BOOST_REGEX_CALL w32_regex_traits::syntax_type(size_type c) -{ - BOOST_RE_GUARD_STACK - std::list::const_iterator first, last; - first = syntax->begin(); - last = syntax->end(); - while(first != last) - { - if((size_type)(uchar_type)((*first).c) == c) - return (*first).type; - ++first; - } - return 0; -} - -bool BOOST_REGEX_CALL w32_regex_traits::do_lookup_collate(std::basic_string& out, const regex_wchar_type* first, const regex_wchar_type* last) -{ - BOOST_RE_GUARD_STACK - std::basic_string s(first, last); - std::size_t len = strnarrow(static_cast(0), 0, s.c_str()); - scoped_array buf(new char[len]); - strnarrow(buf.get(), len, s.c_str()); - std::string t_out; - bool result = base_type::do_lookup_collate(t_out, buf.get()); - if(result) - { - len = strwiden(static_cast(0), 0, t_out.c_str()); - scoped_array wb(new regex_wchar_type[len]); - strwiden(wb.get(), len, t_out.c_str()); - out = wb.get(); - } - return result; -} - - -void BOOST_REGEX_CALL w32_regex_traits::update() -{ - BOOST_RE_GUARD_STACK -#ifdef BOOST_HAS_THREADS - re_detail::cs_guard g(*re_detail::p_re_lock); -#endif - do_init(); -} - -w32_regex_traits::w32_regex_traits() -{ - BOOST_RE_GUARD_STACK -#ifdef BOOST_HAS_THREADS - re_detail::re_init_threads(); - re_detail::cs_guard g(*re_detail::p_re_lock); -#endif - ++entry_count; -} - -w32_regex_traits::~w32_regex_traits() -{ - BOOST_RE_GUARD_STACK -#ifdef BOOST_HAS_THREADS - re_detail::cs_guard g(*re_detail::p_re_lock); -#endif - // add reference to static member here to ensure - // that the linker includes it in the .exe: - if((--entry_count == 0) && (0 != &w32_regex_traits::init_) && is_init) - do_free(); -#ifdef BOOST_HAS_THREADS - g.acquire(false); - re_detail::re_free_threads(); -#endif -} - -bool BOOST_REGEX_CALL w32_regex_traits::do_iswclass(regex_wchar_type c, boost::uint_fast32_t f) -{ - BOOST_RE_GUARD_STACK - if((c & ~0xFF) == 0) - return BOOST_REGEX_MAKE_BOOL(re_detail::wide_unicode_classes[(uchar_type)c] & f & char_class_win); - WORD mask; - if(f & char_class_unicode) - return true; - else if(isPlatformNT && GetStringTypeW(CT_CTYPE1, (const wchar_t*)&c, 1, &mask)) - return BOOST_REGEX_MAKE_BOOL(mask & f & char_class_win); - else if((f & char_class_graph) == char_class_graph) - return true; // all wide characters are considered "graphics" - return false; -} - -void BOOST_REGEX_CALL w32_regex_traits::transform(std::basic_string& out, const std::basic_string& in) -{ - BOOST_RE_GUARD_STACK - scoped_array alt; - size_t n; - if(isPlatformNT) - n = LCMapStringW(GetUserDefaultLCID(), LCMAP_SORTKEY, (const wchar_t*)in.c_str(), -1, 0, 0); - else - { - n = strnarrow(static_cast(0), 0, in.c_str()); - alt.reset(new char[n+1]); - strnarrow(alt.get(), n+1, in.c_str()); - n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, alt.get(), -1, 0, 0); - } - if((n == (size_t)(-1)) || (n == 0)) - { - out = in; - return; - } - scoped_array buf(new regex_wchar_type[n+1]); - // under win32 we get mapped to an array of bytes - // not characters; since the underlying engine has to - // deal with chars we widen the bytes to regex_wchar_type to ensure - // the sort order remains unchanged when we compare. - scoped_array t(new char[n+1]); - if(isPlatformNT) - n = LCMapStringW(GetUserDefaultLCID(), LCMAP_SORTKEY, (const wchar_t*)in.c_str(), -1, reinterpret_cast(t.get()), (int)n); - else - n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, alt.get(), -1, t.get(), (int)n); - int i = -1; - do - { - ++i; - buf[i] = (regex_wchar_type)(unsigned char)t[i]; - } while(t[i]); - if(n == (size_t)(-1)) - { - out = in; - return; - } - out = buf.get(); -} - -void BOOST_REGEX_CALL w32_regex_traits::transform_primary(std::basic_string& out, const std::basic_string& in) -{ - transform(out, in); - for(unsigned int i = 0; i < out.size(); ++i) - { - if((out[i] == 1) && ((i + 1) < out.size())) - { - out.erase(i+1); - break; - } - } -} - - -int BOOST_REGEX_CALL w32_regex_traits::toi(regex_wchar_type c) -{ - if(is_class(c, char_class_digit)) - return c - re_zero_w; - if(is_class(c, char_class_xdigit)) - return 10 + translate(c, true) - translate(re_ten_w, true); - return -1; // error!! -} - -int BOOST_REGEX_CALL w32_regex_traits::toi(const regex_wchar_type*& first, const regex_wchar_type* last, int radix) -{ - unsigned int maxval; - if(radix < 0) - { - // if radix is less than zero, then restrict - // return value to charT. NB assumes sizeof(charT) <= sizeof(int) - radix *= -1; - maxval = 1 << (sizeof(*first) * CHAR_BIT - 1); - maxval /= radix; - maxval *= 2; - maxval -= 1; - } - else - { - maxval = (unsigned int)-1; - maxval /= radix; - } - - unsigned int result = 0; - unsigned int type = (radix > 10) ? char_class_xdigit : char_class_digit; - while((first != last) && is_class(*first, type) && (result <= maxval)) - { - result *= radix; - result += toi(*first); - ++first; - } - return result; -} - -boost::uint_fast32_t BOOST_REGEX_CALL w32_regex_traits::lookup_classname(const regex_wchar_type* first, const regex_wchar_type* last) -{ - std::basic_string s(first, last); - std::size_t len = strnarrow(static_cast(0), 0, s.c_str()); - scoped_array buf(new char[len]); - strnarrow(buf.get(), len, s.c_str()); - boost::uint_fast32_t result = do_lookup_class(buf.get()); - return result; -} - -regex_wchar_type BOOST_REGEX_CALL w32_regex_traits::wtolower(regex_wchar_type c) -{ - BOOST_RE_GUARD_STACK - if(isPlatformNT) - return LOWORD(CharLowerW(reinterpret_cast(static_cast(c)))); - return c; -} - - -w32_regex_traits w32_regex_traits::init_; - -std::size_t BOOST_REGEX_CALL w32_regex_traits::strnarrow(char *s1, std::size_t len, const regex_wchar_type *s2) -{ - BOOST_RE_GUARD_STACK - std::size_t size = WideCharToMultiByte(CP_ACP, 0, (const wchar_t*)s2, -1, s1, 0, 0, 0); - if(size > len) - return size; - return WideCharToMultiByte(CP_ACP, 0, (const wchar_t*)s2, -1, s1, (int)len, 0, 0); -} - -std::size_t BOOST_REGEX_CALL w32_regex_traits::strwiden(regex_wchar_type *s1, std::size_t len, const char *s2) -{ - BOOST_RE_GUARD_STACK - std::size_t size = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, s2, -1, (wchar_t*)s1, 0); - if(size > len) - return size; - return MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, s2, -1, (wchar_t*)s1, (int)len); -} - -unsigned short w32_regex_traits::wide_unicode_classes[] = { - re_detail::w32_traits_base::char_class_cntrl, // '' 0 - re_detail::w32_traits_base::char_class_cntrl, // '' 1 - re_detail::w32_traits_base::char_class_cntrl, // '' 2 - re_detail::w32_traits_base::char_class_cntrl, // '' 3 - re_detail::w32_traits_base::char_class_cntrl, // '' 4 - re_detail::w32_traits_base::char_class_cntrl, // '' 5 - re_detail::w32_traits_base::char_class_cntrl, // '' 6 - re_detail::w32_traits_base::char_class_cntrl, // '' 7 - re_detail::w32_traits_base::char_class_cntrl, // '' 8 - re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space | re_detail::w32_traits_base::char_class_blank, // '' 9 - re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space, // '' 10 - re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space, // '' 11 - re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space, // '' 12 - re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space, // '' 13 - re_detail::w32_traits_base::char_class_cntrl, // '.' 14 - re_detail::w32_traits_base::char_class_cntrl, // '.' 15 - re_detail::w32_traits_base::char_class_cntrl, // '.' 16 - re_detail::w32_traits_base::char_class_cntrl, // '.' 17 - re_detail::w32_traits_base::char_class_cntrl, // '.' 18 - re_detail::w32_traits_base::char_class_cntrl, // '.' 19 - re_detail::w32_traits_base::char_class_cntrl, // '.' 20 - re_detail::w32_traits_base::char_class_cntrl, // '.' 21 - re_detail::w32_traits_base::char_class_cntrl, // '.' 22 - re_detail::w32_traits_base::char_class_cntrl, // '.' 23 - re_detail::w32_traits_base::char_class_cntrl, // '.' 24 - re_detail::w32_traits_base::char_class_cntrl, // '' 25 - re_detail::w32_traits_base::char_class_cntrl, // '' 26 - re_detail::w32_traits_base::char_class_cntrl, // '' 27 - re_detail::w32_traits_base::char_class_cntrl, // '.' 28 - re_detail::w32_traits_base::char_class_cntrl, // '.' 29 - re_detail::w32_traits_base::char_class_cntrl, // '.' 30 - re_detail::w32_traits_base::char_class_cntrl, // '.' 31 - re_detail::w32_traits_base::char_class_space | re_detail::w32_traits_base::char_class_blank, // ' ' 32 - re_detail::w32_traits_base::char_class_punct, // '!' 33 - re_detail::w32_traits_base::char_class_punct, // '"' 34 - re_detail::w32_traits_base::char_class_punct, // '#' 35 - re_detail::w32_traits_base::char_class_punct, // '$' 36 - re_detail::w32_traits_base::char_class_punct, // '%' 37 - re_detail::w32_traits_base::char_class_punct, // '&' 38 - re_detail::w32_traits_base::char_class_punct, // ''' 39 - re_detail::w32_traits_base::char_class_punct, // '(' 40 - re_detail::w32_traits_base::char_class_punct, // ')' 41 - re_detail::w32_traits_base::char_class_punct, // '*' 42 - re_detail::w32_traits_base::char_class_punct, // '+' 43 - re_detail::w32_traits_base::char_class_punct, // ',' 44 - re_detail::w32_traits_base::char_class_punct, // '-' 45 - re_detail::w32_traits_base::char_class_punct, // '.' 46 - re_detail::w32_traits_base::char_class_punct, // '/' 47 - re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '0' 48 - re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '1' 49 - re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '2' 50 - re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '3' 51 - re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '4' 52 - re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '5' 53 - re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '6' 54 - re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '7' 55 - re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '8' 56 - re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '9' 57 - re_detail::w32_traits_base::char_class_punct, // ':' 58 - re_detail::w32_traits_base::char_class_punct, // ';' 59 - re_detail::w32_traits_base::char_class_punct, // '<' 60 - re_detail::w32_traits_base::char_class_punct, // '=' 61 - re_detail::w32_traits_base::char_class_punct, // '>' 62 - re_detail::w32_traits_base::char_class_punct, // '?' 63 - re_detail::w32_traits_base::char_class_punct, // '@' 64 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper | re_detail::w32_traits_base::char_class_xdigit, // 'A' 65 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper | re_detail::w32_traits_base::char_class_xdigit, // 'B' 66 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper | re_detail::w32_traits_base::char_class_xdigit, // 'C' 67 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper | re_detail::w32_traits_base::char_class_xdigit, // 'D' 68 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper | re_detail::w32_traits_base::char_class_xdigit, // 'E' 69 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper | re_detail::w32_traits_base::char_class_xdigit, // 'F' 70 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'G' 71 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'H' 72 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'I' 73 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'J' 74 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'K' 75 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'L' 76 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'M' 77 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'N' 78 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'O' 79 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'P' 80 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Q' 81 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'R' 82 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'S' 83 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'T' 84 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'U' 85 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'V' 86 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'W' 87 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'X' 88 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Y' 89 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Z' 90 - re_detail::w32_traits_base::char_class_punct, // '[' 91 - re_detail::w32_traits_base::char_class_punct, // '\' 92 - re_detail::w32_traits_base::char_class_punct, // ']' 93 - re_detail::w32_traits_base::char_class_punct, // '^' 94 - re_detail::w32_traits_base::char_class_punct | re_detail::w32_traits_base::char_class_underscore, // '_' 95 - re_detail::w32_traits_base::char_class_punct, // '`' 96 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower | re_detail::w32_traits_base::char_class_xdigit, // 'a' 97 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower | re_detail::w32_traits_base::char_class_xdigit, // 'b' 98 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower | re_detail::w32_traits_base::char_class_xdigit, // 'c' 99 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower | re_detail::w32_traits_base::char_class_xdigit, // 'd' 100 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower | re_detail::w32_traits_base::char_class_xdigit, // 'e' 101 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower | re_detail::w32_traits_base::char_class_xdigit, // 'f' 102 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'g' 103 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'h' 104 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'i' 105 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'j' 106 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'k' 107 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'l' 108 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'm' 109 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'n' 110 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'o' 111 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'p' 112 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'q' 113 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'r' 114 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 's' 115 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 't' 116 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'u' 117 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'v' 118 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'w' 119 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'x' 120 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'y' 121 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'z' 122 - re_detail::w32_traits_base::char_class_punct, // '{' 123 - re_detail::w32_traits_base::char_class_punct, // '|' 124 - re_detail::w32_traits_base::char_class_punct, // '}' 125 - re_detail::w32_traits_base::char_class_punct, // '~' 126 - - re_detail::w32_traits_base::char_class_cntrl, // '' 127 - re_detail::w32_traits_base::char_class_cntrl, // '' 128 - re_detail::w32_traits_base::char_class_cntrl, // '' 129 - re_detail::w32_traits_base::char_class_cntrl, // '' 130 - re_detail::w32_traits_base::char_class_cntrl, // '' 131 - re_detail::w32_traits_base::char_class_cntrl, // '' 132 - re_detail::w32_traits_base::char_class_cntrl, // '' 133 - re_detail::w32_traits_base::char_class_cntrl, // '' 134 - re_detail::w32_traits_base::char_class_cntrl, // '' 135 - re_detail::w32_traits_base::char_class_cntrl, // '' 136 - re_detail::w32_traits_base::char_class_cntrl, // '' 137 - re_detail::w32_traits_base::char_class_cntrl, // '' 138 - re_detail::w32_traits_base::char_class_cntrl, // '' 139 - re_detail::w32_traits_base::char_class_cntrl, // '' 140 - re_detail::w32_traits_base::char_class_cntrl, // '' 141 - re_detail::w32_traits_base::char_class_cntrl, // '' 142 - re_detail::w32_traits_base::char_class_cntrl, // '' 143 - re_detail::w32_traits_base::char_class_cntrl, // '' 144 - re_detail::w32_traits_base::char_class_cntrl, // '' 145 - re_detail::w32_traits_base::char_class_cntrl, // '' 146 - re_detail::w32_traits_base::char_class_cntrl, // '' 147 - re_detail::w32_traits_base::char_class_cntrl, // '' 148 - re_detail::w32_traits_base::char_class_cntrl, // '' 149 - re_detail::w32_traits_base::char_class_cntrl, // '' 150 - re_detail::w32_traits_base::char_class_cntrl, // '' 151 - re_detail::w32_traits_base::char_class_cntrl, // '' 152 - re_detail::w32_traits_base::char_class_cntrl, // '' 153 - re_detail::w32_traits_base::char_class_cntrl, // '' 154 - re_detail::w32_traits_base::char_class_cntrl, // '' 155 - re_detail::w32_traits_base::char_class_cntrl, // '' 156 - re_detail::w32_traits_base::char_class_cntrl, // '' 157 - re_detail::w32_traits_base::char_class_cntrl, // '' 158 - re_detail::w32_traits_base::char_class_cntrl, // '' 159 - re_detail::w32_traits_base::char_class_space | re_detail::w32_traits_base::char_class_blank, // '' 160 - re_detail::w32_traits_base::char_class_punct, // '' 161 - re_detail::w32_traits_base::char_class_punct, // '' 162 - re_detail::w32_traits_base::char_class_punct, // '' 163 - re_detail::w32_traits_base::char_class_punct, // '' 164 - re_detail::w32_traits_base::char_class_punct, // '' 165 - re_detail::w32_traits_base::char_class_punct, // '' 166 - re_detail::w32_traits_base::char_class_punct, // '' 167 - re_detail::w32_traits_base::char_class_punct, // '' 168 - re_detail::w32_traits_base::char_class_punct, // '' 169 - re_detail::w32_traits_base::char_class_punct, // '' 170 - re_detail::w32_traits_base::char_class_punct, // '' 171 - re_detail::w32_traits_base::char_class_punct, // '' 172 - re_detail::w32_traits_base::char_class_punct, // '' 173 - re_detail::w32_traits_base::char_class_punct, // '' 174 - re_detail::w32_traits_base::char_class_punct, // '' 175 - re_detail::w32_traits_base::char_class_punct, // '' 176 - re_detail::w32_traits_base::char_class_punct, // '' 177 - re_detail::w32_traits_base::char_class_punct, // '' 178 - re_detail::w32_traits_base::char_class_punct, // '' 179 - re_detail::w32_traits_base::char_class_punct, // '' 180 - re_detail::w32_traits_base::char_class_punct, // '' 181 - re_detail::w32_traits_base::char_class_punct, // '' 182 - re_detail::w32_traits_base::char_class_punct, // '' 183 - re_detail::w32_traits_base::char_class_punct, // '' 184 - re_detail::w32_traits_base::char_class_punct, // '' 185 - re_detail::w32_traits_base::char_class_punct, // '' 186 - re_detail::w32_traits_base::char_class_punct, // '' 187 - re_detail::w32_traits_base::char_class_punct, // '' 188 - re_detail::w32_traits_base::char_class_punct, // '' 189 - re_detail::w32_traits_base::char_class_punct, // '' 190 - re_detail::w32_traits_base::char_class_punct, // '' 191 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 192 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 193 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 194 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 195 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 196 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 197 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 198 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 199 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 200 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 201 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 202 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 203 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 204 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 205 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 206 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 207 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 208 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 209 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 210 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 211 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 212 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 213 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 214 - re_detail::w32_traits_base::char_class_punct, // '' 215 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 216 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 217 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 218 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 219 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 220 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 221 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '' 222 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 223 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 224 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 225 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 226 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 227 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 228 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 229 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 230 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 231 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 232 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 233 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 234 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 235 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 236 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 237 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 238 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 239 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 240 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 241 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 242 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 243 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 244 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 245 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 246 - re_detail::w32_traits_base::char_class_punct, // '' 247 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 248 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 249 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 250 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 251 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 252 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 253 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 254 - re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '' 255 -}; - - - -#endif // BOOST_NO_WREGEX - - -} // namespace boost - -#endif // #if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32) - - - - - -