commit 31eb66fa0965a1397ac844816bba844c1dc90085 Author: tim Date: Thu Oct 17 19:02:59 2013 -0400 2013-10-17 Tim Shen * include/bits/regex_scanner.h (_Scanner<>::_M_is_ascii): New. * include/bits/regex_scanner.tcc: (_Scanner<>::_M_scan_normal, _Scanner<>::_M_eat_escape_ecma, _Scanner<>::_M_eat_escape_posix, _Scanner<>::_M_eat_escape_awk): Judge if the character is ascii before find in maps. * testsuite/28_regex/algorithms/regex_match/ecma/wchar_t/cjk_match.cc: New. diff --git a/libstdc++-v3/include/bits/regex_scanner.h b/libstdc++-v3/include/bits/regex_scanner.h index 09a18f6..20f47eb 100644 --- a/libstdc++-v3/include/bits/regex_scanner.h +++ b/libstdc++-v3/include/bits/regex_scanner.h @@ -165,6 +165,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_is_awk() { return _M_flags & regex_constants::awk; } + constexpr bool + _M_is_ascii(_CharT __c) + { return __c == _M_ctype.widen(_M_ctype.narrow(__c, '\0')); } + + public: _StateT _M_state; _FwdIter _M_current; _FwdIter _M_end; @@ -173,7 +178,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _TokenT _M_token; _StringT _M_value; bool _M_at_bracket_start; - public: // FIXME: make them static when this file is stable. const std::map _M_token_map; const std::map _M_ecma_escape_map; @@ -181,7 +185,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION const std::set _M_ecma_spec_char; const std::set _M_basic_spec_char; const std::set _M_extended_spec_char; - const std::map& _M_escape_map; const std::set& _M_spec_char; void (_Scanner::* _M_eat_escape)(); diff --git a/libstdc++-v3/include/bits/regex_scanner.tcc b/libstdc++-v3/include/bits/regex_scanner.tcc index 21d1e91..295282b 100644 --- a/libstdc++-v3/include/bits/regex_scanner.tcc +++ b/libstdc++-v3/include/bits/regex_scanner.tcc @@ -244,7 +244,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_state = _S_state_in_brace; _M_token = _S_token_interval_begin; } - else if ((_M_spec_char.count(__c) + else if ((_M_is_ascii(__c) && _M_spec_char.count(__c) && __c != ']' && __c != '}') || (_M_is_grep() && __c == '\n')) @@ -367,7 +367,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION auto __c = *_M_current++; - if (_M_escape_map.count(__c) + if (_M_is_ascii(__c) && _M_escape_map.count(__c) && (__c != 'b' || _M_state == _S_state_in_bracket)) { _M_token = _S_token_ord_char; @@ -441,7 +441,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION auto __c = *_M_current; - if (_M_spec_char.count(__c)) + if (_M_is_ascii(__c) && _M_spec_char.count(__c)) { _M_token = _S_token_ord_char; _M_value.assign(1, __c); @@ -476,7 +476,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { auto __c = *_M_current++; - if (_M_escape_map.count(__c)) + if (_M_is_ascii(__c) && _M_escape_map.count(__c)) { _M_token = _S_token_ord_char; _M_value.assign(1, _M_escape_map.at(__c)); diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/wchar_t/cjk_match.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/wchar_t/cjk_match.cc new file mode 100644 index 0000000..0a54b20 --- /dev/null +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/wchar_t/cjk_match.cc @@ -0,0 +1,50 @@ +// { dg-options "-std=gnu++11" } +// { dg-require-namedlocale "zh_CN.UTF-8" } + +// +// 2013-10-17 Tim Shen +// +// Copyright (C) 2013 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// 28.11.2 regex_match +// Tests CJK support. + +#include +#include +#include + +using namespace __gnu_test; +using namespace std; + +void +test01() +{ + bool test __attribute__((unused)) = true; + + setlocale(LC_ALL, "zh_CN.UTF8"); + const wchar_t * s = L"你好, 世+界"; + wregex re(s); + VERIFY(regex_match_debug(L"你好, 世世世界", re)); +} + +int +main() +{ + test01(); + return 0; +}