forked from len0rd/rockbox
tagtree.c optmize clause operator parsing
makes WS after a clause conditional optional Change-Id: I335b5381fb788c19130aa8d57dfb18bb43a07c18
This commit is contained in:
parent
1bcb1e39ee
commit
045f52d475
1 changed files with 31 additions and 29 deletions
|
@ -398,26 +398,28 @@ static int get_tag(int *tag)
|
||||||
|
|
||||||
static int get_clause(int *condition)
|
static int get_clause(int *condition)
|
||||||
{
|
{
|
||||||
static const struct match get_clause_match[] =
|
/* one or two operator conditionals */
|
||||||
{
|
#define OPS2VAL(op1, op2) ((int)op1 << 8 | (int)op2)
|
||||||
{"=", clause_is},
|
#define CLAUSE(op1, op2, symbol) {OPS2VAL(op1, op2), symbol }
|
||||||
{"==", clause_is},
|
|
||||||
{"!=", clause_is_not},
|
|
||||||
{">", clause_gt},
|
|
||||||
{">=", clause_gteq},
|
|
||||||
{"<", clause_lt},
|
|
||||||
{"<=", clause_lteq},
|
|
||||||
{"~", clause_contains},
|
|
||||||
{"!~", clause_not_contains},
|
|
||||||
{"^", clause_begins_with},
|
|
||||||
{"!^", clause_not_begins_with},
|
|
||||||
{"$", clause_ends_with},
|
|
||||||
{"!$", clause_not_ends_with},
|
|
||||||
{"@", clause_oneof}
|
|
||||||
};
|
|
||||||
|
|
||||||
char buf[4];
|
struct clause_symbol {int value;int symbol;};
|
||||||
unsigned int i;
|
static const struct clause_symbol get_clause_match[] =
|
||||||
|
{
|
||||||
|
CLAUSE('=', ' ', clause_is),
|
||||||
|
CLAUSE('=', '=', clause_is),
|
||||||
|
CLAUSE('!', '=', clause_is_not),
|
||||||
|
CLAUSE('>', ' ', clause_gt),
|
||||||
|
CLAUSE('>', '=', clause_gteq),
|
||||||
|
CLAUSE('<', ' ', clause_lt),
|
||||||
|
CLAUSE('<', '=', clause_lteq),
|
||||||
|
CLAUSE('~', ' ', clause_contains),
|
||||||
|
CLAUSE('!', '~', clause_not_contains),
|
||||||
|
CLAUSE('^', ' ', clause_begins_with),
|
||||||
|
CLAUSE('!', '^', clause_not_begins_with),
|
||||||
|
CLAUSE('$', ' ', clause_ends_with),
|
||||||
|
CLAUSE('!', '$', clause_not_ends_with),
|
||||||
|
CLAUSE('@', ' ', clause_oneof)
|
||||||
|
};
|
||||||
|
|
||||||
/* Find the start. */
|
/* Find the start. */
|
||||||
while (*strp == ' ' && *strp != '\0')
|
while (*strp == ' ' && *strp != '\0')
|
||||||
|
@ -426,18 +428,16 @@ static int get_clause(int *condition)
|
||||||
if (*strp == '\0')
|
if (*strp == '\0')
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (i = 0; i < sizeof(buf)-1; i++)
|
char op1 = strp[0];
|
||||||
{
|
char op2 = strp[1];
|
||||||
if (*strp == '\0' || *strp == ' ')
|
if (op2 == '"') /*allow " to end a single op conditional */
|
||||||
break ;
|
op2 = ' ';
|
||||||
buf[i] = *strp;
|
|
||||||
strp++;
|
|
||||||
}
|
|
||||||
buf[i] = '\0';
|
|
||||||
|
|
||||||
for (i = 0; i < ARRAYLEN(get_clause_match); i++)
|
int value = OPS2VAL(op1, op2);
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < ARRAYLEN(get_clause_match); i++)
|
||||||
{
|
{
|
||||||
if (!strcasecmp(buf, get_clause_match[i].str))
|
if (value == get_clause_match[i].value)
|
||||||
{
|
{
|
||||||
*condition = get_clause_match[i].symbol;
|
*condition = get_clause_match[i].symbol;
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -445,6 +445,8 @@ static int get_clause(int *condition)
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
#undef OPS2VAL
|
||||||
|
#undef CLAUSE
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool read_clause(struct tagcache_search_clause *clause)
|
static bool read_clause(struct tagcache_search_clause *clause)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue