X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=secnet.git;a=blobdiff_plain;f=conffile.c;h=0bd4e33bb3d3f9e5ee4c709e3ca701485ab75377;hp=5cce211415921556a5c384817d1278d9eb9dc158;hb=cf5f1149caccf65c700e73fc0e9212c916df3610;hpb=1caa23ff879cec7f8f36b32a987f0610291ef177 diff --git a/conffile.c b/conffile.c index 5cce211..0bd4e33 100644 --- a/conffile.c +++ b/conffile.c @@ -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); @@ -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; } @@ -639,16 +639,10 @@ void add_closure(dict_t *dict, cstring_t name, apply_fn apply) void *find_cl_if(dict_t *dict, cstring_t name, uint32_t type, bool_t fail_if_invalid, cstring_t desc, struct cloc loc) { - list_t *l; item_t *i; closure_t *cl; - l=dict_lookup(dict,name); - if (!l) { - if (!fail_if_invalid) return NULL; - cfgfatal(loc,desc,"closure \"%s\" not found\n",name); - } - i=list_elem(l,0); + i = dict_find_item(dict,name,fail_if_invalid,desc,loc); if (i->type!=t_closure) { if (!fail_if_invalid) return NULL; cfgfatal(loc,desc,"\"%s\" must be a closure\n",name); @@ -673,6 +667,8 @@ item_t *dict_find_item(dict_t *dict, cstring_t key, bool_t required, if (!required) return NULL; cfgfatal(loc,desc,"required parameter \"%s\" not found\n",key); } + if(list_length(l) != 1) + cfgfatal(loc,desc,"parameter \"%s\" has wrong number of values",key); i=list_elem(l,0); return i; } @@ -695,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); + ra=safe_malloc_ary(sizeof(*ra), ll+1, "dict_read_string_array"); + 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) {