mirror of
https://gitlab.labs.nic.cz/labs/bird.git
synced 2024-05-11 16:54:54 +00:00
Conf: Symbol hashes for all scopes
This is a backport cherry-pick of commits165156beeb
cce974e8ea
from the v3.0 branch as we need symbol hashes directly inside their scopes for more general usage than before.
This commit is contained in:
committed by
Ondrej Zajicek
parent
a5a6de581b
commit
8e177cf35b
21
conf/conf.h
21
conf/conf.h
@@ -16,7 +16,6 @@
|
||||
#include "lib/timer.h"
|
||||
|
||||
/* Configuration structure */
|
||||
|
||||
struct config {
|
||||
pool *pool; /* Pool the configuration is stored in */
|
||||
linpool *mem; /* Linear pool containing configuration data */
|
||||
@@ -53,8 +52,7 @@ struct config {
|
||||
char *err_file_name; /* File name containing error */
|
||||
char *file_name; /* Name of main configuration file */
|
||||
int file_fd; /* File descriptor of main configuration file */
|
||||
HASH(struct symbol) sym_hash; /* Lexer: symbol hash table */
|
||||
struct config *fallback; /* Link to regular config for CLI parsing */
|
||||
|
||||
struct sym_scope *root_scope; /* Scope for root symbols */
|
||||
int obstacle_count; /* Number of items blocking freeing of this config */
|
||||
int shutdown; /* This is a pseudo-config for daemon shutdown */
|
||||
@@ -133,12 +131,17 @@ struct symbol {
|
||||
struct sym_scope {
|
||||
struct sym_scope *next; /* Next on scope stack */
|
||||
struct symbol *name; /* Name of this scope */
|
||||
|
||||
HASH(struct symbol) hash; /* Local symbol hash */
|
||||
|
||||
uint slots; /* Variable slots */
|
||||
byte active; /* Currently entered */
|
||||
byte block; /* No independent stack frame */
|
||||
byte soft_scopes; /* Number of soft scopes above */
|
||||
};
|
||||
|
||||
extern struct sym_scope *global_root_scope;
|
||||
|
||||
struct bytestring {
|
||||
size_t length;
|
||||
byte data[];
|
||||
@@ -187,12 +190,14 @@ int cf_lex(void);
|
||||
void cf_lex_init(int is_cli, struct config *c);
|
||||
void cf_lex_unwind(void);
|
||||
|
||||
struct symbol *cf_find_local_symbol(const struct config *cfg, const struct sym_scope *scope, const byte *c);
|
||||
static inline struct symbol *cf_find_symbol(const struct config *cfg, const byte *c)
|
||||
{ return cf_find_local_symbol(cfg, cfg->root_scope, c); }
|
||||
struct symbol *cf_find_symbol_scope(const struct sym_scope *scope, const byte *c);
|
||||
static inline struct symbol *cf_find_symbol_cfg(const struct config *cfg, const byte *c)
|
||||
{ return cf_find_symbol_scope(cfg->root_scope, c); }
|
||||
|
||||
struct keyword;
|
||||
struct symbol *cf_symbol_from_keyword(const struct keyword *kw);
|
||||
#define cf_find_symbol(where, what) _Generic(*(where), \
|
||||
struct config: cf_find_symbol_cfg, \
|
||||
struct sym_scope: cf_find_symbol_scope \
|
||||
)((where), (what))
|
||||
|
||||
struct symbol *cf_get_symbol(const byte *c);
|
||||
struct symbol *cf_default_name(char *template, int *counter);
|
||||
|
Reference in New Issue
Block a user