diff options
author | Alexey Samsonov <vonosmas@gmail.com> | 2015-02-19 22:56:47 +0000 |
---|---|---|
committer | Alexey Samsonov <vonosmas@gmail.com> | 2015-02-19 22:56:47 +0000 |
commit | d439c5fe7cbbd5a883b541ca8e51b3d255571417 (patch) | |
tree | 00f249c4841d6f9ff9752bd5496b61d9cfc5dacd /lib/sanitizer_common/sanitizer_common.cc | |
parent | c3997f0660daa18a18aaee530587d0f4b5430312 (diff) |
[Sanitizer] Move TemplateMatch() to sanitizer_common.cc. NFC.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@229923 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common/sanitizer_common.cc')
-rw-r--r-- | lib/sanitizer_common/sanitizer_common.cc | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/lib/sanitizer_common/sanitizer_common.cc b/lib/sanitizer_common/sanitizer_common.cc index 489081e07..4be3c7abf 100644 --- a/lib/sanitizer_common/sanitizer_common.cc +++ b/lib/sanitizer_common/sanitizer_common.cc @@ -288,6 +288,48 @@ void DecreaseTotalMmap(uptr size) { atomic_fetch_sub(&g_total_mmaped, size, memory_order_relaxed); } +bool TemplateMatch(const char *templ, const char *str) { + if (str == 0 || str[0] == 0) + return false; + bool start = false; + if (templ && templ[0] == '^') { + start = true; + templ++; + } + bool asterisk = false; + while (templ && templ[0]) { + if (templ[0] == '*') { + templ++; + start = false; + asterisk = true; + continue; + } + if (templ[0] == '$') + return str[0] == 0 || asterisk; + if (str[0] == 0) + return false; + char *tpos = (char*)internal_strchr(templ, '*'); + char *tpos1 = (char*)internal_strchr(templ, '$'); + if (tpos == 0 || (tpos1 && tpos1 < tpos)) + tpos = tpos1; + if (tpos != 0) + tpos[0] = 0; + const char *str0 = str; + const char *spos = internal_strstr(str, templ); + str = spos + internal_strlen(templ); + templ = tpos; + if (tpos) + tpos[0] = tpos == tpos1 ? '$' : '*'; + if (spos == 0) + return false; + if (start && spos != str0) + return false; + start = false; + asterisk = false; + } + return true; +} + } // namespace __sanitizer using namespace __sanitizer; // NOLINT |