1*70505305SHoward Hinnant //===-------------------------- regex.cpp ---------------------------------===// 2*70505305SHoward Hinnant // 3*70505305SHoward Hinnant // The LLVM Compiler Infrastructure 4*70505305SHoward Hinnant // 5*70505305SHoward Hinnant // This file is distributed under the University of Illinois Open Source 6*70505305SHoward Hinnant // License. See LICENSE.TXT for details. 7*70505305SHoward Hinnant // 8*70505305SHoward Hinnant //===----------------------------------------------------------------------===// 9*70505305SHoward Hinnant 10*70505305SHoward Hinnant #include "regex" 11*70505305SHoward Hinnant #include "algorithm" 12*70505305SHoward Hinnant #include "iterator" 13*70505305SHoward Hinnant 14*70505305SHoward Hinnant 15*70505305SHoward Hinnant _LIBCPP_BEGIN_NAMESPACE_STD 16*70505305SHoward Hinnant 17*70505305SHoward Hinnant static 18*70505305SHoward Hinnant const char* 19*70505305SHoward Hinnant make_error_type_string(regex_constants::error_type ecode) 20*70505305SHoward Hinnant { 21*70505305SHoward Hinnant switch (ecode) 22*70505305SHoward Hinnant { 23*70505305SHoward Hinnant case regex_constants::error_collate: 24*70505305SHoward Hinnant return "error_collate"; 25*70505305SHoward Hinnant case regex_constants::error_ctype: 26*70505305SHoward Hinnant return "error_ctype"; 27*70505305SHoward Hinnant case regex_constants::error_escape: 28*70505305SHoward Hinnant return "error_escape"; 29*70505305SHoward Hinnant case regex_constants::error_backref: 30*70505305SHoward Hinnant return "error_backref"; 31*70505305SHoward Hinnant case regex_constants::error_brack: 32*70505305SHoward Hinnant return "error_brack"; 33*70505305SHoward Hinnant case regex_constants::error_paren: 34*70505305SHoward Hinnant return "error_paren"; 35*70505305SHoward Hinnant case regex_constants::error_brace: 36*70505305SHoward Hinnant return "error_brace"; 37*70505305SHoward Hinnant case regex_constants::error_badbrace: 38*70505305SHoward Hinnant return "error_badbrace"; 39*70505305SHoward Hinnant case regex_constants::error_range: 40*70505305SHoward Hinnant return "error_range"; 41*70505305SHoward Hinnant case regex_constants::error_space: 42*70505305SHoward Hinnant return "error_space"; 43*70505305SHoward Hinnant case regex_constants::error_badrepeat: 44*70505305SHoward Hinnant return "error_badrepeat"; 45*70505305SHoward Hinnant case regex_constants::error_complexity: 46*70505305SHoward Hinnant return "error_complexity"; 47*70505305SHoward Hinnant case regex_constants::error_stack: 48*70505305SHoward Hinnant return "error_stack"; 49*70505305SHoward Hinnant } 50*70505305SHoward Hinnant return "unknown error_type"; 51*70505305SHoward Hinnant } 52*70505305SHoward Hinnant 53*70505305SHoward Hinnant regex_error::regex_error(regex_constants::error_type ecode) 54*70505305SHoward Hinnant : runtime_error(make_error_type_string(ecode)), 55*70505305SHoward Hinnant __code_(ecode) 56*70505305SHoward Hinnant {} 57*70505305SHoward Hinnant 58*70505305SHoward Hinnant regex_error::~regex_error() throw() {} 59*70505305SHoward Hinnant 60*70505305SHoward Hinnant namespace { 61*70505305SHoward Hinnant 62*70505305SHoward Hinnant struct collationnames 63*70505305SHoward Hinnant { 64*70505305SHoward Hinnant const char* elem_; 65*70505305SHoward Hinnant char char_; 66*70505305SHoward Hinnant }; 67*70505305SHoward Hinnant 68*70505305SHoward Hinnant const collationnames collatenames[] = 69*70505305SHoward Hinnant { 70*70505305SHoward Hinnant {"A", 0x41}, 71*70505305SHoward Hinnant {"B", 0x42}, 72*70505305SHoward Hinnant {"C", 0x43}, 73*70505305SHoward Hinnant {"D", 0x44}, 74*70505305SHoward Hinnant {"E", 0x45}, 75*70505305SHoward Hinnant {"F", 0x46}, 76*70505305SHoward Hinnant {"G", 0x47}, 77*70505305SHoward Hinnant {"H", 0x48}, 78*70505305SHoward Hinnant {"I", 0x49}, 79*70505305SHoward Hinnant {"J", 0x4a}, 80*70505305SHoward Hinnant {"K", 0x4b}, 81*70505305SHoward Hinnant {"L", 0x4c}, 82*70505305SHoward Hinnant {"M", 0x4d}, 83*70505305SHoward Hinnant {"N", 0x4e}, 84*70505305SHoward Hinnant {"NUL", 0x00}, 85*70505305SHoward Hinnant {"O", 0x4f}, 86*70505305SHoward Hinnant {"P", 0x50}, 87*70505305SHoward Hinnant {"Q", 0x51}, 88*70505305SHoward Hinnant {"R", 0x52}, 89*70505305SHoward Hinnant {"S", 0x53}, 90*70505305SHoward Hinnant {"T", 0x54}, 91*70505305SHoward Hinnant {"U", 0x55}, 92*70505305SHoward Hinnant {"V", 0x56}, 93*70505305SHoward Hinnant {"W", 0x57}, 94*70505305SHoward Hinnant {"X", 0x58}, 95*70505305SHoward Hinnant {"Y", 0x59}, 96*70505305SHoward Hinnant {"Z", 0x5a}, 97*70505305SHoward Hinnant {"a", 0x61}, 98*70505305SHoward Hinnant {"alert", 0x07}, 99*70505305SHoward Hinnant {"ampersand", 0x26}, 100*70505305SHoward Hinnant {"apostrophe", 0x27}, 101*70505305SHoward Hinnant {"asterisk", 0x2a}, 102*70505305SHoward Hinnant {"b", 0x62}, 103*70505305SHoward Hinnant {"backslash", 0x5c}, 104*70505305SHoward Hinnant {"backspace", 0x08}, 105*70505305SHoward Hinnant {"c", 0x63}, 106*70505305SHoward Hinnant {"carriage-return", 0x0d}, 107*70505305SHoward Hinnant {"circumflex", 0x5e}, 108*70505305SHoward Hinnant {"circumflex-accent", 0x5e}, 109*70505305SHoward Hinnant {"colon", 0x3a}, 110*70505305SHoward Hinnant {"comma", 0x2c}, 111*70505305SHoward Hinnant {"commercial-at", 0x40}, 112*70505305SHoward Hinnant {"d", 0x64}, 113*70505305SHoward Hinnant {"dollar-sign", 0x24}, 114*70505305SHoward Hinnant {"e", 0x65}, 115*70505305SHoward Hinnant {"eight", 0x38}, 116*70505305SHoward Hinnant {"equals-sign", 0x3d}, 117*70505305SHoward Hinnant {"exclamation-mark", 0x21}, 118*70505305SHoward Hinnant {"f", 0x66}, 119*70505305SHoward Hinnant {"five", 0x35}, 120*70505305SHoward Hinnant {"form-feed", 0x0c}, 121*70505305SHoward Hinnant {"four", 0x34}, 122*70505305SHoward Hinnant {"full-stop", 0x2e}, 123*70505305SHoward Hinnant {"g", 0x67}, 124*70505305SHoward Hinnant {"grave-accent", 0x60}, 125*70505305SHoward Hinnant {"greater-than-sign", 0x3e}, 126*70505305SHoward Hinnant {"h", 0x68}, 127*70505305SHoward Hinnant {"hyphen", 0x2d}, 128*70505305SHoward Hinnant {"hyphen-minus", 0x2d}, 129*70505305SHoward Hinnant {"i", 0x69}, 130*70505305SHoward Hinnant {"j", 0x6a}, 131*70505305SHoward Hinnant {"k", 0x6b}, 132*70505305SHoward Hinnant {"l", 0x6c}, 133*70505305SHoward Hinnant {"left-brace", 0x7b}, 134*70505305SHoward Hinnant {"left-curly-bracket", 0x7b}, 135*70505305SHoward Hinnant {"left-parenthesis", 0x28}, 136*70505305SHoward Hinnant {"left-square-bracket", 0x5b}, 137*70505305SHoward Hinnant {"less-than-sign", 0x3c}, 138*70505305SHoward Hinnant {"low-line", 0x5f}, 139*70505305SHoward Hinnant {"m", 0x6d}, 140*70505305SHoward Hinnant {"n", 0x6e}, 141*70505305SHoward Hinnant {"newline", 0x0a}, 142*70505305SHoward Hinnant {"nine", 0x39}, 143*70505305SHoward Hinnant {"number-sign", 0x23}, 144*70505305SHoward Hinnant {"o", 0x6f}, 145*70505305SHoward Hinnant {"one", 0x31}, 146*70505305SHoward Hinnant {"p", 0x70}, 147*70505305SHoward Hinnant {"percent-sign", 0x25}, 148*70505305SHoward Hinnant {"period", 0x2e}, 149*70505305SHoward Hinnant {"plus-sign", 0x2b}, 150*70505305SHoward Hinnant {"q", 0x71}, 151*70505305SHoward Hinnant {"question-mark", 0x3f}, 152*70505305SHoward Hinnant {"quotation-mark", 0x22}, 153*70505305SHoward Hinnant {"r", 0x72}, 154*70505305SHoward Hinnant {"reverse-solidus", 0x5c}, 155*70505305SHoward Hinnant {"right-brace", 0x7d}, 156*70505305SHoward Hinnant {"right-curly-bracket", 0x7d}, 157*70505305SHoward Hinnant {"right-parenthesis", 0x29}, 158*70505305SHoward Hinnant {"right-square-bracket", 0x5d}, 159*70505305SHoward Hinnant {"s", 0x73}, 160*70505305SHoward Hinnant {"semicolon", 0x3b}, 161*70505305SHoward Hinnant {"seven", 0x37}, 162*70505305SHoward Hinnant {"six", 0x36}, 163*70505305SHoward Hinnant {"slash", 0x2f}, 164*70505305SHoward Hinnant {"solidus", 0x2f}, 165*70505305SHoward Hinnant {"space", 0x20}, 166*70505305SHoward Hinnant {"t", 0x74}, 167*70505305SHoward Hinnant {"tab", 0x09}, 168*70505305SHoward Hinnant {"three", 0x33}, 169*70505305SHoward Hinnant {"tilde", 0x7e}, 170*70505305SHoward Hinnant {"two", 0x32}, 171*70505305SHoward Hinnant {"u", 0x75}, 172*70505305SHoward Hinnant {"underscore", 0x5f}, 173*70505305SHoward Hinnant {"v", 0x76}, 174*70505305SHoward Hinnant {"vertical-line", 0x7c}, 175*70505305SHoward Hinnant {"vertical-tab", 0x0b}, 176*70505305SHoward Hinnant {"w", 0x77}, 177*70505305SHoward Hinnant {"x", 0x78}, 178*70505305SHoward Hinnant {"y", 0x79}, 179*70505305SHoward Hinnant {"z", 0x7a}, 180*70505305SHoward Hinnant {"zero", 0x30} 181*70505305SHoward Hinnant }; 182*70505305SHoward Hinnant 183*70505305SHoward Hinnant struct use_strcmp 184*70505305SHoward Hinnant { 185*70505305SHoward Hinnant bool operator()(const collationnames& x, const char* y) 186*70505305SHoward Hinnant {return strcmp(x.elem_, y) < 0;} 187*70505305SHoward Hinnant }; 188*70505305SHoward Hinnant 189*70505305SHoward Hinnant } 190*70505305SHoward Hinnant 191*70505305SHoward Hinnant string 192*70505305SHoward Hinnant __get_collation_name(const char* s) 193*70505305SHoward Hinnant { 194*70505305SHoward Hinnant typedef std::pair<collationnames*, collationnames*> P; 195*70505305SHoward Hinnant const collationnames* i = 196*70505305SHoward Hinnant lower_bound(begin(collatenames), end(collatenames), s, use_strcmp()); 197*70505305SHoward Hinnant string r; 198*70505305SHoward Hinnant if (i != end(collatenames) && strcmp(s, i->elem_) == 0) 199*70505305SHoward Hinnant r = char(i->char_); 200*70505305SHoward Hinnant return r; 201*70505305SHoward Hinnant } 202*70505305SHoward Hinnant 203*70505305SHoward Hinnant _LIBCPP_END_NAMESPACE_STD 204