X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvppinfra%2Fmacros.c;h=b8a8e1744aac0c54f939173aa8564dc5e1f717f9;hb=bfcd4b9868112226705571dadad68aa160f6896e;hp=bc6df55b39dff6f22d1fc50ddba54bb800f6ea4b;hpb=961e3c8428be81ae74f7e8ee293b16808a74d45e;p=vpp.git diff --git a/src/vppinfra/macros.c b/src/vppinfra/macros.c index bc6df55b39d..b8a8e1744aa 100644 --- a/src/vppinfra/macros.c +++ b/src/vppinfra/macros.c @@ -40,7 +40,7 @@ builtin_eval (clib_macro_main_t * mm, i8 * varname, i32 complain) return (*fp) (mm, complain); } -int +__clib_export int clib_macro_unset (clib_macro_main_t * mm, char *name) { hash_pair_t *p; @@ -60,7 +60,7 @@ clib_macro_unset (clib_macro_main_t * mm, char *name) return 0; } -int +__clib_export int clib_macro_set_value (clib_macro_main_t * mm, char *name, char *value) { u8 *key_copy, *value_copy; @@ -91,13 +91,21 @@ clib_macro_get_value (clib_macro_main_t * mm, char *name) * eval: takes a string, returns a vector. * looks up $foobar in the variable table. */ -i8 * -clib_macro_eval (clib_macro_main_t * mm, i8 * s, i32 complain) +__clib_export i8 * +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); @@ -188,19 +197,19 @@ clib_macro_eval (clib_macro_main_t * mm, i8 * s, i32 complain) * eval: takes a string, returns a vector. * looks up $foobar in the variable table. */ -i8 * -clib_macro_eval_dollar (clib_macro_main_t * mm, i8 * s, i32 complain) +__clib_export i8 * +clib_macro_eval_dollar (clib_macro_main_t *mm, i8 *s, i32 complain) { i8 *s2; 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); } -void +__clib_export void clib_macro_add_builtin (clib_macro_main_t * mm, char *name, void *eval_fn) { hash_set_mem (mm->the_builtin_eval_hash, name, (uword) eval_fn); @@ -217,7 +226,7 @@ eval_hostname (clib_macro_main_t * mm, i32 complain) } #endif -void +__clib_export void clib_macro_init (clib_macro_main_t * mm) { if (mm->the_builtin_eval_hash != 0) @@ -234,7 +243,7 @@ clib_macro_init (clib_macro_main_t * mm) #endif } -void +__clib_export void clib_macro_free (clib_macro_main_t * mm) { hash_pair_t *p; @@ -273,7 +282,7 @@ name_compare (void *a1, void *a2) } -u8 * +__clib_export u8 * format_clib_macro_main (u8 * s, va_list * args) { clib_macro_main_t *mm = va_arg (*args, clib_macro_main_t *);