mirror of
https://github.com/cesanta/slre.git
synced 2025-03-13 01:05:29 +00:00
Implemented 0xHH match
This commit is contained in:
parent
8cfa4336fc
commit
7f8fbe5680
@ -35,12 +35,12 @@ most.
|
|||||||
? Match zero or once
|
? Match zero or once
|
||||||
x|y Match x or y (alternation operator)
|
x|y Match x or y (alternation operator)
|
||||||
\meta Match one of the meta character: ^$().[]*+?|\
|
\meta Match one of the meta character: ^$().[]*+?|\
|
||||||
|
\xHH Match byte with hex value 0xHH
|
||||||
|
|
||||||
Not yet supported but in progress:
|
Not yet supported but in progress:
|
||||||
|
|
||||||
[...] Match any character from set. A-Z like ranges supported
|
[...] Match any character from set. A-Z like ranges supported
|
||||||
[^...] Match any character but ones from set
|
[^...] Match any character but ones from set
|
||||||
\xDD Match byte with hex value 0xDD
|
|
||||||
|
|
||||||
## API
|
## API
|
||||||
|
|
||||||
|
29
slre.c
29
slre.c
@ -74,13 +74,21 @@ struct regex_info {
|
|||||||
enum { IGNORE_CASE = 1 };
|
enum { IGNORE_CASE = 1 };
|
||||||
|
|
||||||
static int get_op_len(const char *re) {
|
static int get_op_len(const char *re) {
|
||||||
return re[0] == '\\' ? 2 : 1;
|
return re[0] == '\\' && re[1] == 'x' ? 4 :
|
||||||
|
re[0] == '\\' ? 2 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int is_quantifier(const char *re) {
|
static int is_quantifier(const char *re) {
|
||||||
return re[0] == '*' || re[0] == '+' || re[0] == '?';
|
return re[0] == '*' || re[0] == '+' || re[0] == '?';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int toi(int x) {
|
||||||
|
return isdigit(x) ? x - '0' : x - 'W';
|
||||||
|
}
|
||||||
|
static int hextoi(const unsigned char *s) {
|
||||||
|
return (toi(tolower(s[0])) << 4) | toi(tolower(s[1]));
|
||||||
|
}
|
||||||
|
|
||||||
static int doh(const char *s, int s_len,
|
static int doh(const char *s, int s_len,
|
||||||
struct slre_cap *caps, struct regex_info *info, int bi);
|
struct slre_cap *caps, struct regex_info *info, int bi);
|
||||||
|
|
||||||
@ -156,6 +164,18 @@ static int bar(const char *re, int re_len, const char *s, int s_len,
|
|||||||
j++;
|
j++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'x':
|
||||||
|
/* Match byte, \xHH where HH is hexadecimal byte representaion */
|
||||||
|
{
|
||||||
|
const unsigned char *r = (const unsigned char *) re + i + 2;
|
||||||
|
FAIL_IF(!(isxdigit(r[0]) && isxdigit(r[1])),
|
||||||
|
static_error_invalid_metacharacter);
|
||||||
|
FAIL_IF(hextoi(r) != * (unsigned char *) (s + j),
|
||||||
|
static_error_no_match);
|
||||||
|
}
|
||||||
|
j++;
|
||||||
|
break;
|
||||||
|
|
||||||
case '+': case '?': case '*': case '\\': case '(': case ')':
|
case '+': case '?': case '*': case '\\': case '(': case ')':
|
||||||
case '^': case '$': case '.': case '[': case ']':
|
case '^': case '$': case '.': case '[': case ']':
|
||||||
FAIL_IF(re[i + 1] != s[j], static_error_no_match);
|
FAIL_IF(re[i + 1] != s[j], static_error_no_match);
|
||||||
@ -426,6 +446,13 @@ int main(void) {
|
|||||||
ASSERT(strcmp(msg, static_error_unexpected_quantifier) == 0);
|
ASSERT(strcmp(msg, static_error_unexpected_quantifier) == 0);
|
||||||
ASSERT(slre_match("()+", "fooklmn", 7, NULL, &msg) == 0);
|
ASSERT(slre_match("()+", "fooklmn", 7, NULL, &msg) == 0);
|
||||||
ASSERT(strcmp(msg, static_error_no_match) == 0);
|
ASSERT(strcmp(msg, static_error_no_match) == 0);
|
||||||
|
ASSERT(slre_match("\\x", "12", 2, NULL, &msg) == 0);
|
||||||
|
ASSERT(strcmp(msg, static_error_invalid_metacharacter) == 0);
|
||||||
|
ASSERT(slre_match("\\xhi", "12", 2, NULL, &msg) == 0);
|
||||||
|
ASSERT(strcmp(msg, static_error_invalid_metacharacter) == 0);
|
||||||
|
ASSERT(slre_match("\\x20", "_ J", 3, NULL, &msg) == 2);
|
||||||
|
ASSERT(slre_match("\\x4A", "_ J", 3, NULL, &msg) == 3);
|
||||||
|
ASSERT(slre_match("\\d+", "abc123def", 9, NULL, &msg) == 6);
|
||||||
|
|
||||||
/* Balancing brackets */
|
/* Balancing brackets */
|
||||||
ASSERT(slre_match("(x))", "fooklmn", 7, NULL, &msg) == 0);
|
ASSERT(slre_match("(x))", "fooklmn", 7, NULL, &msg) == 0);
|
||||||
|
Loading…
Reference in New Issue
Block a user