X-Git-Url: https://git.distorted.org.uk/~mdw/secnet/blobdiff_plain/55e96f163095fc9286e0566fdaa1b1df45631fe3..1fc8a4acb3ef658696038c9c4bd3c155fbc27ac3:/conffile.c diff --git a/conffile.c b/conffile.c index 0bd4e33..7f0202c 100644 --- a/conffile.c +++ b/conffile.c @@ -1,4 +1,22 @@ /* conffile.c - process the configuration file */ +/* + * This file is part of secnet. + * See README for full list of copyright holders. + * + * secnet is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version d of the License, or + * (at your option) any later version. + * + * secnet is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * version 3 along with secnet; if not, see + * https://www.gnu.org/licenses/gpl.html. + */ /* #define DUMP_PARSE_TREE */ @@ -75,7 +93,7 @@ static void dict_iadd(dict_t *dict, atom_t key, list_t *val) if (dict_ilookup_primitive(dict, key)) { fatal("duplicate key \"%s\" in dictionary",key); } - e=safe_malloc(sizeof(*e),"dict_add"); + NEW(e); e->next=dict->entries; e->key=key; e->val=val; @@ -89,7 +107,7 @@ static dict_t *dict_new(dict_t *parent) { dict_t *d; - d=safe_malloc(sizeof(*d),"dict_new"); + NEW(d); d->parent=parent; d->search=NULL; d->entries=NULL; @@ -100,7 +118,7 @@ static dict_t *dict_new(dict_t *parent) static struct p_node *node_copy(struct p_node *n) { struct p_node *r; - r=safe_malloc(sizeof(*r),"node_copy"); + NEW(r); *r=*n; return r; } @@ -250,7 +268,7 @@ static item_t *new_item(enum types type, struct cloc loc) { item_t *i; - i=safe_malloc(sizeof(*i),"new_item"); + NEW(i); i->type=type; i->loc=loc; return i; @@ -518,7 +536,7 @@ atom_t intern(cstring_t s) if (!i) { /* Did't find it; create a new one */ - i=safe_malloc(sizeof(*i),"intern: alloc list entry"); + NEW(i); i->a=safe_strdup(s,"intern: alloc string"); i->next=atoms; atoms=i; @@ -545,7 +563,7 @@ cstring_t *dict_keys(dict_t *dict) { atom_t *r, *j; struct entry *i; - r=safe_malloc(sizeof(*r)*(dict->size+1),"dict_keys"); + NEW_ARY(r,dict->size+1); for (i=dict->entries, j=r; i; i=i->next, j++) { *j=i->key; } @@ -577,7 +595,7 @@ static list_t *list_copy(list_t *a) l=NULL; r=NULL; for (i=a; i; i=i->next) { - b=safe_malloc(sizeof(*b),"list_copy"); + NEW(b); if (l) l->next=b; else r=b; l=b; b->item=i->item; @@ -601,7 +619,7 @@ list_t *list_append(list_t *list, item_t *item) { list_t *l; - l=safe_malloc(sizeof(*l),"list_append"); + NEW(l); l->item=item; l->next=NULL; @@ -627,7 +645,7 @@ list_t *new_closure(closure_t *cl) void add_closure(dict_t *dict, cstring_t name, apply_fn apply) { closure_t *c; - c=safe_malloc(sizeof(*c),"add_closure"); + NEW(c); c->description=name; c->type=CL_PURE; c->apply=apply; @@ -705,7 +723,7 @@ const char **dict_read_string_array(dict_t *dict, cstring_t key, } int32_t ll=list_length(l); - ra=safe_malloc_ary(sizeof(*ra), ll+1, "dict_read_string_array"); + NEW_ARY(ra, ll+1); for (rap=ra; l; l=l->next,rap++) { item_t *it=l->item; if (it->type!=t_string) @@ -749,6 +767,21 @@ bool_t dict_read_bool(dict_t *dict, cstring_t key, bool_t required, return r; } +dict_t *dict_read_dict(dict_t *dict, cstring_t key, bool_t required, + cstring_t desc, struct cloc loc) +{ + item_t *i; + dict_t *r; + + i=dict_find_item(dict,key,required,desc,loc); + if (!i) return NULL; + if (i->type!=t_dict) { + cfgfatal(loc,desc,"\"%s\" must be a dictionary\n",key); + } + r=i->data.dict; + return r; +} + uint32_t string_to_word(cstring_t s, struct cloc loc, struct flagstr *f, cstring_t desc) {