From b30b9549acaa0ffd4c94c2c50d0756416f9b58ee Mon Sep 17 00:00:00 2001 From: Dave Barach Date: Mon, 22 Jun 2020 10:02:25 -0400 Subject: vlib: debug CLI macro expander, part deux Deal with circular macro definitions instead of crashing due to stack overflow. Separate macro tables, per CLI session Add documentation to the Sphinx docs Type: improvement Signed-off-by: Dave Barach Change-Id: I55fc9152bd37ad0c15fa3959f38b07b63100e634 --- src/vppinfra/macros.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'src/vppinfra/macros.c') diff --git a/src/vppinfra/macros.c b/src/vppinfra/macros.c index bc6df55b39d..240cef02e0e 100644 --- a/src/vppinfra/macros.c +++ b/src/vppinfra/macros.c @@ -92,12 +92,20 @@ clib_macro_get_value (clib_macro_main_t * mm, char *name) * looks up $foobar in the variable table. */ i8 * -clib_macro_eval (clib_macro_main_t * mm, i8 * s, i32 complain) +clib_macro_eval (clib_macro_main_t * mm, i8 * s, i32 complain, u16 level, + u16 max_level) { i8 *rv = 0; i8 *varname, *varvalue; i8 *ts; + if (level >= max_level) + { + if (complain) + clib_warning ("circular definition, level %d", level); + return (i8 *) format (0, " CIRCULAR "); + } + while (*s) { switch (*s) @@ -161,7 +169,8 @@ clib_macro_eval (clib_macro_main_t * mm, i8 * s, i32 complain) if (varvalue) { /* recursively evaluate */ - ts = clib_macro_eval (mm, varvalue, complain); + ts = clib_macro_eval (mm, varvalue, complain, level + 1, + max_level); vec_free (varvalue); /* add results to answer */ vec_append (rv, ts); @@ -195,7 +204,7 @@ clib_macro_eval_dollar (clib_macro_main_t * mm, i8 * s, i32 complain) i8 *rv; s2 = (i8 *) format (0, "$(%s)%c", s, 0); - rv = clib_macro_eval (mm, s2, complain); + rv = clib_macro_eval (mm, s2, complain, 0 /* level */ , 8 /* max_level */ ); vec_free (s2); return (rv); } -- cgit 1.2.3-korg