Commit e51dd464 authored by Joshua Bussdieker's avatar Joshua Bussdieker

Put library code up top

parent 373a1859
......@@ -15,46 +15,172 @@
#define M_CASE 4
#define M_NOT 5
int
key_ParseMatcher(const char *s, struct vsb **sb) {
const char *p = s;
int enum_matchers(const char *matcher, int *type, const char **param, int *s) {
const char *p = matcher;
const char *e;
while (*p == ';') {
if (*p != ';')
return -1;
if (*p != ';')
return 0;
p++;
if (strncmp(p, "w=\"", 3) == 0) {
p += 3;
for (e = p; *e != '\"' || e[-1] == '\\'; e++)
continue;
*param = p;
*s = (int)(e-p);
*type = M_WORD;
p = e + 1;
} else if (strncmp(p, "s=\"", 3) == 0) {
p += 3;
for (e = p; *e != '\"' || e[-1] == '\\'; e++)
continue;
*param = p;
*s = (int)(e-p);
*type = M_SUBSTRING;
p = e + 1;
} else if (strncmp(p, "b=\"", 3) == 0) {
p += 3;
for (e = p; *e != '\"' || e[-1] == '\\'; e++)
continue;
*param = p;
*s = (int)(e-p);
*type = M_BEGINNING;
p = e + 1;
} else if (*p == 'c') {
*s = 0;
*type = M_CASE;
p++;
} else if (*p == 'n') {
*s = 0;
*type = M_NOT;
p++;
} else {
// Invalid matcher
return -1;
}
return p - matcher;
}
if (strncmp(p, "w=\"", 3) == 0) {
p += 3;
for (e = p; *e != '\"'; e++)
continue;
VSB_printf(*sb, "%c%.*s%c", M_WORD, (int)(e -p), p, 0);
p = e + 1;
} else if (strncmp(p, "s=\"", 3) == 0) {
p += 3;
for (e = p; *e != '\"'; e++)
continue;
VSB_printf(*sb, "%c%.*s%c", M_SUBSTRING, (int)(e -p), p, 0);
p = e + 1;
} else if (strncmp(p, "b=\"", 3) == 0) {
p += 3;
for (e = p; *e != '\"'; e++)
continue;
VSB_printf(*sb, "%c%.*s%c", M_BEGINNING, (int)(e -p), p, 0);
p = e + 1;
} else if (*p == 'c') {
VSB_printf(*sb, "%c", M_CASE);
p++;
} else if (*p == 'n') {
VSB_printf(*sb, "%c", M_NOT);
p++;
int enum_fields(const char *fv, const char **m, int *s) {
const char *f, *b;
enum state {
start,
skip_space,
scan,
scan_quote,
scan_back,
done,
end
} cur_state = start;
do {
switch (cur_state) {
case start:
f = fv;
cur_state = skip_space;
break;
case skip_space:
if (*f == '\0')
cur_state = end;
else if (*f == ' ' || *f == ',')
f++;
else if (*f == '"') {
b = f;
cur_state = scan_quote;
} else {
// Invalid matcher
return -1;
b = f;
cur_state = scan;
}
break;
case scan:
b++;
if (*b == '\0')
cur_state = scan_back;
else if (*b == '"')
cur_state = scan_quote;
else if (*b == ',')
cur_state = scan_back;
break;
case scan_quote:
b++;
if (*b == '\0')
cur_state = scan_back;
else if (*b == '\\' && b[1] != '\0')
b += 2;
else if (*b == '"')
cur_state = scan;
break;
case scan_back:
b--;
if (*b != ' ')
cur_state = done;
break;
case done:
*m = f;
*s = (int)(b-f)+1;
return b - fv + 1;
break;
}
} while (cur_state != end);
return 0;
}
int cmp_func(const char *str1, const char *str2, int size, int case_sensitive) {
if (case_sensitive == 1)
return strncmp(str1, str2, size);
else
return strncasecmp(str1, str2, size);
}
int word_matcher(const char *p, const char *fv, int case_sensitive) {
int read, size, offset = 0;
const char *match;
while (read = enum_fields(fv + offset, &match, &size)) {
if (strlen(p) == size) {
if (cmp_func(match, p, size, case_sensitive) == 0) {
return 1;
}
}
offset += read;
}
return 0;
}
int substring_matcher(const char *p, const char *fv, int case_sensitive) {
int read, size, offset = 0;
const char *match;
while (read = enum_fields(fv + offset, &match, &size)) {
if (strlen(p) <= size) {
const char *s;
for (s = match; s <= match + size - strlen(p); s++) {
if (cmp_func(s, p, strlen(p), case_sensitive) == 0) {
return 1;
}
}
}
return p - s;
offset += read;
}
return 0;
}
int beginning_substring_matcher(const char *p, const char *fv, int case_sensitive) {
int read, size, offset = 0;
const char *match;
while (read = enum_fields(fv + offset, &match, &size)) {
if (strlen(p) <= size) {
if (cmp_func(match, p, strlen(p), case_sensitive) == 0) {
return 1;
}
}
offset += read;
}
return 0;
}
/*
......@@ -119,14 +245,20 @@ KEY_Create(struct busyobj *bo, struct vsb **psb)
if (*q == ';') {
VSB_clear(sbm);
int ksize = key_ParseMatcher(q, &sbm);
if (ksize > 0)
q += ksize;
else {
// TODO: Cleanup allocations
error = 1;
return 0;
int read;
int type;
const char *match;
int size;
while (read = enum_matchers(q, &type, &match, &size)) {
if (read < 0) {
// TODO: Cleanup allocations
error = 1;
return 0;
}
VSB_printf(sbm, "%c%.*s%c", type, size, match, 0);
q += read;
}
AZ(VSB_finish(sbm));
l = VSB_len(sbm);
e = h;
......@@ -201,126 +333,6 @@ KEY_Validate(const uint8_t *key)
}
}
int enum_fields(const char *fv, const char **m, int *s) {
const char *f = 0, *b = 0;
enum state {
start,
skip_space,
scan,
scan_quote,
scan_back,
done,
end
} cur_state = start;
do {
switch (cur_state) {
case start:
f = fv;
cur_state = skip_space;
break;
case skip_space:
if (*f == '\0')
cur_state = end;
else if (*f == ' ' || *f == ',')
f++;
else if (*f == '"') {
b = f;
cur_state = scan_quote;
} else {
b = f;
cur_state = scan;
}
break;
case scan:
b++;
if (*b == '\0')
cur_state = scan_back;
else if (*b == '"')
cur_state = scan_quote;
else if (*b == ',')
cur_state = scan_back;
break;
case scan_quote:
b++;
if (*b == '\0')
cur_state = scan_back;
else if (*b == '\\' && b[1] != '\0')
b += 2;
else if (*b == '"')
cur_state = scan;
break;
case scan_back:
b--;
if (*b != ' ')
cur_state = done;
break;
case done:
*m = f;
*s = (int)(b-f)+1;
return b - fv + 1;
break;
}
} while (cur_state != end);
return 0;
}
int cmp_func(const char *str1, const char *str2, int size, int case_sensitive) {
if (case_sensitive == 1)
return strncmp(str1, str2, size);
else
return strncasecmp(str1, str2, size);
}
int word_matcher(const char *p, const char *fv, int case_sensitive) {
int read, size, offset = 0;
const char *match;
while (read = enum_fields(fv + offset, &match, &size)) {
if (strlen(p) == size) {
if (cmp_func(match, p, size, case_sensitive) == 0) {
return 1;
}
}
offset += read;
}
return 0;
}
int substring_matcher(const char *p, const char *fv, int case_sensitive) {
int read, size, offset = 0;
const char *match;
while (read = enum_fields(fv + offset, &match, &size)) {
if (strlen(p) <= size) {
const char *s;
for (s = match; s <= match + size - strlen(p); s++) {
if (cmp_func(s, p, strlen(p), case_sensitive) == 0) {
return 1;
}
}
}
offset += read;
}
return 0;
}
int beginning_substring_matcher(const char *p, const char *fv, int case_sensitive) {
int read, size, offset = 0;
const char *match;
while (read = enum_fields(fv + offset, &match, &size)) {
if (strlen(p) <= size) {
if (cmp_func(match, p, strlen(p), case_sensitive) == 0) {
return 1;
}
}
offset += read;
}
return 0;
}
int
KEY_Match(struct http *http, const uint8_t *key)
{
......@@ -392,10 +404,10 @@ KEY_Match(struct http *http, const uint8_t *key)
matcher += strlen(matcher) + 1;
} else if (*matcher == M_CASE) {
case_flag = 1;
matcher++;
matcher += strlen(matcher) + 1;
} else if (*matcher == M_NOT) {
not_flag = 0;
matcher++;
matcher += strlen(matcher) + 1;
} else {
result = 0;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment