diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2019-06-05 16:42:37 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2019-06-05 16:52:58 +0300 |
commit | 806485a57fb37784e3e1789fce829a2bac390d99 (patch) | |
tree | 963e02852aa0203c912b9947eec0211e8661bc82 /src/assert.c | |
parent | f7b04cc09b26a7e1342170129dacf896f50f98b2 (diff) | |
download | grecs-806485a57fb37784e3e1789fce829a2bac390d99.tar.gz grecs-806485a57fb37784e3e1789fce829a2bac390d99.tar.bz2 |
Fix syntax checking of compound vs. scalar statements. Add assertion functions.
Up to now the parser incorrectly accepted the use of compound statement
keyword in scalar context, unless the keyword description had non NULL
value in the callback field. This change fixes it.
It also defines several assertion functions for use inm callbacks.
* src/tree.c (grecs_value_type_string): New function.
(find_keyword): Take into account node type.
(nodeproc,reduceproc): Leave error reporting to find_keyword.
* tests/set.at: Change expected error string.
* include/grecs/tree.h (grecs_assert_value_type)
(grecs_assert_scalar_stmt)
(grecs_assert_node_value_type): New protos.
* include/grecs/value.h (grecs_value_type_string): New proto.
* src/Make.am: Add assert.c
* src/assert.c: New file.
* src/format.c (grecs_data_type_string): Add i18n markers to the
returned strings.
Diffstat (limited to 'src/assert.c')
-rw-r--r-- | src/assert.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/assert.c b/src/assert.c new file mode 100644 index 0000000..0577768 --- /dev/null +++ b/src/assert.c @@ -0,0 +1,58 @@ +/* grecs - Gray's Extensible Configuration System + Copyright (C) 2007-2019 Sergey Poznyakoff + + Grecs 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 3 of the License, or (at your + option) any later version. + + Grecs 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 along + with Grecs. If not, see <http://www.gnu.org/licenses/>. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif +#include <errno.h> +#include <grecs.h> + +int +grecs_assert_value_type(const grecs_value_t *value, int type, + grecs_locus_t *refloc) +{ + if (GRECS_VALUE_EMPTY_P(value)) { + grecs_error(refloc, 0, _("expected %s"), + gettext(grecs_value_type_string(type))); + return 1; + } + if (value->type != type) { + grecs_error(&value->locus, 0, _("expected %s, but found %s"), + gettext(grecs_value_type_string(type)), + gettext(grecs_value_type_string(value->type))); + return 1; + } + return 0; +} + +int +grecs_assert_scalar_stmt(grecs_locus_t *locus, enum grecs_callback_command cmd) +{ + if (cmd != grecs_callback_set_value) { + grecs_error(locus, 0, _("unexpected block statement")); + return 1; + } + return 0; +} + +int +grecs_assert_node_value_type(enum grecs_callback_command cmd, + grecs_node_t *node, int type) +{ + return grecs_assert_scalar_stmt(&node->locus, cmd) + && grecs_assert_value_type(node->v.value, type, + &node->locus); +} |