From 0666fc3caae8e2db660d781e43bee2258bf06a00 Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Sat, 22 Sep 2012 16:15:48 +0300 Subject: 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. --- tests/tforlan.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 tests/tforlan.c (limited to 'tests/tforlan.c') 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 . */ + +#include +#include +#include +#include +#ifdef HAVE_GETOPT_H +# include +#endif +#include +#include +#include +#include "forlan.h" +#include + +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; +} + -- cgit v1.2.1