X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=secnet.git;a=blobdiff_plain;f=conffile.c;h=f5a10a184a79566cd612da405ed9c69d333de596;hp=53c334bd6b0279625574242437c3002cc66ac5de;hb=423936d35d7671fd017d2d611d418d1b8eeb6195;hpb=6416c7a1166951f81fac2e16719865ea67f66673 diff --git a/conffile.c b/conffile.c index 53c334b..f5a10a1 100644 --- a/conffile.c +++ b/conffile.c @@ -75,7 +75,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 +89,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 +100,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; } @@ -154,7 +154,7 @@ static void ptree_mangle(struct p_node *t) #ifdef DUMP_PARSE_TREE /* Convert a node type to a string, for parse tree dump */ -static string_t ntype(uint32_t type) +static const char *ntype(uint32_t type) { switch(type) { case T_STRING: return "T_STRING"; @@ -179,14 +179,14 @@ static void ptree_indent(int amount) for (i=0; itype<10) { + if (T_IS_PRIMITIVE(n->type)) { switch(n->type) { case T_STRING: printf("T_STRING: \"%s\" (%s line %d)\n", n->data.string,n->loc.file,n->loc.line); break; @@ -197,7 +197,7 @@ static void ptree_dump(struct p_node *n, uint32_t d) default: printf("**unknown primitive type**\n"); break; } } else { - assert(dtype),n->loc.file,n->loc.line); ptree_indent(d); printf(" |-"); ptree_dump(n->l, d+1); @@ -250,7 +250,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 +518,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 +545,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; } @@ -561,10 +561,10 @@ list_t *list_new(void) return NULL; } -int32_t list_length(list_t *a) +int32_t list_length(const list_t *a) { int32_t l=0; - list_t *i; + const list_t *i; for (i=a; i; i=i->next) { assert(l < INT_MAX); l++; } return l; } @@ -577,7 +577,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 +601,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 +627,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; @@ -691,6 +691,31 @@ string_t dict_read_string(dict_t *dict, cstring_t key, bool_t required, return r; } +const char **dict_read_string_array(dict_t *dict, cstring_t key, + bool_t required, cstring_t desc, + struct cloc loc, const char *const *def) +{ + list_t *l; + const char **ra, **rap; + + l=dict_lookup(dict,key); + if (!l) { + if (!required) return (const char**)def; + cfgfatal(loc,desc,"required string list \"%s\" not found\n",key); + } + + int32_t ll=list_length(l); + NEW_ARY(ra, ll+1); + for (rap=ra; l; l=l->next,rap++) { + item_t *it=l->item; + if (it->type!=t_string) + cfgfatal(it->loc,desc,"\"%s\" entry must be a string\n",key); + *rap=it->data.string; + } + *rap=0; + return ra; +} + uint32_t dict_read_number(dict_t *dict, cstring_t key, bool_t required, cstring_t desc, struct cloc loc, uint32_t def) {