diff --git a/conf/cf-lex.l b/conf/cf-lex.l index 5c4589edd..797dbeac2 100644 --- a/conf/cf-lex.l +++ b/conf/cf-lex.l @@ -35,6 +35,13 @@ static struct keyword { static struct keyword *kw_hash[KW_HASH_SIZE]; static struct symbol **sym_hash; +struct sym_scope { + struct sym_scope *next; /* Next on scope stack */ + struct symbol *name; /* Name of this scope */ + int active; /* Currently entered */ +}; +static struct sym_scope *conf_this_scope; + int conf_lino; static int cf_hash(byte *c); @@ -184,7 +191,7 @@ cf_find_sym(byte *c, unsigned int h0) sym_hash = cfg_allocz(SYM_HASH_SIZE * sizeof(struct keyword *)); else for(s = sym_hash[h]; s; s=s->next) - if (!strcmp(s->name, c)) + if (!strcmp(s->name, c) && s->scope->active) return s; l = strlen(c); if (l > SYM_MAX_LEN) @@ -192,6 +199,7 @@ cf_find_sym(byte *c, unsigned int h0) s = cfg_alloc(sizeof(struct symbol) + l); s->next = sym_hash[h]; sym_hash[h] = s; + s->scope = conf_this_scope; s->class = SYM_VOID; s->def = NULL; s->aux = 0; @@ -240,6 +248,8 @@ cf_lex_init(int is_cli) BEGIN(CLI); else BEGIN(INITIAL); + conf_this_scope = cfg_allocz(sizeof(struct sym_scope)); + conf_this_scope->active = 1; } void @@ -254,3 +264,22 @@ cf_lex_init_tables(void) kw_hash[h] = k; } } + +void +cf_push_scope(struct symbol *sym) +{ + struct sym_scope *s = cfg_alloc(sizeof(struct sym_scope)); + + s->next = conf_this_scope; + conf_this_scope = s; + s->active = 1; + s->name = sym; +} + +void +cf_pop_scope(void) +{ + conf_this_scope->active = 0; + conf_this_scope = conf_this_scope->next; + ASSERT(conf_this_scope); +} diff --git a/conf/conf.h b/conf/conf.h index d62f13835..0908324bc 100644 --- a/conf/conf.h +++ b/conf/conf.h @@ -50,6 +50,7 @@ extern int (*cf_read_hook)(byte *buf, unsigned int max); struct symbol { struct symbol *next; + struct sym_scope *scope; int class; int aux; void *aux2; @@ -75,6 +76,8 @@ void cf_lex_init(int is_cli); struct symbol *cf_find_symbol(byte *c); struct symbol *cf_default_name(char *prefix, int *counter); void cf_define_symbol(struct symbol *symbol, int type, void *def); +void cf_push_context(struct symbol *); +void cf_pop_context(void); /* Parser */