diff options
Diffstat (limited to 'src/tree.c')
-rw-r--r-- | src/tree.c | 63 |
1 files changed, 43 insertions, 20 deletions
@@ -62,6 +62,19 @@ grecs_value_free(struct grecs_value *val) | |||
62 | grecs_free(val); | 62 | grecs_free(val); |
63 | } | 63 | } |
64 | 64 | ||
65 | const char * | ||
66 | grecs_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 | |||
65 | struct grecs_node * | 78 | struct grecs_node * |
66 | grecs_node_create(enum grecs_node_type type, grecs_locus_t *loc) | 79 | grecs_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 | ||
288 | static struct grecs_keyword * | 301 | static struct grecs_keyword * |
289 | find_keyword(struct grecs_keyword *cursect, const char *ident) | 302 | find_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) && |