diff options
Diffstat (limited to 'src/vlib/parse.h')
-rw-r--r-- | src/vlib/parse.h | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/src/vlib/parse.h b/src/vlib/parse.h new file mode 100644 index 00000000..036e7447 --- /dev/null +++ b/src/vlib/parse.h @@ -0,0 +1,221 @@ +/* + * 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. + */ +#ifndef included_vlib_parse_h +#define included_vlib_parse_h + +#include <vlib/vlib.h> +#include <vlib/lex.h> +#include <vppinfra/mhash.h> + +typedef struct +{ + /* Word aligned value. */ + union + { + u8 as_u8[32 - 1 * sizeof (u16)]; + void *as_pointer; + uword as_uword; + word as_word; + u64 as_u64; + } value; + + /* 16 bit type at end so that 30 bytes of value are aligned. */ + u16 type; +} __attribute ((packed)) + vlib_parse_value_t; + +/* Instance of a type. */ + typedef struct + { + u32 + type; + + u32 + origin; + + u32 + help_index; + + union + { + void * + as_pointer; + uword + as_uword; + } value; + } vlib_parse_item_t; + + typedef struct + { + /* Index of item for this node. */ + u32 + item; + + /* Graph index of peer (sibling) node (linked list of peers). */ + u32 + peer; + + /* Graph index of deeper (child) node (linked list of children). */ + u32 + deeper; + } vlib_parse_graph_t; + +#define foreach_parse_match_type \ + _(MATCH_DONE) \ + _(MATCH_RULE) \ + _(MATCH_FAIL) \ + _(MATCH_FULL) \ + _(MATCH_VALUE) \ + _(MATCH_PARTIAL) \ + _(MATCH_AMBIGUOUS) \ + _(MATCH_EVAL_FAIL) + + typedef enum + { +#define _(a) VLIB_PARSE_##a, + foreach_parse_match_type +#undef _ + } vlib_parse_match_t; + + struct vlib_parse_type; + struct vlib_parse_main; + + typedef + vlib_parse_match_t (vlib_parse_match_function_t) + (struct vlib_parse_main *, + struct vlib_parse_type *, vlib_lex_token_t *, vlib_parse_value_t *); + typedef void (vlib_parse_value_cleanup_function_t) (vlib_parse_value_t + *); + + typedef struct vlib_parse_type + { + /* Type name. */ + char * + name; + + vlib_parse_match_function_t * + match_function; + + vlib_parse_value_cleanup_function_t * + value_cleanup_function; + + format_function_t * + format_value; + + u32 + rule_index; + } vlib_parse_type_t; + + typedef struct + { + char * + initializer; + void * + eof_match; + int + rule_length; + } parse_registration_t; + + typedef struct vlib_parse_main + { + /* (type, origin, help, value) tuples */ + vlib_parse_item_t * + parse_items; + mhash_t + parse_item_hash; + + /* (item, peer, deeper) tuples */ + vlib_parse_graph_t * + parse_graph; + u32 + root_index; + + u8 * + register_input; + + /* parser types */ + vlib_parse_type_t * + parse_types; + uword * + parse_type_by_name_hash; + + /* Vector of MATCH_VALUEs */ + vlib_parse_value_t * + parse_value; + u32 * + match_items; + + /* Parse registrations */ + parse_registration_t ** + parse_registrations; + + /* Token vector */ + vlib_lex_token_t * + tokens; + u32 + current_token_index; + + vlib_lex_main_t * + lex_main; + vlib_main_t * + vlib_main; + } vlib_parse_main_t; + + vlib_parse_main_t + vlib_parse_main; + + typedef + vlib_parse_match_t (vlib_parse_eval_function_t) + (vlib_parse_main_t *, vlib_parse_item_t *, vlib_parse_value_t *); + +vlib_parse_match_t +vlib_parse_eval (u8 * input); + + format_function_t format_vlib_parse_value; + +/* FIXME need these to be global? */ + vlib_parse_match_function_t rule_match, eof_match, word_match, + number_match; + +#define _PARSE_REGISTRATION_DATA(x) \ +VLIB_ELF_SECTION_DATA(x##_registration,parse_registration_t,parse_registrations) + +#define PARSE_INIT(x, s, e) \ +static _PARSE_REGISTRATION_DATA(x) = { \ + .initializer = s, \ + .eof_match = e, \ +}; + +#define _PARSE_TYPE_REGISTRATION_DATA(x) \ +VLIB_ELF_SECTION_DATA(x##_type_registration,vlib_parse_type_t, \ +parse_type_registrations) + +#define PARSE_TYPE_INIT(n, m, c, f) \ +static _PARSE_TYPE_REGISTRATION_DATA(n) = { \ + .name = #n, \ + .match_function = m, \ + .value_cleanup_function = c, \ + .format_value = f, \ +}; + +#endif /* included_vlib_parse_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ |