blob: 0ce716b539e619a5ba162b90cfb942d31ea2f266 [file] [log] [blame]
/*
* Copyright (c) 2015 Cisco and/or its affiliates.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <vlib/parse.h>
always_inline void *
parse_last_match_value (vlib_parse_main_t * pm)
{
vlib_parse_item_t *i;
i = pool_elt_at_index (pm->parse_items,
vec_elt (pm->match_items,
vec_len (pm->match_items) - 1));
return i->value.as_pointer;
}
vlib_parse_match_t
eof_match (vlib_parse_main_t * pm, vlib_parse_type_t * type,
vlib_lex_token_t * t, vlib_parse_value_t * valuep)
{
return t->token ==
VLIB_LEX_eof ? VLIB_PARSE_MATCH_DONE : VLIB_PARSE_MATCH_FAIL;
}
PARSE_TYPE_INIT (eof, eof_match, 0 /* cleanup value */ ,
0 /* format value */ );
vlib_parse_match_t
rule_eof_match (vlib_parse_main_t * pm, vlib_parse_type_t * type,
vlib_lex_token_t * t, vlib_parse_value_t * valuep)
{
vlib_parse_match_function_t *fp = parse_last_match_value (pm);
pm->current_token_index--;
return fp ? fp (pm, type, t, valuep) : VLIB_PARSE_MATCH_RULE;
}
PARSE_TYPE_INIT (rule_eof, rule_eof_match, 0, 0);
vlib_parse_match_t
word_match (vlib_parse_main_t * pm, vlib_parse_type_t * type,
vlib_lex_token_t * t, vlib_parse_value_t * valuep)
{
u8 *tv, *iv;
int i;
if (t->token != VLIB_LEX_word)
return VLIB_PARSE_MATCH_FAIL;
tv = t->value.as_pointer;
iv = parse_last_match_value (pm);
for (i = 0; tv[i]; i++)
{
if (tv[i] != iv[i])
return VLIB_PARSE_MATCH_FAIL;
}
return iv[i] == 0 ? VLIB_PARSE_MATCH_FULL : VLIB_PARSE_MATCH_PARTIAL;
}
PARSE_TYPE_INIT (word, word_match, 0 /* clnup value */ ,
0 /* format value */ );
vlib_parse_match_t
number_match (vlib_parse_main_t * pm, vlib_parse_type_t * type,
vlib_lex_token_t * t, vlib_parse_value_t * valuep)
{
if (t->token == VLIB_LEX_number)
{
valuep->value.as_uword = t->value.as_uword;
return VLIB_PARSE_MATCH_VALUE;
}
return VLIB_PARSE_MATCH_FAIL;
}
static u8 *
format_value_number (u8 * s, va_list * args)
{
vlib_parse_value_t *v = va_arg (*args, vlib_parse_value_t *);
uword a = v->value.as_uword;
if (BITS (uword) == 64)
s = format (s, "%lld(0x%llx)", a, a);
else
s = format (s, "%ld(0x%lx)", a, a);
return s;
}
PARSE_TYPE_INIT (number, number_match, 0 /* cln value */ ,
format_value_number /* fmt value */ );
#define foreach_vanilla_lex_match_function \
_(plus) \
_(minus) \
_(star) \
_(slash) \
_(lpar) \
_(rpar)
#define LEX_MATCH_DEBUG 0
#define _(name) \
vlib_parse_match_t name##_match (vlib_parse_main_t *pm, \
vlib_parse_type_t *type, \
vlib_lex_token_t *t, \
vlib_parse_value_t *valuep) \
{ \
if (LEX_MATCH_DEBUG > 0) \
clib_warning ("against %U returns %s", \
format_vlib_lex_token, pm->lex_main, t, \
(t->token == VLIB_LEX_##name) \
? "VLIB_PARSE_MATCH_FULL" : \
"VLIB_PARSE_MATCH_FAIL"); \
if (t->token == VLIB_LEX_##name) \
return VLIB_PARSE_MATCH_FULL; \
return VLIB_PARSE_MATCH_FAIL; \
} \
\
PARSE_TYPE_INIT (name, name##_match, 0 /* cln value */, \
0 /* fmt val */);
foreach_vanilla_lex_match_function
#undef _
/* So we're linked in. */
static clib_error_t *
parse_builtin_init (vlib_main_t * vm)
{
return 0;
}
VLIB_INIT_FUNCTION (parse_builtin_init);
/*
* fd.io coding-style-patch-verification: ON
*
* Local Variables:
* eval: (c-set-style "gnu")
* End:
*/