xref: /llvm-project-15.0.7/libcxx/src/regex.cpp (revision 70505305)
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