Instead of a default-true "interactive" global variable, we can use
a default-false "batch" global variable, reversing the sense of all
the tests.
This moves the variable from the initialized data segment into bss,
which is more efficient.
#endif
static const char *progname = "cdecl99";
#endif
static const char *progname = "cdecl99";
-static bool interactive = true;
void print_error(const char *fmt, ...)
{
va_list(ap);
void print_error(const char *fmt, ...)
{
va_list(ap);
fprintf(stderr, "%s: ", progname);
fprintf(stderr, "%s", _("error: "));
fprintf(stderr, "%s: ", progname);
fprintf(stderr, "%s", _("error: "));
printf(_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
}
printf(_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
}
-static int repl_cmdline(unsigned count, char **commands)
-{
- int ret = 0;
- unsigned i;
-
- for (i = 0; i < count; i++) {
- int rc = run_command(commands[i], false);
- if (rc < 0)
- ret = -1;
- else if (rc > 0)
- break;
- }
-
- return ret;
-}
-
static int do_getline(char **linebuf, size_t *n)
{
ssize_t rc;
static int do_getline(char **linebuf, size_t *n)
{
ssize_t rc;
-static int do_readline(char **linebuf, size_t *n, int interactive)
+static int do_readline(char **linebuf, size_t *n, int batch)
fputs("> ", stdout);
fflush(stdout);
}
return do_getline(linebuf, n);
#else
fputs("> ", stdout);
fflush(stdout);
}
return do_getline(linebuf, n);
#else
return do_getline(linebuf, n);
free(*linebuf);
return do_getline(linebuf, n);
free(*linebuf);
-static int repl(int interactive)
+static int repl(int batch)
{
char *line = NULL;
int ret = 0;
size_t n;
{
char *line = NULL;
int ret = 0;
size_t n;
- while (do_readline(&line, &n, interactive)) {
- int rc = run_command(line, interactive);
+ while (do_readline(&line, &n, batch)) {
+ int rc = run_command(line, batch);
if (rc > 0)
break;
else if (rc < 0)
if (rc > 0)
break;
else if (rc < 0)
}
free(line);
return ret;
}
}
free(line);
return ret;
}
+static int repl_cmdline(unsigned count, char **commands)
+{
+ int ret = 0;
+ unsigned i;
+
+ for (i = 0; i < count; i++) {
+ int rc = run_command(commands[i], true);
+ if (rc < 0)
+ ret = -1;
+ else if (rc > 0)
+ break;
+ }
+
+ return ret;
+}
+
/* Initialize gettext */
static void init_i18n(void)
{
/* Initialize gettext */
static void init_i18n(void)
{
quiet = 1;
break;
case 'b':
quiet = 1;
break;
case 'b':
break;
case 'f':
filename = optarg;
break;
case 'f':
filename = optarg;
/* --filename and --execute imply --batch. */
if (filename || execute)
/* --filename and --execute imply --batch. */
if (filename || execute)
/* --batch implies --quiet */
/* --batch implies --quiet */
- if (interactive && !quiet)
+ if (!batch_mode && !quiet)
print_version();
/* --execute supersedes --filename */
print_version();
/* --execute supersedes --filename */
if (execute)
rc = repl_cmdline(execute, argv);
else
if (execute)
rc = repl_cmdline(execute, argv);
else
- rc = repl(interactive);
if (rc != 0)
return EXIT_FAILURE;
if (rc != 0)
return EXIT_FAILURE;
#include <gettext.h>
#define _(x) gettext(x)
#include <gettext.h>
#define _(x) gettext(x)
-int run_command(const char *line, int interactive);
+int run_command(const char *line, int batch);
int run_command_simplify(const char *arg);
int run_command_explain(const char *arg);
int run_command_declare(const char *cmdarg);
int run_command_simplify(const char *arg);
int run_command_explain(const char *arg);
int run_command_declare(const char *cmdarg);
-int run_command(const char *line, int interactive)
+int run_command(const char *line, int batch)
{
const char *cmd = line + strspn(line, " \t");
const char *arg = cmd + strcspn(cmd, " \t");
{
const char *cmd = line + strspn(line, " \t");
const char *arg = cmd + strcspn(cmd, " \t");
c = in_word_set(cmd, arg-cmd);
if (!c) {
print_error(_("unknown command %.*s"), (int)(arg-cmd), cmd);
c = in_word_set(cmd, arg-cmd);
if (!c) {
print_error(_("unknown command %.*s"), (int)(arg-cmd), cmd);
fprintf(stderr, "%s\n",
_("Try \"help\" for a list of possible commands."));
}
fprintf(stderr, "%s\n",
_("Try \"help\" for a list of possible commands."));
}
[[explain int a b c
simplify int a b c
declare a as b c
[[explain int a b c
simplify int a b c
declare a as b c
AT_CHECK([LC_ALL=C cdecl99 --file=input || exit 42], [42], [], [stderr])
AT_CHECK([$AWK -v progname="$progname" -f check.awk stderr])
AT_CHECK([LC_ALL=C cdecl99 --file=input || exit 42], [42], [], [stderr])
AT_CHECK([$AWK -v progname="$progname" -f check.awk stderr])
+exec 3<input
+set x; shift
+while read line <&3; do
+ set x "$@" "--execute=$line"; shift;
+done
+AT_CHECK([LC_ALL=C cdecl99 "$@" || exit 42], [42], [], [stderr])
+AT_CHECK([$AWK -v progname="$progname" -f check.awk stderr])
+
AT_CLEANUP
AT_SETUP([cdecl99 invalid character error messages])
AT_CLEANUP
AT_SETUP([cdecl99 invalid character error messages])