diff options
Diffstat (limited to 'src/vppinfra/macros.c')
-rw-r--r-- | src/vppinfra/macros.c | 15 |
1 files changed, 12 insertions, 3 deletions
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); } |