/*
* Test that libcdecl can parse its own output.
- * Copyright © 2012, 2020, 2022-2023 Nick Bowler
+ * Copyright © 2012, 2020, 2022-2024 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
#include <errno.h>
#include <stdbool.h>
#include <getopt.h>
-#include <cdecl.h>
-#include "test.h"
+
+#include "cdecl.h"
#define PROGNAME "crossparse"
-static const char *progname = PROGNAME;
+#include "test.h"
+#include "getline.h"
+
static const char sopts[] = "f:ECVH";
static const struct option lopts[] = {
{ "cdecl", 0, NULL, 'C' },
static void print_help(void)
{
- const struct option *opt;
-
print_usage(stdout);
puts("Test that libcdecl can parse its own output.\n");
test_print_options(lopts);
enum {
MODE_CDECL,
- MODE_ENGLISH,
+ MODE_ENGLISH
};
typedef struct cdecl *parse_func(const char *);
decl = parse(str);
if (!decl) {
- fprintf(stderr, "%s: %s: failed to parse input: %s\n",
- progname, parse_name, cdecl_get_error()->str);
+ print_error("%s: failed to parse input: %s", parse_name,
+ cdecl_get_error()->str);
goto err;
}
len = render(NULL, 0, decl);
buf = malloc_nofail(len+1);
if (render(buf, len+1, decl) != len) {
- fprintf(stderr, "%s: %s: inconsistent length returned\n",
- progname, render_name);
+ print_error("%s: inconsistent length returned", render_name);
goto err;
}
cdecl_free(decl);
free(buf);
- fprintf(stderr, "%s: the failed input was: %s\n", progname, str);
+ print_error("the failed input was: %s", str);
return NULL;
}
#define rerender(str, p, r) (rerender(str, #p, p, #r, r))
free(buf3);
if (!ret) {
- fprintf(stderr, "%s: failed cross-parse check of: %s\n",
- progname, str);
+ print_error("failed cross-parse check of: %s", str);
}
return ret;
{
int opt, mode = MODE_CDECL;
int ret = EXIT_SUCCESS;
+ int i;
const char *filename = NULL;
- FILE *infile = NULL;
if (argc > 0)
progname = argv[0];
mode = MODE_ENGLISH;
break;
case 'f':
- infile = stdin;
filename = optarg;
break;
case 'V':
}
}
- if (infile) {
+ if (filename && !freopen(filename, "r", stdin)) {
+ print_error("%s: %s", filename, strerror(errno));
+ return EXIT_FAILURE;
+ } else if (filename) {
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;
- }
- }
+ size_t n = 0;
- while (getline(&line, &n, infile) >= 0) {
- char *c = strchr(line, '\n');
- if (c)
- *c = '\0';
+ while (do_getline(&line, &n)) {
if (!test_crossparse(line, mode))
ret = EXIT_FAILURE;
}
free(line);
- fclose(infile);
} else if (argv[optind]) {
- for (int i = optind; i < argc; i++) {
+ for (i = optind; i < argc; i++) {
if (!test_crossparse(argv[i], mode))
ret = EXIT_FAILURE;
}