33 |
#include "config.h" |
#include "config.h" |
34 |
#endif |
#endif |
35 |
|
|
|
#ifdef HAVE_WINDOWS_H |
|
|
#define HAVE_STRTOQ 1 |
|
|
#define strtoll _strtoui64 |
|
|
#define strtoull _strtoi64 |
|
|
#endif |
|
|
|
|
36 |
#include <stdlib.h> |
#include <stdlib.h> |
37 |
#include <stdio.h> |
#include <stdio.h> |
38 |
#include <ctype.h> |
#include <ctype.h> |
55 |
static const int kVecSize = (1 + kMaxArgs) * 3; // results + PCRE workspace |
static const int kVecSize = (1 + kMaxArgs) * 3; // results + PCRE workspace |
56 |
|
|
57 |
// Special object that stands-in for no argument |
// Special object that stands-in for no argument |
58 |
PCRECPP_EXP_DEFN Arg no_arg((void*)NULL); |
Arg RE::no_arg((void*)NULL); |
59 |
|
|
60 |
// If a regular expression has no error, its error_ field points here |
// If a regular expression has no error, its error_ field points here |
61 |
static const string empty_string; |
static const string empty_string; |
354 |
else if (newline == -1) |
else if (newline == -1) |
355 |
newline_mode = PCRE_NEWLINE_ANY; |
newline_mode = PCRE_NEWLINE_ANY; |
356 |
else if (newline == -2) |
else if (newline == -2) |
357 |
newline_mode = PCRE_NEWLINE_ANYCRLF; |
newline_mode = PCRE_NEWLINE_ANYCRLF; |
358 |
else |
else |
359 |
assert("" == "Unexpected return value from pcre_config(NEWLINE)"); |
assert("" == "Unexpected return value from pcre_config(NEWLINE)"); |
360 |
} |
} |
369 |
int start = 0; |
int start = 0; |
370 |
int lastend = -1; |
int lastend = -1; |
371 |
|
|
372 |
for (; start <= static_cast<int>(str->length()); count++) { |
while (start <= static_cast<int>(str->length())) { |
373 |
int matches = TryMatch(*str, start, UNANCHORED, vec, kVecSize); |
int matches = TryMatch(*str, start, UNANCHORED, vec, kVecSize); |
374 |
if (matches <= 0) |
if (matches <= 0) |
375 |
break; |
break; |
384 |
// Note it's better to call pcre_fullinfo() than to examine |
// Note it's better to call pcre_fullinfo() than to examine |
385 |
// all_options(), since options_ could have changed bewteen |
// all_options(), since options_ could have changed bewteen |
386 |
// compile-time and now, but this is simpler and safe enough. |
// compile-time and now, but this is simpler and safe enough. |
387 |
// Modified by PH to add ANY and ANYCRLF. |
// Modified by PH to add ANY and ANYCRLF. |
388 |
if (start+1 < static_cast<int>(str->length()) && |
if (start+1 < static_cast<int>(str->length()) && |
389 |
(*str)[start] == '\r' && (*str)[start+1] == '\n' && |
(*str)[start] == '\r' && (*str)[start+1] == '\n' && |
390 |
(NewlineMode(options_.all_options()) == PCRE_NEWLINE_CRLF || |
(NewlineMode(options_.all_options()) == PCRE_NEWLINE_CRLF || |
618 |
} |
} |
619 |
|
|
620 |
bool Arg::parse_string(const char* str, int n, void* dest) { |
bool Arg::parse_string(const char* str, int n, void* dest) { |
621 |
|
if (dest == NULL) return true; |
622 |
reinterpret_cast<string*>(dest)->assign(str, n); |
reinterpret_cast<string*>(dest)->assign(str, n); |
623 |
return true; |
return true; |
624 |
} |
} |
625 |
|
|
626 |
bool Arg::parse_stringpiece(const char* str, int n, void* dest) { |
bool Arg::parse_stringpiece(const char* str, int n, void* dest) { |
627 |
|
if (dest == NULL) return true; |
628 |
reinterpret_cast<StringPiece*>(dest)->set(str, n); |
reinterpret_cast<StringPiece*>(dest)->set(str, n); |
629 |
return true; |
return true; |
630 |
} |
} |
631 |
|
|
632 |
bool Arg::parse_char(const char* str, int n, void* dest) { |
bool Arg::parse_char(const char* str, int n, void* dest) { |
633 |
if (n != 1) return false; |
if (n != 1) return false; |
634 |
|
if (dest == NULL) return true; |
635 |
*(reinterpret_cast<char*>(dest)) = str[0]; |
*(reinterpret_cast<char*>(dest)) = str[0]; |
636 |
return true; |
return true; |
637 |
} |
} |
638 |
|
|
639 |
bool Arg::parse_uchar(const char* str, int n, void* dest) { |
bool Arg::parse_uchar(const char* str, int n, void* dest) { |
640 |
if (n != 1) return false; |
if (n != 1) return false; |
641 |
|
if (dest == NULL) return true; |
642 |
*(reinterpret_cast<unsigned char*>(dest)) = str[0]; |
*(reinterpret_cast<unsigned char*>(dest)) = str[0]; |
643 |
return true; |
return true; |
644 |
} |
} |
687 |
long r = strtol(str, &end, radix); |
long r = strtol(str, &end, radix); |
688 |
if (end != str + n) return false; // Leftover junk |
if (end != str + n) return false; // Leftover junk |
689 |
if (errno) return false; |
if (errno) return false; |
690 |
|
if (dest == NULL) return true; |
691 |
*(reinterpret_cast<long*>(dest)) = r; |
*(reinterpret_cast<long*>(dest)) = r; |
692 |
return true; |
return true; |
693 |
} |
} |
705 |
unsigned long r = strtoul(str, &end, radix); |
unsigned long r = strtoul(str, &end, radix); |
706 |
if (end != str + n) return false; // Leftover junk |
if (end != str + n) return false; // Leftover junk |
707 |
if (errno) return false; |
if (errno) return false; |
708 |
|
if (dest == NULL) return true; |
709 |
*(reinterpret_cast<unsigned long*>(dest)) = r; |
*(reinterpret_cast<unsigned long*>(dest)) = r; |
710 |
return true; |
return true; |
711 |
} |
} |
717 |
long r; |
long r; |
718 |
if (!parse_long_radix(str, n, &r, radix)) return false; // Could not parse |
if (!parse_long_radix(str, n, &r, radix)) return false; // Could not parse |
719 |
if (r < SHRT_MIN || r > SHRT_MAX) return false; // Out of range |
if (r < SHRT_MIN || r > SHRT_MAX) return false; // Out of range |
720 |
*(reinterpret_cast<short*>(dest)) = r; |
if (dest == NULL) return true; |
721 |
|
*(reinterpret_cast<short*>(dest)) = static_cast<short>(r); |
722 |
return true; |
return true; |
723 |
} |
} |
724 |
|
|
729 |
unsigned long r; |
unsigned long r; |
730 |
if (!parse_ulong_radix(str, n, &r, radix)) return false; // Could not parse |
if (!parse_ulong_radix(str, n, &r, radix)) return false; // Could not parse |
731 |
if (r > USHRT_MAX) return false; // Out of range |
if (r > USHRT_MAX) return false; // Out of range |
732 |
*(reinterpret_cast<unsigned short*>(dest)) = r; |
if (dest == NULL) return true; |
733 |
|
*(reinterpret_cast<unsigned short*>(dest)) = static_cast<unsigned short>(r); |
734 |
return true; |
return true; |
735 |
} |
} |
736 |
|
|
741 |
long r; |
long r; |
742 |
if (!parse_long_radix(str, n, &r, radix)) return false; // Could not parse |
if (!parse_long_radix(str, n, &r, radix)) return false; // Could not parse |
743 |
if (r < INT_MIN || r > INT_MAX) return false; // Out of range |
if (r < INT_MIN || r > INT_MAX) return false; // Out of range |
744 |
|
if (dest == NULL) return true; |
745 |
*(reinterpret_cast<int*>(dest)) = r; |
*(reinterpret_cast<int*>(dest)) = r; |
746 |
return true; |
return true; |
747 |
} |
} |
753 |
unsigned long r; |
unsigned long r; |
754 |
if (!parse_ulong_radix(str, n, &r, radix)) return false; // Could not parse |
if (!parse_ulong_radix(str, n, &r, radix)) return false; // Could not parse |
755 |
if (r > UINT_MAX) return false; // Out of range |
if (r > UINT_MAX) return false; // Out of range |
756 |
|
if (dest == NULL) return true; |
757 |
*(reinterpret_cast<unsigned int*>(dest)) = r; |
*(reinterpret_cast<unsigned int*>(dest)) = r; |
758 |
return true; |
return true; |
759 |
} |
} |
774 |
long long r = strtoq(str, &end, radix); |
long long r = strtoq(str, &end, radix); |
775 |
#elif defined HAVE_STRTOLL |
#elif defined HAVE_STRTOLL |
776 |
long long r = strtoll(str, &end, radix); |
long long r = strtoll(str, &end, radix); |
777 |
|
#elif defined HAVE__STRTOI64 |
778 |
|
long long r = _strtoi64(str, &end, radix); |
779 |
#else |
#else |
780 |
#error parse_longlong_radix: cannot convert input to a long-long |
#error parse_longlong_radix: cannot convert input to a long-long |
781 |
#endif |
#endif |
782 |
if (end != str + n) return false; // Leftover junk |
if (end != str + n) return false; // Leftover junk |
783 |
if (errno) return false; |
if (errno) return false; |
784 |
|
if (dest == NULL) return true; |
785 |
*(reinterpret_cast<long long*>(dest)) = r; |
*(reinterpret_cast<long long*>(dest)) = r; |
786 |
return true; |
return true; |
787 |
#endif /* HAVE_LONG_LONG */ |
#endif /* HAVE_LONG_LONG */ |
804 |
unsigned long long r = strtouq(str, &end, radix); |
unsigned long long r = strtouq(str, &end, radix); |
805 |
#elif defined HAVE_STRTOLL |
#elif defined HAVE_STRTOLL |
806 |
unsigned long long r = strtoull(str, &end, radix); |
unsigned long long r = strtoull(str, &end, radix); |
807 |
|
#elif defined HAVE__STRTOI64 |
808 |
|
unsigned long long r = _strtoui64(str, &end, radix); |
809 |
#else |
#else |
810 |
#error parse_ulonglong_radix: cannot convert input to a long-long |
#error parse_ulonglong_radix: cannot convert input to a long-long |
811 |
#endif |
#endif |
812 |
if (end != str + n) return false; // Leftover junk |
if (end != str + n) return false; // Leftover junk |
813 |
if (errno) return false; |
if (errno) return false; |
814 |
|
if (dest == NULL) return true; |
815 |
*(reinterpret_cast<unsigned long long*>(dest)) = r; |
*(reinterpret_cast<unsigned long long*>(dest)) = r; |
816 |
return true; |
return true; |
817 |
#endif /* HAVE_UNSIGNED_LONG_LONG */ |
#endif /* HAVE_UNSIGNED_LONG_LONG */ |
829 |
double r = strtod(buf, &end); |
double r = strtod(buf, &end); |
830 |
if (end != buf + n) return false; // Leftover junk |
if (end != buf + n) return false; // Leftover junk |
831 |
if (errno) return false; |
if (errno) return false; |
832 |
|
if (dest == NULL) return true; |
833 |
*(reinterpret_cast<double*>(dest)) = r; |
*(reinterpret_cast<double*>(dest)) = r; |
834 |
return true; |
return true; |
835 |
} |
} |
837 |
bool Arg::parse_float(const char* str, int n, void* dest) { |
bool Arg::parse_float(const char* str, int n, void* dest) { |
838 |
double r; |
double r; |
839 |
if (!parse_double(str, n, &r)) return false; |
if (!parse_double(str, n, &r)) return false; |
840 |
|
if (dest == NULL) return true; |
841 |
*(reinterpret_cast<float*>(dest)) = static_cast<float>(r); |
*(reinterpret_cast<float*>(dest)) = static_cast<float>(r); |
842 |
return true; |
return true; |
843 |
} |
} |