1 /* PSPPIRE - a graphical user interface for PSPP.
2 Copyright (C) 2008, 2010 Free Software Foundation
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 #include "terminal-opts.h"
25 #include "data/settings.h"
26 #include "language/lexer/include-path.h"
27 #include "libpspp/argv-parser.h"
28 #include "libpspp/assertion.h"
29 #include "libpspp/cast.h"
30 #include "libpspp/compiler.h"
31 #include "libpspp/llx.h"
32 #include "libpspp/str.h"
33 #include "libpspp/string-array.h"
34 #include "libpspp/string-map.h"
35 #include "libpspp/string-set.h"
36 #include "libpspp/version.h"
37 #include "output/driver.h"
38 #include "output/driver-provider.h"
39 #include "output/msglog.h"
40 #include "output/pivot-table.h"
43 #include "gl/localcharset.h"
44 #include "gl/progname.h"
45 #include "gl/version-etc.h"
46 #include "gl/xmemdup0.h"
47 #include "gl/xalloc.h"
50 #define _(msgid) gettext (msgid)
51 #define N_(msgid) msgid
55 struct string_map options; /* Output driver options. */
56 bool has_output_driver;
57 bool has_terminal_driver;
59 enum segmenter_mode *syntax_mode;
61 char **syntax_encoding;
82 static struct argv_option terminal_argv_options[N_TERMINAL_OPTIONS] =
84 {"testing-mode", 0, no_argument, OPT_TESTING_MODE},
85 {"error-file", 'e', required_argument, OPT_ERROR_FILE},
86 {"output", 'o', required_argument, OPT_OUTPUT},
87 {NULL, 'O', required_argument, OPT_OUTPUT_OPTION},
88 {"no-output", 0, no_argument, OPT_NO_OUTPUT},
89 {"batch", 'b', no_argument, OPT_BATCH},
90 {"interactive", 'i', no_argument, OPT_INTERACTIVE},
91 {"syntax-encoding", 0, required_argument, OPT_SYNTAX_ENCODING},
92 {"no-statrc", 'r', no_argument, OPT_NO_STATRC},
93 {"table-look", 0, required_argument, OPT_TABLE_LOOK},
94 {"help", 'h', no_argument, OPT_HELP},
95 {"version", 'V', no_argument, OPT_VERSION},
99 register_output_driver (struct terminal_opts *to)
101 if (!string_map_is_empty (&to->options))
103 struct output_driver *driver;
105 driver = output_driver_create (&to->options);
108 output_driver_register (driver);
110 to->has_output_driver = true;
111 if (driver->device_type == SETTINGS_DEVICE_TERMINAL)
112 to->has_terminal_driver = true;
114 string_map_clear (&to->options);
119 get_supported_formats (void)
121 const struct string_set_node *node;
122 struct string_array format_array;
123 struct string_set format_set;
127 /* Get supported formats as unordered set. */
128 string_set_init (&format_set);
129 output_get_supported_formats (&format_set);
131 /* Converted supported formats to sorted array. */
132 string_array_init (&format_array);
133 STRING_SET_FOR_EACH (format, node, &format_set)
134 string_array_append (&format_array, format);
135 string_array_sort (&format_array);
136 string_set_destroy (&format_set);
138 /* Converted supported formats to string. */
139 format_string = string_array_join (&format_array, " ");
140 string_array_destroy (&format_array);
141 return format_string;
147 char *supported_formats = get_supported_formats ();
148 char *inc_path = string_array_join (include_path_default (), " ");
151 PSPP, a program for statistical analysis of sampled data.\n\
152 Usage: %s [OPTION]... FILE...\n\
154 Arguments to long options also apply to equivalent short options.\n\
157 -o, --output=FILE output to FILE, default format from FILE's name\n\
158 -O format=FORMAT override format for previous -o\n\
159 -O OPTION=VALUE set output option to customize previous -o\n\
160 -O device={terminal|listing} override device type for previous -o\n\
161 -e, --error-file=FILE append errors, warnings, and notes to FILE\n\
162 --no-output disable default output driver\n\
163 --table-look=FILE use output style read from FILE\n\
164 Supported output formats: %s\n\
167 -I, --include=DIR append DIR to search path\n\
168 -I-, --no-include clear search path\n\
169 -r, --no-statrc disable running rc file at startup\n\
170 -a, --algorithm={compatible|enhanced}\n\
171 set to `compatible' if you want output\n\
172 calculated from broken algorithms\n\
173 -x, --syntax={compatible|enhanced}\n\
174 set to `compatible' to disable PSPP extensions\n\
175 -b, --batch interpret syntax in batch mode\n\
176 -i, --interactive interpret syntax in interactive mode\n\
177 --syntax-encoding=ENCODING specify encoding for syntax files\n\
178 -s, --safer don't allow some unsafe operations\n\
179 Default search path: %s\n\
181 Informative output:\n\
182 -h, --help display this help and exit\n\
183 -V, --version output version information and exit\n\
185 Non-option arguments are interpreted as syntax files to execute.\n"),
186 program_name, supported_formats, inc_path);
188 free (supported_formats);
191 emit_bug_reporting_address ();
196 terminal_option_callback (int id, void *to_)
198 struct terminal_opts *to = to_;
202 case OPT_TESTING_MODE:
203 settings_set_testing_mode (true);
207 if (!strcmp (optarg, "none") || msglog_create (optarg))
208 to->has_error_file = true;
212 register_output_driver (to);
213 string_map_insert (&to->options, "output-file", optarg);
216 case OPT_OUTPUT_OPTION:
217 output_driver_parse_option (optarg, &to->options);
221 /* Pretend that we already have an output driver, which disables adding
222 one in terminal_opts_done() when we don't already have one. */
223 to->has_output_driver = true;
227 *to->syntax_mode = SEG_MODE_BATCH;
230 case OPT_INTERACTIVE:
231 *to->syntax_mode = SEG_MODE_INTERACTIVE;
234 case OPT_SYNTAX_ENCODING:
235 *to->syntax_encoding = optarg;
239 *to->process_statrc = false;
243 to->table_look = optarg;
251 version_etc (stdout, "pspp", PACKAGE_NAME, PACKAGE_VERSION,
252 "Ben Pfaff", "John Darrington", "Jason Stover",
261 struct terminal_opts *
262 terminal_opts_init (struct argv_parser *ap,
263 enum segmenter_mode *syntax_mode, bool *process_statrc,
264 char **syntax_encoding)
266 *syntax_mode = SEG_MODE_AUTO;
267 *process_statrc = true;
268 *syntax_encoding = "Auto";
270 struct terminal_opts *to = XZALLOC (struct terminal_opts);
271 to->syntax_mode = syntax_mode;
272 string_map_init (&to->options);
273 to->has_output_driver = false;
274 to->has_error_file = false;
275 to->syntax_mode = syntax_mode;
276 to->process_statrc = process_statrc;
277 to->syntax_encoding = syntax_encoding;
279 argv_parser_add_options (ap, terminal_argv_options, N_TERMINAL_OPTIONS,
280 terminal_option_callback, to);
285 terminal_opts_done (struct terminal_opts *to, int argc, char *argv[])
287 register_output_driver (to);
288 if (!to->has_output_driver)
290 string_map_insert (&to->options, "output-file", "-");
291 string_map_insert (&to->options, "format", "txt");
292 register_output_driver (to);
295 if (!to->has_terminal_driver && !to->has_error_file)
298 string_map_destroy (&to->options);
302 struct pivot_table_look *look;
303 char *s = pivot_table_look_read (to->table_look, &look);
305 error (1, 0, "%s", s);
306 pivot_table_look_set_default (look);
307 pivot_table_look_unref (look);