aboutsummaryrefslogtreecommitdiff
path: root/src/tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tree.c')
-rw-r--r--src/tree.c63
1 files changed, 43 insertions, 20 deletions
diff --git a/src/tree.c b/src/tree.c
index e25c6a5..27a6f21 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -62,6 +62,19 @@ grecs_value_free(struct grecs_value *val)
62 grecs_free(val); 62 grecs_free(val);
63} 63}
64 64
65const char *
66grecs_value_type_string(int t)
67{
68 static const char *types[] = {
69 [GRECS_TYPE_STRING] = N_("string"),
70 [GRECS_TYPE_LIST] = N_("list"),
71 [GRECS_TYPE_ARRAY] = N_("one or more arguments")
72 };
73 if (t >= 0 && t < sizeof(types) / sizeof(types[0]))
74 return types[t];
75 return N_("unrecognized type; please report");
76}
77
65struct grecs_node * 78struct grecs_node *
66grecs_node_create(enum grecs_node_type type, grecs_locus_t *loc) 79grecs_node_create(enum grecs_node_type type, grecs_locus_t *loc)
67{ 80{
@@ -286,14 +299,32 @@ static struct grecs_keyword fake = {
286}; 299};
287 300
288static struct grecs_keyword * 301static struct grecs_keyword *
289find_keyword(struct grecs_keyword *cursect, const char *ident) 302find_keyword(struct grecs_keyword *cursect, grecs_node_t *node)
290{ 303{
291 struct grecs_keyword *kwp;
292
293 if (cursect && cursect->kwd && cursect != &fake) { 304 if (cursect && cursect->kwd && cursect != &fake) {
294 for (kwp = cursect->kwd; kwp->ident; kwp++) 305 struct grecs_keyword *found = NULL, *kwp;
295 if (strcmp(kwp->ident, ident) == 0) 306 char const *msg;
296 return kwp; 307
308 for (kwp = cursect->kwd; kwp->ident; kwp++) {
309 if (strcmp(kwp->ident, node->ident) == 0) {
310 found = kwp;
311 if (kwp->callback
312 || node->down
313 ? kwp->type == grecs_type_section
314 : kwp->type != grecs_type_section)
315 return kwp;
316 }
317 }
318 if (found) {
319 if (found->type == grecs_type_section) {
320 msg = N_("section keyword used as a scalar");
321 } else {
322 msg = N_("scalar keyword used as a section");
323 }
324 } else {
325 msg = N_("unknown keyword");
326 }
327 grecs_error(&node->idloc, 0, "%s", gettext(msg));
297 } else { 328 } else {
298 return &fake; 329 return &fake;
299 } 330 }
@@ -915,21 +946,17 @@ nodeproc(enum grecs_tree_recurse_op op, struct grecs_node *node, void *data)
915 946
916 switch (op) { 947 switch (op) {
917 case grecs_tree_recurse_set: 948 case grecs_tree_recurse_set:
918 kwp = find_keyword(clos->cursect, node->ident); 949 kwp = find_keyword(clos->cursect, node);
919 if (!kwp) { 950 if (!kwp)
920 grecs_error(&node->idloc, 0, _("Unknown keyword"));
921 return grecs_tree_recurse_skip; 951 return grecs_tree_recurse_skip;
922 }
923 grecs_process_ident(kwp, node->v.value, CURRENT_BASE(clos), 952 grecs_process_ident(kwp, node->v.value, CURRENT_BASE(clos),
924 &node->idloc); 953 &node->idloc);
925 break; 954 break;
926 955
927 case grecs_tree_recurse_pre: 956 case grecs_tree_recurse_pre:
928 kwp = find_keyword(clos->cursect, node->ident); 957 kwp = find_keyword(clos->cursect, node);
929 if (!kwp) { 958 if (!kwp)
930 grecs_error(&node->locus, 0, _("Unknown keyword"));
931 return grecs_tree_recurse_skip; 959 return grecs_tree_recurse_skip;
932 }
933 stmt_begin(clos, kwp, node); 960 stmt_begin(clos, kwp, node);
934 break; 961 break;
935 962
@@ -1136,13 +1163,9 @@ reduceproc(enum grecs_tree_recurse_op op, struct grecs_node *node, void *data)
1136 } else { 1163 } else {
1137 struct grecs_keyword *kwp = NULL; 1164 struct grecs_keyword *kwp = NULL;
1138 if (clos->cursect) { 1165 if (clos->cursect) {
1139 kwp = find_keyword(clos->cursect, node->ident); 1166 kwp = find_keyword(clos->cursect, node);
1140 if (!kwp) { 1167 if (!kwp)
1141 grecs_error(&node->locus, 0,
1142 _("%s: unknown keyword"),
1143 node->ident);
1144 return grecs_tree_recurse_skip; 1168 return grecs_tree_recurse_skip;
1145 }
1146 if (kwp->flags & GRECS_INAC) 1169 if (kwp->flags & GRECS_INAC)
1147 return grecs_tree_recurse_skip; 1170 return grecs_tree_recurse_skip;
1148 if (!(kwp->flags & GRECS_MULT) && 1171 if (!(kwp->flags & GRECS_MULT) &&

Return to:

Send suggestions and report system problems to the System administrator.