forked from boostorg/regex
removed old traits classes
[SVN r21623]
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@ -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 <boost/version.hpp>
|
||||
* DESCRIPTION: Implements common code and data for the
|
||||
* c_regex_traits<charT> traits classes.
|
||||
*/
|
||||
|
||||
|
||||
#define BOOST_REGEX_SOURCE
|
||||
|
||||
#include <clocale>
|
||||
#include <cstdio>
|
||||
#include <list>
|
||||
#include <cctype>
|
||||
#include <boost/regex/regex_traits.hpp>
|
||||
#ifdef BOOST_REGEX_V3
|
||||
#include <boost/regex/v3/regex_synch.hpp>
|
||||
#else
|
||||
#include <boost/regex/v4/regex_synch.hpp>
|
||||
#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<char>::syntax_open_bracket, "(", },
|
||||
{ 100+ c_regex_traits<char>::syntax_close_bracket, ")", },
|
||||
{ 100+ c_regex_traits<char>::syntax_dollar, "$", },
|
||||
{ 100+ c_regex_traits<char>::syntax_caret, "^", },
|
||||
{ 100+ c_regex_traits<char>::syntax_dot, ".", },
|
||||
{ 100+ c_regex_traits<char>::syntax_star, "*", },
|
||||
{ 100+ c_regex_traits<char>::syntax_plus, "+", },
|
||||
{ 100+ c_regex_traits<char>::syntax_question, "?", },
|
||||
{ 100+ c_regex_traits<char>::syntax_open_set, "[", },
|
||||
{ 100+ c_regex_traits<char>::syntax_close_set, "]", },
|
||||
{ 100+ c_regex_traits<char>::syntax_or, "|", },
|
||||
{ 100+ c_regex_traits<char>::syntax_slash, "\\", },
|
||||
{ 100+ c_regex_traits<char>::syntax_hash, "#", },
|
||||
{ 100+ c_regex_traits<char>::syntax_dash, "-", },
|
||||
{ 100+ c_regex_traits<char>::syntax_open_brace, "{", },
|
||||
{ 100+ c_regex_traits<char>::syntax_close_brace, "}", },
|
||||
{ 100+ c_regex_traits<char>::syntax_digit, "0123456789", },
|
||||
{ 100+ c_regex_traits<char>::syntax_b, "b", },
|
||||
{ 100+ c_regex_traits<char>::syntax_B, "B", },
|
||||
{ 100+ c_regex_traits<char>::syntax_left_word, "<", },
|
||||
{ 100+ c_regex_traits<char>::syntax_right_word, ">", },
|
||||
{ 100+ c_regex_traits<char>::syntax_w, "w", },
|
||||
{ 100+ c_regex_traits<char>::syntax_W, "W", },
|
||||
{ 100+ c_regex_traits<char>::syntax_start_buffer, "`A", },
|
||||
{ 100+ c_regex_traits<char>::syntax_end_buffer, "'z", },
|
||||
{ 100+ c_regex_traits<char>::syntax_newline, "\n", },
|
||||
{ 100+ c_regex_traits<char>::syntax_comma, ",", },
|
||||
{ 100+ c_regex_traits<char>::syntax_a, "a", },
|
||||
{ 100+ c_regex_traits<char>::syntax_f, "f", },
|
||||
{ 100+ c_regex_traits<char>::syntax_n, "n", },
|
||||
{ 100+ c_regex_traits<char>::syntax_r, "r", },
|
||||
{ 100+ c_regex_traits<char>::syntax_t, "t", },
|
||||
{ 100+ c_regex_traits<char>::syntax_v, "v", },
|
||||
{ 100+ c_regex_traits<char>::syntax_x, "x", },
|
||||
{ 100+ c_regex_traits<char>::syntax_c, "c", },
|
||||
{ 100+ c_regex_traits<char>::syntax_colon, ":", },
|
||||
{ 100+ c_regex_traits<char>::syntax_equal, "=", },
|
||||
|
||||
{ 100 + c_regex_traits<char>::syntax_e, "e", },
|
||||
{ 100 + c_regex_traits<char>::syntax_l, "l", },
|
||||
{ 100 + c_regex_traits<char>::syntax_L, "L", },
|
||||
{ 100 + c_regex_traits<char>::syntax_u, "u", },
|
||||
{ 100 + c_regex_traits<char>::syntax_U, "U", },
|
||||
{ 100 + c_regex_traits<char>::syntax_s, "s", },
|
||||
{ 100 + c_regex_traits<char>::syntax_S, "S", },
|
||||
{ 100 + c_regex_traits<char>::syntax_d, "d", },
|
||||
{ 100 + c_regex_traits<char>::syntax_D, "D", },
|
||||
{ 100 + c_regex_traits<char>::syntax_E, "E", },
|
||||
{ 100 + c_regex_traits<char>::syntax_Q, "Q", },
|
||||
{ 100 + c_regex_traits<char>::syntax_X, "X", },
|
||||
{ 100 + c_regex_traits<char>::syntax_C, "C", },
|
||||
{ 100 + c_regex_traits<char>::syntax_Z, "Z", },
|
||||
{ 100 + c_regex_traits<char>::syntax_G, "G", },
|
||||
|
||||
{ 100 + c_regex_traits<char>::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, // '<27>' 128
|
||||
c_traits_base::char_class_cntrl, // '<27>' 129
|
||||
c_traits_base::char_class_cntrl, // '<27>' 130
|
||||
c_traits_base::char_class_cntrl, // '<27>' 131
|
||||
c_traits_base::char_class_cntrl, // '<27>' 132
|
||||
c_traits_base::char_class_cntrl, // '<27>' 133
|
||||
c_traits_base::char_class_cntrl, // '<27>' 134
|
||||
c_traits_base::char_class_cntrl, // '<27>' 135
|
||||
c_traits_base::char_class_cntrl, // '<27>' 136
|
||||
c_traits_base::char_class_cntrl, // '<27>' 137
|
||||
c_traits_base::char_class_cntrl, // '<27>' 138
|
||||
c_traits_base::char_class_cntrl, // '<27>' 139
|
||||
c_traits_base::char_class_cntrl, // '<27>' 140
|
||||
c_traits_base::char_class_cntrl, // '<27>' 141
|
||||
c_traits_base::char_class_cntrl, // '<27>' 142
|
||||
c_traits_base::char_class_cntrl, // '<27>' 143
|
||||
c_traits_base::char_class_cntrl, // '<27>' 144
|
||||
c_traits_base::char_class_cntrl, // '<27>' 145
|
||||
c_traits_base::char_class_cntrl, // '<27>' 146
|
||||
c_traits_base::char_class_cntrl, // '<27>' 147
|
||||
c_traits_base::char_class_cntrl, // '<27>' 148
|
||||
c_traits_base::char_class_cntrl, // '<27>' 149
|
||||
c_traits_base::char_class_cntrl, // '<27>' 150
|
||||
c_traits_base::char_class_cntrl, // '<27>' 151
|
||||
c_traits_base::char_class_cntrl, // '<27>' 152
|
||||
c_traits_base::char_class_cntrl, // '<27>' 153
|
||||
c_traits_base::char_class_cntrl, // '<27>' 154
|
||||
c_traits_base::char_class_cntrl, // '<27>' 155
|
||||
c_traits_base::char_class_cntrl, // '<27>' 156
|
||||
c_traits_base::char_class_cntrl, // '<27>' 157
|
||||
c_traits_base::char_class_cntrl, // '<27>' 158
|
||||
c_traits_base::char_class_cntrl, // '<27>' 159
|
||||
c_traits_base::char_class_space | c_traits_base::char_class_blank, // '<27>' 160
|
||||
c_traits_base::char_class_punct, // '<27>' 161
|
||||
c_traits_base::char_class_punct, // '<27>' 162
|
||||
c_traits_base::char_class_punct, // '<27>' 163
|
||||
c_traits_base::char_class_punct, // '<27>' 164
|
||||
c_traits_base::char_class_punct, // '<27>' 165
|
||||
c_traits_base::char_class_punct, // '<27>' 166
|
||||
c_traits_base::char_class_punct, // '<27>' 167
|
||||
c_traits_base::char_class_punct, // '<27>' 168
|
||||
c_traits_base::char_class_punct, // '<27>' 169
|
||||
c_traits_base::char_class_punct, // '<27>' 170
|
||||
c_traits_base::char_class_punct, // '<27>' 171
|
||||
c_traits_base::char_class_punct, // '<27>' 172
|
||||
c_traits_base::char_class_punct, // '<27>' 173
|
||||
c_traits_base::char_class_punct, // '<27>' 174
|
||||
c_traits_base::char_class_punct, // '<27>' 175
|
||||
c_traits_base::char_class_punct, // '<27>' 176
|
||||
c_traits_base::char_class_punct, // '<27>' 177
|
||||
c_traits_base::char_class_punct, // '<27>' 178
|
||||
c_traits_base::char_class_punct, // '<27>' 179
|
||||
c_traits_base::char_class_punct, // '<27>' 180
|
||||
c_traits_base::char_class_punct, // '<27>' 181
|
||||
c_traits_base::char_class_punct, // '<27>' 182
|
||||
c_traits_base::char_class_punct, // '<27>' 183
|
||||
c_traits_base::char_class_punct, // '<27>' 184
|
||||
c_traits_base::char_class_punct, // '<27>' 185
|
||||
c_traits_base::char_class_punct, // '<27>' 186
|
||||
c_traits_base::char_class_punct, // '<27>' 187
|
||||
c_traits_base::char_class_punct, // '<27>' 188
|
||||
c_traits_base::char_class_punct, // '<27>' 189
|
||||
c_traits_base::char_class_punct, // '<27>' 190
|
||||
c_traits_base::char_class_punct, // '<27>' 191
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 192
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 193
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 194
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 195
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 196
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 197
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 198
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 199
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 200
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 201
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 202
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 203
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 204
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 205
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 206
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 207
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 208
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 209
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 210
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 211
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 212
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 213
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 214
|
||||
c_traits_base::char_class_punct, // '<27>' 215
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 216
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 217
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 218
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 219
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 220
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 221
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_upper, // '<27>' 222
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 223
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 224
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 225
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 226
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 227
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 228
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 229
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 230
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 231
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 232
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 233
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 234
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 235
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 236
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 237
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 238
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 239
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 240
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 241
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 242
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 243
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 244
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 245
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 246
|
||||
c_traits_base::char_class_punct, // '<27>' 247
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 248
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 249
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 250
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 251
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 252
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 253
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 254
|
||||
c_traits_base::char_class_alpha | c_traits_base::char_class_lower, // '<27>' 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
|
||||
|
||||
|
||||
|
||||
|
@ -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 <boost/version.hpp>
|
||||
* DESCRIPTION: Implements the cpp_regex_traits<charT> traits class
|
||||
*/
|
||||
|
||||
|
||||
#define BOOST_REGEX_SOURCE
|
||||
|
||||
#include <boost/regex/config.hpp>
|
||||
|
||||
#if defined(BOOST_REGEX_HAS_SHORT_WCHAR_T) && !defined(_NATIVE_WCHAR_T_DEFINED)
|
||||
# pragma message ("disabling support for class cpp_regex_traits<wchar_t> - 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 <clocale>
|
||||
#include <locale>
|
||||
#include <cstdio>
|
||||
#include <list>
|
||||
#include <cctype>
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <boost/regex/regex_traits.hpp>
|
||||
#include <boost/cregex.hpp>
|
||||
#include <boost/scoped_array.hpp>
|
||||
#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 charT,
|
||||
class traits = ::std::char_traits<charT> >
|
||||
class parser_buf : public ::std::basic_streambuf<charT, traits>
|
||||
{
|
||||
typedef ::std::basic_streambuf<charT, traits> 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<charT, traits>* setbuf(char_type* s, streamsize n);
|
||||
typename parser_buf<charT, traits>::pos_type seekpos(pos_type sp, ::std::ios_base::openmode which);
|
||||
typename parser_buf<charT, traits>::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<class charT, class traits>
|
||||
std::basic_streambuf<charT, traits>*
|
||||
parser_buf<charT, traits>::setbuf(char_type* s, streamsize n)
|
||||
{
|
||||
this->setg(s, s, s + n);
|
||||
return this;
|
||||
}
|
||||
|
||||
template<class charT, class traits>
|
||||
typename parser_buf<charT, traits>::pos_type
|
||||
parser_buf<charT, traits>::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<pos_type>(this->gptr() - this->eback());
|
||||
}
|
||||
|
||||
template<class charT, class traits>
|
||||
typename parser_buf<charT, traits>::pos_type
|
||||
parser_buf<charT, traits>::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<char>
|
||||
{
|
||||
unsigned char syntax_map[CHAR_MAX-CHAR_MIN];
|
||||
std::map<std::string, std::string, std::less<std::string> > collating_elements;
|
||||
std::map<std::string, std::size_t, std::less<std::string> > classes;
|
||||
//std::string _zero;
|
||||
//std::string _ten;
|
||||
parser_buf<char> 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<char>::message_data(const std::locale& l, std::string regex_message_catalogue)
|
||||
: is(&sbuf)
|
||||
{
|
||||
is.imbue(l);
|
||||
#ifndef BOOST_NO_STD_MESSAGES
|
||||
|
||||
const std::messages<char>* pm = 0;
|
||||
#ifndef __IBMCPP__
|
||||
std::messages<char>::catalog cat = static_cast<std::messages<char>::catalog>(-1);
|
||||
#else
|
||||
std::messages<char>::catalog cat = reinterpret_cast<std::messages<char>::catalog>(-1);
|
||||
#endif
|
||||
if(regex_message_catalogue.size())
|
||||
{
|
||||
pm = &BOOST_USE_FACET(std::messages<char>, 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<char>::syntax_char, 256);
|
||||
unsigned i;
|
||||
scoped_array<char> a;
|
||||
std::size_t array_size = 0;
|
||||
std::size_t new_size;
|
||||
for(i = 1; i < cpp_regex_traits<char>::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<char>::cpp_regex_traits()
|
||||
{
|
||||
pmd = new re_detail::message_data<char>(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<char>(i);
|
||||
pctype = &BOOST_USE_FACET(std::ctype<char>, locale_inst);
|
||||
pctype->tolower(&lower_map[0], &lower_map[char_set_size]);
|
||||
pcollate = &BOOST_USE_FACET(std::collate<char>, locale_inst);
|
||||
sort_type = re_detail::find_sort_syntax(this, &(this->sort_delim));
|
||||
}
|
||||
|
||||
void cpp_regex_traits<char>::swap(cpp_regex_traits<char>& 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<char>::~cpp_regex_traits()
|
||||
{
|
||||
delete pmd;
|
||||
delete[] lower_map;
|
||||
}
|
||||
|
||||
int BOOST_REGEX_CALL cpp_regex_traits<char>::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<char>::toi(const char*& first, const char* last, int radix)const
|
||||
{
|
||||
pmd->sbuf.pubsetbuf(const_cast<char*>(first), static_cast<std::streamsize>(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<char>::lookup_classname(const char* first, const char* last)const
|
||||
{
|
||||
BOOST_RE_GUARD_STACK
|
||||
unsigned int i;
|
||||
std::string s(first, last);
|
||||
|
||||
std::map<std::string, std::size_t, std::less<std::string> >::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<char>::lookup_collatename(std::string& s, const char* first, const char* last)const
|
||||
{
|
||||
BOOST_RE_GUARD_STACK
|
||||
std::string name(first, last);
|
||||
std::map<std::string, std::string, std::less<std::string > >::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<char>::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<char>::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<char>::locale_type BOOST_REGEX_CALL cpp_regex_traits<char>::imbue(locale_type l)
|
||||
{
|
||||
locale_type old_l(locale_inst);
|
||||
locale_inst = l;
|
||||
re_detail::message_data<char>* npmd = new re_detail::message_data<char>(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<char>(i);
|
||||
pctype = &BOOST_USE_FACET(std::ctype<char>, locale_inst);
|
||||
pctype->tolower(&lower_map[0], &lower_map[char_set_size]);
|
||||
pcollate = &BOOST_USE_FACET(std::collate<char>, 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<wchar_t>& is, const std::codecvt<wchar_t, char, std::mbstate_t>& cvt)
|
||||
{
|
||||
BOOST_RE_GUARD_STACK
|
||||
std::basic_string<wchar_t>::size_type bufsize = is.size() * 2;
|
||||
//
|
||||
// declare buffer first as VC6 workaround for internal compiler error!
|
||||
char* pc = new char[bufsize];
|
||||
scoped_array<char> 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<wchar_t, char, std::mbstate_t>& 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<wchar_t> 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<wchar_t>
|
||||
{
|
||||
#ifndef BOOST_NO_STD_MESSAGES
|
||||
typedef std::messages<wchar_t>::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_map> syntax;
|
||||
std::map<string_type, std::size_t> classes;
|
||||
std::map<string_type, string_type> collating_elements;
|
||||
unsigned char syntax_[CHAR_MAX-CHAR_MIN+1];
|
||||
|
||||
parser_buf<wchar_t> 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<wchar_t>::message_data(const std::locale& l, const std::string& regex_message_catalogue)
|
||||
: is(&sbuf)
|
||||
{
|
||||
is.imbue(l);
|
||||
syntax_map m;
|
||||
typedef std::codecvt<wchar_t, char, std::mbstate_t> cvt_type;
|
||||
const cvt_type& cvt = BOOST_USE_FACET(cvt_type, l);
|
||||
#ifndef BOOST_NO_STD_MESSAGES
|
||||
const std::messages<wchar_t>& msgs = BOOST_USE_FACET(std::messages<wchar_t>, l);
|
||||
#ifndef __IBMCPP__
|
||||
std::messages<wchar_t>::catalog cat = static_cast<std::messages<wchar_t>::catalog>(-1);
|
||||
#else
|
||||
std::messages<wchar_t>::catalog cat = reinterpret_cast<std::messages<wchar_t>::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<char> a;
|
||||
std::size_t array_size = 0;
|
||||
std::size_t new_size;
|
||||
std::size_t i;
|
||||
std::memset(syntax_, cpp_regex_traits<wchar_t>::syntax_char, sizeof(syntax_));
|
||||
for(i = 1; i < cpp_regex_traits<wchar_t>::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<wchar_t>, 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<unsigned char>(i);
|
||||
else
|
||||
{
|
||||
m.c = s[j];
|
||||
m.type = static_cast<unsigned int>(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<wchar_t>(p1, p2)] = std::basic_string<wchar_t>(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<int>(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<int>(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<wchar_t>::do_syntax_type(size_type c)const
|
||||
{
|
||||
std::list<re_detail::message_data<wchar_t>::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<wchar_t>::transform_primary(std::basic_string<wchar_t>& out, const std::basic_string<wchar_t>& 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<wchar_t>::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<wchar_t>::toi(const wchar_t*& first, const wchar_t* last, int radix)const
|
||||
{
|
||||
pmd->sbuf.pubsetbuf(const_cast<wchar_t*>(first), static_cast<std::streamsize>(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<wchar_t>::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<std::wstring, std::size_t>::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<wchar_t>::lookup_collatename(std::basic_string<wchar_t>& s, const wchar_t* first, const wchar_t* last)const
|
||||
{
|
||||
BOOST_RE_GUARD_STACK
|
||||
std::wstring name(first, last);
|
||||
std::map<std::wstring, std::wstring>::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<wchar_t>::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<wchar_t>::cpp_regex_traits()
|
||||
{
|
||||
pmd = new re_detail::message_data<wchar_t>(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<wchar_t>(i);
|
||||
pctype = &BOOST_USE_FACET(std::ctype<wchar_t>, locale_inst);
|
||||
pctype->tolower(&lower_map[0], &lower_map[char_set_size]);
|
||||
pcollate = &BOOST_USE_FACET(std::collate<wchar_t>, locale_inst);
|
||||
typedef std::codecvt<wchar_t, char, std::mbstate_t> cvt_t;
|
||||
pcdv = &BOOST_USE_FACET(cvt_t, locale_inst);
|
||||
sort_type = re_detail::find_sort_syntax(this, &(this->sort_delim));
|
||||
}
|
||||
|
||||
cpp_regex_traits<wchar_t>::~cpp_regex_traits()
|
||||
{
|
||||
delete pmd;
|
||||
delete[] lower_map;
|
||||
}
|
||||
|
||||
cpp_regex_traits<wchar_t>::locale_type BOOST_REGEX_CALL cpp_regex_traits<wchar_t>::imbue(locale_type l)
|
||||
{
|
||||
locale_type old_l(locale_inst);
|
||||
locale_inst = l;
|
||||
re_detail::message_data<wchar_t>* npmd = new re_detail::message_data<wchar_t>(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<wchar_t>(i);
|
||||
pctype = &BOOST_USE_FACET(std::ctype<wchar_t>, locale_inst);
|
||||
pctype->tolower(&lower_map[0], &lower_map[char_set_size]);
|
||||
pcollate = &BOOST_USE_FACET(std::collate<wchar_t>, locale_inst);
|
||||
typedef std::codecvt<wchar_t, char, std::mbstate_t> 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<wchar_t>::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<wchar_t>::swap(cpp_regex_traits<wchar_t>& 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
|
||||
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user