From 961e3c8428be81ae74f7e8ee293b16808a74d45e Mon Sep 17 00:00:00 2001 From: Dave Barach Date: Thu, 18 Jun 2020 17:04:18 -0400 Subject: vlib: add recursive macro expander to debug cli All of the pieces have been sitting around for years. Added several debug CLI commands: "define " "undefine " "show macro [noeval]" "echo " Macros may refer to other macros. To defer evaluation: "define foo \$(bar)" or some such. The macro evaluator is not smart about "define foo \$(foo)" or more complicated circular definitions, so don't do that. Environment variables are available, simply use $ The macro expander has a table of (overrideable) builtin names, which are evaluated by calling functions. Simple example: echo $USER define ip1 192.168.1.1/24 define ip2 192.168.2.1/24 loop create loop create set int ip address loop0 $ip1 set int ip address loop1 $ip2 show int addr show macro undefine ip1 undefine ip2 Type: feature Signed-off-by: Dave Barach Change-Id: I08a800647bac573d8ae3cfd75c40061d41c5f976 --- src/vppinfra/macros.h | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) (limited to 'src/vppinfra/macros.h') diff --git a/src/vppinfra/macros.h b/src/vppinfra/macros.h index 5c2e7033f8d..54ceda7016b 100644 --- a/src/vppinfra/macros.h +++ b/src/vppinfra/macros.h @@ -1,9 +1,9 @@ /* - macros.h - definitions for a simple macro expander - - Copyright (c) 2010, 2014 Cisco and/or its affiliates. - - * Licensed under the Apache License, Version 2.0 (the "License"); + * macros.h - definitions for a simple macro expander + * + * Copyright (c) 2010-2020 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: * @@ -32,16 +32,19 @@ typedef struct { uword *the_builtin_eval_hash; uword *the_value_table_hash; -} macro_main_t; - -int clib_macro_unset (macro_main_t * mm, char *name); -int clib_macro_set_value (macro_main_t * mm, char *name, char *value); -void clib_macro_add_builtin (macro_main_t * mm, char *name, void *eval_fn); -i8 *clib_macro_get_value (macro_main_t * mm, char *name); -i8 *clib_macro_eval (macro_main_t * mm, i8 * s, i32 complain); -i8 *clib_macro_eval_dollar (macro_main_t * mm, i8 * s, i32 complain); -void clib_macro_init (macro_main_t * mm); -void clib_macro_free (macro_main_t * mm); +} clib_macro_main_t; + +int clib_macro_unset (clib_macro_main_t * mm, char *name); +int clib_macro_set_value (clib_macro_main_t * mm, char *name, char *value); +void clib_macro_add_builtin (clib_macro_main_t * mm, char *name, + void *eval_fn); +i8 *clib_macro_get_value (clib_macro_main_t * mm, char *name); +i8 *clib_macro_eval (clib_macro_main_t * mm, i8 * s, i32 complain); +i8 *clib_macro_eval_dollar (clib_macro_main_t * mm, i8 * s, i32 complain); +void clib_macro_init (clib_macro_main_t * mm); +void clib_macro_free (clib_macro_main_t * mm); + +format_function_t format_clib_macro_main; #endif /* included_macros_h */ -- cgit 1.2.3-korg