diff options
Diffstat (limited to 'tests/tforlan.c')
-rw-r--r-- | tests/tforlan.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/tests/tforlan.c b/tests/tforlan.c new file mode 100644 index 0000000..9fc3495 --- /dev/null +++ b/tests/tforlan.c @@ -0,0 +1,100 @@ +/* This file is part of Eclat. + Copyright (C) 2012 Sergey Poznyakoff. + + Eclat 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, or (at your option) + any later version. + + Eclat 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 Eclat. If not, see <http://www.gnu.org/licenses/>. */ + +#include <config.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#ifdef HAVE_GETOPT_H +# include <getopt.h> +#endif +#include <errno.h> +#include <sysexits.h> +#include <libeclat.h> +#include "forlan.h" +#include <sys/stat.h> + +void +usage() +{ + printf("usage: %s [-dD] FILE [INPUT]\n"); +} + +int +main(int argc, char **argv) +{ + FILE *fp; + char *buf; + size_t len; + struct stat st; + struct grecs_locus_point pt; + int rc; + int dump_option = 0; + + set_program_name(argv[0]); + forlan_init(); + + while ((rc = getopt(argc, argv, "Dd:h")) != EOF) + switch (rc) { + case 'D': + dump_option++; + break; + + case 'd': + if (parse_debug_level(optarg)) + die(EX_USAGE, "bad debug category or level"); + break; + + case 'h': + usage(); + return 0; + + default: + exit(EX_USAGE); + } + argc -= optind; + argv += optind; + + + if (argc == 0 || argc > 2) + die(EX_USAGE, "one or two arguments expected"); + if (stat(argv[0], &st)) + die(EX_UNAVAILABLE, "cannot stat input file \"%s\": %s", + argv[0], strerror(errno)); + len = st.st_size; + buf = grecs_malloc(len); + fp = fopen(argv[0], "r"); + if (!fp) + die(EX_UNAVAILABLE, "cannot open input file \"%s\": %s", + argv[0], strerror(errno)); + if (fread(buf, len, 1, fp) != 1) + die(EX_UNAVAILABLE, "error reading from \"%s\": %s", + argv[0], strerror(errno)); + fclose(fp); + + pt.file = argv[0]; + pt.line = 1; + pt.col = 0; + + rc = forlan_parse(buf, len, &pt); + if (rc == 0) { + if (dump_option) + forlan_dump_tree(stdout, forlan_parse_tree); + forlan_node_free(forlan_parse_tree); + } + return rc ? EX_UNAVAILABLE : 0; +} + |