30#pragma warning(disable: 4100)
40 constexpr int match_default = 0;
41 constexpr int match_case_insensitive = 0x1;
42 constexpr int match_multiline = 0x2;
51 basic_tester(_In_
const std::locale& locale = std::locale()) : m_locale(locale) {}
55 _In_reads_or_z_(end)
const T* text,
56 _In_
size_t start = 0,
57 _In_
size_t end = (
size_t)-1,
58 _In_
int flags = match_default)
60 for (
size_t i = start; i < end && text[i]; i++)
61 if (match(text, i, end, flags))
67 _In_reads_or_z_(end)
const T* text,
68 _In_
size_t start = 0,
69 _In_
size_t end = (
size_t)-1,
70 _In_
int flags = match_default) = 0;
72 template<
class _Traits,
class _Ax>
74 const std::basic_string<T, _Traits, _Ax>& text,
75 _In_
size_t start = 0,
76 _In_
size_t end = (
size_t)-1,
77 _In_
int flags = match_default)
79 return match(text.c_str(), start, std::min<size_t>(end, text.size()), flags);
82 virtual void invalidate()
90 const wchar_t* next_sgml_cp(_In_
const char* text, _In_
size_t start, _In_
size_t end, _Out_
size_t& chr_end, _Out_
wchar_t(&buf)[3])
92 if (text[start] ==
'&') {
94 const auto& ctype = std::use_facet<std::ctype<T>>(m_locale);
95 for (chr_end = start + 1;; chr_end++) {
96 if (chr_end >= end || text[chr_end] == 0) {
100 if (text[chr_end] ==
';') {
102 size_t n = chr_end - start - 1;
103 if (n >= 2 && text[start + 1] ==
'#') {
106 if (text[start + 2] ==
'x' || text[start + 2] ==
'X')
107 unicode = strtou32(text + start + 3, n - 2,
nullptr, 16);
109 unicode = strtou32(text + start + 2, n - 1,
nullptr, 10);
111 if (unicode < 0x10000) {
112 buf[0] = (wchar_t)unicode;
116 ucs4_to_surrogate_pair(buf, unicode);
120 buf[0] = (wchar_t)unicode;
126 const wchar_t* entity_w = sgml2uni(text + start + 1, n);
134 else if (text[chr_end] ==
'&' || ctype.is(ctype.space, text[chr_end])) {
140 buf[0] = text[start];
151 const std::locale& m_locale;
171 _In_reads_or_z_(end)
const T* text,
172 _In_
size_t start = 0,
173 _In_
size_t end = (
size_t)-1,
174 _In_
int flags = match_default)
176 assert(text || start >= end);
177 if (start < end && text[start]) {
203 _In_reads_or_z_(end)
const T* text,
204 _In_
size_t start = 0,
205 _In_
size_t end = (
size_t)-1,
206 _In_
int flags = match_default)
208 assert(text || start >= end);
209 if (start < end && text[start]) {
233 _In_reads_or_z_(end)
const char* text,
234 _In_
size_t start = 0,
235 _In_
size_t end = (
size_t)-1,
236 _In_
int flags = match_default)
238 assert(text || start >= end);
239 if (start < end && text[start]) {
240 if (text[start] ==
'&') {
242 const auto& ctype = std::use_facet<std::ctype<char>>(m_locale);
268 basic_cu(T chr,
bool invert =
false, _In_
const std::locale& locale = std::locale()) :
275 _In_reads_or_z_(end)
const T* text,
276 _In_
size_t start = 0,
277 _In_
size_t end = (
size_t)-1,
278 _In_
int flags = match_default)
280 assert(text || start >= end);
281 if (start < end && text[start]) {
283 if (flags & match_case_insensitive) {
284 const auto& ctype = std::use_facet<std::ctype<T>>(m_locale);
285 r = ctype.tolower(text[start]) == ctype.tolower(m_chr);
288 r = text[start] == m_chr;
289 if (r && !m_invert || !r && m_invert) {
317 sgml_cp(
const char* chr,
size_t count = (
size_t)-1,
bool invert =
false, _In_
const std::locale& locale = std::locale()) :
321 assert(chr || !count);
324 m_chr.assign(count ? next_sgml_cp(chr, 0, count, chr_end, buf) : L
"");
328 _In_reads_or_z_(end)
const char* text,
329 _In_
size_t start = 0,
330 _In_
size_t end = (
size_t)-1,
331 _In_
int flags = match_default)
333 assert(text || start >= end);
334 if (start < end && text[start]) {
336 const wchar_t* chr = next_sgml_cp(text, start, end,
interval.
end, buf);
337 bool r = ((flags & match_case_insensitive) ?
338 stdex::strnicmp(chr, (
size_t)-1, m_chr.c_str(), m_chr.size(), m_locale) :
339 stdex::strncmp(chr, (
size_t)-1, m_chr.c_str(), m_chr.size())) == 0;
340 if (r && !m_invert || !r && m_invert) {
361 basic_space_cu(
bool invert =
false, _In_
const std::locale& locale = std::locale()) :
367 _In_reads_or_z_(end)
const T* text,
368 _In_
size_t start = 0,
369 _In_
size_t end = (
size_t)-1,
370 _In_
int flags = match_default)
372 assert(text || start >= end);
373 if (start < end && text[start]) {
375 ((flags & match_multiline) || !islbreak(text[start])) &&
376 std::use_facet<std::ctype<T>>(m_locale).is(std::ctype_base::space, text[start]);
377 if (r && !m_invert || !r && m_invert) {
404 sgml_space_cp(_In_
bool invert =
false, _In_
const std::locale& locale = std::locale()) :
409 _In_reads_or_z_(end)
const char* text,
410 _In_
size_t start = 0,
411 _In_
size_t end = (
size_t)-1,
412 _In_
int flags = match_default)
414 assert(text || start >= end);
415 if (start < end && text[start]) {
417 const wchar_t* chr = next_sgml_cp(text, start, end,
interval.
end, buf);
418 const wchar_t* chr_end = chr + stdex::strlen(chr);
420 ((flags & match_multiline) || !islbreak(chr, (
size_t)-1)) &&
421 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::space, chr, chr_end) == chr_end;
422 if (r && !m_invert || !r && m_invert) {
440 basic_punct_cu(
bool invert =
false, _In_
const std::locale& locale = std::locale()) :
446 _In_reads_or_z_(end)
const T* text,
447 _In_
size_t start = 0,
448 _In_
size_t end = (
size_t)-1,
449 _In_
int flags = match_default)
451 assert(text || start >= end);
452 if (start < end && text[start]) {
453 bool r = std::use_facet<std::ctype<T>>(m_locale).is(std::ctype_base::punct, text[start]);
454 if (r && !m_invert || !r && m_invert) {
482 _In_reads_or_z_(end)
const char* text,
483 _In_
size_t start = 0,
484 _In_
size_t end = (
size_t)-1,
485 _In_
int flags = match_default)
487 assert(text || start >= end);
488 if (start < end && text[start]) {
490 const wchar_t* chr = next_sgml_cp(text, start, end,
interval.
end, buf);
491 const wchar_t* chr_end = chr + stdex::strlen(chr);
492 bool r = std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::punct, chr, chr_end) == chr_end;
493 if (r && !m_invert || !r && m_invert) {
516 _In_reads_or_z_(end)
const T* text,
517 _In_
size_t start = 0,
518 _In_
size_t end = (
size_t)-1,
519 _In_
int flags = match_default)
521 assert(text || start >= end);
522 if (start < end && text[start]) {
524 ((flags & match_multiline) || !islbreak(text[start])) &&
525 std::use_facet<std::ctype<T>>(m_locale).is(std::ctype_base::space | std::ctype_base::punct, text[start]);
526 if (r && !m_invert || !r && m_invert) {
554 _In_reads_or_z_(end)
const char* text,
555 _In_
size_t start = 0,
556 _In_
size_t end = (
size_t)-1,
557 _In_
int flags = match_default)
559 assert(text || start >= end);
560 if (start < end && text[start]) {
562 const wchar_t* chr = next_sgml_cp(text, start, end,
interval.
end, buf);
563 const wchar_t* chr_end = chr + stdex::strlen(chr);
565 ((flags & match_multiline) || !islbreak(chr, (
size_t)-1)) &&
566 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::space | std::ctype_base::punct, chr, chr_end) == chr_end;
567 if (r && !m_invert || !r && m_invert) {
584 basic_bol(
bool invert =
false) : m_invert(invert) {}
587 _In_reads_or_z_(end)
const T* text,
588 _In_
size_t start = 0,
589 _In_
size_t end = (
size_t)-1,
590 _In_
int flags = match_default)
592 assert(text || start >= end);
593 bool r = start == 0 || start <= end && islbreak(text[start - 1]);
594 if (r && !m_invert || !r && m_invert) {
622 basic_eol(
bool invert =
false) : m_invert(invert) {}
625 _In_reads_or_z_(end)
const T* text,
626 _In_
size_t start = 0,
627 _In_
size_t end = (
size_t)-1,
628 _In_
int flags = match_default)
630 assert(text || start >= end);
631 bool r = islbreak(text[start]);
632 if (r && !m_invert || !r && m_invert) {
657 basic_set(
bool invert =
false, _In_
const std::locale& locale = std::locale()) :
659 hit_offset((
size_t)-1),
664 _In_reads_or_z_(end)
const T* text,
665 _In_
size_t start = 0,
666 _In_
size_t end = (
size_t)-1,
667 _In_
int flags = match_default) = 0;
669 virtual void invalidate()
671 hit_offset = (size_t)-1;
690 _In_reads_or_z_(count)
const T* set,
691 _In_
size_t count = (
size_t)-1,
692 _In_
bool invert =
false,
693 _In_
const std::locale& locale = std::locale()) :
697 m_set.assign(set, set + stdex::strnlen(set, count));
701 _In_reads_or_z_(end)
const T* text,
702 _In_
size_t start = 0,
703 _In_
size_t end = (
size_t)-1,
704 _In_
int flags = match_default)
706 assert(text || start >= end);
707 if (start < end && text[start]) {
708 const T* set = m_set.c_str();
709 const T* r = (flags & match_case_insensitive) ?
710 stdex::strnichr(set, text[start], m_set.size(), m_locale) :
711 stdex::strnchr(set, text[start], m_set.size());
712 if (r && !m_invert || !r && m_invert) {
713 hit_offset = r ? r - set : (size_t)-1;
718 hit_offset = (size_t)-1;
724 std::basic_string<T> m_set;
741 sgml_cp_set(
const char* set,
size_t count = (
size_t)-1,
bool invert =
false, _In_
const std::locale& locale = std::locale()) :
745 m_set = sgml2str(set, count);
749 _In_reads_or_z_(end)
const char* text,
750 _In_
size_t start = 0,
751 _In_
size_t end = (
size_t)-1,
752 _In_
int flags = match_default)
754 assert(text || start >= end);
755 if (start < end && text[start]) {
757 const wchar_t* chr = next_sgml_cp(text, start, end,
interval.
end, buf);
758 const wchar_t* set = m_set.c_str();
759 const wchar_t* r = (flags & match_case_insensitive) ?
760 stdex::strnistr(set, chr, m_set.size(), m_locale) :
761 stdex::strnstr(set, chr, m_set.size());
762 if (r && !m_invert || !r && m_invert) {
763 hit_offset = r ? r - set : (size_t)-1;
768 hit_offset = (size_t)-1;
785 _In_reads_or_z_(count)
const T* str,
786 _In_
size_t count = (
size_t)-1,
787 _In_
const std::locale& locale = std::locale()) :
789 m_str(str, str + stdex::strnlen(str, count))
793 _In_reads_or_z_(end)
const T* text,
794 _In_
size_t start = 0,
795 _In_
size_t end = (
size_t)-1,
796 _In_
int flags = match_default)
798 assert(text || start >= end);
801 n = std::min<size_t>(end - start, m);
802 bool r = ((flags & match_case_insensitive) ?
803 stdex::strnicmp(text + start, n, m_str.c_str(), m, m_locale) :
804 stdex::strncmp(text + start, n, m_str.c_str(), m)) == 0;
814 std::basic_string<T> m_str;
831 sgml_string(
const char* str,
size_t count = (
size_t)-1, _In_
const std::locale& locale = std::locale()) :
833 m_str(sgml2str(str, count))
837 _In_reads_or_z_(end)
const char* text,
838 _In_
size_t start = 0,
839 _In_
size_t end = (
size_t)-1,
840 _In_
int flags = match_default)
842 assert(text || start >= end);
843 const wchar_t* str = m_str.c_str();
844 const bool case_insensitive = flags & match_case_insensitive ? true :
false;
845 const auto& ctype = std::use_facet<std::ctype<wchar_t>>(m_locale);
857 for (; *chr; ++str, ++chr) {
859 (case_insensitive ? ctype.tolower(*str) != ctype.tolower(*chr) : *str != *chr))
887 _In_reads_or_z_(end)
const T* text,
888 _In_
size_t start = 0,
889 _In_
size_t end = (
size_t)-1,
890 _In_
int flags = match_default)
892 assert(text || start >= end);
894 for (
size_t i = 0; ; i++) {
913 std::shared_ptr<basic_tester<T>>
m_el;
941 _In_
const std::locale& locale = std::locale()) :
944 assert(el || !count);
945 m_collection.reserve(count);
946 for (
size_t i = 0; i < count; i++)
947 m_collection.push_back(el[i]);
952 _In_
const std::locale& locale = std::locale()) :
954 m_collection(std::move(collection))
957 virtual void invalidate()
959 for (
auto& el: m_collection)
965 std::vector<std::shared_ptr<basic_tester<T>>> m_collection;
976 _In_count_(count)
const std::shared_ptr<
basic_tester<T>>* el =
nullptr,
977 _In_
size_t count = 0,
978 _In_
const std::locale& locale = std::locale()) :
984 _In_
const std::locale& locale = std::locale()) :
989 _In_reads_or_z_(end)
const T* text,
990 _In_
size_t start = 0,
991 _In_
size_t end = (
size_t)-1,
992 _In_
int flags = match_default)
994 assert(text || start >= end);
996 for (
auto i = m_collection.begin(); i != m_collection.end(); ++i) {
997 if (!(*i)->match(text,
interval.
end, end, flags)) {
998 for (++i; i != m_collection.end(); ++i)
1028 hit_offset((
size_t)-1)
1033 _In_count_(count)
const std::shared_ptr<
basic_tester<T>>* el =
nullptr,
1034 _In_
size_t count = 0,
1035 _In_
const std::locale& locale = std::locale()) :
1037 hit_offset((
size_t)-1)
1042 _In_
const std::locale& locale = std::locale()) :
1044 hit_offset((
size_t)-1)
1048 _In_reads_or_z_(end)
const T* text,
1049 _In_
size_t start = 0,
1050 _In_
size_t end = (
size_t)-1,
1051 _In_
int flags = match_default)
1053 assert(text || start >= end);
1055 for (
auto i = m_collection.begin(); i != m_collection.end(); ++i, ++hit_offset) {
1056 if ((*i)->match(text, start, end, flags)) {
1058 for (++i; i != m_collection.end(); ++i)
1063 hit_offset = (size_t)-1;
1068 virtual void invalidate()
1070 hit_offset = (size_t)-1;
1090 template <
class T,
class T_tester = basic_
string<T>>
1095 _In_reads_(count)
const T* str_z =
nullptr,
1096 _In_
size_t count = 0,
1097 _In_
const std::locale& locale = std::locale()) :
1100 build(str_z, count);
1107 va_start(params, str);
1116 va_start(params, str);
1122 void build(_In_reads_(count)
const T* str_z, _In_
size_t count)
1124 assert(str_z || !count);
1129 offset < count && str_z[offset];
1130 offset += stdex::strnlen(str_z + offset, count - offset) + 1, ++n);
1131 m_collection.reserve(n);
1134 offset < count && str_z[offset];
1135 offset += stdex::strnlen(str_z + offset, count - offset) + 1)
1136 m_collection.push_back(std::move(std::make_shared<T_tester>(str_z + offset, count - offset, m_locale)));
1140 void build(_In_z_
const T* str, _In_ va_list params)
1144 m_collection.push_back(std::move(std::make_shared<T_tester>(str, (
size_t)-1, m_locale)));
1145 (p = va_arg(params,
const T*)) !=
nullptr;
1146 m_collection.push_back(std::move(std::make_shared<T_tester>(p, (
size_t)-1, m_locale))));
1167 _In_count_(count)
const std::shared_ptr<
basic_tester<T>>* el =
nullptr,
1168 _In_
size_t count = 0,
1169 _In_
const std::locale& locale = std::locale()) :
1175 _In_
const std::locale& locale = std::locale()) :
1180 _In_reads_or_z_(end)
const T* text,
1181 _In_
size_t start = 0,
1182 _In_
size_t end = (
size_t)-1,
1183 _In_
int flags = match_default)
1185 assert(text || start >= end);
1186 for (
auto& el: m_collection)
1188 if (match_recursively(text, start, end, flags)) {
1197 bool match_recursively(
1198 _In_reads_or_z_(end)
const T* text,
1199 _In_
size_t start = 0,
1200 _In_
size_t end = (
size_t)-1,
1201 _In_
int flags = match_default)
1203 bool all_matched =
true;
1204 for (
auto& el: m_collection) {
1205 if (!el->interval) {
1207 all_matched =
false;
1208 if (el->match(text, start, end, flags)) {
1210 if (match_recursively(text, el->interval.end, end, flags)) {
1242 basic_integer(_In_
const std::locale& locale = std::locale()) :
1247 virtual void invalidate()
1275 _In_
const std::locale& locale = std::locale()) :
1290 _In_reads_or_z_(end)
const T* text,
1291 _In_
size_t start = 0,
1292 _In_
size_t end = (
size_t)-1,
1293 _In_
int flags = match_default)
1295 assert(text || start >= end);
1298 if (m_digit_0->match(text,
interval.
end, end, flags)) { dig = 0;
interval.
end = m_digit_0->interval.end; }
1299 else if (m_digit_1->match(text,
interval.
end, end, flags)) { dig = 1;
interval.
end = m_digit_1->interval.end; }
1300 else if (m_digit_2->match(text,
interval.
end, end, flags)) { dig = 2;
interval.
end = m_digit_2->interval.end; }
1301 else if (m_digit_3->match(text,
interval.
end, end, flags)) { dig = 3;
interval.
end = m_digit_3->interval.end; }
1302 else if (m_digit_4->match(text,
interval.
end, end, flags)) { dig = 4;
interval.
end = m_digit_4->interval.end; }
1303 else if (m_digit_5->match(text,
interval.
end, end, flags)) { dig = 5;
interval.
end = m_digit_5->interval.end; }
1304 else if (m_digit_6->match(text,
interval.
end, end, flags)) { dig = 6;
interval.
end = m_digit_6->interval.end; }
1305 else if (m_digit_7->match(text,
interval.
end, end, flags)) { dig = 7;
interval.
end = m_digit_7->interval.end; }
1306 else if (m_digit_8->match(text,
interval.
end, end, flags)) { dig = 8;
interval.
end = m_digit_8->interval.end; }
1307 else if (m_digit_9->match(text,
interval.
end, end, flags)) { dig = 9;
interval.
end = m_digit_9->interval.end; }
1320 std::shared_ptr<basic_tester<T>>
1352 _In_
const std::locale& locale = std::locale()) :
1357 m_separator(separator)
1361 _In_reads_or_z_(end)
const T* text,
1362 _In_
size_t start = 0,
1363 _In_
size_t end = (
size_t)-1,
1364 _In_
int flags = match_default)
1366 assert(text || start >= end);
1367 if (m_digits->match(text, start, end, flags)) {
1369 value = m_digits->value;
1374 if (m_digits->interval.size() <= 3) {
1376 size_t hit_offset = (size_t)-1;
1377 while (m_separator->match(text,
interval.
end, end, flags) &&
1378 (hit_offset == (size_t)-1 || hit_offset == m_separator->hit_offset) &&
1379 m_digits->match(text, m_separator->interval.end, end, flags) &&
1380 m_digits->interval.size() == 3)
1387 hit_offset = m_separator->hit_offset;
1398 virtual void invalidate()
1410 std::shared_ptr<basic_integer10<T>> m_digits;
1411 std::shared_ptr<basic_set<T>> m_separator;
1447 _In_
const std::locale& locale = std::locale()) :
1459 m_digit_10(digit_10),
1460 m_digit_11(digit_11),
1461 m_digit_12(digit_12),
1462 m_digit_13(digit_13),
1463 m_digit_14(digit_14),
1464 m_digit_15(digit_15)
1468 _In_reads_or_z_(end)
const T* text,
1469 _In_
size_t start = 0,
1470 _In_
size_t end = (
size_t)-1,
1471 _In_
int flags = match_default)
1473 assert(text || start >= end);
1476 if (m_digit_0->match(text,
interval.
end, end, flags)) { dig = 0;
interval.
end = m_digit_0->interval.end; }
1477 else if (m_digit_1->match(text,
interval.
end, end, flags)) { dig = 1;
interval.
end = m_digit_1->interval.end; }
1478 else if (m_digit_2->match(text,
interval.
end, end, flags)) { dig = 2;
interval.
end = m_digit_2->interval.end; }
1479 else if (m_digit_3->match(text,
interval.
end, end, flags)) { dig = 3;
interval.
end = m_digit_3->interval.end; }
1480 else if (m_digit_4->match(text,
interval.
end, end, flags)) { dig = 4;
interval.
end = m_digit_4->interval.end; }
1481 else if (m_digit_5->match(text,
interval.
end, end, flags)) { dig = 5;
interval.
end = m_digit_5->interval.end; }
1482 else if (m_digit_6->match(text,
interval.
end, end, flags)) { dig = 6;
interval.
end = m_digit_6->interval.end; }
1483 else if (m_digit_7->match(text,
interval.
end, end, flags)) { dig = 7;
interval.
end = m_digit_7->interval.end; }
1484 else if (m_digit_8->match(text,
interval.
end, end, flags)) { dig = 8;
interval.
end = m_digit_8->interval.end; }
1485 else if (m_digit_9->match(text,
interval.
end, end, flags)) { dig = 9;
interval.
end = m_digit_9->interval.end; }
1486 else if (m_digit_10->match(text,
interval.
end, end, flags)) { dig = 10;
interval.
end = m_digit_10->interval.end; }
1487 else if (m_digit_11->match(text,
interval.
end, end, flags)) { dig = 11;
interval.
end = m_digit_11->interval.end; }
1488 else if (m_digit_12->match(text,
interval.
end, end, flags)) { dig = 12;
interval.
end = m_digit_12->interval.end; }
1489 else if (m_digit_13->match(text,
interval.
end, end, flags)) { dig = 13;
interval.
end = m_digit_13->interval.end; }
1490 else if (m_digit_14->match(text,
interval.
end, end, flags)) { dig = 14;
interval.
end = m_digit_14->interval.end; }
1491 else if (m_digit_15->match(text,
interval.
end, end, flags)) { dig = 15;
interval.
end = m_digit_15->interval.end; }
1504 std::shared_ptr<basic_tester<T>>
1549 _In_
const std::locale& locale = std::locale()) :
1553 m_digit_10(digit_10),
1554 m_digit_50(digit_50),
1555 m_digit_100(digit_100),
1556 m_digit_500(digit_500),
1557 m_digit_1000(digit_1000),
1558 m_digit_5000(digit_5000),
1559 m_digit_10000(digit_10000)
1563 _In_reads_or_z_(end)
const T* text,
1564 _In_
size_t start = 0,
1565 _In_
size_t end = (
size_t)-1,
1566 _In_
int flags = match_default)
1568 assert(text || start >= end);
1570 dig[5] = { (size_t)-1, (
size_t)-1, (size_t)-1, (
size_t)-1, (size_t)-1 },
1574 if (m_digit_1 && m_digit_1->match(text,
interval.
end, end, flags)) { dig[0] = 1; end2 = m_digit_1->interval.end; }
1575 else if (m_digit_5 && m_digit_5->match(text,
interval.
end, end, flags)) { dig[0] = 5; end2 = m_digit_5->interval.end; }
1576 else if (m_digit_10 && m_digit_10->match(text,
interval.
end, end, flags)) { dig[0] = 10; end2 = m_digit_10->interval.end; }
1577 else if (m_digit_50 && m_digit_50->match(text,
interval.
end, end, flags)) { dig[0] = 50; end2 = m_digit_50->interval.end; }
1578 else if (m_digit_100 && m_digit_100->match(text,
interval.
end, end, flags)) { dig[0] = 100; end2 = m_digit_100->interval.end; }
1579 else if (m_digit_500 && m_digit_500->match(text,
interval.
end, end, flags)) { dig[0] = 500; end2 = m_digit_500->interval.end; }
1580 else if (m_digit_1000 && m_digit_1000->match(text,
interval.
end, end, flags)) { dig[0] = 1000; end2 = m_digit_1000->interval.end; }
1581 else if (m_digit_5000 && m_digit_5000->match(text,
interval.
end, end, flags)) { dig[0] = 5000; end2 = m_digit_5000->interval.end; }
1582 else if (m_digit_10000 && m_digit_10000->match(text,
interval.
end, end, flags)) { dig[0] = 10000; end2 = m_digit_10000->interval.end; }
1586 if (dig[4] == (
size_t)-1) dig[4] = dig[0];
1588 if (dig[3] == dig[2] && dig[2] == dig[1] && dig[1] == dig[0] && dig[0] != dig[4]) {
1592 if (dig[0] <= dig[1]) {
1597 dig[1] == 1 && (dig[0] == 5 || dig[0] == 10) ||
1598 dig[1] == 10 && (dig[0] == 50 || dig[0] == 100) ||
1599 dig[1] == 100 && (dig[0] == 500 || dig[0] == 1000) ||
1600 dig[1] == 1000 && (dig[0] == 5000 || dig[0] == 10000))
1603 if (dig[2] < dig[0]) {
1627 std::shared_ptr<basic_tester<T>>
1659 _In_
const std::locale& locale = std::locale()) :
1661 numerator(_numerator),
1662 fraction_line(_fraction_line),
1663 denominator(_denominator)
1667 _In_reads_or_z_(end)
const T* text,
1668 _In_
size_t start = 0,
1669 _In_
size_t end = (
size_t)-1,
1670 _In_
int flags = match_default)
1672 assert(text || start >= end);
1673 if (numerator->match(text, start, end, flags) &&
1674 fraction_line->match(text, numerator->interval.end, end, flags) &&
1675 denominator->match(text, fraction_line->interval.end, end, flags))
1681 numerator->invalidate();
1682 fraction_line->invalidate();
1683 denominator->invalidate();
1688 virtual void invalidate()
1690 numerator->invalidate();
1691 fraction_line->invalidate();
1692 denominator->invalidate();
1697 std::shared_ptr<basic_tester<T>> numerator;
1698 std::shared_ptr<basic_tester<T>> fraction_line;
1699 std::shared_ptr<basic_tester<T>> denominator;
1723 _In_
const std::locale& locale = std::locale()) :
1726 separator(_separator),
1732 _In_reads_or_z_(end)
const T* text,
1733 _In_
size_t start = 0,
1734 _In_
size_t end = (
size_t)-1,
1735 _In_
int flags = match_default)
1737 assert(text || start >= end);
1745 const int space_match_flags = flags & ~match_multiline;
1746 for (; m_space->match(text,
interval.
end, end, space_match_flags);
interval.
end = m_space->interval.end);
1748 if (separator->match(text,
interval.
end, end, flags))
1753 for (; m_space->match(text,
interval.
end, end, space_match_flags);
interval.
end = m_space->interval.end);
1765 separator->invalidate();
1766 guest->invalidate();
1771 virtual void invalidate()
1774 separator->invalidate();
1775 guest->invalidate();
1780 std::shared_ptr<basic_tester<T>> home;
1781 std::shared_ptr<basic_tester<T>> separator;
1782 std::shared_ptr<basic_tester<T>> guest;
1785 std::shared_ptr<basic_tester<T>> m_space;
1809 _In_
const std::locale& locale = std::locale()) :
1818 _In_reads_or_z_(end)
const T* text,
1819 _In_
size_t start = 0,
1820 _In_
size_t end = (
size_t)-1,
1821 _In_
int flags = match_default)
1823 assert(text || start >= end);
1858 virtual void invalidate()
1897 _In_
const std::locale& locale = std::locale()) :
1908 _In_reads_or_z_(end)
const T* text,
1909 _In_
size_t start = 0,
1910 _In_
size_t end = (
size_t)-1,
1911 _In_
int flags = match_default)
1913 assert(text || start >= end);
1938 const int space_match_flags = flags & ~match_multiline;
1940 m_space->match(text,
integer->interval.end, end, space_match_flags))
1979 virtual void invalidate()
1997 std::shared_ptr<basic_tester<T>> m_space;
2027 _In_
const std::locale& locale = std::locale()) :
2039 value(std::numeric_limits<double>::quiet_NaN())
2043 _In_reads_or_z_(end)
const T* text,
2044 _In_
size_t start = 0,
2045 _In_
size_t end = (
size_t)-1,
2046 _In_
int flags = match_default)
2048 assert(text || start >= end);
2083 if (!
integer->interval.empty() &&
2129 double e = (double)
exponent->value;
2132 value *= pow(10.0, e);
2139 virtual void invalidate()
2151 value = std::numeric_limits<double>::quiet_NaN();
2193 _In_
const std::locale& locale = std::locale()) :
2205 _In_reads_or_z_(end)
const T* text,
2206 _In_
size_t start = 0,
2207 _In_
size_t end = (
size_t)-1,
2208 _In_
int flags = match_default)
2210 assert(text || start >= end);
2257 if (
integer->interval.empty() &&
2276 virtual void invalidate()
2278 if (positive_sign) positive_sign->invalidate();
2279 if (negative_sign) negative_sign->invalidate();
2280 if (special_sign) special_sign->invalidate();
2281 currency->invalidate();
2282 integer->invalidate();
2283 decimal_separator->invalidate();
2284 decimal->invalidate();
2326 _In_
const std::locale& locale = std::locale()) :
2338 m_separator(separator)
2344 _In_reads_or_z_(end)
const T* text,
2345 _In_
size_t start = 0,
2346 _In_
size_t end = (
size_t)-1,
2347 _In_
int flags = match_default)
2349 assert(text || start >= end);
2354 for (i = 0; i < 4; i++) {
2356 if (m_separator->match(text,
interval.
end, end, flags))
2363 bool is_empty =
true;
2366 size_t dig, digit_end;
2367 if (m_digit_0->match(text,
interval.
end, end, flags)) { dig = 0; digit_end = m_digit_0->interval.end; }
2368 else if (m_digit_1->match(text,
interval.
end, end, flags)) { dig = 1; digit_end = m_digit_1->interval.end; }
2369 else if (m_digit_2->match(text,
interval.
end, end, flags)) { dig = 2; digit_end = m_digit_2->interval.end; }
2370 else if (m_digit_3->match(text,
interval.
end, end, flags)) { dig = 3; digit_end = m_digit_3->interval.end; }
2371 else if (m_digit_4->match(text,
interval.
end, end, flags)) { dig = 4; digit_end = m_digit_4->interval.end; }
2372 else if (m_digit_5->match(text,
interval.
end, end, flags)) { dig = 5; digit_end = m_digit_5->interval.end; }
2373 else if (m_digit_6->match(text,
interval.
end, end, flags)) { dig = 6; digit_end = m_digit_6->interval.end; }
2374 else if (m_digit_7->match(text,
interval.
end, end, flags)) { dig = 7; digit_end = m_digit_7->interval.end; }
2375 else if (m_digit_8->match(text,
interval.
end, end, flags)) { dig = 8; digit_end = m_digit_8->interval.end; }
2376 else if (m_digit_9->match(text,
interval.
end, end, flags)) { dig = 9; digit_end = m_digit_9->interval.end; }
2378 size_t x_n = x * 10 + dig;
2390 value.s_addr = (value.s_addr << 8) | (uint8_t)x;
2399 components[0].start = 1;
2400 components[0].end = 0;
2401 components[1].start = 1;
2402 components[1].end = 0;
2403 components[2].start = 1;
2404 components[2].end = 0;
2405 components[3].start = 1;
2406 components[3].end = 0;
2412 virtual void invalidate()
2414 components[0].start = 1;
2415 components[0].end = 0;
2416 components[1].start = 1;
2417 components[1].end = 0;
2418 components[2].start = 1;
2419 components[2].end = 0;
2420 components[3].start = 1;
2421 components[3].end = 0;
2428 struct in_addr value;
2431 std::shared_ptr<basic_tester<T>>
2442 std::shared_ptr<basic_tester<T>> m_separator;
2465 _In_reads_or_z_(end)
const T* text,
2466 _In_
size_t start = 0,
2467 _In_
size_t end = (
size_t)-1,
2468 _In_
int flags = match_default)
2470 assert(text || start >= end);
2471 if (start < end && text[start]) {
2472 if (text[start] ==
'-' ||
2473 text[start] ==
'_' ||
2474 text[start] ==
':' ||
2475 std::use_facet<std::ctype<T>>(m_locale).is(std::ctype_base::alnum, text[start]))
2504 _In_reads_or_z_(end)
const char* text,
2505 _In_
size_t start = 0,
2506 _In_
size_t end = (
size_t)-1,
2507 _In_
int flags = match_default)
2509 assert(text || start >= end);
2510 if (start < end && text[start]) {
2512 const wchar_t* chr = next_sgml_cp(text, start, end,
interval.
end, buf);
2513 const wchar_t* chr_end = chr + stdex::strlen(chr);
2514 if ((chr[0] == L
'-' ||
2516 chr[0] == L
':') && chr[1] == 0 ||
2517 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
2553 _In_
const std::shared_ptr<
basic_tester<T>>& scope_id_separator =
nullptr,
2555 _In_
const std::locale& locale = std::locale()) :
2567 m_digit_10(digit_10),
2568 m_digit_11(digit_11),
2569 m_digit_12(digit_12),
2570 m_digit_13(digit_13),
2571 m_digit_14(digit_14),
2572 m_digit_15(digit_15),
2573 m_separator(separator),
2574 m_scope_id_separator(scope_id_separator),
2577 memset(value, 0,
sizeof(value));
2581 _In_reads_or_z_(end)
const T* text,
2582 _In_
size_t start = 0,
2583 _In_
size_t end = (
size_t)-1,
2584 _In_
int flags = match_default)
2586 assert(text || start >= end);
2588 memset(value, 0,
sizeof(value));
2590 size_t i, compaction_i = (size_t)-1, compaction_start = start;
2591 for (i = 0; i < 8; i++) {
2592 bool is_empty =
true;
2594 if (m_separator->match(text,
interval.
end, end, flags)) {
2595 if (m_separator->match(text, m_separator->interval.end, end, flags)) {
2597 if (compaction_i == (
size_t)-1) {
2600 compaction_start = m_separator->interval.start;
2625 size_t dig, digit_end;
2626 if (m_digit_0->match(text,
interval.
end, end, flags)) { dig = 0; digit_end = m_digit_0->interval.end; }
2627 else if (m_digit_1->match(text,
interval.
end, end, flags)) { dig = 1; digit_end = m_digit_1->interval.end; }
2628 else if (m_digit_2->match(text,
interval.
end, end, flags)) { dig = 2; digit_end = m_digit_2->interval.end; }
2629 else if (m_digit_3->match(text,
interval.
end, end, flags)) { dig = 3; digit_end = m_digit_3->interval.end; }
2630 else if (m_digit_4->match(text,
interval.
end, end, flags)) { dig = 4; digit_end = m_digit_4->interval.end; }
2631 else if (m_digit_5->match(text,
interval.
end, end, flags)) { dig = 5; digit_end = m_digit_5->interval.end; }
2632 else if (m_digit_6->match(text,
interval.
end, end, flags)) { dig = 6; digit_end = m_digit_6->interval.end; }
2633 else if (m_digit_7->match(text,
interval.
end, end, flags)) { dig = 7; digit_end = m_digit_7->interval.end; }
2634 else if (m_digit_8->match(text,
interval.
end, end, flags)) { dig = 8; digit_end = m_digit_8->interval.end; }
2635 else if (m_digit_9->match(text,
interval.
end, end, flags)) { dig = 9; digit_end = m_digit_9->interval.end; }
2636 else if (m_digit_10->match(text,
interval.
end, end, flags)) { dig = 10; digit_end = m_digit_10->interval.end; }
2637 else if (m_digit_11->match(text,
interval.
end, end, flags)) { dig = 11; digit_end = m_digit_11->interval.end; }
2638 else if (m_digit_12->match(text,
interval.
end, end, flags)) { dig = 12; digit_end = m_digit_12->interval.end; }
2639 else if (m_digit_13->match(text,
interval.
end, end, flags)) { dig = 13; digit_end = m_digit_13->interval.end; }
2640 else if (m_digit_14->match(text,
interval.
end, end, flags)) { dig = 14; digit_end = m_digit_14->interval.end; }
2641 else if (m_digit_15->match(text,
interval.
end, end, flags)) { dig = 15; digit_end = m_digit_15->interval.end; }
2643 size_t x_n = x * 16 + dig;
2644 if (x_n <= 0xffff) {
2653 if (compaction_i != (
size_t)-1) {
2660 value.s6_words[i] = (uint16_t)x;
2663 if (compaction_i != (
size_t)-1) {
2666 for (j = 8, k = i; k > compaction_i;) {
2667 value.s6_words[--j] = value.s6_words[--k];
2668 components[j] = components[k];
2670 for (; j > compaction_i;) {
2671 value.s6_words[--j] = 0;
2672 components[j].start =
2673 components[j].end = compaction_start;
2679 if (m_scope_id_separator && m_scope_id_separator->match(text,
interval.
end, end, flags) &&
2680 scope_id && scope_id->match(text, m_scope_id_separator->interval.end, end, flags))
2683 scope_id->invalidate();
2689 components[0].start = 1;
2690 components[0].end = 0;
2691 components[1].start = 1;
2692 components[1].end = 0;
2693 components[2].start = 1;
2694 components[2].end = 0;
2695 components[3].start = 1;
2696 components[3].end = 0;
2697 components[4].start = 1;
2698 components[4].end = 0;
2699 components[5].start = 1;
2700 components[5].end = 0;
2701 components[6].start = 1;
2702 components[6].end = 0;
2703 components[7].start = 1;
2704 components[7].end = 0;
2705 memset(value, 0,
sizeof(value));
2706 if (scope_id) scope_id->invalidate();
2711 virtual void invalidate()
2713 components[0].start = 1;
2714 components[0].end = 0;
2715 components[1].start = 1;
2716 components[1].end = 0;
2717 components[2].start = 1;
2718 components[2].end = 0;
2719 components[3].start = 1;
2720 components[3].end = 0;
2721 components[4].start = 1;
2722 components[4].end = 0;
2723 components[5].start = 1;
2724 components[5].end = 0;
2725 components[6].start = 1;
2726 components[6].end = 0;
2727 components[7].start = 1;
2728 components[7].end = 0;
2729 memset(value, 0,
sizeof(value));
2730 if (scope_id) scope_id->invalidate();
2736 struct in6_addr value;
2740 std::shared_ptr<basic_tester<T>>
2757 std::shared_ptr<basic_tester<T>> m_separator, m_scope_id_separator;
2777 _In_
bool allow_idn,
2778 _In_
const std::locale& locale = std::locale()) :
2780 m_allow_idn(allow_idn),
2785 _In_reads_or_z_(end)
const T* text,
2786 _In_
size_t start = 0,
2787 _In_
size_t end = (
size_t)-1,
2788 _In_
int flags = match_default)
2790 assert(text || start >= end);
2791 if (start < end && text[start]) {
2792 if ((
'A' <= text[start] && text[start] <=
'Z') ||
2793 (
'a' <= text[start] && text[start] <=
'z') ||
2794 (
'0' <= text[start] && text[start] <=
'9'))
2795 allow_on_edge =
true;
2796 else if (text[start] ==
'-')
2797 allow_on_edge =
false;
2798 else if (m_allow_idn && std::use_facet<std::ctype<T>>(m_locale).is(std::ctype_base::alnum, text[start]))
2799 allow_on_edge =
true;
2833 _In_
bool allow_idn,
2834 _In_
const std::locale& locale = std::locale()) :
2839 _In_reads_or_z_(end)
const char* text,
2840 _In_
size_t start = 0,
2841 _In_
size_t end = (
size_t)-1,
2842 _In_
int flags = match_default)
2844 assert(text || start >= end);
2845 if (start < end && text[start]) {
2847 const wchar_t* chr = next_sgml_cp(text, start, end,
interval.
end, buf);
2848 const wchar_t* chr_end = chr + stdex::strlen(chr);
2849 if (((
'A' <= chr[0] && chr[0] <=
'Z') ||
2850 (
'a' <= chr[0] && chr[0] <=
'z') ||
2851 (
'0' <= chr[0] && chr[0] <=
'9')) && chr[1] == 0)
2852 allow_on_edge =
true;
2853 else if (chr[0] ==
'-' && chr[1] == 0)
2854 allow_on_edge =
false;
2855 else if (m_allow_idn && std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
2856 allow_on_edge =
true;
2877 _In_
bool allow_absolute,
2880 _In_
const std::locale& locale = std::locale()) :
2882 m_allow_absolute(allow_absolute),
2883 m_domain_char(domain_char),
2884 m_separator(separator)
2888 _In_reads_or_z_(end)
const T* text,
2889 _In_
size_t start = 0,
2890 _In_
size_t end = (
size_t)-1,
2891 _In_
int flags = match_default)
2893 assert(text || start >= end);
2894 size_t i = start, count;
2895 for (count = 0; i < end && text[i] && count < 127; count++) {
2896 if (m_domain_char->match(text, i, end, flags) &&
2897 m_domain_char->allow_on_edge)
2901 while (i < end && text[i]) {
2902 if (m_domain_char->allow_on_edge &&
2903 m_separator->match(text, i, end, flags))
2906 if (m_allow_absolute)
2910 i = m_separator->interval.end;
2914 if (m_domain_char->match(text, i, end, flags)) {
2915 if (m_domain_char->allow_on_edge)
2918 i = m_domain_char->interval.end;
2939 std::shared_ptr<basic_dns_domain_char<T>> m_domain_char;
2940 std::shared_ptr<basic_tester<T>> m_separator;
2962 _In_reads_or_z_(end)
const T* text,
2963 _In_
size_t start = 0,
2964 _In_
size_t end = (
size_t)-1,
2965 _In_
int flags = match_default)
2967 assert(text || start >= end);
2968 if (start < end && text[start]) {
2969 if (text[start] ==
'-' ||
2970 text[start] ==
'.' ||
2971 text[start] ==
'_' ||
2972 text[start] ==
'~' ||
2973 text[start] ==
'%' ||
2974 text[start] ==
'!' ||
2975 text[start] ==
'$' ||
2976 text[start] ==
'&' ||
2977 text[start] ==
'\'' ||
2980 text[start] ==
'*' ||
2981 text[start] ==
'+' ||
2982 text[start] ==
',' ||
2983 text[start] ==
';' ||
2984 text[start] ==
'=' ||
2985 std::use_facet<std::ctype<T>>(m_locale).is(std::ctype_base::alnum, text[start]))
3013 _In_reads_or_z_(end)
const char* text,
3014 _In_
size_t start = 0,
3015 _In_
size_t end = (
size_t)-1,
3016 _In_
int flags = match_default)
3018 assert(text || start >= end);
3019 if (start < end && text[start]) {
3021 const wchar_t* chr = next_sgml_cp(text, start, end,
interval.
end, buf);
3022 const wchar_t* chr_end = chr + stdex::strlen(chr);
3023 if ((chr[0] == L
'-' ||
3038 chr[0] == L
'=') && chr[1] == 0 ||
3039 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
3061 _In_reads_or_z_(end)
const T* text,
3062 _In_
size_t start = 0,
3063 _In_
size_t end = (
size_t)-1,
3064 _In_
int flags = match_default)
3066 assert(text || start >= end);
3067 if (start < end && text[start]) {
3068 if (text[start] ==
'-' ||
3069 text[start] ==
'.' ||
3070 text[start] ==
'_' ||
3071 text[start] ==
'~' ||
3072 text[start] ==
'%' ||
3073 text[start] ==
'!' ||
3074 text[start] ==
'$' ||
3075 text[start] ==
'&' ||
3076 text[start] ==
'\'' ||
3077 text[start] ==
'(' ||
3078 text[start] ==
')' ||
3079 text[start] ==
'*' ||
3080 text[start] ==
'+' ||
3081 text[start] ==
',' ||
3082 text[start] ==
';' ||
3083 text[start] ==
'=' ||
3084 text[start] ==
':' ||
3085 std::use_facet<std::ctype<T>>(m_locale).is(std::ctype_base::alnum, text[start]))
3113 _In_reads_or_z_(end)
const char* text,
3114 _In_
size_t start = 0,
3115 _In_
size_t end = (
size_t)-1,
3116 _In_
int flags = match_default)
3118 assert(text || start >= end);
3119 if (start < end && text[start]) {
3121 const wchar_t* chr = next_sgml_cp(text, start, end,
interval.
end, buf);
3122 const wchar_t* chr_end = chr + stdex::strlen(chr);
3123 if ((chr[0] == L
'-' ||
3139 chr[0] == L
':') && chr[1] == 0 ||
3140 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
3161 _In_reads_or_z_(end)
const T* text,
3162 _In_
size_t start = 0,
3163 _In_
size_t end = (
size_t)-1,
3164 _In_
int flags = match_default)
3166 assert(text || start >= end);
3167 if (start < end && text[start]) {
3168 if (text[start] ==
'/' ||
3169 text[start] ==
'-' ||
3170 text[start] ==
'.' ||
3171 text[start] ==
'_' ||
3172 text[start] ==
'~' ||
3173 text[start] ==
'%' ||
3174 text[start] ==
'!' ||
3175 text[start] ==
'$' ||
3176 text[start] ==
'&' ||
3177 text[start] ==
'\'' ||
3178 text[start] ==
'(' ||
3179 text[start] ==
')' ||
3180 text[start] ==
'*' ||
3181 text[start] ==
'+' ||
3182 text[start] ==
',' ||
3183 text[start] ==
';' ||
3184 text[start] ==
'=' ||
3185 text[start] ==
':' ||
3186 text[start] ==
'@' ||
3187 text[start] ==
'?' ||
3188 text[start] ==
'#' ||
3189 std::use_facet<std::ctype<T>>(m_locale).is(std::ctype_base::alnum, text[start]))
3217 _In_reads_or_z_(end)
const char* text,
3218 _In_
size_t start = 0,
3219 _In_
size_t end = (
size_t)-1,
3220 _In_
int flags = match_default)
3222 assert(text || start >= end);
3223 if (start < end && text[start]) {
3225 const wchar_t* chr = next_sgml_cp(text, start, end,
interval.
end, buf);
3226 const wchar_t* chr_end = chr + stdex::strlen(chr);
3227 if ((chr[0] == L
'/' ||
3247 chr[0] == L
'#') && chr[1] == 0 ||
3248 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
3270 _In_
const std::locale& locale = std::locale()) :
3272 m_path_char(path_char),
3273 m_query_start(query_start),
3274 m_bookmark_start(bookmark_start)
3278 _In_reads_or_z_(end)
const T* text,
3279 _In_
size_t start = 0,
3280 _In_
size_t end = (
size_t)-1,
3281 _In_
int flags = match_default)
3283 assert(text || start >= end);
3295 if (m_query_start->match(text,
interval.
end, end, flags)) {
3297 query.start =
interval.
end = m_query_start->interval.end;
3303 if (m_bookmark_start->match(text,
interval.
end, end, flags)) {
3305 bookmark.start =
interval.
end = m_bookmark_start->interval.end;
3311 if (m_path_char->match(text,
interval.
end, end, flags))
3321 if (m_path_char->match(text,
interval.
end, end, flags))
3331 if (m_bookmark_start->match(text,
interval.
end, end, flags)) {
3333 bookmark.start =
interval.
end = m_bookmark_start->interval.end;
3339 if (m_path_char->match(text,
interval.
end, end, flags))
3349 if (m_path_char->match(text,
interval.
end, end, flags))
3369 virtual void invalidate()
3386 std::shared_ptr<basic_tester<T>> m_path_char;
3387 std::shared_ptr<basic_tester<T>> m_query_start;
3388 std::shared_ptr<basic_tester<T>> m_bookmark_start;
3424 _In_
const std::locale& locale = std::locale()) :
3426 http_scheme(_http_scheme),
3427 ftp_scheme(_ftp_scheme),
3428 mailto_scheme(_mailto_scheme),
3429 file_scheme(_file_scheme),
3432 username(_username),
3433 password(_password),
3435 m_ip_lbracket(ip_lbracket),
3436 m_ip_rbracket(ip_rbracket),
3437 ipv4_host(_ipv4_host),
3438 ipv6_host(_ipv6_host),
3439 dns_host(_dns_host),
3445 _In_reads_or_z_(end)
const T* text,
3446 _In_
size_t start = 0,
3447 _In_
size_t end = (
size_t)-1,
3448 _In_
int flags = match_default)
3450 assert(text || start >= end);
3454 if (http_scheme->match(text,
interval.
end, end, flags) &&
3455 m_colon->match(text, http_scheme->interval.end, end, flags) &&
3456 m_slash->match(text, m_colon->interval.end, end, flags) &&
3457 m_slash->match(text, m_slash->interval.end, end, flags))
3461 ftp_scheme->invalidate();
3462 mailto_scheme->invalidate();
3463 file_scheme->invalidate();
3465 else if (ftp_scheme->match(text,
interval.
end, end, flags) &&
3466 m_colon->match(text, ftp_scheme->interval.end, end, flags) &&
3467 m_slash->match(text, m_colon->interval.end, end, flags) &&
3468 m_slash->match(text, m_slash->interval.end, end, flags))
3472 http_scheme->invalidate();
3473 mailto_scheme->invalidate();
3474 file_scheme->invalidate();
3476 else if (mailto_scheme->match(text,
interval.
end, end, flags) &&
3477 m_colon->match(text, mailto_scheme->interval.end, end, flags))
3481 http_scheme->invalidate();
3482 ftp_scheme->invalidate();
3483 file_scheme->invalidate();
3485 else if (file_scheme->match(text,
interval.
end, end, flags) &&
3486 m_colon->match(text, file_scheme->interval.end, end, flags) &&
3487 m_slash->match(text, m_colon->interval.end, end, flags) &&
3488 m_slash->match(text, m_slash->interval.end, end, flags))
3492 http_scheme->invalidate();
3493 ftp_scheme->invalidate();
3494 mailto_scheme->invalidate();
3498 http_scheme->invalidate();
3499 ftp_scheme->invalidate();
3500 mailto_scheme->invalidate();
3501 file_scheme->invalidate();
3504 if (ftp_scheme->interval) {
3505 if (username->match(text,
interval.
end, end, flags)) {
3506 if (m_colon->match(text, username->interval.end, end, flags) &&
3507 password->match(text, m_colon->interval.end, end, flags) &&
3508 m_at->match(text, password->interval.end, end, flags))
3513 else if (m_at->match(text,
interval.
end, end, flags)) {
3516 password->invalidate();
3519 username->invalidate();
3520 password->invalidate();
3524 username->invalidate();
3525 password->invalidate();
3528 if (ipv4_host->match(text,
interval.
end, end, flags)) {
3531 ipv6_host->invalidate();
3532 dns_host->invalidate();
3535 m_ip_lbracket->match(text,
interval.
end, end, flags) &&
3536 ipv6_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
3537 m_ip_rbracket->match(text, ipv6_host->interval.end, end, flags))
3541 ipv4_host->invalidate();
3542 dns_host->invalidate();
3544 else if (dns_host->match(text,
interval.
end, end, flags)) {
3547 ipv4_host->invalidate();
3548 ipv6_host->invalidate();
3555 if (m_colon->match(text,
interval.
end, end, flags) &&
3556 port->match(text, m_colon->interval.end, end, flags))
3564 if (path->match(text,
interval.
end, end, flags)) {
3573 if (mailto_scheme->interval) {
3574 if (username->match(text,
interval.
end, end, flags) &&
3575 m_at->match(text, username->interval.end, end, flags))
3585 if (m_ip_lbracket->match(text,
interval.
end, end, flags) &&
3586 ipv4_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
3587 m_ip_rbracket->match(text, ipv4_host->interval.end, end, flags))
3591 ipv6_host->invalidate();
3592 dns_host->invalidate();
3595 m_ip_lbracket->match(text,
interval.
end, end, flags) &&
3596 ipv6_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
3597 m_ip_rbracket->match(text, ipv6_host->interval.end, end, flags))
3601 ipv4_host->invalidate();
3602 dns_host->invalidate();
3604 else if (dns_host->match(text,
interval.
end, end, flags)) {
3607 ipv4_host->invalidate();
3608 ipv6_host->invalidate();
3615 password->invalidate();
3622 if (file_scheme->interval) {
3623 if (path->match(text,
interval.
end, end, flags)) {
3628 username->invalidate();
3629 password->invalidate();
3630 ipv4_host->invalidate();
3631 ipv6_host->invalidate();
3632 dns_host->invalidate();
3641 if (http_scheme->interval &&
3644 if (m_colon->match(text, username->interval.end, end, flags) &&
3645 password->match(text, m_colon->interval.end, end, flags) &&
3646 m_at->match(text, password->interval.end, end, flags))
3651 else if (m_at->match(text, username->interval.end, end, flags)) {
3654 password->invalidate();
3657 username->invalidate();
3658 password->invalidate();
3662 username->invalidate();
3663 password->invalidate();
3666 if (ipv4_host->match(text,
interval.
end, end, flags)) {
3669 ipv6_host->invalidate();
3670 dns_host->invalidate();
3673 m_ip_lbracket->match(text,
interval.
end, end, flags) &&
3674 ipv6_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
3675 m_ip_rbracket->match(text, ipv6_host->interval.end, end, flags))
3679 ipv4_host->invalidate();
3680 dns_host->invalidate();
3682 else if (dns_host->match(text,
interval.
end, end, flags)) {
3685 ipv4_host->invalidate();
3686 ipv6_host->invalidate();
3693 if (m_colon->match(text,
interval.
end, end, flags) &&
3694 port->match(text, m_colon->interval.end, end, flags))
3702 if (path->match(text,
interval.
end, end, flags)) {
3711 virtual void invalidate()
3713 http_scheme->invalidate();
3714 ftp_scheme->invalidate();
3715 mailto_scheme->invalidate();
3716 file_scheme->invalidate();
3717 username->invalidate();
3718 password->invalidate();
3719 ipv4_host->invalidate();
3720 ipv6_host->invalidate();
3721 dns_host->invalidate();
3728 std::shared_ptr<basic_tester<T>> http_scheme;
3729 std::shared_ptr<basic_tester<T>> ftp_scheme;
3730 std::shared_ptr<basic_tester<T>> mailto_scheme;
3731 std::shared_ptr<basic_tester<T>> file_scheme;
3732 std::shared_ptr<basic_tester<T>> username;
3733 std::shared_ptr<basic_tester<T>> password;
3734 std::shared_ptr<basic_tester<T>> ipv4_host;
3735 std::shared_ptr<basic_tester<T>> ipv6_host;
3736 std::shared_ptr<basic_tester<T>> dns_host;
3737 std::shared_ptr<basic_tester<T>> port;
3738 std::shared_ptr<basic_tester<T>> path;
3741 std::shared_ptr<basic_tester<T>> m_colon;
3742 std::shared_ptr<basic_tester<T>> m_slash;
3743 std::shared_ptr<basic_tester<T>> m_at;
3744 std::shared_ptr<basic_tester<T>> m_ip_lbracket;
3745 std::shared_ptr<basic_tester<T>> m_ip_rbracket;
3772 _In_
const std::locale& locale = std::locale()) :
3774 username(_username),
3776 m_ip_lbracket(ip_lbracket),
3777 m_ip_rbracket(ip_rbracket),
3778 ipv4_host(_ipv4_host),
3779 ipv6_host(_ipv6_host),
3784 _In_reads_or_z_(end)
const T* text,
3785 _In_
size_t start = 0,
3786 _In_
size_t end = (
size_t)-1,
3787 _In_
int flags = match_default)
3789 assert(text || start >= end);
3791 if (username->match(text, start, end, flags) &&
3792 m_at->match(text, username->interval.end, end, flags))
3795 if (m_ip_lbracket->match(text, m_at->interval.end, end, flags) &&
3796 ipv4_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
3797 m_ip_rbracket->match(text, ipv4_host->interval.end, end, flags))
3801 ipv6_host->invalidate();
3802 dns_host->invalidate();
3805 m_ip_lbracket->match(text, m_at->interval.end, end, flags) &&
3806 ipv6_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
3807 m_ip_rbracket->match(text, ipv6_host->interval.end, end, flags))
3811 ipv4_host->invalidate();
3812 dns_host->invalidate();
3814 else if (dns_host->match(text, m_at->interval.end, end, flags)) {
3817 ipv4_host->invalidate();
3818 ipv6_host->invalidate();
3827 username->invalidate();
3828 ipv4_host->invalidate();
3829 ipv6_host->invalidate();
3830 dns_host->invalidate();
3835 virtual void invalidate()
3837 username->invalidate();
3838 ipv4_host->invalidate();
3839 ipv6_host->invalidate();
3840 dns_host->invalidate();
3845 std::shared_ptr<basic_tester<T>> username;
3846 std::shared_ptr<basic_tester<T>> ipv4_host;
3847 std::shared_ptr<basic_tester<T>> ipv6_host;
3848 std::shared_ptr<basic_tester<T>> dns_host;
3851 std::shared_ptr<basic_tester<T>> m_at;
3852 std::shared_ptr<basic_tester<T>> m_ip_lbracket;
3853 std::shared_ptr<basic_tester<T>> m_ip_rbracket;
3878 _In_
const std::locale& locale = std::locale()) :
3888 _In_reads_or_z_(end)
const T* text,
3889 _In_
size_t start = 0,
3890 _In_
size_t end = (
size_t)-1,
3891 _In_
int flags = match_default)
3893 assert(text || start >= end);
3896 if (apex) apex->invalidate();
3898 if (nose) nose->invalidate();
3899 mouth->invalidate();
3907 if (apex && apex->match(text,
interval.
end, end, flags))
3910 if (eyes->match(text,
interval.
end, end, flags)) {
3911 if (nose && nose->match(text, eyes->interval.end, end, flags) &&
3912 mouth->match(text, nose->interval.end, end, flags))
3915 start_mouth = mouth->interval.start,
3916 hit_offset = mouth->hit_offset;
3919 mouth->interval.start = start_mouth;
3924 if (mouth->match(text, eyes->interval.end, end, flags)) {
3926 start_mouth = mouth->interval.start,
3927 hit_offset = mouth->hit_offset;
3930 if (nose) nose->invalidate();
3931 mouth->interval.start = start_mouth;
3939 if (apex) apex->invalidate();
3941 if (nose) nose->invalidate();
3942 mouth->invalidate();
3947 virtual void invalidate()
3950 if (apex) apex->invalidate();
3952 if (nose) nose->invalidate();
3953 mouth->invalidate();
3959 std::shared_ptr<basic_tester<T>>
apex;
3960 std::shared_ptr<basic_tester<T>>
eyes;
3961 std::shared_ptr<basic_tester<T>>
nose;
3992 _In_
int format_mask,
3998 _In_
const std::locale& locale = std::locale()) :
4001 m_format_mask(format_mask),
4005 m_separator(separator),
4010 _In_reads_or_z_(end)
const T* text,
4011 _In_
size_t start = 0,
4012 _In_
size_t end = (
size_t)-1,
4013 _In_
int flags = match_default)
4015 assert(text || start >= end);
4017 const int space_match_flags = flags & ~match_multiline;
4018 if ((m_format_mask & format::dmy) != 0) {
4019 if (day->match(text, start, end, flags)) {
4021 if (m_separator->match(text,
interval.
end, end, flags)) {
4022 size_t hit_offset = m_separator->hit_offset;
4024 if (month->match(text,
interval.
end, end, flags)) {
4026 if (m_separator->match(text,
interval.
end, end, flags) &&
4027 m_separator->hit_offset == hit_offset)
4030 if (year->match(text,
interval.
end, end, flags) &&
4031 is_valid(day->value, month->value))
4035 format = format::dmy;
4044 if ((m_format_mask & format::mdy) != 0) {
4045 if (month->match(text, start, end, flags)) {
4047 if (m_separator->match(text,
interval.
end, end, flags)) {
4048 size_t hit_offset = m_separator->hit_offset;
4052 if (m_separator->match(text,
interval.
end, end, flags) &&
4053 m_separator->hit_offset == hit_offset)
4056 if (year->match(text,
interval.
end, end, flags) &&
4057 is_valid(day->value, month->value))
4061 format = format::mdy;
4070 if ((m_format_mask & format::ymd) != 0) {
4071 if (year->match(text, start, end, flags)) {
4073 if (m_separator->match(text,
interval.
end, end, flags)) {
4074 size_t hit_offset = m_separator->hit_offset;
4076 if (month->match(text,
interval.
end, end, flags)) {
4078 if (m_separator->match(text,
interval.
end, end, flags) &&
4079 m_separator->hit_offset == hit_offset)
4083 is_valid(day->value, month->value))
4087 format = format::ymd;
4096 if ((m_format_mask & format::ym) != 0) {
4097 if (year->match(text, start, end, flags)) {
4099 if (m_separator->match(text,
interval.
end, end, flags)) {
4101 if (month->match(text,
interval.
end, end, flags) &&
4102 is_valid((
size_t)-1, month->value))
4104 if (day) day->invalidate();
4107 format = format::ym;
4114 if ((m_format_mask & format::my) != 0) {
4115 if (month->match(text, start, end, flags)) {
4117 if (m_separator->match(text,
interval.
end, end, flags)) {
4119 if (year->match(text,
interval.
end, end, flags) &&
4120 is_valid((
size_t)-1, month->value))
4122 if (day) day->invalidate();
4125 format = format::my;
4132 if ((m_format_mask & format::dm) != 0) {
4133 if (day->match(text, start, end, flags)) {
4135 if (m_separator->match(text,
interval.
end, end, flags)) {
4136 size_t hit_offset = m_separator->hit_offset;
4138 if (month->match(text,
interval.
end, end, flags) &&
4139 is_valid(day->value, month->value))
4141 if (year) year->invalidate();
4144 if (m_separator->match(text,
interval.
end, end, flags) &&
4145 m_separator->hit_offset == hit_offset)
4149 format = format::dm;
4156 if ((m_format_mask & format::md) != 0) {
4157 if (month->match(text, start, end, flags)) {
4159 if (m_separator->match(text,
interval.
end, end, flags)) {
4160 size_t hit_offset = m_separator->hit_offset;
4163 is_valid(day->value, month->value))
4165 if (year) year->invalidate();
4168 if (m_separator->match(text,
interval.
end, end, flags) &&
4169 m_separator->hit_offset == hit_offset)
4173 format = format::md;
4180 if (day) day->invalidate();
4181 if (month) month->invalidate();
4182 if (year) year->invalidate();
4188 virtual void invalidate()
4190 if (day) day->invalidate();
4191 if (month) month->invalidate();
4192 if (year) year->invalidate();
4198 static inline bool is_valid(
size_t day,
size_t month)
4200 if (month == (
size_t)-1) {
4204 if (day == (
size_t)-1) {
4217 return 1 <= day && day <= 31;
4219 return 1 <= day && day <= 29;
4224 return 1 <= day && day <= 30;
4232 std::shared_ptr<basic_integer<T>> day;
4233 std::shared_ptr<basic_integer<T>> month;
4234 std::shared_ptr<basic_integer<T>> year;
4238 std::shared_ptr<basic_set<T>> m_separator;
4239 std::shared_ptr<basic_tester<T>> m_space;
4265 _In_
const std::locale& locale = std::locale()) :
4270 millisecond(_millisecond),
4271 m_separator(separator),
4272 m_millisecond_separator(millisecond_separator)
4276 _In_reads_or_z_(end)
const T* text,
4277 _In_
size_t start = 0,
4278 _In_
size_t end = (
size_t)-1,
4279 _In_
int flags = match_default)
4281 assert(text || start >= end);
4283 if (hour->match(text, start, end, flags) &&
4284 m_separator->match(text, hour->interval.end, end, flags) &&
4285 minute->match(text, m_separator->interval.end, end, flags) &&
4289 size_t hit_offset = m_separator->hit_offset;
4290 if (m_separator->match(text, minute->interval.end, end, flags) &&
4291 m_separator->hit_offset == hit_offset &&
4292 second && second->match(text, m_separator->interval.end, end, flags) &&
4296 if (m_millisecond_separator && m_millisecond_separator->match(text, second->interval.end, end, flags) &&
4297 millisecond && millisecond->match(text, m_millisecond_separator->interval.end, end, flags) &&
4298 millisecond->value < 1000)
4304 if (millisecond) millisecond->invalidate();
4309 if (second) second->invalidate();
4310 if (millisecond) millisecond->invalidate();
4318 minute->invalidate();
4319 if (second) second->invalidate();
4320 if (millisecond) millisecond->invalidate();
4325 virtual void invalidate()
4328 minute->invalidate();
4329 if (second) second->invalidate();
4330 if (millisecond) millisecond->invalidate();
4335 std::shared_ptr<basic_integer10<T>> hour;
4336 std::shared_ptr<basic_integer10<T>> minute;
4337 std::shared_ptr<basic_integer10<T>> second;
4338 std::shared_ptr<basic_integer10<T>> millisecond;
4341 std::shared_ptr<basic_set<T>> m_separator;
4342 std::shared_ptr<basic_tester<T>> m_millisecond_separator;
4369 _In_
const std::locale& locale = std::locale()) :
4372 degree_separator(_degree_separator),
4374 minute_separator(_minute_separator),
4376 second_separator(_second_separator),
4381 _In_reads_or_z_(end)
const T* text,
4382 _In_
size_t start = 0,
4383 _In_
size_t end = (
size_t)-1,
4384 _In_
int flags = match_default)
4386 assert(text || start >= end);
4390 if (degree->match(text,
interval.
end, end, flags) &&
4391 degree_separator->match(text, degree->interval.end, end, flags))
4397 degree->invalidate();
4398 degree_separator->invalidate();
4401 if (minute->match(text,
interval.
end, end, flags) &&
4402 minute->value < 60 &&
4403 minute_separator->match(text, minute->interval.end, end, flags))
4409 minute->invalidate();
4410 minute_separator->invalidate();
4413 if (second && second->match(text,
interval.
end, end, flags) &&
4418 if (second_separator && second_separator->match(text,
interval.
end, end, flags))
4421 if (second_separator) second_separator->invalidate();
4424 if (second) second->invalidate();
4425 if (second_separator) second_separator->invalidate();
4428 if (degree->interval.start < degree->interval.end ||
4429 minute->interval.start < minute->interval.end ||
4430 second && second->interval.start < second->interval.end)
4432 if (decimal && decimal->match(text,
interval.
end, end, flags)) {
4437 decimal->invalidate();
4441 if (decimal) decimal->invalidate();
4446 virtual void invalidate()
4448 degree->invalidate();
4449 degree_separator->invalidate();
4450 minute->invalidate();
4451 minute_separator->invalidate();
4452 if (second) second->invalidate();
4453 if (second_separator) second_separator->invalidate();
4454 if (decimal) decimal->invalidate();
4459 std::shared_ptr<basic_integer10<T>> degree;
4460 std::shared_ptr<basic_tester<T>> degree_separator;
4461 std::shared_ptr<basic_integer10<T>> minute;
4462 std::shared_ptr<basic_tester<T>> minute_separator;
4463 std::shared_ptr<basic_integer10<T>> second;
4464 std::shared_ptr<basic_tester<T>> second_separator;
4465 std::shared_ptr<basic_tester<T>> decimal;
4487 _In_
const std::shared_ptr<
basic_set<T>>& lparenthesis,
4488 _In_
const std::shared_ptr<
basic_set<T>>& rparenthesis,
4491 _In_
const std::locale& locale = std::locale()) :
4494 m_plus_sign(plus_sign),
4495 m_lparenthesis(lparenthesis),
4496 m_rparenthesis(rparenthesis),
4497 m_separator(separator),
4502 _In_reads_or_z_(end)
const T* text,
4503 _In_
size_t start = 0,
4504 _In_
size_t end = (
size_t)-1,
4505 _In_
int flags = match_default)
4507 assert(text || start >= end);
4509 size_t safe_digit_end = start, safe_value_size = 0;
4510 bool has_digits =
false, after_digit =
false, in_parentheses =
false, after_parentheses =
false;
4511 const int space_match_flags = flags & ~match_multiline;
4515 m_lparenthesis->invalidate();
4516 m_rparenthesis->invalidate();
4518 if (m_plus_sign && m_plus_sign->match(text,
interval.
end, end, flags)) {
4519 value.append(text + m_plus_sign->interval.start, text + m_plus_sign->interval.end);
4520 safe_value_size = value.size();
4528 if (m_digit->match(text,
interval.
end, end, flags)) {
4530 value.append(text + m_digit->interval.start, text + m_digit->interval.end);
4532 if (!in_parentheses) {
4534 safe_value_size = value.size();
4538 after_parentheses =
false;
4541 m_lparenthesis && !m_lparenthesis->interval &&
4542 m_rparenthesis && !m_rparenthesis->interval &&
4543 m_lparenthesis->match(text,
interval.
end, end, flags))
4546 value.Prilepi(text + m_lparenthesis->interval.start, m_lparenthesis->interval.size());
4548 in_parentheses =
true;
4549 after_digit =
false;
4550 after_parentheses =
false;
4554 m_rparenthesis && !m_rparenthesis->interval &&
4555 m_rparenthesis->match(text,
interval.
end, end, flags) &&
4556 m_lparenthesis->hit_offset == m_rparenthesis->hit_offset)
4559 value.append(text + m_rparenthesis->interval.start, text + m_rparenthesis->interval.end);
4562 safe_value_size = value.size();
4563 in_parentheses =
false;
4564 after_digit =
false;
4565 after_parentheses =
true;
4570 !after_parentheses &&
4571 m_separator && m_separator->match(text,
interval.
end, end, flags))
4575 after_digit =
false;
4576 after_parentheses =
false;
4579 (after_digit || after_parentheses) &&
4580 m_space && m_space->match(text,
interval.
end, end, space_match_flags))
4584 after_digit =
false;
4585 after_parentheses =
false;
4591 value.erase(safe_value_size);
4601 virtual void invalidate()
4611 std::shared_ptr<basic_tester<T>> m_digit;
4612 std::shared_ptr<basic_tester<T>> m_plus_sign;
4613 std::shared_ptr<basic_set<T>> m_lparenthesis;
4614 std::shared_ptr<basic_set<T>> m_rparenthesis;
4615 std::shared_ptr<basic_tester<T>> m_separator;
4616 std::shared_ptr<basic_tester<T>> m_space;
4639 _In_
const std::locale& locale = std::locale()) :
4649 _In_reads_or_z_(end)
const T* text,
4650 _In_
size_t start = 0,
4651 _In_
size_t end = (
size_t)-1,
4652 _In_
int flags = match_default)
4654 assert(text || start >= end);
4660 const int element_match_flags = flags & ~match_case_insensitive;
4662 if (m_element->match(text,
interval.
end, end, element_match_flags)) {
4664 while (m_digit->match(text,
interval.
end, end, flags)) {
4670 if (m_sign->match(text,
interval.
end, end, flags)) {
4684 virtual void invalidate()
4696 std::shared_ptr<basic_tester<T>> m_element;
4697 std::shared_ptr<basic_tester<T>> m_digit;
4698 std::shared_ptr<basic_tester<T>> m_sign;
4717 _In_reads_or_z_(end)
const char* text,
4718 _In_
size_t start = 0,
4719 _In_
size_t end = (
size_t)-1,
4720 _In_
int flags = match_default)
4722 assert(text || start >= end);
4753 _In_reads_or_z_(end)
const char* text,
4754 _In_
size_t start = 0,
4755 _In_
size_t end = (
size_t)-1,
4756 _In_
int flags = match_default)
4758 assert(text || start >= end);
4760 if (m_line_break.match(text,
interval.
end, end, flags)) {
4790 _In_reads_or_z_(end)
const char* text,
4791 _In_
size_t start = 0,
4792 _In_
size_t end = (
size_t)-1,
4793 _In_
int flags = match_default)
4795 assert(text || start >= end);
4799 if (m_space.match(text,
interval.
end, end, flags)) {
4824 _In_reads_or_z_(end)
const char* text,
4825 _In_
size_t start = 0,
4826 _In_
size_t end = (
size_t)-1,
4827 _In_
int flags = match_default)
4829 assert(text || start >= end);
4878 _In_reads_or_z_(end)
const char* text,
4879 _In_
size_t start = 0,
4880 _In_
size_t end = (
size_t)-1,
4881 _In_
int flags = match_default)
4883 assert(text || start >= end);
4905 else if (m_chr.match(text,
interval.
end, end, flags))
4923 virtual void invalidate()
4927 tester::invalidate();
4944 _In_reads_or_z_(end)
const char* text,
4945 _In_
size_t start = 0,
4946 _In_
size_t end = (
size_t)-1,
4947 _In_
int flags = match_default)
4949 assert(text || start >= end);
4951 if (
string.match(text,
interval.
end, end, flags)) {
4957 else if (token.match(text,
interval.
end, end, flags)) {
4958 string.invalidate();
4969 virtual void invalidate()
4971 string.invalidate();
4973 tester::invalidate();
4988 _In_reads_or_z_(end)
const char* text,
4989 _In_
size_t start = 0,
4990 _In_
size_t end = (
size_t)-1,
4991 _In_
int flags = match_default)
4993 assert(text || start >= end);
4999 while (m_space.match(text,
interval.
end, end, flags))
5005 while (m_space.match(text,
interval.
end, end, flags))
5021 virtual void invalidate()
5025 tester::invalidate();
5043 _In_reads_or_z_(end)
const char* text,
5044 _In_
size_t start = 0,
5045 _In_
size_t end = (
size_t)-1,
5046 _In_
int flags = match_default)
5048 assert(text || start >= end);
5049 if (start + 2 < end &&
5050 text[start] ==
'*' &&
5051 text[start + 1] ==
'/' &&
5052 text[start + 2] ==
'*')
5057 else if (start < end && text[start] ==
'*') {
5075 _In_reads_or_z_(end)
const char* text,
5076 _In_
size_t start = 0,
5077 _In_
size_t end = (
size_t)-1,
5078 _In_
int flags = match_default)
5080 assert(text || start >= end);
5086 while (m_space.match(text,
interval.
end, end, flags))
5092 while (m_space.match(text,
interval.
end, end, flags))
5094 if (subtype.match(text,
interval.
end, end, flags))
5103 subtype.invalidate();
5108 virtual void invalidate()
5111 subtype.invalidate();
5112 tester::invalidate();
5130 _In_reads_or_z_(end)
const char* text,
5131 _In_
size_t start = 0,
5132 _In_
size_t end = (
size_t)-1,
5133 _In_
int flags = match_default)
5135 assert(text || start >= end);
5136 if (!http_media_range::match(text, start, end, flags))
5141 if (m_space.match(text,
interval.
end, end, flags))
5145 while (m_space.match(text,
interval.
end, end, flags))
5148 if (param.match(text,
interval.
end, end, flags)) {
5150 params.push_back(std::move(param));
5161 interval.
end = params.empty() ? subtype.interval.end : params.back().interval.end;
5165 http_media_range::invalidate();
5171 virtual void invalidate()
5174 http_media_range::invalidate();
5178 std::list<http_parameter> params;
5188 _In_reads_or_z_(end)
const char* text,
5189 _In_
size_t start = 0,
5190 _In_
size_t end = (
size_t)-1,
5191 _In_
int flags = match_default)
5193 assert(text || start >= end);
5224 http_url_port(_In_
const std::locale& locale = std::locale()) :
5230 _In_reads_or_z_(end)
const char* text,
5231 _In_
size_t start = 0,
5232 _In_
size_t end = (
size_t)-1,
5233 _In_
int flags = match_default)
5235 assert(text || start >= end);
5241 size_t _value = (size_t)value * 10 + text[
interval.
end] -
'0';
5242 if (_value > (uint16_t)-1) {
5247 value = (uint16_t)_value;
5264 virtual void invalidate()
5267 tester::invalidate();
5281 _In_reads_or_z_(end)
const char* text,
5282 _In_
size_t start = 0,
5283 _In_
size_t end = (
size_t)-1,
5284 _In_
int flags = match_default)
5286 assert(text || start >= end);
5314 _In_reads_or_z_(end)
const char* text,
5315 _In_
size_t start = 0,
5316 _In_
size_t end = (
size_t)-1,
5317 _In_
int flags = match_default)
5319 assert(text || start >= end);
5328 segments.push_back(s);
5335 segments.push_back(s);
5353 virtual void invalidate()
5356 tester::invalidate();
5370 _In_reads_or_z_(end)
const char* text,
5371 _In_
size_t start = 0,
5372 _In_
size_t end = (
size_t)-1,
5373 _In_
int flags = match_default)
5375 assert(text || start >= end);
5430 virtual void invalidate()
5436 tester::invalidate();
5451 _In_reads_or_z_(end)
const char* text,
5452 _In_
size_t start = 0,
5453 _In_
size_t end = (
size_t)-1,
5454 _In_
int flags = match_default)
5456 assert(text || start >= end);
5459 if (
interval.
end + 7 <= end && stdex::strnicmp(text +
interval.
end, 7,
"http://", (
size_t)-1, m_locale) == 0) {
5476 server.invalidate();
5500 if (param.match(text,
interval.
end, end, flags)) {
5502 params.push_back(std::move(param));
5517 server.invalidate();
5525 virtual void invalidate()
5527 server.invalidate();
5531 tester::invalidate();
5538 std::list<http_url_parameter> params;
5548 _In_reads_or_z_(end)
const char* text,
5549 _In_
size_t start = 0,
5550 _In_
size_t end = (
size_t)-1,
5551 _In_
int flags = match_default)
5553 assert(text || start >= end);
5561 if (k.
end < end && text[k.
end]) {
5562 if (isalpha(text[k.
end]))
5573 components.push_back(k);
5585 if (!components.empty()) {
5594 virtual void invalidate()
5597 tester::invalidate();
5601 std::vector<stdex::interval<size_t>> components;
5610 http_weight(_In_
const std::locale& locale = std::locale()) :
5616 _In_reads_or_z_(end)
const char* text,
5617 _In_
size_t start = 0,
5618 _In_
size_t end = (
size_t)-1,
5619 _In_
int flags = match_default)
5621 assert(text || start >= end);
5622 size_t celi_del = 0, decimalni_del = 0, decimalni_del_n = 1;
5627 celi_del = celi_del * 10 + text[
interval.
end] -
'0';
5635 decimalni_del = decimalni_del * 10 + text[
interval.
end] -
'0';
5636 decimalni_del_n *= 10;
5654 value = (float)((
double)celi_del + (double)decimalni_del / decimalni_del_n);
5663 virtual void invalidate()
5666 tester::invalidate();
5680 _In_reads_or_z_(end)
const char* text,
5681 _In_
size_t start = 0,
5682 _In_
size_t end = (
size_t)-1,
5683 _In_
int flags = match_default)
5685 assert(text || end <= start);
5686 if (start < end && text[start] ==
'*') {
5698 template <
class T,
class T_asterisk = http_asterisk>
5703 _In_reads_or_z_(end)
const char* text,
5704 _In_
size_t start = 0,
5705 _In_
size_t end = (
size_t)-1,
5706 _In_
int flags = match_default)
5708 assert(text || start >= end);
5709 size_t konec_vrednosti;
5711 if (asterisk.match(text,
interval.
end, end, flags)) {
5712 interval.
end = konec_vrednosti = asterisk.interval.end;
5715 else if (value.match(text,
interval.
end, end, flags)) {
5716 interval.
end = konec_vrednosti = value.interval.end;
5717 asterisk.invalidate();
5720 asterisk.invalidate();
5741 if (!factor.interval) {
5742 factor.invalidate();
5749 virtual void invalidate()
5751 asterisk.invalidate();
5753 factor.invalidate();
5754 tester::invalidate();
5758 T_asterisk asterisk;
5770 _In_reads_or_z_(end)
const char* text,
5771 _In_
size_t start = 0,
5772 _In_
size_t end = (
size_t)-1,
5773 _In_
int flags = match_default)
5775 assert(text || start >= end);
5785 while (m_space.match(text,
interval.
end, end, flags))
5791 while (m_space.match(text,
interval.
end, end, flags))
5807 virtual void invalidate()
5811 tester::invalidate();
5829 _In_reads_or_z_(end)
const char* text,
5830 _In_
size_t start = 0,
5831 _In_
size_t end = (
size_t)-1,
5832 _In_
int flags = match_default)
5834 assert(text || start >= end);
5840 while (m_space.match(text,
interval.
end, end, flags))
5846 while (m_space.match(text,
interval.
end, end, flags))
5855 if (m_space.match(text,
interval.
end, end, flags))
5859 while (m_space.match(text,
interval.
end, end, flags))
5862 if (param.match(text,
interval.
end, end, flags)) {
5864 params.push_back(std::move(param));
5876 interval.
end = params.empty() ? value.interval.end : params.back().interval.end;
5887 virtual void invalidate()
5892 tester::invalidate();
5911 _In_reads_or_z_(end)
const char* text,
5912 _In_
size_t start = 0,
5913 _In_
size_t end = (
size_t)-1,
5914 _In_
int flags = match_default)
5916 assert(text || start >= end);
5966 virtual void invalidate()
5972 tester::invalidate();
5986 http_protocol(_In_
const std::locale& locale = std::locale()) :
5992 _In_reads_or_z_(end)
const char* text,
5993 _In_
size_t start = 0,
5994 _In_
size_t end = (
size_t)-1,
5995 _In_
int flags = match_default)
5997 assert(text || start >= end);
6029 (uint16_t)strtoui(text + version_maj.start, version_maj.size(),
nullptr, 10) * 0x100 +
6030 (uint16_t)strtoui(text + version_min.start, version_min.size(),
nullptr, 10);
6043 version_min.start = 1;
6044 version_min.end = 0;
6045 version = (uint16_t)strtoui(text + version_maj.start, version_maj.size(),
nullptr, 10) * 0x100;
6060 version_maj.start = 1;
6061 version_maj.end = 0;
6062 version_min.start = 1;
6063 version_min.end = 0;
6070 virtual void invalidate()
6074 version_maj.start = 1;
6075 version_maj.end = 0;
6076 version_min.start = 1;
6077 version_min.end = 0;
6079 tester::invalidate();
6096 _In_reads_or_z_(end)
const char* text,
6097 _In_
size_t start = 0,
6098 _In_
size_t end = (
size_t)-1,
6099 _In_
int flags = match_default)
6101 assert(text || start >= end);
6105 if (m_line_break.match(text,
interval.
end, end, flags))
6118 if (m_line_break.match(text,
interval.
end, end, flags))
6134 if (m_line_break.match(text,
interval.
end, end, flags))
6150 protocol.invalidate();
6152 if (m_line_break.match(text,
interval.
end, end, flags)) {
6166 if (m_line_break.match(text,
interval.
end, end, flags)) {
6170 else if (protocol.match(text,
interval.
end, end, flags)) {
6179 if (m_line_break.match(text,
interval.
end, end, flags)) {
6197 protocol.invalidate();
6203 virtual void invalidate()
6208 protocol.invalidate();
6209 tester::invalidate();
6228 _In_reads_or_z_(end)
const char* text,
6229 _In_
size_t start = 0,
6230 _In_
size_t end = (
size_t)-1,
6231 _In_
int flags = match_default)
6233 assert(text || start >= end);
6236 if (m_line_break.match(text,
interval.
end, end, flags) ||
6241 if (m_line_break.match(text,
interval.
end, end, flags))
6248 if (m_line_break.match(text,
interval.
end, end, flags))
6278 value.start = (size_t)-1;
6281 if (m_line_break.match(text,
interval.
end, end, flags)) {
6283 if (!m_line_break.match(text,
interval.
end, end, flags) &&
6293 if (value.start == (
size_t)-1) value.start =
interval.
end;
6313 virtual void invalidate()
6319 tester::invalidate();
6327 http_line_break m_line_break;
6338 _In_reads_or_z_(end)
const T* text,
6339 _In_
size_t start = 0,
6340 _In_
size_t end = (
size_t)-1,
6341 _In_
int flags = match_default)
6343 while (start < end) {
6344 while (start < end && text[start] && isspace(text[start])) start++;
6345 if (start < end && text[start] ==
',') {
6347 while (start < end&& text[start] && isspace(text[start])) start++;
6350 if (el.match(text, start, end, flags)) {
6351 start = el.interval.end;
6352 T::insert(std::move(el));
6362 constexpr bool operator()(
const T& a,
const T& b)
const noexcept
6364 return a.factor.value > b.factor.value;
6371 template <
class T,
class _Pr = http_factor_more<T>,
class _Alloc = std::allocator<T>>
6393 _In_
const std::locale& locale = std::locale()) :
6409 _In_reads_or_z_(end)
const T* text,
6410 _In_
size_t start = 0,
6411 _In_
size_t end = (
size_t)-1,
6412 _In_
int flags = match_default)
6414 assert(text || start >= end);
6416 if (m_quote->match(text,
interval.
end, end, flags)) {
6420 if (m_quote->match(text,
interval.
end, end, flags)) {
6425 if (m_escape->match(text,
interval.
end, end, flags)) {
6426 if (m_quote->match(text, m_escape->interval.end, end, flags)) {
6427 value +=
'"';
interval.
end = m_quote->interval.end;
6430 if (m_sol->match(text, m_escape->interval.end, end, flags)) {
6434 if (m_bs->match(text, m_escape->interval.end, end, flags)) {
6438 if (m_ff->match(text, m_escape->interval.end, end, flags)) {
6442 if (m_lf->match(text, m_escape->interval.end, end, flags)) {
6446 if (m_cr->match(text, m_escape->interval.end, end, flags)) {
6450 if (m_htab->match(text, m_escape->interval.end, end, flags)) {
6451 value +=
'\t';
interval.
end = m_htab->interval.end;
6455 m_uni->match(text, m_escape->interval.end, end, flags) &&
6456 m_hex->match(text, m_uni->interval.end, std::min(m_uni->interval.end + 4, end), flags | match_case_insensitive) &&
6457 m_hex->interval.size() == 4 )
6459 assert(m_hex->value <= 0xffff);
6460 if (
sizeof(T) == 1) {
6461 if (m_hex->value > 0x7ff) {
6462 value += (T)(0xe0 | (m_hex->value >> 12) & 0x0f);
6463 value += (T)(0x80 | (m_hex->value >> 6) & 0x3f);
6464 value += (T)(0x80 | m_hex->value & 0x3f);
6466 else if (m_hex->value > 0x7f) {
6467 value += (T)(0xc0 | (m_hex->value >> 6) & 0x1f);
6468 value += (T)(0x80 | m_hex->value & 0x3f);
6471 value += (T)(m_hex->value & 0x7f);
6474 value += (T)m_hex->value;
6478 if (m_escape->match(text, m_escape->interval.end, end, flags)) {
6479 value +=
'\\';
interval.
end = m_escape->interval.end;
6483 if (m_chr->match(text,
interval.
end, end, flags)) {
6484 value.Prilepi(text + m_chr->interval.start, m_chr->interval.size());
6496 virtual void invalidate()
6503 std::basic_string<T> value;
6506 std::shared_ptr<basic_tester<T>> m_quote;
6507 std::shared_ptr<basic_tester<T>> m_chr;
6508 std::shared_ptr<basic_tester<T>> m_escape;
6509 std::shared_ptr<basic_tester<T>> m_sol;
6510 std::shared_ptr<basic_tester<T>> m_bs;
6511 std::shared_ptr<basic_tester<T>> m_ff;
6512 std::shared_ptr<basic_tester<T>> m_lf;
6513 std::shared_ptr<basic_tester<T>> m_cr;
6514 std::shared_ptr<basic_tester<T>> m_htab;
6515 std::shared_ptr<basic_tester<T>> m_uni;
6516 std::shared_ptr<basic_integer16<T>> m_hex;
Test for angle in d°mm'ss.dddd form.
Definition: parser.hpp:4359
Test for any code unit.
Definition: parser.hpp:200
Test for beginning of line.
Definition: parser.hpp:582
Test for any.
Definition: parser.hpp:1024
Test for any code unit from a given string of code units.
Definition: parser.hpp:687
Test for specific code unit.
Definition: parser.hpp:266
Test for date.
Definition: parser.hpp:3979
Test for valid DNS domain character.
Definition: parser.hpp:2774
bool allow_on_edge
Is character allowed at the beginning or an end of a DNS domain?
Definition: parser.hpp:2812
Test for DNS domain/hostname.
Definition: parser.hpp:2874
bool m_allow_absolute
May DNS names end with a dot (absolute name)?
Definition: parser.hpp:2938
Test for e-mail address.
Definition: parser.hpp:3762
Test for emoticon.
Definition: parser.hpp:3870
std::shared_ptr< basic_tester< T > > nose
nose (e.g. -, o)
Definition: parser.hpp:3961
std::shared_ptr< basic_set< T > > mouth
mouth (e.g. ), ), (, (, |, P, D, p, d)
Definition: parser.hpp:3962
std::shared_ptr< basic_tester< T > > eyes
eyes (e.g. :, ;, >, |, B)
Definition: parser.hpp:3960
std::shared_ptr< basic_tester< T > > emoticon
emoticon as a whole (e.g. 😀, 🤔, 😶)
Definition: parser.hpp:3958
std::shared_ptr< basic_tester< T > > apex
apex/eyebrows/halo (e.g. O, 0)
Definition: parser.hpp:3959
Test for end of line.
Definition: parser.hpp:620
Test for fraction.
Definition: parser.hpp:1653
Test for decimal integer.
Definition: parser.hpp:1262
Test for decimal integer possibly containing thousand separators.
Definition: parser.hpp:1347
bool has_separators
Did integer have any separators?
Definition: parser.hpp:1407
size_t digit_count
Total number of digits in integer.
Definition: parser.hpp:1406
Test for hexadecimal integer.
Definition: parser.hpp:1428
Base class for integer testing.
Definition: parser.hpp:1240
size_t value
Calculated value of the numeral.
Definition: parser.hpp:1254
Test for IPv4 address.
Definition: parser.hpp:2312
Test for IPv6 address.
Definition: parser.hpp:2533
std::shared_ptr< basic_tester< T > > scope_id
Scope ID (e.g. NIC index with link-local addresses)
Definition: parser.hpp:2737
Test for valid IPv6 address scope ID character.
Definition: parser.hpp:2459
Test for repeating.
Definition: parser.hpp:877
bool m_greedy
try to match as long sequence as possible
Definition: parser.hpp:916
size_t m_min_iterations
minimum number of iterations
Definition: parser.hpp:914
size_t m_max_iterations
maximum number of iterations
Definition: parser.hpp:915
std::shared_ptr< basic_tester< T > > m_el
repeating element
Definition: parser.hpp:913
Test for JSON string.
Definition: parser.hpp:6379
Test for mixed numeral.
Definition: parser.hpp:1888
std::shared_ptr< basic_tester< T > > special_sign
Special sign (e.g. plus-minus '±')
Definition: parser.hpp:1992
std::shared_ptr< basic_tester< T > > fraction
fraction
Definition: parser.hpp:1994
std::shared_ptr< basic_tester< T > > positive_sign
Positive sign.
Definition: parser.hpp:1990
std::shared_ptr< basic_tester< T > > integer
Integer part.
Definition: parser.hpp:1993
std::shared_ptr< basic_tester< T > > negative_sign
Negative sign.
Definition: parser.hpp:1991
Test for monetary numeral.
Definition: parser.hpp:2183
std::shared_ptr< basic_tester< T > > decimal_separator
Decimal separator.
Definition: parser.hpp:2294
std::shared_ptr< basic_tester< T > > decimal
Decimal part.
Definition: parser.hpp:2295
std::shared_ptr< basic_tester< T > > currency
Currency part.
Definition: parser.hpp:2292
std::shared_ptr< basic_tester< T > > special_sign
Special sign (e.g. plus-minus '±')
Definition: parser.hpp:2291
std::shared_ptr< basic_tester< T > > positive_sign
Positive sign.
Definition: parser.hpp:2289
std::shared_ptr< basic_tester< T > > integer
Integer part.
Definition: parser.hpp:2293
std::shared_ptr< basic_tester< T > > negative_sign
Negative sign.
Definition: parser.hpp:2290
"No-op" match
Definition: parser.hpp:168
Test for permutation.
Definition: parser.hpp:1164
Test for phone number.
Definition: parser.hpp:4482
std::basic_string< T > value
Normalized phone number.
Definition: parser.hpp:4608
Test for any punctuation code unit.
Definition: parser.hpp:438
Test for Roman numeral.
Definition: parser.hpp:1537
Test for scientific numeral.
Definition: parser.hpp:2014
std::shared_ptr< basic_tester< T > > positive_exp_sign
Positive exponent sign (e.g. '+')
Definition: parser.hpp:2163
std::shared_ptr< basic_tester< T > > negative_exp_sign
Negative exponent sign (e.g. '-')
Definition: parser.hpp:2164
std::shared_ptr< basic_tester< T > > positive_sign
Positive sign.
Definition: parser.hpp:2156
double value
Calculated value of the numeral.
Definition: parser.hpp:2166
std::shared_ptr< basic_integer< T > > decimal
Decimal part.
Definition: parser.hpp:2161
std::shared_ptr< basic_tester< T > > negative_sign
Negative sign.
Definition: parser.hpp:2157
std::shared_ptr< basic_integer< T > > exponent
Exponent part.
Definition: parser.hpp:2165
std::shared_ptr< basic_tester< T > > special_sign
Special sign (e.g. plus-minus '±')
Definition: parser.hpp:2158
std::shared_ptr< basic_tester< T > > decimal_separator
Decimal separator.
Definition: parser.hpp:2160
std::shared_ptr< basic_tester< T > > exponent_symbol
Exponent symbol (e.g. 'e')
Definition: parser.hpp:2162
std::shared_ptr< basic_integer< T > > integer
Integer part.
Definition: parser.hpp:2159
Test for match score.
Definition: parser.hpp:1716
Test for sequence.
Definition: parser.hpp:973
Definition: parser.hpp:655
Test for signed numeral.
Definition: parser.hpp:1802
std::shared_ptr< basic_tester< T > > positive_sign
Positive sign.
Definition: parser.hpp:1868
std::shared_ptr< basic_tester< T > > number
Number.
Definition: parser.hpp:1871
std::shared_ptr< basic_tester< T > > negative_sign
Negative sign.
Definition: parser.hpp:1869
std::shared_ptr< basic_tester< T > > special_sign
Special sign (e.g. plus-minus '±')
Definition: parser.hpp:1870
Test for any space code unit.
Definition: parser.hpp:359
Test for any space or punctuation code unit.
Definition: parser.hpp:508
Test for any string.
Definition: parser.hpp:1092
Test for given string.
Definition: parser.hpp:782
Base template for all testers.
Definition: parser.hpp:49
interval< size_t > interval
Test for interval.
Definition: parser.hpp:148
Test for time.
Definition: parser.hpp:4256
Test for valid URL password character.
Definition: parser.hpp:3056
Test for valid URL path character.
Definition: parser.hpp:3156
Test for URL path.
Definition: parser.hpp:3264
Test for valid URL username character.
Definition: parser.hpp:2957
Test for URL.
Definition: parser.hpp:3405
Test for HTTP agent.
Definition: parser.hpp:5908
Test for HTTP any type.
Definition: parser.hpp:5040
Test for HTTP asterisk.
Definition: parser.hpp:5677
Test for HTTP cookie parameter (RFC2109)
Definition: parser.hpp:5767
Test for HTTP cookie (RFC2109)
Definition: parser.hpp:5826
std::list< http_cookie_parameter > params
List of cookie parameters.
Definition: parser.hpp:5898
http_token name
Cookie name.
Definition: parser.hpp:5896
http_value value
Cookie value.
Definition: parser.hpp:5897
Test for HTTP language (RFC1766)
Definition: parser.hpp:5545
Test for HTTP line break (RFC2616: CRLF | LF)
Definition: parser.hpp:4714
Test for HTTP parameter (RFC2616: parameter)
Definition: parser.hpp:4985
http_token name
Parameter name.
Definition: parser.hpp:5029
http_value value
Parameter value.
Definition: parser.hpp:5030
Test for HTTP protocol.
Definition: parser.hpp:5984
uint16_t version
HTTP protocol version: 0x100 = 1.0, 0x101 = 1.1...
Definition: parser.hpp:6086
Test for HTTP quoted string (RFC2616: quoted-string)
Definition: parser.hpp:4875
stdex::interval< size_t > content
String content (without quotes)
Definition: parser.hpp:4931
Test for HTTP request.
Definition: parser.hpp:6093
Test for HTTP space (RFC2616: LWS)
Definition: parser.hpp:4750
Test for HTTP text character (RFC2616: TEXT)
Definition: parser.hpp:4787
Test for HTTP token (RFC2616: token - tolerates non-ASCII)
Definition: parser.hpp:4821
Test for HTTP URL parameter.
Definition: parser.hpp:5367
Test for HTTP URL path segment.
Definition: parser.hpp:5278
Test for HTTP URL path segment.
Definition: parser.hpp:5311
std::vector< http_url_path_segment > segments
Path segments.
Definition: parser.hpp:5360
Test for HTTP URL port.
Definition: parser.hpp:5222
Test for HTTP URL server.
Definition: parser.hpp:5185
Test for HTTP URL.
Definition: parser.hpp:5448
Test for HTTP value (RFC2616: value)
Definition: parser.hpp:4941
http_quoted_string string
Value when matched as quoted string.
Definition: parser.hpp:4977
http_token token
Value when matched as token.
Definition: parser.hpp:4978
Test for HTTP weight factor.
Definition: parser.hpp:5608
float value
Calculated value of the weight factor.
Definition: parser.hpp:5670
Test for HTTP weighted value.
Definition: parser.hpp:5700
Test for any SGML code point.
Definition: parser.hpp:230
Test for any SGML code point from a given string of SGML code points.
Definition: parser.hpp:739
Test for specific SGML code point.
Definition: parser.hpp:315
Test for valid DNS domain SGML character.
Definition: parser.hpp:2830
Test for valid IPv6 address scope ID SGML character.
Definition: parser.hpp:2498
Test for any SGML punctuation code point.
Definition: parser.hpp:479
Test for any SGML space code point.
Definition: parser.hpp:402
Test for any SGML space or punctuation code point.
Definition: parser.hpp:551
Test for SGML given string.
Definition: parser.hpp:829
Test for valid URL password SGML character.
Definition: parser.hpp:3108
Test for valid URL path SGML character.
Definition: parser.hpp:3212
Test for valid URL username SGML character.
Definition: parser.hpp:3008
Base template for collection-holding testers.
Definition: parser.hpp:933
Numerical interval.
Definition: interval.hpp:17
T end
interval end
Definition: interval.hpp:19
interval() noexcept
Constructs an invalid interval.
Definition: interval.hpp:24
T start
interval start
Definition: interval.hpp:18
Definition: parser.hpp:6361