]> git.ipfire.org Git - thirdparty/bird.git/blobdiff - conf/conf.h
Merge branch 'master' into mq-filter-stack
[thirdparty/bird.git] / conf / conf.h
index 777a1fca7db616f06c47224051c045cefb419c57..21dc3fa1fbecef0e4f9086c172e8e5c6905ff3cc 100644 (file)
@@ -24,6 +24,7 @@ struct config {
   list tables;                         /* Configured routing tables (struct rtable_config) */
   list logfiles;                       /* Configured log files (sysdep) */
   list tests;                          /* Configured unit tests (f_bt_test_suite) */
+  list symbols;                                /* Configured symbols in config order */
 
   int mrtdump_file;                    /* Configured MRTDump file (sysdep, fd in unix) */
   char *syslog_name;                   /* Name used for syslog (NULL -> no syslog) */
@@ -107,18 +108,29 @@ void cfg_copy_list(list *dest, list *src, unsigned node_size);
 extern int (*cf_read_hook)(byte *buf, uint max, int fd);
 
 struct symbol {
+  node n;                              /* In list of symbols in config */
   struct symbol *next;
   struct sym_scope *scope;
-  int class;
-  int aux;
-  void *aux2;
-  void *def;
-  char name[1];
+  int class;                           /* SYM_* */
+  uint flags;                          /* SYM_FLAG_* */
+
+  union {
+    struct proto_config *proto;                /* For SYM_PROTO and SYM_TEMPLATE */
+    const struct f_line *function;     /* For SYM_FUNCTION */
+    const struct filter *filter;       /* For SYM_FILTER */
+    struct rtable_config *table;       /* For SYM_TABLE */
+    struct f_dynamic_attr *attribute;  /* For SYM_ATTRIBUTE */
+    struct f_val *val;                 /* For SYM_CONSTANT */
+    uint offset;                       /* For SYM_VARIABLE */
+  };
+
+  char name[0];
 };
 
 struct sym_scope {
   struct sym_scope *next;              /* Next on scope stack */
   struct symbol *name;                 /* Name of this scope */
+  uint slots;                          /* Variable slots */
   int active;                          /* Currently entered */
 };
 
@@ -138,8 +150,11 @@ struct sym_scope {
 #define SYM_CONSTANT 0x200     /* 0x200-0x2ff are variable types */
 #define SYM_CONSTANT_RANGE SYM_CONSTANT ... (SYM_CONSTANT | 0xff)
 
-#define SYM_TYPE(s) (((struct f_val *) (s)->def)->type)
-#define SYM_VAL(s) (((struct f_val *) (s)->def)->val)
+#define SYM_TYPE(s) ((s)->val->type)
+#define SYM_VAL(s) ((s)->val->val)
+
+/* Symbol flags */
+#define SYM_FLAG_SAME 0x1      /* For SYM_FUNCTION and SYM_FILTER */
 
 struct include_file_stack {
   void *buffer;                                /* Internal lexer state */
@@ -162,19 +177,37 @@ int cf_lex(void);
 void cf_lex_init(int is_cli, struct config *c);
 void cf_lex_unwind(void);
 
-struct symbol *cf_find_symbol(struct config *cfg, byte *c);
+struct symbol *cf_find_symbol(const struct config *cfg, const byte *c);
 
-struct symbol *cf_get_symbol(byte *c);
+struct symbol *cf_get_symbol(const byte *c);
 struct symbol *cf_default_name(char *template, int *counter);
-struct symbol *cf_define_symbol(struct symbol *symbol, int type, void *def);
+struct symbol *cf_localize_symbol(struct symbol *sym);
+
+/**
+ * cf_define_symbol - define meaning of a symbol
+ * @sym: symbol to be defined
+ * @type: symbol class to assign
+ * @def: class dependent data
+ *
+ * Defines new meaning of a symbol. If the symbol is an undefined
+ * one (%SYM_VOID), it's just re-defined to the new type. If it's defined
+ * in different scope, a new symbol in current scope is created and the
+ * meaning is assigned to it. If it's already defined in the current scope,
+ * an error is reported via cf_error().
+ *
+ * Result: Pointer to the newly defined symbol. If we are in the top-level
+ * scope, it's the same @sym as passed to the function.
+ */
+#define cf_define_symbol(sym_, type_, var_, def_) ({ \
+    struct symbol *sym = cf_localize_symbol(sym_); \
+    sym->class = type_; \
+    sym->var_ = def_; \
+    sym; })
+
 void cf_push_scope(struct symbol *);
 void cf_pop_scope(void);
 char *cf_symbol_class_name(struct symbol *sym);
 
-static inline int cf_symbol_is_constant(struct symbol *sym)
-{ return (sym->class & 0xff00) == SYM_CONSTANT; }
-
-
 /* Parser */
 
 extern char *cf_text;