Also adds a test.
#if HAVE_IEEEFP_H
#include <ieeefp.h>
#endif
+#include <unistd.h>
#include "data/dictionary.h"
#include "data/file-handle-def.h"
#include "language/command.h"
#include "language/lexer/lexer.h"
#include "language/prompt.h"
+#include "language/syntax-file.h"
#include "libpspp/argv-parser.h"
#include "libpspp/compiler.h"
#include "libpspp/getl.h"
static struct lexer *the_lexer;
static struct source_stream *the_source_stream ;
+static void add_syntax_file (struct source_stream *, enum syntax_mode,
+ const char *file_name);
static void bug_handler(int sig);
static void fpu_init (void);
static void clean_up (void);
{
struct terminal_opts *terminal_opts;
struct argv_parser *parser;
+ enum syntax_mode syntax_mode;
+ bool process_statrc;
set_program_name (argv[0]);
the_dataset = create_dataset ();
parser = argv_parser_create ();
- terminal_opts = terminal_opts_init (parser, the_source_stream);
+ terminal_opts = terminal_opts_init (parser, &syntax_mode, &process_statrc);
source_init_register_argv_parser (parser, the_source_stream);
if (!argv_parser_run (parser, argc, argv))
exit (EXIT_FAILURE);
msg_ui_init (the_source_stream);
- the_lexer = lex_create (the_source_stream);
+ /* Add syntax files to source stream. */
+ if (process_statrc)
+ {
+ char *rc = fn_search_path ("rc", getl_include_path (the_source_stream));
+ if (rc != NULL)
+ {
+ add_syntax_file (the_source_stream, GETL_BATCH, rc);
+ free (rc);
+ }
+ }
+ if (optind < argc)
+ {
+ int i;
+
+ for (i = optind; i < argc; i++)
+ add_syntax_file (the_source_stream, syntax_mode, argv[i]);
+ }
+ else
+ add_syntax_file (the_source_stream, syntax_mode, "-");
+ /* Parse and execute syntax. */
+ the_lexer = lex_create (the_source_stream);
for (;;)
{
int result = cmd_parse (the_lexer, the_dataset);
i18n_done ();
}
}
+
+static void
+add_syntax_file (struct source_stream *ss, enum syntax_mode syntax_mode,
+ const char *file_name)
+{
+ struct getl_interface *source;
+
+ source = (!strcmp (file_name, "-") && isatty (STDIN_FILENO)
+ ? create_readln_source ()
+ : create_syntax_file_source (file_name));
+ getl_append_source (ss, source, syntax_mode, ERRMODE_CONTINUE);
+}
#include "terminal-opts.h"
#include <stdbool.h>
-#include <xalloc.h>
#include <stdlib.h>
-#include <unistd.h>
#include "data/settings.h"
#include "data/file-name.h"
#include "gl/progname.h"
#include "gl/version-etc.h"
#include "gl/xmemdup0.h"
+#include "gl/xalloc.h"
#include "gettext.h"
#define _(msgid) gettext (msgid)
struct terminal_opts
{
- struct source_stream *source_stream;
- enum syntax_mode syntax_mode;
+ enum syntax_mode *syntax_mode;
struct string_map options; /* Output driver options. */
bool has_output_driver;
bool has_terminal_driver;
bool has_error_file;
- bool process_statrc;
+ bool *process_statrc;
};
enum
break;
case OPT_INTERACTIVE:
- to->syntax_mode = GETL_INTERACTIVE;
+ *to->syntax_mode = GETL_INTERACTIVE;
break;
case OPT_NO_STATRC:
- to->process_statrc = false;
+ *to->process_statrc = false;
break;
case OPT_HELP:
}
struct terminal_opts *
-terminal_opts_init (struct argv_parser *ap, struct source_stream *ss)
+terminal_opts_init (struct argv_parser *ap,
+ enum syntax_mode *syntax_mode, bool *process_statrc)
{
struct terminal_opts *to;
+ *syntax_mode = GETL_BATCH;
+ *process_statrc = true;
+
to = xzalloc (sizeof *to);
- to->source_stream = ss;
- to->syntax_mode = GETL_BATCH;
+ to->syntax_mode = syntax_mode;
string_map_init (&to->options);
to->has_output_driver = false;
to->has_error_file = false;
- to->process_statrc = true;
+ to->process_statrc = process_statrc;
argv_parser_add_options (ap, terminal_argv_options, N_TERMINAL_OPTIONS,
terminal_option_callback, to);
return to;
}
-static void
-add_syntax_file (struct terminal_opts *to, const char *file_name)
-{
- if (!strcmp (file_name, "-") && isatty (STDIN_FILENO))
- getl_append_source (to->source_stream, create_readln_source (),
- GETL_INTERACTIVE, ERRMODE_CONTINUE);
- else
- getl_append_source (to->source_stream,
- create_syntax_file_source (file_name),
- to->syntax_mode, ERRMODE_CONTINUE);
-}
-
void
terminal_opts_done (struct terminal_opts *to, int argc, char *argv[])
{
- if (to->process_statrc)
- {
- char *rc = fn_search_path ("rc", getl_include_path (to->source_stream));
- if (rc != NULL)
- {
- getl_append_source (to->source_stream,
- create_syntax_file_source (rc), GETL_BATCH,
- ERRMODE_CONTINUE);
- free (rc);
- }
- }
-
- if (optind < argc)
- {
- int i;
-
- for (i = optind; i < argc; i++)
- add_syntax_file (to, argv[i]);
- }
- else
- add_syntax_file (to, "-");
-
register_output_driver (to);
if (!to->has_output_driver)
{
#ifndef UI_TERMINAL_TERMINAL_OPTS_H
#define UI_TERMINAL_TERMINAL_OPTS_H 1
+#include <stdbool.h>
+#include "libpspp/getl.h"
+
struct argv_parser;
-struct source_stream;
struct terminal_opts;
struct terminal_opts *terminal_opts_init (struct argv_parser *,
- struct source_stream *);
+ enum syntax_mode *,
+ bool *process_statrc);
void terminal_opts_done (struct terminal_opts *, int argc, char *argv[]);
#endif /* ui/terminal/terminal-opts.h */
tests/math/moments.at \
tests/output/render.at \
tests/output/charts.at \
+ tests/ui/terminal/main.at \
tests/perl-module.at
TESTSUITE = $(srcdir)/tests/testsuite
--- /dev/null
+AT_BANNER([PSPP terminal UI])
+
+AT_SETUP([nonexistent syntax file crash])
+AT_CHECK([pspp nonexistent], [1],
+ [error: Opening `nonexistent': No such file or directory.
+])
+AT_CLEANUP