From cb9cadad578297ffd78fa8a33670bdf1ab669e7e Mon Sep 17 00:00:00 2001 From: Ed Warnicke Date: Tue, 8 Dec 2015 15:45:58 -0700 Subject: Initial commit of vpp code. Change-Id: Ib246f1fbfce93274020ee93ce461e3d8bd8b9f17 Signed-off-by: Ed Warnicke --- vlib/vlib/parse.h | 171 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 vlib/vlib/parse.h (limited to 'vlib/vlib/parse.h') diff --git a/vlib/vlib/parse.h b/vlib/vlib/parse.h new file mode 100644 index 00000000000..5b9acebf774 --- /dev/null +++ b/vlib/vlib/parse.h @@ -0,0 +1,171 @@ +/* + * 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 +#include +#include + +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 */ -- cgit 1.2.3-korg