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 | |
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')
-rw-r--r-- | tests/.gitignore | 1 | ||||
-rw-r--r-- | tests/Makefile.am | 2 | ||||
-rw-r--r-- | tests/forlan01.at | 77 | ||||
-rw-r--r-- | tests/testsuite.at | 4 | ||||
-rw-r--r-- | tests/tforlan.c | 100 |
5 files changed, 184 insertions, 0 deletions
diff --git a/tests/.gitignore b/tests/.gitignore index 99d3c9c..8b76ee0 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -4,6 +4,7 @@ package.m4 testsuite testsuite.dir testsuite.log +tforlan thmac turlenc txml diff --git a/tests/Makefile.am b/tests/Makefile.am index 82cae7e..4d567b3 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -40,6 +40,7 @@ $(srcdir)/package.m4: $(top_srcdir)/configure.ac ## ------------ ## TESTSUITE_AT = \ + forlan01.at\ hmac01.at\ hmac02.at\ hmac03.at\ @@ -69,6 +70,7 @@ check-local: atconfig atlocal $(TESTSUITE) # $(SHELL) $(TESTSUITE) AUTOTEST_PATH=$(exec_prefix)/bin noinst_PROGRAMS = \ + tforlan\ thmac\ turlenc\ txml diff --git a/tests/forlan01.at b/tests/forlan01.at new file mode 100644 index 0000000..cf826e9 --- /dev/null +++ b/tests/forlan01.at @@ -0,0 +1,77 @@ +# This file is part of Eclat -*- Autotest -*- +# 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/>. + +AT_SETUP([dump]) +AT_KEYWORDS([forlan forlan01]) + +AT_DATA([input],[// test format for DescribeTags +if (.DescribeTagsResponse) { + if (.DescribeTagsResponse.tagSet.item.resourceId[[i-deadbeef]] && + parent(last).key[[hostname]]) + print(parent(last).value); +} else if (.Response.Errors) + error(.Response.Errors.Error.Message); +else + dump(); +]) + +AT_CHECK([tforlan -D input], +[0], +[0001: COND +0002: NODE +0003: COMP ABS +0004: LIT: "DescribeTagsResponse" +0005: IFTRUE 0001 +0006: COND +0007: AND +0008: NODE +0009: COMP ABS +0010: LIT: "DescribeTagsResponse" +0011: LIT: "tagSet" +0012: LIT: "item" +0013: TEST: resourceId[[i-deadbeef]] +0014: NODE +0015: COMP +0016: CALL: parent +0017: LAST +0018: TEST: key[[hostname]] +0019: IFTRUE 0006 +0020: CALL: print +0021: COMP +0022: CALL: parent +0023: LAST +0024: LIT: "value" +0025: IFFALSE 0006 +0026: IFFALSE 0001 +0027: COND +0028: NODE +0029: COMP ABS +0030: LIT: "Response" +0031: LIT: "Errors" +0032: IFTRUE 0027 +0033: CALL: error +0034: COMP ABS +0035: LIT: "Response" +0036: LIT: "Errors" +0037: LIT: "Error" +0038: LIT: "Message" +0039: IFFALSE 0027 +0040: CALL: dump +]) + +AT_CLEANUP + + diff --git a/tests/testsuite.at b/tests/testsuite.at index f40b8a7..81e91f4 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -29,4 +29,8 @@ m4_include([urlenc01.at]) AT_BANNER([XML Processing]) m4_include([xml01.at]) + +AT_BANNER([Forlan]) +m4_include([forlan01.at]) + # End of testsuite.at 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; +} + |