| /* |
| * 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: |
| */ |