blob: 036e744723bc7f2acab4731dd6a67f3fc7d4d7bf [file] [log] [blame]
/*
* 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:
*/