From a41e9737e9b962a15ecea445724762de8877293d Mon Sep 17 00:00:00 2001 From: JustinAJ Date: Tue, 14 Oct 2014 02:07:05 -0400 Subject: [PATCH] Added memory buffer match() and matchi() functions. Fixed match() and matchi() parsing. --- Jupiter/Readable_String.h | 2 + Jupiter/Readable_String_Imp.h | 524 +++++++++++++++++++--------------- Release/Jupiter.lib | Bin 243272 -> 245344 bytes 3 files changed, 301 insertions(+), 225 deletions(-) diff --git a/Jupiter/Readable_String.h b/Jupiter/Readable_String.h index e5f31e5..431ca7a 100644 --- a/Jupiter/Readable_String.h +++ b/Jupiter/Readable_String.h @@ -157,6 +157,7 @@ namespace Jupiter */ bool match(const Readable_String &format) const; bool match(const std::basic_string &format) const; + bool match(const T *format, size_t formatSize) const; bool match(const T *format) const; /** @@ -168,6 +169,7 @@ namespace Jupiter */ bool matchi(const Readable_String &format) const; bool matchi(const std::basic_string &format) const; + bool matchi(const T *format, size_t formatSize) const; bool matchi(const T *format) const; /** diff --git a/Jupiter/Readable_String_Imp.h b/Jupiter/Readable_String_Imp.h index 4607b9c..7ede4d3 100644 --- a/Jupiter/Readable_String_Imp.h +++ b/Jupiter/Readable_String_Imp.h @@ -366,138 +366,147 @@ template bool Jupiter::Readable_String::equalsi(const std::nullpt // match() -template<> bool inline Jupiter::Readable_String::match(const Jupiter::Readable_String &format) const -{ - size_t index = 0; - size_t formatIndex = 0; - while (formatIndex != format.size()) - { - if (format.get(formatIndex) == '*') - { - formatIndex++; - while (format.get(formatIndex) == '?') - { - if (this->get(index) == 0) return false; - formatIndex++; - index++; - } - if (format.get(formatIndex) == 0) return true; - if (format.get(formatIndex) == '*') continue; - while (format.get(formatIndex) != this->get(index)) - { - if (this->get(index) == 0) return false; - index++; - } - } - else if (format.get(formatIndex) != '?' && format.get(formatIndex) != this->get(index)) return false; - formatIndex++; - index++; - } - return index == this->size(); -} - -template<> bool inline Jupiter::Readable_String::match(const Jupiter::Readable_String &format) const +template bool Jupiter::Readable_String::match(const Jupiter::Readable_String &format) const { - size_t index = 0; - size_t formatIndex = 0; - while (formatIndex != format.size()) - { - if (format.get(formatIndex) == '*') - { - formatIndex++; - while (format.get(formatIndex) == '?') - { - if (this->get(index) == 0) return false; - formatIndex++; - index++; - } - if (format.get(formatIndex) == 0) return true; - if (format.get(formatIndex) == '*') continue; - while (format.get(formatIndex) != this->get(index)) - { - if (this->get(index) == 0) return false; - index++; - } - } - else if (format.get(formatIndex) != '?' && format.get(formatIndex) != this->get(index)) return false; - formatIndex++; - index++; - } - return index == this->size(); + return this->match(format.ptr(), format.size()); } -template bool Jupiter::Readable_String::match(const Jupiter::Readable_String &format) const +template bool Jupiter::Readable_String::match(const std::basic_string &format) const { - return false; // Wildcard matching not supported for type. + return this->match(format.data(), format.size()); } -template<> bool inline Jupiter::Readable_String::match(const std::basic_string &format) const +template<> bool inline Jupiter::Readable_String::match(const char *format, size_t formatSize) const { + if (this->size() == 0) + { + if (formatSize == 0) + return true; + while (format[--formatSize] == '*') + if (formatSize == 0) + return *format == '*'; + return false; + } size_t index = 0; size_t formatIndex = 0; - while (formatIndex != format.size()) + while (formatIndex != formatSize) { - if (format.at(formatIndex) == '*') + if (format[formatIndex] == '*') { - formatIndex++; - while (format.at(formatIndex) == '?') + if (++formatIndex == formatSize) + return true; + + while (format[formatIndex] == '?') { - if (this->get(index) == 0) return false; - formatIndex++; - index++; + if (++formatIndex == formatSize) + return true; + if (++index == this->size()) + { + while (format[formatIndex++] == '*') + if (formatIndex == formatSize) + return true; + return false; + } } - if (format.at(formatIndex) == 0) return true; - if (format.at(formatIndex) == '*') continue; - while (format.at(formatIndex) != this->get(index)) + if (format[formatIndex] == '*') continue; + + while (format[formatIndex] != this->get(index)) { - if (this->get(index) == 0) return false; - index++; + if (++index == this->size()) + { + while (format[formatIndex] == '*') + if (++formatIndex == formatSize) + return true; + return false; + } } } - else if (format.at(formatIndex) != '?' && format.at(formatIndex) != this->get(index)) return false; + else if (format[formatIndex] != '?' && format[formatIndex] != this->get(index)) return false; formatIndex++; - index++; + if (++index == this->size()) + { + if (formatIndex == formatSize) + return true; + while (format[formatIndex] == '*') + if (++formatIndex == formatSize) + return true; + return false; + } } - return index == this->size(); + return false; } -template<> bool inline Jupiter::Readable_String::match(const std::basic_string &format) const +template<> bool inline Jupiter::Readable_String::match(const wchar_t *format, size_t formatSize) const { + if (this->size() == 0) + { + if (formatSize == 0) + return true; + while (format[--formatSize] == L'*') + if (formatSize == 0) + return *format == L'*'; + return false; + } size_t index = 0; size_t formatIndex = 0; - while (formatIndex != format.size()) + while (formatIndex != formatSize) { - if (format.at(formatIndex) == '*') + if (format[formatIndex] == L'*') { - formatIndex++; - while (format.at(formatIndex) == '?') + if (++formatIndex == formatSize) + return true; + + while (format[formatIndex] == L'?') { - if (this->get(index) == 0) return false; - formatIndex++; - index++; + if (++formatIndex == formatSize) + return index + 1 == this->size(); + if (++index == this->size()) + { + while (format[formatIndex++] == L'*') + if (formatIndex == formatSize) + return true; + return false; + } } - if (format.at(formatIndex) == 0) return true; - if (format.at(formatIndex) == '*') continue; - while (format.at(formatIndex) != this->get(index)) + if (format[formatIndex] == L'*') continue; + + while (format[formatIndex] != this->get(index)) { - if (this->get(index) == 0) return false; - index++; + if (++index == this->size()) + { + while (format[formatIndex] == L'*') + if (++formatIndex == formatSize) + return true; + return false; + } } } - else if (format.at(formatIndex) != '?' && format.at(formatIndex) != this->get(index)) return false; + else if (format[formatIndex] != L'?' && format[formatIndex] != this->get(index)) return false; formatIndex++; - index++; + if (++index == this->size()) + { + while (format[formatIndex] == L'*') + if (++formatIndex == formatSize) + return true; + return false; + } } - return index == this->size(); + return false; } -template bool Jupiter::Readable_String::match(const std::basic_string &format) const +template bool Jupiter::Readable_String::match(const T *, size_t) const { return false; // Wildcard matching not supported for type. } -template<> inline bool Jupiter::Readable_String::match(const char *format) const +template<> bool inline Jupiter::Readable_String::match(const char *format) const { + if (this->size() == 0) + { + while (*format == '*') + format++; + return *format == 0; + } size_t index = 0; while (*format != 0) { @@ -506,27 +515,47 @@ template<> inline bool Jupiter::Readable_String::match(const char *format) format++; while (*format == '?') { - if (this->get(index) == 0) return false; format++; - index++; + if (++index == this->size()) + { + while (*format == '*') + format++; + return *format == 0; + } } if (*format == 0) return true; if (*format == '*') continue; + while (*format != this->get(index)) { - if (this->get(index) == 0) return false; - index++; + if (++index == this->size()) + { + while (*format == '*') + format++; + return *format == 0; + } } } else if (*format != '?' && *format != this->get(index)) return false; format++; - index++; + if (++index == this->size()) + { + while (*format == '*') + format++; + return *format == 0; + } } - return index == this->size(); + return false; } -template<> inline bool Jupiter::Readable_String::match(const wchar_t *format) const +template<> bool inline Jupiter::Readable_String::match(const wchar_t *format) const { + if (this->size() == 0) + { + while (*format == L'*') + format++; + return *format == 0; + } size_t index = 0; while (*format != 0) { @@ -535,23 +564,37 @@ template<> inline bool Jupiter::Readable_String::match(const wchar_t *f format++; while (*format == L'?') { - if (this->get(index) == 0) return false; format++; - index++; + if (this->size() == 0) + { + while (*format == L'*') + format++; + return *format == 0; + } } if (*format == 0) return true; - if (*format == L'*') continue; + if (*format == '*') continue; + while (*format != this->get(index)) { - if (this->get(index) == 0) return false; - index++; + if (this->size() == 0) + { + while (*format == L'*') + format++; + return *format == 0; + } } } else if (*format != L'?' && *format != this->get(index)) return false; format++; - index++; + if (this->size() == 0) + { + while (*format == L'*') + format++; + return *format == 0; + } } - return index == this->size(); + return false; } template bool Jupiter::Readable_String::match(const T *format) const @@ -561,147 +604,147 @@ template bool Jupiter::Readable_String::match(const T *format) co // matchi() -template<> bool inline Jupiter::Readable_String::matchi(const Jupiter::Readable_String &format) const +template bool Jupiter::Readable_String::matchi(const Jupiter::Readable_String &format) const { - int fUpper; - size_t index = 0; - size_t formatIndex = 0; - while (formatIndex != format.size()) - { - if (format.get(formatIndex) == L'*') - { - formatIndex++; - while (format.get(formatIndex) == L'?') - { - if (this->get(index) == 0) return false; - formatIndex++; - index++; - } - if (format.get(formatIndex) == 0) return true; - if (format.get(formatIndex) == '*') continue; - fUpper = toupper(format.get(formatIndex)); - while (fUpper != toupper(this->get(index))) - { - if (this->get(index) == 0) return false; - index++; - } - } - else if (format.get(formatIndex) != L'?' && toupper(format.get(formatIndex)) != toupper(this->get(index))) return false; - formatIndex++; - index++; - } - return index == this->size(); + return this->matchi(format.ptr(), format.size()); } -template<> bool inline Jupiter::Readable_String::matchi(const Jupiter::Readable_String &format) const -{ - wint_t fUpper; - size_t index = 0; - size_t formatIndex = 0; - while (formatIndex != format.size()) - { - if (format.get(formatIndex) == L'*') - { - formatIndex++; - while (format.get(formatIndex) == L'?') - { - if (this->get(index) == 0) return false; - formatIndex++; - index++; - } - if (format.get(formatIndex) == 0) return true; - if (format.get(formatIndex) == '*') continue; - fUpper = towupper(format.get(formatIndex)); - while (fUpper != towupper(this->get(index))) - { - if (this->get(index) == 0) return false; - index++; - } - } - else if (format.get(formatIndex) != L'?' && towupper(format.get(formatIndex)) != towupper(this->get(index))) return false; - formatIndex++; - index++; - } - return index == this->size(); -} - -template bool Jupiter::Readable_String::matchi(const Jupiter::Readable_String &format) const +template bool Jupiter::Readable_String::matchi(const std::basic_string &format) const { - return false; // Wildcard matching not supported for type. Concept of "case" not supported for type. + return this->matchi(format.data(), format.size()); } -template<> bool inline Jupiter::Readable_String::matchi(const std::basic_string &format) const +template<> bool inline Jupiter::Readable_String::matchi(const char *format, size_t formatSize) const { - int fUpper; + if (this->size() == 0) + { + if (formatSize == 0) + return true; + while (format[--formatSize] == '*') + if (formatSize == 0) + return *format == '*'; + return false; + } size_t index = 0; size_t formatIndex = 0; - while (formatIndex != format.size()) + while (formatIndex != formatSize) { - if (format.at(formatIndex) == L'*') + if (format[formatIndex] == '*') { - formatIndex++; - while (format.at(formatIndex) == L'?') + if (++formatIndex == formatSize) + return true; + + while (format[formatIndex] == '?') { - if (this->get(index) == 0) return false; - formatIndex++; - index++; + if (++formatIndex == formatSize) + return true; + if (++index == this->size()) + { + while (format[formatIndex++] == '*') + if (formatIndex == formatSize) + return true; + return false; + } } - if (format.at(formatIndex) == 0) return true; - if (format.at(formatIndex) == '*') continue; - fUpper = toupper(format.at(formatIndex)); - while (fUpper != toupper(this->get(index))) + if (format[formatIndex] == '*') continue; + + while (toupper(format[formatIndex]) != toupper(this->get(index))) { - if (this->get(index) == 0) return false; - index++; + if (++index == this->size()) + { + while (format[formatIndex] == '*') + if (++formatIndex == formatSize) + return true; + return false; + } } } - else if (format.at(formatIndex) != L'?' && toupper(format.at(formatIndex)) != toupper(this->get(index))) return false; + else if (format[formatIndex] != '?' && toupper(format[formatIndex]) != toupper(this->get(index))) return false; formatIndex++; - index++; + if (++index == this->size()) + { + if (formatIndex == formatSize) + return true; + while (format[formatIndex] == '*') + if (++formatIndex == formatSize) + return true; + return false; + } } - return index == this->size(); + return false; } -template<> bool inline Jupiter::Readable_String::matchi(const std::basic_string &format) const +template<> bool inline Jupiter::Readable_String::matchi(const wchar_t *format, size_t formatSize) const { - wint_t fUpper; + if (this->size() == 0) + { + if (formatSize == 0) + return true; + while (format[--formatSize] == L'*') + if (formatSize == 0) + return *format == L'*'; + return false; + } size_t index = 0; size_t formatIndex = 0; - while (formatIndex != format.size()) + while (formatIndex != formatSize) { - if (format.at(formatIndex) == L'*') + if (format[formatIndex] == L'*') { - formatIndex++; - while (format.at(formatIndex) == L'?') + if (++formatIndex == formatSize) + return true; + + while (format[formatIndex] == L'?') { - if (this->get(index) == 0) return false; - formatIndex++; - index++; + if (++formatIndex == formatSize) + return index + 1 == this->size(); + if (++index == this->size()) + { + while (format[formatIndex++] == L'*') + if (formatIndex == formatSize) + return true; + return false; + } } - if (format.at(formatIndex) == 0) return true; - if (format.at(formatIndex) == '*') continue; - fUpper = towupper(format.at(formatIndex)); - while (fUpper != towupper(this->get(index))) + if (format[formatIndex] == L'*') continue; + + while (towupper(format[formatIndex]) != towupper(this->get(index))) { - if (this->get(index) == 0) return false; - index++; + if (++index == this->size()) + { + while (format[formatIndex] == L'*') + if (++formatIndex == formatSize) + return true; + return false; + } } } - else if (format.at(formatIndex) != L'?' && towupper(format.at(formatIndex)) != towupper(this->get(index))) return false; + else if (format[formatIndex] != L'?' && towupper(format[formatIndex]) != towupper(this->get(index))) return false; formatIndex++; - index++; + if (++index == this->size()) + { + while (format[formatIndex] == L'*') + if (++formatIndex == formatSize) + return true; + return false; + } } - return index == this->size(); + return false; } -template bool Jupiter::Readable_String::matchi(const std::basic_string &format) const +template bool Jupiter::Readable_String::matchi(const T *, size_t) const { return false; // Wildcard matching not supported for type. Concept of "case" not supported for type. } template<> bool inline Jupiter::Readable_String::matchi(const char *format) const { - int fUpper; + if (this->size() == 0) + { + while (*format == '*') + format++; + return *format == 0; + } size_t index = 0; while (*format != 0) { @@ -710,29 +753,47 @@ template<> bool inline Jupiter::Readable_String::matchi(const char *format format++; while (*format == '?') { - if (this->get(index) == 0) return false; format++; - index++; + if (++index == this->size()) + { + while (*format == '*') + format++; + return *format == 0; + } } if (*format == 0) return true; if (*format == '*') continue; - fUpper = toupper(*format); - while (fUpper != toupper(this->get(index))) + + while (toupper(*format) != toupper(this->get(index))) { - if (this->get(index) == 0) return false; - index++; + if (++index == this->size()) + { + while (*format == '*') + format++; + return *format == 0; + } } } else if (*format != '?' && toupper(*format) != toupper(this->get(index))) return false; format++; - index++; + if (++index == this->size()) + { + while (*format == '*') + format++; + return *format == 0; + } } - return index == this->size(); + return false; } template<> bool inline Jupiter::Readable_String::matchi(const wchar_t *format) const { - wint_t fUpper; + if (this->size() == 0) + { + while (*format == L'*') + format++; + return *format == 0; + } size_t index = 0; while (*format != 0) { @@ -741,24 +802,37 @@ template<> bool inline Jupiter::Readable_String::matchi(const wchar_t * format++; while (*format == L'?') { - if (this->get(index) == 0) return false; format++; - index++; + if (this->size() == 0) + { + while (*format == L'*') + format++; + return *format == 0; + } } if (*format == 0) return true; if (*format == '*') continue; - fUpper = towupper(*format); - while (fUpper != towupper(this->get(index))) + + while (towupper(*format) != towupper(this->get(index))) { - if (this->get(index) == 0) return false; - index++; + if (this->size() == 0) + { + while (*format == L'*') + format++; + return *format == 0; + } } } else if (*format != L'?' && towupper(*format) != towupper(this->get(index))) return false; format++; - index++; + if (this->size() == 0) + { + while (*format == L'*') + format++; + return *format == 0; + } } - return index == this->size(); + return false; } template bool Jupiter::Readable_String::matchi(const T *format) const diff --git a/Release/Jupiter.lib b/Release/Jupiter.lib index 0a05fbb473b88aed3458eb230da4865ebebe041b..28ff3a1cbce35582ca7b1ece3e6fd5761f1fd5a8 100644 GIT binary patch delta 31914 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 z z`$k$294V^LfagbIO6^IODOUZp!ztm@$=AM6b=euxzGY`nr_AWTh({VWd}xm${nalG zyt5l!WPP0CRPkLQoP6y{%@1w=d{uZTtY}}NI_|c-$Nze8<8CLj zKF7?6_N6T8@S(8Cb8@nm^_HEzyo~8asixcDlmU^_D=F+H--yfA{5{r)-0st8h5B<( gh{isRR;teLgtYtkuTt;66T;sYZ}F<+UMJ`O19t%sKL7v# delta 31257 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