diff --git a/hl_ref.htm b/hl_ref.htm index 0cb9dff3..44b803a1 100644 --- a/hl_ref.htm +++ b/hl_ref.htm @@ -92,10 +92,13 @@ are allowed.

   //    unsigned int Position(int i = 0)const;    unsigned int Length(int i = 0)const; + bool Matched(int i = 0)const;    unsigned int Line()const;    unsigned int Marks() const;    std::string What(int i)const;    std::string operator[](int i)const ; + + static const unsigned int npos; };    

Member functions for class RegEx are defined as follows:
@@ -495,8 +498,8 @@ are allowed.

Position(int i = 0)const; Returns the position of what matched sub-expression i. If i = 0 then - returns the position of the whole match. Returns -1 if - the supplied index is invalid, or if the specified sub-expression + returns the position of the whole match. Returns RegEx::npos + if the supplied index is invalid, or if the specified sub-expression did not participate in the match.   @@ -506,18 +509,26 @@ are allowed.

Length(int i = 0)const; Returns the length of what matched sub-expression i. If i = 0 then - returns the length of the whole match. Returns -1 if the - supplied index is invalid, or if the specified sub-expression + returns the length of the whole match. Returns RegEx::npos + if the supplied index is invalid, or if the specified sub-expression did not participate in the match.   + +   + bool Matched(int i + = 0)const; + Returns true if sub-expression i was + matched, false otherwise. +   +   unsigned int Line()const; Returns the line on which the match occurred, indexes start from 1 not zero, if no - match occurred then returns (unsigned)-1. + match occurred then returns RegEx::npos.   diff --git a/src/c_regex_traits.cpp b/src/c_regex_traits.cpp index a55dc831..c41a0260 100644 --- a/src/c_regex_traits.cpp +++ b/src/c_regex_traits.cpp @@ -342,7 +342,14 @@ void BOOST_REGEX_CALL re_message_update() 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: "); + throw std::runtime_error(m + boost::re_detail::c_traits_base::get_catalogue()); + } + } #endif for(int i = 0; i < boost::REG_E_UNKNOWN; ++i) { diff --git a/src/cpp_regex_traits.cpp b/src/cpp_regex_traits.cpp index 31a8c756..e5b93163 100644 --- a/src/cpp_regex_traits.cpp +++ b/src/cpp_regex_traits.cpp @@ -189,8 +189,19 @@ message_data::message_data(const std::locale& l, const std::string& regex_ { is.imbue(l); #ifndef BOOST_NO_STD_MESSAGES - const std::messages* pm = &BOOST_USE_FACET(std::messages, l); - std::messages::catalog cat = regex_message_catalogue.size() ? pm->open(regex_message_catalogue, l) : -1; + + const std::messages* pm = 0; + std::messages::catalog cat = -1; + 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: "); + throw std::runtime_error(m + regex_message_catalogue); + } + } #endif std::memset(syntax_map, cpp_regex_traits::syntax_char, 256); unsigned int i; @@ -222,39 +233,26 @@ message_data::message_data(const std::locale& l, const std::string& regex_ 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 && std::isspace((char)*p1, l))++p1; - p2 = p1; - while(*p2 && !std::isspace((char)*p2, l))++p2; - p3 = p2; - while(*p3 && std::isspace((char)*p3, l))++p3; - p4 = p3; - while(*p4 && !std::isspace((char)*p4, l))++p4; - collating_elements[std::string(p1, p2)] = std::string(p3, p4); - - ++i; c2 = pm->get(cat, 0, i, c1); + while(c2.size()) + { + const char* p1, *p2, *p3, *p4;; + p1 = c2.c_str(); + while(*p1 && std::isspace((char)*p1, l))++p1; + p2 = p1; + while(*p2 && !std::isspace((char)*p2, l))++p2; + p3 = p2; + while(*p3 && std::isspace((char)*p3, l))++p3; + p4 = p3; + while(*p4 && !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 n("zero"); - std::map >::const_iterator pos = collating_elements.find(n); - if(pos != collating_elements.end()) - _zero = *(*pos).second.c_str(); - else - _zero = '0'; - - n = "ten"; - pos = collating_elements.find(n); - if(pos != collating_elements.end()) - _ten = *(*pos).second.c_str(); - else - _ten = 'a'; -*/ std::string m; std::string s; #ifndef BOOST_NO_STD_MESSAGES @@ -562,7 +560,16 @@ message_data::message_data(const std::locale& l, const std::string& reg 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); - std::messages::catalog cat = regex_message_catalogue.size() ? msgs.open(regex_message_catalogue, l) : -1; + std::messages::catalog cat = -1; + if(regex_message_catalogue.size()) + { + cat = msgs.open(regex_message_catalogue, l); + if(cat < 0) + { + std::string m("Unable to open message catalog: "); + throw std::runtime_error(m + regex_message_catalogue); + } + } #endif scoped_array a; unsigned array_size = 0; @@ -602,22 +609,24 @@ message_data::message_data(const std::locale& l, const std::string& reg string_type c1, c2; i = 400; if((int)cat >= 0) - c2 = msgs.get(cat, 0, i, c1); - while(c2.size()) { - const wchar_t* p1, *p2, *p3, *p4;; - p1 = c2.c_str(); - while(*p1 && std::isspace((wchar_t)*p1, l))++p1; - p2 = p1; - while(*p2 && !std::isspace((wchar_t)*p2, l))++p2; - p3 = p2; - while(*p3 && std::isspace((wchar_t)*p3, l))++p3; - p4 = p3; - while(*p4 && !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, i, c1); + while(c2.size()) + { + const wchar_t* p1, *p2, *p3, *p4;; + p1 = c2.c_str(); + while(*p1 && std::isspace((wchar_t)*p1, l))++p1; + p2 = p1; + while(*p2 && !std::isspace((wchar_t)*p2, l))++p2; + p3 = p2; + while(*p3 && std::isspace((wchar_t)*p3, l))++p3; + p4 = p3; + while(*p4 && !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, i, c1); + } } if((int)cat >= 0) diff --git a/src/cregex.cpp b/src/cregex.cpp index 8de9ddeb..c39b8dc9 100644 --- a/src/cregex.cpp +++ b/src/cregex.cpp @@ -465,18 +465,18 @@ unsigned int RegEx::Position(int i)const switch(pdata->t) { case re_detail::RegExData::type_pc: - return pdata->m[i].matched ? pdata->m[i].first - pdata->pbase : (unsigned int)-1; + return pdata->m[i].matched ? pdata->m[i].first - pdata->pbase : RegEx::npos; case re_detail::RegExData::type_pf: - return pdata->fm[i].matched ? pdata->fm[i].first - pdata->fbase : (unsigned int)-1; + return pdata->fm[i].matched ? pdata->fm[i].first - pdata->fbase : RegEx::npos; case re_detail::RegExData::type_copy: { std::map >::iterator pos = pdata->positions.find(i); if(pos == pdata->positions.end()) - return (unsigned int)-1; + return RegEx::npos; return (*pos).second; } } - return (unsigned int)-1; + return RegEx::npos; } unsigned int RegEx::Line()const @@ -485,15 +485,15 @@ unsigned int RegEx::Line()const switch(pdata->t) { case re_detail::RegExData::type_pc: - return pdata->m[0].matched ? pdata->m.line() : (unsigned int)-1; + return pdata->m[0].matched ? pdata->m.line() : RegEx::npos; case re_detail::RegExData::type_pf: - return pdata->fm[0].matched ? pdata->fm.line() : (unsigned int)-1; + return pdata->fm[0].matched ? pdata->fm.line() : RegEx::npos; case re_detail::RegExData::type_copy: { return pdata->line; } } - return (unsigned int)-1; + return RegEx::npos; } unsigned int RegEx::Marks()const @@ -509,20 +509,41 @@ unsigned int RegEx::Length(int i)const switch(pdata->t) { case re_detail::RegExData::type_pc: - return pdata->m[i].matched ? pdata->m[i].second - pdata->m[i].first : (unsigned)-1; + return pdata->m[i].matched ? pdata->m[i].second - pdata->m[i].first : RegEx::npos; case re_detail::RegExData::type_pf: - return pdata->fm[i].matched ? pdata->fm[i].second - pdata->fm[i].first : (unsigned)-1; + return pdata->fm[i].matched ? pdata->fm[i].second - pdata->fm[i].first : RegEx::npos; case re_detail::RegExData::type_copy: { std::map >::iterator pos = pdata->strings.find(i); if(pos == pdata->strings.end()) - return (unsigned)-1; + return RegEx::npos; return (*pos).second.size(); } } - return (unsigned)-1; + return RegEx::npos; } +bool RegEx::Matched(int i)const +{ + BOOST_RE_GUARD_STACK + switch(pdata->t) + { + case re_detail::RegExData::type_pc: + return pdata->m[i].matched; + case re_detail::RegExData::type_pf: + return pdata->fm[i].matched; + case re_detail::RegExData::type_copy: + { + std::map >::iterator pos = pdata->strings.find(i); + if(pos == pdata->strings.end()) + return false; + return true; + } + } + return false; +} + + std::string RegEx::What(int i)const { BOOST_RE_GUARD_STACK @@ -548,6 +569,8 @@ std::string RegEx::What(int i)const return result; } +const unsigned int RegEx::npos = ~0u; + } // namespace boost diff --git a/src/w32_regex_traits.cpp b/src/w32_regex_traits.cpp index dab7e7fa..0549c3bb 100644 --- a/src/w32_regex_traits.cpp +++ b/src/w32_regex_traits.cpp @@ -230,10 +230,17 @@ void BOOST_REGEX_CALL w32_traits_base::do_init() if(is_init == 0) { // - // upadte the messages first: + // 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: "); + throw std::runtime_error(s + regex_message_catalogue); + } + } unsigned int i; for(i = 0; i < REG_E_UNKNOWN; ++i) {