Files
vpp/vlib/vlib/parse.h
Ed Warnicke cb9cadad57 Initial commit of vpp code.
Change-Id: Ib246f1fbfce93274020ee93ce461e3d8bd8b9f17
Signed-off-by: Ed Warnicke <eaw@cisco.com>
2015-12-08 15:47:27 -07:00

172 lines
4.2 KiB
C

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