2 * Copyright (c) 2015 Cisco and/or its affiliates.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
15 #include <vlib/parse.h>
18 parse_last_match_value (vlib_parse_main_t * pm)
21 i = pool_elt_at_index (pm->parse_items,
22 vec_elt (pm->match_items,
23 vec_len (pm->match_items) - 1));
24 return i->value.as_pointer;
28 eof_match (vlib_parse_main_t * pm, vlib_parse_type_t * type,
29 vlib_lex_token_t * t, vlib_parse_value_t * valuep)
32 VLIB_LEX_eof ? VLIB_PARSE_MATCH_DONE : VLIB_PARSE_MATCH_FAIL;
35 PARSE_TYPE_INIT (eof, eof_match, 0 /* cleanup value */ ,
36 0 /* format value */ );
39 rule_eof_match (vlib_parse_main_t * pm, vlib_parse_type_t * type,
40 vlib_lex_token_t * t, vlib_parse_value_t * valuep)
42 vlib_parse_match_function_t *fp = parse_last_match_value (pm);
43 pm->current_token_index--;
44 return fp ? fp (pm, type, t, valuep) : VLIB_PARSE_MATCH_RULE;
47 PARSE_TYPE_INIT (rule_eof, rule_eof_match, 0, 0);
50 word_match (vlib_parse_main_t * pm, vlib_parse_type_t * type,
51 vlib_lex_token_t * t, vlib_parse_value_t * valuep)
56 if (t->token != VLIB_LEX_word)
57 return VLIB_PARSE_MATCH_FAIL;
59 tv = t->value.as_pointer;
60 iv = parse_last_match_value (pm);
62 for (i = 0; tv[i]; i++)
65 return VLIB_PARSE_MATCH_FAIL;
68 return iv[i] == 0 ? VLIB_PARSE_MATCH_FULL : VLIB_PARSE_MATCH_PARTIAL;
71 PARSE_TYPE_INIT (word, word_match, 0 /* clnup value */ ,
72 0 /* format value */ );
75 number_match (vlib_parse_main_t * pm, vlib_parse_type_t * type,
76 vlib_lex_token_t * t, vlib_parse_value_t * valuep)
78 if (t->token == VLIB_LEX_number)
80 valuep->value.as_uword = t->value.as_uword;
81 return VLIB_PARSE_MATCH_VALUE;
83 return VLIB_PARSE_MATCH_FAIL;
87 format_value_number (u8 * s, va_list * args)
89 vlib_parse_value_t *v = va_arg (*args, vlib_parse_value_t *);
90 uword a = v->value.as_uword;
92 if (BITS (uword) == 64)
93 s = format (s, "%lld(0x%llx)", a, a);
95 s = format (s, "%ld(0x%lx)", a, a);
99 PARSE_TYPE_INIT (number, number_match, 0 /* cln value */ ,
100 format_value_number /* fmt value */ );
103 #define foreach_vanilla_lex_match_function \
111 #define LEX_MATCH_DEBUG 0
114 vlib_parse_match_t name##_match (vlib_parse_main_t *pm, \
115 vlib_parse_type_t *type, \
116 vlib_lex_token_t *t, \
117 vlib_parse_value_t *valuep) \
119 if (LEX_MATCH_DEBUG > 0) \
120 clib_warning ("against %U returns %s", \
121 format_vlib_lex_token, pm->lex_main, t, \
122 (t->token == VLIB_LEX_##name) \
123 ? "VLIB_PARSE_MATCH_FULL" : \
124 "VLIB_PARSE_MATCH_FAIL"); \
125 if (t->token == VLIB_LEX_##name) \
126 return VLIB_PARSE_MATCH_FULL; \
127 return VLIB_PARSE_MATCH_FAIL; \
130 PARSE_TYPE_INIT (name, name##_match, 0 /* cln value */, \
133 foreach_vanilla_lex_match_function
135 /* So we're linked in. */
136 static clib_error_t *
137 parse_builtin_init (vlib_main_t * vm)
142 VLIB_INIT_FUNCTION (parse_builtin_init);
145 * fd.io coding-style-patch-verification: ON
148 * eval: (c-set-style "gnu")