#if HAVE_READLINE_READLINE_H
# include <readline/readline.h>
#endif
+#if HAVE_RL_ADD_HISTORY && HAVE_READLINE_HISTORY_H
+# include <readline/history.h>
+
+/* call add_history only if the line is non-blank */
+static void do_add_history(const char *line)
+{
+ if (line[strspn(line, " \t")])
+ add_history(line);
+}
+#else
+static void do_add_history(const char *line)
+{
+}
+#endif
static const char *progname = "cdecl99";
-static bool interactive = true;
+static bool batch_mode;
void print_error(const char *fmt, ...)
{
va_list(ap);
- if (!interactive)
+ if (batch_mode)
fprintf(stderr, "%s: ", progname);
fprintf(stderr, "%s", _("error: "));
printf(_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
}
-static int is_blank_line(const char *line)
-{
- return !line[strspn(line, " \t")];
-}
-
-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;
return 1;
}
-static int do_readline(char **linebuf, size_t *n, int interactive)
+static int do_readline(char **linebuf, size_t *n, bool batch)
{
#if !HAVE_READLINE
- if (interactive) {
+ if (!batch) {
fputs("> ", stdout);
fflush(stdout);
}
return do_getline(linebuf, n);
#else
- if (!interactive)
+ if (batch)
return do_getline(linebuf, n);
free(*linebuf);
if (!(*linebuf = readline("> ")))
return 0;
- if (!is_blank_line(*linebuf))
- add_history(*linebuf);
+ do_add_history(*linebuf);
return 1;
#endif
}
-static int repl(int interactive)
+static int repl(bool batch)
{
char *line = NULL;
- int ret = 0;
+ bool fail = 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)
- ret = -!interactive;
+ if (rc < 0)
+ fail = batch;
}
free(line);
- return ret;
+ return fail ? EXIT_FAILURE : 0;
+}
+
+static int repl_cmdline(unsigned count, char **commands)
+{
+ bool fail = 0;
+ unsigned i;
+
+ for (i = 0; i < count; i++) {
+ int rc = run_command(commands[i], true);
+ if (rc > 0)
+ break;
+ if (rc < 0)
+ fail = true;
+ }
+
+ return fail ? EXIT_FAILURE : 0;
}
/* Initialize gettext */
quiet = 1;
break;
case 'b':
- interactive = false;
+ batch_mode = true;
break;
case 'i':
- interactive = true;
+ batch_mode = false;
break;
case 'f':
filename = optarg;
/* --filename and --execute imply --batch. */
if (filename || execute)
- interactive = false;
+ batch_mode = true;
/* --batch implies --quiet */
- if (interactive && !quiet)
+ if (!batch_mode && !quiet)
print_version();
/* --execute supersedes --filename */
int main(int argc, char **argv)
{
- int rc, execute;
+ int execute;
switch ((execute = initialize(argc, argv))) {
case INIT_EXIT_SUCCESS: return EXIT_SUCCESS;
}
if (execute)
- rc = repl_cmdline(execute, argv);
+ return repl_cmdline(execute, argv);
else
- rc = repl(interactive);
-
- if (rc != 0)
- return EXIT_FAILURE;
- return EXIT_SUCCESS;
+ return repl(batch_mode);
}