return (*fp) (mm, complain);
}
-int
+__clib_export int
clib_macro_unset (clib_macro_main_t * mm, char *name)
{
hash_pair_t *p;
return 0;
}
-int
+__clib_export int
clib_macro_set_value (clib_macro_main_t * mm, char *name, char *value)
{
u8 *key_copy, *value_copy;
* 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)
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);
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);
}
#endif
-void
+__clib_export void
clib_macro_init (clib_macro_main_t * mm)
{
if (mm->the_builtin_eval_hash != 0)
#endif
}
-void
+__clib_export void
clib_macro_free (clib_macro_main_t * mm)
{
hash_pair_t *p;
}
-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 *);