1 // -*- C++ -*- 2 //===--------------------------- regex ------------------------------------===// 3 // 4 // The LLVM Compiler Infrastructure 5 // 6 // This file is dual licensed under the MIT and the University of Illinois Open 7 // Source Licenses. See LICENSE.TXT for details. 8 // 9 //===----------------------------------------------------------------------===// 10 11 #ifndef _LIBCPP_REGEX 12 #define _LIBCPP_REGEX 13 14 /* 15 regex synopsis 16 17 #include <initializer_list> 18 19 namespace std 20 { 21 22 namespace regex_constants 23 { 24 25 emum syntax_option_type 26 { 27 icase = unspecified, 28 nosubs = unspecified, 29 optimize = unspecified, 30 collate = unspecified, 31 ECMAScript = unspecified, 32 basic = unspecified, 33 extended = unspecified, 34 awk = unspecified, 35 grep = unspecified, 36 egrep = unspecified 37 }; 38 39 constexpr syntax_option_type operator~(syntax_option_type f); 40 constexpr syntax_option_type operator&(syntax_option_type lhs, syntax_option_type rhs); 41 constexpr syntax_option_type operator|(syntax_option_type lhs, syntax_option_type rhs); 42 43 enum match_flag_type 44 { 45 match_default = 0, 46 match_not_bol = unspecified, 47 match_not_eol = unspecified, 48 match_not_bow = unspecified, 49 match_not_eow = unspecified, 50 match_any = unspecified, 51 match_not_null = unspecified, 52 match_continuous = unspecified, 53 match_prev_avail = unspecified, 54 format_default = 0, 55 format_sed = unspecified, 56 format_no_copy = unspecified, 57 format_first_only = unspecified 58 }; 59 60 constexpr match_flag_type operator~(match_flag_type f); 61 constexpr match_flag_type operator&(match_flag_type lhs, match_flag_type rhs); 62 constexpr match_flag_type operator|(match_flag_type lhs, match_flag_type rhs); 63 64 enum error_type 65 { 66 error_collate = unspecified, 67 error_ctype = unspecified, 68 error_escape = unspecified, 69 error_backref = unspecified, 70 error_brack = unspecified, 71 error_paren = unspecified, 72 error_brace = unspecified, 73 error_badbrace = unspecified, 74 error_range = unspecified, 75 error_space = unspecified, 76 error_badrepeat = unspecified, 77 error_complexity = unspecified, 78 error_stack = unspecified 79 }; 80 81 } // regex_constants 82 83 class regex_error 84 : public runtime_error 85 { 86 public: 87 explicit regex_error(regex_constants::error_type ecode); 88 regex_constants::error_type code() const; 89 }; 90 91 template <class charT> 92 struct regex_traits 93 { 94 public: 95 typedef charT char_type; 96 typedef basic_string<char_type> string_type; 97 typedef locale locale_type; 98 typedef /bitmask_type/ char_class_type; 99 100 regex_traits(); 101 102 static size_t length(const char_type* p); 103 charT translate(charT c) const; 104 charT translate_nocase(charT c) const; 105 template <class ForwardIterator> 106 string_type 107 transform(ForwardIterator first, ForwardIterator last) const; 108 template <class ForwardIterator> 109 string_type 110 transform_primary( ForwardIterator first, ForwardIterator last) const; 111 template <class ForwardIterator> 112 string_type 113 lookup_collatename(ForwardIterator first, ForwardIterator last) const; 114 template <class ForwardIterator> 115 char_class_type 116 lookup_classname(ForwardIterator first, ForwardIterator last, 117 bool icase = false) const; 118 bool isctype(charT c, char_class_type f) const; 119 int value(charT ch, int radix) const; 120 locale_type imbue(locale_type l); 121 locale_type getloc()const; 122 }; 123 124 template <class charT, class traits = regex_traits<charT>> 125 class basic_regex 126 { 127 public: 128 // types: 129 typedef charT value_type; 130 typedef regex_constants::syntax_option_type flag_type; 131 typedef typename traits::locale_type locale_type; 132 133 // constants: 134 static constexpr regex_constants::syntax_option_type icase = regex_constants::icase; 135 static constexpr regex_constants::syntax_option_type nosubs = regex_constants::nosubs; 136 static constexpr regex_constants::syntax_option_type optimize = regex_constants::optimize; 137 static constexpr regex_constants::syntax_option_type collate = regex_constants::collate; 138 static constexpr regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript; 139 static constexpr regex_constants::syntax_option_type basic = regex_constants::basic; 140 static constexpr regex_constants::syntax_option_type extended = regex_constants::extended; 141 static constexpr regex_constants::syntax_option_type awk = regex_constants::awk; 142 static constexpr regex_constants::syntax_option_type grep = regex_constants::grep; 143 static constexpr regex_constants::syntax_option_type egrep = regex_constants::egrep; 144 145 // construct/copy/destroy: 146 basic_regex(); 147 explicit basic_regex(const charT* p, flag_type f = regex_constants::ECMAScript); 148 basic_regex(const charT* p, size_t len, flag_type f); 149 basic_regex(const basic_regex&); 150 basic_regex(basic_regex&&) noexcept; 151 template <class ST, class SA> 152 explicit basic_regex(const basic_string<charT, ST, SA>& p, 153 flag_type f = regex_constants::ECMAScript); 154 template <class ForwardIterator> 155 basic_regex(ForwardIterator first, ForwardIterator last, 156 flag_type f = regex_constants::ECMAScript); 157 basic_regex(initializer_list<charT>, flag_type = regex_constants::ECMAScript); 158 159 ~basic_regex(); 160 161 basic_regex& operator=(const basic_regex&); 162 basic_regex& operator=(basic_regex&&) noexcept; 163 basic_regex& operator=(const charT* ptr); 164 basic_regex& operator=(initializer_list<charT> il); 165 template <class ST, class SA> 166 basic_regex& operator=(const basic_string<charT, ST, SA>& p); 167 168 // assign: 169 basic_regex& assign(const basic_regex& that); 170 basic_regex& assign(basic_regex&& that) noexcept; 171 basic_regex& assign(const charT* ptr, flag_type f = regex_constants::ECMAScript); 172 basic_regex& assign(const charT* p, size_t len, flag_type f); 173 template <class string_traits, class A> 174 basic_regex& assign(const basic_string<charT, string_traits, A>& s, 175 flag_type f = regex_constants::ECMAScript); 176 template <class InputIterator> 177 basic_regex& assign(InputIterator first, InputIterator last, 178 flag_type f = regex_constants::ECMAScript); 179 basic_regex& assign(initializer_list<charT>, flag_type = regex_constants::ECMAScript); 180 181 // const operations: 182 unsigned mark_count() const; 183 flag_type flags() const; 184 185 // locale: 186 locale_type imbue(locale_type loc); 187 locale_type getloc() const; 188 189 // swap: 190 void swap(basic_regex&); 191 }; 192 193 typedef basic_regex<char> regex; 194 typedef basic_regex<wchar_t> wregex; 195 196 template <class charT, class traits> 197 void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>& e2); 198 199 template <class BidirectionalIterator> 200 class sub_match 201 : public pair<BidirectionalIterator, BidirectionalIterator> 202 { 203 public: 204 typedef typename iterator_traits<BidirectionalIterator>::value_type value_type; 205 typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type; 206 typedef BidirectionalIterator iterator; 207 typedef basic_string<value_type> string_type; 208 209 bool matched; 210 211 constexpr sub_match(); 212 213 difference_type length() const; 214 operator string_type() const; 215 string_type str() const; 216 217 int compare(const sub_match& s) const; 218 int compare(const string_type& s) const; 219 int compare(const value_type* s) const; 220 }; 221 222 typedef sub_match<const char*> csub_match; 223 typedef sub_match<const wchar_t*> wcsub_match; 224 typedef sub_match<string::const_iterator> ssub_match; 225 typedef sub_match<wstring::const_iterator> wssub_match; 226 227 template <class BiIter> 228 bool 229 operator==(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); 230 231 template <class BiIter> 232 bool 233 operator!=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); 234 235 template <class BiIter> 236 bool 237 operator<(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); 238 239 template <class BiIter> 240 bool 241 operator<=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); 242 243 template <class BiIter> 244 bool 245 operator>=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); 246 247 template <class BiIter> 248 bool 249 operator>(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); 250 251 template <class BiIter, class ST, class SA> 252 bool 253 operator==(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, 254 const sub_match<BiIter>& rhs); 255 256 template <class BiIter, class ST, class SA> 257 bool 258 operator!=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, 259 const sub_match<BiIter>& rhs); 260 261 template <class BiIter, class ST, class SA> 262 bool 263 operator<(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, 264 const sub_match<BiIter>& rhs); 265 266 template <class BiIter, class ST, class SA> 267 bool 268 operator>(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, 269 const sub_match<BiIter>& rhs); 270 271 template <class BiIter, class ST, class SA> 272 bool operator>=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, 273 const sub_match<BiIter>& rhs); 274 275 template <class BiIter, class ST, class SA> 276 bool 277 operator<=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, 278 const sub_match<BiIter>& rhs); 279 280 template <class BiIter, class ST, class SA> 281 bool 282 operator==(const sub_match<BiIter>& lhs, 283 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); 284 285 template <class BiIter, class ST, class SA> 286 bool 287 operator!=(const sub_match<BiIter>& lhs, 288 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); 289 290 template <class BiIter, class ST, class SA> 291 bool 292 operator<(const sub_match<BiIter>& lhs, 293 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); 294 295 template <class BiIter, class ST, class SA> 296 bool operator>(const sub_match<BiIter>& lhs, 297 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); 298 299 template <class BiIter, class ST, class SA> 300 bool 301 operator>=(const sub_match<BiIter>& lhs, 302 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); 303 304 template <class BiIter, class ST, class SA> 305 bool 306 operator<=(const sub_match<BiIter>& lhs, 307 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); 308 309 template <class BiIter> 310 bool 311 operator==(typename iterator_traits<BiIter>::value_type const* lhs, 312 const sub_match<BiIter>& rhs); 313 314 template <class BiIter> 315 bool 316 operator!=(typename iterator_traits<BiIter>::value_type const* lhs, 317 const sub_match<BiIter>& rhs); 318 319 template <class BiIter> 320 bool 321 operator<(typename iterator_traits<BiIter>::value_type const* lhs, 322 const sub_match<BiIter>& rhs); 323 324 template <class BiIter> 325 bool 326 operator>(typename iterator_traits<BiIter>::value_type const* lhs, 327 const sub_match<BiIter>& rhs); 328 329 template <class BiIter> 330 bool 331 operator>=(typename iterator_traits<BiIter>::value_type const* lhs, 332 const sub_match<BiIter>& rhs); 333 334 template <class BiIter> 335 bool 336 operator<=(typename iterator_traits<BiIter>::value_type const* lhs, 337 const sub_match<BiIter>& rhs); 338 339 template <class BiIter> 340 bool 341 operator==(const sub_match<BiIter>& lhs, 342 typename iterator_traits<BiIter>::value_type const* rhs); 343 344 template <class BiIter> 345 bool 346 operator!=(const sub_match<BiIter>& lhs, 347 typename iterator_traits<BiIter>::value_type const* rhs); 348 349 template <class BiIter> 350 bool 351 operator<(const sub_match<BiIter>& lhs, 352 typename iterator_traits<BiIter>::value_type const* rhs); 353 354 template <class BiIter> 355 bool 356 operator>(const sub_match<BiIter>& lhs, 357 typename iterator_traits<BiIter>::value_type const* rhs); 358 359 template <class BiIter> 360 bool 361 operator>=(const sub_match<BiIter>& lhs, 362 typename iterator_traits<BiIter>::value_type const* rhs); 363 364 template <class BiIter> 365 bool 366 operator<=(const sub_match<BiIter>& lhs, 367 typename iterator_traits<BiIter>::value_type const* rhs); 368 369 template <class BiIter> 370 bool 371 operator==(typename iterator_traits<BiIter>::value_type const& lhs, 372 const sub_match<BiIter>& rhs); 373 374 template <class BiIter> 375 bool 376 operator!=(typename iterator_traits<BiIter>::value_type const& lhs, 377 const sub_match<BiIter>& rhs); 378 379 template <class BiIter> 380 bool 381 operator<(typename iterator_traits<BiIter>::value_type const& lhs, 382 const sub_match<BiIter>& rhs); 383 384 template <class BiIter> 385 bool 386 operator>(typename iterator_traits<BiIter>::value_type const& lhs, 387 const sub_match<BiIter>& rhs); 388 389 template <class BiIter> 390 bool 391 operator>=(typename iterator_traits<BiIter>::value_type const& lhs, 392 const sub_match<BiIter>& rhs); 393 394 template <class BiIter> 395 bool 396 operator<=(typename iterator_traits<BiIter>::value_type const& lhs, 397 const sub_match<BiIter>& rhs); 398 399 template <class BiIter> 400 bool 401 operator==(const sub_match<BiIter>& lhs, 402 typename iterator_traits<BiIter>::value_type const& rhs); 403 404 template <class BiIter> 405 bool 406 operator!=(const sub_match<BiIter>& lhs, 407 typename iterator_traits<BiIter>::value_type const& rhs); 408 409 template <class BiIter> 410 bool 411 operator<(const sub_match<BiIter>& lhs, 412 typename iterator_traits<BiIter>::value_type const& rhs); 413 414 template <class BiIter> 415 bool 416 operator>(const sub_match<BiIter>& lhs, 417 typename iterator_traits<BiIter>::value_type const& rhs); 418 419 template <class BiIter> 420 bool 421 operator>=(const sub_match<BiIter>& lhs, 422 typename iterator_traits<BiIter>::value_type const& rhs); 423 424 template <class BiIter> 425 bool 426 operator<=(const sub_match<BiIter>& lhs, 427 typename iterator_traits<BiIter>::value_type const& rhs); 428 429 template <class charT, class ST, class BiIter> 430 basic_ostream<charT, ST>& 431 operator<<(basic_ostream<charT, ST>& os, const sub_match<BiIter>& m); 432 433 template <class BidirectionalIterator, 434 class Allocator = allocator<sub_match<BidirectionalIterator>>> 435 class match_results 436 { 437 public: 438 typedef sub_match<BidirectionalIterator> value_type; 439 typedef const value_type& const_reference; 440 typedef const_reference reference; 441 typedef /implementation-defined/ const_iterator; 442 typedef const_iterator iterator; 443 typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type; 444 typedef typename allocator_traits<Allocator>::size_type size_type; 445 typedef Allocator allocator_type; 446 typedef typename iterator_traits<BidirectionalIterator>::value_type char_type; 447 typedef basic_string<char_type> string_type; 448 449 // construct/copy/destroy: 450 explicit match_results(const Allocator& a = Allocator()); 451 match_results(const match_results& m); 452 match_results(match_results&& m) noexcept; 453 match_results& operator=(const match_results& m); 454 match_results& operator=(match_results&& m); 455 ~match_results(); 456 457 bool ready() const; 458 459 // size: 460 size_type size() const; 461 size_type max_size() const; 462 bool empty() const; 463 464 // element access: 465 difference_type length(size_type sub = 0) const; 466 difference_type position(size_type sub = 0) const; 467 string_type str(size_type sub = 0) const; 468 const_reference operator[](size_type n) const; 469 470 const_reference prefix() const; 471 const_reference suffix() const; 472 473 const_iterator begin() const; 474 const_iterator end() const; 475 const_iterator cbegin() const; 476 const_iterator cend() const; 477 478 // format: 479 template <class OutputIter> 480 OutputIter 481 format(OutputIter out, const char_type* fmt_first, 482 const char_type* fmt_last, 483 regex_constants::match_flag_type flags = regex_constants::format_default) const; 484 template <class OutputIter, class ST, class SA> 485 OutputIter 486 format(OutputIter out, const basic_string<char_type, ST, SA>& fmt, 487 regex_constants::match_flag_type flags = regex_constants::format_default) const; 488 template <class ST, class SA> 489 basic_string<char_type, ST, SA> 490 format(const basic_string<char_type, ST, SA>& fmt, 491 regex_constants::match_flag_type flags = regex_constants::format_default) const; 492 string_type 493 format(const char_type* fmt, 494 regex_constants::match_flag_type flags = regex_constants::format_default) const; 495 496 // allocator: 497 allocator_type get_allocator() const; 498 499 // swap: 500 void swap(match_results& that); 501 }; 502 503 typedef match_results<const char*> cmatch; 504 typedef match_results<const wchar_t*> wcmatch; 505 typedef match_results<string::const_iterator> smatch; 506 typedef match_results<wstring::const_iterator> wsmatch; 507 508 template <class BidirectionalIterator, class Allocator> 509 bool 510 operator==(const match_results<BidirectionalIterator, Allocator>& m1, 511 const match_results<BidirectionalIterator, Allocator>& m2); 512 513 template <class BidirectionalIterator, class Allocator> 514 bool 515 operator!=(const match_results<BidirectionalIterator, Allocator>& m1, 516 const match_results<BidirectionalIterator, Allocator>& m2); 517 518 template <class BidirectionalIterator, class Allocator> 519 void 520 swap(match_results<BidirectionalIterator, Allocator>& m1, 521 match_results<BidirectionalIterator, Allocator>& m2); 522 523 template <class BidirectionalIterator, class Allocator, class charT, class traits> 524 bool 525 regex_match(BidirectionalIterator first, BidirectionalIterator last, 526 match_results<BidirectionalIterator, Allocator>& m, 527 const basic_regex<charT, traits>& e, 528 regex_constants::match_flag_type flags = regex_constants::match_default); 529 530 template <class BidirectionalIterator, class charT, class traits> 531 bool 532 regex_match(BidirectionalIterator first, BidirectionalIterator last, 533 const basic_regex<charT, traits>& e, 534 regex_constants::match_flag_type flags = regex_constants::match_default); 535 536 template <class charT, class Allocator, class traits> 537 bool 538 regex_match(const charT* str, match_results<const charT*, Allocator>& m, 539 const basic_regex<charT, traits>& e, 540 regex_constants::match_flag_type flags = regex_constants::match_default); 541 542 template <class ST, class SA, class Allocator, class charT, class traits> 543 bool 544 regex_match(const basic_string<charT, ST, SA>& s, 545 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m, 546 const basic_regex<charT, traits>& e, 547 regex_constants::match_flag_type flags = regex_constants::match_default); 548 549 template <class charT, class traits> 550 bool 551 regex_match(const charT* str, const basic_regex<charT, traits>& e, 552 regex_constants::match_flag_type flags = regex_constants::match_default); 553 554 template <class ST, class SA, class charT, class traits> 555 bool 556 regex_match(const basic_string<charT, ST, SA>& s, 557 const basic_regex<charT, traits>& e, 558 regex_constants::match_flag_type flags = regex_constants::match_default); 559 560 template <class BidirectionalIterator, class Allocator, class charT, class traits> 561 bool 562 regex_search(BidirectionalIterator first, BidirectionalIterator last, 563 match_results<BidirectionalIterator, Allocator>& m, 564 const basic_regex<charT, traits>& e, 565 regex_constants::match_flag_type flags = regex_constants::match_default); 566 567 template <class BidirectionalIterator, class charT, class traits> 568 bool 569 regex_search(BidirectionalIterator first, BidirectionalIterator last, 570 const basic_regex<charT, traits>& e, 571 regex_constants::match_flag_type flags = regex_constants::match_default); 572 573 template <class charT, class Allocator, class traits> 574 bool 575 regex_search(const charT* str, match_results<const charT*, Allocator>& m, 576 const basic_regex<charT, traits>& e, 577 regex_constants::match_flag_type flags = regex_constants::match_default); 578 579 template <class charT, class traits> 580 bool 581 regex_search(const charT* str, const basic_regex<charT, traits>& e, 582 regex_constants::match_flag_type flags = regex_constants::match_default); 583 584 template <class ST, class SA, class charT, class traits> 585 bool 586 regex_search(const basic_string<charT, ST, SA>& s, 587 const basic_regex<charT, traits>& e, 588 regex_constants::match_flag_type flags = regex_constants::match_default); 589 590 template <class ST, class SA, class Allocator, class charT, class traits> 591 bool 592 regex_search(const basic_string<charT, ST, SA>& s, 593 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m, 594 const basic_regex<charT, traits>& e, 595 regex_constants::match_flag_type flags = regex_constants::match_default); 596 597 template <class OutputIterator, class BidirectionalIterator, 598 class traits, class charT, class ST, class SA> 599 OutputIterator 600 regex_replace(OutputIterator out, 601 BidirectionalIterator first, BidirectionalIterator last, 602 const basic_regex<charT, traits>& e, 603 const basic_string<charT, ST, SA>& fmt, 604 regex_constants::match_flag_type flags = regex_constants::match_default); 605 606 template <class OutputIterator, class BidirectionalIterator, 607 class traits, class charT> 608 OutputIterator 609 regex_replace(OutputIterator out, 610 BidirectionalIterator first, BidirectionalIterator last, 611 const basic_regex<charT, traits>& e, const charT* fmt, 612 regex_constants::match_flag_type flags = regex_constants::match_default); 613 614 template <class traits, class charT, class ST, class SA, class FST, class FSA>> 615 basic_string<charT, ST, SA> 616 regex_replace(const basic_string<charT, ST, SA>& s, 617 const basic_regex<charT, traits>& e, 618 const basic_string<charT, FST, FSA>& fmt, 619 regex_constants::match_flag_type flags = regex_constants::match_default); 620 621 template <class traits, class charT, class ST, class SA> 622 basic_string<charT, ST, SA> 623 regex_replace(const basic_string<charT, ST, SA>& s, 624 const basic_regex<charT, traits>& e, const charT* fmt, 625 regex_constants::match_flag_type flags = regex_constants::match_default); 626 627 template <class traits, class charT, class ST, class SA> 628 basic_string<charT> 629 regex_replace(const charT* s, 630 const basic_regex<charT, traits>& e, 631 const basic_string<charT, ST, SA>& fmt, 632 regex_constants::match_flag_type flags = regex_constants::match_default); 633 634 template <class traits, class charT> 635 basic_string<charT> 636 regex_replace(const charT* s, 637 const basic_regex<charT, traits>& e, 638 const charT* fmt, 639 regex_constants::match_flag_type flags = regex_constants::match_default); 640 641 template <class BidirectionalIterator, 642 class charT = typename iterator_traits< BidirectionalIterator>::value_type, 643 class traits = regex_traits<charT>> 644 class regex_iterator 645 { 646 public: 647 typedef basic_regex<charT, traits> regex_type; 648 typedef match_results<BidirectionalIterator> value_type; 649 typedef ptrdiff_t difference_type; 650 typedef const value_type* pointer; 651 typedef const value_type& reference; 652 typedef forward_iterator_tag iterator_category; 653 654 regex_iterator(); 655 regex_iterator(BidirectionalIterator a, BidirectionalIterator b, 656 const regex_type& re, 657 regex_constants::match_flag_type m = regex_constants::match_default); 658 regex_iterator(const regex_iterator&); 659 regex_iterator& operator=(const regex_iterator&); 660 661 bool operator==(const regex_iterator&) const; 662 bool operator!=(const regex_iterator&) const; 663 664 const value_type& operator*() const; 665 const value_type* operator->() const; 666 667 regex_iterator& operator++(); 668 regex_iterator operator++(int); 669 }; 670 671 typedef regex_iterator<const char*> cregex_iterator; 672 typedef regex_iterator<const wchar_t*> wcregex_iterator; 673 typedef regex_iterator<string::const_iterator> sregex_iterator; 674 typedef regex_iterator<wstring::const_iterator> wsregex_iterator; 675 676 template <class BidirectionalIterator, 677 class charT = typename iterator_traits< BidirectionalIterator>::value_type, 678 class traits = regex_traits<charT>> 679 class regex_token_iterator 680 { 681 public: 682 typedef basic_regex<charT, traits> regex_type; 683 typedef sub_match<BidirectionalIterator> value_type; 684 typedef ptrdiff_t difference_type; 685 typedef const value_type* pointer; 686 typedef const value_type& reference; 687 typedef forward_iterator_tag iterator_category; 688 689 regex_token_iterator(); 690 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, 691 const regex_type& re, int submatch = 0, 692 regex_constants::match_flag_type m = regex_constants::match_default); 693 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, 694 const regex_type& re, const vector<int>& submatches, 695 regex_constants::match_flag_type m = regex_constants::match_default); 696 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, 697 const regex_type& re, initializer_list<int> submatches, 698 regex_constants::match_flag_type m = regex_constants::match_default); 699 template <size_t N> 700 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, 701 const regex_type& re, const int (&submatches)[N], 702 regex_constants::match_flag_type m = regex_constants::match_default); 703 regex_token_iterator(const regex_token_iterator&); 704 regex_token_iterator& operator=(const regex_token_iterator&); 705 706 bool operator==(const regex_token_iterator&) const; 707 bool operator!=(const regex_token_iterator&) const; 708 709 const value_type& operator*() const; 710 const value_type* operator->() const; 711 712 regex_token_iterator& operator++(); 713 regex_token_iterator operator++(int); 714 }; 715 716 typedef regex_token_iterator<const char*> cregex_token_iterator; 717 typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator; 718 typedef regex_token_iterator<string::const_iterator> sregex_token_iterator; 719 typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator; 720 721 } // std 722 */ 723 724 #include <__config> 725 #include <stdexcept> 726 #include <__locale> 727 #include <initializer_list> 728 #include <utility> 729 #include <iterator> 730 #include <string> 731 #include <memory> 732 #include <vector> 733 #include <deque> 734 735 #include <__undef_min_max> 736 737 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 738 #pragma GCC system_header 739 #endif 740 741 _LIBCPP_BEGIN_NAMESPACE_STD 742 743 namespace regex_constants 744 { 745 746 // syntax_option_type 747 748 enum syntax_option_type 749 { 750 icase = 1 << 0, 751 nosubs = 1 << 1, 752 optimize = 1 << 2, 753 collate = 1 << 3, 754 ECMAScript = 0, 755 basic = 1 << 4, 756 extended = 1 << 5, 757 awk = 1 << 6, 758 grep = 1 << 7, 759 egrep = 1 << 8 760 }; 761 762 inline _LIBCPP_INLINE_VISIBILITY 763 _LIBCPP_CONSTEXPR 764 syntax_option_type 765 operator~(syntax_option_type __x) 766 { 767 return syntax_option_type(~int(__x)); 768 } 769 770 inline _LIBCPP_INLINE_VISIBILITY 771 _LIBCPP_CONSTEXPR 772 syntax_option_type 773 operator&(syntax_option_type __x, syntax_option_type __y) 774 { 775 return syntax_option_type(int(__x) & int(__y)); 776 } 777 778 inline _LIBCPP_INLINE_VISIBILITY 779 _LIBCPP_CONSTEXPR 780 syntax_option_type 781 operator|(syntax_option_type __x, syntax_option_type __y) 782 { 783 return syntax_option_type(int(__x) | int(__y)); 784 } 785 786 inline _LIBCPP_INLINE_VISIBILITY 787 _LIBCPP_CONSTEXPR 788 syntax_option_type 789 operator^(syntax_option_type __x, syntax_option_type __y) 790 { 791 return syntax_option_type(int(__x) ^ int(__y)); 792 } 793 794 inline _LIBCPP_INLINE_VISIBILITY 795 syntax_option_type& 796 operator&=(syntax_option_type& __x, syntax_option_type __y) 797 { 798 __x = __x & __y; 799 return __x; 800 } 801 802 inline _LIBCPP_INLINE_VISIBILITY 803 syntax_option_type& 804 operator|=(syntax_option_type& __x, syntax_option_type __y) 805 { 806 __x = __x | __y; 807 return __x; 808 } 809 810 inline _LIBCPP_INLINE_VISIBILITY 811 syntax_option_type& 812 operator^=(syntax_option_type& __x, syntax_option_type __y) 813 { 814 __x = __x ^ __y; 815 return __x; 816 } 817 818 // match_flag_type 819 820 enum match_flag_type 821 { 822 match_default = 0, 823 match_not_bol = 1 << 0, 824 match_not_eol = 1 << 1, 825 match_not_bow = 1 << 2, 826 match_not_eow = 1 << 3, 827 match_any = 1 << 4, 828 match_not_null = 1 << 5, 829 match_continuous = 1 << 6, 830 match_prev_avail = 1 << 7, 831 format_default = 0, 832 format_sed = 1 << 8, 833 format_no_copy = 1 << 9, 834 format_first_only = 1 << 10, 835 __no_update_pos = 1 << 11 836 }; 837 838 inline _LIBCPP_INLINE_VISIBILITY 839 _LIBCPP_CONSTEXPR 840 match_flag_type 841 operator~(match_flag_type __x) 842 { 843 return match_flag_type(~int(__x)); 844 } 845 846 inline _LIBCPP_INLINE_VISIBILITY 847 _LIBCPP_CONSTEXPR 848 match_flag_type 849 operator&(match_flag_type __x, match_flag_type __y) 850 { 851 return match_flag_type(int(__x) & int(__y)); 852 } 853 854 inline _LIBCPP_INLINE_VISIBILITY 855 _LIBCPP_CONSTEXPR 856 match_flag_type 857 operator|(match_flag_type __x, match_flag_type __y) 858 { 859 return match_flag_type(int(__x) | int(__y)); 860 } 861 862 inline _LIBCPP_INLINE_VISIBILITY 863 _LIBCPP_CONSTEXPR 864 match_flag_type 865 operator^(match_flag_type __x, match_flag_type __y) 866 { 867 return match_flag_type(int(__x) ^ int(__y)); 868 } 869 870 inline _LIBCPP_INLINE_VISIBILITY 871 match_flag_type& 872 operator&=(match_flag_type& __x, match_flag_type __y) 873 { 874 __x = __x & __y; 875 return __x; 876 } 877 878 inline _LIBCPP_INLINE_VISIBILITY 879 match_flag_type& 880 operator|=(match_flag_type& __x, match_flag_type __y) 881 { 882 __x = __x | __y; 883 return __x; 884 } 885 886 inline _LIBCPP_INLINE_VISIBILITY 887 match_flag_type& 888 operator^=(match_flag_type& __x, match_flag_type __y) 889 { 890 __x = __x ^ __y; 891 return __x; 892 } 893 894 enum error_type 895 { 896 error_collate = 1, 897 error_ctype, 898 error_escape, 899 error_backref, 900 error_brack, 901 error_paren, 902 error_brace, 903 error_badbrace, 904 error_range, 905 error_space, 906 error_badrepeat, 907 error_complexity, 908 error_stack, 909 __re_err_grammar, 910 __re_err_empty, 911 __re_err_unknown 912 }; 913 914 } // regex_constants 915 916 class _LIBCPP_EXCEPTION_ABI regex_error 917 : public runtime_error 918 { 919 regex_constants::error_type __code_; 920 public: 921 explicit regex_error(regex_constants::error_type __ecode); 922 virtual ~regex_error() throw(); 923 _LIBCPP_INLINE_VISIBILITY 924 regex_constants::error_type code() const {return __code_;} 925 }; 926 927 template <class _CharT> 928 struct _LIBCPP_VISIBLE regex_traits 929 { 930 public: 931 typedef _CharT char_type; 932 typedef basic_string<char_type> string_type; 933 typedef locale locale_type; 934 typedef ctype_base::mask char_class_type; 935 936 static const char_class_type __regex_word; 937 private: 938 locale __loc_; 939 const ctype<char_type>* __ct_; 940 const collate<char_type>* __col_; 941 942 public: 943 regex_traits(); 944 945 _LIBCPP_INLINE_VISIBILITY 946 static size_t length(const char_type* __p) 947 {return char_traits<char_type>::length(__p);} 948 _LIBCPP_INLINE_VISIBILITY 949 char_type translate(char_type __c) const {return __c;} 950 char_type translate_nocase(char_type __c) const; 951 template <class _ForwardIterator> 952 string_type 953 transform(_ForwardIterator __f, _ForwardIterator __l) const; 954 template <class _ForwardIterator> 955 _LIBCPP_INLINE_VISIBILITY 956 string_type 957 transform_primary( _ForwardIterator __f, _ForwardIterator __l) const 958 {return __transform_primary(__f, __l, char_type());} 959 template <class _ForwardIterator> 960 _LIBCPP_INLINE_VISIBILITY 961 string_type 962 lookup_collatename(_ForwardIterator __f, _ForwardIterator __l) const 963 {return __lookup_collatename(__f, __l, char_type());} 964 template <class _ForwardIterator> 965 _LIBCPP_INLINE_VISIBILITY 966 char_class_type 967 lookup_classname(_ForwardIterator __f, _ForwardIterator __l, 968 bool __icase = false) const 969 {return __lookup_classname(__f, __l, __icase, char_type());} 970 bool isctype(char_type __c, char_class_type __m) const; 971 _LIBCPP_INLINE_VISIBILITY 972 int value(char_type __ch, int __radix) const 973 {return __value(__ch, __radix);} 974 locale_type imbue(locale_type __l); 975 _LIBCPP_INLINE_VISIBILITY 976 locale_type getloc()const {return __loc_;} 977 978 private: 979 void __init(); 980 981 template <class _ForwardIterator> 982 string_type 983 __transform_primary(_ForwardIterator __f, _ForwardIterator __l, char) const; 984 template <class _ForwardIterator> 985 string_type 986 __transform_primary(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const; 987 988 template <class _ForwardIterator> 989 string_type 990 __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, char) const; 991 template <class _ForwardIterator> 992 string_type 993 __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const; 994 995 template <class _ForwardIterator> 996 char_class_type 997 __lookup_classname(_ForwardIterator __f, _ForwardIterator __l, 998 bool __icase, char) const; 999 template <class _ForwardIterator> 1000 char_class_type 1001 __lookup_classname(_ForwardIterator __f, _ForwardIterator __l, 1002 bool __icase, wchar_t) const; 1003 1004 static int __value(unsigned char __ch, int __radix); 1005 _LIBCPP_INLINE_VISIBILITY 1006 int __value(char __ch, int __radix) const 1007 {return __value(static_cast<unsigned char>(__ch), __radix);} 1008 int __value(wchar_t __ch, int __radix) const; 1009 }; 1010 1011 template <class _CharT> const typename regex_traits<_CharT>::char_class_type regex_traits<_CharT>::__regex_word = 0x80; 1012 1013 template <class _CharT> 1014 regex_traits<_CharT>::regex_traits() 1015 { 1016 __init(); 1017 } 1018 1019 template <class _CharT> 1020 typename regex_traits<_CharT>::char_type 1021 regex_traits<_CharT>::translate_nocase(char_type __c) const 1022 { 1023 return __ct_->tolower(__c); 1024 } 1025 1026 template <class _CharT> 1027 template <class _ForwardIterator> 1028 typename regex_traits<_CharT>::string_type 1029 regex_traits<_CharT>::transform(_ForwardIterator __f, _ForwardIterator __l) const 1030 { 1031 string_type __s(__f, __l); 1032 return __col_->transform(__s.data(), __s.data() + __s.size()); 1033 } 1034 1035 template <class _CharT> 1036 void 1037 regex_traits<_CharT>::__init() 1038 { 1039 __ct_ = &use_facet<ctype<char_type> >(__loc_); 1040 __col_ = &use_facet<collate<char_type> >(__loc_); 1041 } 1042 1043 template <class _CharT> 1044 typename regex_traits<_CharT>::locale_type 1045 regex_traits<_CharT>::imbue(locale_type __l) 1046 { 1047 locale __r = __loc_; 1048 __loc_ = __l; 1049 __init(); 1050 return __r; 1051 } 1052 1053 // transform_primary is very FreeBSD-specific 1054 1055 template <class _CharT> 1056 template <class _ForwardIterator> 1057 typename regex_traits<_CharT>::string_type 1058 regex_traits<_CharT>::__transform_primary(_ForwardIterator __f, 1059 _ForwardIterator __l, char) const 1060 { 1061 const string_type __s(__f, __l); 1062 string_type __d = __col_->transform(__s.data(), __s.data() + __s.size()); 1063 switch (__d.size()) 1064 { 1065 case 1: 1066 break; 1067 case 12: 1068 __d[11] = __d[3]; 1069 break; 1070 default: 1071 __d.clear(); 1072 break; 1073 } 1074 return __d; 1075 } 1076 1077 template <class _CharT> 1078 template <class _ForwardIterator> 1079 typename regex_traits<_CharT>::string_type 1080 regex_traits<_CharT>::__transform_primary(_ForwardIterator __f, 1081 _ForwardIterator __l, wchar_t) const 1082 { 1083 const string_type __s(__f, __l); 1084 string_type __d = __col_->transform(__s.data(), __s.data() + __s.size()); 1085 switch (__d.size()) 1086 { 1087 case 1: 1088 break; 1089 case 3: 1090 __d[2] = __d[0]; 1091 break; 1092 default: 1093 __d.clear(); 1094 break; 1095 } 1096 return __d; 1097 } 1098 1099 // lookup_collatename is very FreeBSD-specific 1100 1101 string __get_collation_name(const char* __s); 1102 1103 template <class _CharT> 1104 template <class _ForwardIterator> 1105 typename regex_traits<_CharT>::string_type 1106 regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f, 1107 _ForwardIterator __l, char) const 1108 { 1109 string_type __s(__f, __l); 1110 string_type __r; 1111 if (!__s.empty()) 1112 { 1113 __r = __get_collation_name(__s.c_str()); 1114 if (__r.empty() && __s.size() <= 2) 1115 { 1116 __r = __col_->transform(__s.data(), __s.data() + __s.size()); 1117 if (__r.size() == 1 || __r.size() == 12) 1118 __r = __s; 1119 else 1120 __r.clear(); 1121 } 1122 } 1123 return __r; 1124 } 1125 1126 template <class _CharT> 1127 template <class _ForwardIterator> 1128 typename regex_traits<_CharT>::string_type 1129 regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f, 1130 _ForwardIterator __l, wchar_t) const 1131 { 1132 string_type __s(__f, __l); 1133 string __n; 1134 __n.reserve(__s.size()); 1135 for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end(); 1136 __i != __e; ++__i) 1137 { 1138 if (static_cast<unsigned>(*__i) >= 127) 1139 return string_type(); 1140 __n.push_back(char(*__i)); 1141 } 1142 string_type __r; 1143 if (!__s.empty()) 1144 { 1145 __n = __get_collation_name(__n.c_str()); 1146 if (!__n.empty()) 1147 __r.assign(__n.begin(), __n.end()); 1148 else if (__s.size() <= 2) 1149 { 1150 __r = __col_->transform(__s.data(), __s.data() + __s.size()); 1151 if (__r.size() == 1 || __r.size() == 3) 1152 __r = __s; 1153 else 1154 __r.clear(); 1155 } 1156 } 1157 return __r; 1158 } 1159 1160 // lookup_classname 1161 1162 ctype_base::mask __get_classname(const char* __s, bool __icase); 1163 1164 template <class _CharT> 1165 template <class _ForwardIterator> 1166 typename regex_traits<_CharT>::char_class_type 1167 regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f, 1168 _ForwardIterator __l, 1169 bool __icase, char) const 1170 { 1171 string_type __s(__f, __l); 1172 __ct_->tolower(&__s[0], &__s[0] + __s.size()); 1173 return __get_classname(__s.c_str(), __icase); 1174 } 1175 1176 template <class _CharT> 1177 template <class _ForwardIterator> 1178 typename regex_traits<_CharT>::char_class_type 1179 regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f, 1180 _ForwardIterator __l, 1181 bool __icase, wchar_t) const 1182 { 1183 string_type __s(__f, __l); 1184 __ct_->tolower(&__s[0], &__s[0] + __s.size()); 1185 string __n; 1186 __n.reserve(__s.size()); 1187 for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end(); 1188 __i != __e; ++__i) 1189 { 1190 if (static_cast<unsigned>(*__i) >= 127) 1191 return char_class_type(); 1192 __n.push_back(char(*__i)); 1193 } 1194 return __get_classname(__n.c_str(), __icase); 1195 } 1196 1197 template <class _CharT> 1198 bool 1199 regex_traits<_CharT>::isctype(char_type __c, char_class_type __m) const 1200 { 1201 if (__ct_->is(__m, __c)) 1202 return true; 1203 return (__c == '_' && (__m & __regex_word)); 1204 } 1205 1206 template <class _CharT> 1207 int 1208 regex_traits<_CharT>::__value(unsigned char __ch, int __radix) 1209 { 1210 if ((__ch & 0xF8u) == 0x30) // '0' <= __ch && __ch <= '7' 1211 return __ch - '0'; 1212 if (__radix != 8) 1213 { 1214 if ((__ch & 0xFEu) == 0x38) // '8' <= __ch && __ch <= '9' 1215 return __ch - '0'; 1216 if (__radix == 16) 1217 { 1218 __ch |= 0x20; // tolower 1219 if ('a' <= __ch && __ch <= 'f') 1220 return __ch - ('a' - 10); 1221 } 1222 } 1223 return -1; 1224 } 1225 1226 template <class _CharT> 1227 inline _LIBCPP_INLINE_VISIBILITY 1228 int 1229 regex_traits<_CharT>::__value(wchar_t __ch, int __radix) const 1230 { 1231 return __value(static_cast<unsigned char>(__ct_->narrow(__ch, char_type())), __radix); 1232 } 1233 1234 template <class _CharT> class __node; 1235 1236 template <class _BidirectionalIterator> class _LIBCPP_VISIBLE sub_match; 1237 1238 template <class _BidirectionalIterator, 1239 class _Allocator = allocator<sub_match<_BidirectionalIterator> > > 1240 class _LIBCPP_VISIBLE match_results; 1241 1242 template <class _CharT> 1243 struct __state 1244 { 1245 enum 1246 { 1247 __end_state = -1000, 1248 __consume_input, // -999 1249 __begin_marked_expr, // -998 1250 __end_marked_expr, // -997 1251 __pop_state, // -996 1252 __accept_and_consume, // -995 1253 __accept_but_not_consume, // -994 1254 __reject, // -993 1255 __split, 1256 __repeat 1257 }; 1258 1259 int __do_; 1260 const _CharT* __first_; 1261 const _CharT* __current_; 1262 const _CharT* __last_; 1263 vector<sub_match<const _CharT*> > __sub_matches_; 1264 vector<pair<size_t, const _CharT*> > __loop_data_; 1265 const __node<_CharT>* __node_; 1266 regex_constants::match_flag_type __flags_; 1267 bool __at_first_; 1268 1269 _LIBCPP_INLINE_VISIBILITY 1270 __state() 1271 : __do_(0), __first_(nullptr), __current_(nullptr), __last_(nullptr), 1272 __node_(nullptr), __flags_() {} 1273 }; 1274 1275 // __node 1276 1277 template <class _CharT> 1278 class __node 1279 { 1280 __node(const __node&); 1281 __node& operator=(const __node&); 1282 public: 1283 typedef _VSTD::__state<_CharT> __state; 1284 1285 _LIBCPP_INLINE_VISIBILITY 1286 __node() {} 1287 _LIBCPP_INLINE_VISIBILITY 1288 virtual ~__node() {} 1289 1290 _LIBCPP_INLINE_VISIBILITY 1291 virtual void __exec(__state&) const {}; 1292 _LIBCPP_INLINE_VISIBILITY 1293 virtual void __exec_split(bool, __state&) const {}; 1294 }; 1295 1296 // __end_state 1297 1298 template <class _CharT> 1299 class __end_state 1300 : public __node<_CharT> 1301 { 1302 public: 1303 typedef _VSTD::__state<_CharT> __state; 1304 1305 _LIBCPP_INLINE_VISIBILITY 1306 __end_state() {} 1307 1308 virtual void __exec(__state&) const; 1309 }; 1310 1311 template <class _CharT> 1312 void 1313 __end_state<_CharT>::__exec(__state& __s) const 1314 { 1315 __s.__do_ = __state::__end_state; 1316 } 1317 1318 // __has_one_state 1319 1320 template <class _CharT> 1321 class __has_one_state 1322 : public __node<_CharT> 1323 { 1324 __node<_CharT>* __first_; 1325 1326 public: 1327 _LIBCPP_INLINE_VISIBILITY 1328 explicit __has_one_state(__node<_CharT>* __s) 1329 : __first_(__s) {} 1330 1331 _LIBCPP_INLINE_VISIBILITY 1332 __node<_CharT>* first() const {return __first_;} 1333 _LIBCPP_INLINE_VISIBILITY 1334 __node<_CharT>*& first() {return __first_;} 1335 }; 1336 1337 // __owns_one_state 1338 1339 template <class _CharT> 1340 class __owns_one_state 1341 : public __has_one_state<_CharT> 1342 { 1343 typedef __has_one_state<_CharT> base; 1344 1345 public: 1346 _LIBCPP_INLINE_VISIBILITY 1347 explicit __owns_one_state(__node<_CharT>* __s) 1348 : base(__s) {} 1349 1350 virtual ~__owns_one_state(); 1351 }; 1352 1353 template <class _CharT> 1354 __owns_one_state<_CharT>::~__owns_one_state() 1355 { 1356 delete this->first(); 1357 } 1358 1359 // __empty_state 1360 1361 template <class _CharT> 1362 class __empty_state 1363 : public __owns_one_state<_CharT> 1364 { 1365 typedef __owns_one_state<_CharT> base; 1366 1367 public: 1368 typedef _VSTD::__state<_CharT> __state; 1369 1370 _LIBCPP_INLINE_VISIBILITY 1371 explicit __empty_state(__node<_CharT>* __s) 1372 : base(__s) {} 1373 1374 virtual void __exec(__state&) const; 1375 }; 1376 1377 template <class _CharT> 1378 void 1379 __empty_state<_CharT>::__exec(__state& __s) const 1380 { 1381 __s.__do_ = __state::__accept_but_not_consume; 1382 __s.__node_ = this->first(); 1383 } 1384 1385 // __empty_non_own_state 1386 1387 template <class _CharT> 1388 class __empty_non_own_state 1389 : public __has_one_state<_CharT> 1390 { 1391 typedef __has_one_state<_CharT> base; 1392 1393 public: 1394 typedef _VSTD::__state<_CharT> __state; 1395 1396 _LIBCPP_INLINE_VISIBILITY 1397 explicit __empty_non_own_state(__node<_CharT>* __s) 1398 : base(__s) {} 1399 1400 virtual void __exec(__state&) const; 1401 }; 1402 1403 template <class _CharT> 1404 void 1405 __empty_non_own_state<_CharT>::__exec(__state& __s) const 1406 { 1407 __s.__do_ = __state::__accept_but_not_consume; 1408 __s.__node_ = this->first(); 1409 } 1410 1411 // __repeat_one_loop 1412 1413 template <class _CharT> 1414 class __repeat_one_loop 1415 : public __has_one_state<_CharT> 1416 { 1417 typedef __has_one_state<_CharT> base; 1418 1419 public: 1420 typedef _VSTD::__state<_CharT> __state; 1421 1422 _LIBCPP_INLINE_VISIBILITY 1423 explicit __repeat_one_loop(__node<_CharT>* __s) 1424 : base(__s) {} 1425 1426 virtual void __exec(__state&) const; 1427 }; 1428 1429 template <class _CharT> 1430 void 1431 __repeat_one_loop<_CharT>::__exec(__state& __s) const 1432 { 1433 __s.__do_ = __state::__repeat; 1434 __s.__node_ = this->first(); 1435 } 1436 1437 // __owns_two_states 1438 1439 template <class _CharT> 1440 class __owns_two_states 1441 : public __owns_one_state<_CharT> 1442 { 1443 typedef __owns_one_state<_CharT> base; 1444 1445 base* __second_; 1446 1447 public: 1448 _LIBCPP_INLINE_VISIBILITY 1449 explicit __owns_two_states(__node<_CharT>* __s1, base* __s2) 1450 : base(__s1), __second_(__s2) {} 1451 1452 virtual ~__owns_two_states(); 1453 1454 _LIBCPP_INLINE_VISIBILITY 1455 base* second() const {return __second_;} 1456 _LIBCPP_INLINE_VISIBILITY 1457 base*& second() {return __second_;} 1458 }; 1459 1460 template <class _CharT> 1461 __owns_two_states<_CharT>::~__owns_two_states() 1462 { 1463 delete __second_; 1464 } 1465 1466 // __loop 1467 1468 template <class _CharT> 1469 class __loop 1470 : public __owns_two_states<_CharT> 1471 { 1472 typedef __owns_two_states<_CharT> base; 1473 1474 size_t __min_; 1475 size_t __max_; 1476 unsigned __loop_id_; 1477 unsigned __mexp_begin_; 1478 unsigned __mexp_end_; 1479 bool __greedy_; 1480 1481 public: 1482 typedef _VSTD::__state<_CharT> __state; 1483 1484 _LIBCPP_INLINE_VISIBILITY 1485 explicit __loop(unsigned __loop_id, 1486 __node<_CharT>* __s1, __owns_one_state<_CharT>* __s2, 1487 unsigned __mexp_begin, unsigned __mexp_end, 1488 bool __greedy = true, 1489 size_t __min = 0, 1490 size_t __max = numeric_limits<size_t>::max()) 1491 : base(__s1, __s2), __min_(__min), __max_(__max), __loop_id_(__loop_id), 1492 __mexp_begin_(__mexp_begin), __mexp_end_(__mexp_end), 1493 __greedy_(__greedy) {} 1494 1495 virtual void __exec(__state& __s) const; 1496 virtual void __exec_split(bool __second, __state& __s) const; 1497 1498 private: 1499 _LIBCPP_INLINE_VISIBILITY 1500 void __init_repeat(__state& __s) const 1501 { 1502 __s.__loop_data_[__loop_id_].second = __s.__current_; 1503 for (size_t __i = __mexp_begin_-1; __i != __mexp_end_-1; ++__i) 1504 { 1505 __s.__sub_matches_[__i].first = __s.__last_; 1506 __s.__sub_matches_[__i].second = __s.__last_; 1507 __s.__sub_matches_[__i].matched = false; 1508 } 1509 } 1510 }; 1511 1512 template <class _CharT> 1513 void 1514 __loop<_CharT>::__exec(__state& __s) const 1515 { 1516 if (__s.__do_ == __state::__repeat) 1517 { 1518 bool __do_repeat = ++__s.__loop_data_[__loop_id_].first < __max_; 1519 bool __do_alt = __s.__loop_data_[__loop_id_].first >= __min_; 1520 if (__do_repeat && __do_alt && 1521 __s.__loop_data_[__loop_id_].second == __s.__current_) 1522 __do_repeat = false; 1523 if (__do_repeat && __do_alt) 1524 __s.__do_ = __state::__split; 1525 else if (__do_repeat) 1526 { 1527 __s.__do_ = __state::__accept_but_not_consume; 1528 __s.__node_ = this->first(); 1529 __init_repeat(__s); 1530 } 1531 else 1532 { 1533 __s.__do_ = __state::__accept_but_not_consume; 1534 __s.__node_ = this->second(); 1535 } 1536 } 1537 else 1538 { 1539 __s.__loop_data_[__loop_id_].first = 0; 1540 bool __do_repeat = 0 < __max_; 1541 bool __do_alt = 0 >= __min_; 1542 if (__do_repeat && __do_alt) 1543 __s.__do_ = __state::__split; 1544 else if (__do_repeat) 1545 { 1546 __s.__do_ = __state::__accept_but_not_consume; 1547 __s.__node_ = this->first(); 1548 __init_repeat(__s); 1549 } 1550 else 1551 { 1552 __s.__do_ = __state::__accept_but_not_consume; 1553 __s.__node_ = this->second(); 1554 } 1555 } 1556 } 1557 1558 template <class _CharT> 1559 void 1560 __loop<_CharT>::__exec_split(bool __second, __state& __s) const 1561 { 1562 __s.__do_ = __state::__accept_but_not_consume; 1563 if (__greedy_ != __second) 1564 { 1565 __s.__node_ = this->first(); 1566 __init_repeat(__s); 1567 } 1568 else 1569 __s.__node_ = this->second(); 1570 } 1571 1572 // __alternate 1573 1574 template <class _CharT> 1575 class __alternate 1576 : public __owns_two_states<_CharT> 1577 { 1578 typedef __owns_two_states<_CharT> base; 1579 1580 public: 1581 typedef _VSTD::__state<_CharT> __state; 1582 1583 _LIBCPP_INLINE_VISIBILITY 1584 explicit __alternate(__owns_one_state<_CharT>* __s1, 1585 __owns_one_state<_CharT>* __s2) 1586 : base(__s1, __s2) {} 1587 1588 virtual void __exec(__state& __s) const; 1589 virtual void __exec_split(bool __second, __state& __s) const; 1590 }; 1591 1592 template <class _CharT> 1593 void 1594 __alternate<_CharT>::__exec(__state& __s) const 1595 { 1596 __s.__do_ = __state::__split; 1597 } 1598 1599 template <class _CharT> 1600 void 1601 __alternate<_CharT>::__exec_split(bool __second, __state& __s) const 1602 { 1603 __s.__do_ = __state::__accept_but_not_consume; 1604 if (__second) 1605 __s.__node_ = this->second(); 1606 else 1607 __s.__node_ = this->first(); 1608 } 1609 1610 // __begin_marked_subexpression 1611 1612 template <class _CharT> 1613 class __begin_marked_subexpression 1614 : public __owns_one_state<_CharT> 1615 { 1616 typedef __owns_one_state<_CharT> base; 1617 1618 unsigned __mexp_; 1619 public: 1620 typedef _VSTD::__state<_CharT> __state; 1621 1622 _LIBCPP_INLINE_VISIBILITY 1623 explicit __begin_marked_subexpression(unsigned __mexp, __node<_CharT>* __s) 1624 : base(__s), __mexp_(__mexp) {} 1625 1626 virtual void __exec(__state&) const; 1627 }; 1628 1629 template <class _CharT> 1630 void 1631 __begin_marked_subexpression<_CharT>::__exec(__state& __s) const 1632 { 1633 __s.__do_ = __state::__accept_but_not_consume; 1634 __s.__sub_matches_[__mexp_-1].first = __s.__current_; 1635 __s.__node_ = this->first(); 1636 } 1637 1638 // __end_marked_subexpression 1639 1640 template <class _CharT> 1641 class __end_marked_subexpression 1642 : public __owns_one_state<_CharT> 1643 { 1644 typedef __owns_one_state<_CharT> base; 1645 1646 unsigned __mexp_; 1647 public: 1648 typedef _VSTD::__state<_CharT> __state; 1649 1650 _LIBCPP_INLINE_VISIBILITY 1651 explicit __end_marked_subexpression(unsigned __mexp, __node<_CharT>* __s) 1652 : base(__s), __mexp_(__mexp) {} 1653 1654 virtual void __exec(__state&) const; 1655 }; 1656 1657 template <class _CharT> 1658 void 1659 __end_marked_subexpression<_CharT>::__exec(__state& __s) const 1660 { 1661 __s.__do_ = __state::__accept_but_not_consume; 1662 __s.__sub_matches_[__mexp_-1].second = __s.__current_; 1663 __s.__sub_matches_[__mexp_-1].matched = true; 1664 __s.__node_ = this->first(); 1665 } 1666 1667 // __back_ref 1668 1669 template <class _CharT> 1670 class __back_ref 1671 : public __owns_one_state<_CharT> 1672 { 1673 typedef __owns_one_state<_CharT> base; 1674 1675 unsigned __mexp_; 1676 public: 1677 typedef _VSTD::__state<_CharT> __state; 1678 1679 _LIBCPP_INLINE_VISIBILITY 1680 explicit __back_ref(unsigned __mexp, __node<_CharT>* __s) 1681 : base(__s), __mexp_(__mexp) {} 1682 1683 virtual void __exec(__state&) const; 1684 }; 1685 1686 template <class _CharT> 1687 void 1688 __back_ref<_CharT>::__exec(__state& __s) const 1689 { 1690 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1]; 1691 if (__sm.matched) 1692 { 1693 ptrdiff_t __len = __sm.second - __sm.first; 1694 if (__s.__last_ - __s.__current_ >= __len && 1695 _VSTD::equal(__sm.first, __sm.second, __s.__current_)) 1696 { 1697 __s.__do_ = __state::__accept_but_not_consume; 1698 __s.__current_ += __len; 1699 __s.__node_ = this->first(); 1700 } 1701 else 1702 { 1703 __s.__do_ = __state::__reject; 1704 __s.__node_ = nullptr; 1705 } 1706 } 1707 else 1708 { 1709 __s.__do_ = __state::__reject; 1710 __s.__node_ = nullptr; 1711 } 1712 } 1713 1714 // __back_ref_icase 1715 1716 template <class _CharT, class _Traits> 1717 class __back_ref_icase 1718 : public __owns_one_state<_CharT> 1719 { 1720 typedef __owns_one_state<_CharT> base; 1721 1722 _Traits __traits_; 1723 unsigned __mexp_; 1724 public: 1725 typedef _VSTD::__state<_CharT> __state; 1726 1727 _LIBCPP_INLINE_VISIBILITY 1728 explicit __back_ref_icase(const _Traits& __traits, unsigned __mexp, 1729 __node<_CharT>* __s) 1730 : base(__s), __traits_(__traits), __mexp_(__mexp) {} 1731 1732 virtual void __exec(__state&) const; 1733 }; 1734 1735 template <class _CharT, class _Traits> 1736 void 1737 __back_ref_icase<_CharT, _Traits>::__exec(__state& __s) const 1738 { 1739 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1]; 1740 if (__sm.matched) 1741 { 1742 ptrdiff_t __len = __sm.second - __sm.first; 1743 if (__s.__last_ - __s.__current_ >= __len) 1744 { 1745 for (ptrdiff_t __i = 0; __i < __len; ++__i) 1746 { 1747 if (__traits_.translate_nocase(__sm.first[__i]) != 1748 __traits_.translate_nocase(__s.__current_[__i])) 1749 goto __not_equal; 1750 } 1751 __s.__do_ = __state::__accept_but_not_consume; 1752 __s.__current_ += __len; 1753 __s.__node_ = this->first(); 1754 } 1755 else 1756 { 1757 __s.__do_ = __state::__reject; 1758 __s.__node_ = nullptr; 1759 } 1760 } 1761 else 1762 { 1763 __not_equal: 1764 __s.__do_ = __state::__reject; 1765 __s.__node_ = nullptr; 1766 } 1767 } 1768 1769 // __back_ref_collate 1770 1771 template <class _CharT, class _Traits> 1772 class __back_ref_collate 1773 : public __owns_one_state<_CharT> 1774 { 1775 typedef __owns_one_state<_CharT> base; 1776 1777 _Traits __traits_; 1778 unsigned __mexp_; 1779 public: 1780 typedef _VSTD::__state<_CharT> __state; 1781 1782 _LIBCPP_INLINE_VISIBILITY 1783 explicit __back_ref_collate(const _Traits& __traits, unsigned __mexp, 1784 __node<_CharT>* __s) 1785 : base(__s), __traits_(__traits), __mexp_(__mexp) {} 1786 1787 virtual void __exec(__state&) const; 1788 }; 1789 1790 template <class _CharT, class _Traits> 1791 void 1792 __back_ref_collate<_CharT, _Traits>::__exec(__state& __s) const 1793 { 1794 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1]; 1795 if (__sm.matched) 1796 { 1797 ptrdiff_t __len = __sm.second - __sm.first; 1798 if (__s.__last_ - __s.__current_ >= __len) 1799 { 1800 for (ptrdiff_t __i = 0; __i < __len; ++__i) 1801 { 1802 if (__traits_.translate(__sm.first[__i]) != 1803 __traits_.translate(__s.__current_[__i])) 1804 goto __not_equal; 1805 } 1806 __s.__do_ = __state::__accept_but_not_consume; 1807 __s.__current_ += __len; 1808 __s.__node_ = this->first(); 1809 } 1810 else 1811 { 1812 __s.__do_ = __state::__reject; 1813 __s.__node_ = nullptr; 1814 } 1815 } 1816 else 1817 { 1818 __not_equal: 1819 __s.__do_ = __state::__reject; 1820 __s.__node_ = nullptr; 1821 } 1822 } 1823 1824 // __word_boundary 1825 1826 template <class _CharT, class _Traits> 1827 class __word_boundary 1828 : public __owns_one_state<_CharT> 1829 { 1830 typedef __owns_one_state<_CharT> base; 1831 1832 _Traits __traits_; 1833 bool __invert_; 1834 public: 1835 typedef _VSTD::__state<_CharT> __state; 1836 1837 _LIBCPP_INLINE_VISIBILITY 1838 explicit __word_boundary(const _Traits& __traits, bool __invert, 1839 __node<_CharT>* __s) 1840 : base(__s), __traits_(__traits), __invert_(__invert) {} 1841 1842 virtual void __exec(__state&) const; 1843 }; 1844 1845 template <class _CharT, class _Traits> 1846 void 1847 __word_boundary<_CharT, _Traits>::__exec(__state& __s) const 1848 { 1849 bool __is_word_b = false; 1850 if (__s.__first_ != __s.__last_) 1851 { 1852 if (__s.__current_ == __s.__last_) 1853 { 1854 if (!(__s.__flags_ & regex_constants::match_not_eow)) 1855 { 1856 _CharT __c = __s.__current_[-1]; 1857 __is_word_b = __c == '_' || 1858 __traits_.isctype(__c, ctype_base::alnum); 1859 } 1860 } 1861 else if (__s.__current_ == __s.__first_ && 1862 !(__s.__flags_ & regex_constants::match_prev_avail)) 1863 { 1864 if (!(__s.__flags_ & regex_constants::match_not_bow)) 1865 { 1866 _CharT __c = *__s.__current_; 1867 __is_word_b = __c == '_' || 1868 __traits_.isctype(__c, ctype_base::alnum); 1869 } 1870 } 1871 else 1872 { 1873 _CharT __c1 = __s.__current_[-1]; 1874 _CharT __c2 = *__s.__current_; 1875 bool __is_c1_b = __c1 == '_' || 1876 __traits_.isctype(__c1, ctype_base::alnum); 1877 bool __is_c2_b = __c2 == '_' || 1878 __traits_.isctype(__c2, ctype_base::alnum); 1879 __is_word_b = __is_c1_b != __is_c2_b; 1880 } 1881 } 1882 if (__is_word_b != __invert_) 1883 { 1884 __s.__do_ = __state::__accept_but_not_consume; 1885 __s.__node_ = this->first(); 1886 } 1887 else 1888 { 1889 __s.__do_ = __state::__reject; 1890 __s.__node_ = nullptr; 1891 } 1892 } 1893 1894 // __l_anchor 1895 1896 template <class _CharT> 1897 class __l_anchor 1898 : public __owns_one_state<_CharT> 1899 { 1900 typedef __owns_one_state<_CharT> base; 1901 1902 public: 1903 typedef _VSTD::__state<_CharT> __state; 1904 1905 _LIBCPP_INLINE_VISIBILITY 1906 __l_anchor(__node<_CharT>* __s) 1907 : base(__s) {} 1908 1909 virtual void __exec(__state&) const; 1910 }; 1911 1912 template <class _CharT> 1913 void 1914 __l_anchor<_CharT>::__exec(__state& __s) const 1915 { 1916 if (__s.__at_first_ && __s.__current_ == __s.__first_) 1917 { 1918 __s.__do_ = __state::__accept_but_not_consume; 1919 __s.__node_ = this->first(); 1920 } 1921 else 1922 { 1923 __s.__do_ = __state::__reject; 1924 __s.__node_ = nullptr; 1925 } 1926 } 1927 1928 // __r_anchor 1929 1930 template <class _CharT> 1931 class __r_anchor 1932 : public __owns_one_state<_CharT> 1933 { 1934 typedef __owns_one_state<_CharT> base; 1935 1936 public: 1937 typedef _VSTD::__state<_CharT> __state; 1938 1939 _LIBCPP_INLINE_VISIBILITY 1940 __r_anchor(__node<_CharT>* __s) 1941 : base(__s) {} 1942 1943 virtual void __exec(__state&) const; 1944 }; 1945 1946 template <class _CharT> 1947 void 1948 __r_anchor<_CharT>::__exec(__state& __s) const 1949 { 1950 if (__s.__current_ == __s.__last_) 1951 { 1952 __s.__do_ = __state::__accept_but_not_consume; 1953 __s.__node_ = this->first(); 1954 } 1955 else 1956 { 1957 __s.__do_ = __state::__reject; 1958 __s.__node_ = nullptr; 1959 } 1960 } 1961 1962 // __match_any 1963 1964 template <class _CharT> 1965 class __match_any 1966 : public __owns_one_state<_CharT> 1967 { 1968 typedef __owns_one_state<_CharT> base; 1969 1970 public: 1971 typedef _VSTD::__state<_CharT> __state; 1972 1973 _LIBCPP_INLINE_VISIBILITY 1974 __match_any(__node<_CharT>* __s) 1975 : base(__s) {} 1976 1977 virtual void __exec(__state&) const; 1978 }; 1979 1980 template <class _CharT> 1981 void 1982 __match_any<_CharT>::__exec(__state& __s) const 1983 { 1984 if (__s.__current_ != __s.__last_ && *__s.__current_ != 0) 1985 { 1986 __s.__do_ = __state::__accept_and_consume; 1987 ++__s.__current_; 1988 __s.__node_ = this->first(); 1989 } 1990 else 1991 { 1992 __s.__do_ = __state::__reject; 1993 __s.__node_ = nullptr; 1994 } 1995 } 1996 1997 // __match_any_but_newline 1998 1999 template <class _CharT> 2000 class __match_any_but_newline 2001 : public __owns_one_state<_CharT> 2002 { 2003 typedef __owns_one_state<_CharT> base; 2004 2005 public: 2006 typedef _VSTD::__state<_CharT> __state; 2007 2008 _LIBCPP_INLINE_VISIBILITY 2009 __match_any_but_newline(__node<_CharT>* __s) 2010 : base(__s) {} 2011 2012 virtual void __exec(__state&) const; 2013 }; 2014 2015 // __match_char 2016 2017 template <class _CharT> 2018 class __match_char 2019 : public __owns_one_state<_CharT> 2020 { 2021 typedef __owns_one_state<_CharT> base; 2022 2023 _CharT __c_; 2024 2025 __match_char(const __match_char&); 2026 __match_char& operator=(const __match_char&); 2027 public: 2028 typedef _VSTD::__state<_CharT> __state; 2029 2030 _LIBCPP_INLINE_VISIBILITY 2031 __match_char(_CharT __c, __node<_CharT>* __s) 2032 : base(__s), __c_(__c) {} 2033 2034 virtual void __exec(__state&) const; 2035 }; 2036 2037 template <class _CharT> 2038 void 2039 __match_char<_CharT>::__exec(__state& __s) const 2040 { 2041 if (__s.__current_ != __s.__last_ && *__s.__current_ == __c_) 2042 { 2043 __s.__do_ = __state::__accept_and_consume; 2044 ++__s.__current_; 2045 __s.__node_ = this->first(); 2046 } 2047 else 2048 { 2049 __s.__do_ = __state::__reject; 2050 __s.__node_ = nullptr; 2051 } 2052 } 2053 2054 // __match_char_icase 2055 2056 template <class _CharT, class _Traits> 2057 class __match_char_icase 2058 : public __owns_one_state<_CharT> 2059 { 2060 typedef __owns_one_state<_CharT> base; 2061 2062 _Traits __traits_; 2063 _CharT __c_; 2064 2065 __match_char_icase(const __match_char_icase&); 2066 __match_char_icase& operator=(const __match_char_icase&); 2067 public: 2068 typedef _VSTD::__state<_CharT> __state; 2069 2070 _LIBCPP_INLINE_VISIBILITY 2071 __match_char_icase(const _Traits& __traits, _CharT __c, __node<_CharT>* __s) 2072 : base(__s), __traits_(__traits), __c_(__traits.translate_nocase(__c)) {} 2073 2074 virtual void __exec(__state&) const; 2075 }; 2076 2077 template <class _CharT, class _Traits> 2078 void 2079 __match_char_icase<_CharT, _Traits>::__exec(__state& __s) const 2080 { 2081 if (__s.__current_ != __s.__last_ && 2082 __traits_.translate_nocase(*__s.__current_) == __c_) 2083 { 2084 __s.__do_ = __state::__accept_and_consume; 2085 ++__s.__current_; 2086 __s.__node_ = this->first(); 2087 } 2088 else 2089 { 2090 __s.__do_ = __state::__reject; 2091 __s.__node_ = nullptr; 2092 } 2093 } 2094 2095 // __match_char_collate 2096 2097 template <class _CharT, class _Traits> 2098 class __match_char_collate 2099 : public __owns_one_state<_CharT> 2100 { 2101 typedef __owns_one_state<_CharT> base; 2102 2103 _Traits __traits_; 2104 _CharT __c_; 2105 2106 __match_char_collate(const __match_char_collate&); 2107 __match_char_collate& operator=(const __match_char_collate&); 2108 public: 2109 typedef _VSTD::__state<_CharT> __state; 2110 2111 _LIBCPP_INLINE_VISIBILITY 2112 __match_char_collate(const _Traits& __traits, _CharT __c, __node<_CharT>* __s) 2113 : base(__s), __traits_(__traits), __c_(__traits.translate(__c)) {} 2114 2115 virtual void __exec(__state&) const; 2116 }; 2117 2118 template <class _CharT, class _Traits> 2119 void 2120 __match_char_collate<_CharT, _Traits>::__exec(__state& __s) const 2121 { 2122 if (__s.__current_ != __s.__last_ && 2123 __traits_.translate(*__s.__current_) == __c_) 2124 { 2125 __s.__do_ = __state::__accept_and_consume; 2126 ++__s.__current_; 2127 __s.__node_ = this->first(); 2128 } 2129 else 2130 { 2131 __s.__do_ = __state::__reject; 2132 __s.__node_ = nullptr; 2133 } 2134 } 2135 2136 // __bracket_expression 2137 2138 template <class _CharT, class _Traits> 2139 class __bracket_expression 2140 : public __owns_one_state<_CharT> 2141 { 2142 typedef __owns_one_state<_CharT> base; 2143 typedef typename _Traits::string_type string_type; 2144 2145 _Traits __traits_; 2146 vector<_CharT> __chars_; 2147 vector<_CharT> __neg_chars_; 2148 vector<pair<string_type, string_type> > __ranges_; 2149 vector<pair<_CharT, _CharT> > __digraphs_; 2150 vector<string_type> __equivalences_; 2151 ctype_base::mask __mask_; 2152 ctype_base::mask __neg_mask_; 2153 bool __negate_; 2154 bool __icase_; 2155 bool __collate_; 2156 bool __might_have_digraph_; 2157 2158 __bracket_expression(const __bracket_expression&); 2159 __bracket_expression& operator=(const __bracket_expression&); 2160 public: 2161 typedef _VSTD::__state<_CharT> __state; 2162 2163 _LIBCPP_INLINE_VISIBILITY 2164 __bracket_expression(const _Traits& __traits, __node<_CharT>* __s, 2165 bool __negate, bool __icase, bool __collate) 2166 : base(__s), __traits_(__traits), __mask_(), __neg_mask_(), 2167 __negate_(__negate), __icase_(__icase), __collate_(__collate), 2168 __might_have_digraph_(__traits_.getloc().name() != "C") {} 2169 2170 virtual void __exec(__state&) const; 2171 2172 _LIBCPP_INLINE_VISIBILITY 2173 bool __negated() const {return __negate_;} 2174 2175 _LIBCPP_INLINE_VISIBILITY 2176 void __add_char(_CharT __c) 2177 { 2178 if (__icase_) 2179 __chars_.push_back(__traits_.translate_nocase(__c)); 2180 else if (__collate_) 2181 __chars_.push_back(__traits_.translate(__c)); 2182 else 2183 __chars_.push_back(__c); 2184 } 2185 _LIBCPP_INLINE_VISIBILITY 2186 void __add_neg_char(_CharT __c) 2187 { 2188 if (__icase_) 2189 __neg_chars_.push_back(__traits_.translate_nocase(__c)); 2190 else if (__collate_) 2191 __neg_chars_.push_back(__traits_.translate(__c)); 2192 else 2193 __neg_chars_.push_back(__c); 2194 } 2195 _LIBCPP_INLINE_VISIBILITY 2196 void __add_range(string_type __b, string_type __e) 2197 { 2198 if (__collate_) 2199 { 2200 if (__icase_) 2201 { 2202 for (size_t __i = 0; __i < __b.size(); ++__i) 2203 __b[__i] = __traits_.translate_nocase(__b[__i]); 2204 for (size_t __i = 0; __i < __e.size(); ++__i) 2205 __e[__i] = __traits_.translate_nocase(__e[__i]); 2206 } 2207 else 2208 { 2209 for (size_t __i = 0; __i < __b.size(); ++__i) 2210 __b[__i] = __traits_.translate(__b[__i]); 2211 for (size_t __i = 0; __i < __e.size(); ++__i) 2212 __e[__i] = __traits_.translate(__e[__i]); 2213 } 2214 __ranges_.push_back(make_pair( 2215 __traits_.transform(__b.begin(), __b.end()), 2216 __traits_.transform(__e.begin(), __e.end()))); 2217 } 2218 else 2219 { 2220 #ifndef _LIBCPP_NO_EXCEPTIONS 2221 if (__b.size() != 1 || __e.size() != 1) 2222 throw regex_error(regex_constants::error_collate); 2223 #endif // _LIBCPP_NO_EXCEPTIONS 2224 if (__icase_) 2225 { 2226 __b[0] = __traits_.translate_nocase(__b[0]); 2227 __e[0] = __traits_.translate_nocase(__e[0]); 2228 } 2229 __ranges_.push_back(make_pair(_VSTD::move(__b), _VSTD::move(__e))); 2230 } 2231 } 2232 _LIBCPP_INLINE_VISIBILITY 2233 void __add_digraph(_CharT __c1, _CharT __c2) 2234 { 2235 if (__icase_) 2236 __digraphs_.push_back(make_pair(__traits_.translate_nocase(__c1), 2237 __traits_.translate_nocase(__c2))); 2238 else if (__collate_) 2239 __digraphs_.push_back(make_pair(__traits_.translate(__c1), 2240 __traits_.translate(__c2))); 2241 else 2242 __digraphs_.push_back(make_pair(__c1, __c2)); 2243 } 2244 _LIBCPP_INLINE_VISIBILITY 2245 void __add_equivalence(const string_type& __s) 2246 {__equivalences_.push_back(__s);} 2247 _LIBCPP_INLINE_VISIBILITY 2248 void __add_class(ctype_base::mask __mask) 2249 {__mask_ |= __mask;} 2250 _LIBCPP_INLINE_VISIBILITY 2251 void __add_neg_class(ctype_base::mask __mask) 2252 {__neg_mask_ |= __mask;} 2253 }; 2254 2255 template <class _CharT, class _Traits> 2256 void 2257 __bracket_expression<_CharT, _Traits>::__exec(__state& __s) const 2258 { 2259 bool __found = false; 2260 unsigned __consumed = 0; 2261 if (__s.__current_ != __s.__last_) 2262 { 2263 ++__consumed; 2264 if (__might_have_digraph_) 2265 { 2266 const _CharT* __next = _VSTD::next(__s.__current_); 2267 if (__next != __s.__last_) 2268 { 2269 pair<_CharT, _CharT> __ch2(*__s.__current_, *__next); 2270 if (__icase_) 2271 { 2272 __ch2.first = __traits_.translate_nocase(__ch2.first); 2273 __ch2.second = __traits_.translate_nocase(__ch2.second); 2274 } 2275 else if (__collate_) 2276 { 2277 __ch2.first = __traits_.translate(__ch2.first); 2278 __ch2.second = __traits_.translate(__ch2.second); 2279 } 2280 if (!__traits_.lookup_collatename(&__ch2.first, &__ch2.first+2).empty()) 2281 { 2282 // __ch2 is a digraph in this locale 2283 ++__consumed; 2284 for (size_t __i = 0; __i < __digraphs_.size(); ++__i) 2285 { 2286 if (__ch2 == __digraphs_[__i]) 2287 { 2288 __found = true; 2289 goto __exit; 2290 } 2291 } 2292 if (__collate_ && !__ranges_.empty()) 2293 { 2294 string_type __s2 = __traits_.transform(&__ch2.first, 2295 &__ch2.first + 2); 2296 for (size_t __i = 0; __i < __ranges_.size(); ++__i) 2297 { 2298 if (__ranges_[__i].first <= __s2 && 2299 __s2 <= __ranges_[__i].second) 2300 { 2301 __found = true; 2302 goto __exit; 2303 } 2304 } 2305 } 2306 if (!__equivalences_.empty()) 2307 { 2308 string_type __s2 = __traits_.transform_primary(&__ch2.first, 2309 &__ch2.first + 2); 2310 for (size_t __i = 0; __i < __equivalences_.size(); ++__i) 2311 { 2312 if (__s2 == __equivalences_[__i]) 2313 { 2314 __found = true; 2315 goto __exit; 2316 } 2317 } 2318 } 2319 if (__traits_.isctype(__ch2.first, __mask_) && 2320 __traits_.isctype(__ch2.second, __mask_)) 2321 { 2322 __found = true; 2323 goto __exit; 2324 } 2325 if (!__traits_.isctype(__ch2.first, __neg_mask_) && 2326 !__traits_.isctype(__ch2.second, __neg_mask_)) 2327 { 2328 __found = true; 2329 goto __exit; 2330 } 2331 goto __exit; 2332 } 2333 } 2334 } 2335 // test *__s.__current_ as not a digraph 2336 _CharT __ch = *__s.__current_; 2337 if (__icase_) 2338 __ch = __traits_.translate_nocase(__ch); 2339 else if (__collate_) 2340 __ch = __traits_.translate(__ch); 2341 for (size_t __i = 0; __i < __chars_.size(); ++__i) 2342 { 2343 if (__ch == __chars_[__i]) 2344 { 2345 __found = true; 2346 goto __exit; 2347 } 2348 } 2349 if (!__neg_chars_.empty()) 2350 { 2351 for (size_t __i = 0; __i < __neg_chars_.size(); ++__i) 2352 { 2353 if (__ch == __neg_chars_[__i]) 2354 goto __is_neg_char; 2355 } 2356 __found = true; 2357 goto __exit; 2358 } 2359 __is_neg_char: 2360 if (!__ranges_.empty()) 2361 { 2362 string_type __s2 = __collate_ ? 2363 __traits_.transform(&__ch, &__ch + 1) : 2364 string_type(1, __ch); 2365 for (size_t __i = 0; __i < __ranges_.size(); ++__i) 2366 { 2367 if (__ranges_[__i].first <= __s2 && __s2 <= __ranges_[__i].second) 2368 { 2369 __found = true; 2370 goto __exit; 2371 } 2372 } 2373 } 2374 if (!__equivalences_.empty()) 2375 { 2376 string_type __s2 = __traits_.transform_primary(&__ch, &__ch + 1); 2377 for (size_t __i = 0; __i < __equivalences_.size(); ++__i) 2378 { 2379 if (__s2 == __equivalences_[__i]) 2380 { 2381 __found = true; 2382 goto __exit; 2383 } 2384 } 2385 } 2386 if (__traits_.isctype(__ch, __mask_)) 2387 { 2388 __found = true; 2389 goto __exit; 2390 } 2391 if (__neg_mask_ && !__traits_.isctype(__ch, __neg_mask_)) 2392 { 2393 __found = true; 2394 goto __exit; 2395 } 2396 } 2397 else 2398 __found = __negate_; // force reject 2399 __exit: 2400 if (__found != __negate_) 2401 { 2402 __s.__do_ = __state::__accept_and_consume; 2403 __s.__current_ += __consumed; 2404 __s.__node_ = this->first(); 2405 } 2406 else 2407 { 2408 __s.__do_ = __state::__reject; 2409 __s.__node_ = nullptr; 2410 } 2411 } 2412 2413 template <class _CharT, class _Traits> class __lookahead; 2414 2415 template <class _CharT, class _Traits = regex_traits<_CharT> > 2416 class _LIBCPP_VISIBLE basic_regex 2417 { 2418 public: 2419 // types: 2420 typedef _CharT value_type; 2421 typedef regex_constants::syntax_option_type flag_type; 2422 typedef typename _Traits::locale_type locale_type; 2423 2424 private: 2425 _Traits __traits_; 2426 flag_type __flags_; 2427 unsigned __marked_count_; 2428 unsigned __loop_count_; 2429 int __open_count_; 2430 shared_ptr<__empty_state<_CharT> > __start_; 2431 __owns_one_state<_CharT>* __end_; 2432 2433 typedef _VSTD::__state<_CharT> __state; 2434 typedef _VSTD::__node<_CharT> __node; 2435 2436 public: 2437 // constants: 2438 static const regex_constants::syntax_option_type icase = regex_constants::icase; 2439 static const regex_constants::syntax_option_type nosubs = regex_constants::nosubs; 2440 static const regex_constants::syntax_option_type optimize = regex_constants::optimize; 2441 static const regex_constants::syntax_option_type collate = regex_constants::collate; 2442 static const regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript; 2443 static const regex_constants::syntax_option_type basic = regex_constants::basic; 2444 static const regex_constants::syntax_option_type extended = regex_constants::extended; 2445 static const regex_constants::syntax_option_type awk = regex_constants::awk; 2446 static const regex_constants::syntax_option_type grep = regex_constants::grep; 2447 static const regex_constants::syntax_option_type egrep = regex_constants::egrep; 2448 2449 // construct/copy/destroy: 2450 _LIBCPP_INLINE_VISIBILITY 2451 basic_regex() 2452 : __flags_(), __marked_count_(0), __loop_count_(0), __open_count_(0), 2453 __end_(0) 2454 {} 2455 _LIBCPP_INLINE_VISIBILITY 2456 explicit basic_regex(const value_type* __p, flag_type __f = regex_constants::ECMAScript) 2457 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0), 2458 __end_(0) 2459 {__parse(__p, __p + __traits_.length(__p));} 2460 _LIBCPP_INLINE_VISIBILITY 2461 basic_regex(const value_type* __p, size_t __len, flag_type __f) 2462 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0), 2463 __end_(0) 2464 {__parse(__p, __p + __len);} 2465 // basic_regex(const basic_regex&) = default; 2466 // basic_regex(basic_regex&&) = default; 2467 template <class _ST, class _SA> 2468 _LIBCPP_INLINE_VISIBILITY 2469 explicit basic_regex(const basic_string<value_type, _ST, _SA>& __p, 2470 flag_type __f = regex_constants::ECMAScript) 2471 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0), 2472 __end_(0) 2473 {__parse(__p.begin(), __p.end());} 2474 template <class _ForwardIterator> 2475 _LIBCPP_INLINE_VISIBILITY 2476 basic_regex(_ForwardIterator __first, _ForwardIterator __last, 2477 flag_type __f = regex_constants::ECMAScript) 2478 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0), 2479 __end_(0) 2480 {__parse(__first, __last);} 2481 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 2482 _LIBCPP_INLINE_VISIBILITY 2483 basic_regex(initializer_list<value_type> __il, 2484 flag_type __f = regex_constants::ECMAScript) 2485 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0), 2486 __end_(0) 2487 {__parse(__il.begin(), __il.end());} 2488 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 2489 2490 // ~basic_regex() = default; 2491 2492 // basic_regex& operator=(const basic_regex&) = default; 2493 // basic_regex& operator=(basic_regex&&) = default; 2494 _LIBCPP_INLINE_VISIBILITY 2495 basic_regex& operator=(const value_type* __p) 2496 {return assign(__p);} 2497 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 2498 _LIBCPP_INLINE_VISIBILITY 2499 basic_regex& operator=(initializer_list<value_type> __il) 2500 {return assign(__il);} 2501 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 2502 template <class _ST, class _SA> 2503 _LIBCPP_INLINE_VISIBILITY 2504 basic_regex& operator=(const basic_string<value_type, _ST, _SA>& __p) 2505 {return assign(__p);} 2506 2507 // assign: 2508 _LIBCPP_INLINE_VISIBILITY 2509 basic_regex& assign(const basic_regex& __that) 2510 {return *this = __that;} 2511 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 2512 _LIBCPP_INLINE_VISIBILITY 2513 basic_regex& assign(basic_regex&& __that) _NOEXCEPT 2514 {return *this = _VSTD::move(__that);} 2515 #endif 2516 _LIBCPP_INLINE_VISIBILITY 2517 basic_regex& assign(const value_type* __p, flag_type __f = regex_constants::ECMAScript) 2518 {return assign(__p, __p + __traits_.length(__p), __f);} 2519 _LIBCPP_INLINE_VISIBILITY 2520 basic_regex& assign(const value_type* __p, size_t __len, flag_type __f) 2521 {return assign(__p, __p + __len, __f);} 2522 template <class _ST, class _SA> 2523 _LIBCPP_INLINE_VISIBILITY 2524 basic_regex& assign(const basic_string<value_type, _ST, _SA>& __s, 2525 flag_type __f = regex_constants::ECMAScript) 2526 {return assign(__s.begin(), __s.end(), __f);} 2527 2528 template <class _InputIterator> 2529 _LIBCPP_INLINE_VISIBILITY 2530 typename enable_if 2531 < 2532 __is_input_iterator <_InputIterator>::value && 2533 !__is_forward_iterator<_InputIterator>::value, 2534 basic_regex& 2535 >::type 2536 assign(_InputIterator __first, _InputIterator __last, 2537 flag_type __f = regex_constants::ECMAScript) 2538 { 2539 basic_string<_CharT> __t(__first, __last); 2540 return assign(__t.begin(), __t.end(), __f); 2541 } 2542 2543 private: 2544 _LIBCPP_INLINE_VISIBILITY 2545 void __member_init(flag_type __f) 2546 { 2547 __flags_ = __f; 2548 __marked_count_ = 0; 2549 __loop_count_ = 0; 2550 __open_count_ = 0; 2551 __end_ = nullptr; 2552 } 2553 public: 2554 2555 template <class _ForwardIterator> 2556 _LIBCPP_INLINE_VISIBILITY 2557 typename enable_if 2558 < 2559 __is_forward_iterator<_ForwardIterator>::value, 2560 basic_regex& 2561 >::type 2562 assign(_ForwardIterator __first, _ForwardIterator __last, 2563 flag_type __f = regex_constants::ECMAScript) 2564 { 2565 __member_init(__f); 2566 __parse(__first, __last); 2567 return *this; 2568 } 2569 2570 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 2571 2572 _LIBCPP_INLINE_VISIBILITY 2573 basic_regex& assign(initializer_list<value_type> __il, 2574 flag_type __f = regex_constants::ECMAScript) 2575 {return assign(__il.begin(), __il.end(), __f);} 2576 2577 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 2578 2579 // const operations: 2580 _LIBCPP_INLINE_VISIBILITY 2581 unsigned mark_count() const {return __marked_count_;} 2582 _LIBCPP_INLINE_VISIBILITY 2583 flag_type flags() const {return __flags_;} 2584 2585 // locale: 2586 _LIBCPP_INLINE_VISIBILITY 2587 locale_type imbue(locale_type __loc) 2588 { 2589 __member_init(ECMAScript); 2590 __start_.reset(); 2591 return __traits_.imbue(__loc); 2592 } 2593 _LIBCPP_INLINE_VISIBILITY 2594 locale_type getloc() const {return __traits_.getloc();} 2595 2596 // swap: 2597 void swap(basic_regex& __r); 2598 2599 private: 2600 _LIBCPP_INLINE_VISIBILITY 2601 unsigned __loop_count() const {return __loop_count_;} 2602 2603 template <class _ForwardIterator> 2604 _ForwardIterator 2605 __parse(_ForwardIterator __first, _ForwardIterator __last); 2606 template <class _ForwardIterator> 2607 _ForwardIterator 2608 __parse_basic_reg_exp(_ForwardIterator __first, _ForwardIterator __last); 2609 template <class _ForwardIterator> 2610 _ForwardIterator 2611 __parse_RE_expression(_ForwardIterator __first, _ForwardIterator __last); 2612 template <class _ForwardIterator> 2613 _ForwardIterator 2614 __parse_simple_RE(_ForwardIterator __first, _ForwardIterator __last); 2615 template <class _ForwardIterator> 2616 _ForwardIterator 2617 __parse_nondupl_RE(_ForwardIterator __first, _ForwardIterator __last); 2618 template <class _ForwardIterator> 2619 _ForwardIterator 2620 __parse_one_char_or_coll_elem_RE(_ForwardIterator __first, _ForwardIterator __last); 2621 template <class _ForwardIterator> 2622 _ForwardIterator 2623 __parse_Back_open_paren(_ForwardIterator __first, _ForwardIterator __last); 2624 template <class _ForwardIterator> 2625 _ForwardIterator 2626 __parse_Back_close_paren(_ForwardIterator __first, _ForwardIterator __last); 2627 template <class _ForwardIterator> 2628 _ForwardIterator 2629 __parse_Back_open_brace(_ForwardIterator __first, _ForwardIterator __last); 2630 template <class _ForwardIterator> 2631 _ForwardIterator 2632 __parse_Back_close_brace(_ForwardIterator __first, _ForwardIterator __last); 2633 template <class _ForwardIterator> 2634 _ForwardIterator 2635 __parse_BACKREF(_ForwardIterator __first, _ForwardIterator __last); 2636 template <class _ForwardIterator> 2637 _ForwardIterator 2638 __parse_ORD_CHAR(_ForwardIterator __first, _ForwardIterator __last); 2639 template <class _ForwardIterator> 2640 _ForwardIterator 2641 __parse_QUOTED_CHAR(_ForwardIterator __first, _ForwardIterator __last); 2642 template <class _ForwardIterator> 2643 _ForwardIterator 2644 __parse_RE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last, 2645 __owns_one_state<_CharT>* __s, 2646 unsigned __mexp_begin, unsigned __mexp_end); 2647 template <class _ForwardIterator> 2648 _ForwardIterator 2649 __parse_ERE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last, 2650 __owns_one_state<_CharT>* __s, 2651 unsigned __mexp_begin, unsigned __mexp_end); 2652 template <class _ForwardIterator> 2653 _ForwardIterator 2654 __parse_bracket_expression(_ForwardIterator __first, _ForwardIterator __last); 2655 template <class _ForwardIterator> 2656 _ForwardIterator 2657 __parse_follow_list(_ForwardIterator __first, _ForwardIterator __last, 2658 __bracket_expression<_CharT, _Traits>* __ml); 2659 template <class _ForwardIterator> 2660 _ForwardIterator 2661 __parse_expression_term(_ForwardIterator __first, _ForwardIterator __last, 2662 __bracket_expression<_CharT, _Traits>* __ml); 2663 template <class _ForwardIterator> 2664 _ForwardIterator 2665 __parse_equivalence_class(_ForwardIterator __first, _ForwardIterator __last, 2666 __bracket_expression<_CharT, _Traits>* __ml); 2667 template <class _ForwardIterator> 2668 _ForwardIterator 2669 __parse_character_class(_ForwardIterator __first, _ForwardIterator __last, 2670 __bracket_expression<_CharT, _Traits>* __ml); 2671 template <class _ForwardIterator> 2672 _ForwardIterator 2673 __parse_collating_symbol(_ForwardIterator __first, _ForwardIterator __last, 2674 basic_string<_CharT>& __col_sym); 2675 template <class _ForwardIterator> 2676 _ForwardIterator 2677 __parse_DUP_COUNT(_ForwardIterator __first, _ForwardIterator __last, int& __c); 2678 template <class _ForwardIterator> 2679 _ForwardIterator 2680 __parse_extended_reg_exp(_ForwardIterator __first, _ForwardIterator __last); 2681 template <class _ForwardIterator> 2682 _ForwardIterator 2683 __parse_ERE_branch(_ForwardIterator __first, _ForwardIterator __last); 2684 template <class _ForwardIterator> 2685 _ForwardIterator 2686 __parse_ERE_expression(_ForwardIterator __first, _ForwardIterator __last); 2687 template <class _ForwardIterator> 2688 _ForwardIterator 2689 __parse_one_char_or_coll_elem_ERE(_ForwardIterator __first, _ForwardIterator __last); 2690 template <class _ForwardIterator> 2691 _ForwardIterator 2692 __parse_ORD_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last); 2693 template <class _ForwardIterator> 2694 _ForwardIterator 2695 __parse_QUOTED_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last); 2696 template <class _ForwardIterator> 2697 _ForwardIterator 2698 __parse_ecma_exp(_ForwardIterator __first, _ForwardIterator __last); 2699 template <class _ForwardIterator> 2700 _ForwardIterator 2701 __parse_alternative(_ForwardIterator __first, _ForwardIterator __last); 2702 template <class _ForwardIterator> 2703 _ForwardIterator 2704 __parse_term(_ForwardIterator __first, _ForwardIterator __last); 2705 template <class _ForwardIterator> 2706 _ForwardIterator 2707 __parse_assertion(_ForwardIterator __first, _ForwardIterator __last); 2708 template <class _ForwardIterator> 2709 _ForwardIterator 2710 __parse_atom(_ForwardIterator __first, _ForwardIterator __last); 2711 template <class _ForwardIterator> 2712 _ForwardIterator 2713 __parse_atom_escape(_ForwardIterator __first, _ForwardIterator __last); 2714 template <class _ForwardIterator> 2715 _ForwardIterator 2716 __parse_decimal_escape(_ForwardIterator __first, _ForwardIterator __last); 2717 template <class _ForwardIterator> 2718 _ForwardIterator 2719 __parse_character_class_escape(_ForwardIterator __first, _ForwardIterator __last); 2720 template <class _ForwardIterator> 2721 _ForwardIterator 2722 __parse_character_escape(_ForwardIterator __first, _ForwardIterator __last, 2723 basic_string<_CharT>* __str = nullptr); 2724 template <class _ForwardIterator> 2725 _ForwardIterator 2726 __parse_pattern_character(_ForwardIterator __first, _ForwardIterator __last); 2727 template <class _ForwardIterator> 2728 _ForwardIterator 2729 __parse_grep(_ForwardIterator __first, _ForwardIterator __last); 2730 template <class _ForwardIterator> 2731 _ForwardIterator 2732 __parse_egrep(_ForwardIterator __first, _ForwardIterator __last); 2733 template <class _ForwardIterator> 2734 _ForwardIterator 2735 __parse_class_escape(_ForwardIterator __first, _ForwardIterator __last, 2736 basic_string<_CharT>& __str, 2737 __bracket_expression<_CharT, _Traits>* __ml); 2738 template <class _ForwardIterator> 2739 _ForwardIterator 2740 __parse_awk_escape(_ForwardIterator __first, _ForwardIterator __last, 2741 basic_string<_CharT>* __str = nullptr); 2742 2743 _LIBCPP_INLINE_VISIBILITY 2744 void __push_l_anchor(); 2745 void __push_r_anchor(); 2746 void __push_match_any(); 2747 void __push_match_any_but_newline(); 2748 _LIBCPP_INLINE_VISIBILITY 2749 void __push_greedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s, 2750 unsigned __mexp_begin = 0, unsigned __mexp_end = 0) 2751 {__push_loop(__min, numeric_limits<size_t>::max(), __s, 2752 __mexp_begin, __mexp_end);} 2753 _LIBCPP_INLINE_VISIBILITY 2754 void __push_nongreedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s, 2755 unsigned __mexp_begin = 0, unsigned __mexp_end = 0) 2756 {__push_loop(__min, numeric_limits<size_t>::max(), __s, 2757 __mexp_begin, __mexp_end, false);} 2758 void __push_loop(size_t __min, size_t __max, __owns_one_state<_CharT>* __s, 2759 size_t __mexp_begin = 0, size_t __mexp_end = 0, 2760 bool __greedy = true); 2761 __bracket_expression<_CharT, _Traits>* __start_matching_list(bool __negate); 2762 void __push_char(value_type __c); 2763 void __push_back_ref(int __i); 2764 void __push_alternation(__owns_one_state<_CharT>* __sa, 2765 __owns_one_state<_CharT>* __sb); 2766 void __push_begin_marked_subexpression(); 2767 void __push_end_marked_subexpression(unsigned); 2768 void __push_empty(); 2769 void __push_word_boundary(bool); 2770 void __push_lookahead(const basic_regex&, bool); 2771 2772 template <class _Allocator> 2773 bool 2774 __search(const _CharT* __first, const _CharT* __last, 2775 match_results<const _CharT*, _Allocator>& __m, 2776 regex_constants::match_flag_type __flags) const; 2777 2778 template <class _Allocator> 2779 bool 2780 __match_at_start(const _CharT* __first, const _CharT* __last, 2781 match_results<const _CharT*, _Allocator>& __m, 2782 regex_constants::match_flag_type __flags, bool) const; 2783 template <class _Allocator> 2784 bool 2785 __match_at_start_ecma(const _CharT* __first, const _CharT* __last, 2786 match_results<const _CharT*, _Allocator>& __m, 2787 regex_constants::match_flag_type __flags, bool) const; 2788 template <class _Allocator> 2789 bool 2790 __match_at_start_posix_nosubs(const _CharT* __first, const _CharT* __last, 2791 match_results<const _CharT*, _Allocator>& __m, 2792 regex_constants::match_flag_type __flags, bool) const; 2793 template <class _Allocator> 2794 bool 2795 __match_at_start_posix_subs(const _CharT* __first, const _CharT* __last, 2796 match_results<const _CharT*, _Allocator>& __m, 2797 regex_constants::match_flag_type __flags, bool) const; 2798 2799 template <class _Bp, class _Ap, class _Cp, class _Tp> 2800 friend 2801 bool 2802 regex_search(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&, 2803 regex_constants::match_flag_type); 2804 2805 template <class _Ap, class _Cp, class _Tp> 2806 friend 2807 bool 2808 regex_search(const _Cp*, const _Cp*, match_results<const _Cp*, _Ap>&, 2809 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type); 2810 2811 template <class _Bp, class _Cp, class _Tp> 2812 friend 2813 bool 2814 regex_search(_Bp, _Bp, const basic_regex<_Cp, _Tp>&, 2815 regex_constants::match_flag_type); 2816 2817 template <class _Cp, class _Tp> 2818 friend 2819 bool 2820 regex_search(const _Cp*, const _Cp*, 2821 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type); 2822 2823 template <class _Cp, class _Ap, class _Tp> 2824 friend 2825 bool 2826 regex_search(const _Cp*, match_results<const _Cp*, _Ap>&, const basic_regex<_Cp, _Tp>&, 2827 regex_constants::match_flag_type); 2828 2829 template <class _ST, class _SA, class _Cp, class _Tp> 2830 friend 2831 bool 2832 regex_search(const basic_string<_Cp, _ST, _SA>& __s, 2833 const basic_regex<_Cp, _Tp>& __e, 2834 regex_constants::match_flag_type __flags); 2835 2836 template <class _ST, class _SA, class _Ap, class _Cp, class _Tp> 2837 friend 2838 bool 2839 regex_search(const basic_string<_Cp, _ST, _SA>& __s, 2840 match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&, 2841 const basic_regex<_Cp, _Tp>& __e, 2842 regex_constants::match_flag_type __flags); 2843 2844 template <class, class> friend class __lookahead; 2845 }; 2846 2847 template <class _CharT, class _Traits> 2848 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::icase; 2849 template <class _CharT, class _Traits> 2850 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::nosubs; 2851 template <class _CharT, class _Traits> 2852 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::optimize; 2853 template <class _CharT, class _Traits> 2854 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::collate; 2855 template <class _CharT, class _Traits> 2856 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::ECMAScript; 2857 template <class _CharT, class _Traits> 2858 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::basic; 2859 template <class _CharT, class _Traits> 2860 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::extended; 2861 template <class _CharT, class _Traits> 2862 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::awk; 2863 template <class _CharT, class _Traits> 2864 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::grep; 2865 template <class _CharT, class _Traits> 2866 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::egrep; 2867 2868 template <class _CharT, class _Traits> 2869 void 2870 basic_regex<_CharT, _Traits>::swap(basic_regex& __r) 2871 { 2872 using _VSTD::swap; 2873 swap(__traits_, __r.__traits_); 2874 swap(__flags_, __r.__flags_); 2875 swap(__marked_count_, __r.__marked_count_); 2876 swap(__loop_count_, __r.__loop_count_); 2877 swap(__open_count_, __r.__open_count_); 2878 swap(__start_, __r.__start_); 2879 swap(__end_, __r.__end_); 2880 } 2881 2882 template <class _CharT, class _Traits> 2883 inline _LIBCPP_INLINE_VISIBILITY 2884 void 2885 swap(basic_regex<_CharT, _Traits>& __x, basic_regex<_CharT, _Traits>& __y) 2886 { 2887 return __x.swap(__y); 2888 } 2889 2890 // __lookahead 2891 2892 template <class _CharT, class _Traits> 2893 class __lookahead 2894 : public __owns_one_state<_CharT> 2895 { 2896 typedef __owns_one_state<_CharT> base; 2897 2898 basic_regex<_CharT, _Traits> __exp_; 2899 bool __invert_; 2900 2901 __lookahead(const __lookahead&); 2902 __lookahead& operator=(const __lookahead&); 2903 public: 2904 typedef _VSTD::__state<_CharT> __state; 2905 2906 _LIBCPP_INLINE_VISIBILITY 2907 __lookahead(const basic_regex<_CharT, _Traits>& __exp, bool __invert, __node<_CharT>* __s) 2908 : base(__s), __exp_(__exp), __invert_(__invert) {} 2909 2910 virtual void __exec(__state&) const; 2911 }; 2912 2913 template <class _CharT, class _Traits> 2914 void 2915 __lookahead<_CharT, _Traits>::__exec(__state& __s) const 2916 { 2917 match_results<const _CharT*> __m; 2918 __m.__init(1 + __exp_.mark_count(), __s.__current_, __s.__last_); 2919 bool __matched = __exp_.__match_at_start_ecma(__s.__current_, __s.__last_, 2920 __m, 2921 __s.__flags_ | regex_constants::match_continuous, 2922 true); 2923 if (__matched != __invert_) 2924 { 2925 __s.__do_ = __state::__accept_but_not_consume; 2926 __s.__node_ = this->first(); 2927 } 2928 else 2929 { 2930 __s.__do_ = __state::__reject; 2931 __s.__node_ = nullptr; 2932 } 2933 } 2934 2935 template <class _CharT, class _Traits> 2936 template <class _ForwardIterator> 2937 _ForwardIterator 2938 basic_regex<_CharT, _Traits>::__parse(_ForwardIterator __first, 2939 _ForwardIterator __last) 2940 { 2941 { 2942 unique_ptr<__node> __h(new __end_state<_CharT>); 2943 __start_.reset(new __empty_state<_CharT>(__h.get())); 2944 __h.release(); 2945 __end_ = __start_.get(); 2946 } 2947 switch (__flags_ & 0x1F0) 2948 { 2949 case ECMAScript: 2950 __first = __parse_ecma_exp(__first, __last); 2951 break; 2952 case basic: 2953 __first = __parse_basic_reg_exp(__first, __last); 2954 break; 2955 case extended: 2956 case awk: 2957 __first = __parse_extended_reg_exp(__first, __last); 2958 break; 2959 case grep: 2960 __first = __parse_grep(__first, __last); 2961 break; 2962 case egrep: 2963 __first = __parse_egrep(__first, __last); 2964 break; 2965 #ifndef _LIBCPP_NO_EXCEPTIONS 2966 default: 2967 throw regex_error(regex_constants::__re_err_grammar); 2968 #endif // _LIBCPP_NO_EXCEPTIONS 2969 } 2970 return __first; 2971 } 2972 2973 template <class _CharT, class _Traits> 2974 template <class _ForwardIterator> 2975 _ForwardIterator 2976 basic_regex<_CharT, _Traits>::__parse_basic_reg_exp(_ForwardIterator __first, 2977 _ForwardIterator __last) 2978 { 2979 if (__first != __last) 2980 { 2981 if (*__first == '^') 2982 { 2983 __push_l_anchor(); 2984 ++__first; 2985 } 2986 if (__first != __last) 2987 { 2988 __first = __parse_RE_expression(__first, __last); 2989 if (__first != __last) 2990 { 2991 _ForwardIterator __temp = _VSTD::next(__first); 2992 if (__temp == __last && *__first == '$') 2993 { 2994 __push_r_anchor(); 2995 ++__first; 2996 } 2997 } 2998 } 2999 #ifndef _LIBCPP_NO_EXCEPTIONS 3000 if (__first != __last) 3001 throw regex_error(regex_constants::__re_err_empty); 3002 #endif // _LIBCPP_NO_EXCEPTIONS 3003 } 3004 return __first; 3005 } 3006 3007 template <class _CharT, class _Traits> 3008 template <class _ForwardIterator> 3009 _ForwardIterator 3010 basic_regex<_CharT, _Traits>::__parse_extended_reg_exp(_ForwardIterator __first, 3011 _ForwardIterator __last) 3012 { 3013 __owns_one_state<_CharT>* __sa = __end_; 3014 _ForwardIterator __temp = __parse_ERE_branch(__first, __last); 3015 #ifndef _LIBCPP_NO_EXCEPTIONS 3016 if (__temp == __first) 3017 throw regex_error(regex_constants::__re_err_empty); 3018 #endif // _LIBCPP_NO_EXCEPTIONS 3019 __first = __temp; 3020 while (__first != __last && *__first == '|') 3021 { 3022 __owns_one_state<_CharT>* __sb = __end_; 3023 __temp = __parse_ERE_branch(++__first, __last); 3024 #ifndef _LIBCPP_NO_EXCEPTIONS 3025 if (__temp == __first) 3026 throw regex_error(regex_constants::__re_err_empty); 3027 #endif // _LIBCPP_NO_EXCEPTIONS 3028 __push_alternation(__sa, __sb); 3029 __first = __temp; 3030 } 3031 return __first; 3032 } 3033 3034 template <class _CharT, class _Traits> 3035 template <class _ForwardIterator> 3036 _ForwardIterator 3037 basic_regex<_CharT, _Traits>::__parse_ERE_branch(_ForwardIterator __first, 3038 _ForwardIterator __last) 3039 { 3040 _ForwardIterator __temp = __parse_ERE_expression(__first, __last); 3041 #ifndef _LIBCPP_NO_EXCEPTIONS 3042 if (__temp == __first) 3043 throw regex_error(regex_constants::__re_err_empty); 3044 #endif // _LIBCPP_NO_EXCEPTIONS 3045 do 3046 { 3047 __first = __temp; 3048 __temp = __parse_ERE_expression(__first, __last); 3049 } while (__temp != __first); 3050 return __first; 3051 } 3052 3053 template <class _CharT, class _Traits> 3054 template <class _ForwardIterator> 3055 _ForwardIterator 3056 basic_regex<_CharT, _Traits>::__parse_ERE_expression(_ForwardIterator __first, 3057 _ForwardIterator __last) 3058 { 3059 __owns_one_state<_CharT>* __e = __end_; 3060 unsigned __mexp_begin = __marked_count_; 3061 _ForwardIterator __temp = __parse_one_char_or_coll_elem_ERE(__first, __last); 3062 if (__temp == __first && __temp != __last) 3063 { 3064 switch (*__temp) 3065 { 3066 case '^': 3067 __push_l_anchor(); 3068 ++__temp; 3069 break; 3070 case '$': 3071 __push_r_anchor(); 3072 ++__temp; 3073 break; 3074 case '(': 3075 __push_begin_marked_subexpression(); 3076 unsigned __temp_count = __marked_count_; 3077 ++__open_count_; 3078 __temp = __parse_extended_reg_exp(++__temp, __last); 3079 #ifndef _LIBCPP_NO_EXCEPTIONS 3080 if (__temp == __last || *__temp != ')') 3081 throw regex_error(regex_constants::error_paren); 3082 #endif // _LIBCPP_NO_EXCEPTIONS 3083 __push_end_marked_subexpression(__temp_count); 3084 --__open_count_; 3085 ++__temp; 3086 break; 3087 } 3088 } 3089 if (__temp != __first) 3090 __temp = __parse_ERE_dupl_symbol(__temp, __last, __e, __mexp_begin+1, 3091 __marked_count_+1); 3092 __first = __temp; 3093 return __first; 3094 } 3095 3096 template <class _CharT, class _Traits> 3097 template <class _ForwardIterator> 3098 _ForwardIterator 3099 basic_regex<_CharT, _Traits>::__parse_RE_expression(_ForwardIterator __first, 3100 _ForwardIterator __last) 3101 { 3102 while (true) 3103 { 3104 _ForwardIterator __temp = __parse_simple_RE(__first, __last); 3105 if (__temp == __first) 3106 break; 3107 __first = __temp; 3108 } 3109 return __first; 3110 } 3111 3112 template <class _CharT, class _Traits> 3113 template <class _ForwardIterator> 3114 _ForwardIterator 3115 basic_regex<_CharT, _Traits>::__parse_simple_RE(_ForwardIterator __first, 3116 _ForwardIterator __last) 3117 { 3118 if (__first != __last) 3119 { 3120 __owns_one_state<_CharT>* __e = __end_; 3121 unsigned __mexp_begin = __marked_count_; 3122 _ForwardIterator __temp = __parse_nondupl_RE(__first, __last); 3123 if (__temp != __first) 3124 __first = __parse_RE_dupl_symbol(__temp, __last, __e, 3125 __mexp_begin+1, __marked_count_+1); 3126 } 3127 return __first; 3128 } 3129 3130 template <class _CharT, class _Traits> 3131 template <class _ForwardIterator> 3132 _ForwardIterator 3133 basic_regex<_CharT, _Traits>::__parse_nondupl_RE(_ForwardIterator __first, 3134 _ForwardIterator __last) 3135 { 3136 _ForwardIterator __temp = __first; 3137 __first = __parse_one_char_or_coll_elem_RE(__first, __last); 3138 if (__temp == __first) 3139 { 3140 __temp = __parse_Back_open_paren(__first, __last); 3141 if (__temp != __first) 3142 { 3143 __push_begin_marked_subexpression(); 3144 unsigned __temp_count = __marked_count_; 3145 __first = __parse_RE_expression(__temp, __last); 3146 __temp = __parse_Back_close_paren(__first, __last); 3147 #ifndef _LIBCPP_NO_EXCEPTIONS 3148 if (__temp == __first) 3149 throw regex_error(regex_constants::error_paren); 3150 #endif // _LIBCPP_NO_EXCEPTIONS 3151 __push_end_marked_subexpression(__temp_count); 3152 __first = __temp; 3153 } 3154 else 3155 __first = __parse_BACKREF(__first, __last); 3156 } 3157 return __first; 3158 } 3159 3160 template <class _CharT, class _Traits> 3161 template <class _ForwardIterator> 3162 _ForwardIterator 3163 basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_RE( 3164 _ForwardIterator __first, 3165 _ForwardIterator __last) 3166 { 3167 _ForwardIterator __temp = __parse_ORD_CHAR(__first, __last); 3168 if (__temp == __first) 3169 { 3170 __temp = __parse_QUOTED_CHAR(__first, __last); 3171 if (__temp == __first) 3172 { 3173 if (__temp != __last && *__temp == '.') 3174 { 3175 __push_match_any(); 3176 ++__temp; 3177 } 3178 else 3179 __temp = __parse_bracket_expression(__first, __last); 3180 } 3181 } 3182 __first = __temp; 3183 return __first; 3184 } 3185 3186 template <class _CharT, class _Traits> 3187 template <class _ForwardIterator> 3188 _ForwardIterator 3189 basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_ERE( 3190 _ForwardIterator __first, 3191 _ForwardIterator __last) 3192 { 3193 _ForwardIterator __temp = __parse_ORD_CHAR_ERE(__first, __last); 3194 if (__temp == __first) 3195 { 3196 __temp = __parse_QUOTED_CHAR_ERE(__first, __last); 3197 if (__temp == __first) 3198 { 3199 if (__temp != __last && *__temp == '.') 3200 { 3201 __push_match_any(); 3202 ++__temp; 3203 } 3204 else 3205 __temp = __parse_bracket_expression(__first, __last); 3206 } 3207 } 3208 __first = __temp; 3209 return __first; 3210 } 3211 3212 template <class _CharT, class _Traits> 3213 template <class _ForwardIterator> 3214 _ForwardIterator 3215 basic_regex<_CharT, _Traits>::__parse_Back_open_paren(_ForwardIterator __first, 3216 _ForwardIterator __last) 3217 { 3218 if (__first != __last) 3219 { 3220 _ForwardIterator __temp = _VSTD::next(__first); 3221 if (__temp != __last) 3222 { 3223 if (*__first == '\\' && *__temp == '(') 3224 __first = ++__temp; 3225 } 3226 } 3227 return __first; 3228 } 3229 3230 template <class _CharT, class _Traits> 3231 template <class _ForwardIterator> 3232 _ForwardIterator 3233 basic_regex<_CharT, _Traits>::__parse_Back_close_paren(_ForwardIterator __first, 3234 _ForwardIterator __last) 3235 { 3236 if (__first != __last) 3237 { 3238 _ForwardIterator __temp = _VSTD::next(__first); 3239 if (__temp != __last) 3240 { 3241 if (*__first == '\\' && *__temp == ')') 3242 __first = ++__temp; 3243 } 3244 } 3245 return __first; 3246 } 3247 3248 template <class _CharT, class _Traits> 3249 template <class _ForwardIterator> 3250 _ForwardIterator 3251 basic_regex<_CharT, _Traits>::__parse_Back_open_brace(_ForwardIterator __first, 3252 _ForwardIterator __last) 3253 { 3254 if (__first != __last) 3255 { 3256 _ForwardIterator __temp = _VSTD::next(__first); 3257 if (__temp != __last) 3258 { 3259 if (*__first == '\\' && *__temp == '{') 3260 __first = ++__temp; 3261 } 3262 } 3263 return __first; 3264 } 3265 3266 template <class _CharT, class _Traits> 3267 template <class _ForwardIterator> 3268 _ForwardIterator 3269 basic_regex<_CharT, _Traits>::__parse_Back_close_brace(_ForwardIterator __first, 3270 _ForwardIterator __last) 3271 { 3272 if (__first != __last) 3273 { 3274 _ForwardIterator __temp = _VSTD::next(__first); 3275 if (__temp != __last) 3276 { 3277 if (*__first == '\\' && *__temp == '}') 3278 __first = ++__temp; 3279 } 3280 } 3281 return __first; 3282 } 3283 3284 template <class _CharT, class _Traits> 3285 template <class _ForwardIterator> 3286 _ForwardIterator 3287 basic_regex<_CharT, _Traits>::__parse_BACKREF(_ForwardIterator __first, 3288 _ForwardIterator __last) 3289 { 3290 if (__first != __last) 3291 { 3292 _ForwardIterator __temp = _VSTD::next(__first); 3293 if (__temp != __last) 3294 { 3295 if (*__first == '\\' && '1' <= *__temp && *__temp <= '9') 3296 { 3297 __push_back_ref(*__temp - '0'); 3298 __first = ++__temp; 3299 } 3300 } 3301 } 3302 return __first; 3303 } 3304 3305 template <class _CharT, class _Traits> 3306 template <class _ForwardIterator> 3307 _ForwardIterator 3308 basic_regex<_CharT, _Traits>::__parse_ORD_CHAR(_ForwardIterator __first, 3309 _ForwardIterator __last) 3310 { 3311 if (__first != __last) 3312 { 3313 _ForwardIterator __temp = _VSTD::next(__first); 3314 if (__temp == __last && *__first == '$') 3315 return __first; 3316 // Not called inside a bracket 3317 if (*__first == '.' || *__first == '\\' || *__first == '[') 3318 return __first; 3319 __push_char(*__first); 3320 ++__first; 3321 } 3322 return __first; 3323 } 3324 3325 template <class _CharT, class _Traits> 3326 template <class _ForwardIterator> 3327 _ForwardIterator 3328 basic_regex<_CharT, _Traits>::__parse_ORD_CHAR_ERE(_ForwardIterator __first, 3329 _ForwardIterator __last) 3330 { 3331 if (__first != __last) 3332 { 3333 switch (*__first) 3334 { 3335 case '^': 3336 case '.': 3337 case '[': 3338 case '$': 3339 case '(': 3340 case '|': 3341 case '*': 3342 case '+': 3343 case '?': 3344 case '{': 3345 case '\\': 3346 break; 3347 case ')': 3348 if (__open_count_ == 0) 3349 { 3350 __push_char(*__first); 3351 ++__first; 3352 } 3353 break; 3354 default: 3355 __push_char(*__first); 3356 ++__first; 3357 break; 3358 } 3359 } 3360 return __first; 3361 } 3362 3363 template <class _CharT, class _Traits> 3364 template <class _ForwardIterator> 3365 _ForwardIterator 3366 basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR(_ForwardIterator __first, 3367 _ForwardIterator __last) 3368 { 3369 if (__first != __last) 3370 { 3371 _ForwardIterator __temp = _VSTD::next(__first); 3372 if (__temp != __last) 3373 { 3374 if (*__first == '\\') 3375 { 3376 switch (*__temp) 3377 { 3378 case '^': 3379 case '.': 3380 case '*': 3381 case '[': 3382 case '$': 3383 case '\\': 3384 __push_char(*__temp); 3385 __first = ++__temp; 3386 break; 3387 } 3388 } 3389 } 3390 } 3391 return __first; 3392 } 3393 3394 template <class _CharT, class _Traits> 3395 template <class _ForwardIterator> 3396 _ForwardIterator 3397 basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR_ERE(_ForwardIterator __first, 3398 _ForwardIterator __last) 3399 { 3400 if (__first != __last) 3401 { 3402 _ForwardIterator __temp = _VSTD::next(__first); 3403 if (__temp != __last) 3404 { 3405 if (*__first == '\\') 3406 { 3407 switch (*__temp) 3408 { 3409 case '^': 3410 case '.': 3411 case '*': 3412 case '[': 3413 case '$': 3414 case '\\': 3415 case '(': 3416 case ')': 3417 case '|': 3418 case '+': 3419 case '?': 3420 case '{': 3421 __push_char(*__temp); 3422 __first = ++__temp; 3423 break; 3424 default: 3425 if ((__flags_ & 0x1F0) == awk) 3426 __first = __parse_awk_escape(++__first, __last); 3427 break; 3428 } 3429 } 3430 } 3431 } 3432 return __first; 3433 } 3434 3435 template <class _CharT, class _Traits> 3436 template <class _ForwardIterator> 3437 _ForwardIterator 3438 basic_regex<_CharT, _Traits>::__parse_RE_dupl_symbol(_ForwardIterator __first, 3439 _ForwardIterator __last, 3440 __owns_one_state<_CharT>* __s, 3441 unsigned __mexp_begin, 3442 unsigned __mexp_end) 3443 { 3444 if (__first != __last) 3445 { 3446 if (*__first == '*') 3447 { 3448 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end); 3449 ++__first; 3450 } 3451 else 3452 { 3453 _ForwardIterator __temp = __parse_Back_open_brace(__first, __last); 3454 if (__temp != __first) 3455 { 3456 int __min = 0; 3457 __first = __temp; 3458 __temp = __parse_DUP_COUNT(__first, __last, __min); 3459 #ifndef _LIBCPP_NO_EXCEPTIONS 3460 if (__temp == __first) 3461 throw regex_error(regex_constants::error_badbrace); 3462 #endif // _LIBCPP_NO_EXCEPTIONS 3463 __first = __temp; 3464 #ifndef _LIBCPP_NO_EXCEPTIONS 3465 if (__first == __last) 3466 throw regex_error(regex_constants::error_brace); 3467 #endif // _LIBCPP_NO_EXCEPTIONS 3468 if (*__first != ',') 3469 { 3470 __temp = __parse_Back_close_brace(__first, __last); 3471 #ifndef _LIBCPP_NO_EXCEPTIONS 3472 if (__temp == __first) 3473 throw regex_error(regex_constants::error_brace); 3474 #endif // _LIBCPP_NO_EXCEPTIONS 3475 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end, 3476 true); 3477 __first = __temp; 3478 } 3479 else 3480 { 3481 ++__first; // consume ',' 3482 int __max = -1; 3483 __first = __parse_DUP_COUNT(__first, __last, __max); 3484 __temp = __parse_Back_close_brace(__first, __last); 3485 #ifndef _LIBCPP_NO_EXCEPTIONS 3486 if (__temp == __first) 3487 throw regex_error(regex_constants::error_brace); 3488 #endif // _LIBCPP_NO_EXCEPTIONS 3489 if (__max == -1) 3490 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end); 3491 else 3492 { 3493 #ifndef _LIBCPP_NO_EXCEPTIONS 3494 if (__max < __min) 3495 throw regex_error(regex_constants::error_badbrace); 3496 #endif // _LIBCPP_NO_EXCEPTIONS 3497 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end, 3498 true); 3499 } 3500 __first = __temp; 3501 } 3502 } 3503 } 3504 } 3505 return __first; 3506 } 3507 3508 template <class _CharT, class _Traits> 3509 template <class _ForwardIterator> 3510 _ForwardIterator 3511 basic_regex<_CharT, _Traits>::__parse_ERE_dupl_symbol(_ForwardIterator __first, 3512 _ForwardIterator __last, 3513 __owns_one_state<_CharT>* __s, 3514 unsigned __mexp_begin, 3515 unsigned __mexp_end) 3516 { 3517 if (__first != __last) 3518 { 3519 unsigned __grammar = __flags_ & 0x1F0; 3520 switch (*__first) 3521 { 3522 case '*': 3523 ++__first; 3524 if (__grammar == ECMAScript && __first != __last && *__first == '?') 3525 { 3526 ++__first; 3527 __push_nongreedy_inf_repeat(0, __s, __mexp_begin, __mexp_end); 3528 } 3529 else 3530 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end); 3531 break; 3532 case '+': 3533 ++__first; 3534 if (__grammar == ECMAScript && __first != __last && *__first == '?') 3535 { 3536 ++__first; 3537 __push_nongreedy_inf_repeat(1, __s, __mexp_begin, __mexp_end); 3538 } 3539 else 3540 __push_greedy_inf_repeat(1, __s, __mexp_begin, __mexp_end); 3541 break; 3542 case '?': 3543 ++__first; 3544 if (__grammar == ECMAScript && __first != __last && *__first == '?') 3545 { 3546 ++__first; 3547 __push_loop(0, 1, __s, __mexp_begin, __mexp_end, false); 3548 } 3549 else 3550 __push_loop(0, 1, __s, __mexp_begin, __mexp_end); 3551 break; 3552 case '{': 3553 { 3554 int __min; 3555 _ForwardIterator __temp = __parse_DUP_COUNT(++__first, __last, __min); 3556 #ifndef _LIBCPP_NO_EXCEPTIONS 3557 if (__temp == __first) 3558 throw regex_error(regex_constants::error_badbrace); 3559 #endif // _LIBCPP_NO_EXCEPTIONS 3560 __first = __temp; 3561 #ifndef _LIBCPP_NO_EXCEPTIONS 3562 if (__first == __last) 3563 throw regex_error(regex_constants::error_brace); 3564 #endif // _LIBCPP_NO_EXCEPTIONS 3565 switch (*__first) 3566 { 3567 case '}': 3568 ++__first; 3569 if (__grammar == ECMAScript && __first != __last && *__first == '?') 3570 { 3571 ++__first; 3572 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end, false); 3573 } 3574 else 3575 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end); 3576 break; 3577 case ',': 3578 ++__first; 3579 #ifndef _LIBCPP_NO_EXCEPTIONS 3580 if (__first == __last) 3581 throw regex_error(regex_constants::error_badbrace); 3582 #endif // _LIBCPP_NO_EXCEPTIONS 3583 if (*__first == '}') 3584 { 3585 ++__first; 3586 if (__grammar == ECMAScript && __first != __last && *__first == '?') 3587 { 3588 ++__first; 3589 __push_nongreedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end); 3590 } 3591 else 3592 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end); 3593 } 3594 else 3595 { 3596 int __max = -1; 3597 __temp = __parse_DUP_COUNT(__first, __last, __max); 3598 #ifndef _LIBCPP_NO_EXCEPTIONS 3599 if (__temp == __first) 3600 throw regex_error(regex_constants::error_brace); 3601 #endif // _LIBCPP_NO_EXCEPTIONS 3602 __first = __temp; 3603 #ifndef _LIBCPP_NO_EXCEPTIONS 3604 if (__first == __last || *__first != '}') 3605 throw regex_error(regex_constants::error_brace); 3606 #endif // _LIBCPP_NO_EXCEPTIONS 3607 ++__first; 3608 #ifndef _LIBCPP_NO_EXCEPTIONS 3609 if (__max < __min) 3610 throw regex_error(regex_constants::error_badbrace); 3611 #endif // _LIBCPP_NO_EXCEPTIONS 3612 if (__grammar == ECMAScript && __first != __last && *__first == '?') 3613 { 3614 ++__first; 3615 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end, false); 3616 } 3617 else 3618 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end); 3619 } 3620 break; 3621 #ifndef _LIBCPP_NO_EXCEPTIONS 3622 default: 3623 throw regex_error(regex_constants::error_badbrace); 3624 #endif // _LIBCPP_NO_EXCEPTIONS 3625 } 3626 } 3627 break; 3628 } 3629 } 3630 return __first; 3631 } 3632 3633 template <class _CharT, class _Traits> 3634 template <class _ForwardIterator> 3635 _ForwardIterator 3636 basic_regex<_CharT, _Traits>::__parse_bracket_expression(_ForwardIterator __first, 3637 _ForwardIterator __last) 3638 { 3639 if (__first != __last && *__first == '[') 3640 { 3641 ++__first; 3642 #ifndef _LIBCPP_NO_EXCEPTIONS 3643 if (__first == __last) 3644 throw regex_error(regex_constants::error_brack); 3645 #endif // _LIBCPP_NO_EXCEPTIONS 3646 bool __negate = false; 3647 if (*__first == '^') 3648 { 3649 ++__first; 3650 __negate = true; 3651 } 3652 __bracket_expression<_CharT, _Traits>* __ml = __start_matching_list(__negate); 3653 // __ml owned by *this 3654 #ifndef _LIBCPP_NO_EXCEPTIONS 3655 if (__first == __last) 3656 throw regex_error(regex_constants::error_brack); 3657 #endif // _LIBCPP_NO_EXCEPTIONS 3658 if ((__flags_ & 0x1F0) != ECMAScript && *__first == ']') 3659 { 3660 __ml->__add_char(']'); 3661 ++__first; 3662 } 3663 __first = __parse_follow_list(__first, __last, __ml); 3664 #ifndef _LIBCPP_NO_EXCEPTIONS 3665 if (__first == __last) 3666 throw regex_error(regex_constants::error_brack); 3667 #endif // _LIBCPP_NO_EXCEPTIONS 3668 if (*__first == '-') 3669 { 3670 __ml->__add_char('-'); 3671 ++__first; 3672 } 3673 #ifndef _LIBCPP_NO_EXCEPTIONS 3674 if (__first == __last || *__first != ']') 3675 throw regex_error(regex_constants::error_brack); 3676 #endif // _LIBCPP_NO_EXCEPTIONS 3677 ++__first; 3678 } 3679 return __first; 3680 } 3681 3682 template <class _CharT, class _Traits> 3683 template <class _ForwardIterator> 3684 _ForwardIterator 3685 basic_regex<_CharT, _Traits>::__parse_follow_list(_ForwardIterator __first, 3686 _ForwardIterator __last, 3687 __bracket_expression<_CharT, _Traits>* __ml) 3688 { 3689 if (__first != __last) 3690 { 3691 while (true) 3692 { 3693 _ForwardIterator __temp = __parse_expression_term(__first, __last, 3694 __ml); 3695 if (__temp == __first) 3696 break; 3697 __first = __temp; 3698 } 3699 } 3700 return __first; 3701 } 3702 3703 template <class _CharT, class _Traits> 3704 template <class _ForwardIterator> 3705 _ForwardIterator 3706 basic_regex<_CharT, _Traits>::__parse_expression_term(_ForwardIterator __first, 3707 _ForwardIterator __last, 3708 __bracket_expression<_CharT, _Traits>* __ml) 3709 { 3710 if (__first != __last && *__first != ']') 3711 { 3712 _ForwardIterator __temp = _VSTD::next(__first); 3713 basic_string<_CharT> __start_range; 3714 if (__temp != __last && *__first == '[') 3715 { 3716 if (*__temp == '=') 3717 return __parse_equivalence_class(++__temp, __last, __ml); 3718 else if (*__temp == ':') 3719 return __parse_character_class(++__temp, __last, __ml); 3720 else if (*__temp == '.') 3721 __first = __parse_collating_symbol(++__temp, __last, __start_range); 3722 } 3723 unsigned __grammar = __flags_ & 0x1F0; 3724 if (__start_range.empty()) 3725 { 3726 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\') 3727 { 3728 if (__grammar == ECMAScript) 3729 __first = __parse_class_escape(++__first, __last, __start_range, __ml); 3730 else 3731 __first = __parse_awk_escape(++__first, __last, &__start_range); 3732 } 3733 else 3734 { 3735 __start_range = *__first; 3736 ++__first; 3737 } 3738 } 3739 if (__first != __last && *__first != ']') 3740 { 3741 __temp = _VSTD::next(__first); 3742 if (__temp != __last && *__first == '-' && *__temp != ']') 3743 { 3744 // parse a range 3745 basic_string<_CharT> __end_range; 3746 __first = __temp; 3747 ++__temp; 3748 if (__temp != __last && *__first == '[' && *__temp == '.') 3749 __first = __parse_collating_symbol(++__temp, __last, __end_range); 3750 else 3751 { 3752 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\') 3753 { 3754 if (__grammar == ECMAScript) 3755 __first = __parse_class_escape(++__first, __last, 3756 __end_range, __ml); 3757 else 3758 __first = __parse_awk_escape(++__first, __last, 3759 &__end_range); 3760 } 3761 else 3762 { 3763 __end_range = *__first; 3764 ++__first; 3765 } 3766 } 3767 __ml->__add_range(_VSTD::move(__start_range), _VSTD::move(__end_range)); 3768 } 3769 else 3770 { 3771 if (__start_range.size() == 1) 3772 __ml->__add_char(__start_range[0]); 3773 else 3774 __ml->__add_digraph(__start_range[0], __start_range[1]); 3775 } 3776 } 3777 else 3778 { 3779 if (__start_range.size() == 1) 3780 __ml->__add_char(__start_range[0]); 3781 else 3782 __ml->__add_digraph(__start_range[0], __start_range[1]); 3783 } 3784 } 3785 return __first; 3786 } 3787 3788 template <class _CharT, class _Traits> 3789 template <class _ForwardIterator> 3790 _ForwardIterator 3791 basic_regex<_CharT, _Traits>::__parse_class_escape(_ForwardIterator __first, 3792 _ForwardIterator __last, 3793 basic_string<_CharT>& __str, 3794 __bracket_expression<_CharT, _Traits>* __ml) 3795 { 3796 #ifndef _LIBCPP_NO_EXCEPTIONS 3797 if (__first == __last) 3798 throw regex_error(regex_constants::error_escape); 3799 #endif // _LIBCPP_NO_EXCEPTIONS 3800 switch (*__first) 3801 { 3802 case 0: 3803 __str = *__first; 3804 return ++__first; 3805 case 'b': 3806 __str = _CharT(8); 3807 return ++__first; 3808 case 'd': 3809 __ml->__add_class(ctype_base::digit); 3810 return ++__first; 3811 case 'D': 3812 __ml->__add_neg_class(ctype_base::digit); 3813 return ++__first; 3814 case 's': 3815 __ml->__add_class(ctype_base::space); 3816 return ++__first; 3817 case 'S': 3818 __ml->__add_neg_class(ctype_base::space); 3819 return ++__first; 3820 case 'w': 3821 __ml->__add_class(ctype_base::alnum); 3822 __ml->__add_char('_'); 3823 return ++__first; 3824 case 'W': 3825 __ml->__add_neg_class(ctype_base::alnum); 3826 __ml->__add_neg_char('_'); 3827 return ++__first; 3828 } 3829 __first = __parse_character_escape(__first, __last, &__str); 3830 return __first; 3831 } 3832 3833 template <class _CharT, class _Traits> 3834 template <class _ForwardIterator> 3835 _ForwardIterator 3836 basic_regex<_CharT, _Traits>::__parse_awk_escape(_ForwardIterator __first, 3837 _ForwardIterator __last, 3838 basic_string<_CharT>* __str) 3839 { 3840 #ifndef _LIBCPP_NO_EXCEPTIONS 3841 if (__first == __last) 3842 throw regex_error(regex_constants::error_escape); 3843 #endif // _LIBCPP_NO_EXCEPTIONS 3844 switch (*__first) 3845 { 3846 case '\\': 3847 case '"': 3848 case '/': 3849 if (__str) 3850 *__str = *__first; 3851 else 3852 __push_char(*__first); 3853 return ++__first; 3854 case 'a': 3855 if (__str) 3856 *__str = _CharT(7); 3857 else 3858 __push_char(_CharT(7)); 3859 return ++__first; 3860 case 'b': 3861 if (__str) 3862 *__str = _CharT(8); 3863 else 3864 __push_char(_CharT(8)); 3865 return ++__first; 3866 case 'f': 3867 if (__str) 3868 *__str = _CharT(0xC); 3869 else 3870 __push_char(_CharT(0xC)); 3871 return ++__first; 3872 case 'n': 3873 if (__str) 3874 *__str = _CharT(0xA); 3875 else 3876 __push_char(_CharT(0xA)); 3877 return ++__first; 3878 case 'r': 3879 if (__str) 3880 *__str = _CharT(0xD); 3881 else 3882 __push_char(_CharT(0xD)); 3883 return ++__first; 3884 case 't': 3885 if (__str) 3886 *__str = _CharT(0x9); 3887 else 3888 __push_char(_CharT(0x9)); 3889 return ++__first; 3890 case 'v': 3891 if (__str) 3892 *__str = _CharT(0xB); 3893 else 3894 __push_char(_CharT(0xB)); 3895 return ++__first; 3896 } 3897 if ('0' <= *__first && *__first <= '7') 3898 { 3899 unsigned __val = *__first - '0'; 3900 if (++__first != __last && ('0' <= *__first && *__first <= '7')) 3901 { 3902 __val = 8 * __val + *__first - '0'; 3903 if (++__first != __last && ('0' <= *__first && *__first <= '7')) 3904 __val = 8 * __val + *__first - '0'; 3905 } 3906 if (__str) 3907 *__str = _CharT(__val); 3908 else 3909 __push_char(_CharT(__val)); 3910 } 3911 #ifndef _LIBCPP_NO_EXCEPTIONS 3912 else 3913 throw regex_error(regex_constants::error_escape); 3914 #endif // _LIBCPP_NO_EXCEPTIONS 3915 return __first; 3916 } 3917 3918 template <class _CharT, class _Traits> 3919 template <class _ForwardIterator> 3920 _ForwardIterator 3921 basic_regex<_CharT, _Traits>::__parse_equivalence_class(_ForwardIterator __first, 3922 _ForwardIterator __last, 3923 __bracket_expression<_CharT, _Traits>* __ml) 3924 { 3925 // Found [= 3926 // This means =] must exist 3927 value_type _Equal_close[2] = {'=', ']'}; 3928 _ForwardIterator __temp = _VSTD::search(__first, __last, _Equal_close, 3929 _Equal_close+2); 3930 #ifndef _LIBCPP_NO_EXCEPTIONS 3931 if (__temp == __last) 3932 throw regex_error(regex_constants::error_brack); 3933 #endif // _LIBCPP_NO_EXCEPTIONS 3934 // [__first, __temp) contains all text in [= ... =] 3935 typedef typename _Traits::string_type string_type; 3936 string_type __collate_name = 3937 __traits_.lookup_collatename(__first, __temp); 3938 #ifndef _LIBCPP_NO_EXCEPTIONS 3939 if (__collate_name.empty()) 3940 throw regex_error(regex_constants::error_collate); 3941 #endif // _LIBCPP_NO_EXCEPTIONS 3942 string_type __equiv_name = 3943 __traits_.transform_primary(__collate_name.begin(), 3944 __collate_name.end()); 3945 if (!__equiv_name.empty()) 3946 __ml->__add_equivalence(__equiv_name); 3947 else 3948 { 3949 switch (__collate_name.size()) 3950 { 3951 case 1: 3952 __ml->__add_char(__collate_name[0]); 3953 break; 3954 case 2: 3955 __ml->__add_digraph(__collate_name[0], __collate_name[1]); 3956 break; 3957 #ifndef _LIBCPP_NO_EXCEPTIONS 3958 default: 3959 throw regex_error(regex_constants::error_collate); 3960 #endif // _LIBCPP_NO_EXCEPTIONS 3961 } 3962 } 3963 __first = _VSTD::next(__temp, 2); 3964 return __first; 3965 } 3966 3967 template <class _CharT, class _Traits> 3968 template <class _ForwardIterator> 3969 _ForwardIterator 3970 basic_regex<_CharT, _Traits>::__parse_character_class(_ForwardIterator __first, 3971 _ForwardIterator __last, 3972 __bracket_expression<_CharT, _Traits>* __ml) 3973 { 3974 // Found [: 3975 // This means :] must exist 3976 value_type _Colon_close[2] = {':', ']'}; 3977 _ForwardIterator __temp = _VSTD::search(__first, __last, _Colon_close, 3978 _Colon_close+2); 3979 #ifndef _LIBCPP_NO_EXCEPTIONS 3980 if (__temp == __last) 3981 throw regex_error(regex_constants::error_brack); 3982 #endif // _LIBCPP_NO_EXCEPTIONS 3983 // [__first, __temp) contains all text in [: ... :] 3984 typedef typename _Traits::char_class_type char_class_type; 3985 char_class_type __class_type = 3986 __traits_.lookup_classname(__first, __temp, __flags_ & icase); 3987 #ifndef _LIBCPP_NO_EXCEPTIONS 3988 if (__class_type == 0) 3989 throw regex_error(regex_constants::error_brack); 3990 #endif // _LIBCPP_NO_EXCEPTIONS 3991 __ml->__add_class(__class_type); 3992 __first = _VSTD::next(__temp, 2); 3993 return __first; 3994 } 3995 3996 template <class _CharT, class _Traits> 3997 template <class _ForwardIterator> 3998 _ForwardIterator 3999 basic_regex<_CharT, _Traits>::__parse_collating_symbol(_ForwardIterator __first, 4000 _ForwardIterator __last, 4001 basic_string<_CharT>& __col_sym) 4002 { 4003 // Found [. 4004 // This means .] must exist 4005 value_type _Dot_close[2] = {'.', ']'}; 4006 _ForwardIterator __temp = _VSTD::search(__first, __last, _Dot_close, 4007 _Dot_close+2); 4008 #ifndef _LIBCPP_NO_EXCEPTIONS 4009 if (__temp == __last) 4010 throw regex_error(regex_constants::error_brack); 4011 #endif // _LIBCPP_NO_EXCEPTIONS 4012 // [__first, __temp) contains all text in [. ... .] 4013 typedef typename _Traits::string_type string_type; 4014 __col_sym = __traits_.lookup_collatename(__first, __temp); 4015 switch (__col_sym.size()) 4016 { 4017 case 1: 4018 case 2: 4019 break; 4020 #ifndef _LIBCPP_NO_EXCEPTIONS 4021 default: 4022 throw regex_error(regex_constants::error_collate); 4023 #endif // _LIBCPP_NO_EXCEPTIONS 4024 } 4025 __first = _VSTD::next(__temp, 2); 4026 return __first; 4027 } 4028 4029 template <class _CharT, class _Traits> 4030 template <class _ForwardIterator> 4031 _ForwardIterator 4032 basic_regex<_CharT, _Traits>::__parse_DUP_COUNT(_ForwardIterator __first, 4033 _ForwardIterator __last, 4034 int& __c) 4035 { 4036 if (__first != __last && '0' <= *__first && *__first <= '9') 4037 { 4038 __c = *__first - '0'; 4039 for (++__first; __first != __last && '0' <= *__first && *__first <= '9'; 4040 ++__first) 4041 { 4042 __c *= 10; 4043 __c += *__first - '0'; 4044 } 4045 } 4046 return __first; 4047 } 4048 4049 template <class _CharT, class _Traits> 4050 template <class _ForwardIterator> 4051 _ForwardIterator 4052 basic_regex<_CharT, _Traits>::__parse_ecma_exp(_ForwardIterator __first, 4053 _ForwardIterator __last) 4054 { 4055 __owns_one_state<_CharT>* __sa = __end_; 4056 _ForwardIterator __temp = __parse_alternative(__first, __last); 4057 if (__temp == __first) 4058 __push_empty(); 4059 __first = __temp; 4060 while (__first != __last && *__first == '|') 4061 { 4062 __owns_one_state<_CharT>* __sb = __end_; 4063 __temp = __parse_alternative(++__first, __last); 4064 if (__temp == __first) 4065 __push_empty(); 4066 __push_alternation(__sa, __sb); 4067 __first = __temp; 4068 } 4069 return __first; 4070 } 4071 4072 template <class _CharT, class _Traits> 4073 template <class _ForwardIterator> 4074 _ForwardIterator 4075 basic_regex<_CharT, _Traits>::__parse_alternative(_ForwardIterator __first, 4076 _ForwardIterator __last) 4077 { 4078 while (true) 4079 { 4080 _ForwardIterator __temp = __parse_term(__first, __last); 4081 if (__temp == __first) 4082 break; 4083 __first = __temp; 4084 } 4085 return __first; 4086 } 4087 4088 template <class _CharT, class _Traits> 4089 template <class _ForwardIterator> 4090 _ForwardIterator 4091 basic_regex<_CharT, _Traits>::__parse_term(_ForwardIterator __first, 4092 _ForwardIterator __last) 4093 { 4094 _ForwardIterator __temp = __parse_assertion(__first, __last); 4095 if (__temp == __first) 4096 { 4097 __owns_one_state<_CharT>* __e = __end_; 4098 unsigned __mexp_begin = __marked_count_; 4099 __temp = __parse_atom(__first, __last); 4100 if (__temp != __first) 4101 __first = __parse_ERE_dupl_symbol(__temp, __last, __e, 4102 __mexp_begin+1, __marked_count_+1); 4103 } 4104 else 4105 __first = __temp; 4106 return __first; 4107 } 4108 4109 template <class _CharT, class _Traits> 4110 template <class _ForwardIterator> 4111 _ForwardIterator 4112 basic_regex<_CharT, _Traits>::__parse_assertion(_ForwardIterator __first, 4113 _ForwardIterator __last) 4114 { 4115 if (__first != __last) 4116 { 4117 switch (*__first) 4118 { 4119 case '^': 4120 __push_l_anchor(); 4121 ++__first; 4122 break; 4123 case '$': 4124 __push_r_anchor(); 4125 ++__first; 4126 break; 4127 case '\\': 4128 { 4129 _ForwardIterator __temp = _VSTD::next(__first); 4130 if (__temp != __last) 4131 { 4132 if (*__temp == 'b') 4133 { 4134 __push_word_boundary(false); 4135 __first = ++__temp; 4136 } 4137 else if (*__temp == 'B') 4138 { 4139 __push_word_boundary(true); 4140 __first = ++__temp; 4141 } 4142 } 4143 } 4144 break; 4145 case '(': 4146 { 4147 _ForwardIterator __temp = _VSTD::next(__first); 4148 if (__temp != __last && *__temp == '?') 4149 { 4150 if (++__temp != __last) 4151 { 4152 switch (*__temp) 4153 { 4154 case '=': 4155 { 4156 basic_regex __exp; 4157 __exp.__flags_ = __flags_; 4158 __temp = __exp.__parse(++__temp, __last); 4159 __push_lookahead(_VSTD::move(__exp), false); 4160 #ifndef _LIBCPP_NO_EXCEPTIONS 4161 if (__temp == __last || *__temp != ')') 4162 throw regex_error(regex_constants::error_paren); 4163 #endif // _LIBCPP_NO_EXCEPTIONS 4164 __first = ++__temp; 4165 } 4166 break; 4167 case '!': 4168 { 4169 basic_regex __exp; 4170 __exp.__flags_ = __flags_; 4171 __temp = __exp.__parse(++__temp, __last); 4172 __push_lookahead(_VSTD::move(__exp), true); 4173 #ifndef _LIBCPP_NO_EXCEPTIONS 4174 if (__temp == __last || *__temp != ')') 4175 throw regex_error(regex_constants::error_paren); 4176 #endif // _LIBCPP_NO_EXCEPTIONS 4177 __first = ++__temp; 4178 } 4179 break; 4180 } 4181 } 4182 } 4183 } 4184 break; 4185 } 4186 } 4187 return __first; 4188 } 4189 4190 template <class _CharT, class _Traits> 4191 template <class _ForwardIterator> 4192 _ForwardIterator 4193 basic_regex<_CharT, _Traits>::__parse_atom(_ForwardIterator __first, 4194 _ForwardIterator __last) 4195 { 4196 if (__first != __last) 4197 { 4198 switch (*__first) 4199 { 4200 case '.': 4201 __push_match_any_but_newline(); 4202 ++__first; 4203 break; 4204 case '\\': 4205 __first = __parse_atom_escape(__first, __last); 4206 break; 4207 case '[': 4208 __first = __parse_bracket_expression(__first, __last); 4209 break; 4210 case '(': 4211 { 4212 ++__first; 4213 #ifndef _LIBCPP_NO_EXCEPTIONS 4214 if (__first == __last) 4215 throw regex_error(regex_constants::error_paren); 4216 #endif // _LIBCPP_NO_EXCEPTIONS 4217 _ForwardIterator __temp = _VSTD::next(__first); 4218 if (__temp != __last && *__first == '?' && *__temp == ':') 4219 { 4220 ++__open_count_; 4221 __first = __parse_ecma_exp(++__temp, __last); 4222 #ifndef _LIBCPP_NO_EXCEPTIONS 4223 if (__first == __last || *__first != ')') 4224 throw regex_error(regex_constants::error_paren); 4225 #endif // _LIBCPP_NO_EXCEPTIONS 4226 --__open_count_; 4227 ++__first; 4228 } 4229 else 4230 { 4231 __push_begin_marked_subexpression(); 4232 unsigned __temp_count = __marked_count_; 4233 ++__open_count_; 4234 __first = __parse_ecma_exp(__first, __last); 4235 #ifndef _LIBCPP_NO_EXCEPTIONS 4236 if (__first == __last || *__first != ')') 4237 throw regex_error(regex_constants::error_paren); 4238 #endif // _LIBCPP_NO_EXCEPTIONS 4239 __push_end_marked_subexpression(__temp_count); 4240 --__open_count_; 4241 ++__first; 4242 } 4243 } 4244 break; 4245 default: 4246 __first = __parse_pattern_character(__first, __last); 4247 break; 4248 } 4249 } 4250 return __first; 4251 } 4252 4253 template <class _CharT, class _Traits> 4254 template <class _ForwardIterator> 4255 _ForwardIterator 4256 basic_regex<_CharT, _Traits>::__parse_atom_escape(_ForwardIterator __first, 4257 _ForwardIterator __last) 4258 { 4259 if (__first != __last && *__first == '\\') 4260 { 4261 _ForwardIterator __t1 = _VSTD::next(__first); 4262 _ForwardIterator __t2 = __parse_decimal_escape(__t1, __last); 4263 if (__t2 != __t1) 4264 __first = __t2; 4265 else 4266 { 4267 __t2 = __parse_character_class_escape(__t1, __last); 4268 if (__t2 != __t1) 4269 __first = __t2; 4270 else 4271 { 4272 __t2 = __parse_character_escape(__t1, __last); 4273 if (__t2 != __t1) 4274 __first = __t2; 4275 } 4276 } 4277 } 4278 return __first; 4279 } 4280 4281 template <class _CharT, class _Traits> 4282 template <class _ForwardIterator> 4283 _ForwardIterator 4284 basic_regex<_CharT, _Traits>::__parse_decimal_escape(_ForwardIterator __first, 4285 _ForwardIterator __last) 4286 { 4287 if (__first != __last) 4288 { 4289 if (*__first == '0') 4290 { 4291 __push_char(_CharT()); 4292 ++__first; 4293 } 4294 else if ('1' <= *__first && *__first <= '9') 4295 { 4296 unsigned __v = *__first - '0'; 4297 for (++__first; '0' <= *__first && *__first <= '9'; ++__first) 4298 __v = 10 * __v + *__first - '0'; 4299 #ifndef _LIBCPP_NO_EXCEPTIONS 4300 if (__v > mark_count()) 4301 throw regex_error(regex_constants::error_backref); 4302 #endif // _LIBCPP_NO_EXCEPTIONS 4303 __push_back_ref(__v); 4304 } 4305 } 4306 return __first; 4307 } 4308 4309 template <class _CharT, class _Traits> 4310 template <class _ForwardIterator> 4311 _ForwardIterator 4312 basic_regex<_CharT, _Traits>::__parse_character_class_escape(_ForwardIterator __first, 4313 _ForwardIterator __last) 4314 { 4315 if (__first != __last) 4316 { 4317 __bracket_expression<_CharT, _Traits>* __ml; 4318 switch (*__first) 4319 { 4320 case 'd': 4321 __ml = __start_matching_list(false); 4322 __ml->__add_class(ctype_base::digit); 4323 ++__first; 4324 break; 4325 case 'D': 4326 __ml = __start_matching_list(true); 4327 __ml->__add_class(ctype_base::digit); 4328 ++__first; 4329 break; 4330 case 's': 4331 __ml = __start_matching_list(false); 4332 __ml->__add_class(ctype_base::space); 4333 ++__first; 4334 break; 4335 case 'S': 4336 __ml = __start_matching_list(true); 4337 __ml->__add_class(ctype_base::space); 4338 ++__first; 4339 break; 4340 case 'w': 4341 __ml = __start_matching_list(false); 4342 __ml->__add_class(ctype_base::alnum); 4343 __ml->__add_char('_'); 4344 ++__first; 4345 break; 4346 case 'W': 4347 __ml = __start_matching_list(true); 4348 __ml->__add_class(ctype_base::alnum); 4349 __ml->__add_char('_'); 4350 ++__first; 4351 break; 4352 } 4353 } 4354 return __first; 4355 } 4356 4357 template <class _CharT, class _Traits> 4358 template <class _ForwardIterator> 4359 _ForwardIterator 4360 basic_regex<_CharT, _Traits>::__parse_character_escape(_ForwardIterator __first, 4361 _ForwardIterator __last, 4362 basic_string<_CharT>* __str) 4363 { 4364 if (__first != __last) 4365 { 4366 _ForwardIterator __t; 4367 unsigned __sum = 0; 4368 int __hd; 4369 switch (*__first) 4370 { 4371 case 'f': 4372 if (__str) 4373 *__str = _CharT(0xC); 4374 else 4375 __push_char(_CharT(0xC)); 4376 ++__first; 4377 break; 4378 case 'n': 4379 if (__str) 4380 *__str = _CharT(0xA); 4381 else 4382 __push_char(_CharT(0xA)); 4383 ++__first; 4384 break; 4385 case 'r': 4386 if (__str) 4387 *__str = _CharT(0xD); 4388 else 4389 __push_char(_CharT(0xD)); 4390 ++__first; 4391 break; 4392 case 't': 4393 if (__str) 4394 *__str = _CharT(0x9); 4395 else 4396 __push_char(_CharT(0x9)); 4397 ++__first; 4398 break; 4399 case 'v': 4400 if (__str) 4401 *__str = _CharT(0xB); 4402 else 4403 __push_char(_CharT(0xB)); 4404 ++__first; 4405 break; 4406 case 'c': 4407 if ((__t = _VSTD::next(__first)) != __last) 4408 { 4409 if ('A' <= *__t <= 'Z' || 'a' <= *__t <= 'z') 4410 { 4411 if (__str) 4412 *__str = _CharT(*__t % 32); 4413 else 4414 __push_char(_CharT(*__t % 32)); 4415 __first = ++__t; 4416 } 4417 } 4418 break; 4419 case 'u': 4420 ++__first; 4421 #ifndef _LIBCPP_NO_EXCEPTIONS 4422 if (__first == __last) 4423 throw regex_error(regex_constants::error_escape); 4424 #endif // _LIBCPP_NO_EXCEPTIONS 4425 __hd = __traits_.value(*__first, 16); 4426 #ifndef _LIBCPP_NO_EXCEPTIONS 4427 if (__hd == -1) 4428 throw regex_error(regex_constants::error_escape); 4429 #endif // _LIBCPP_NO_EXCEPTIONS 4430 __sum = 16 * __sum + static_cast<unsigned>(__hd); 4431 ++__first; 4432 #ifndef _LIBCPP_NO_EXCEPTIONS 4433 if (__first == __last) 4434 throw regex_error(regex_constants::error_escape); 4435 #endif // _LIBCPP_NO_EXCEPTIONS 4436 __hd = __traits_.value(*__first, 16); 4437 #ifndef _LIBCPP_NO_EXCEPTIONS 4438 if (__hd == -1) 4439 throw regex_error(regex_constants::error_escape); 4440 #endif // _LIBCPP_NO_EXCEPTIONS 4441 __sum = 16 * __sum + static_cast<unsigned>(__hd); 4442 // drop through 4443 case 'x': 4444 ++__first; 4445 #ifndef _LIBCPP_NO_EXCEPTIONS 4446 if (__first == __last) 4447 throw regex_error(regex_constants::error_escape); 4448 #endif // _LIBCPP_NO_EXCEPTIONS 4449 __hd = __traits_.value(*__first, 16); 4450 #ifndef _LIBCPP_NO_EXCEPTIONS 4451 if (__hd == -1) 4452 throw regex_error(regex_constants::error_escape); 4453 #endif // _LIBCPP_NO_EXCEPTIONS 4454 __sum = 16 * __sum + static_cast<unsigned>(__hd); 4455 ++__first; 4456 #ifndef _LIBCPP_NO_EXCEPTIONS 4457 if (__first == __last) 4458 throw regex_error(regex_constants::error_escape); 4459 #endif // _LIBCPP_NO_EXCEPTIONS 4460 __hd = __traits_.value(*__first, 16); 4461 #ifndef _LIBCPP_NO_EXCEPTIONS 4462 if (__hd == -1) 4463 throw regex_error(regex_constants::error_escape); 4464 #endif // _LIBCPP_NO_EXCEPTIONS 4465 __sum = 16 * __sum + static_cast<unsigned>(__hd); 4466 if (__str) 4467 *__str = _CharT(__sum); 4468 else 4469 __push_char(_CharT(__sum)); 4470 ++__first; 4471 break; 4472 default: 4473 if (*__first != '_' && !__traits_.isctype(*__first, ctype_base::alnum)) 4474 { 4475 if (__str) 4476 *__str = *__first; 4477 else 4478 __push_char(*__first); 4479 ++__first; 4480 } 4481 #ifndef _LIBCPP_NO_EXCEPTIONS 4482 else if (__str) 4483 throw regex_error(regex_constants::error_escape); 4484 #endif // _LIBCPP_NO_EXCEPTIONS 4485 break; 4486 } 4487 } 4488 return __first; 4489 } 4490 4491 template <class _CharT, class _Traits> 4492 template <class _ForwardIterator> 4493 _ForwardIterator 4494 basic_regex<_CharT, _Traits>::__parse_pattern_character(_ForwardIterator __first, 4495 _ForwardIterator __last) 4496 { 4497 if (__first != __last) 4498 { 4499 switch (*__first) 4500 { 4501 case '^': 4502 case '$': 4503 case '\\': 4504 case '.': 4505 case '*': 4506 case '+': 4507 case '?': 4508 case '(': 4509 case ')': 4510 case '[': 4511 case ']': 4512 case '{': 4513 case '}': 4514 case '|': 4515 break; 4516 default: 4517 __push_char(*__first); 4518 ++__first; 4519 break; 4520 } 4521 } 4522 return __first; 4523 } 4524 4525 template <class _CharT, class _Traits> 4526 template <class _ForwardIterator> 4527 _ForwardIterator 4528 basic_regex<_CharT, _Traits>::__parse_grep(_ForwardIterator __first, 4529 _ForwardIterator __last) 4530 { 4531 __owns_one_state<_CharT>* __sa = __end_; 4532 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n')); 4533 if (__t1 != __first) 4534 __parse_basic_reg_exp(__first, __t1); 4535 else 4536 __push_empty(); 4537 __first = __t1; 4538 if (__first != __last) 4539 ++__first; 4540 while (__first != __last) 4541 { 4542 __t1 = _VSTD::find(__first, __last, _CharT('\n')); 4543 __owns_one_state<_CharT>* __sb = __end_; 4544 if (__t1 != __first) 4545 __parse_basic_reg_exp(__first, __t1); 4546 else 4547 __push_empty(); 4548 __push_alternation(__sa, __sb); 4549 __first = __t1; 4550 if (__first != __last) 4551 ++__first; 4552 } 4553 return __first; 4554 } 4555 4556 template <class _CharT, class _Traits> 4557 template <class _ForwardIterator> 4558 _ForwardIterator 4559 basic_regex<_CharT, _Traits>::__parse_egrep(_ForwardIterator __first, 4560 _ForwardIterator __last) 4561 { 4562 __owns_one_state<_CharT>* __sa = __end_; 4563 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n')); 4564 if (__t1 != __first) 4565 __parse_extended_reg_exp(__first, __t1); 4566 else 4567 __push_empty(); 4568 __first = __t1; 4569 if (__first != __last) 4570 ++__first; 4571 while (__first != __last) 4572 { 4573 __t1 = _VSTD::find(__first, __last, _CharT('\n')); 4574 __owns_one_state<_CharT>* __sb = __end_; 4575 if (__t1 != __first) 4576 __parse_extended_reg_exp(__first, __t1); 4577 else 4578 __push_empty(); 4579 __push_alternation(__sa, __sb); 4580 __first = __t1; 4581 if (__first != __last) 4582 ++__first; 4583 } 4584 return __first; 4585 } 4586 4587 template <class _CharT, class _Traits> 4588 void 4589 basic_regex<_CharT, _Traits>::__push_loop(size_t __min, size_t __max, 4590 __owns_one_state<_CharT>* __s, size_t __mexp_begin, size_t __mexp_end, 4591 bool __greedy) 4592 { 4593 unique_ptr<__empty_state<_CharT> > __e1(new __empty_state<_CharT>(__end_->first())); 4594 __end_->first() = nullptr; 4595 unique_ptr<__loop<_CharT> > __e2(new __loop<_CharT>(__loop_count_, 4596 __s->first(), __e1.get(), __mexp_begin, __mexp_end, __greedy, 4597 __min, __max)); 4598 __s->first() = nullptr; 4599 __e1.release(); 4600 __end_->first() = new __repeat_one_loop<_CharT>(__e2.get()); 4601 __end_ = __e2->second(); 4602 __s->first() = __e2.release(); 4603 ++__loop_count_; 4604 } 4605 4606 template <class _CharT, class _Traits> 4607 void 4608 basic_regex<_CharT, _Traits>::__push_char(value_type __c) 4609 { 4610 if (flags() & icase) 4611 __end_->first() = new __match_char_icase<_CharT, _Traits> 4612 (__traits_, __c, __end_->first()); 4613 else if (flags() & collate) 4614 __end_->first() = new __match_char_collate<_CharT, _Traits> 4615 (__traits_, __c, __end_->first()); 4616 else 4617 __end_->first() = new __match_char<_CharT>(__c, __end_->first()); 4618 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); 4619 } 4620 4621 template <class _CharT, class _Traits> 4622 void 4623 basic_regex<_CharT, _Traits>::__push_begin_marked_subexpression() 4624 { 4625 if (!(__flags_ & nosubs)) 4626 { 4627 __end_->first() = 4628 new __begin_marked_subexpression<_CharT>(++__marked_count_, 4629 __end_->first()); 4630 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); 4631 } 4632 } 4633 4634 template <class _CharT, class _Traits> 4635 void 4636 basic_regex<_CharT, _Traits>::__push_end_marked_subexpression(unsigned __sub) 4637 { 4638 if (!(__flags_ & nosubs)) 4639 { 4640 __end_->first() = 4641 new __end_marked_subexpression<_CharT>(__sub, __end_->first()); 4642 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); 4643 } 4644 } 4645 4646 template <class _CharT, class _Traits> 4647 void 4648 basic_regex<_CharT, _Traits>::__push_l_anchor() 4649 { 4650 __end_->first() = new __l_anchor<_CharT>(__end_->first()); 4651 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); 4652 } 4653 4654 template <class _CharT, class _Traits> 4655 void 4656 basic_regex<_CharT, _Traits>::__push_r_anchor() 4657 { 4658 __end_->first() = new __r_anchor<_CharT>(__end_->first()); 4659 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); 4660 } 4661 4662 template <class _CharT, class _Traits> 4663 void 4664 basic_regex<_CharT, _Traits>::__push_match_any() 4665 { 4666 __end_->first() = new __match_any<_CharT>(__end_->first()); 4667 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); 4668 } 4669 4670 template <class _CharT, class _Traits> 4671 void 4672 basic_regex<_CharT, _Traits>::__push_match_any_but_newline() 4673 { 4674 __end_->first() = new __match_any_but_newline<_CharT>(__end_->first()); 4675 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); 4676 } 4677 4678 template <class _CharT, class _Traits> 4679 void 4680 basic_regex<_CharT, _Traits>::__push_empty() 4681 { 4682 __end_->first() = new __empty_state<_CharT>(__end_->first()); 4683 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); 4684 } 4685 4686 template <class _CharT, class _Traits> 4687 void 4688 basic_regex<_CharT, _Traits>::__push_word_boundary(bool __invert) 4689 { 4690 __end_->first() = new __word_boundary<_CharT, _Traits>(__traits_, __invert, 4691 __end_->first()); 4692 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); 4693 } 4694 4695 template <class _CharT, class _Traits> 4696 void 4697 basic_regex<_CharT, _Traits>::__push_back_ref(int __i) 4698 { 4699 if (flags() & icase) 4700 __end_->first() = new __back_ref_icase<_CharT, _Traits> 4701 (__traits_, __i, __end_->first()); 4702 else if (flags() & collate) 4703 __end_->first() = new __back_ref_collate<_CharT, _Traits> 4704 (__traits_, __i, __end_->first()); 4705 else 4706 __end_->first() = new __back_ref<_CharT>(__i, __end_->first()); 4707 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); 4708 } 4709 4710 template <class _CharT, class _Traits> 4711 void 4712 basic_regex<_CharT, _Traits>::__push_alternation(__owns_one_state<_CharT>* __sa, 4713 __owns_one_state<_CharT>* __ea) 4714 { 4715 __sa->first() = new __alternate<_CharT>( 4716 static_cast<__owns_one_state<_CharT>*>(__sa->first()), 4717 static_cast<__owns_one_state<_CharT>*>(__ea->first())); 4718 __ea->first() = nullptr; 4719 __ea->first() = new __empty_state<_CharT>(__end_->first()); 4720 __end_->first() = nullptr; 4721 __end_->first() = new __empty_non_own_state<_CharT>(__ea->first()); 4722 __end_ = static_cast<__owns_one_state<_CharT>*>(__ea->first()); 4723 } 4724 4725 template <class _CharT, class _Traits> 4726 __bracket_expression<_CharT, _Traits>* 4727 basic_regex<_CharT, _Traits>::__start_matching_list(bool __negate) 4728 { 4729 __bracket_expression<_CharT, _Traits>* __r = 4730 new __bracket_expression<_CharT, _Traits>(__traits_, __end_->first(), 4731 __negate, __flags_ & icase, 4732 __flags_ & collate); 4733 __end_->first() = __r; 4734 __end_ = __r; 4735 return __r; 4736 } 4737 4738 template <class _CharT, class _Traits> 4739 void 4740 basic_regex<_CharT, _Traits>::__push_lookahead(const basic_regex& __exp, 4741 bool __invert) 4742 { 4743 __end_->first() = new __lookahead<_CharT, _Traits>(__exp, __invert, 4744 __end_->first()); 4745 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); 4746 } 4747 4748 typedef basic_regex<char> regex; 4749 typedef basic_regex<wchar_t> wregex; 4750 4751 // sub_match 4752 4753 template <class _BidirectionalIterator> 4754 class _LIBCPP_VISIBLE sub_match 4755 : public pair<_BidirectionalIterator, _BidirectionalIterator> 4756 { 4757 public: 4758 typedef _BidirectionalIterator iterator; 4759 typedef typename iterator_traits<iterator>::value_type value_type; 4760 typedef typename iterator_traits<iterator>::difference_type difference_type; 4761 typedef basic_string<value_type> string_type; 4762 4763 bool matched; 4764 4765 _LIBCPP_INLINE_VISIBILITY 4766 _LIBCPP_CONSTEXPR sub_match() : matched() {} 4767 4768 _LIBCPP_INLINE_VISIBILITY 4769 difference_type length() const 4770 {return matched ? _VSTD::distance(this->first, this->second) : 0;} 4771 _LIBCPP_INLINE_VISIBILITY 4772 string_type str() const 4773 {return matched ? string_type(this->first, this->second) : string_type();} 4774 _LIBCPP_INLINE_VISIBILITY 4775 operator string_type() const 4776 {return str();} 4777 4778 _LIBCPP_INLINE_VISIBILITY 4779 int compare(const sub_match& __s) const 4780 {return str().compare(__s.str());} 4781 _LIBCPP_INLINE_VISIBILITY 4782 int compare(const string_type& __s) const 4783 {return str().compare(__s);} 4784 _LIBCPP_INLINE_VISIBILITY 4785 int compare(const value_type* __s) const 4786 {return str().compare(__s);} 4787 }; 4788 4789 typedef sub_match<const char*> csub_match; 4790 typedef sub_match<const wchar_t*> wcsub_match; 4791 typedef sub_match<string::const_iterator> ssub_match; 4792 typedef sub_match<wstring::const_iterator> wssub_match; 4793 4794 template <class _BiIter> 4795 inline _LIBCPP_INLINE_VISIBILITY 4796 bool 4797 operator==(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) 4798 { 4799 return __x.compare(__y) == 0; 4800 } 4801 4802 template <class _BiIter> 4803 inline _LIBCPP_INLINE_VISIBILITY 4804 bool 4805 operator!=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) 4806 { 4807 return !(__x == __y); 4808 } 4809 4810 template <class _BiIter> 4811 inline _LIBCPP_INLINE_VISIBILITY 4812 bool 4813 operator<(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) 4814 { 4815 return __x.compare(__y) < 0; 4816 } 4817 4818 template <class _BiIter> 4819 inline _LIBCPP_INLINE_VISIBILITY 4820 bool 4821 operator<=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) 4822 { 4823 return !(__y < __x); 4824 } 4825 4826 template <class _BiIter> 4827 inline _LIBCPP_INLINE_VISIBILITY 4828 bool 4829 operator>=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) 4830 { 4831 return !(__x < __y); 4832 } 4833 4834 template <class _BiIter> 4835 inline _LIBCPP_INLINE_VISIBILITY 4836 bool 4837 operator>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) 4838 { 4839 return __y < __x; 4840 } 4841 4842 template <class _BiIter, class _ST, class _SA> 4843 inline _LIBCPP_INLINE_VISIBILITY 4844 bool 4845 operator==(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x, 4846 const sub_match<_BiIter>& __y) 4847 { 4848 return __y.compare(__x.c_str()) == 0; 4849 } 4850 4851 template <class _BiIter, class _ST, class _SA> 4852 inline _LIBCPP_INLINE_VISIBILITY 4853 bool 4854 operator!=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x, 4855 const sub_match<_BiIter>& __y) 4856 { 4857 return !(__x == __y); 4858 } 4859 4860 template <class _BiIter, class _ST, class _SA> 4861 inline _LIBCPP_INLINE_VISIBILITY 4862 bool 4863 operator<(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x, 4864 const sub_match<_BiIter>& __y) 4865 { 4866 return __y.compare(__x.c_str()) > 0; 4867 } 4868 4869 template <class _BiIter, class _ST, class _SA> 4870 inline _LIBCPP_INLINE_VISIBILITY 4871 bool 4872 operator>(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x, 4873 const sub_match<_BiIter>& __y) 4874 { 4875 return __y < __x; 4876 } 4877 4878 template <class _BiIter, class _ST, class _SA> 4879 inline _LIBCPP_INLINE_VISIBILITY 4880 bool operator>=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x, 4881 const sub_match<_BiIter>& __y) 4882 { 4883 return !(__x < __y); 4884 } 4885 4886 template <class _BiIter, class _ST, class _SA> 4887 inline _LIBCPP_INLINE_VISIBILITY 4888 bool 4889 operator<=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x, 4890 const sub_match<_BiIter>& __y) 4891 { 4892 return !(__y < __x); 4893 } 4894 4895 template <class _BiIter, class _ST, class _SA> 4896 inline _LIBCPP_INLINE_VISIBILITY 4897 bool 4898 operator==(const sub_match<_BiIter>& __x, 4899 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) 4900 { 4901 return __x.compare(__y.c_str()) == 0; 4902 } 4903 4904 template <class _BiIter, class _ST, class _SA> 4905 inline _LIBCPP_INLINE_VISIBILITY 4906 bool 4907 operator!=(const sub_match<_BiIter>& __x, 4908 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) 4909 { 4910 return !(__x == __y); 4911 } 4912 4913 template <class _BiIter, class _ST, class _SA> 4914 inline _LIBCPP_INLINE_VISIBILITY 4915 bool 4916 operator<(const sub_match<_BiIter>& __x, 4917 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) 4918 { 4919 return __x.compare(__y.c_str()) < 0; 4920 } 4921 4922 template <class _BiIter, class _ST, class _SA> 4923 inline _LIBCPP_INLINE_VISIBILITY 4924 bool operator>(const sub_match<_BiIter>& __x, 4925 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) 4926 { 4927 return __y < __x; 4928 } 4929 4930 template <class _BiIter, class _ST, class _SA> 4931 inline _LIBCPP_INLINE_VISIBILITY 4932 bool 4933 operator>=(const sub_match<_BiIter>& __x, 4934 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) 4935 { 4936 return !(__x < __y); 4937 } 4938 4939 template <class _BiIter, class _ST, class _SA> 4940 inline _LIBCPP_INLINE_VISIBILITY 4941 bool 4942 operator<=(const sub_match<_BiIter>& __x, 4943 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) 4944 { 4945 return !(__y < __x); 4946 } 4947 4948 template <class _BiIter> 4949 inline _LIBCPP_INLINE_VISIBILITY 4950 bool 4951 operator==(typename iterator_traits<_BiIter>::value_type const* __x, 4952 const sub_match<_BiIter>& __y) 4953 { 4954 return __y.compare(__x) == 0; 4955 } 4956 4957 template <class _BiIter> 4958 inline _LIBCPP_INLINE_VISIBILITY 4959 bool 4960 operator!=(typename iterator_traits<_BiIter>::value_type const* __x, 4961 const sub_match<_BiIter>& __y) 4962 { 4963 return !(__x == __y); 4964 } 4965 4966 template <class _BiIter> 4967 inline _LIBCPP_INLINE_VISIBILITY 4968 bool 4969 operator<(typename iterator_traits<_BiIter>::value_type const* __x, 4970 const sub_match<_BiIter>& __y) 4971 { 4972 return __y.compare(__x) > 0; 4973 } 4974 4975 template <class _BiIter> 4976 inline _LIBCPP_INLINE_VISIBILITY 4977 bool 4978 operator>(typename iterator_traits<_BiIter>::value_type const* __x, 4979 const sub_match<_BiIter>& __y) 4980 { 4981 return __y < __x; 4982 } 4983 4984 template <class _BiIter> 4985 inline _LIBCPP_INLINE_VISIBILITY 4986 bool 4987 operator>=(typename iterator_traits<_BiIter>::value_type const* __x, 4988 const sub_match<_BiIter>& __y) 4989 { 4990 return !(__x < __y); 4991 } 4992 4993 template <class _BiIter> 4994 inline _LIBCPP_INLINE_VISIBILITY 4995 bool 4996 operator<=(typename iterator_traits<_BiIter>::value_type const* __x, 4997 const sub_match<_BiIter>& __y) 4998 { 4999 return !(__y < __x); 5000 } 5001 5002 template <class _BiIter> 5003 inline _LIBCPP_INLINE_VISIBILITY 5004 bool 5005 operator==(const sub_match<_BiIter>& __x, 5006 typename iterator_traits<_BiIter>::value_type const* __y) 5007 { 5008 return __x.compare(__y) == 0; 5009 } 5010 5011 template <class _BiIter> 5012 inline _LIBCPP_INLINE_VISIBILITY 5013 bool 5014 operator!=(const sub_match<_BiIter>& __x, 5015 typename iterator_traits<_BiIter>::value_type const* __y) 5016 { 5017 return !(__x == __y); 5018 } 5019 5020 template <class _BiIter> 5021 inline _LIBCPP_INLINE_VISIBILITY 5022 bool 5023 operator<(const sub_match<_BiIter>& __x, 5024 typename iterator_traits<_BiIter>::value_type const* __y) 5025 { 5026 return __x.compare(__y) < 0; 5027 } 5028 5029 template <class _BiIter> 5030 inline _LIBCPP_INLINE_VISIBILITY 5031 bool 5032 operator>(const sub_match<_BiIter>& __x, 5033 typename iterator_traits<_BiIter>::value_type const* __y) 5034 { 5035 return __y < __x; 5036 } 5037 5038 template <class _BiIter> 5039 inline _LIBCPP_INLINE_VISIBILITY 5040 bool 5041 operator>=(const sub_match<_BiIter>& __x, 5042 typename iterator_traits<_BiIter>::value_type const* __y) 5043 { 5044 return !(__x < __y); 5045 } 5046 5047 template <class _BiIter> 5048 inline _LIBCPP_INLINE_VISIBILITY 5049 bool 5050 operator<=(const sub_match<_BiIter>& __x, 5051 typename iterator_traits<_BiIter>::value_type const* __y) 5052 { 5053 return !(__y < __x); 5054 } 5055 5056 template <class _BiIter> 5057 inline _LIBCPP_INLINE_VISIBILITY 5058 bool 5059 operator==(typename iterator_traits<_BiIter>::value_type const& __x, 5060 const sub_match<_BiIter>& __y) 5061 { 5062 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type; 5063 return __y.compare(string_type(1, __x)) == 0; 5064 } 5065 5066 template <class _BiIter> 5067 inline _LIBCPP_INLINE_VISIBILITY 5068 bool 5069 operator!=(typename iterator_traits<_BiIter>::value_type const& __x, 5070 const sub_match<_BiIter>& __y) 5071 { 5072 return !(__x == __y); 5073 } 5074 5075 template <class _BiIter> 5076 inline _LIBCPP_INLINE_VISIBILITY 5077 bool 5078 operator<(typename iterator_traits<_BiIter>::value_type const& __x, 5079 const sub_match<_BiIter>& __y) 5080 { 5081 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type; 5082 return __y.compare(string_type(1, __x)) > 0; 5083 } 5084 5085 template <class _BiIter> 5086 inline _LIBCPP_INLINE_VISIBILITY 5087 bool 5088 operator>(typename iterator_traits<_BiIter>::value_type const& __x, 5089 const sub_match<_BiIter>& __y) 5090 { 5091 return __y < __x; 5092 } 5093 5094 template <class _BiIter> 5095 inline _LIBCPP_INLINE_VISIBILITY 5096 bool 5097 operator>=(typename iterator_traits<_BiIter>::value_type const& __x, 5098 const sub_match<_BiIter>& __y) 5099 { 5100 return !(__x < __y); 5101 } 5102 5103 template <class _BiIter> 5104 inline _LIBCPP_INLINE_VISIBILITY 5105 bool 5106 operator<=(typename iterator_traits<_BiIter>::value_type const& __x, 5107 const sub_match<_BiIter>& __y) 5108 { 5109 return !(__y < __x); 5110 } 5111 5112 template <class _BiIter> 5113 inline _LIBCPP_INLINE_VISIBILITY 5114 bool 5115 operator==(const sub_match<_BiIter>& __x, 5116 typename iterator_traits<_BiIter>::value_type const& __y) 5117 { 5118 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type; 5119 return __x.compare(string_type(1, __y)) == 0; 5120 } 5121 5122 template <class _BiIter> 5123 inline _LIBCPP_INLINE_VISIBILITY 5124 bool 5125 operator!=(const sub_match<_BiIter>& __x, 5126 typename iterator_traits<_BiIter>::value_type const& __y) 5127 { 5128 return !(__x == __y); 5129 } 5130 5131 template <class _BiIter> 5132 inline _LIBCPP_INLINE_VISIBILITY 5133 bool 5134 operator<(const sub_match<_BiIter>& __x, 5135 typename iterator_traits<_BiIter>::value_type const& __y) 5136 { 5137 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type; 5138 return __x.compare(string_type(1, __y)) < 0; 5139 } 5140 5141 template <class _BiIter> 5142 inline _LIBCPP_INLINE_VISIBILITY 5143 bool 5144 operator>(const sub_match<_BiIter>& __x, 5145 typename iterator_traits<_BiIter>::value_type const& __y) 5146 { 5147 return __y < __x; 5148 } 5149 5150 template <class _BiIter> 5151 inline _LIBCPP_INLINE_VISIBILITY 5152 bool 5153 operator>=(const sub_match<_BiIter>& __x, 5154 typename iterator_traits<_BiIter>::value_type const& __y) 5155 { 5156 return !(__x < __y); 5157 } 5158 5159 template <class _BiIter> 5160 inline _LIBCPP_INLINE_VISIBILITY 5161 bool 5162 operator<=(const sub_match<_BiIter>& __x, 5163 typename iterator_traits<_BiIter>::value_type const& __y) 5164 { 5165 return !(__y < __x); 5166 } 5167 5168 template <class _CharT, class _ST, class _BiIter> 5169 inline _LIBCPP_INLINE_VISIBILITY 5170 basic_ostream<_CharT, _ST>& 5171 operator<<(basic_ostream<_CharT, _ST>& __os, const sub_match<_BiIter>& __m) 5172 { 5173 return __os << __m.str(); 5174 } 5175 5176 template <class _BidirectionalIterator, class _Allocator> 5177 class _LIBCPP_VISIBLE match_results 5178 { 5179 public: 5180 typedef _Allocator allocator_type; 5181 typedef sub_match<_BidirectionalIterator> value_type; 5182 private: 5183 typedef vector<value_type, allocator_type> __container_type; 5184 5185 __container_type __matches_; 5186 value_type __unmatched_; 5187 value_type __prefix_; 5188 value_type __suffix_; 5189 bool __ready_; 5190 public: 5191 _BidirectionalIterator __position_start_; 5192 typedef const value_type& const_reference; 5193 typedef const_reference reference; 5194 typedef typename __container_type::const_iterator const_iterator; 5195 typedef const_iterator iterator; 5196 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type; 5197 typedef typename allocator_traits<allocator_type>::size_type size_type; 5198 typedef typename iterator_traits<_BidirectionalIterator>::value_type char_type; 5199 typedef basic_string<char_type> string_type; 5200 5201 // construct/copy/destroy: 5202 explicit match_results(const allocator_type& __a = allocator_type()); 5203 // match_results(const match_results&) = default; 5204 // match_results& operator=(const match_results&) = default; 5205 // match_results(match_results&& __m) = default; 5206 // match_results& operator=(match_results&& __m) = default; 5207 // ~match_results() = default; 5208 5209 _LIBCPP_INLINE_VISIBILITY 5210 bool ready() const {return __ready_;} 5211 5212 // size: 5213 _LIBCPP_INLINE_VISIBILITY 5214 size_type size() const {return __matches_.size();} 5215 _LIBCPP_INLINE_VISIBILITY 5216 size_type max_size() const {return __matches_.max_size();} 5217 _LIBCPP_INLINE_VISIBILITY 5218 bool empty() const {return size() == 0;} 5219 5220 // element access: 5221 _LIBCPP_INLINE_VISIBILITY 5222 difference_type length(size_type __sub = 0) const 5223 {return (*this)[__sub].length();} 5224 _LIBCPP_INLINE_VISIBILITY 5225 difference_type position(size_type __sub = 0) const 5226 {return _VSTD::distance(__position_start_, (*this)[__sub].first);} 5227 _LIBCPP_INLINE_VISIBILITY 5228 string_type str(size_type __sub = 0) const 5229 {return (*this)[__sub].str();} 5230 _LIBCPP_INLINE_VISIBILITY 5231 const_reference operator[](size_type __n) const 5232 {return __n < __matches_.size() ? __matches_[__n] : __unmatched_;} 5233 5234 _LIBCPP_INLINE_VISIBILITY 5235 const_reference prefix() const {return __prefix_;} 5236 _LIBCPP_INLINE_VISIBILITY 5237 const_reference suffix() const {return __suffix_;} 5238 5239 _LIBCPP_INLINE_VISIBILITY 5240 const_iterator begin() const {return empty() ? __matches_.end() : __matches_.begin();} 5241 _LIBCPP_INLINE_VISIBILITY 5242 const_iterator end() const {return __matches_.end();} 5243 _LIBCPP_INLINE_VISIBILITY 5244 const_iterator cbegin() const {return empty() ? __matches_.end() : __matches_.begin();} 5245 _LIBCPP_INLINE_VISIBILITY 5246 const_iterator cend() const {return __matches_.end();} 5247 5248 // format: 5249 template <class _OutputIter> 5250 _OutputIter 5251 format(_OutputIter __out, const char_type* __fmt_first, 5252 const char_type* __fmt_last, 5253 regex_constants::match_flag_type __flags = regex_constants::format_default) const; 5254 template <class _OutputIter, class _ST, class _SA> 5255 _LIBCPP_INLINE_VISIBILITY 5256 _OutputIter 5257 format(_OutputIter __out, const basic_string<char_type, _ST, _SA>& __fmt, 5258 regex_constants::match_flag_type __flags = regex_constants::format_default) const 5259 {return format(__out, __fmt.data(), __fmt.data() + __fmt.size(), __flags);} 5260 template <class _ST, class _SA> 5261 _LIBCPP_INLINE_VISIBILITY 5262 basic_string<char_type, _ST, _SA> 5263 format(const basic_string<char_type, _ST, _SA>& __fmt, 5264 regex_constants::match_flag_type __flags = regex_constants::format_default) const 5265 { 5266 basic_string<char_type, _ST, _SA> __r; 5267 format(back_inserter(__r), __fmt.data(), __fmt.data() + __fmt.size(), 5268 __flags); 5269 return __r; 5270 } 5271 _LIBCPP_INLINE_VISIBILITY 5272 string_type 5273 format(const char_type* __fmt, 5274 regex_constants::match_flag_type __flags = regex_constants::format_default) const 5275 { 5276 string_type __r; 5277 format(back_inserter(__r), __fmt, 5278 __fmt + char_traits<char_type>::length(__fmt), __flags); 5279 return __r; 5280 } 5281 5282 // allocator: 5283 _LIBCPP_INLINE_VISIBILITY 5284 allocator_type get_allocator() const {return __matches_.get_allocator();} 5285 5286 // swap: 5287 void swap(match_results& __m); 5288 5289 template <class _Bp, class _Ap> 5290 _LIBCPP_INLINE_VISIBILITY 5291 void __assign(_BidirectionalIterator __f, _BidirectionalIterator __l, 5292 const match_results<_Bp, _Ap>& __m, bool __no_update_pos) 5293 { 5294 _Bp __mf = __m.prefix().first; 5295 __matches_.resize(__m.size()); 5296 for (size_type __i = 0; __i < __matches_.size(); ++__i) 5297 { 5298 __matches_[__i].first = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].first)); 5299 __matches_[__i].second = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].second)); 5300 __matches_[__i].matched = __m[__i].matched; 5301 } 5302 __unmatched_.first = __l; 5303 __unmatched_.second = __l; 5304 __unmatched_.matched = false; 5305 __prefix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().first)); 5306 __prefix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().second)); 5307 __prefix_.matched = __m.prefix().matched; 5308 __suffix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().first)); 5309 __suffix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().second)); 5310 __suffix_.matched = __m.suffix().matched; 5311 if (!__no_update_pos) 5312 __position_start_ = __prefix_.first; 5313 __ready_ = __m.ready(); 5314 } 5315 5316 private: 5317 void __init(unsigned __s, 5318 _BidirectionalIterator __f, _BidirectionalIterator __l, 5319 bool __no_update_pos = false); 5320 5321 template <class, class> friend class basic_regex; 5322 5323 template <class _Bp, class _Ap, class _Cp, class _Tp> 5324 friend 5325 bool 5326 regex_match(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&, 5327 regex_constants::match_flag_type); 5328 5329 template <class _Bp, class _Ap> 5330 friend 5331 bool 5332 operator==(const match_results<_Bp, _Ap>&, const match_results<_Bp, _Ap>&); 5333 5334 template <class, class> friend class __lookahead; 5335 }; 5336 5337 template <class _BidirectionalIterator, class _Allocator> 5338 match_results<_BidirectionalIterator, _Allocator>::match_results( 5339 const allocator_type& __a) 5340 : __matches_(__a), 5341 __unmatched_(), 5342 __prefix_(), 5343 __suffix_(), 5344 __position_start_(), 5345 __ready_(false) 5346 { 5347 } 5348 5349 template <class _BidirectionalIterator, class _Allocator> 5350 void 5351 match_results<_BidirectionalIterator, _Allocator>::__init(unsigned __s, 5352 _BidirectionalIterator __f, _BidirectionalIterator __l, 5353 bool __no_update_pos) 5354 { 5355 __unmatched_.first = __l; 5356 __unmatched_.second = __l; 5357 __unmatched_.matched = false; 5358 __matches_.assign(__s, __unmatched_); 5359 __prefix_.first = __f; 5360 __prefix_.second = __f; 5361 __prefix_.matched = false; 5362 __suffix_ = __unmatched_; 5363 if (!__no_update_pos) 5364 __position_start_ = __prefix_.first; 5365 __ready_ = true; 5366 } 5367 5368 template <class _BidirectionalIterator, class _Allocator> 5369 template <class _OutputIter> 5370 _OutputIter 5371 match_results<_BidirectionalIterator, _Allocator>::format(_OutputIter __out, 5372 const char_type* __fmt_first, const char_type* __fmt_last, 5373 regex_constants::match_flag_type __flags) const 5374 { 5375 if (__flags & regex_constants::format_sed) 5376 { 5377 for (; __fmt_first != __fmt_last; ++__fmt_first) 5378 { 5379 if (*__fmt_first == '&') 5380 __out = _VSTD::copy(__matches_[0].first, __matches_[0].second, 5381 __out); 5382 else if (*__fmt_first == '\\' && __fmt_first + 1 != __fmt_last) 5383 { 5384 ++__fmt_first; 5385 if ('0' <= *__fmt_first && *__fmt_first <= '9') 5386 { 5387 size_t __i = *__fmt_first - '0'; 5388 __out = _VSTD::copy(__matches_[__i].first, 5389 __matches_[__i].second, __out); 5390 } 5391 else 5392 { 5393 *__out = *__fmt_first; 5394 ++__out; 5395 } 5396 } 5397 else 5398 { 5399 *__out = *__fmt_first; 5400 ++__out; 5401 } 5402 } 5403 } 5404 else 5405 { 5406 for (; __fmt_first != __fmt_last; ++__fmt_first) 5407 { 5408 if (*__fmt_first == '$' && __fmt_first + 1 != __fmt_last) 5409 { 5410 switch (__fmt_first[1]) 5411 { 5412 case '$': 5413 *__out = *++__fmt_first; 5414 ++__out; 5415 break; 5416 case '&': 5417 ++__fmt_first; 5418 __out = _VSTD::copy(__matches_[0].first, __matches_[0].second, 5419 __out); 5420 break; 5421 case '`': 5422 ++__fmt_first; 5423 __out = _VSTD::copy(__prefix_.first, __prefix_.second, __out); 5424 break; 5425 case '\'': 5426 ++__fmt_first; 5427 __out = _VSTD::copy(__suffix_.first, __suffix_.second, __out); 5428 break; 5429 default: 5430 if ('0' <= __fmt_first[1] && __fmt_first[1] <= '9') 5431 { 5432 ++__fmt_first; 5433 size_t __i = *__fmt_first - '0'; 5434 if (__fmt_first + 1 != __fmt_last && 5435 '0' <= __fmt_first[1] && __fmt_first[1] <= '9') 5436 { 5437 ++__fmt_first; 5438 __i = 10 * __i + *__fmt_first - '0'; 5439 } 5440 __out = _VSTD::copy(__matches_[__i].first, 5441 __matches_[__i].second, __out); 5442 } 5443 else 5444 { 5445 *__out = *__fmt_first; 5446 ++__out; 5447 } 5448 break; 5449 } 5450 } 5451 else 5452 { 5453 *__out = *__fmt_first; 5454 ++__out; 5455 } 5456 } 5457 } 5458 return __out; 5459 } 5460 5461 template <class _BidirectionalIterator, class _Allocator> 5462 void 5463 match_results<_BidirectionalIterator, _Allocator>::swap(match_results& __m) 5464 { 5465 using _VSTD::swap; 5466 swap(__matches_, __m.__matches_); 5467 swap(__unmatched_, __m.__unmatched_); 5468 swap(__prefix_, __m.__prefix_); 5469 swap(__suffix_, __m.__suffix_); 5470 swap(__position_start_, __m.__position_start_); 5471 swap(__ready_, __m.__ready_); 5472 } 5473 5474 typedef match_results<const char*> cmatch; 5475 typedef match_results<const wchar_t*> wcmatch; 5476 typedef match_results<string::const_iterator> smatch; 5477 typedef match_results<wstring::const_iterator> wsmatch; 5478 5479 template <class _BidirectionalIterator, class _Allocator> 5480 bool 5481 operator==(const match_results<_BidirectionalIterator, _Allocator>& __x, 5482 const match_results<_BidirectionalIterator, _Allocator>& __y) 5483 { 5484 if (__x.__ready_ != __y.__ready_) 5485 return false; 5486 if (!__x.__ready_) 5487 return true; 5488 return __x.__matches_ == __y.__matches_ && 5489 __x.__prefix_ == __y.__prefix_ && 5490 __x.__suffix_ == __y.__suffix_; 5491 } 5492 5493 template <class _BidirectionalIterator, class _Allocator> 5494 inline _LIBCPP_INLINE_VISIBILITY 5495 bool 5496 operator!=(const match_results<_BidirectionalIterator, _Allocator>& __x, 5497 const match_results<_BidirectionalIterator, _Allocator>& __y) 5498 { 5499 return !(__x == __y); 5500 } 5501 5502 template <class _BidirectionalIterator, class _Allocator> 5503 inline _LIBCPP_INLINE_VISIBILITY 5504 void 5505 swap(match_results<_BidirectionalIterator, _Allocator>& __x, 5506 match_results<_BidirectionalIterator, _Allocator>& __y) 5507 { 5508 __x.swap(__y); 5509 } 5510 5511 // regex_search 5512 5513 template <class _CharT, class _Traits> 5514 template <class _Allocator> 5515 bool 5516 basic_regex<_CharT, _Traits>::__match_at_start_ecma( 5517 const _CharT* __first, const _CharT* __last, 5518 match_results<const _CharT*, _Allocator>& __m, 5519 regex_constants::match_flag_type __flags, bool __at_first) const 5520 { 5521 vector<__state> __states; 5522 __node* __st = __start_.get(); 5523 if (__st) 5524 { 5525 __states.push_back(__state()); 5526 __states.back().__do_ = 0; 5527 __states.back().__first_ = __first; 5528 __states.back().__current_ = __first; 5529 __states.back().__last_ = __last; 5530 __states.back().__sub_matches_.resize(mark_count()); 5531 __states.back().__loop_data_.resize(__loop_count()); 5532 __states.back().__node_ = __st; 5533 __states.back().__flags_ = __flags; 5534 __states.back().__at_first_ = __at_first; 5535 do 5536 { 5537 __state& __s = __states.back(); 5538 if (__s.__node_) 5539 __s.__node_->__exec(__s); 5540 switch (__s.__do_) 5541 { 5542 case __state::__end_state: 5543 __m.__matches_[0].first = __first; 5544 __m.__matches_[0].second = _VSTD::next(__first, __s.__current_ - __first); 5545 __m.__matches_[0].matched = true; 5546 for (unsigned __i = 0; __i < __s.__sub_matches_.size(); ++__i) 5547 __m.__matches_[__i+1] = __s.__sub_matches_[__i]; 5548 return true; 5549 case __state::__accept_and_consume: 5550 case __state::__repeat: 5551 case __state::__accept_but_not_consume: 5552 break; 5553 case __state::__split: 5554 { 5555 __state __snext = __s; 5556 __s.__node_->__exec_split(true, __s); 5557 __snext.__node_->__exec_split(false, __snext); 5558 __states.push_back(_VSTD::move(__snext)); 5559 } 5560 break; 5561 case __state::__reject: 5562 __states.pop_back(); 5563 break; 5564 default: 5565 #ifndef _LIBCPP_NO_EXCEPTIONS 5566 throw regex_error(regex_constants::__re_err_unknown); 5567 #endif 5568 break; 5569 5570 } 5571 } while (!__states.empty()); 5572 } 5573 return false; 5574 } 5575 5576 template <class _CharT, class _Traits> 5577 template <class _Allocator> 5578 bool 5579 basic_regex<_CharT, _Traits>::__match_at_start_posix_nosubs( 5580 const _CharT* __first, const _CharT* __last, 5581 match_results<const _CharT*, _Allocator>& __m, 5582 regex_constants::match_flag_type __flags, bool __at_first) const 5583 { 5584 deque<__state> __states; 5585 ptrdiff_t __highest_j = 0; 5586 ptrdiff_t _Np = _VSTD::distance(__first, __last); 5587 __node* __st = __start_.get(); 5588 if (__st) 5589 { 5590 __states.push_back(__state()); 5591 __states.back().__do_ = 0; 5592 __states.back().__first_ = __first; 5593 __states.back().__current_ = __first; 5594 __states.back().__last_ = __last; 5595 __states.back().__loop_data_.resize(__loop_count()); 5596 __states.back().__node_ = __st; 5597 __states.back().__flags_ = __flags; 5598 __states.back().__at_first_ = __at_first; 5599 bool __matched = false; 5600 do 5601 { 5602 __state& __s = __states.back(); 5603 if (__s.__node_) 5604 __s.__node_->__exec(__s); 5605 switch (__s.__do_) 5606 { 5607 case __state::__end_state: 5608 if (!__matched || __highest_j < __s.__current_ - __s.__first_) 5609 __highest_j = __s.__current_ - __s.__first_; 5610 __matched = true; 5611 if (__highest_j == _Np) 5612 __states.clear(); 5613 else 5614 __states.pop_back(); 5615 break; 5616 case __state::__consume_input: 5617 break; 5618 case __state::__accept_and_consume: 5619 __states.push_front(_VSTD::move(__s)); 5620 __states.pop_back(); 5621 break; 5622 case __state::__repeat: 5623 case __state::__accept_but_not_consume: 5624 break; 5625 case __state::__split: 5626 { 5627 __state __snext = __s; 5628 __s.__node_->__exec_split(true, __s); 5629 __snext.__node_->__exec_split(false, __snext); 5630 __states.push_back(_VSTD::move(__snext)); 5631 } 5632 break; 5633 case __state::__reject: 5634 __states.pop_back(); 5635 break; 5636 default: 5637 #ifndef _LIBCPP_NO_EXCEPTIONS 5638 throw regex_error(regex_constants::__re_err_unknown); 5639 #endif 5640 break; 5641 } 5642 } while (!__states.empty()); 5643 if (__matched) 5644 { 5645 __m.__matches_[0].first = __first; 5646 __m.__matches_[0].second = _VSTD::next(__first, __highest_j); 5647 __m.__matches_[0].matched = true; 5648 return true; 5649 } 5650 } 5651 return false; 5652 } 5653 5654 template <class _CharT, class _Traits> 5655 template <class _Allocator> 5656 bool 5657 basic_regex<_CharT, _Traits>::__match_at_start_posix_subs( 5658 const _CharT* __first, const _CharT* __last, 5659 match_results<const _CharT*, _Allocator>& __m, 5660 regex_constants::match_flag_type __flags, bool __at_first) const 5661 { 5662 vector<__state> __states; 5663 __state __best_state; 5664 ptrdiff_t __j = 0; 5665 ptrdiff_t __highest_j = 0; 5666 ptrdiff_t _Np = _VSTD::distance(__first, __last); 5667 __node* __st = __start_.get(); 5668 if (__st) 5669 { 5670 __states.push_back(__state()); 5671 __states.back().__do_ = 0; 5672 __states.back().__first_ = __first; 5673 __states.back().__current_ = __first; 5674 __states.back().__last_ = __last; 5675 __states.back().__sub_matches_.resize(mark_count()); 5676 __states.back().__loop_data_.resize(__loop_count()); 5677 __states.back().__node_ = __st; 5678 __states.back().__flags_ = __flags; 5679 __states.back().__at_first_ = __at_first; 5680 const _CharT* __current = __first; 5681 bool __matched = false; 5682 do 5683 { 5684 __state& __s = __states.back(); 5685 if (__s.__node_) 5686 __s.__node_->__exec(__s); 5687 switch (__s.__do_) 5688 { 5689 case __state::__end_state: 5690 if (!__matched || __highest_j < __s.__current_ - __s.__first_) 5691 { 5692 __highest_j = __s.__current_ - __s.__first_; 5693 __best_state = __s; 5694 } 5695 __matched = true; 5696 if (__highest_j == _Np) 5697 __states.clear(); 5698 else 5699 __states.pop_back(); 5700 break; 5701 case __state::__accept_and_consume: 5702 __j += __s.__current_ - __current; 5703 __current = __s.__current_; 5704 break; 5705 case __state::__repeat: 5706 case __state::__accept_but_not_consume: 5707 break; 5708 case __state::__split: 5709 { 5710 __state __snext = __s; 5711 __s.__node_->__exec_split(true, __s); 5712 __snext.__node_->__exec_split(false, __snext); 5713 __states.push_back(_VSTD::move(__snext)); 5714 } 5715 break; 5716 case __state::__reject: 5717 __states.pop_back(); 5718 break; 5719 default: 5720 #ifndef _LIBCPP_NO_EXCEPTIONS 5721 throw regex_error(regex_constants::__re_err_unknown); 5722 #endif 5723 break; 5724 } 5725 } while (!__states.empty()); 5726 if (__matched) 5727 { 5728 __m.__matches_[0].first = __first; 5729 __m.__matches_[0].second = _VSTD::next(__first, __highest_j); 5730 __m.__matches_[0].matched = true; 5731 for (unsigned __i = 0; __i < __best_state.__sub_matches_.size(); ++__i) 5732 __m.__matches_[__i+1] = __best_state.__sub_matches_[__i]; 5733 return true; 5734 } 5735 } 5736 return false; 5737 } 5738 5739 template <class _CharT, class _Traits> 5740 template <class _Allocator> 5741 bool 5742 basic_regex<_CharT, _Traits>::__match_at_start( 5743 const _CharT* __first, const _CharT* __last, 5744 match_results<const _CharT*, _Allocator>& __m, 5745 regex_constants::match_flag_type __flags, bool __at_first) const 5746 { 5747 if ((__flags_ & 0x1F0) == ECMAScript) 5748 return __match_at_start_ecma(__first, __last, __m, __flags, __at_first); 5749 if (mark_count() == 0) 5750 return __match_at_start_posix_nosubs(__first, __last, __m, __flags, __at_first); 5751 return __match_at_start_posix_subs(__first, __last, __m, __flags, __at_first); 5752 } 5753 5754 template <class _CharT, class _Traits> 5755 template <class _Allocator> 5756 bool 5757 basic_regex<_CharT, _Traits>::__search( 5758 const _CharT* __first, const _CharT* __last, 5759 match_results<const _CharT*, _Allocator>& __m, 5760 regex_constants::match_flag_type __flags) const 5761 { 5762 __m.__init(1 + mark_count(), __first, __last, 5763 __flags & regex_constants::__no_update_pos); 5764 if (__match_at_start(__first, __last, __m, __flags, true)) 5765 { 5766 __m.__prefix_.second = __m[0].first; 5767 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second; 5768 __m.__suffix_.first = __m[0].second; 5769 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second; 5770 return true; 5771 } 5772 if (__first != __last && !(__flags & regex_constants::match_continuous)) 5773 { 5774 __flags |= regex_constants::match_prev_avail; 5775 for (++__first; __first != __last; ++__first) 5776 { 5777 __m.__matches_.assign(__m.size(), __m.__unmatched_); 5778 if (__match_at_start(__first, __last, __m, __flags, false)) 5779 { 5780 __m.__prefix_.second = __m[0].first; 5781 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second; 5782 __m.__suffix_.first = __m[0].second; 5783 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second; 5784 return true; 5785 } 5786 __m.__matches_.assign(__m.size(), __m.__unmatched_); 5787 } 5788 } 5789 __m.__matches_.clear(); 5790 return false; 5791 } 5792 5793 template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits> 5794 inline _LIBCPP_INLINE_VISIBILITY 5795 bool 5796 regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last, 5797 match_results<_BidirectionalIterator, _Allocator>& __m, 5798 const basic_regex<_CharT, _Traits>& __e, 5799 regex_constants::match_flag_type __flags = regex_constants::match_default) 5800 { 5801 basic_string<_CharT> __s(__first, __last); 5802 match_results<const _CharT*> __mc; 5803 bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags); 5804 __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos); 5805 return __r; 5806 } 5807 5808 template <class _Allocator, class _CharT, class _Traits> 5809 inline _LIBCPP_INLINE_VISIBILITY 5810 bool 5811 regex_search(const _CharT* __first, const _CharT* __last, 5812 match_results<const _CharT*, _Allocator>& __m, 5813 const basic_regex<_CharT, _Traits>& __e, 5814 regex_constants::match_flag_type __flags = regex_constants::match_default) 5815 { 5816 return __e.__search(__first, __last, __m, __flags); 5817 } 5818 5819 template <class _BidirectionalIterator, class _CharT, class _Traits> 5820 inline _LIBCPP_INLINE_VISIBILITY 5821 bool 5822 regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last, 5823 const basic_regex<_CharT, _Traits>& __e, 5824 regex_constants::match_flag_type __flags = regex_constants::match_default) 5825 { 5826 basic_string<_CharT> __s(__first, __last); 5827 match_results<const _CharT*> __mc; 5828 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags); 5829 } 5830 5831 template <class _CharT, class _Traits> 5832 inline _LIBCPP_INLINE_VISIBILITY 5833 bool 5834 regex_search(const _CharT* __first, const _CharT* __last, 5835 const basic_regex<_CharT, _Traits>& __e, 5836 regex_constants::match_flag_type __flags = regex_constants::match_default) 5837 { 5838 match_results<const _CharT*> __mc; 5839 return __e.__search(__first, __last, __mc, __flags); 5840 } 5841 5842 template <class _CharT, class _Allocator, class _Traits> 5843 inline _LIBCPP_INLINE_VISIBILITY 5844 bool 5845 regex_search(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m, 5846 const basic_regex<_CharT, _Traits>& __e, 5847 regex_constants::match_flag_type __flags = regex_constants::match_default) 5848 { 5849 return __e.__search(__str, __str + _Traits::length(__str), __m, __flags); 5850 } 5851 5852 template <class _CharT, class _Traits> 5853 inline _LIBCPP_INLINE_VISIBILITY 5854 bool 5855 regex_search(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e, 5856 regex_constants::match_flag_type __flags = regex_constants::match_default) 5857 { 5858 match_results<const _CharT*> __m; 5859 return _VSTD::regex_search(__str, __m, __e, __flags); 5860 } 5861 5862 template <class _ST, class _SA, class _CharT, class _Traits> 5863 inline _LIBCPP_INLINE_VISIBILITY 5864 bool 5865 regex_search(const basic_string<_CharT, _ST, _SA>& __s, 5866 const basic_regex<_CharT, _Traits>& __e, 5867 regex_constants::match_flag_type __flags = regex_constants::match_default) 5868 { 5869 match_results<const _CharT*> __mc; 5870 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags); 5871 } 5872 5873 template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits> 5874 inline _LIBCPP_INLINE_VISIBILITY 5875 bool 5876 regex_search(const basic_string<_CharT, _ST, _SA>& __s, 5877 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m, 5878 const basic_regex<_CharT, _Traits>& __e, 5879 regex_constants::match_flag_type __flags = regex_constants::match_default) 5880 { 5881 match_results<const _CharT*> __mc; 5882 bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags); 5883 __m.__assign(__s.begin(), __s.end(), __mc, __flags & regex_constants::__no_update_pos); 5884 return __r; 5885 } 5886 5887 // regex_match 5888 5889 template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits> 5890 bool 5891 regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last, 5892 match_results<_BidirectionalIterator, _Allocator>& __m, 5893 const basic_regex<_CharT, _Traits>& __e, 5894 regex_constants::match_flag_type __flags = regex_constants::match_default) 5895 { 5896 bool __r = _VSTD::regex_search(__first, __last, __m, __e, 5897 __flags | regex_constants::match_continuous); 5898 if (__r) 5899 { 5900 __r = !__m.suffix().matched; 5901 if (!__r) 5902 __m.__matches_.clear(); 5903 } 5904 return __r; 5905 } 5906 5907 template <class _BidirectionalIterator, class _CharT, class _Traits> 5908 inline _LIBCPP_INLINE_VISIBILITY 5909 bool 5910 regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last, 5911 const basic_regex<_CharT, _Traits>& __e, 5912 regex_constants::match_flag_type __flags = regex_constants::match_default) 5913 { 5914 match_results<_BidirectionalIterator> __m; 5915 return _VSTD::regex_match(__first, __last, __m, __e, __flags); 5916 } 5917 5918 template <class _CharT, class _Allocator, class _Traits> 5919 inline _LIBCPP_INLINE_VISIBILITY 5920 bool 5921 regex_match(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m, 5922 const basic_regex<_CharT, _Traits>& __e, 5923 regex_constants::match_flag_type __flags = regex_constants::match_default) 5924 { 5925 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __m, __e, __flags); 5926 } 5927 5928 template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits> 5929 inline _LIBCPP_INLINE_VISIBILITY 5930 bool 5931 regex_match(const basic_string<_CharT, _ST, _SA>& __s, 5932 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m, 5933 const basic_regex<_CharT, _Traits>& __e, 5934 regex_constants::match_flag_type __flags = regex_constants::match_default) 5935 { 5936 return _VSTD::regex_match(__s.begin(), __s.end(), __m, __e, __flags); 5937 } 5938 5939 template <class _CharT, class _Traits> 5940 inline _LIBCPP_INLINE_VISIBILITY 5941 bool 5942 regex_match(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e, 5943 regex_constants::match_flag_type __flags = regex_constants::match_default) 5944 { 5945 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __e, __flags); 5946 } 5947 5948 template <class _ST, class _SA, class _CharT, class _Traits> 5949 inline _LIBCPP_INLINE_VISIBILITY 5950 bool 5951 regex_match(const basic_string<_CharT, _ST, _SA>& __s, 5952 const basic_regex<_CharT, _Traits>& __e, 5953 regex_constants::match_flag_type __flags = regex_constants::match_default) 5954 { 5955 return _VSTD::regex_match(__s.begin(), __s.end(), __e, __flags); 5956 } 5957 5958 // regex_iterator 5959 5960 template <class _BidirectionalIterator, 5961 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type, 5962 class _Traits = regex_traits<_CharT> > 5963 class _LIBCPP_VISIBLE regex_iterator 5964 { 5965 public: 5966 typedef basic_regex<_CharT, _Traits> regex_type; 5967 typedef match_results<_BidirectionalIterator> value_type; 5968 typedef ptrdiff_t difference_type; 5969 typedef const value_type* pointer; 5970 typedef const value_type& reference; 5971 typedef forward_iterator_tag iterator_category; 5972 5973 private: 5974 _BidirectionalIterator __begin_; 5975 _BidirectionalIterator __end_; 5976 const regex_type* __pregex_; 5977 regex_constants::match_flag_type __flags_; 5978 value_type __match_; 5979 5980 public: 5981 regex_iterator(); 5982 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, 5983 const regex_type& __re, 5984 regex_constants::match_flag_type __m = regex_constants::match_default); 5985 5986 bool operator==(const regex_iterator& __x) const; 5987 _LIBCPP_INLINE_VISIBILITY 5988 bool operator!=(const regex_iterator& __x) const {return !(*this == __x);} 5989 5990 _LIBCPP_INLINE_VISIBILITY 5991 reference operator*() const {return __match_;} 5992 _LIBCPP_INLINE_VISIBILITY 5993 pointer operator->() const {return &__match_;} 5994 5995 regex_iterator& operator++(); 5996 _LIBCPP_INLINE_VISIBILITY 5997 regex_iterator operator++(int) 5998 { 5999 regex_iterator __t(*this); 6000 ++(*this); 6001 return __t; 6002 } 6003 }; 6004 6005 template <class _BidirectionalIterator, class _CharT, class _Traits> 6006 regex_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_iterator() 6007 : __begin_(), __end_(), __pregex_(nullptr), __flags_(), __match_() 6008 { 6009 } 6010 6011 template <class _BidirectionalIterator, class _CharT, class _Traits> 6012 regex_iterator<_BidirectionalIterator, _CharT, _Traits>:: 6013 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, 6014 const regex_type& __re, regex_constants::match_flag_type __m) 6015 : __begin_(__a), 6016 __end_(__b), 6017 __pregex_(&__re), 6018 __flags_(__m) 6019 { 6020 _VSTD::regex_search(__begin_, __end_, __match_, *__pregex_, __flags_); 6021 } 6022 6023 template <class _BidirectionalIterator, class _CharT, class _Traits> 6024 bool 6025 regex_iterator<_BidirectionalIterator, _CharT, _Traits>:: 6026 operator==(const regex_iterator& __x) const 6027 { 6028 if (__match_.empty() && __x.__match_.empty()) 6029 return true; 6030 if (__match_.empty() || __x.__match_.empty()) 6031 return false; 6032 return __begin_ == __x.__begin_ && 6033 __end_ == __x.__end_ && 6034 __pregex_ == __x.__pregex_ && 6035 __flags_ == __x.__flags_ && 6036 __match_[0] == __x.__match_[0]; 6037 } 6038 6039 template <class _BidirectionalIterator, class _CharT, class _Traits> 6040 regex_iterator<_BidirectionalIterator, _CharT, _Traits>& 6041 regex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++() 6042 { 6043 __flags_ |= regex_constants::__no_update_pos; 6044 _BidirectionalIterator __start = __match_[0].second; 6045 if (__match_.length() == 0) 6046 { 6047 if (__start == __end_) 6048 { 6049 __match_ = value_type(); 6050 return *this; 6051 } 6052 else if (_VSTD::regex_search(__start, __end_, __match_, *__pregex_, 6053 __flags_ | regex_constants::match_not_null | 6054 regex_constants::match_continuous)) 6055 return *this; 6056 else 6057 ++__start; 6058 } 6059 __flags_ |= regex_constants::match_prev_avail; 6060 if (!_VSTD::regex_search(__start, __end_, __match_, *__pregex_, __flags_)) 6061 __match_ = value_type(); 6062 return *this; 6063 } 6064 6065 typedef regex_iterator<const char*> cregex_iterator; 6066 typedef regex_iterator<const wchar_t*> wcregex_iterator; 6067 typedef regex_iterator<string::const_iterator> sregex_iterator; 6068 typedef regex_iterator<wstring::const_iterator> wsregex_iterator; 6069 6070 // regex_token_iterator 6071 6072 template <class _BidirectionalIterator, 6073 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type, 6074 class _Traits = regex_traits<_CharT> > 6075 class _LIBCPP_VISIBLE regex_token_iterator 6076 { 6077 public: 6078 typedef basic_regex<_CharT, _Traits> regex_type; 6079 typedef sub_match<_BidirectionalIterator> value_type; 6080 typedef ptrdiff_t difference_type; 6081 typedef const value_type* pointer; 6082 typedef const value_type& reference; 6083 typedef forward_iterator_tag iterator_category; 6084 6085 private: 6086 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Position; 6087 6088 _Position __position_; 6089 const value_type* __result_; 6090 value_type __suffix_; 6091 ptrdiff_t _N_; 6092 vector<int> __subs_; 6093 6094 public: 6095 regex_token_iterator(); 6096 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, 6097 const regex_type& __re, int __submatch = 0, 6098 regex_constants::match_flag_type __m = 6099 regex_constants::match_default); 6100 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, 6101 const regex_type& __re, const vector<int>& __submatches, 6102 regex_constants::match_flag_type __m = 6103 regex_constants::match_default); 6104 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6105 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, 6106 const regex_type& __re, 6107 initializer_list<int> __submatches, 6108 regex_constants::match_flag_type __m = 6109 regex_constants::match_default); 6110 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6111 template <size_t _Np> 6112 regex_token_iterator(_BidirectionalIterator __a, 6113 _BidirectionalIterator __b, 6114 const regex_type& __re, 6115 const int (&__submatches)[_Np], 6116 regex_constants::match_flag_type __m = 6117 regex_constants::match_default); 6118 regex_token_iterator(const regex_token_iterator&); 6119 regex_token_iterator& operator=(const regex_token_iterator&); 6120 6121 bool operator==(const regex_token_iterator& __x) const; 6122 _LIBCPP_INLINE_VISIBILITY 6123 bool operator!=(const regex_token_iterator& __x) const {return !(*this == __x);} 6124 6125 _LIBCPP_INLINE_VISIBILITY 6126 const value_type& operator*() const {return *__result_;} 6127 _LIBCPP_INLINE_VISIBILITY 6128 const value_type* operator->() const {return __result_;} 6129 6130 regex_token_iterator& operator++(); 6131 _LIBCPP_INLINE_VISIBILITY 6132 regex_token_iterator operator++(int) 6133 { 6134 regex_token_iterator __t(*this); 6135 ++(*this); 6136 return __t; 6137 } 6138 6139 private: 6140 void __init(_BidirectionalIterator __a, _BidirectionalIterator __b); 6141 }; 6142 6143 template <class _BidirectionalIterator, class _CharT, class _Traits> 6144 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: 6145 regex_token_iterator() 6146 : __result_(nullptr), 6147 __suffix_(), 6148 _N_(0) 6149 { 6150 } 6151 6152 template <class _BidirectionalIterator, class _CharT, class _Traits> 6153 void 6154 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: 6155 __init(_BidirectionalIterator __a, _BidirectionalIterator __b) 6156 { 6157 if (__position_ != _Position()) 6158 { 6159 if (__subs_[_N_] == -1) 6160 __result_ = &__position_->prefix(); 6161 else 6162 __result_ = &(*__position_)[__subs_[_N_]]; 6163 } 6164 else if (__subs_[_N_] == -1) 6165 { 6166 __suffix_.matched = true; 6167 __suffix_.first = __a; 6168 __suffix_.second = __b; 6169 __result_ = &__suffix_; 6170 } 6171 else 6172 __result_ = nullptr; 6173 } 6174 6175 template <class _BidirectionalIterator, class _CharT, class _Traits> 6176 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: 6177 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, 6178 const regex_type& __re, int __submatch, 6179 regex_constants::match_flag_type __m) 6180 : __position_(__a, __b, __re, __m), 6181 _N_(0), 6182 __subs_(1, __submatch) 6183 { 6184 __init(__a, __b); 6185 } 6186 6187 template <class _BidirectionalIterator, class _CharT, class _Traits> 6188 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: 6189 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, 6190 const regex_type& __re, const vector<int>& __submatches, 6191 regex_constants::match_flag_type __m) 6192 : __position_(__a, __b, __re, __m), 6193 _N_(0), 6194 __subs_(__submatches) 6195 { 6196 __init(__a, __b); 6197 } 6198 6199 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6200 6201 template <class _BidirectionalIterator, class _CharT, class _Traits> 6202 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: 6203 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, 6204 const regex_type& __re, 6205 initializer_list<int> __submatches, 6206 regex_constants::match_flag_type __m) 6207 : __position_(__a, __b, __re, __m), 6208 _N_(0), 6209 __subs_(__submatches) 6210 { 6211 __init(__a, __b); 6212 } 6213 6214 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 6215 6216 template <class _BidirectionalIterator, class _CharT, class _Traits> 6217 template <size_t _Np> 6218 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: 6219 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, 6220 const regex_type& __re, 6221 const int (&__submatches)[_Np], 6222 regex_constants::match_flag_type __m) 6223 : __position_(__a, __b, __re, __m), 6224 _N_(0), 6225 __subs_(__submatches, __submatches + _Np) 6226 { 6227 __init(__a, __b); 6228 } 6229 6230 template <class _BidirectionalIterator, class _CharT, class _Traits> 6231 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: 6232 regex_token_iterator(const regex_token_iterator& __x) 6233 : __position_(__x.__position_), 6234 __result_(__x.__result_), 6235 __suffix_(__x.__suffix_), 6236 _N_(__x._N_), 6237 __subs_(__x.__subs_) 6238 { 6239 if (__x.__result_ == &__x.__suffix_) 6240 __result_ == &__suffix_; 6241 } 6242 6243 template <class _BidirectionalIterator, class _CharT, class _Traits> 6244 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>& 6245 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: 6246 operator=(const regex_token_iterator& __x) 6247 { 6248 if (this != &__x) 6249 { 6250 __position_ = __x.__position_; 6251 if (__x.__result_ == &__x.__suffix_) 6252 __result_ == &__suffix_; 6253 else 6254 __result_ = __x.__result_; 6255 __suffix_ = __x.__suffix_; 6256 _N_ = __x._N_; 6257 __subs_ = __x.__subs_; 6258 } 6259 return *this; 6260 } 6261 6262 template <class _BidirectionalIterator, class _CharT, class _Traits> 6263 bool 6264 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: 6265 operator==(const regex_token_iterator& __x) const 6266 { 6267 if (__result_ == nullptr && __x.__result_ == nullptr) 6268 return true; 6269 if (__result_ == &__suffix_ && __x.__result_ == &__x.__suffix_ && 6270 __suffix_ == __x.__suffix_) 6271 return true; 6272 if (__result_ == nullptr || __x.__result_ == nullptr) 6273 return false; 6274 if (__result_ == &__suffix_ || __x.__result_ == &__x.__suffix_) 6275 return false; 6276 return __position_ == __x.__position_ && _N_ == __x._N_ && 6277 __subs_ == __x.__subs_; 6278 } 6279 6280 template <class _BidirectionalIterator, class _CharT, class _Traits> 6281 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>& 6282 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++() 6283 { 6284 _Position __prev = __position_; 6285 if (__result_ == &__suffix_) 6286 __result_ = nullptr; 6287 else if (_N_ + 1 < __subs_.size()) 6288 { 6289 ++_N_; 6290 if (__subs_[_N_] == -1) 6291 __result_ = &__position_->prefix(); 6292 else 6293 __result_ = &(*__position_)[__subs_[_N_]]; 6294 } 6295 else 6296 { 6297 _N_ = 0; 6298 ++__position_; 6299 if (__position_ != _Position()) 6300 { 6301 if (__subs_[_N_] == -1) 6302 __result_ = &__position_->prefix(); 6303 else 6304 __result_ = &(*__position_)[__subs_[_N_]]; 6305 } 6306 else 6307 { 6308 if (_VSTD::find(__subs_.begin(), __subs_.end(), -1) != __subs_.end() 6309 && __prev->suffix().length() != 0) 6310 { 6311 __suffix_.matched = true; 6312 __suffix_.first = __prev->suffix().first; 6313 __suffix_.second = __prev->suffix().second; 6314 __result_ = &__suffix_; 6315 } 6316 else 6317 __result_ = nullptr; 6318 } 6319 } 6320 return *this; 6321 } 6322 6323 typedef regex_token_iterator<const char*> cregex_token_iterator; 6324 typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator; 6325 typedef regex_token_iterator<string::const_iterator> sregex_token_iterator; 6326 typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator; 6327 6328 // regex_replace 6329 6330 template <class _OutputIterator, class _BidirectionalIterator, 6331 class _Traits, class _CharT> 6332 _OutputIterator 6333 regex_replace(_OutputIterator __out, 6334 _BidirectionalIterator __first, _BidirectionalIterator __last, 6335 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt, 6336 regex_constants::match_flag_type __flags = regex_constants::match_default) 6337 { 6338 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Iter; 6339 _Iter __i(__first, __last, __e, __flags); 6340 _Iter __eof; 6341 if (__i == __eof) 6342 { 6343 if (!(__flags & regex_constants::format_no_copy)) 6344 __out = _VSTD::copy(__first, __last, __out); 6345 } 6346 else 6347 { 6348 sub_match<_BidirectionalIterator> __lm; 6349 for (size_t __len = char_traits<_CharT>::length(__fmt); __i != __eof; ++__i) 6350 { 6351 if (!(__flags & regex_constants::format_no_copy)) 6352 __out = _VSTD::copy(__i->prefix().first, __i->prefix().second, __out); 6353 __out = __i->format(__out, __fmt, __fmt + __len, __flags); 6354 __lm = __i->suffix(); 6355 if (__flags & regex_constants::format_first_only) 6356 break; 6357 } 6358 if (!(__flags & regex_constants::format_no_copy)) 6359 __out = _VSTD::copy(__lm.first, __lm.second, __out); 6360 } 6361 return __out; 6362 } 6363 6364 template <class _OutputIterator, class _BidirectionalIterator, 6365 class _Traits, class _CharT, class _ST, class _SA> 6366 inline _LIBCPP_INLINE_VISIBILITY 6367 _OutputIterator 6368 regex_replace(_OutputIterator __out, 6369 _BidirectionalIterator __first, _BidirectionalIterator __last, 6370 const basic_regex<_CharT, _Traits>& __e, 6371 const basic_string<_CharT, _ST, _SA>& __fmt, 6372 regex_constants::match_flag_type __flags = regex_constants::match_default) 6373 { 6374 return _VSTD::regex_replace(__out, __first, __last, __e, __fmt.c_str(), __flags); 6375 } 6376 6377 template <class _Traits, class _CharT, class _ST, class _SA, class _FST, 6378 class _FSA> 6379 inline _LIBCPP_INLINE_VISIBILITY 6380 basic_string<_CharT, _ST, _SA> 6381 regex_replace(const basic_string<_CharT, _ST, _SA>& __s, 6382 const basic_regex<_CharT, _Traits>& __e, 6383 const basic_string<_CharT, _FST, _FSA>& __fmt, 6384 regex_constants::match_flag_type __flags = regex_constants::match_default) 6385 { 6386 basic_string<_CharT, _ST, _SA> __r; 6387 _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e, 6388 __fmt.c_str(), __flags); 6389 return __r; 6390 } 6391 6392 template <class _Traits, class _CharT, class _ST, class _SA> 6393 inline _LIBCPP_INLINE_VISIBILITY 6394 basic_string<_CharT, _ST, _SA> 6395 regex_replace(const basic_string<_CharT, _ST, _SA>& __s, 6396 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt, 6397 regex_constants::match_flag_type __flags = regex_constants::match_default) 6398 { 6399 basic_string<_CharT, _ST, _SA> __r; 6400 _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e, 6401 __fmt, __flags); 6402 return __r; 6403 } 6404 6405 template <class _Traits, class _CharT, class _ST, class _SA> 6406 inline _LIBCPP_INLINE_VISIBILITY 6407 basic_string<_CharT> 6408 regex_replace(const _CharT* __s, 6409 const basic_regex<_CharT, _Traits>& __e, 6410 const basic_string<_CharT, _ST, _SA>& __fmt, 6411 regex_constants::match_flag_type __flags = regex_constants::match_default) 6412 { 6413 basic_string<_CharT> __r; 6414 _VSTD::regex_replace(back_inserter(__r), __s, 6415 __s + char_traits<_CharT>::length(__s), __e, 6416 __fmt.c_str(), __flags); 6417 return __r; 6418 } 6419 6420 template <class _Traits, class _CharT> 6421 inline _LIBCPP_INLINE_VISIBILITY 6422 basic_string<_CharT> 6423 regex_replace(const _CharT* __s, 6424 const basic_regex<_CharT, _Traits>& __e, 6425 const _CharT* __fmt, 6426 regex_constants::match_flag_type __flags = regex_constants::match_default) 6427 { 6428 basic_string<_CharT> __r; 6429 _VSTD::regex_replace(back_inserter(__r), __s, 6430 __s + char_traits<_CharT>::length(__s), __e, 6431 __fmt, __flags); 6432 return __r; 6433 } 6434 6435 _LIBCPP_END_NAMESPACE_STD 6436 6437 #endif // _LIBCPP_REGEX 6438