]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Symbols are not scoped.
authorMartin Mares <mj@ucw.cz>
Thu, 4 Nov 1999 13:51:52 +0000 (13:51 +0000)
committerMartin Mares <mj@ucw.cz>
Thu, 4 Nov 1999 13:51:52 +0000 (13:51 +0000)
conf/cf-lex.l
conf/conf.h

index 5c4589eddd52ae6ed531a9e37dcb0e9746e6d61b..797dbeac2910e530c7a52da49fa5114d3e60e17f 100644 (file)
@@ -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);
+}
index d62f1383557547f6192281eb1164c9212c561734..0908324bc5d41e698b7cd3e57564a0a060947d5f 100644 (file)
@@ -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 */