/* * 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_lex_h #define included_vlib_lex_h #include #include #include #include #define foreach_vlib_lex_global_token \ _ (invalid) \ _ (eof) \ _ (word) \ _ (number) \ _ (lt) \ _ (gt) \ _ (dot) \ _ (slash) \ _ (qmark) \ _ (equals) \ _ (plus) \ _ (minus) \ _ (star) \ _ (lpar) \ _ (rpar) typedef enum { #define _(f) VLIB_LEX_##f, foreach_vlib_lex_global_token #undef _ } vlib_lex_global_token_t; typedef enum { VLIB_LEX_IGNORE, VLIB_LEX_ADD_TO_TOKEN, VLIB_LEX_RETURN, VLIB_LEX_RETURN_AND_RESCAN, VLIB_LEX_KEYWORD_CHECK, VLIB_LEX_START_NUMBER, VLIB_LEX_ADD_TO_NUMBER, } vlib_lex_action_t; typedef struct { u16 action; u16 next_table_index; u16 token; } vlib_lex_table_entry_t; typedef struct { char *name; vlib_lex_table_entry_t entries [128]; } vlib_lex_table_t; typedef struct { u32 token; union { uword as_uword; void * as_pointer; char * as_string; } value; } vlib_lex_token_t; typedef struct { vlib_lex_table_t * lex_tables; uword * lex_tables_by_name; /* Vector of token strings. */ char ** lex_token_names; /* Hash mapping c string name to token index. */ uword * lex_tokens_by_name; /* Hash mapping c string keyword name to token index. */ uword * lex_keywords; vlib_lex_token_t * pushback_vector; i32 pushback_sp; u32 current_table_index; uword current_token_value; uword current_number_base; /* Input string we are lex-ing. */ u8 *input_vector; /* Current index into input vector. */ u32 current_index; /* Re-used vector for forming token strings and hashing them. */ u8 * token_buffer; } vlib_lex_main_t; vlib_lex_main_t vlib_lex_main; always_inline void vlib_lex_cleanup_token (vlib_lex_token_t * t) { if (t->token == VLIB_LEX_word) { u8 * tv = t->value.as_pointer; vec_free (tv); } } u16 vlib_lex_add_table (char *name); void vlib_lex_get_token (vlib_lex_main_t *lm, vlib_lex_token_t * result); u16 vlib_lex_add_token (vlib_lex_main_t *lm, char *token_name); void vlib_lex_set_action_range (u32 table_index, u8 lo, u8 hi, u16 action, u16 token, u32 next_table_index); void vlib_lex_reset (vlib_lex_main_t *lm, u8 *input_vector); format_function_t format_vlib_lex_token; #endif /* included_vlib_lex_h */