aboutsummaryrefslogtreecommitdiff
path: root/tests/gcfpeek.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2011-05-03 17:49:29 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2011-05-03 21:23:21 +0300
commit3d679b3df641f59fb81ca1651799f4e2965ed67e (patch)
tree5a614ee25cff44d015ee9e6f6920e2ba19379bba /tests/gcfpeek.c
parent24ec67c9f6375d34d88e79981ed8abbe15a78169 (diff)
downloadgrecs-3d679b3df641f59fb81ca1651799f4e2965ed67e.tar.gz
grecs-3d679b3df641f59fb81ca1651799f4e2965ed67e.tar.bz2
Switch to the two-layer model. Add testsuite.
The configuration file parser creates a syntax tree. This step does not require any knowledge about which keywords are allowed. The user can then either use that tree directly, or post-process it using parser tables. The latter approach is equivalent to previous versions of grecs.
Diffstat (limited to 'tests/gcfpeek.c')
-rw-r--r--tests/gcfpeek.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/tests/gcfpeek.c b/tests/gcfpeek.c
new file mode 100644
index 0000000..360000d
--- /dev/null
+++ b/tests/gcfpeek.c
@@ -0,0 +1,76 @@
+/* grecs - Gray's Extensible Configuration System
+ Copyright (C) 2007-2011 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 <string.h>
+#include <errno.h>
+#include "grecs.h"
+
+static void
+usage(const char *arg, FILE *fp, int code)
+{
+ fprintf(fp, "usage: %s [-h] [-locus] [-delim=char] file path\n", arg);
+ exit(code);
+}
+
+int
+main(int argc, char **argv)
+{
+ char *progname = argv[0];
+ char *path = NULL;
+ char *file = NULL;
+ struct grecs_node *tree, *node;
+ int flags = 0;
+ int rc = 2;
+
+ while (--argc) {
+ char *arg = *++argv;
+ if (strcmp(arg, "-locus") == 0)
+ flags |= GRECS_NODE_FLAG_LOCUS;
+ else if (strncmp(arg, "-delim=", 7) == 0)
+ flags |= arg[7];
+ else if (strcmp(arg, "-h") == 0)
+ usage(progname, stdout, 0);
+ else if (arg[0] == '-')
+ usage(progname, stderr, 1);
+ else if (file) {
+ if (path)
+ usage(progname, stderr, 1);
+ else
+ path = arg;
+ } else
+ file = arg;
+ }
+
+ if (!file || !path || argc)
+ usage(progname, stderr, 1);
+
+ tree = grecs_parse(file);
+ if (!tree)
+ exit(1);
+
+ for (node = tree; node; node = node->next) {
+ node = grecs_find_node(node, path);
+ if (!node)
+ break;
+ rc = 0;
+ grecs_format_node(node, flags, stdout);
+ fputc('\n', stdout);
+ }
+ exit(rc);
+}

Return to:

Send suggestions and report system problems to the System administrator.