]> git.draconx.ca Git - cdecl99.git/blobdiff - test/crossparse.c
Fix testcase compilation with --disable-shared.
[cdecl99.git] / test / crossparse.c
index f377c38142c2ae54644d0874cf4d80250ffe062f..210714a3a5dada4fcfdaf9ca88a95387f45f6935 100644 (file)
@@ -1,7 +1,26 @@
+/*
+ * Test that libcdecl can parse its own output.
+ * Copyright © 2012, 2020 Nick Bowler
+ *
+ * This program 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.
+ *
+ * This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
 #include <config.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <errno.h>
 #include <stdbool.h>
 #include <getopt.h>
 #include <cdecl.h>
 
 #define PROGNAME "crossparse"
 static const char *progname = PROGNAME;
-static const char sopts[] = "ECVH";
+static const char sopts[] = "f:ECVH";
 static const struct option lopts[] = {
        { "cdecl",   0, NULL, 'C' },
        { "english", 0, NULL, 'E' },
+       { "file",    2, NULL, 'f' },
        { "version", 0, NULL, 'V' },
        { "help",    0, NULL, 'H' },
        { 0 }
@@ -25,8 +45,18 @@ static void print_usage(FILE *f)
 
 static void print_help(void)
 {
+       const struct option *opt;
+
        print_usage(stdout);
-       puts("Detailed help coming soon.");
+       puts("Test that libcdecl can parse its own output.\n");
+
+       puts("Options:");
+       for (opt = lopts; opt->val; opt++) {
+               int w = print_option_start(opt, NULL);
+
+               if (w)
+                       putchar('\n');
+       }
 }
 
 enum {
@@ -103,13 +133,22 @@ out:
        free(buf1);
        free(buf2);
        free(buf3);
+
+       if (!ret) {
+               fprintf(stderr, "%s: failed cross-parse check of: %s\n",
+                               progname, str);
+       }
+
        return ret;
 }
 
 int main(int argc, char **argv)
 {
        int opt, mode = MODE_CDECL;
-       int ret = EXIT_FAILURE;
+       int ret = EXIT_SUCCESS;
+
+       const char *filename = NULL;
+       FILE *infile = NULL;
 
        if (argc > 0)
                progname = argv[0];
@@ -122,6 +161,10 @@ int main(int argc, char **argv)
                case 'E':
                        mode = MODE_ENGLISH;
                        break;
+               case 'f':
+                       infile = stdin;
+                       filename = optarg;
+                       break;
                case 'V':
                        test_print_version(PROGNAME);
                        return EXIT_SUCCESS;
@@ -134,18 +177,35 @@ int main(int argc, char **argv)
                }
        }
 
-       if (!argv[optind]) {
-               print_usage(stderr);
-               return EXIT_FAILURE;
-       }
+       if (infile) {
+               char *line = NULL;
+               size_t n;
+
+               if (filename) {
+                       infile = fopen(filename, "r");
+                       if (!infile) {
+                               fprintf(stderr, "%s: %s: %s\n", progname,
+                                               filename, strerror(errno));
+                               return EXIT_FAILURE;
+                       }
+               }
 
-       for (int i = optind; i < argc; i++) {
-               if (!test_crossparse(argv[i], mode)) {
-                       fprintf(stderr, "%s: failed cross-parse check of: %s\n",
-                                       progname, argv[i]);
-                       return EXIT_FAILURE;
+               while (getline(&line, &n, infile) >= 0) {
+                       char *c = strchr(line, '\n');
+                       if (c)
+                               *c = '\0';
+                       if (!test_crossparse(line, mode))
+                               ret = EXIT_FAILURE;
                }
+       } else if (argv[optind]) {
+               for (int i = optind; i < argc; i++) {
+                       if (!test_crossparse(argv[i], mode))
+                               ret = EXIT_FAILURE;
+               }
+       } else {
+               print_usage(stderr);
+               return EXIT_FAILURE;
        }
 
-       return EXIT_SUCCESS;
+       return ret;
 }