summaryrefslogtreecommitdiff
path: root/conf
diff options
context:
space:
mode:
Diffstat (limited to 'conf')
-rw-r--r--conf/cf-lex.l40
-rw-r--r--conf/conf.h2
2 files changed, 42 insertions, 0 deletions
diff --git a/conf/cf-lex.l b/conf/cf-lex.l
index df0f3c1d..a54cdd99 100644
--- a/conf/cf-lex.l
+++ b/conf/cf-lex.l
@@ -308,3 +308,43 @@ cf_pop_scope(void)
conf_this_scope = conf_this_scope->next;
ASSERT(conf_this_scope);
}
+
+struct symbol *
+cf_walk_symbols(struct config *cf, struct symbol *sym, int *pos)
+{
+ for(;;)
+ {
+ if (!sym)
+ {
+ if (*pos >= SYM_HASH_SIZE)
+ return NULL;
+ sym = cf->sym_hash[(*pos)++];
+ }
+ else
+ sym = sym->next;
+ if (sym && sym->scope->active)
+ return sym;
+ }
+}
+
+char *
+cf_symbol_class_name(struct symbol *sym)
+{
+ switch (sym->class)
+ {
+ case SYM_VOID:
+ return "undefined";
+ case SYM_PROTO:
+ return "protocol";
+ case SYM_NUMBER:
+ return "numeric constant";
+ case SYM_FUNCTION:
+ return "function";
+ case SYM_FILTER:
+ return "filter";
+ case SYM_TABLE:
+ return "routing table";
+ default:
+ return "unknown type";
+ }
+}
diff --git a/conf/conf.h b/conf/conf.h
index 178cdb6e..5b80b0dd 100644
--- a/conf/conf.h
+++ b/conf/conf.h
@@ -94,6 +94,8 @@ struct symbol *cf_default_name(char *template, int *counter);
void cf_define_symbol(struct symbol *symbol, int type, void *def);
void cf_push_scope(struct symbol *);
void cf_pop_scope(void);
+struct symbol *cf_walk_symbols(struct config *cf, struct symbol *sym, int *pos);
+char *cf_symbol_class_name(struct symbol *sym);
/* Parser */