mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-22 09:41:54 +00:00
Symbols are not scoped.
This commit is contained in:
parent
91447965fe
commit
c8f61a01ea
@ -35,6 +35,13 @@ static struct keyword {
|
|||||||
static struct keyword *kw_hash[KW_HASH_SIZE];
|
static struct keyword *kw_hash[KW_HASH_SIZE];
|
||||||
static struct symbol **sym_hash;
|
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;
|
int conf_lino;
|
||||||
|
|
||||||
static int cf_hash(byte *c);
|
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 *));
|
sym_hash = cfg_allocz(SYM_HASH_SIZE * sizeof(struct keyword *));
|
||||||
else
|
else
|
||||||
for(s = sym_hash[h]; s; s=s->next)
|
for(s = sym_hash[h]; s; s=s->next)
|
||||||
if (!strcmp(s->name, c))
|
if (!strcmp(s->name, c) && s->scope->active)
|
||||||
return s;
|
return s;
|
||||||
l = strlen(c);
|
l = strlen(c);
|
||||||
if (l > SYM_MAX_LEN)
|
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 = cfg_alloc(sizeof(struct symbol) + l);
|
||||||
s->next = sym_hash[h];
|
s->next = sym_hash[h];
|
||||||
sym_hash[h] = s;
|
sym_hash[h] = s;
|
||||||
|
s->scope = conf_this_scope;
|
||||||
s->class = SYM_VOID;
|
s->class = SYM_VOID;
|
||||||
s->def = NULL;
|
s->def = NULL;
|
||||||
s->aux = 0;
|
s->aux = 0;
|
||||||
@ -240,6 +248,8 @@ cf_lex_init(int is_cli)
|
|||||||
BEGIN(CLI);
|
BEGIN(CLI);
|
||||||
else
|
else
|
||||||
BEGIN(INITIAL);
|
BEGIN(INITIAL);
|
||||||
|
conf_this_scope = cfg_allocz(sizeof(struct sym_scope));
|
||||||
|
conf_this_scope->active = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -254,3 +264,22 @@ cf_lex_init_tables(void)
|
|||||||
kw_hash[h] = k;
|
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);
|
||||||
|
}
|
||||||
|
@ -50,6 +50,7 @@ extern int (*cf_read_hook)(byte *buf, unsigned int max);
|
|||||||
|
|
||||||
struct symbol {
|
struct symbol {
|
||||||
struct symbol *next;
|
struct symbol *next;
|
||||||
|
struct sym_scope *scope;
|
||||||
int class;
|
int class;
|
||||||
int aux;
|
int aux;
|
||||||
void *aux2;
|
void *aux2;
|
||||||
@ -75,6 +76,8 @@ void cf_lex_init(int is_cli);
|
|||||||
struct symbol *cf_find_symbol(byte *c);
|
struct symbol *cf_find_symbol(byte *c);
|
||||||
struct symbol *cf_default_name(char *prefix, int *counter);
|
struct symbol *cf_default_name(char *prefix, int *counter);
|
||||||
void cf_define_symbol(struct symbol *symbol, int type, void *def);
|
void cf_define_symbol(struct symbol *symbol, int type, void *def);
|
||||||
|
void cf_push_context(struct symbol *);
|
||||||
|
void cf_pop_context(void);
|
||||||
|
|
||||||
/* Parser */
|
/* Parser */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user