mirror of
https://github.com/libretro/bsnes-libretro-cplusplus98.git
synced 2025-04-13 07:30:47 +00:00
77 lines
1.6 KiB
C++
77 lines
1.6 KiB
C++
#ifndef NALL_STRING_MATCH_HPP
|
|
#define NALL_STRING_MATCH_HPP
|
|
|
|
namespace nall {
|
|
|
|
inline bool match(const char *p, const char *s) {
|
|
const char *p_ = 0, *s_ = 0;
|
|
|
|
for(;;) {
|
|
if(!*s) {
|
|
while(*p == '*') p++;
|
|
return !*p;
|
|
}
|
|
|
|
//wildcard match
|
|
if(*p == '*') {
|
|
p_ = p++, s_ = s;
|
|
continue;
|
|
}
|
|
|
|
//any match
|
|
if(*p == '?') {
|
|
p++, s++;
|
|
continue;
|
|
}
|
|
|
|
//ranged match
|
|
if(*p == '{') {
|
|
#define pattern(name_, rule_) \
|
|
if(strbegin(p, name_)) { \
|
|
if(rule_) { \
|
|
p += sizeof(name_) - 1, s++; \
|
|
continue; \
|
|
} \
|
|
goto failure; \
|
|
}
|
|
|
|
pattern("{alpha}", (*s >= 'A' && *s <= 'Z') || (*s >= 'a' && *s <= 'z'))
|
|
pattern("{alphanumeric}", (*s >= 'A' && *s <= 'Z') || (*s >= 'a' && *s <= 'z') || (*s >= '0' && *s <= '9'))
|
|
pattern("{binary}", (*s == '0' || *s == '1'))
|
|
pattern("{hex}", (*s >= '0' && *s <= '9') || (*s >= 'A' && *s <= 'F') || (*s >= 'a' && *s <= 'f'))
|
|
pattern("{lowercase}", (*s >= 'a' && *s <= 'z'))
|
|
pattern("{numeric}", (*s >= '0' && *s <= '9'))
|
|
pattern("{uppercase}", (*s >= 'A' && *s <= 'Z'))
|
|
pattern("{whitespace}", (*s == ' ' || *s == '\t'))
|
|
|
|
#undef pattern
|
|
goto failure;
|
|
}
|
|
|
|
//reserved character match
|
|
if(*p == '\\') {
|
|
p++;
|
|
//fallthrough
|
|
}
|
|
|
|
//literal match
|
|
if(*p == *s) {
|
|
p++; s++;
|
|
continue;
|
|
}
|
|
|
|
//attempt wildcard rematch
|
|
failure:
|
|
if(p_) {
|
|
p = p_, s = s_ + 1;
|
|
continue;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|