#include "terminal-opts.h"
#include <stdbool.h>
-#include <xalloc.h>
#include <stdlib.h>
-#include <unistd.h>
+#include <string.h>
#include "data/settings.h"
-#include "data/file-name.h"
-#include "language/syntax-file.h"
+#include "language/lexer/include-path.h"
#include "libpspp/argv-parser.h"
#include "libpspp/assertion.h"
#include "libpspp/cast.h"
#include "libpspp/compiler.h"
-#include "libpspp/getl.h"
#include "libpspp/llx.h"
#include "libpspp/str.h"
#include "libpspp/string-array.h"
#include "output/driver.h"
#include "output/driver-provider.h"
#include "output/msglog.h"
-#include "ui/terminal/msg-ui.h"
-#include "ui/terminal/read-line.h"
+#include "output/pivot-table.h"
#include "gl/error.h"
+#include "gl/localcharset.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;
struct string_map options; /* Output driver options. */
bool has_output_driver;
bool has_terminal_driver;
bool has_error_file;
- bool process_statrc;
+ enum lex_syntax_mode *syntax_mode;
+ bool *process_statrc;
+ char **syntax_encoding;
+ char *table_look;
};
enum
OPT_OUTPUT,
OPT_OUTPUT_OPTION,
OPT_NO_OUTPUT,
+ OPT_BATCH,
OPT_INTERACTIVE,
+ OPT_SYNTAX_ENCODING,
OPT_NO_STATRC,
+ OPT_TABLE_LOOK,
OPT_HELP,
OPT_VERSION,
N_TERMINAL_OPTIONS
{"output", 'o', required_argument, OPT_OUTPUT},
{NULL, 'O', required_argument, OPT_OUTPUT_OPTION},
{"no-output", 0, no_argument, OPT_NO_OUTPUT},
+ {"batch", 'b', no_argument, OPT_BATCH},
{"interactive", 'i', no_argument, OPT_INTERACTIVE},
+ {"syntax-encoding", 0, required_argument, OPT_SYNTAX_ENCODING},
{"no-statrc", 'r', no_argument, OPT_NO_STATRC},
+ {"table-look", 0, required_argument, OPT_TABLE_LOOK},
{"help", 'h', no_argument, OPT_HELP},
{"version", 'V', no_argument, OPT_VERSION},
};
}
}
-static void
-parse_output_option (struct terminal_opts *to, const char *option)
-{
- const char *equals;
- char *key, *value;
-
- equals = strchr (option, '=');
- if (equals == NULL)
- {
- error (0, 0, _("%s: output option missing `='"), option);
- return;
- }
-
- key = xmemdup0 (option, equals - option);
- if (string_map_contains (&to->options, key))
- {
- error (0, 0, _("%s: output option specified more than once"), key);
- free (key);
- return;
- }
-
- value = xmemdup0 (equals + 1, strlen (equals + 1));
- string_map_insert_nocopy (&to->options, key, value);
-}
-
static char *
get_supported_formats (void)
{
struct string_set format_set;
char *format_string;
const char *format;
- size_t i;
/* Get supported formats as unordered set. */
string_set_init (&format_set);
return format_string;
}
-static char *
-get_default_include_path (void)
-{
- struct source_stream *ss;
- struct string dst;
- char **path;
- size_t i;
-
- ss = create_source_stream ();
- path = getl_include_path (ss);
- ds_init_empty (&dst);
- for (i = 0; path[i] != NULL; i++)
- ds_put_format (&dst, " %s", path[i]);
- destroy_source_stream (ss);
-
- return ds_steal_cstr (&dst);
-}
-
static void
usage (void)
{
char *supported_formats = get_supported_formats ();
- char *default_include_path = get_default_include_path ();
+ char *inc_path = string_array_join (include_path_default (), " ");
printf (_("\
-PSPP, a program for statistical analysis of sample data.\n\
+PSPP, a program for statistical analysis of sampled data.\n\
Usage: %s [OPTION]... FILE...\n\
\n\
Arguments to long options also apply to equivalent short options.\n\
-O device={terminal|listing} override device type for previous -o\n\
-e, --error-file=FILE append errors, warnings, and notes to FILE\n\
--no-output disable default output driver\n\
+ --table-look=FILE use output style read from FILE\n\
Supported output formats: %s\n\
\n\
Language options:\n\
calculated from broken algorithms\n\
-x, --syntax={compatible|enhanced}\n\
set to `compatible' to disable PSPP extensions\n\
+ -b, --batch interpret syntax in batch mode\n\
-i, --interactive interpret syntax in interactive mode\n\
+ --syntax-encoding=ENCODING specify encoding for syntax files\n\
-s, --safer don't allow some unsafe operations\n\
-Default search path:%s\n\
+Default search path: %s\n\
\n\
Informative output:\n\
-h, --help display this help and exit\n\
-V, --version output version information and exit\n\
\n\
Non-option arguments are interpreted as syntax files to execute.\n"),
- program_name, supported_formats, default_include_path);
+ program_name, supported_formats, inc_path);
free (supported_formats);
- free (default_include_path);
+ free (inc_path);
emit_bug_reporting_address ();
exit (EXIT_SUCCESS);
break;
case OPT_OUTPUT_OPTION:
- parse_output_option (to, optarg);
+ output_driver_parse_option (optarg, &to->options);
break;
case OPT_NO_OUTPUT:
to->has_output_driver = true;
break;
+ case OPT_BATCH:
+ *to->syntax_mode = LEX_SYNTAX_BATCH;
+ break;
+
case OPT_INTERACTIVE:
- to->syntax_mode = GETL_INTERACTIVE;
+ *to->syntax_mode = LEX_SYNTAX_INTERACTIVE;
+ break;
+
+ case OPT_SYNTAX_ENCODING:
+ *to->syntax_encoding = optarg;
break;
case OPT_NO_STATRC:
- to->process_statrc = false;
+ *to->process_statrc = false;
+ break;
+
+ case OPT_TABLE_LOOK:
+ to->table_look = optarg;
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 lex_syntax_mode *syntax_mode, bool *process_statrc,
+ char **syntax_encoding)
{
struct terminal_opts *to;
+ *syntax_mode = LEX_SYNTAX_AUTO;
+ *process_statrc = true;
+ *syntax_encoding = "Auto";
+
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->syntax_mode = syntax_mode;
+ to->process_statrc = process_statrc;
+ to->syntax_encoding = syntax_encoding;
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)
{
msglog_create ("-");
string_map_destroy (&to->options);
+
+ if (to->table_look)
+ {
+ struct pivot_table_look *look;
+ char *s = pivot_table_look_read (to->table_look, &look);
+ if (s)
+ error (1, 0, "%s", s);
+ pivot_table_look_set_default (look);
+ pivot_table_look_unref (look);
+ }
+
free (to);
}