diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2012-09-22 16:15:48 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2012-09-22 16:30:07 +0300 |
commit | 0666fc3caae8e2db660d781e43bee2258bf06a00 (patch) | |
tree | 97380903872520efa3b2bf659465e63f2cf51a2a /tests/tforlan.c | |
parent | 7f3dd0599ac3fb3a69c512b0ecfd043c67ca94ee (diff) | |
download | eclat-0666fc3caae8e2db660d781e43bee2258bf06a00.tar.gz eclat-0666fc3caae8e2db660d781e43bee2258bf06a00.tar.bz2 |
Introduce output formatting language
* configure.ac: Check for lex and yacc.
* lib/diag.c: New file (moved from ../src with edits)
* lib/forlan.c: New file.
* lib/forlan.h: New file.
* lib/forlangrm.y: New file.
* lib/forlanlex.l: New file.
* lib/.gitignore: Add new files.
* lib/Makefile.am: Add new file.
* lib/libeclat.h: Add diagnostics-related stuff.
* src/Makefile.am (eclat_SOURCES): Remove diag.c
* src/cmdline.opt (set_program_name): Move to ../lib/diag.c
* src/diag.c: Remove (see above).
* src/config.c: Reflect changes to the diagnostics subsystem.
* src/eclat.c: Likewise.
* src/eclat.h: Remove diagnostics-related stuff.
It lives in libeclat.h from now on.
* src/error.c: Remove.
* tests/forlan01.at: New testcase.
* tests/testsuite.at: Include forlan01.at
* tests/tforlan.c: New file.
* tests/.gitignore: Add new files.
* tests/Makefile.am: Add new files.
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; +} + |