From: Ben Pfaff Date: Sun, 7 Feb 2010 04:35:46 +0000 (-0800) Subject: Greatly simplify PSPP configuration. X-Git-Tag: sav-api~411 X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pspp;a=commitdiff_plain;h=f51ecb48027e6b1eb46840ae25888a25b429f012 Greatly simplify PSPP configuration. This gets rid of the "devices" configuration file entirely. Now you can make pspp output to, for example, an HTML file, by invoking it as "pspp -o out.html". Please read the documentation for full information. It would be good to have a way to read options from a file to support, for example, the IBM-PC or Unicode line drawing characters as implemented in "devices" in previous versions. I hope that we can introduce that soon. --- diff --git a/Makefile.am b/Makefile.am index 0022e1d70c..b24afdaf77 100644 --- a/Makefile.am +++ b/Makefile.am @@ -61,7 +61,6 @@ DIST_HOOKS += generate-changelog include $(top_srcdir)/po/automake.mk include $(top_srcdir)/lib/automake.mk include $(top_srcdir)/doc/automake.mk -include $(top_srcdir)/config/automake.mk include $(top_srcdir)/examples/automake.mk include $(top_srcdir)/src/automake.mk diff --git a/Smake b/Smake index e8ffdd5705..ad228ebaa2 100644 --- a/Smake +++ b/Smake @@ -5,7 +5,6 @@ GNULIB = ../gnulib GNULIB_TOOL = $(GNULIB)/gnulib-tool GNULIB_MODULES = \ - argp \ assert \ byteswap \ c-ctype \ @@ -81,6 +80,8 @@ GNULIB_MODULES = \ unistr/u8-strncat \ unlocked-io \ vasprintf-posix \ + version-etc \ + version-etc-fsf \ vfprintf-posix \ vprintf-posix \ vsnprintf \ diff --git a/config/OChangeLog b/config/OChangeLog deleted file mode 100644 index dbf6c3ad65..0000000000 --- a/config/OChangeLog +++ /dev/null @@ -1,217 +0,0 @@ -2007-09-25 Ben Pfaff - - * devices (tty-ascii): Set length and width to "auto", so that - they reflect the current size of the terminal window as it - changes. - -2007-09-22 Ben Pfaff - - Bug #21128. Reviewed by John Darrington. - - * papersize: Removed. - - * automake.mk (dist_pkgsysconf_DATA): Remove papersize. - -2007-08-26 Ben Pfaff - - * devices: Change raw-ascii from screen to listing device (because - that's how it's used). - -2007-07-25 Ben Pfaff - - * devices: Add tty and listing devices that use VT100 (and xterm) - line-drawing characters. - -2007-07-25 Ben Pfaff - - * devices: Add an "interactive" category that defaults to - tty-ascii. Make the tty-ascii device more user-friendly. - -Tue Apr 4 20:20:49 2006 Ben Pfaff - - * automake.mk: Fix bugs in installation targets. - -Mon Apr 3 11:01:16 2006 Ben Pfaff - - * automake.mk: (pkgsysconf_DATA) Add AFM files in config/psfonts. - Remove config/html-prologue, config/ps-prologue. - - * html-prologue: Removed. - - * ps-prologue: Removed. - - * psfonts/Courier-Bold.afm, psfonts/Courier-BoldOblique.afm, - psfonts/Courier-Oblique.afm, psfonts/Courier.afm, - psfonts/Helvetica-Bold.afm, psfonts/Helvetica-BoldOblique.afm, - psfonts/Helvetica-Oblique.afm, psfonts/Helvetica.afm, - psfonts/Times-Bold.afm, psfonts/Times-BoldItalic.afm, - psfonts/Times-Italic.afm, psfonts/Times-Roman.afm: New files. - -Sat Feb 11 21:58:29 2006 Ben Pfaff - - * html-prologue: Don't use ${source-file}, which is no longer - supported. - -Tue Dec 30 22:37:04 2003 Ben Pfaff - - * devices: Add "squeeze=on top-margin=0 bottom-margin=0" to - raw-ascii to make test output more readable. - -Sun May 24 22:40:13 1998 Ben Pfaff - - * ps-prologue: Add %%DocumentMedia: comment. - -Wed May 20 00:02:51 1998 Ben Pfaff - - * ps-prologue: Comment out misleading Bounding-Box comment for - now. SF arguments rearranged. BP removed. - -Wed Apr 15 13:00:46 1998 Ben Pfaff - - * Makefile.am: (private-install) Make it work for separate source - and build directories. - - * ps-prologue: New TL macro for a thick line. New thick-width arg - to BP. - -Sun Jan 4 18:11:11 1998 Ben Pfaff - - * ps-prologue: Minor reorganization. New GB macro to draw a gray - box. - -Wed Dec 24 22:35:13 1997 Ben Pfaff - - * devices: Added devicetype options and documentation for them. - -Fri Dec 5 21:51:08 1997 Ben Pfaff - - * Makefile.am: (pkgsysconf_DATA) Add html-prologue. - (EXTRA_DIST) Add html-prologue. - - * devices: Add `html' device. Add `listing', `screen', and - `printer' flags to devices as appropriate. - - * html-prologue: New file. - - * ps-prologue: Comment fixes. - -Thu Sep 18 21:31:02 1997 Ben Pfaff - - * Makefile.am: (pkgsysconfdir) Changed from $(pkgdatadir) to - $(sysconfdir)/$(PACKAGE). - -Thu Aug 14 22:05:54 1997 Ben Pfaff - - * devices: (tty) Define as null instead of not defining. - -Sun Aug 3 11:33:28 1997 Ben Pfaff - - * devices: tty-ascii has no bold or italic by default. - -Wed Jun 25 22:50:19 1997 Ben Pfaff - - * Makefile.am: (EXTRA_DIST) New target. - -Mon May 5 21:56:54 1997 Ben Pfaff - - * devices, papersize, ps-prologue: Comment fixes. - -Fri May 2 22:05:44 1997 Ben Pfaff - - * Makefile.am: Removed ps-fontmap. - - * ps-fontmap: Removed. - - * ps-prologue: Added comments. Fixed DSC comments. - (BP) Two new arguments; fixed problem with SF argument conflict - with SF function. - -Thu May 1 14:57:52 1997 Ben Pfaff - - * ps-prologue: (BP) New argument, SF or scale factor. - -Fri Apr 18 16:48:41 1997 Ben Pfaff - - * Makefile.am: New file. - - * environment: Comment fix. - -Sat Feb 15 21:26:53 1997 Ben Pfaff - - * devices: Added ml520 and ml520-ul printer devices. - -Sat Jan 11 15:44:15 1997 Ben Pfaff - - * devices: Default listing device is list-ascii, not list-ibmpc. - -Sun Dec 29 21:36:48 1996 Ben Pfaff - - * devices: Changed default devices. - -Sat Sep 7 22:35:12 1996 Ben Pfaff - - * ps-prologue: Added `!encodings' line to cause encodings to be - output. - (T) Fixed. Yes, really this time. - -Thu Sep 5 22:05:56 1996 Ben Pfaff - - * ps-prologue: (T) Now works correctly. - (SF) Parameters changed to: size in psus, target font name, - encoding, PostScript font name. - -Wed Sep 4 21:45:35 1996 Ben Pfaff - - * prologue.ps: Renamed ps-prologue, all references changed. - (T) New definition. - - * ps-encodings: New PostScript configuration file (not present in - distribution). - -Sat Aug 31 23:52:38 1996 Ben Pfaff - - * prologue.ps: One minor comment change. - -Thu Aug 29 21:36:41 1996 Ben Pfaff - - * prologue.ps: Portions other than DSC comments are essentially - completely new. - -Sat Aug 24 23:26:00 1996 Ben Pfaff - - * devices: Added PostScript driver. - -Sun Aug 11 21:31:22 1996 Ben Pfaff - - * prologue.ps: Calls `setlinecap' in setup code. - -Sat Aug 10 23:28:17 1996 Ben Pfaff - - * prologue.ps: DSC comment changes. New call to `setlinewidth' in - setup code. - -Thu Aug 8 22:31:11 1996 Ben Pfaff - - * prologue.ps: Changes to scaling & translating code. - -Sat Aug 3 20:50:35 1996 Ben Pfaff - - * environment: New file. Yet another new time- and memory-hogging - redundant config file; why not? - - * papersize: Comment changes. - - * prologue.ps: Changed vars from $varname$ to ${varname} format. - Miscellaneous changes. - - * ps-fontmap: Comment changes. Fixed ZC family. - -Sat Jul 27 22:32:38 1996 Ben Pfaff - - * ps-fontmap: New configuration file. Added to Makefile.am. - ----------------------------------------------------------------------- -Local Variables: -mode: change-log -version-control: never -End: diff --git a/config/automake.mk b/config/automake.mk deleted file mode 100644 index 509706e571..0000000000 --- a/config/automake.mk +++ /dev/null @@ -1,7 +0,0 @@ -## Process this file with automake to produce Makefile.in -*- makefile -*- - - -dist_pkgsysconf_DATA = \ - config/devices - -EXTRA_DIST += config/OChangeLog diff --git a/config/devices b/config/devices deleted file mode 100644 index 3bc685a004..0000000000 --- a/config/devices +++ /dev/null @@ -1,210 +0,0 @@ -# PSPP's standard output drivers. -# -# An introduction to the use of PSPP output drivers and this file -# follows. However, refer to PSPP's Texinfo documentation for full -# information. -# -# Each output driver specification must be on a single line; however, -# lines may be spliced with a \ at the end of a line. Line splicing -# is performed *before* comments (introduced by `#') are removed. -# -# Format is `DRIVERNAME:CLASSNAME:DEVICETYPE:OPTIONS'. -# -# DRIVERNAME is the name that identifies the driver to the user. It -# is the name used on the -o command-line option. -# -# CLASSNAME is the internal name of the type of driver. Device -# classes can be listed with `pspp -l'. -# -# DEVICETYPE identifies what type or types the devices is. Zero or -# more of the following keywords may be given here: screen, printer, -# or listing. -# -# OPTIONS is a list of key/value pairs to pass to the driver. Use -# spaces to separate pairs, and '=' to separate keys and values. -# Quotes " or ' can be used to delimit values that contain spaces. -# Example: paper-size="Envelope #10" charset=latin1 -# -# Driver categories may be defined with lines of the form: -# -# category=driver1 driver2 driver3 ... driverN -# -# To disable a driver, define a category with nothing on the right -# side. -# -# Macros may be defined with lines of the form: -# -# define macro-name definition -# -# Macros may not be recursive; they may not take arguments. (However, -# `definition' is macro-expanded *at time of definition*.) Macros are -# referenced with $var or ${var} syntax; the latter is preferred. - -# Preferred devices. -default=list-ascii -interactive=tty-ascii - -# Output files. -define tty-output-file "|more" -define list-output-file "pspp.list" - -# Generic ASCII devices -tty-ascii:ascii:screen:squeeze=on headers=off top-margin=0 bottom-margin=0 \ - paginate=off length=auto width=auto output-file=${tty-output-file} -list-ascii:ascii:listing:length=66 width=79 output-file=${list-output-file} -raw-ascii:ascii:listing:width=9999 length=9999 output-file=${list-output-file} \ - emphasis=none headers=off paginate=off squeeze=on \ - top-margin=0 bottom-margin=0 - -# ASCII devices that support bold & underline via backspacing. -tty-ascii-bi:ascii:screen:output-file=${tty-output-file} -list-ascii-bi:ascii:listing:length=66 width=79 output-file=${list-output-file} - -# VT100 graphics devices. -define vt100-graphics \ - init='\033(B\033)0' \ - box[1000]='\16q\17' box[1010]='\16q\17' box[0010]='\16q\17' \ - box[0100]='\16x\17' box[0101]='\16x\17' box[0001]='\16x\17' \ - box[0011]='\16j\17' box[1100]='\16l\17' box[0110]='\16k\17' \ - box[1001]='\16m\17' box[1110]='\16w\17' box[1101]='\16t\17' \ - box[0111]='\16u\17' box[1011]='\16v\17' box[1111]='\16n\17' - -tty-vt100:ascii:screen:squeeze=on headers=off top-margin=0 bottom-margin=0 \ - paginate=off output-file=${tty-output-file} ${vt100-graphics} -list-vt100:ascii:listing:length=66 width=79 output-file=${list-output-file} \ - ${vt100-graphics} - -# HTML device. -html:html:: - -# PostScript device. -list-ps:postscript:: - -# Cairo devices. -pdf:cairo:listing: -svg:cairo:listing:output-type=svg output-file="pspp.svg" -ps-cairo:cairo:listing:output-type=ps output-file="pspp-cairo.ps" - -odt:odf:listing:debug=off output-file="pspp.odt" - -# Devices that support the IBM PC line-drawing characters. -define ibmpc-graphics \ - box[0000]='\x20' box[0001]='\xb3' box[0002]='\xba' \ - box[0010]='\xc4' box[0011]='\xd9' box[0012]='\xbd' \ - box[0020]='\xcd' box[0021]='\xbe' box[0022]='\xbc' \ - box[0100]='\xb3' box[0101]='\xb3' box[0102]='\xc4' \ - box[0110]='\xbf' box[0111]='\xb4' box[0112]='\xb6' \ - box[0120]='\xb8' box[0121]='\xb5' box[0122]='\xb9' \ - box[0200]='\xba' box[0201]='\xba' box[0202]='\xba' \ - box[0210]='\xb7' box[0211]='\xb6' box[0212]='\xb6' \ - box[0220]='\xbb' box[0221]='\xb9' box[0222]='\xb9' \ - box[1000]='\xc4' box[1001]='\xc0' box[1002]='\xd3' \ - box[1010]='\xc4' box[1011]='\xc1' box[1012]='\xd0' \ - box[1020]='\xcd' box[1021]='\xcf' box[1022]='\xca' \ - box[1100]='\xda' box[1101]='\xc3' box[1102]='\xc7' \ - box[1110]='\xc2' box[1111]='\xc5' box[1112]='\xd7' \ - box[1120]='\xd1' box[1121]='\xd8' box[1122]='\xce' \ - box[1200]='\xd6' box[1201]='\xc7' box[1202]='\xc7' \ - box[1210]='\xd2' box[1211]='\xd7' box[1212]='\xd7' \ - box[1220]='\xca' box[1221]='\xce' box[1222]='\xce' \ - box[2000]='\xcd' box[2001]='\xd4' box[2002]='\xc8' \ - box[2010]='\xcd' box[2011]='\xcf' box[2012]='\xca' \ - box[2020]='\xcd' box[2021]='\xcf' box[2022]='\xca' \ - box[2100]='\xd5' box[2101]='\xc6' box[2102]='\xcc' \ - box[2110]='\xd1' box[2111]='\xd8' box[2112]='\xce' \ - box[2120]='\xd1' box[2121]='\xd8' box[2122]='\xce' \ - box[2200]='\xc9' box[2201]='\xcc' box[2202]='\xcc' \ - box[2210]='\xcb' box[2211]='\xce' box[2212]='\xce' \ - box[2220]='\xcb' box[2221]='\xce' box[2222]='\xce' - -tty-ibmpc:ascii:screen:length=$viewlength width=$viewwidth ${ibmpc-graphics} \ - output-file=${tty-output-file} -list-ibmpc:ascii:listing:length=66 width=79 output-file=${list-output-file} \ - ${ibmpc-graphics} - -# Devices that support Unicode line-drawing characters in UTF-8 encoding. -# PSPP doesn't support a \u escape but if it did then this is how these -# would appear: -# -# define utf8-graphics \ -# box[0000]='\u0020' box[1000]='\u2576' box[2000]='\u2550' \ -# box[0100]='\u2577' box[1100]='\u256D' box[2100]='\u2552' \ -# box[0200]='\u2551' box[1200]='\u2553' box[2200]='\u2554' \ -# box[0010]='\u2574' box[1010]='\u2500' box[2010]='\u2550' \ -# box[0110]='\u256E' box[1110]='\u252C' box[2110]='\u2564' \ -# box[0210]='\u2556' box[1210]='\u2565' box[2210]='\u2566' \ -# box[0020]='\u2550' box[1020]='\u2550' box[2020]='\u2550' \ -# box[0120]='\u2555' box[1120]='\u2564' box[2120]='\u2564' \ -# box[0220]='\u2557' box[1220]='\u2566' box[2220]='\u2566' \ -# box[0001]='\u2575' box[1001]='\u2570' box[2001]='\u2558' \ -# box[0101]='\u2502' box[1101]='\u251C' box[2101]='\u255E' \ -# box[0201]='\u2551' box[1201]='\u255F' box[2201]='\u2560' \ -# box[0011]='\u256F' box[1011]='\u2534' box[2011]='\u2567' \ -# box[0111]='\u2524' box[1111]='\u253C' box[2111]='\u256A' \ -# box[0211]='\u2562' box[1211]='\u256B' box[2211]='\u256C' \ -# box[0021]='\u255B' box[1021]='\u2567' box[2021]='\u2567' \ -# box[0121]='\u2561' box[1121]='\u256A' box[2121]='\u256A' \ -# box[0221]='\u2563' box[1221]='\u256C' box[2221]='\u256C' \ -# box[0002]='\u2551' box[1002]='\u2559' box[2002]='\u255A' \ -# box[0102]='\u2551' box[1102]='\u255F' box[2102]='\u2560' \ -# box[0202]='\u2551' box[1202]='\u255F' box[2202]='\u2560' \ -# box[0012]='\u255C' box[1012]='\u2568' box[2012]='\u2569' \ -# box[0112]='\u2562' box[1112]='\u256A' box[2112]='\u256C' \ -# box[0212]='\u2562' box[1212]='\u256B' box[2212]='\u256C' \ -# box[0022]='\u255D' box[1022]='\u2569' box[2022]='\u2569' \ -# box[0122]='\u2563' box[1122]='\u256C' box[2122]='\u256C' \ -# box[0222]='\u2563' box[1222]='\u256C' box[2222]='\u256C' -# -# Instead, we encode them in UTF-8 by hand below. -# -# Here is a little Perl program that I used to do this translation: -# -# sub utf8_encode { -# my $val = hex($_[0]); -# my $d0 = 0xe0 | ($val >> 12); -# my $d1 = 0x80 | (($val >> 6) & 0x3f); -# my $d2 = 0x80 | ($val & 0x3f); -# return sprintf('\x%02x\x%02x\x%02x', $d0, $d1, $d2); -# } -# while (<>) { -# s/\\u(....)/utf8_encode($1)/ge; -# print $_; -# } -# -define utf8-graphics \ - box[0000]='\xe0\x80\xa0' box[1000]='\xe2\x95\xb6' box[2000]='\xe2\x95\x90' \ - box[0100]='\xe2\x95\xb7' box[1100]='\xe2\x95\xad' box[2100]='\xe2\x95\x92' \ - box[0200]='\xe2\x95\x91' box[1200]='\xe2\x95\x93' box[2200]='\xe2\x95\x94' \ - box[0010]='\xe2\x95\xb4' box[1010]='\xe2\x94\x80' box[2010]='\xe2\x95\x90' \ - box[0110]='\xe2\x95\xae' box[1110]='\xe2\x94\xac' box[2110]='\xe2\x95\xa4' \ - box[0210]='\xe2\x95\x96' box[1210]='\xe2\x95\xa5' box[2210]='\xe2\x95\xa6' \ - box[0020]='\xe2\x95\x90' box[1020]='\xe2\x95\x90' box[2020]='\xe2\x95\x90' \ - box[0120]='\xe2\x95\x95' box[1120]='\xe2\x95\xa4' box[2120]='\xe2\x95\xa4' \ - box[0220]='\xe2\x95\x97' box[1220]='\xe2\x95\xa6' box[2220]='\xe2\x95\xa6' \ - box[0001]='\xe2\x95\xb5' box[1001]='\xe2\x95\xb0' box[2001]='\xe2\x95\x98' \ - box[0101]='\xe2\x94\x82' box[1101]='\xe2\x94\x9c' box[2101]='\xe2\x95\x9e' \ - box[0201]='\xe2\x95\x91' box[1201]='\xe2\x95\x9f' box[2201]='\xe2\x95\xa0' \ - box[0011]='\xe2\x95\xaf' box[1011]='\xe2\x94\xb4' box[2011]='\xe2\x95\xa7' \ - box[0111]='\xe2\x94\xa4' box[1111]='\xe2\x94\xbc' box[2111]='\xe2\x95\xaa' \ - box[0211]='\xe2\x95\xa2' box[1211]='\xe2\x95\xab' box[2211]='\xe2\x95\xac' \ - box[0021]='\xe2\x95\x9b' box[1021]='\xe2\x95\xa7' box[2021]='\xe2\x95\xa7' \ - box[0121]='\xe2\x95\xa1' box[1121]='\xe2\x95\xaa' box[2121]='\xe2\x95\xaa' \ - box[0221]='\xe2\x95\xa3' box[1221]='\xe2\x95\xac' box[2221]='\xe2\x95\xac' \ - box[0002]='\xe2\x95\x91' box[1002]='\xe2\x95\x99' box[2002]='\xe2\x95\x9a' \ - box[0102]='\xe2\x95\x91' box[1102]='\xe2\x95\x9f' box[2102]='\xe2\x95\xa0' \ - box[0202]='\xe2\x95\x91' box[1202]='\xe2\x95\x9f' box[2202]='\xe2\x95\xa0' \ - box[0012]='\xe2\x95\x9c' box[1012]='\xe2\x95\xa8' box[2012]='\xe2\x95\xa9' \ - box[0112]='\xe2\x95\xa2' box[1112]='\xe2\x95\xaa' box[2112]='\xe2\x95\xac' \ - box[0212]='\xe2\x95\xa2' box[1212]='\xe2\x95\xab' box[2212]='\xe2\x95\xac' \ - box[0022]='\xe2\x95\x9d' box[1022]='\xe2\x95\xa9' box[2022]='\xe2\x95\xa9' \ - box[0122]='\xe2\x95\xa3' box[1122]='\xe2\x95\xac' box[2122]='\xe2\x95\xac' \ - box[0222]='\xe2\x95\xa3' box[1222]='\xe2\x95\xac' box[2222]='\xe2\x95\xac' - -tty-utf8:ascii:screen:length=$viewlength width=$viewwidth ${utf8-graphics} \ - output-file=${tty-output-file} emphasis=none -list-utf8:ascii:listing:length=66 width=79 output-file=${list-output-file} \ - ${utf8-graphics} emphasis=none - -# Local Variables: -# fill-prefix: "# " -# End: diff --git a/doc/automake.mk b/doc/automake.mk index 0963e1fd14..b1065a8d25 100644 --- a/doc/automake.mk +++ b/doc/automake.mk @@ -6,7 +6,6 @@ doc_pspp_TEXINFOS = doc/version.texi \ doc/bugs.texi \ doc/command-index.texi \ doc/concept-index.texi \ - doc/configuring.texi \ doc/data-io.texi \ doc/data-selection.texi \ doc/expressions.texi \ diff --git a/doc/configuring.texi b/doc/configuring.texi deleted file mode 100644 index fc3d160b57..0000000000 --- a/doc/configuring.texi +++ /dev/null @@ -1,884 +0,0 @@ -@node Configuration -@appendix Configuring PSPP -@cindex configuration -@cindex PSPP, configuring - -This chapter describe how to configure PSPP for your system. - -@menu -* File locations:: How PSPP finds config files. -* Configuration techniques:: Many different methods of configuration... -* Configuration files:: How configuration files are read. -* Environment variables:: All about environment variables. -* Output devices:: Describing your terminal(s) and printer(s). -* Cairo driver class:: Configuration of Cairo devices. -* ASCII driver class:: Configuration of character-code devices. -* HTML driver class:: Configuration for HTML output. -* Miscellaneous configuring:: Even more configuration variables. -@end menu - -@node File locations -@section Locating configuration files - -PSPP searches each directory in the configuration file path for most -configuration files. The default configuration file path searches first -@file{$HOME/.pspp}, then the package system configuration directory (usually -@file{/usr/local/etc/pspp} or @file{/etc/pspp}). The value of -environment variable @env{PSPP_CONFIG_PATH}, if defined, overrides this -default path. Finally, @samp{-B @var{path}} or -@samp{--config-dir=@var{path}} specified on the command line has highest -priority. - -@node Configuration techniques -@section Configuration techniques - -There are many ways that PSPP can be configured. These are -described in the list below. Values given by earlier items take -precedence over those given by later items. - -@enumerate -@item -Syntax commands that modify settings, such as @cmd{SET}. @xref{SET}. - -@item -Command-line options. @xref{Invocation}. - -@item -PSPP-specific environment variable contents. @xref{Environment -variables}. - -@item -General environment variable contents. @xref{Environment variables}. - -@item -Configuration file contents. @xref{Configuration files}. - -@item -Fallback defaults. -@end enumerate - -Some of the above may not apply to a particular setting. - -@node Configuration files -@section Configuration files - -Most configuration files have a common form: - -@itemize @bullet -@item -Each line forms a separate command or directive. This means that lines -cannot be broken up, unless they are spliced together with a trailing -backslash, as described below. - -@item -Before anything else is done, trailing white space is removed. - -@item -When a line ends in a backslash (@samp{\}), the backslash is removed, -and the next line is read and appended to the current line. - -@itemize @minus -@item -White space preceding the backslash is retained. - -@item -This rule continues to be applied until the line read does not end in a -backslash. - -@item -It is an error if the last line in the file ends in a backslash. -@end itemize - -@item -Comments are introduced by an octothorpe (@samp{#}), and continue until the -end of the line. - -@itemize @minus -@item -An octothorpe inside balanced pairs of double quotation marks (@samp{"}) -or single quotation marks (@samp{'}) does not introduce a comment. - -@item -The backslash character can be used inside balanced quotes of either -type to escape the following character as a literal character. - -(This is distinct from the use of a backslash as a line-splicing -character.) - -@item -Line splicing takes place before comment removal. -@end itemize - -@item -Blank lines, and lines that contain only white space, are ignored. -@end itemize - -@node Environment variables -@section Environment variables - -You may think the concept of environment variables is a fairly simple -one. However, the author of PSPP has found a way to complicate -even something so simple. Environment variables are further described -in the sections below: - -@menu -* Environment substitutions:: How environment substitutions are made. -* Predefined variables:: A few variables are automatically defined. -@end menu - -@node Environment substitutions -@subsection Environment substitutions - -Much of the power of environment variables lies in the way that they may -be substituted into configuration files. Variable substitutions are -described below. - -The line is scanned from left to right. In this scan, all characters -other than dollar signs (@samp{$}) are retained without change. Dollar -signs introduce environment variable references. References -take three forms: - -@table @code -@item $@var{var} -Replaced by the value of environment variable @var{var}. @var{var} must -consist of either one or more letters, or exactly one non-alphabetic -character other than a left brace (@samp{@{}). - -@item $@{@var{var}@} -Same as above, but @var{var} may contain any character (except -@samp{@}}). - -@item $$ -Replaced by a single dollar sign. -@end table - -Undefined variables expand to a empty value. - -@node Predefined variables -@subsection Predefined environment variables - -There are two environment variables predefined for use in environment -substitutions: - -@table @samp -@item VER -Defined as the version number of PSPP, as a string, in a format -something like @samp{0.9.4}. - -@item ARCH -Defined as the host architecture of PSPP, as a string, in standard -cpu-manufacturer-OS format. For instance, Debian GNU/Linux 1.1 on an -Intel machine defines this as @samp{i586-unknown-linux}. This is -somewhat dependent on the system used to compile PSPP. -@end table - -Nothing prevents these values from being overridden, although it's a -good idea not to do so. - -@node Output devices -@section Output devices - -Configuring output devices is the most complicated aspect of configuring -PSPP. The output device configuration file is named -@file{devices}. It is searched for using the usual algorithm for -finding configuration files (@pxref{File locations}). Each line in the -file is read in the usual manner for configuration files -(@pxref{Configuration files}). - -Lines in @file{devices} are divided into three categories, described -briefly in the table below: - -@table @i -@item driver category definitions -Define a driver in terms of other drivers. - -@item macro definitions -Define environment variables local to the output driver -configuration file. - -@item device definitions -Describe the configuration of an output device. -@end table - -The following sections further elaborate the contents of the -@file{devices} file. - -@menu -* Driver categories:: How to organize the driver namespace. -* Macro definitions:: Environment variables local to @file{devices}. -* Device definitions:: Output device descriptions. -* Dimensions:: Lengths, widths, sizes, @enddots{} -* Distinguishing line types:: Details on @file{devices} parsing. -* Tokenizing lines:: Dividing @file{devices} lines into tokens. -@end menu - -@node Driver categories -@subsection Driver categories - -Drivers can be divided into categories. Drivers are specified by their -names, or by the names of the categories that they are contained in. -Only certain drivers are enabled each time PSPP is run; by -default, these are the drivers in the category `default'. To enable a -different set of drivers, use the @samp{-o @var{device}} command-line -option (@pxref{Invocation}). - -Categories are specified with a line of the form -@samp{@var{category}=@var{driver1} @var{driver2} @var{driver3} @var{@dots{}} -@var{driver@var{n}}}. This line specifies that the category -@var{category} is composed of drivers named @var{driver1}, -@var{driver2}, and so on. There may be any number of drivers in the -category, from zero on up. - -Categories may also be specified on the command line -(@pxref{Invocation}). - -This is all you need to know about categories. If you're still curious, -read on. - -First of all, the term `categories' is a bit of a misnomer. In fact, -the internal representation is nothing like the hierarchy that the term -seems to imply: a linear list is used to keep track of the enabled -drivers. - -When PSPP first begins reading @file{devices}, this list contains -the name of any drivers or categories specified on the command line, or -the single item `default' if none were specified. - -Each time a category definition is specified, the list is searched for -an item with the value of @var{category}. If a matching item is found, -it is deleted. If there was a match, the list of drivers (@var{driver1} -through @var{driver@var{n}}) is then appended to the list. - -Each time a driver definition line is encountered, the list is searched. -If the list contains an item with that driver's name, the driver is -enabled and the item is deleted from the list. Otherwise, the driver -is not enabled. - -It is an error if the list is not empty when the end of @file{devices} -is reached. - -@node Macro definitions -@subsection Macro definitions - -Macro definitions take the form @samp{define @var{macroname} -@var{definition}}. In such a macro definition, the environment variable -@var{macroname} is defined to expand to the value @var{definition}. -Before the definition is made, however, any macros used in -@var{definition} are expanded. - -Please note the following nuances of macro usage: - -@itemize @bullet -@item -For the purposes of this section, @dfn{macro} and @dfn{environment -variable} are synonyms. - -@item -Macros may not take arguments. - -@item -Macros may not recurse. - -@item -Macros are just environment variable definitions like other environment -variable definitions, with the exception that they are limited in scope -to the @file{devices} configuration file. - -@item -Macros override other all environment variables of the same name (within -the scope of @file{devices}). - -@item -Earlier macro definitions for a particular @var{key} override later -ones. In particular, macro definitions on the command line override -those in the device definition file. @xref{Non-option Arguments}. - -@item -There are two predefined macros, whose values are determined at runtime: - -@table @samp -@item viewwidth -Defined as the width of the console screen, in columns of text. - -@item viewlength -Defined as the length of the console screen, in lines of text. -@end table -@end itemize - -@node Device definitions -@subsection Driver definitions - -Driver definitions are the ultimate purpose of the @file{devices} -configuration file. These are where the real action is. Driver -definitions tell PSPP where it should send its output. - -Each driver definition line is divided into four fields. These fields -are delimited by colons (@samp{:}). Each line is subjected to -environment variable interpolation before it is processed further -(@pxref{Environment substitutions}). From left to right, the four -fields are, in brief: - -@table @i -@item driver name -A unique identifier, used to determine whether to enable the driver. - -@item class name -One of the predefined driver classes supported by PSPP. The -currently supported driver classes include `cairo' and `ascii'. - -@item device type(s) -Zero or more of the following keywords, delimited by spaces: - -@table @code -@item screen - -Indicates that the device is a screen display. This may reduce the -amount of buffering done by the driver, to make interactive use more -convenient. - -@item printer - -Indicates that the device is a printer. - -@item listing - -Indicates that the device is a listing file. -@end table - -These options are just hints to PSPP and do not cause the output to be -directed to the screen, or to the printer, or to a listing file---those -must be set elsewhere in the options. They are used primarily to decide -which devices should be enabled at any given time. @xref{SET}, for more -information. - -@item options -An optional set of options to pass to the driver itself. The exact -format for the options varies among drivers. -@end table - -The driver is enabled if: - -@enumerate -@item -Its driver name is specified on the command line, or - -@item -It's in a category specified on the command line, or - -@item -If no categories or driver names are specified on the command line, it -is in category @code{default}. -@end enumerate - -For more information on driver names, see @ref{Driver categories}. - -The class name must be one of those supported by PSPP. The -classes supported depend on the options with which PSPP was -compiled. See later sections in this chapter for descriptions of the -available driver classes. - -Options are dependent on the driver. See the driver descriptions for -details. - -@node Dimensions -@subsection Dimensions - -Quite often in configuration it is necessary to specify a length or a -size. PSPP uses a common syntax for all such, calling them -collectively by the name @dfn{dimensions}. - -@itemize @bullet -@item -You can specify dimensions in decimal form (@samp{12.5}) or as -fractions, either as mixed numbers (@samp{12-1/2}) or raw fractions -(@samp{25/2}). - -@item -A number of different units are available. These are suffixed to the -numeric part of the dimension. There must be no spaces between the -number and the unit. The available units are identical to those offered -by the popular typesetting system @TeX{}: - -@table @code -@item in -inch (1 @code{in} = 2.54 @code{cm}) - -@item " -inch (1 @code{in} = 2.54 @code{cm}) - -@item pt -printer's point (1 @code{in} = 72.27 @code{pt}) - -@item pc -pica (12 @code{pt} = 1 @code{pc}) - -@item bp -PostScript point (1 @code{in} = 72 @code{bp}) - -@item cm -centimeter - -@item mm -millimeter (10 @code{mm} = 1 @code{cm}) - -@item dd -didot point (1157 @code{dd} = 1238 @code{pt}) - -@item cc -cicero (1 @code{cc} = 12 @code{dd}) - -@item sp -scaled point (65536 @code{sp} = 1 @code{pt}) -@end table - -@item -If no explicit unit is given, PSPP attempts to guess the best unit: - -@itemize @minus -@item -Numbers less than 50 are assumed to be in inches. - -@item -Numbers 50 or greater are assumed to be in millimeters. -@end itemize -@end itemize - -@node Distinguishing line types -@subsection How lines are divided into types - -The lines in @file{devices} are distinguished in the following manner: - -@enumerate -@item -Leading white space is removed. - -@item -If the resulting line begins with the exact string @code{define}, -followed by one or more white space characters, the line is processed as -a macro definition. - -@item -Otherwise, the line is scanned for the first instance of a colon -(@samp{:}) or an equals sign (@samp{=}). - -@item -If a colon is encountered first, the line is processed as a driver -definition. - -@item -Otherwise, if an equals sign is encountered, the line is processed as a -macro definition. - -@item -Otherwise, the line is ill-formed. -@end enumerate - -@node Tokenizing lines -@subsection How lines are divided into tokens - -Each driver definition line is run through a simple tokenizer. This -tokenizer recognizes two basic types of tokens. - -The first type is an equals sign (@samp{=}). Equals signs are both -delimiters between tokens and tokens in themselves. - -The second type is an identifier or string token. Identifiers and -strings are equivalent after tokenization, though they are written -differently. An identifier is any string of characters other than -white space or equals sign. - -A string is introduced by a single- or double-quote character (@samp{'} -or @samp{"}) and, in general, continues until the next occurrence of -that same character. The following standard C escapes can also be -embedded within strings: - -@table @code -@item \' -A single-quote (@samp{'}). - -@item \" -A double-quote (@samp{"}). - -@item \? -A question mark (@samp{?}). Included for hysterical raisins. - -@item \\ -A backslash (@samp{\}). - -@item \a -Audio bell (ASCII 7). - -@item \b -Backspace (ASCII 8). - -@item \f -Formfeed (ASCII 12). - -@item \n -New-line (ASCII 10) - -@item \r -Carriage return (ASCII 13). - -@item \t -Tab (ASCII 9). - -@item \v -Vertical tab (ASCII 11). - -@item \@var{o}@var{o}@var{o} -Each @samp{o} must be an octal digit. The character is the one having -the octal value specified. Any number of octal digits is read and -interpreted; only the lower 8 bits are used. - -@item \x@var{h}@var{h} -Each @samp{h} must be a hex digit. The character is the one having the -hexadecimal value specified. Any number of hex digits is read and -interpreted; only the lower 8 bits are used. -@end table - -Tokens, outside of quoted strings, are delimited by white space or equals -signs. - -@node Cairo driver class -@section The Cairo driver class - -The @code{cairo} driver class can produce output in PDF, PostScript, -and SVG formats. It has full support for international character -sets. - -The Cairo driver is only available if your copy of PSPP was built with -the Cairo library. - -The available options are listed below. - -@table @code -@item output-file=@var{file-name} - -File to which output should be sent. Default: @code{"pspp.pdf"}. - -@item output-type=@var{output-type} - -Type of output to write to the output file, one of @code{pdf}, -@code{ps}, or @code{svg}. Default: @code{pdf}. - -@item paper-size=@var{paper-size} - -Paper size. You may specify a name (e.g.@: @code{a4}, @code{letter}) -or measurements (e.g.@: @code{210x297}, @code{8.5x11in}). - -The default paper size is taken from the @env{PAPERSIZE} environment -variable or the file indicated by the @env{PAPERCONF} environment -variable, if either variable is set. If not, and your system supports -the @code{LC_PAPER} locale category, then the default paper size is -taken from the locale. Otherwise, if @file{/etc/papersize} exists, -the default paper size is read from it. As a last resort, A4 paper is -assumed. - -@item orientation=@var{orientation} - -Either @code{portrait} or @code{landscape}. Default: @code{portrait}. - -@item headers=@var{boolean} - -Controls whether the standard headers showing the time and date and -title and subtitle are printed at the top of each page. Default: -@code{on}. - -@item left-margin=@var{dimension} -@itemx right-margin=@var{dimension} -@itemx top-margin=@var{dimension} -@itemx bottom-margin=@var{dimension} - -Sets the margins around the page. The headers, if enabled, are not -included in the margins; they are in addition to the margins. For a -description of dimensions, see @ref{Dimensions}. Default: @code{0.5in}. - -@item prop-font=@var{font-name} -@itemx emph-font=@var{font-name} -@itemx fixed-font=@var{font-name} - -Sets the font used for proportional, emphasized, or fixed-pitch text. -Most systems support CSS-like font names such as ``serif'' and -``monospace'', but a wide range of system-specific font are likely to -be supported as well. - -Default: proportional font @code{serif}, emphasis font @code{serif -italic}, fixed-pitch font @code{monospace}. - -@item font-size=@var{font-size} - -Sets the size of the default fonts, in thousandths of a point. Default: -10000 (10 point). - -@item line-gutter=@var{dimension} - -Sets the width of white space on either side of lines that border text -or graphics objects. @xref{Dimensions}. Default: @code{1pt}. - -@item line-spacing=@var{dimension} - -Sets the spacing between the lines in a double line in a table. -Default: @code{1pt}. - -@item line-width=@var{dimension} - -Sets the width of the lines used in tables. Default: @code{0.5pt}. -@end table - -@node ASCII driver class -@section The ASCII driver class - -The ASCII driver class produces output that can be displayed on a -terminal or output to printers. The ASCII driver has class name -@samp{ascii}. - -The available options are listed below. - -@table @code -@item output-file=@var{file-name} - -File to which output should be sent. This can be an ordinary file name -(e.g., @code{"pspp.txt"}), a pipe (e.g., @code{"|more"}), or -stdout (@code{"-"}). Default: @code{"pspp.list"}. - -@item chart-files=@var{file-name-template} -Template for the file names used for charts. The name should contain -a single @samp{#}, which is replaced by the chart number. Default: -@file{"pspp-#.png"}. - -@item chart-type=@var{type}. -Type of charts to output, either @samp{png} or @samp{none}. -Default: @samp{png}. - -Charts are always disabled if your installation of PSPP was compiled -without the @code{cairo} library. - -@item paginate=@var{boolean} - -If set, a formfeed will be written at the end of every page. Default: -@code{on}. - -@item headers=@var{boolean} - -If enabled, two lines of header information giving title and subtitle, -page number, date and time, and PSPP version are printed at the top of -every page. These two lines are in addition to any top margin -requested. Default: @code{on}. - -@item length=@var{line-count} - -Physical length of a page. Headers and margins are subtracted from -this value. You may specify the number of lines as a number, or for -screen output you may specify @code{auto} to track the height of the -terminal as it changes. Default: @code{66}. - -@item width=@var{character-count} - -Physical width of a page. Margins are subtracted from this value. -You may specify the width as a number of characters, or for screen -output you may specify @code{auto} to track the width of the terminal -as it changes. Default: @code{79}. - -@item top-margin=@var{top-margin-lines} - -Length of the top margin, in lines. PSPP subtracts this value from -the page length. Default: @code{2}. - -@item bottom-margin=@var{bottom-margin-lines} - -Length of the bottom margin, in lines. PSPP subtracts this value from -the page length. Default: @code{2}. - -@item box[@var{line-type}]=@var{box-chars} - -The characters used for lines in tables produced by the ASCII driver can -be changed using this option. @var{line-type} is used to indicate which -type of line to change; @var{box-chars} is the character or string of -characters to use for this type of line. - -@var{line-type} must be a 4-digit number. The digits are in the order -`right', `bottom', `left', `top'. The possibilities for each digit are: - -@table @asis -@item 0 -No line. - -@item 1 -Single line. - -@item 2 -Double line. -@end table - -Examples: - -@table @code -@item box[0101]="|" - -Sets @samp{|} as the character to use for a single-width line with -bottom and top components. - -@item box[2222]="#" - -Sets @samp{#} as the character to use for the intersection of four -double-width lines, one each from the top, bottom, left and right. - -@item box[1100]="\xda" - -Sets @samp{"\xda"}, which under MS-DOS is a box character suitable for -the top-left corner of a box, as the character for the intersection of -two single-width lines, one each from the right and bottom. - -@end table - -Defaults: - -@itemize @bullet -@item -@code{box[0000]=" "} - -@item -@code{box[1000]="-"} -@*@code{box[0010]="-"} -@*@code{box[1010]="-"} - -@item -@code{box[0100]="|"} -@*@code{box[0001]="|"} -@*@code{box[0101]="|"} - -@item -@code{box[2000]="="} -@*@code{box[0020]="="} -@*@code{box[2020]="="} - -@item -@code{box[3000]="="} -@*@code{box[0030]="="} -@*@code{box[3030]="="} - -@item -For all others, @samp{+} is used unless there are double lines or -special lines, in which case @samp{#} is used. -@end itemize - -@item init=@var{init-string} -If set, this string is written at the beginning of each output file. -It can be used to initialize device features, e.g.@: to enable VT100 -line-drawing characters. - -@item emphasis=@var{emphasis-style} - -How to emphasize text. Your choices are @code{bold}, @code{underline}, -or @code{none}. Bold and underline emphasis are achieved with -overstriking, which may not be supported by all the software to which -you might pass the output. -@end table - -@node HTML driver class -@section The HTML driver class - -The @code{html} driver class is used to produce output for viewing in -tables-capable web browsers such as Emacs' w3-mode. Its configuration -is very simple. Currently, the output has a very plain format. In the -future, further work may be done on improving the output appearance. - -There are only a few options: - -@table @code -@item output-file=@var{file-name} - -File to which output should be sent. This can be an ordinary file name -(i.e., @code{"pspp.ps"}), a pipe (i.e., @code{"|lpr"}), or -stdout (@code{"-"}). Default: @file{"pspp.html"}. - -@item chart-files=@var{file-name-template} -Template for the file names used for charts, which are output in PNG -format. The name should contain a single @samp{#}, which is replaced by -the chart number. Default: @file{"pspp-#.png"}. -@end table - -@node Miscellaneous configuring -@section Miscellaneous configuration - -The following environment variables can be used to further configure -PSPP: - -@table @code -@item HOME - -Used to determine the user's home directory. No default value. - -@item STAT_INCLUDE_PATH - -Path used to find include files in PSPP syntax files. Defaults vary -across operating systems: - -@table @asis -@item UNIX - -@itemize @bullet -@item -@file{.} - -@item -@file{$HOME/.pspp/include} - -@item -@file{/usr/local/lib/pspp/include} - -@item -@file{/usr/lib/pspp/include} - -@item -@file{/usr/local/share/pspp/include} - -@item -@file{/usr/share/pspp/include} -@end itemize - -@item MS-DOS - -@itemize @bullet -@item -@file{.} - -@item -@file{C:\PSPP\INCLUDE} - -@item -@file{$PATH} -@end itemize - -@item Other OSes -No default path. -@end table - -@item TERM - -The terminal type @code{termcap} or @code{ncurses} will use, if such -support was compiled into PSPP. - -@item STAT_OUTPUT_INIT_FILE - -The basename used to search for the driver definition file. -@xref{Output devices}. @xref{File locations}. Default: @code{devices}. - -@item STAT_OUTPUT_INIT_PATH - -The path used to search for the driver definition file. -@xref{File locations}. Default: the standard configuration path. - -@item TMPDIR - -The directory in which PSPP stores its temporary files (used when sorting -cases or concatenating large numbers of cases). -Default: (UNIX) @file{/tmp}, (MS-DOS) @file{\}, (other OSes) empty string. - -@item TEMP -@item TMP - -Under MS-DOS only, these variables are consulted after TMPDIR, in this -order. -@end table diff --git a/doc/invoking.texi b/doc/invoking.texi index 2b8a521d60..86ddc31f12 100644 --- a/doc/invoking.texi +++ b/doc/invoking.texi @@ -1,227 +1,419 @@ -@node Invocation - -@chapter Starting PSPP +@node Invoking PSPP +@chapter Invoking @command{pspp} @cindex invocation @cindex PSPP, invoking -There are two separate user interfaces for PSPP. -There is the command line interface, which responds to commands -typed by the user. -The command line interface is generally available on more platforms -than the graphic user interface and since it doesn't require a -graphics device it can be used from a remote terminal. -Platforms which have a windowing system may also be able to support -the graphic user interface. -The graphic user interface can perform all functionality of the -command line interface. -In addition it gives an instantaneous view of the data, variables and -statistical output. - -Whichever interface you choose, a basic understanding of the concepts -used by PSPP is necessary before effective use of the system can be achieved. +PSPP has two separate user interfaces. This chapter describes +@command{pspp}, PSPP's command-line driven text-based user interface. +The following chapter briefly describes PSPPIRE, the graphical user +interface to PSPP. +The sections below describe the @command{pspp} program's command-line +interface. @menu -* The command line user interface:: -* The graphic user interface:: +* Main Options:: +* PDF PostScript and SVG Output Options:: +* Plain Text Output Options:: +* HTML Output Options:: +* OpenDocument Output Options:: +* Comma-Separated Value Output Options:: @end menu +@node Main Options +@section Main Options -@node The command line user interface -@section The command line user interface +Here is a summary of all the options, grouped by type, followed by +explanations in the same order. -@cindex command line, options -@cindex options, command-line +In the table, arguments to long options also apply to any +corresponding short options. +@table @emph +@item Non-option arguments @example -pspp [ -B @var{dir} | --config-dir=@var{dir} ] [ -o @var{device} | --device=@var{device} ] - [ -a @{compatible|enhanced@} | --algorithm=@{compatible|enhanced@}] - [ -x @{compatible|enhanced@} | --syntax=@{compatible|enhanced@}] - [ -I- | --no-include ] - [ -I @var{dir} | --include=@var{dir} ] [ -i | --interactive ] - [ -r | --no-statrc ] [ -h | --help ] [ -l | --list ] - [ -s | --safer ] - [ --testing-mode ] [ -V | --version ] - [ @var{key}=@var{value} ] @var{file}@enddots{} +@var{syntax-file} @end example -@menu -* Non-option Arguments:: Specifying syntax files and output devices. -* Configuration Options:: Change the configuration for the current run. -* Input and output options:: Controlling input and output files. -* Language control options:: Language variants. -* Informational options:: Helpful information about PSPP. -@end menu - -@node Non-option Arguments -@subsection Non-option Arguments - -Syntax files and output device substitutions can be specified on -PSPP's command line: - -@table @code -@item @var{file} - -A file by itself on the command line will be executed as a syntax file. -If multiple files are specified, they are executed in order, as if -their contents had been given in a single file. -PSPP terminates after the syntax files run, unless the @code{-i} or -@code{--interactive} option is given (@pxref{Language control options}). - -@item @var{key}=@var{value} - -Defines an output device macro @var{key} to expand to @var{value}, -overriding any macro having the same @var{key} defined in the device -configuration file. @xref{Macro definitions}. - -@end table - -There is one other way to specify a syntax file, if your operating -system supports it. If you have a syntax file @file{foobar.stat}, put -the notation - +@item Output options @example -#! /usr/local/bin/pspp +-o, --output=@var{output-file} +-O @var{option}=@var{value} +-O format=@var{format} +-O device=@{terminal|listing@} +-e, --error-file=@var{error-file} @end example -at the top, and mark the file as executable with @code{chmod +x -foobar.stat}. (If PSPP is not installed in @file{/usr/local/bin}, -then insert its actual installation directory into the syntax file -instead.) Now you should be able to invoke the syntax file just by -typing its name. You can include any options on the command line as -usual. PSPP entirely ignores any lines beginning with @samp{#!}. - -@node Configuration Options -@subsection Configuration Options - -Configuration options are used to change PSPP's configuration for the -current run. The configuration options are: - -@table @code -@item -a @{compatible|enhanced@} -@itemx --algorithm=@{compatible|enhanced@} - -If you chose @code{compatible}, then PSPP will use the same algorithms -as used by some proprietary statistical analysis packages. -This is not recommended, as these algorithms are inferior and in some cases -compeletely broken. -The default setting is @code{enhanced}. -Certain commands have subcommands which allow you to override this setting on -a per command basis. - -@item -B @var{dir} -@itemx --config-dir=@var{dir} - -Sets the configuration directory to @var{dir}. @xref{File locations}. +@item Language options +@example +-I, --include=@var{dir} +-I-, --no-include +-i, --interactive +-r, --no-statrc +-a, --algorithm=@{compatible|enhanced@} +-x, --syntax=@{compatible|enhanced@} +@end example -@item -o @var{device} -@itemx --device=@var{device} +@item Informational options +@example +-h, --help +-V, --version +@end example -Selects the output device with name @var{device}. If this option is -given more than once, then all devices mentioned are selected. This -option disables all devices besides those mentioned on the command line. +@item Other options +@example +-s, --safer +--testing-mode +@end example @end table -@node Input and output options -@subsection Input and output options +@table @code +@item @var{syntax-file} +Read and execute the named syntax file. If no syntax files are +specified, PSPP prompts for commands. If any syntax files are +specified, PSPP by default exits after it runs them, but you may make +it prompt for commands by specifying @samp{-} as an additional syntax +file. + +@item -o @var{output-file} +Write output to @var{output-file}. PSPP has several different output +drivers that support output in various formats (use @option{--help} to +list the available formats). Specify this option more than once to +produce multiple output files, presumably in different formats. + +Use @samp{-} as @var{output-file} to write output to standard output. + +If no @option{-o} option is used, then PSPP writes output to standard +output in plain text format. + +@item -O @var{option}=@var{value} +Sets an option for the output file configured by a preceding +@option{-o}. Most options are specific to particular output formats. +A few options that apply generically are listed below. + +@item -O format=@var{format} +PSPP uses the extension of the file name given on @option{-o} to +select an output format. Use this option to override this choice by +specifying an alternate format, e.g.@: @option{-o pspp.out -O html} to +write HTML to a file named @file{pspp.out}. Use @option{--help} to +list the available formats. + +@item -O device=@{terminal|listing@} +Sets whether PSPP considers the output device configured by the +preceding @option{-o} to be a terminal or a listing device. This +affects what output will be sent to the device, as configured by the +SET command's output routing subcommands (@pxref{SET}). By default, +output written to standard output is considered a terminal device and +other output is considered a listing device. + +@item -e @var{error-file} +@itemx --error-file=@var{error-file} +Configures a file to receive PSPP error, warning, and note messages in +plain text format. Use @samp{-} as @var{error-file} to write messages +to standard output. The default error file is standard output in the +absence of these options, but this is suppressed if an output device +writes to standard output (or another terminal), to avoid printing +every message twice. Use @samp{none} as @var{error-file} to +explicitly suppress the default. -Input and output options affect how PSPP reads input and writes -output. These are the input and output options: +@item -I @var{dir} +@itemx --include=@var{dir} +Appends @var{dir} to the set of directories searched by INCLUDE +(@pxref{INCLUDE}) and INSERT (@pxref{INSERT}). -@table @code @item -I- @itemx --no-include +Clears all directories from the include path, including directories +inserted in the include path by default. The default include path is +@file{.} (the current directory), followed by @file{.pspp} in the +user's home directory, followed by PSPP's system configuration +directory (usually @file{/etc/pspp} or @file{/usr/local/etc/pspp}). -Clears all directories from the include path. This includes all -directories put in the include path by default. @xref{Miscellaneous -configuring}. +@item -i +@itemx --interactive +This option forces syntax files to be interpreted in interactive +mode, rather than the default batch mode. @xref{Syntax Variants}, for +a description of the differences. -@item -I @var{dir} -@itemx --include=@var{dir} +@item -r +@itemx --no-statrc +Disables running @file{rc} at PSPP startup time. + +@item -a @{enhanced|compatible@} +@itemx --algorithm=@{enhanced|compatible@} +With @code{enhanced}, the default, PSPP uses the best implemented +algorithms for statistical procedures. With @code{compatible}, +however, PSPP will in some cases use inferior algorithms to produce +the same results as the proprietary program SPSS. + +Some commands have subcommands that override this setting on a per +command basis. + +@item -x @{enhanced|compatible@} +@itemx --syntax=@{enhanced|compatible@} +With @code{enhanced}, the default, PSPP accepts its own extensions +beyond those compatible with the proprietary program SPSS. With +@code{compatible}, PSPP rejects syntax that uses these extensions. + +@item -? +@itemx --help +Prints a message describing PSPP command-line syntax and the available +device formats, then exits. -Appends directory @var{dir} to the path that is searched for include -files in PSPP syntax files. +@item -V +@itemx --version +Prints a brief message listing PSPP's version, warranties you don't +have, copying conditions and copyright, and e-mail address for bug +reports, then exits. -@item --testing-mode +@item -s +@itemx --safer +Disables certain unsafe operations. This includes the ERASE and +HOST commands, as well as use of pipes as input and output files. +@item --testing-mode Invoke heuristics to assist with testing PSPP. For use by @code{make check} and similar scripts. @end table -@node Language control options -@subsection Language control options +@node PDF PostScript and SVG Output Options +@section PDF, PostScript, and SVG Output Options -Language control options control how PSPP syntax files are parsed and -interpreted. The available language control options are: +To produce output in PDF, PostScript, and SVG formats, specify +@option{-o @var{file}} on the PSPP command line, optionally followed +by any of the options shown in the table below to customize the output +format. + +PDF, PostScript, and SVG output is only available if your installation +of PSPP was compiled with the Cairo library. @table @code -@item -i -@itemx --interactive +@item -O format=@{pdf|ps|svg@} +Specify the output format. This is only necessary if the file name +given on @option{-o} does not end in @file{.pdf}, @file{.ps}, or +@file{.svg}. + +@item -O paper-size=@var{paper-size} +Paper size, as a name (e.g.@: @code{a4}, @code{letter}) or +measurements (e.g.@: @code{210x297}, @code{8.5x11in}). + +The default paper size is taken from the @env{PAPERSIZE} environment +variable or the file indicated by the @env{PAPERCONF} environment +variable, if either variable is set. If not, and your system supports +the @code{LC_PAPER} locale category, then the default paper size is +taken from the locale. Otherwise, if @file{/etc/papersize} exists, +the default paper size is read from it. As a last resort, A4 paper is +assumed. + +@item -O orientation=@var{orientation} +Either @code{portrait} or @code{landscape}. Default: @code{portrait}. + +@item -O headers=@var{boolean} +When enabled, headers showing the time and date, title and subtitle, +and page number are printed at the top of each page. Default: +@code{on}. + +@item -O left-margin=@var{dimension} +@itemx -O right-margin=@var{dimension} +@itemx -O top-margin=@var{dimension} +@itemx -O bottom-margin=@var{dimension} +Sets the margins around the page. The headers, if enabled, are not +included in the margins; they are in addition to the margins. See +below for the allowed forms of @var{dimension} Default: @code{0.5in}. + +@item -O prop-font=@var{font-name} +@itemx -O emph-font=@var{font-name} +@itemx -O fixed-font=@var{font-name} +Sets the font used for proportional, emphasized, or fixed-pitch text. +Most systems support CSS-like font names such as ``serif'' and +``monospace'', but a wide range of system-specific font are likely to +be supported as well. + +Default: proportional font @code{serif}, emphasis font @code{serif +italic}, fixed-pitch font @code{monospace}. + +@item -O font-size=@var{font-size} +Sets the size of the default fonts, in thousandths of a point. Default: +10000 (10 point). + +@item -O line-gutter=@var{dimension} +Sets the width of white space on either side of lines that border text +or graphics objects. Default: @code{1pt}. + +@item -O line-spacing=@var{dimension} +Sets the spacing between the lines in a double line in a table. +Default: @code{1pt}. + +@item -O line-width=@var{dimension} +Sets the width of the lines used in tables. Default: @code{0.5pt}. +@end table -When a syntax file is specified on the command line, PSPP normally -terminates after processing it. Giving this option will cause PSPP to -bring up a command prompt after processing the syntax file. +Each @var{dimension} value above may be specified in various units +based on its suffix: @samp{mm} for millimeters, @samp{in} for inches, +or @samp{pt} for points. Lacking a suffix, numbers below 50 are +assumed to be in inches and those about 50 are assumed to be in +millimeters. -In addition, this forces syntax files to be interpreted in interactive -mode, rather than the default batch mode. @xref{Tokenizing lines}, for -information on the differences between batch mode and interactive mode -command interpretation. +@node Plain Text Output Options +@section Plain Text Output Options -@item -r -@itemx --no-statrc +PSPP can produce plain text output, drawing boxes using ASCII or +Unicode line drawing characters. To produce plain text output, +specify @option{-o @var{file}} on the PSPP command line, optionally +followed by options from the table below to customize the output +format. -Prevents the execution of the PSPP startup syntax file. +@table @code +@item -O format=txt +Specify the output format. This is only necessary if the file name +given on @option{-o} does not end in @file{.txt} or @file{.list}. + +@item -O charts=@{@var{template}.png|none@} +Name for chart files included in output. The value should be a file +name that includes a single @samp{#} and ends in @file{png}. When a +chart is output, the @samp{#} is replaced by the chart number. The +default is the file name specified on @option{-o} with the extension +stripped off and replaced by @file{-#.png}. + +Specify @code{none} to disable chart output. Charts are always +disabled if your installation of PSPP was compiled without the +Cairo library. + +@item -O paginate=@var{boolean} +If set, PSPP writes an ASCII formfeed the end of every page. Default: +@code{off}. + +@item -O headers=@var{boolean} +If enabled, PSPP prints two lines of header information giving title +and subtitle, page number, date and time, and PSPP version are printed +at the top of every page. These two lines are in addition to any top +margin requested. Default: @code{off}. + +@item -O length=@var{line-count} +Physical length of a page. Headers and margins are subtracted from +this value. You may specify the number of lines as a number, or for +screen output you may specify @code{auto} to track the height of the +terminal as it changes. Default: @code{66}. + +@item -O width=@var{character-count} +Width of a page, in characters. Margins are subtracted from this +value. For screen output you may specify @code{auto} in place of a +number to track the width of the terminal as it changes. Default: +@code{79}. + +@item -O top-margin=@var{top-margin-lines} +Length of the top margin, in lines. PSPP subtracts this value from +the page length. Default: @code{0}. + +@item -O bottom-margin=@var{bottom-margin-lines} +Length of the bottom margin, in lines. PSPP subtracts this value from +the page length. Default: @code{0}. + +@item -O box[@var{line-type}]=@var{box-chars} +Sets the characters used for lines in tables. @var{line-type} is a +4-digit number that indicates the type of line to change, in the order +`right', `bottom', `left', `top'. Each digit is 0 for ``no line'', 1 +for a single line, and 2 for a double line. @var{box-chars} is the +character or string of characters to use for this type of line. + +For example, @code{box[0101]="|"} sets @samp{|} as the character to +use for a single-width vertical line, and @code{box[1100]="\xda"} sets +@samp{"\xda"}, which on MS-DOS is suitable for the top-left corner of +a box, as the character for the intersection of two single-width +lines, one each from the right and bottom. + +The defaults use @samp{-}, @samp{|}, and @samp{+} for single-width +lines and @samp{=} and @samp{#} for double-width lines. + +@item -O init=@var{init-string} +If set, this string is written at the beginning of each output file. +It can be used to initialize device features, e.g.@: to enable VT100 +line-drawing characters. + +@item -O emphasis=@{none|bold|underline@} +How to emphasize text. Bold and underline emphasis are achieved with +overstriking, which may not be supported by all the software to which +you might pass the output. Default: @code{none}. +@end table -@item -s -@itemx --safer +@node HTML Output Options +@section HTML Output Options -Disables certain unsafe operations. This includes the ERASE and -HOST commands, as well as use of pipes as input and output files. +To produce output in HTML format, specify @option{-o @var{file}} on +the PSPP command line, optionally followed by any of the options shown +in the table below to customize the output format. + +@table @code +@item -O format=html +Specify the output format. This is only necessary if the file name +given on @option{-o} does not end in @file{.html}. + +@item -O charts=@{@var{template}.png|none@} +Sets the name used for chart files. @xref{Plain Text Output Options}, +for details. @end table -@node Informational options -@subsection Informational options +@node OpenDocument Output Options +@section OpenDocument Output Options -Informational options cause information about PSPP to be written to -the terminal. Here are the available options: +To produce output as an OpenDocument text (ODT) document, specify +@option{-o @var{file}} on the PSPP command line. If @var{file} does +not end in @file{.odt}, you must also specify @option{-O format=odt}. -@table @code -@item -h -@item --help +The OpenDocument output format does not have any configurable options. -Prints a message describing PSPP command-line syntax and the available -device driver classes, then terminates. +@node Comma-Separated Value Output Options +@section Comma-Separated Value Output Options -@item -l -@item --list +To produce output in comma-separated value (CSV) format, specify +@option{-o @var{file}} on the PSPP command line, optionally followed +by any of the options shown in the table below to customize the output +format. -Lists the available device driver classes, then terminates. +@table @code +@item -O format=csv +Specify the output format. This is only necessary if the file name +given on @option{-o} does not end in @file{.csv}. -@item -x @{compatible|enhanced@} -@itemx --syntax=@{compatible|enhanced@} +@item -O separator=@var{field-separator} +Sets the character used to separate fields. The default is a comma +(@samp{,}). +@end table -If you chose @code{compatible}, then PSPP will only accept command syntax that -is compatible with the proprietary program SPSS. -If you choose @code{enhanced} then additional syntax will be available. -The default is @code{enhanced}. +The CSV format used is an extension to that specified in RFC 4180: +@table @asis +@item Tables +Each table row is output on a separate line, and each column is output +as a field. The contents of a cell that spans multiple rows or +columns is output only for the top-left row and column; the rest are +output as empty fields. When a table has a caption, it is output just +above the table as a single field prefixed by @samp{Table:}. -@item -V -@item --version +@item Text +Text in output is printed as a field on a line by itself. The TITLE +and SUBTITLE produce similar output, prefixed by @samp{Title:} or +@samp{Subtitle:}, respectively. -Prints a brief message listing PSPP's version, warranties you don't -have, copying conditions and copyright, and e-mail address for bug -reports, then terminates. +@item Messages +Errors, warnings, and notes are printed the same way as text. +@item Charts +Charts are not included in CSV output. @end table +Successive output items are separated by a blank line. -@node The graphic user interface +@node Invoking PSPPIRE +@chapter Invoking @command{psppire} @section The graphic user interface - @cindex Graphic user interface @cindex PSPPIRE +The PSPPIRE graphic user interface for PSPP can perform all +functionality of the command line interface. In addition it gives an +instantaneous view of the data, variables and statistical output. + The graphic user interface can be started by typing @command{psppire} at a command prompt. Alternatively many systems have a system of interactive menus or buttons diff --git a/doc/language.texi b/doc/language.texi index a57d4ddadc..19c9a6b9dc 100644 --- a/doc/language.texi +++ b/doc/language.texi @@ -208,9 +208,9 @@ new command, which allows for visual indentation of a command without that command being considered part of the previous command. The period terminating the end of a command is optional but recommended. -In interactive mode, each command must either be terminated with a period, -or an empty line must follow the command. -The use of (@samp{+} and @samp{@minus{}} as continuation characters is not +In interactive mode, each command must be terminated with a period +or by a blank line. +The use of @samp{+} and @samp{@minus{}} as continuation characters is not permitted. @node Types of Commands diff --git a/doc/pspp.texinfo b/doc/pspp.texinfo index 830e82e461..ae3db342b9 100644 --- a/doc/pspp.texinfo +++ b/doc/pspp.texinfo @@ -33,6 +33,7 @@ @dircategory Math @direntry * PSPP: (pspp). Statistical analysis package. +* PSPPIRE: (pspp). Graphical user interface to PSPP. @end direntry @copying @@ -86,7 +87,8 @@ in the production of this manual. * Introduction:: Description of the package. * License:: Your rights and obligations. -* Invocation:: Starting and running PSPP. +* Invoking PSPP:: Starting the PSPP text-based interface. +* Invoking PSPPIRE:: Starting the PSPP graphical user interface. * Using PSPP:: How to use PSPP --- A brief tutorial. * Language:: Basics of the PSPP command language. * Expressions:: Numeric and string expression syntax. @@ -108,8 +110,6 @@ in the production of this manual. * Command Index:: Index of PSPP procedures. * Concept Index:: Index of concepts. -* Configuration:: Configuring PSPP. - * GNU Free Documentation License:: License for copying this manual. @end menu @@ -136,8 +136,6 @@ in the production of this manual. @include command-index.texi @include concept-index.texi -@include configuring.texi - @include fdl.texi @bye diff --git a/doc/utilities.texi b/doc/utilities.texi index 6882aa2165..fabec248b6 100644 --- a/doc/utilities.texi +++ b/doc/utilities.texi @@ -330,7 +330,6 @@ SET (interaction) /CPROMPT='cprompt_string' /DPROMPT='dprompt_string' - /ERRORBREAK=@{OFF,ON@} /MXERRS=max_errs /MXWARNS=max_warnings /PROMPT='prompt' @@ -353,17 +352,14 @@ SET /WRB=@{NATIVE,ISL,ISB,IDL,IDB,VF,VD,VG,ZS,ZL@} (output routing) - /ECHO=@{ON,OFF@} /ERRORS=@{ON,OFF,TERMINAL,LISTING,BOTH,NONE@} - /INCLUDE=@{ON,OFF@} /MESSAGES=@{ON,OFF,TERMINAL,LISTING,BOTH,NONE@} - /PRINTBACK=@{ON,OFF@} + /PRINTBACK=@{ON,OFF,TERMINAL,LISTING,BOTH,NONE@} /RESULTS=@{ON,OFF,TERMINAL,LISTING,BOTH,NONE@} (output driver options) /HEADERS=@{NO,YES,BLANK@} /LENGTH=@{NONE,length_in_lines@} - /LISTING=@{ON,OFF,'file-name'@} /MORE=@{ON,OFF@} /WIDTH=@{NARROW,WIDTH,n_characters@} @@ -383,7 +379,6 @@ SET /BOXSTRING=@{'xxx','xxxxxxxxxxx'@} /CASE=@{UPPER,UPLOW@} /CPI=cpi_value - /DISK=@{ON,OFF@} /HIGHRES=@{ON,OFF@} /HISTOGRAM='c' /LOWRES=@{AUTO,ON,OFF@} @@ -524,10 +519,6 @@ The command continuation prompt. The default is @samp{ > }. Prompt used when expecting data input within @cmd{BEGIN DATA} (@pxref{BEGIN DATA}). The default is @samp{data> }. -@item ERRORBREAK -Whether an error causes PSPP to stop processing the current command -file after finishing the current command. The default is OFF. - @item MXERRS The maximum number of errors before PSPP halts processing of the current command file. The default is 50. @@ -615,30 +606,55 @@ RB format (@pxref{Binary and Hexadecimal Numeric Formats}). The choices are the same as SET RIB. The default is NATIVE. @end table -Output routing subcommands affect where the output of transformations -and procedures is sent. These subcommands are +In the PSPP text-based interface, the output routing subcommands +affect where output is sent. The following values are allowed for +each of these subcommands: @table @asis -@item ECHO +@item OFF +@item NONE +Discard this kind of output. + +@item TERMINAL +Write this output to the terminal, but not to listing files and other +output devices. + +@item LISTING +Write this output to listing files and other output devices, but not +to the terminal. -If turned on, commands are written to the listing file as they are read -from command files. The default is OFF. +@item ON +@itemx BOTH +Write this type of output to all output devices. +@end table + +These output routing subcommands are: + +@table @asis +@item ERRORS +Applies to error and warning messages. The default is BOTH. -@itemx ERRORS -@itemx INCLUDE @itemx MESSAGES -@item PRINTBACK -@item RESULTS -Currently not used. +Applies to notes. The default is BOTH. + +@itemx PRINTBACK +Determines whether the syntax used for input is printed back as part +of the output. The default is NONE. + +@itemx RESULTS +Applies to everything not in one of the above categories, such as the +results of statistical procedures. The default is BOTH. @end table +These subcommands have no effect on output in the PSPP GUI +environment. + Output driver option subcommands affect output drivers' settings. These subcommands are @table @asis @item HEADERS @itemx LENGTH -@itemx LISTING @itemx MORE @itemx PAGER @itemx WIDTH @@ -646,7 +662,6 @@ subcommands are @cindex headers @cindex length -@cindex listing @cindex more @cindex pager @cindex width diff --git a/perl-module/Makefile.PL b/perl-module/Makefile.PL index 045b4e7677..56b8a930ce 100644 --- a/perl-module/Makefile.PL +++ b/perl-module/Makefile.PL @@ -12,7 +12,7 @@ do 'pspp-module-config' || do { }; WriteMakefile( - FULLPERL => "PSPP_TEST_CMD=\"$Locations{BuildDir}/src/ui/terminal/pspp -B $Locations{SourceDir}/config\" \$(PERL)", + FULLPERL => "PSPP_TEST_CMD=\"$Locations{BuildDir}/src/ui/terminal/pspp\" \$(PERL)", NAME => 'PSPP', DISTNAME => 'PSPP-Perl', VERSION_FROM => "$Locations{BuildDir}/src/libpspp/version.c", diff --git a/perl-module/t/Pspp.t b/perl-module/t/Pspp.t index 4f65a4b5b2..50be5df2a7 100644 --- a/perl-module/t/Pspp.t +++ b/perl-module/t/Pspp.t @@ -40,7 +40,7 @@ sub run_pspp_syntax print FH "$syntax"; close (FH); - system ("cd $tempdir; $pspp_cmd --testing-mode $syntaxfile"); + system ("cd $tempdir; $pspp_cmd -o pspp.csv $syntaxfile"); } sub run_pspp_syntax_cmp diff --git a/src/data/file-name.c b/src/data/file-name.c index d8defd1dcc..e3047a3354 100644 --- a/src/data/file-name.c +++ b/src/data/file-name.c @@ -16,142 +16,68 @@ #include -#include +#include "data/file-name.h" #include #include #include #include #include +#include #include -#include "intprops.h" -#include "minmax.h" -#include "dirname.h" -#include "xmalloca.h" - -#include -#include -#include -#include -#include +#include "data/settings.h" +#include "libpspp/hash.h" +#include "libpspp/message.h" +#include "libpspp/str.h" +#include "libpspp/version.h" -#include "xalloc.h" +#include "gl/dirname.h" +#include "gl/intprops.h" +#include "gl/minmax.h" +#include "gl/relocatable.h" +#include "gl/xalloc.h" +#include "gl/xmalloca.h" #include "gettext.h" #define _(msgid) gettext (msgid) -#include -#include - #if defined _WIN32 || defined __WIN32__ #define WIN32_LEAN_AND_MEAN /* avoid including junk */ #include #endif -/* Initialization. */ - -const char *config_path; - -void -fn_init (void) -{ - config_path = fn_getenv_default ("STAT_CONFIG_PATH", default_config_path); -} - /* Functions for performing operations on file names. */ - -/* Copies from SRC to DST, calling INSERT_VARIABLE to handle each - instance of $var or ${var} in SRC. $$ is replaced by $. */ -void -fn_interp_vars (struct substring src, - void (*insert_variable) (const char *var, - struct string *dst, void *aux), - void *aux, struct string *dst_) -{ - struct string dst = DS_EMPTY_INITIALIZER; - int c; - - while ((c = ss_get_char (&src)) != EOF) - if (c != '$') - ds_put_char (&dst, c); - else - { - if (ss_match_char (&src, '$') || ss_is_empty (src)) - ds_put_char (&dst, '$'); - else - { - struct substring var_name; - char *var; - - if (ss_match_char (&src, '(')) - ss_get_until (&src, ')', &var_name); - else if (ss_match_char (&src, '{')) - ss_get_until (&src, '}', &var_name); - else - ss_get_chars (&src, MAX (1, ss_span (src, ss_cstr (CC_ALNUM))), - &var_name); - - var = ss_xstrdup (var_name); - insert_variable (var, &dst, aux); - free (var); - } - } - - ds_swap (&dst, dst_); - ds_destroy (&dst); -} - -static void -insert_env_var (const char *var, struct string *dst, void *aux UNUSED) -{ - const char *value = fn_getenv (var); - if (value != NULL) - ds_put_cstr (dst, value); -} - -/* Searches for a configuration file with name NAME in the path - given by PATH, which is environment-interpolated. - Directories in PATH are delimited by ':'. Returns the - malloc'd full name of the first file found, or NULL if none is - found. */ +/* Searches for a configuration file with name NAME in the directories given in + PATH, which is terminated by a null pointer. Returns the full name of the + first file found, which the caller is responsible for freeing with free(), + or NULL if none is found. */ char * -fn_search_path (const char *base_name, const char *path_) +fn_search_path (const char *base_name, char **path) { - struct string path; - struct substring dir; - struct string file = DS_EMPTY_INITIALIZER; - size_t save_idx = 0; + size_t i; if (fn_is_absolute (base_name)) return xstrdup (base_name); - /* Interpolate environment variables. */ - ds_init_cstr (&path, path_); - fn_interp_vars (ds_ss (&path), insert_env_var, NULL, &path); - - while (ds_separate (&path, ss_cstr (":"), &save_idx, &dir)) + for (i = 0; path[i] != NULL; i++) { - /* Construct file name. */ - ds_clear (&file); - ds_put_substring (&file, dir); - if (!ds_is_empty (&file) && !ISSLASH (ds_last (&file))) - ds_put_char (&file, '/'); - ds_put_cstr (&file, base_name); - ds_relocate (&file); - - /* Check whether file exists. */ - if (fn_exists (ds_cstr (&file))) - { - ds_destroy (&path); - return ds_cstr (&file); - } + const char *dir = path[i]; + char *file; + + if (!strcmp (dir, "") || !strcmp (dir, ".")) + file = xstrdup (base_name); + else if (ISSLASH (dir[strlen (dir) - 1])) + file = xasprintf ("%s%s", dir, base_name); + else + file = xasprintf ("%s/%s", dir, base_name); + + if (fn_exists (file)) + return file; + free (file); } - /* Failure. */ - ds_destroy (&path); - ds_destroy (&file); return NULL; } @@ -245,11 +171,6 @@ safety_violation (const char *fn) } #endif -/* As a general comment on the following routines, a `sensible value' - for errno includes 0 if there is no associated system error. The - routines will only set errno to 0 if there is an error in a - callback that sets errno to 0; they themselves won't. */ - /* File open routine that understands `-' as stdin/stdout and `|cmd' as a pipe to command `cmd'. Returns resultant FILE on success, NULL on failure. If NULL is returned then errno is set to a @@ -259,12 +180,18 @@ fn_open (const char *fn, const char *mode) { assert (mode[0] == 'r' || mode[0] == 'w' || mode[0] == 'a'); - if (mode[0] == 'r' && (!strcmp (fn, "stdin") || !strcmp (fn, "-"))) - return stdin; - else if (mode[0] == 'w' && (!strcmp (fn, "stdout") || !strcmp (fn, "-"))) - return stdout; - else if (mode[0] == 'w' && !strcmp (fn, "stderr")) - return stderr; + if (mode[0] == 'r') + { + if (!strcmp (fn, "stdin") || !strcmp (fn, "-")) + return stdin; + } + else + { + if (!strcmp (fn, "stdout") || !strcmp (fn, "-")) + return stdout; + if (!strcmp (fn, "stderr")) + return stderr; + } #if HAVE_POPEN if (fn[0] == '|') @@ -297,7 +224,7 @@ fn_open (const char *fn, const char *mode) { FILE *f = fopen (fn, mode); - if (f && mode[0] == 'w') + if (f && mode[0] != 'r') setvbuf (f, NULL, _IOLBF, 0); return f; diff --git a/src/data/file-name.h b/src/data/file-name.h index 327d716e7f..8e04d36a92 100644 --- a/src/data/file-name.h +++ b/src/data/file-name.h @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2009 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2009, 2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,19 +19,11 @@ #include #include -#include #include -/* Search path for configuration files. */ -extern const char *config_path; +struct string_set; -void fn_init (void); - -void fn_interp_vars (struct substring src, - void (*insert_variable) (const char *var, - struct string *dst, void *aux), - void *aux, struct string *dst); -char *fn_search_path (const char *base_name, const char *path); +char *fn_search_path (const char *base_name, char **path); char *fn_dir_name (const char *fn); char *fn_extension (const char *fn); diff --git a/src/data/settings.c b/src/data/settings.c index c86ac9cc7e..d95e3a1407 100644 --- a/src/data/settings.c +++ b/src/data/settings.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006, 2007, 2009 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -52,17 +52,14 @@ struct settings int *viewlength; int *viewwidth; bool safer_mode; - bool do_echo; bool include; int epoch; - bool errorbreak; bool route_errors_to_terminal; bool route_errors_to_listing; bool scompress; bool undefined; double blanks; - int mxwarns; - int mxerrs; + int max_messages[MSG_N_SEVERITIES]; bool printback; bool mprint; int mxloops; @@ -77,6 +74,8 @@ struct settings int syntax; struct fmt_number_style *styles; + + enum settings_output_devices output_routing[SETTINGS_N_OUTPUT_TYPES]; }; static struct settings the_settings = { @@ -93,15 +92,11 @@ static struct settings the_settings = { /* viewwidth */ NULL, /* safer_mode */ - false, - /* do_echo */ false, /* include */ true, /* epoch */ -1, - /* errorbreak */ - false, /* route_errors_to_terminal */ true, /* route_errors_to_listing */ @@ -112,10 +107,12 @@ static struct settings the_settings = { true, /* blanks */ SYSMIS, - /* mxwarns */ - 100, - /* mxerrs */ - 100, + /* max_messages */ + { + 100, /* MSG_S_ERROR */ + 100, /* MSG_S_WARNING */ + 100 /* MSG_S_NOTE */ + }, /* printback */ true, /* mprint */ @@ -139,7 +136,12 @@ static struct settings the_settings = { /* syntax */ ENHANCED, /* styles */ - NULL + NULL, + /* output devices */ + {SETTINGS_DEVICE_LISTING | SETTINGS_DEVICE_TERMINAL, + SETTINGS_DEVICE_LISTING | SETTINGS_DEVICE_TERMINAL, + 0, + SETTINGS_DEVICE_LISTING | SETTINGS_DEVICE_TERMINAL} }; static void init_viewport ( int *, int *); @@ -269,20 +271,6 @@ settings_set_safer_mode (void) the_settings.safer_mode = true; } -/* Echo commands to the listing file/printer? */ -bool -settings_get_echo (void) -{ - return the_settings.do_echo; -} - -/* Set echo. */ -void -settings_set_echo ( bool echo) -{ - the_settings.do_echo = echo; -} - /* If echo is on, whether commands from include files are echoed. */ bool settings_get_include (void) @@ -321,50 +309,6 @@ settings_set_epoch ( int epoch) assert (the_settings.epoch >= 0); } -/* Does an error stop execution? */ -bool -settings_get_errorbreak (void) -{ - return the_settings.errorbreak; -} - -/* Sets whether an error stops execution. */ -void -settings_set_errorbreak ( bool errorbreak) -{ - the_settings.errorbreak = errorbreak; -} - -/* Route error messages to terminal? */ -bool -settings_get_error_routing_to_terminal (void) -{ - return the_settings.route_errors_to_terminal; -} - -/* Sets whether error messages should be routed to the - terminal. */ -void -settings_set_error_routing_to_terminal ( bool route_to_terminal) -{ - the_settings.route_errors_to_terminal = route_to_terminal; -} - -/* Route error messages to listing file? */ -bool -settings_get_error_routing_to_listing (void) -{ - return the_settings.route_errors_to_listing; -} - -/* Sets whether error messages should be routed to the - listing file. */ -void -settings_set_error_routing_to_listing ( bool route_to_listing) -{ - the_settings.route_errors_to_listing = route_to_listing; -} - /* Compress system files by default? */ bool settings_get_scompression (void) @@ -408,46 +352,24 @@ settings_set_blanks ( double blanks) the_settings.blanks = blanks; } -/* Maximum number of warnings + errors. */ +/* Returns the maximum number of messages to show of the given SEVERITY before + aborting. (The value for MSG_S_WARNING is interpreted as maximum number of + warnings and errors combined.) */ int -settings_get_mxwarns (void) +settings_get_max_messages (enum msg_severity severity) { - return the_settings.mxwarns; + assert (severity < MSG_N_SEVERITIES); + return the_settings.max_messages[severity]; } -/* Sets maximum number of warnings + errors. */ +/* Sets the maximum number of messages to show of the given SEVERITY before + aborting to MAX. (The value for MSG_S_WARNING is interpreted as maximum + number of warnings and errors combined.) */ void -settings_set_mxwarns ( int mxwarns) +settings_set_max_messages (enum msg_severity severity, int max) { - the_settings.mxwarns = mxwarns; -} - -/* Maximum number of errors. */ -int -settings_get_mxerrs (void) -{ - return the_settings.mxerrs; -} - -/* Sets maximum number of errors. */ -void -settings_set_mxerrs ( int mxerrs) -{ - the_settings.mxerrs = mxerrs; -} - -/* Whether commands are written to the display. */ -bool -settings_get_printback (void) -{ - return the_settings.printback; -} - -/* Sets whether commands are written to the display. */ -void -settings_set_printback ( bool printback) -{ - the_settings.printback = printback; + assert (severity < MSG_N_SEVERITIES); + the_settings.max_messages[severity] = max; } /* Independent of get_printback, controls whether the commands @@ -757,3 +679,18 @@ settings_dollar_template (const struct fmt_spec *fmt) return ds_cstr (&str); } + +void +settings_set_output_routing (enum settings_output_type type, + enum settings_output_devices devices) +{ + assert (type < SETTINGS_N_OUTPUT_TYPES); + the_settings.output_routing[type] = devices; +} + +enum settings_output_devices +settings_get_output_routing (enum settings_output_type type) +{ + assert (type < SETTINGS_N_OUTPUT_TYPES); + return the_settings.output_routing[type] | SETTINGS_DEVICE_UNFILTERED; +} diff --git a/src/data/settings.h b/src/data/settings.h index 3de1715f07..7dcb0e34a4 100644 --- a/src/data/settings.h +++ b/src/data/settings.h @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006, 2009 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2009, 2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,9 +19,11 @@ #include #include -#include -#include -#include + +#include "data/format.h" +#include "libpspp/float-format.h" +#include "libpspp/integer-format.h" +#include "libpspp/message.h" struct caseproto; struct settings; @@ -63,22 +65,12 @@ void settings_set_viewwidth ( int); bool settings_get_safer_mode (void); void settings_set_safer_mode (void); -bool settings_get_echo (void); -void settings_set_echo ( bool); bool settings_get_include (void); void settings_set_include ( bool); int settings_get_epoch (void); void settings_set_epoch ( int); -bool settings_get_errorbreak (void); -void settings_set_errorbreak ( bool); - -bool settings_get_error_routing_to_terminal (void); -void settings_set_error_routing_to_terminal (bool); -bool settings_get_error_routing_to_listing (void); -void settings_set_error_routing_to_listing (bool); - bool settings_get_scompression (void); void settings_set_scompression (bool); @@ -87,13 +79,9 @@ void settings_set_undefined (bool); double settings_get_blanks (void); void settings_set_blanks (double); -int settings_get_mxwarns (void); -void settings_set_mxwarns ( int); -int settings_get_mxerrs (void); -void settings_set_mxerrs ( int); +int settings_get_max_messages (enum msg_severity); +void settings_set_max_messages (enum msg_severity, int max); -bool settings_get_printback (void); -void settings_set_printback (bool); bool settings_get_mprint (void); void settings_set_mprint (bool); @@ -140,4 +128,26 @@ const struct fmt_number_style * settings_get_style (enum fmt_type type); char * settings_dollar_template (const struct fmt_spec *fmt); +/* Routing of different kinds of output. */ +enum settings_output_devices + { + SETTINGS_DEVICE_LISTING = 1 << 0, /* File or device. */ + SETTINGS_DEVICE_TERMINAL = 1 << 1, /* Screen. */ + SETTINGS_DEVICE_UNFILTERED = 1 << 2 /* Gets all output, no filtering. */ + }; + +enum settings_output_type + { + SETTINGS_OUTPUT_ERROR, /* Errors and warnings. */ + SETTINGS_OUTPUT_NOTE, /* Notes. */ + SETTINGS_OUTPUT_SYNTAX, /* Syntax. */ + SETTINGS_OUTPUT_RESULT, /* Everything else. */ + SETTINGS_N_OUTPUT_TYPES + }; + +void settings_set_output_routing (enum settings_output_type, + enum settings_output_devices); +enum settings_output_devices settings_get_output_routing ( + enum settings_output_type); + #endif /* !settings_h */ diff --git a/src/language/lexer/lexer.c b/src/language/lexer/lexer.c index 5ff0b8bcd3..1c35642f87 100644 --- a/src/language/lexer/lexer.c +++ b/src/language/lexer/lexer.c @@ -882,7 +882,6 @@ lex_get_line_raw (struct lexer *lexer) if (ok) { const char *line = ds_cstr (&lexer->line_buffer); - journal_write (lex_current_syntax_mode (lexer) == GETL_BATCH, line); text_item_submit (text_item_create (TEXT_ITEM_SYNTAX, line)); } return ok; diff --git a/src/language/syntax-file.c b/src/language/syntax-file.c index ad277b5859..5521972477 100644 --- a/src/language/syntax-file.c +++ b/src/language/syntax-file.c @@ -113,10 +113,6 @@ read_syntax_file (struct getl_interface *s, } while (sfs->ln == 1 && !memcmp (ds_cstr (line), "#!", 2)); - /* Echo to listing file, if configured to do so. */ - if (settings_get_echo ()) - tab_output_text (TAB_LEFT | TAB_FIX, ds_cstr (line)); - return true; } diff --git a/src/language/utilities/set.q b/src/language/utilities/set.q index 46d5cd8dd1..6a1d184f60 100644 --- a/src/language/utilities/set.q +++ b/src/language/utilities/set.q @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006, 2009 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2009, 2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -72,13 +72,10 @@ int tgetnum (const char *); cpi=integer "x>0" "%s must be greater than 0"; cprompt=string; decimal=dec:dot/comma; - disk=custom; dprompt=string; - echo=echo:on/off; endcmd=string "x==1" "one character long"; epoch=custom; - errorbreak=errbrk:on/off; - errors=errors:terminal/listing/both/on/none/off; + errors=custom; format=custom; headers=headers:no/yes/blank; highres=hires:on/off; @@ -88,11 +85,10 @@ int tgetnum (const char *); log=custom; length=custom; locale=custom; - listing=custom; lowres=lores:auto/on/off; lpi=integer "x>0" "%s must be greater than 0"; menus=menus:standard/extended; - messages=messages:on/off/terminal/listing/both/on/none/off; + messages=custom; mexpand=mexp:on/off; miterate=integer "x>0" "%s must be greater than 0"; mnest=integer "x>0" "%s must be greater than 0"; @@ -102,9 +98,9 @@ int tgetnum (const char *); mxmemory=integer; mxwarns=integer; nulline=null:on/off; - printback=prtbck:on/off; + printback=custom; prompt=string; - results=res:on/off/terminal/listing/both/on/none/off; + results=custom; rib=rib:msbfirst/lsbfirst/vax/native; rrb=rrb:native/isl/isb/idl/idb/vf/vd/vg/zs/zl; safer=safe:on; @@ -162,24 +158,14 @@ cmd_set (struct lexer *lexer, struct dataset *ds) if (cmd.sbc_decimal) settings_set_decimal_char (cmd.dec == STC_DOT ? '.' : ','); - if (cmd.sbc_echo) - settings_set_echo (cmd.echo == STC_ON); if (cmd.sbc_endcmd) settings_set_endcmd (cmd.s_endcmd[0]); - if (cmd.sbc_errorbreak) - settings_set_errorbreak (cmd.errbrk == STC_ON); - if (cmd.sbc_errors) - { - bool both = cmd.errors == STC_BOTH || cmd.errors == STC_ON; - settings_set_error_routing_to_terminal (cmd.errors == STC_TERMINAL || both); - settings_set_error_routing_to_listing (cmd.errors == STC_LISTING || both); - } if (cmd.sbc_include) settings_set_include (cmd.inc == STC_ON); if (cmd.sbc_mxerrs) - settings_set_mxerrs (cmd.n_mxerrs[0]); + settings_set_max_messages (MSG_S_ERROR, cmd.n_mxerrs[0]); if (cmd.sbc_mxwarns) - settings_set_mxwarns (cmd.n_mxwarns[0]); + settings_set_max_messages (MSG_S_WARNING, cmd.n_mxwarns[0]); if (cmd.sbc_nulline) settings_set_nulline (cmd.null == STC_ON); if (cmd.sbc_rib) @@ -280,7 +266,30 @@ stc_to_float_format (int stc) NOT_REACHED (); } +static int +set_output_routing (struct lexer *lexer, enum settings_output_type type) +{ + enum settings_output_devices devices; + + lex_match (lexer, '='); + if (lex_match_id (lexer, "ON") || lex_match_id (lexer, "BOTH")) + devices = SETTINGS_DEVICE_LISTING | SETTINGS_DEVICE_TERMINAL; + else if (lex_match_id (lexer, "TERMINAL")) + devices = SETTINGS_DEVICE_TERMINAL; + else if (lex_match_id (lexer, "LISTING")) + devices = SETTINGS_DEVICE_LISTING; + else if (lex_match_id (lexer, "OFF") || lex_match_id (lexer, "NONE")) + devices = 0; + else + { + lex_error (lexer, NULL); + return 0; + } + + settings_set_output_routing (type, devices); + return 1; +} /* Parses the BLANKS subcommand, which controls the value that completely blank fields in numeric data imply. X, Wnd: Syntax is @@ -336,6 +345,13 @@ stc_custom_epoch (struct lexer *lexer, return 1; } +static int +stc_custom_errors (struct lexer *lexer, struct dataset *ds UNUSED, + struct cmd_set *cmd UNUSED, void *aux UNUSED) +{ + return set_output_routing (lexer, SETTINGS_OUTPUT_ERROR); +} + static int stc_custom_length (struct lexer *lexer, struct dataset *ds UNUSED, struct cmd_set *cmd UNUSED, void *aux UNUSED) { @@ -396,7 +412,26 @@ stc_custom_locale (struct lexer *lexer, struct dataset *ds UNUSED, return 1; } +static int +stc_custom_messages (struct lexer *lexer, struct dataset *ds UNUSED, + struct cmd_set *cmd UNUSED, void *aux UNUSED) +{ + return set_output_routing (lexer, SETTINGS_OUTPUT_NOTE); +} + +static int +stc_custom_printback (struct lexer *lexer, struct dataset *ds UNUSED, + struct cmd_set *cmd UNUSED, void *aux UNUSED) +{ + return set_output_routing (lexer, SETTINGS_OUTPUT_SYNTAX); +} +static int +stc_custom_results (struct lexer *lexer, struct dataset *ds UNUSED, + struct cmd_set *cmd UNUSED, void *aux UNUSED) +{ + return set_output_routing (lexer, SETTINGS_OUTPUT_RESULT); +} static int stc_custom_seed (struct lexer *lexer, struct dataset *ds UNUSED, struct cmd_set *cmd UNUSED, void *aux UNUSED) @@ -488,33 +523,24 @@ stc_custom_log (struct lexer *lexer, struct dataset *ds UNUSED, struct cmd_set * { return stc_custom_journal (lexer, ds, cmd, aux); } - -static int -stc_custom_listing (struct lexer *lexer, struct dataset *ds UNUSED, struct cmd_set *cmd UNUSED, void *aux UNUSED) + +static char * +show_output_routing (enum settings_output_type type) { - bool listing; + enum settings_output_devices devices; + const char *s; - lex_match (lexer, '='); - if (lex_match_id (lexer, "ON") || lex_match_id (lexer, "YES")) - listing = true; - else if (lex_match_id (lexer, "OFF") || lex_match_id (lexer, "NO")) - listing = false; + devices = settings_get_output_routing (type); + if (devices & SETTINGS_DEVICE_LISTING) + s = devices & SETTINGS_DEVICE_TERMINAL ? "BOTH" : "LISTING"; + else if (devices & SETTINGS_DEVICE_TERMINAL) + s = "TERMINAL"; else - { - /* FIXME */ - return 0; - } - output_set_type_enabled (listing, OUTPUT_DEVICE_LISTING); + s = "NONE"; - return 1; + return xstrdup (s); } -static int -stc_custom_disk (struct lexer *lexer, struct dataset *ds, struct cmd_set *cmd UNUSED, void *aux) -{ - return stc_custom_listing (lexer, ds, cmd, aux); -} - static char * show_blanks (const struct dataset *ds UNUSED) { @@ -600,12 +626,7 @@ show_endcmd (const struct dataset *ds UNUSED) static char * show_errors (const struct dataset *ds UNUSED) { - bool terminal = settings_get_error_routing_to_terminal (); - bool listing = settings_get_error_routing_to_listing (); - return xstrdup (terminal && listing ? "BOTH" - : terminal ? "TERMINAL" - : listing ? "LISTING" - : "NONE"); + return show_output_routing (SETTINGS_OUTPUT_ERROR); } static char * @@ -627,10 +648,28 @@ show_locale (const struct dataset *ds UNUSED) return xstrdup (get_default_encoding ()); } +static char * +show_messages (const struct dataset *ds UNUSED) +{ + return show_output_routing (SETTINGS_OUTPUT_NOTE); +} + +static char * +show_printback (const struct dataset *ds UNUSED) +{ + return show_output_routing (SETTINGS_OUTPUT_SYNTAX); +} + +static char * +show_results (const struct dataset *ds UNUSED) +{ + return show_output_routing (SETTINGS_OUTPUT_RESULT); +} + static char * show_mxerrs (const struct dataset *ds UNUSED) { - return xasprintf ("%d", settings_get_mxerrs ()); + return xasprintf ("%d", settings_get_max_messages (MSG_S_ERROR)); } static char * @@ -642,7 +681,7 @@ show_mxloops (const struct dataset *ds UNUSED) static char * show_mxwarns (const struct dataset *ds UNUSED) { - return xasprintf ("%d", settings_get_mxwarns ()); + return xasprintf ("%d", settings_get_max_messages (MSG_S_WARNING)); } /* Returns a name for the given INTEGER_FORMAT value. */ @@ -773,9 +812,12 @@ const struct show_sbc show_table[] = {"FORMAT", show_format}, {"LENGTH", show_length}, {"LOCALE", show_locale}, + {"MESSAGES", show_messages}, {"MXERRS", show_mxerrs}, {"MXLOOPS", show_mxloops}, {"MXWARNS", show_mxwarns}, + {"PRINTBACk", show_printback}, + {"RESULTS", show_results}, {"RIB", show_rib}, {"RRB", show_rrb}, {"SCOMPRESSION", show_scompression}, diff --git a/src/libpspp/automake.mk b/src/libpspp/automake.mk index 04c7e9f698..0172d80fd0 100644 --- a/src/libpspp/automake.mk +++ b/src/libpspp/automake.mk @@ -105,10 +105,6 @@ src/libpspp/version.c: $(top_srcdir)/AUTHORS Makefile (`date`).\";" >> $@ echo "const char host_system[] = \"$(host_triplet)\";" >> $@ echo "const char build_system[] = \"$(build_triplet)\";" >> $@ - echo "const char default_config_path[] =\ -\"\$$HOME/.pspp:$(pkgsysconfdir)\";" >> $@ - echo "const char include_path[] =\ -\"./:\$$HOME/.pspp/include:$(pkgdatadir)\";" >> $@ echo "const char locale_dir[] = \"$(datadir)/locale\";" >> $@ echo "const char *const authors[] = {" >> $@ sed -e 's/^/ \"/' -e 's/$$/\",/' $(top_srcdir)/AUTHORS >> $@ diff --git a/src/libpspp/getl.c b/src/libpspp/getl.c index 302cd9137d..dc69f11a12 100644 --- a/src/libpspp/getl.c +++ b/src/libpspp/getl.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006, 2009 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2009, 2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -16,15 +16,16 @@ #include -#include +#include "libpspp/getl.h" -#include "getl.h" +#include -#include -#include -#include +#include "libpspp/ll.h" +#include "libpspp/str.h" +#include "libpspp/string-array.h" -#include "xalloc.h" +#include "gl/relocatable.h" +#include "gl/xalloc.h" struct getl_source { @@ -41,14 +42,15 @@ struct getl_source struct source_stream { struct ll_list sources ; /* List of source files. */ - - struct string the_include_path; + struct string_array include_path; }; -const char * -getl_include_path (const struct source_stream *ss) +char ** +getl_include_path (const struct source_stream *ss_) { - return ds_cstr (&ss->the_include_path); + struct source_stream *ss = CONST_CAST (struct source_stream *, ss_); + string_array_terminate_null (&ss->include_path); + return ss->include_path.strings; } static struct getl_source * @@ -80,15 +82,19 @@ source_stream_current_error_mode (const struct source_stream *ss) /* Initialize getl. */ struct source_stream * -create_source_stream (const char *initial_include_path) +create_source_stream (void) { - struct source_stream *ss = xzalloc (sizeof (*ss)); + struct source_stream *ss; + + ss = xzalloc (sizeof (*ss)); ll_init (&ss->sources); -#if 0 - ds_init_cstr (&ss->the_include_path, - fn_getenv_default ("STAT_INCLUDE_PATH", include_path)); -#endif - ds_init_cstr (&ss->the_include_path, initial_include_path); + + string_array_init (&ss->include_path); + string_array_append (&ss->include_path, "."); + if (getenv ("HOME") != NULL) + string_array_append_nocopy (&ss->include_path, + xasprintf ("%s/.pspp", getenv ("HOME"))); + string_array_append (&ss->include_path, relocate (PKGDATADIR)); return ss; } @@ -97,17 +103,14 @@ create_source_stream (const char *initial_include_path) void getl_clear_include_path (struct source_stream *ss) { - ds_clear (&ss->the_include_path); + string_array_clear (&ss->include_path); } /* Add to the include path. */ void getl_add_include_dir (struct source_stream *ss, const char *path) { - if (ds_length (&ss->the_include_path)) - ds_put_char (&ss->the_include_path, ':'); - - ds_put_cstr (&ss->the_include_path, path); + string_array_append (&ss->include_path, path); } /* Appends source S to the list of source files. */ @@ -231,7 +234,7 @@ destroy_source_stream (struct source_stream *ss) { while ( !ll_is_empty (&ss->sources)) close_source (ss); - ds_destroy (&ss->the_include_path); + string_array_destroy (&ss->include_path); free (ss); } diff --git a/src/libpspp/getl.h b/src/libpspp/getl.h index c039937798..47dea27e42 100644 --- a/src/libpspp/getl.h +++ b/src/libpspp/getl.h @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -80,7 +80,7 @@ struct getl_interface struct source_stream; -struct source_stream * create_source_stream (const char *); +struct source_stream *create_source_stream (void); enum syntax_mode source_stream_current_syntax_mode (const struct source_stream *); @@ -94,7 +94,7 @@ void destroy_source_stream (struct source_stream *); void getl_clear_include_path (struct source_stream *); void getl_add_include_dir (struct source_stream *, const char *); -const char * getl_include_path (const struct source_stream *); +char **getl_include_path (const struct source_stream *); void getl_abort_noninteractive (struct source_stream *); bool getl_is_interactive (const struct source_stream *); diff --git a/src/libpspp/message.c b/src/libpspp/message.c index 6b4848a3ef..b3025156ef 100644 --- a/src/libpspp/message.c +++ b/src/libpspp/message.c @@ -170,8 +170,6 @@ request_bug_report_and_abort (const char *msg) fprintf (stderr, "version: %s\n", stat_version); fprintf (stderr, "host_system: %s\n", host_system); fprintf (stderr, "build_system: %s\n", build_system); - fprintf (stderr, "default_config_path: %s\n", default_config_path); - fprintf (stderr, "include_path: %s\n", include_path); fprintf (stderr, "locale_dir: %s\n", locale_dir); fprintf (stderr, "compiler version: %s\n", #ifdef __VERSION__ diff --git a/src/libpspp/version.h b/src/libpspp/version.h index 88cd3ebe75..e2125154a8 100644 --- a/src/libpspp/version.h +++ b/src/libpspp/version.h @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -33,12 +33,6 @@ extern const char host_system[]; /* Canonical name of build system type. */ extern const char build_system[]; -/* Configuration path at build time. */ -extern const char default_config_path[]; - -/* Include path. */ -extern const char include_path[]; - /* Locale directory. */ extern const char locale_dir[]; diff --git a/src/output/ascii.c b/src/output/ascii.c index ffe8515f8b..b427df5318 100644 --- a/src/output/ascii.c +++ b/src/output/ascii.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2007, 2009 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2007, 2009, 2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -93,7 +93,7 @@ struct ascii_driver struct output_driver driver; /* User parameters. */ - bool append; /* Append if output-file already exists? */ + bool append; /* Append if output file already exists? */ bool headers; /* Print headers at top of page? */ bool paginate; /* Insert formfeeds? */ bool squeeze_blank_lines; /* Squeeze multiple blank lines into one? */ @@ -124,6 +124,10 @@ struct ascii_driver int y; }; +static const struct output_driver_class ascii_driver_class; + +static void ascii_submit (struct output_driver *, const struct output_item *); + static int vertical_margins (const struct ascii_driver *); static const char *get_default_box (int right, int bottom, int left, int top); @@ -146,7 +150,7 @@ static void ascii_draw_cell (void *, const struct table_cell *, static struct ascii_driver * ascii_driver_cast (struct output_driver *driver) { - assert (driver->class == &ascii_class); + assert (driver->class == &ascii_driver_class); return UP_CAST (driver, struct ascii_driver, driver); } @@ -158,7 +162,7 @@ opt (struct output_driver *d, struct string_map *options, const char *key, } static struct output_driver * -ascii_create (const char *name, enum output_device_type device_type, +ascii_create (const char *file_name, enum settings_output_devices device_type, struct string_map *o) { struct output_driver *d; @@ -168,28 +172,21 @@ ascii_create (const char *name, enum output_device_type device_type, a = xzalloc (sizeof *a); d = &a->driver; - output_driver_init (&a->driver, &ascii_class, name, device_type); + output_driver_init (&a->driver, &ascii_driver_class, file_name, device_type); a->append = parse_boolean (opt (d, o, "append", "false")); - a->headers = parse_boolean (opt (d, o, "headers", "true")); - a->paginate = parse_boolean (opt (d, o, "paginate", "true")); - a->squeeze_blank_lines = parse_boolean (opt (d, o, "squeeze", "false")); - a->emphasis = parse_enum (opt (d, o, "emphasis", "bold"), + a->headers = parse_boolean (opt (d, o, "headers", "false")); + a->paginate = parse_boolean (opt (d, o, "paginate", "false")); + a->squeeze_blank_lines = parse_boolean (opt (d, o, "squeeze", "true")); + a->emphasis = parse_enum (opt (d, o, "emphasis", "none"), "bold", EMPH_BOLD, "underline", EMPH_UNDERLINE, "none", EMPH_NONE, (char *) NULL); - if (parse_enum (opt (d, o, "chart-type", "png"), - "png", true, - "none", false, - (char *) NULL)) - a->chart_file_name = parse_chart_file_name (opt (d, o, "chart-files", - "pspp-#.png")); - else - a->chart_file_name = NULL; + a->chart_file_name = parse_chart_file_name (opt (d, o, "charts", file_name)); - a->top_margin = parse_int (opt (d, o, "top-margin", "2"), 0, INT_MAX); - a->bottom_margin = parse_int (opt (d, o, "bottom-margin", "2"), 0, INT_MAX); + a->top_margin = parse_int (opt (d, o, "top-margin", "0"), 0, INT_MAX); + a->bottom_margin = parse_int (opt (d, o, "bottom-margin", "0"), 0, INT_MAX); a->width = parse_page_size (opt (d, o, "width", "79")); paper_length = parse_page_size (opt (d, o, "length", "66")); @@ -214,7 +211,7 @@ ascii_create (const char *name, enum output_device_type device_type, a->title = xstrdup (""); a->subtitle = xstrdup (""); - a->file_name = parse_string (opt (d, o, "output-file", "pspp.list")); + a->file_name = xstrdup (file_name); a->file = NULL; a->error = false; a->page_number = 0; @@ -531,10 +528,14 @@ ascii_submit (struct output_driver *driver, } } -const struct output_driver_class ascii_class = +const struct output_driver_factory txt_driver_factory = + { "txt", ascii_create }; +const struct output_driver_factory list_driver_factory = + { "list", ascii_create }; + +static const struct output_driver_class ascii_driver_class = { - "ascii", - ascii_create, + "text", ascii_destroy, ascii_submit, ascii_flush, diff --git a/src/output/cairo.c b/src/output/cairo.c index 3584f30f57..c6892793d1 100644 --- a/src/output/cairo.c +++ b/src/output/cairo.c @@ -133,6 +133,8 @@ struct xr_driver int y; }; +static const struct output_driver_class cairo_driver_class; + static void xr_show_page (struct xr_driver *); static void draw_headers (struct xr_driver *); @@ -154,7 +156,7 @@ static void xr_draw_cell (void *, const struct table_cell *, static struct xr_driver * xr_driver_cast (struct output_driver *driver) { - assert (driver->class == &cairo_class); + assert (driver->class == &cairo_driver_class); return UP_CAST (driver, struct xr_driver, driver); } @@ -173,7 +175,7 @@ xr_allocate (const char *name, int device_type, struct string_map *o) xr = xzalloc (sizeof *xr); d = &xr->driver; - output_driver_init (d, &cairo_class, name, device_type); + output_driver_init (d, &cairo_driver_class, name, device_type); xr->headers = true; xr->font_height = XR_POINT * 10; xr->fonts[XR_FONT_FIXED].string @@ -232,8 +234,8 @@ xr_set_cairo (struct xr_driver *xr, cairo_t *cairo) } static struct output_driver * -xr_create (const char *name, enum output_device_type device_type, - struct string_map *o) +xr_create (const char *file_name, enum settings_output_devices device_type, + struct string_map *o, enum xr_output_type file_type) { enum { MIN_WIDTH = 3, MIN_LENGTH = 3 }; struct output_driver *d; @@ -242,22 +244,13 @@ xr_create (const char *name, enum output_device_type device_type, cairo_status_t status; double width_pt, length_pt; int paper_width, paper_length; - char *file_name; - xr = xr_allocate (name, device_type, o); + xr = xr_allocate (file_name, device_type, o); d = &xr->driver; xr->headers = parse_boolean (opt (d, o, "headers", "true")); - xr->file_type = parse_enum (opt (d, o, "output-type", "pdf"), - "pdf", XR_PDF, - "ps", XR_PS, - "svg", XR_SVG, - (char *) NULL); - file_name = parse_string (opt (d, o, "output-file", - (xr->file_type == XR_PDF ? "pspp.pdf" - : xr->file_type == XR_PS ? "pspp.ps" - : "pspp.svg"))); + xr->file_type = file_type; parse_paper_size (opt (d, o, "paper-size", ""), &paper_width, &paper_length); xr->left_margin = parse_dimension (opt (d, o, "left-margin", ".5in")); @@ -321,7 +314,6 @@ xr_create (const char *name, enum output_device_type device_type, goto error; } - free (file_name); return &xr->driver; error: @@ -329,6 +321,27 @@ xr_create (const char *name, enum output_device_type device_type, return NULL; } +static struct output_driver * +xr_pdf_create (const char *file_name, enum settings_output_devices device_type, + struct string_map *o) +{ + return xr_create (file_name, device_type, o, XR_PDF); +} + +static struct output_driver * +xr_ps_create (const char *file_name, enum settings_output_devices device_type, + struct string_map *o) +{ + return xr_create (file_name, device_type, o, XR_PS); +} + +static struct output_driver * +xr_svg_create (const char *file_name, enum settings_output_devices device_type, + struct string_map *o) +{ + return xr_create (file_name, device_type, o, XR_SVG); +} + static void xr_destroy (struct output_driver *driver) { @@ -899,11 +912,13 @@ free_font (struct xr_font *font) g_object_unref (font->layout); } -/* Cairo driver class. */ -const struct output_driver_class cairo_class = +struct output_driver_factory pdf_driver_factory = { "pdf", xr_pdf_create }; +struct output_driver_factory ps_driver_factory = { "ps", xr_ps_create }; +struct output_driver_factory svg_driver_factory = { "svg", xr_svg_create }; + +static const struct output_driver_class cairo_driver_class = { "cairo", - xr_create, xr_destroy, xr_submit, xr_flush, diff --git a/src/output/csv.c b/src/output/csv.c index 625ce82a07..6be9c43acf 100644 --- a/src/output/csv.c +++ b/src/output/csv.c @@ -47,10 +47,12 @@ struct csv_driver int n_items; /* Number of items output so far. */ }; +static const struct output_driver_class csv_driver_class; + static struct csv_driver * csv_driver_cast (struct output_driver *driver) { - assert (driver->class == &csv_class); + assert (driver->class == &csv_driver_class); return UP_CAST (driver, struct csv_driver, driver); } @@ -62,7 +64,7 @@ opt (struct output_driver *d, struct string_map *options, const char *key, } static struct output_driver * -csv_create (const char *name, enum output_device_type device_type, +csv_create (const char *file_name, enum settings_output_devices device_type, struct string_map *o) { struct output_driver *d; @@ -70,7 +72,7 @@ csv_create (const char *name, enum output_device_type device_type, csv = xzalloc (sizeof *csv); d = &csv->driver; - output_driver_init (&csv->driver, &csv_class, name, device_type); + output_driver_init (&csv->driver, &csv_driver_class, file_name, device_type); csv->separator = parse_string (opt (d, o, "separator", ",")); csv->file_name = parse_string (opt (d, o, "output-file", "pspp.csv")); @@ -227,10 +229,11 @@ csv_submit (struct output_driver *driver, } } -const struct output_driver_class csv_class = +struct output_driver_factory csv_driver_factory = { "csv", csv_create }; + +static const struct output_driver_class csv_driver_class = { "csv", - csv_create, csv_destroy, csv_submit, csv_flush, diff --git a/src/output/driver-provider.h b/src/output/driver-provider.h index 92929b54ac..df31637379 100644 --- a/src/output/driver-provider.h +++ b/src/output/driver-provider.h @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2007, 2009 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2007, 2009, 2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,9 +17,11 @@ #ifndef OUTPUT_DRIVER_PROVIDER_H #define OUTPUT_DRIVER_PROVIDER_H 1 -#include #include -#include + +#include "data/settings.h" +#include "libpspp/compiler.h" +#include "output/driver.h" struct output_item; struct string_map; @@ -29,12 +31,12 @@ struct output_driver { const struct output_driver_class *class; /* Driver class. */ char *name; /* Name of this driver. */ - enum output_device_type device_type; /* One of OUTPUT_DEVICE_*. */ + enum settings_output_devices device_type; /* One of SETTINGS_DEVICE_*. */ }; void output_driver_init (struct output_driver *, const struct output_driver_class *, - const char *name, enum output_device_type); + const char *name, enum settings_output_devices); void output_driver_destroy (struct output_driver *); const char *output_driver_get_name (const struct output_driver *); @@ -47,22 +49,8 @@ const char *output_driver_get_name (const struct output_driver *); with error(), which will never call into the output drivers. */ struct output_driver_class { - const char *name; /* Name of this driver class. */ - - /* Creates a new output driver of this class. NAME and TYPE should be - passed directly to output_driver_init. Returns the new output driver if - successful, otherwise a null pointer. - - It is up to the driver class to decide how to interpret OPTIONS. The - functions in output/options.h can be useful. OPTIONS may be modified - but the caller is responsible for destroying it. - - The returned driver should not have been registered (with - output_driver_register). The caller will register the driver (if this - is desirable). */ - struct output_driver *(*create) (const char *name, - enum output_device_type type, - struct string_map *options); + /* Name of this driver class. */ + const char *name; /* Closes and frees DRIVER. */ void (*destroy) (struct output_driver *driver); @@ -83,17 +71,31 @@ struct output_driver_class void (*flush) (struct output_driver *driver); }; -void output_driver_register (struct output_driver *); -void output_driver_unregister (struct output_driver *); -bool output_driver_is_registered (const struct output_driver *); - -/* Common drivers. */ -extern const struct output_driver_class ascii_class; -extern const struct output_driver_class html_class; -extern const struct output_driver_class odt_class; -extern const struct output_driver_class csv_class; -#ifdef HAVE_CAIRO -extern const struct output_driver_class cairo_class; -#endif +/* Useful for output driver implementation. */ +void output_driver_track_current_command (const struct output_item *, char **); + +/* An abstract way for the output subsystem to create an output driver. */ +struct output_driver_factory + { + /* The file extension, without the leading dot, e.g. "pdf". */ + const char *extension; + + /* Creates a new output driver of this class. NAME and TYPE should be + passed directly to output_driver_init. Returns the new output driver if + successful, otherwise a null pointer. + + It is up to the driver class to decide how to interpret OPTIONS. The + create function should delete pairs that it understands from OPTIONS, + because the caller may issue errors about unknown options for any pairs + that remain. The functions in output/options.h can be useful. + + The returned driver should not have been registered (with + output_driver_register). The caller will register the driver (if this + is desirable). */ + struct output_driver *(*create) (const char *name, + enum settings_output_devices type, + struct string_map *options); + }; + #endif /* output/driver-provider.h */ diff --git a/src/output/driver.c b/src/output/driver.c index 6dd25174fb..61852c4a5e 100644 --- a/src/output/driver.c +++ b/src/output/driver.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2007, 2009 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2007, 2009, 2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -16,8 +16,8 @@ #include -#include -#include +#include "output/driver.h" +#include "output/driver-provider.h" #include #include @@ -25,32 +25,29 @@ #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "error.h" -#include "xalloc.h" -#include "xmemdup0.h" +#include "data/file-name.h" +#include "data/settings.h" +#include "libpspp/array.h" +#include "libpspp/assertion.h" +#include "libpspp/message.h" +#include "libpspp/llx.h" +#include "libpspp/string-map.h" +#include "libpspp/string-set.h" +#include "libpspp/str.h" +#include "output/output-item.h" +#include "output/text-item.h" + +#include "gl/error.h" +#include "gl/xalloc.h" +#include "gl/xmemdup0.h" #include "gettext.h" #define _(msgid) gettext (msgid) -static const struct output_driver_class *driver_classes[]; - -static struct output_driver **drivers; -static size_t n_drivers, allocated_drivers; +static const struct output_driver_factory *factories[]; -static unsigned int enabled_device_types = ((1u << OUTPUT_DEVICE_UNKNOWN) - | (1u << OUTPUT_DEVICE_LISTING) - | (1u << OUTPUT_DEVICE_SCREEN) - | (1u << OUTPUT_DEVICE_PRINTER)); +/* Drivers currently registered with output_driver_register(). */ +static struct llx_list drivers = LLX_INITIALIZER (drivers); static struct output_item *deferred_syntax; static bool in_command; @@ -58,509 +55,55 @@ static bool in_command; void output_close (void) { - while (n_drivers > 0) + while (!llx_is_empty (&drivers)) { - struct output_driver *d = drivers[--n_drivers]; + struct output_driver *d = llx_pop_head (&drivers, &llx_malloc_mgr); output_driver_destroy (d); } } -static void -expand_macro (const char *name, struct string *dst, void *macros_) -{ - const struct string_map *macros = macros_; - - if (!strcmp (name, "viewwidth")) - ds_put_format (dst, "%d", settings_get_viewwidth ()); - else if (!strcmp (name, "viewlength")) - ds_put_format (dst, "%d", settings_get_viewlength ()); - else - { - const char *value = string_map_find (macros, name); - if (value != NULL) - ds_put_cstr (dst, value); - } -} - -/* Defines one configuration macro based on the text in BP, which - should be of the form `KEY=VALUE'. Returns true if - successful, false if S is not in the proper form. */ -bool -output_define_macro (const char *s, struct string_map *macros) -{ - const char *key_start, *value; - size_t key_len; - char *key; - - s += strspn (s, CC_SPACES); - - key_start = s; - key_len = strcspn (s, "=" CC_SPACES); - if (key_len == 0) - return false; - s += key_len; - - s += strspn (s, CC_SPACES); - if (*s == '=') - s++; - - s += strspn (s, CC_SPACES); - value = s; - - key = xmemdup0 (key_start, key_len); - if (!string_map_contains (macros, key)) - { - struct string expanded_value = DS_EMPTY_INITIALIZER; - - fn_interp_vars (ss_cstr (value), expand_macro, ¯os, &expanded_value); - string_map_insert_nocopy (macros, key, ds_steal_cstr (&expanded_value)); - } - else - free (key); - - return true; -} - -static void -add_driver_names (char *to, struct string_set *names) -{ - char *save_ptr = NULL; - char *name; - - for (name = strtok_r (to, CC_SPACES, &save_ptr); name != NULL; - name = strtok_r (NULL, CC_SPACES, &save_ptr)) - string_set_insert (names, name); -} - -static void -init_default_drivers (void) -{ - error (0, 0, _("using default output driver configuration")); - output_configure_driver ("list:ascii:listing:" - "length=66 width=79 output-file=\"pspp.list\""); -} - -static void -warn_unused_drivers (const struct string_set *unused_drivers, - const struct string_set *requested_drivers) -{ - const struct string_set_node *node; - const char *name; - - STRING_SET_FOR_EACH (name, node, unused_drivers) - if (string_set_contains (requested_drivers, name)) - error (0, 0, _("unknown output driver `%s'"), name); - else - error (0, 0, _("output driver `%s' referenced but never defined"), name); -} - void -output_read_configuration (const struct string_map *macros_, - const struct string_set *driver_names_) -{ - struct string_map macros = STRING_MAP_INITIALIZER (macros); - struct string_set driver_names = STRING_SET_INITIALIZER (driver_names); - char *devices_file_name = NULL; - FILE *devices_file = NULL; - struct string line = DS_EMPTY_INITIALIZER; - int line_number; - - ds_init_empty (&line); - - devices_file_name = fn_search_path ("devices", config_path); - if (devices_file_name == NULL) - { - error (0, 0, _("cannot find output initialization file " - "(use `-vv' to view search path)")); - goto exit; - } - devices_file = fopen (devices_file_name, "r"); - if (devices_file == NULL) - { - error (0, errno, _("cannot open \"%s\""), devices_file_name); - goto exit; - } - - string_map_replace_map (¯os, macros_); - string_set_union (&driver_names, driver_names_); - if (string_set_is_empty (&driver_names)) - string_set_insert (&driver_names, "default"); - - line_number = 0; - for (;;) - { - char *cp, *delimiter, *name; - - if (!ds_read_config_line (&line, &line_number, devices_file)) - { - if (ferror (devices_file)) - error (0, errno, _("reading \"%s\""), devices_file_name); - break; - } - - cp = ds_cstr (&line); - cp += strspn (cp, CC_SPACES); - - if (*cp == '\0') - continue; - else if (!strncmp ("define", cp, 6) && isspace ((unsigned char) cp[6])) - { - if (!output_define_macro (&cp[7], ¯os)) - error_at_line (0, 0, devices_file_name, line_number, - _("\"%s\" is not a valid macro definition"), - &cp[7]); - continue; - } - - delimiter = cp + strcspn (cp, ":="); - name = xmemdup0 (cp, delimiter - cp); - if (*delimiter == '=') - { - if (string_set_delete (&driver_names, name)) - add_driver_names (delimiter + 1, &driver_names); - } - else if (*delimiter == ':') - { - if (string_set_delete (&driver_names, name)) - { - fn_interp_vars (ds_ss (&line), expand_macro, ¯os, &line); - output_configure_driver (ds_cstr (&line)); - } - } - else - error_at_line (0, 0, devices_file_name, line_number, - _("syntax error")); - free (name); - } - - warn_unused_drivers (&driver_names, driver_names_); - -exit: - if (devices_file != NULL) - fclose (devices_file); - free (devices_file_name); - ds_destroy (&line); - string_set_destroy (&driver_names); - string_map_destroy (¯os); - - if (n_drivers == 0) - { - error (0, 0, _("no active output drivers")); - init_default_drivers (); - } -} - -/* Obtains a token from S and advances its position. Errors are - reported against the given DRIVER_NAME. - The token is stored in TOKEN. Returns true if successful, - false on syntax error. - - Caller is responsible for skipping leading spaces. */ -static bool -get_option_token (char **s_, const char *driver_name, - struct string *token) +output_get_supported_formats (struct string_set *formats) { - struct substring s = ss_cstr (*s_); - int c; - - ds_clear (token); - c = ss_get_char (&s); - if (c == EOF) - { - error (0, 0, _("syntax error parsing options for \"%s\" driver"), - driver_name); - return false; - } - else if (c == '\'' || c == '"') - { - int quote = c; - - for (;;) - { - c = ss_get_char (&s); - if (c == quote) - break; - else if (c == EOF) - { - error (0, 0, - _("reached end of options inside quoted string " - "parsing options for \"%s\" driver"), - driver_name); - return false; - } - else if (c != '\\') - ds_put_char (token, c); - else - { - int out; - - c = ss_get_char (&s); - switch (c) - { - case '\'': - out = '\''; - break; - case '"': - out = '"'; - break; - case '\\': - out = '\\'; - break; - case 'a': - out = '\a'; - break; - case 'b': - out = '\b'; - break; - case 'f': - out = '\f'; - break; - case 'n': - out = '\n'; - break; - case 'r': - out = '\r'; - break; - case 't': - out = '\t'; - break; - case 'v': - out = '\v'; - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - out = c - '0'; - while (ss_first (s) >= '0' && ss_first (s) <= '7') - out = out * 8 + (ss_get_char (&s) - '0'); - break; - case 'x': - case 'X': - out = 0; - while (isxdigit (ss_first (s))) - { - c = ss_get_char (&s); - out *= 16; - if (isdigit (c)) - out += c - '0'; - else - out += tolower (c) - 'a' + 10; - } - break; - default: - error (0, 0, _("syntax error in string constant " - "parsing options for \"%s\" driver"), - driver_name); - return false; - } - ds_put_char (token, out); - } - } - } - else - { - for (;;) - { - ds_put_char (token, c); - - c = ss_first (s); - if (c == EOF || c == '=' || isspace (c)) - break; - ss_advance (&s, 1); - } - } + const struct output_driver_factory **fp; - *s_ = s.string; - return 1; + for (fp = factories; *fp != NULL; fp++) + string_set_insert (formats, (*fp)->extension); } static void -parse_options (const char *driver_name, char *options, - struct string_map *option_map) +output_submit__ (struct output_item *item) { - struct string key = DS_EMPTY_INITIALIZER; - struct string value = DS_EMPTY_INITIALIZER; - - for (;;) - { - options += strspn (options, CC_SPACES); - if (*options == '\0') - break; - - if (!get_option_token (&options, driver_name, &key)) - break; - - options += strspn (options, CC_SPACES); - if (*options != '=') - { - error (0, 0, _("syntax error expecting `=' " - "parsing options for driver \"%s\""), - driver_name); - break; - } - options++; - - options += strspn (options, CC_SPACES); - if (!get_option_token (&options, driver_name, &value)) - break; - - if (string_map_contains (option_map, ds_cstr (&key))) - error (0, 0, _("driver \"%s\" defines option \"%s\" multiple times"), - driver_name, ds_cstr (&key)); - else - string_map_insert (option_map, ds_cstr (&key), ds_cstr (&value)); - } - - ds_destroy (&key); - ds_destroy (&value); -} + struct llx *llx, *next; -static char * -trim_token (char *token) -{ - if (token != NULL) + for (llx = llx_head (&drivers); llx != llx_null (&drivers); llx = next) { - char *end; - - /* Trim leading spaces. */ - while (isspace ((unsigned char) *token)) - token++; - - /* Trim trailing spaces. */ - end = strchr (token, '\0'); - while (end > token && isspace ((unsigned char) end[-1])) - *--end = '\0'; - - /* An empty token is a null token. */ - if (*token == '\0') - return NULL; - } - return token; -} - -static const struct output_driver_class * -find_output_class (const char *name) -{ - const struct output_driver_class **classp; + struct output_driver *d = llx_data (llx); + enum settings_output_type type; - for (classp = driver_classes; *classp != NULL; classp++) - if (!strcmp ((*classp)->name, name)) - break; + next = llx_next (llx); - return *classp; -} - -static struct output_driver * -create_driver (const char *driver_name, const char *class_name, - const char *device_type, struct string_map *options) -{ - const struct output_driver_class *class; - enum output_device_type type; - struct output_driver *driver; - - type = OUTPUT_DEVICE_UNKNOWN; - if (device_type != NULL && device_type[0] != '\0') - { - if (!strcmp (device_type, "listing")) - type = OUTPUT_DEVICE_LISTING; - else if (!strcmp (device_type, "screen")) - type = OUTPUT_DEVICE_SCREEN; - else if (!strcmp (device_type, "printer")) - type = OUTPUT_DEVICE_PRINTER; + if (is_text_item (item) + && text_item_get_type (to_text_item (item)) == TEXT_ITEM_SYNTAX) + type = SETTINGS_OUTPUT_SYNTAX; else - error (0, 0, _("unknown device type `%s'"), device_type); - } - - class = find_output_class (class_name); - if (class != NULL) - driver = class->create (driver_name, type, options); - else - { - error (0, 0, _("unknown output driver class `%s'"), class_name); - driver = NULL; - } - - string_map_destroy (options); - - return driver; -} - -struct output_driver * -output_driver_create (const char *class_name, struct string_map *options) -{ - return create_driver (class_name, class_name, NULL, options); -} - -/* String LINE is in format: - DRIVERNAME:CLASSNAME:DEVICETYPE:OPTIONS -*/ -void -output_configure_driver (const char *line_) -{ - char *save_ptr = NULL; - char *line = xstrdup (line_); - char *driver_name = trim_token (strtok_r (line, ":", &save_ptr)); - char *class_name = trim_token (strtok_r (NULL, ":", &save_ptr)); - char *device_type = trim_token (strtok_r (NULL, ":", &save_ptr)); - char *options = trim_token (strtok_r (NULL, "", &save_ptr)); - - if (driver_name && class_name) - { - struct string_map option_map; - struct output_driver *driver; - - string_map_init (&option_map); - if (options != NULL) - parse_options (driver_name, options, &option_map); + type = SETTINGS_OUTPUT_RESULT; - driver = create_driver (driver_name, class_name, - device_type, &option_map); - if (driver != NULL) - output_driver_register (driver); + if (settings_get_output_routing (type) & d->device_type) + d->class->submit (d, item); } - else - error (0, 0, - _("driver definition line missing driver name or class name")); - free (line); -} - -/* Display on stdout a list of all registered driver classes. */ -void -output_list_classes (void) -{ - const struct output_driver_class **classp; - - printf (_("Driver classes:")); - for (classp = driver_classes; *classp != NULL; classp++) - printf (" %s", (*classp)->name); - putc ('\n', stdout); -} - -static bool -driver_is_enabled (const struct output_driver *d) -{ - return (1u << d->device_type) & enabled_device_types; + output_item_unref (item); } static void -output_submit__ (struct output_item *item) +flush_deferred_syntax (void) { - size_t i; - - for (i = 0; i < n_drivers; i++) + if (deferred_syntax != NULL) { - struct output_driver *d = drivers[i]; - if (driver_is_enabled (d)) - d->class->submit (d, item); + output_submit__ (deferred_syntax); + deferred_syntax = NULL; } - - output_item_unref (item); } /* Submits ITEM to the configured output drivers, and transfers ownership to @@ -576,8 +119,7 @@ output_submit (struct output_item *item) case TEXT_ITEM_SYNTAX: if (!in_command) { - if (deferred_syntax != NULL) - output_submit__ (deferred_syntax); + flush_deferred_syntax (); deferred_syntax = item; return; } @@ -585,11 +127,7 @@ output_submit (struct output_item *item) case TEXT_ITEM_COMMAND_OPEN: output_submit__ (item); - if (deferred_syntax != NULL) - { - output_submit__ (deferred_syntax); - deferred_syntax = NULL; - } + flush_deferred_syntax (); in_command = true; return; @@ -610,42 +148,21 @@ output_submit (struct output_item *item) void output_flush (void) { - size_t i; + struct llx *llx; - for (i = 0; i < n_drivers; i++) + for (llx = llx_head (&drivers); llx != llx_null (&drivers); + llx = llx_next (llx)) { - struct output_driver *d = drivers[i]; - if (driver_is_enabled (d) && d->class->flush != NULL) + struct output_driver *d = llx_data (llx); + if (d->device_type & SETTINGS_DEVICE_TERMINAL && d->class->flush != NULL) d->class->flush (d); } } - -unsigned int -output_get_enabled_types (void) -{ - return enabled_device_types; -} - -void -output_set_enabled_types (unsigned int types) -{ - enabled_device_types = types; -} - -void -output_set_type_enabled (bool enable, enum output_device_type type) -{ - unsigned int bit = 1u << type; - if (enable) - enabled_device_types |= bit; - else - enabled_device_types |= ~bit; -} void output_driver_init (struct output_driver *driver, const struct output_driver_class *class, - const char *name, enum output_device_type type) + const char *name, enum settings_output_devices type) { driver->class = class; driver->name = xstrdup (name); @@ -676,47 +193,147 @@ void output_driver_register (struct output_driver *driver) { assert (!output_driver_is_registered (driver)); - if (n_drivers >= allocated_drivers) - drivers = x2nrealloc (drivers, &allocated_drivers, sizeof *drivers); - drivers[n_drivers++] = driver; + llx_push_tail (&drivers, driver, &llx_malloc_mgr); } void output_driver_unregister (struct output_driver *driver) { - size_t i; - - for (i = 0; i < n_drivers; i++) - if (drivers[i] == driver) - { - remove_element (drivers, n_drivers, sizeof *drivers, i); - return; - } - NOT_REACHED (); + llx_remove (llx_find (llx_head (&drivers), llx_null (&drivers), driver), + &llx_malloc_mgr); } bool output_driver_is_registered (const struct output_driver *driver) { - size_t i; + return llx_find (llx_head (&drivers), llx_null (&drivers), driver) != NULL; +} + +/* Useful functions for output driver implementation. */ + +void +output_driver_track_current_command (const struct output_item *output_item, + char **command_namep) +{ + if (is_text_item (output_item)) + { + const struct text_item *item = to_text_item (output_item); + const char *text = text_item_get_text (item); + enum text_item_type type = text_item_get_type (item); - for (i = 0; i < n_drivers; i++) - if (drivers[i] == driver) - return true; - return false; + if (type == TEXT_ITEM_COMMAND_OPEN) + { + free (*command_namep); + *command_namep = xstrdup (text); + } + else if (type == TEXT_ITEM_COMMAND_CLOSE) + { + free (*command_namep); + *command_namep = NULL; + } + } } -/* Known driver classes. */ +extern const struct output_driver_factory txt_driver_factory; +extern const struct output_driver_factory list_driver_factory; +extern const struct output_driver_factory html_driver_factory; +extern const struct output_driver_factory odt_driver_factory; +extern const struct output_driver_factory csv_driver_factory; +#ifdef HAVE_CAIRO +extern const struct output_driver_factory pdf_driver_factory; +extern const struct output_driver_factory ps_driver_factory; +extern const struct output_driver_factory svg_driver_factory; +#endif -static const struct output_driver_class *driver_classes[] = +static const struct output_driver_factory *factories[] = { - &ascii_class, + &txt_driver_factory, + &list_driver_factory, + &html_driver_factory, + &odt_driver_factory, + &csv_driver_factory, #ifdef HAVE_CAIRO - &cairo_class, + &pdf_driver_factory, + &ps_driver_factory, + &svg_driver_factory, #endif - &html_class, - &odt_class, - &csv_class, - NULL, + NULL }; +static const struct output_driver_factory * +find_factory (const char *format) +{ + const struct output_driver_factory **fp; + + for (fp = factories; *fp != NULL; fp++) + { + const struct output_driver_factory *f = *fp; + + if (!strcmp (f->extension, format)) + return f; + } + return &txt_driver_factory; +} + +static enum settings_output_devices +default_device_type (const char *file_name) +{ + return (!strcmp (file_name, "-") + ? SETTINGS_DEVICE_TERMINAL + : SETTINGS_DEVICE_LISTING); +} + +struct output_driver * +output_driver_create (struct string_map *options) +{ + enum settings_output_devices device_type; + const struct output_driver_factory *f; + struct output_driver *driver; + char *device_string; + char *file_name; + char *format; + + file_name = string_map_find_and_delete (options, "output-file"); + if (file_name == NULL) + file_name = xstrdup ("-"); + + format = string_map_find_and_delete (options, "format"); + if (format == NULL) + { + const char *extension = strrchr (file_name, '.'); + format = xstrdup (extension != NULL ? extension + 1 : ""); + } + + /* XXX should use parse_enum(). */ + device_string = string_map_find_and_delete (options, "device"); + if (device_string == NULL || device_string[0] == '\0') + device_type = default_device_type (file_name); + else if (!strcmp (device_string, "terminal")) + device_type = SETTINGS_DEVICE_TERMINAL; + else if (!strcmp (device_string, "listing")) + device_type = SETTINGS_DEVICE_LISTING; + else + { + error (0, 0, _("%s is not a valid device type (the choices are " + "\"terminal\" and \"listing\")"), device_string); + device_type = default_device_type (file_name); + } + + f = find_factory (format); + driver = f->create (file_name, device_type, options); + if (driver != NULL) + { + const struct string_map_node *node; + const char *key; + + STRING_MAP_FOR_EACH_KEY (key, node, options) + error (0, 0, _("%s: unknown option \"%s\""), file_name, key); + } + string_map_clear (options); + + free (file_name); + free (format); + free (device_string); + + return driver; +} diff --git a/src/output/driver.h b/src/output/driver.h index 3fb4cabfe1..93802078a4 100644 --- a/src/output/driver.h +++ b/src/output/driver.h @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2007, 2009 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2007, 2009, 2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,34 +20,19 @@ #include struct output_item; -struct string_map; struct string_set; - -void output_close (void); - -struct output_driver *output_driver_create (const char *class_name, - struct string_map *options); - -bool output_define_macro (const char *, struct string_map *macros); -void output_read_configuration (const struct string_map *macros, - const struct string_set *drivers); -void output_configure_driver (const char *); - -void output_list_classes (void); +struct string_map; void output_submit (struct output_item *); + void output_flush (void); -/* Device types. */ -enum output_device_type - { - OUTPUT_DEVICE_UNKNOWN, /* Unknown type of device. */ - OUTPUT_DEVICE_LISTING, /* Listing device. */ - OUTPUT_DEVICE_SCREEN, /* Screen device. */ - OUTPUT_DEVICE_PRINTER /* Printer device. */ - }; -unsigned int output_get_enabled_types (void); -void output_set_enabled_types (unsigned int); -void output_set_type_enabled (bool enable, enum output_device_type); +void output_close (void); +void output_get_supported_formats (struct string_set *); + +struct output_driver *output_driver_create (struct string_map *options); +void output_driver_register (struct output_driver *); +void output_driver_unregister (struct output_driver *); +bool output_driver_is_registered (const struct output_driver *); #endif /* output/driver.h */ diff --git a/src/output/html.c b/src/output/html.c index 3f9c177bc5..a3e14ba1f1 100644 --- a/src/output/html.c +++ b/src/output/html.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2009 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2009, 2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -56,7 +56,7 @@ struct html_driver bool in_syntax; }; -const struct output_driver_class html_class; +static const struct output_driver_class html_driver_class; static void html_output_table (struct html_driver *, struct table_item *); static void escape_string (FILE *file, @@ -68,7 +68,7 @@ static void print_title_tag (FILE *file, const char *name, static struct html_driver * html_driver_cast (struct output_driver *driver) { - assert (driver->class == &html_class); + assert (driver->class == &html_driver_class); return UP_CAST (driver, struct html_driver, driver); } @@ -80,7 +80,7 @@ opt (struct output_driver *d, struct string_map *options, const char *key, } static struct output_driver * -html_create (const char *name, enum output_device_type device_type, +html_create (const char *file_name, enum settings_output_devices device_type, struct string_map *o) { struct output_driver *d; @@ -88,10 +88,12 @@ html_create (const char *name, enum output_device_type device_type, html = xzalloc (sizeof *html); d = &html->driver; - output_driver_init (&html->driver, &html_class, name, device_type); - html->file_name = parse_string (opt (d, o, "output-file", "pspp.html")); - html->chart_file_name = parse_chart_file_name (opt (d, o, "chart-files", - "pspp-#.png")); + output_driver_init (&html->driver, &html_driver_class, file_name, + device_type); + + html->file_name = xstrdup (file_name); + html->chart_file_name = parse_chart_file_name (opt (d, o, "charts", + file_name)); html->file = NULL; html->chart_cnt = 1; @@ -470,10 +472,11 @@ html_output_table (struct html_driver *html, struct table_item *item) fputs ("\n\n", html->file); } -const struct output_driver_class html_class = +struct output_driver_factory html_driver_factory = { "html", html_create }; + +static const struct output_driver_class html_driver_class = { "html", - html_create, html_destroy, html_submit, NULL, diff --git a/src/output/odt.c b/src/output/odt.c index f02ae3defd..ab38cd0411 100644 --- a/src/output/odt.c +++ b/src/output/odt.c @@ -66,10 +66,12 @@ struct odt_driver int table_num; }; +static const struct output_driver_class odt_driver_class; + static struct odt_driver * odt_driver_cast (struct output_driver *driver) { - assert (driver->class == &odt_class); + assert (driver->class == &odt_driver_class); return UP_CAST (driver, struct odt_driver, driver); } @@ -293,7 +295,7 @@ opt (struct output_driver *d, struct string_map *options, const char *key, } static struct output_driver * -odt_create (const char *name, enum output_device_type device_type, +odt_create (const char *file_name, enum settings_output_devices device_type, struct string_map *o) { struct output_driver *d; @@ -301,9 +303,9 @@ odt_create (const char *name, enum output_device_type device_type, odt = xzalloc (sizeof *odt); d = &odt->driver; - output_driver_init (d, &odt_class, name, device_type); + output_driver_init (d, &odt_driver_class, file_name, device_type); - odt->file_name = parse_string (opt (d, o, "output-file", "pspp.odt")); + odt->file_name = xstrdup (file_name); odt->debug = parse_boolean (opt (d, o, "debug", "false")); odt->dirname = xstrdup ("odt-XXXXXX"); @@ -521,11 +523,11 @@ odt_submit (struct output_driver *driver, } } -/* ODT driver class. */ -const struct output_driver_class odt_class = +struct output_driver_factory odt_driver_factory = { "odt", odt_create }; + +static const struct output_driver_class odt_driver_class = { "odf", - odt_create, odt_destroy, odt_submit, NULL, diff --git a/src/output/options.c b/src/output/options.c index 918f718c0f..593adf5af0 100644 --- a/src/output/options.c +++ b/src/output/options.c @@ -282,30 +282,57 @@ parse_string (struct driver_option *o) return retval; } -/* Parses O's value as a string and returns it as a malloc'd string that the - caller is responsible for freeing. +static char * +default_chart_file_name (const char *file_name) +{ + if (strcmp (file_name, "-")) + { + const char *extension = strrchr (file_name, '.'); + int stem_length = extension ? extension - file_name : strlen (file_name); + return xasprintf ("%.*s-#.png", stem_length, file_name); + } + else + return NULL; +} + +/* Parses and returns a chart file name, or NULL if no charts should be output. + If a nonnull string is returned, it will contain at least one '#' character, + which the client will presumably replace by a number as part of writing + charts to separate files. + + If O->value is "none", then this function returns NULL. - The string must contain at least one '#' character, which the client will - presumably replace by a number as part of writing charts to separate files. + If O->value is non-NULL but not "none", returns a copy of that string (if it + contains '#'). + + If O->value is NULL, then O's default_value should be the name of the main + output file. Returns NULL if default_value is "-", and otherwise returns a + copy of string string with its extension stripped off and "-#.png" appended. Destroys O. */ char * parse_chart_file_name (struct driver_option *o) { - char *value; + char *chart_file_name; - if (o->value != NULL && strchr (o->value, '#') != NULL) - value = xstrdup (o->value); - else + if (o->value != NULL) { - value = xstrdup (o->default_value); - if (o->value != NULL) - error (0, 0, _("%s: \"%s\" is \"%s\" but a file name that contains " - "\"#\" is required."), - o->name, o->value, o->driver_name); + if (!strcmp (o->value, "none")) + chart_file_name = NULL; + else if (strchr (o->value, '#') != NULL) + chart_file_name = xstrdup (o->value); + else + { + error (0, 0, _("%s: \"%s\" is \"%s\" but a file name that contains " + "\"#\" is required."), + o->name, o->value, o->driver_name); + chart_file_name = default_chart_file_name (o->default_value); + } } + else + chart_file_name = default_chart_file_name (o->default_value); driver_option_destroy (o); - return value; + return chart_file_name; } diff --git a/src/ui/automake.mk b/src/ui/automake.mk index 743d0b6dd7..124380cf48 100644 --- a/src/ui/automake.mk +++ b/src/ui/automake.mk @@ -9,7 +9,6 @@ endif noinst_LTLIBRARIES += src/ui/libuicommon.la src_ui_libuicommon_la_SOURCES = \ - src/ui/command-line.c src/ui/command-line.h \ src/ui/debugger.c src/ui/debugger.h \ src/ui/source-init-opts.c src/ui/source-init-opts.h \ src/ui/syntax-gen.c src/ui/syntax-gen.h diff --git a/src/ui/command-line.c b/src/ui/command-line.c deleted file mode 100644 index 46dddd4936..0000000000 --- a/src/ui/command-line.c +++ /dev/null @@ -1,166 +0,0 @@ -/* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2008 Free Software Foundation - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - - -#include -#include "command-line.h" -#include -#include -#include -#include -#include -#include - - -struct clp_child -{ - void *aux; -}; - -struct command_line_processor -{ - struct argp master_parser; - - struct clp_child *child_lookup_table; - struct argp_child *children; - int n_children; - - const char *doc; - const char *args_doc; - - void *aux; -}; - - -/* Convenience function for use in parsing functions. - Returns the object for this parser */ -struct command_line_processor * -get_subject (struct argp_state *state) -{ - const struct argp *root = state->root_argp; - - const struct argp_child *children = root->children; - - return (struct command_line_processor *) children[0].argp; -} - - -/* Create a command line processor. - DOC is typically the name of the program and short description. - ARGS_DOC is a short description of the non option arguments. - AUX is an arbitrary pointer. - */ -struct command_line_processor * -command_line_processor_create (const char *doc, const char *args_doc, void *aux) -{ - struct command_line_processor *clp = xzalloc (sizeof (*clp)); - - clp->children = NULL; - clp->child_lookup_table = NULL; - - clp->doc = doc; - clp->args_doc = args_doc; - clp->aux = aux; - - return clp; -} - -/* Destroy a command line processor */ -void -command_line_processor_destroy (struct command_line_processor *clp) -{ - free (clp->children); - free (clp->child_lookup_table); - free (clp); -} - - -/* Add a CHILD to the processor CLP, with the doc string DOC. - AUX is an auxilliary pointer, specific to CHILD. - If AUX is not known or not needed then it may be set to NULL -*/ -void -command_line_processor_add_options (struct command_line_processor *clp, const struct argp *child, - const char *doc, void *aux) -{ - clp->n_children++; - - clp->children = xrealloc (clp->children, (clp->n_children + 1) * sizeof (*clp->children)); - memset (&clp->children[clp->n_children - 1], 0, sizeof (*clp->children)); - - clp->child_lookup_table = xrealloc (clp->child_lookup_table, - clp->n_children * sizeof (*clp->child_lookup_table)); - - clp->child_lookup_table [clp->n_children - 1].aux = aux; - - clp->children [clp->n_children - 1].argp = child; - clp->children [clp->n_children - 1].header = doc; - clp->children [clp->n_children].argp = NULL; -} - - -/* Set the aux paramter for CHILD in CLP to AUX. - Any previous value will be overwritten. - */ -void -command_line_processor_replace_aux (struct command_line_processor *clp, const struct argp *child, void *aux) -{ - int i; - for (i = 0 ; i < clp->n_children; ++i ) - { - if (child->options == clp->children[i].argp->options) - { - clp->child_lookup_table[i].aux = aux; - break; - } - } - assert (i < clp->n_children); -} - - -static error_t -top_level_parser (int key UNUSED, char *arg UNUSED, struct argp_state *state) -{ - int i; - struct command_line_processor *clp = state->input; - - if ( key == ARGP_KEY_INIT) - { - - for (i = 0; i < clp->n_children ; ++i) - { - state->child_inputs[i] = clp->child_lookup_table[i].aux; - } - } - - return ARGP_ERR_UNKNOWN; -} - - -/* Parse the command line specified by (ARGC, ARGV) using CLP */ -void -command_line_processor_parse (struct command_line_processor *clp, int argc, char **argv) -{ - clp->master_parser.parser = top_level_parser; - clp->master_parser.args_doc = clp->args_doc; - - clp->master_parser.doc = clp->doc; - - clp->master_parser.children = clp->children; - - argp_parse (&clp->master_parser, argc, argv, 0, 0, clp); -} - diff --git a/src/ui/command-line.h b/src/ui/command-line.h deleted file mode 100644 index 98edbea12e..0000000000 --- a/src/ui/command-line.h +++ /dev/null @@ -1,36 +0,0 @@ -/* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2008 Free Software Foundation - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - -#ifndef SRC_UI_COMMAND_LINE_H -#define SRC_UI_COMMAND_LINE_H - -#include - -struct command_line_processor; - -struct command_line_processor * get_subject (struct argp_state *state); - -struct command_line_processor *command_line_processor_create (const char *, const char *, void *); - -void command_line_processor_add_options (struct command_line_processor *cla, const struct argp *child, const char *doc, void *aux); - -void command_line_processor_replace_aux (struct command_line_processor *cla, const struct argp *child, void *aux); - -void command_line_processor_destroy (struct command_line_processor *); - -void command_line_processor_parse (struct command_line_processor *, int argc, char **argv); - -#endif diff --git a/src/ui/gui/helper.c b/src/ui/gui/helper.c index b09a2f58c3..38110f5c1d 100644 --- a/src/ui/gui/helper.c +++ b/src/ui/gui/helper.c @@ -24,7 +24,6 @@ #include #include "helper.h" -#include "message-dialog.h" #include #include #include diff --git a/src/ui/gui/main.c b/src/ui/gui/main.c index 05cc421b3e..517d74affd 100644 --- a/src/ui/gui/main.c +++ b/src/ui/gui/main.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2004, 2005, 2006 Free Software Foundation + Copyright (C) 2004, 2005, 2006, 2010 Free Software Foundation This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -15,55 +15,57 @@ along with this program. If not, see . */ #include -#include + +#include "ui/gui/psppire.h" + #include -#include "psppire.h" -#include "progname.h" #include -#include -#include -#include -#include -#include -#include +#include "libpspp/argv-parser.h" +#include "libpspp/assertion.h" +#include "libpspp/getl.h" +#include "libpspp/version.h" +#include "libpspp/copyleft.h" +#include "ui/source-init-opts.h" + +#include "gl/progname.h" +#include "gl/relocatable.h" +#include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid -const char *argp_program_version = version; -const char *argp_program_bug_address = PACKAGE_BUGREPORT; - /* Arguments to be interpreted before the X server gets initialised */ -static const struct argp_option startup_options [] = +enum { - {"no-splash", 'q', 0, 0, N_("Don't show the splash screen"), 0 }, - { 0, 0, 0, 0, 0, 0 } + OPT_NO_SPLASH, + N_STARTUP_OPTIONS }; -static error_t -parse_startup_opts (int key, char *arg, struct argp_state *state) +static const struct argv_option startup_options[N_STARTUP_OPTIONS] = + { + {"no-splash", 'q', no_argument, OPT_NO_SPLASH} + }; + +static void +startup_option_callback (int id, void *show_splash_) { - gboolean *showsplash = state->input; + gboolean *show_splash = show_splash_; - switch (key) + switch (id) { - case 'q': - *showsplash = FALSE; + case OPT_NO_SPLASH: + *show_splash = FALSE; break; + default: - return ARGP_ERR_UNKNOWN; + NOT_REACHED (); } - return 0; } - -static const struct argp startup_argp = {startup_options, parse_startup_opts, 0, 0, 0, 0, 0}; - - static GtkWidget * create_splash_window (void) { @@ -108,10 +110,9 @@ quit_one_loop (gpointer data) struct initialisation_parameters { - int argc; - char **argv; + struct source_stream *ss; + const char *data_file; GtkWidget *splash_window; - struct command_line_processor *clp; }; @@ -119,7 +120,7 @@ static gboolean run_inner_loop (gpointer data) { struct initialisation_parameters *ip = data; - initialize (ip->clp, ip->argc, ip->argv); + initialize (ip->ss, ip->data_file); g_timeout_add (500, hide_splash_window, ip->splash_window); @@ -144,10 +145,10 @@ static GMemVTable vtable = int main (int argc, char *argv[]) { - struct command_line_processor *clp ; struct initialisation_parameters init_p; gboolean show_splash = TRUE; - + struct argv_parser *parser; + struct source_stream *ss; const gchar *vers; set_program_name (argv[0]); @@ -170,21 +171,22 @@ main (int argc, char *argv[]) g_warning (vers); } - clp = command_line_processor_create (_("PSPPIRE --- A user interface for PSPP"), "[ DATA-FILE ]", 0); - - command_line_processor_add_options (clp, &startup_argp, _("Miscellaneous options:"), &show_splash); - command_line_processor_add_options (clp, &post_init_argp, - _("Options affecting syntax and behavior:"), NULL); - command_line_processor_add_options (clp, &non_option_argp, NULL, NULL); - - command_line_processor_parse (clp, argc, argv); - + /* Let GDK remove any options that it owns. */ gdk_init (&argc, &argv); + /* Parse our own options. */ + ss = create_source_stream (); + parser = argv_parser_create (); + argv_parser_add_options (parser, startup_options, N_STARTUP_OPTIONS, + startup_option_callback, &show_splash); + source_init_register_argv_parser (parser, ss); + if (!argv_parser_run (parser, argc, argv)) + exit (EXIT_FAILURE); + argv_parser_destroy (parser); + init_p.splash_window = create_splash_window (); - init_p.argc = argc; - init_p.argv = argv; - init_p.clp = clp; + init_p.ss = ss; + init_p.data_file = optind < argc ? argv[optind] : NULL; if ( show_splash ) gtk_widget_show (init_p.splash_window); diff --git a/src/ui/gui/psppire-output-window.c b/src/ui/gui/psppire-output-window.c index ebca5533dd..ebf29c01a3 100644 --- a/src/ui/gui/psppire-output-window.c +++ b/src/ui/gui/psppire-output-window.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2008, 2009 Free Software Foundation + Copyright (C) 2008, 2009, 2010 Free Software Foundation This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -301,7 +301,6 @@ done: static struct output_driver_class psppire_output_class = { "PSPPIRE", /* name */ - NULL, /* create */ NULL, /* destroy */ psppire_output_submit, /* submit */ NULL, /* flush */ @@ -315,7 +314,8 @@ psppire_output_window_setup (void) pod = xzalloc (sizeof *pod); d = &pod->driver; - output_driver_init (d, &psppire_output_class, "PSPPIRE", 0); + output_driver_init (d, &psppire_output_class, "PSPPIRE", + SETTINGS_DEVICE_UNFILTERED); output_driver_register (d); } @@ -387,12 +387,13 @@ add_filter (GtkFileChooser *chooser, const char *name, const char *pattern) static void export_output (PsppireOutputWindow *window, struct string_map *options, - const char *class_name) + const char *format) { struct output_driver *driver; size_t i; - driver = output_driver_create (class_name, options); + string_map_insert (options, "format", format); + driver = output_driver_create (options); if (driver == NULL) return; diff --git a/src/ui/gui/psppire.c b/src/ui/gui/psppire.c index ddf915f272..1c04e93b72 100644 --- a/src/ui/gui/psppire.c +++ b/src/ui/gui/psppire.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2004, 2005, 2006, 2009 Free Software Foundation + Copyright (C) 2004, 2005, 2006, 2009, 2010 Free Software Foundation This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -16,53 +16,48 @@ #include -#include +#include "ui/gui/psppire.h" + #include -#include #include - -#include -#include -#include -#include "relocatable.h" - -#include "psppire-data-window.h" -#include "psppire.h" -#include "widgets.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - #include -#include "psppire-dict.h" -#include "dict-display.h" -#include "psppire-selector.h" -#include "psppire-var-view.h" -#include "psppire-var-store.h" -#include "psppire-data-store.h" -#include "executor.h" -#include "message-dialog.h" -#include - -#include "psppire-window-register.h" -#include "psppire-output-window.h" - -#include -#include +#include +#include -#include +#include "data/casereader.h" +#include "data/datasheet.h" +#include "data/file-handle-def.h" +#include "data/file-name.h" +#include "data/por-file-reader.h" +#include "data/procedure.h" +#include "data/settings.h" +#include "data/sys-file-reader.h" +#include "language/lexer/lexer.h" +#include "language/syntax-string-source.h" +#include "libpspp/getl.h" +#include "libpspp/i18n.h" +#include "libpspp/message.h" +#include "libpspp/version.h" +#include "output/driver.h" +#include "output/journal.h" +#include "ui/gui/dict-display.h" +#include "ui/gui/executor.h" +#include "ui/gui/message-dialog.h" +#include "ui/gui/psppire-data-store.h" +#include "ui/gui/psppire-data-window.h" +#include "ui/gui/psppire-dict.h" +#include "ui/gui/psppire-output-window.h" +#include "ui/gui/psppire-selector.h" +#include "ui/gui/psppire-var-store.h" +#include "ui/gui/psppire-var-view.h" +#include "ui/gui/psppire-window-register.h" +#include "ui/gui/psppire.h" +#include "ui/gui/widgets.h" +#include "ui/source-init-opts.h" +#include "ui/syntax-gen.h" + +#include "gl/xalloc.h" +#include "gl/relocatable.h" GtkRecentManager *the_recent_mgr = 0; PsppireDataStore *the_data_store = 0; @@ -75,6 +70,8 @@ struct dataset * the_dataset = NULL; static GtkWidget *the_data_window; +static void load_data_file (const char *); + static void replace_casereader (struct casereader *s) { @@ -88,7 +85,7 @@ replace_casereader (struct casereader *s) void -initialize (struct command_line_processor *clp, int argc, char **argv) +initialize (struct source_stream *ss, const char *data_file) { PsppireDict *dictionary = 0; @@ -97,18 +94,13 @@ initialize (struct command_line_processor *clp, int argc, char **argv) preregister_widgets (); gsl_set_error_handler_off (); - fn_init (); settings_init (&viewer_width, &viewer_length); fh_init (); - the_source_stream = - create_source_stream ( - fn_getenv_default ("STAT_INCLUDE_PATH", include_path) - ); the_dataset = create_dataset (); - message_dialog_init (the_source_stream); + the_source_stream = ss; dictionary = psppire_dict_new_from_dict (dataset_dict (the_dataset)); @@ -135,11 +127,8 @@ initialize (struct command_line_processor *clp, int argc, char **argv) psppire_selector_set_default_selection_func (GTK_TYPE_TREE_VIEW, insert_source_row_into_tree_view); the_data_window = psppire_data_window_new (); - - command_line_processor_replace_aux (clp, &post_init_argp, the_source_stream); - command_line_processor_replace_aux (clp, &non_option_argp, the_source_stream); - - command_line_processor_parse (clp, argc, argv); + if (data_file != NULL) + load_data_file (data_file); execute_syntax (create_syntax_string_source ("")); @@ -248,81 +237,61 @@ create_icon_factory (void) gtk_icon_factory_add_default (factory); } - - -static error_t -parse_non_options (int key, char *arg, struct argp_state *state) +static void +load_data_file (const char *arg) { - struct source_stream *ss = state->input; - - if ( NULL == ss ) - return 0; + gchar *filename = NULL; + gchar *utf8 = NULL; + const gchar *local_encoding = NULL; + gsize written = -1; + const gboolean local_is_utf8 = g_get_charset (&local_encoding); + + /* There seems to be no Glib function to convert from local encoding + to filename encoding. Therefore it has to be done in two steps: + the intermediate encoding is UTF8. + + Either step could fail. However, in many cases the file can still + be loaded even if the conversion fails. So in those cases, after showing + a warning, we simply copy the locally encoded filename to the destination + and hope for the best. + */ + + if ( local_is_utf8) + { + utf8 = xstrdup (arg); + } + else + { + GError *err = NULL; + utf8 = g_locale_to_utf8 (arg, -1, NULL, &written, &err); + if ( NULL == utf8) + { + g_warning ("Cannot convert filename from local encoding \"%s\" to UTF-8: %s", + local_encoding, + err->message); + g_clear_error (&err); + } + } - switch (key) + if ( NULL != utf8) { - case ARGP_KEY_ARG: - { - gchar *filename = NULL; - gchar *utf8 = NULL; - const gchar *local_encoding = NULL; - gsize written = -1; - const gboolean local_is_utf8 = g_get_charset (&local_encoding); - - /* There seems to be no Glib function to convert from local encoding - to filename encoding. Therefore it has to be done in two steps: - the intermediate encoding is UTF8. - - Either step could fail. However, in many cases the file can still - be loaded even if the conversion fails. So in those cases, after showing - a warning, we simply copy the locally encoded filename to the destination - and hope for the best. - */ - - if ( local_is_utf8) - { - utf8 = xstrdup (arg); - } - else - { - GError *err = NULL; - utf8 = g_locale_to_utf8 (arg, -1, NULL, &written, &err); - if ( NULL == utf8) - { - g_warning ("Cannot convert filename from local encoding \"%s\" to UTF-8: %s", - local_encoding, - err->message); - g_clear_error (&err); - } - } - - if ( NULL != utf8) - { - GError *err = NULL; - filename = g_filename_from_utf8 (utf8, written, NULL, NULL, &err); - if ( NULL == filename) - { - g_warning ("Cannot convert filename from UTF8 to filename encoding: %s", - err->message); - g_clear_error (&err); - } - } - - g_free (utf8); - - if ( filename == NULL) - filename = xstrdup (arg); - - psppire_window_load (PSPPIRE_WINDOW (the_data_window), filename); - - g_free (filename); - break; - } - default: - return ARGP_ERR_UNKNOWN; + GError *err = NULL; + filename = g_filename_from_utf8 (utf8, written, NULL, NULL, &err); + if ( NULL == filename) + { + g_warning ("Cannot convert filename from UTF8 to filename encoding: %s", + err->message); + g_clear_error (&err); + } } - return 0; -} + g_free (utf8); -const struct argp non_option_argp = {NULL, parse_non_options, 0, 0, 0, 0, 0}; + if ( filename == NULL) + filename = xstrdup (arg); + + psppire_window_load (PSPPIRE_WINDOW (the_data_window), filename); + + g_free (filename); +} diff --git a/src/ui/gui/psppire.h b/src/ui/gui/psppire.h index 27a633f2ec..ee747ef906 100644 --- a/src/ui/gui/psppire.h +++ b/src/ui/gui/psppire.h @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2004, 2005, 2006, 2009 Free Software Foundation + Copyright (C) 2004, 2005, 2006, 2009, 2010 Free Software Foundation This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,12 +17,9 @@ #ifndef PSPPIRE_H #define PSPPIRE_H -#include +struct source_stream; -struct command_line_processor ; -extern const struct argp non_option_argp ; - -void initialize (struct command_line_processor *, int argc, char **argv); +void initialize (struct source_stream *, const char *data_file); void de_initialize (void); void psppire_quit (void); diff --git a/src/ui/source-init-opts.c b/src/ui/source-init-opts.c index 61a108e0ee..c91a9fef1a 100644 --- a/src/ui/source-init-opts.c +++ b/src/ui/source-init-opts.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2008 Free Software Foundation + Copyright (C) 2008, 2010 Free Software Foundation This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -15,121 +15,103 @@ along with this program. If not, see . */ #include -#include + #include "source-init-opts.h" + #include -#include -#include -#include -#include -#include #include -#include -#include -#include -#include -#include -#include -#include -#include +#include + +#include "data/file-name.h" +#include "data/por-file-reader.h" +#include "data/settings.h" +#include "data/sys-file-reader.h" +#include "language/syntax-file.h" +#include "language/syntax-string-source.h" +#include "libpspp/assertion.h" +#include "libpspp/argv-parser.h" +#include "libpspp/getl.h" +#include "libpspp/llx.h" +#include "libpspp/message.h" +#include "ui/syntax-gen.h" + +#include "gl/error.h" +#include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid -static const struct argp_option post_init_options [] = { - {"algorithm", 'a', "{compatible|enhanced}", 0, N_("set to `compatible' if you want output calculated from broken algorithms"), 0}, - {"include", 'I', "DIR", 0, N_("Append DIR to include path"), 0}, - {"no-include", 'I', 0, 0, N_("Clear include path"), 0}, - {"no-statrc", 'r', 0, 0, N_("Disable execution of .pspp/rc at startup"), 0}, - {"config-dir", 'B', "DIR", 0, N_("Set configuration directory to DIR"), 0}, - {"safer", 's', 0, 0, N_("Don't allow some unsafe operations"), 0}, - {"syntax", 'x', "{compatible|enhanced}", 0, N_("Set to `compatible' if you want only to accept SPSS compatible syntax"), 0}, - { 0, 0, 0, 0, 0, 0 } -}; - -static error_t -parse_post_init_opts (int key, char *arg, struct argp_state *state) -{ - struct source_init +enum { - bool process_statrc; + OPT_ALGORITHM, + OPT_INCLUDE, + OPT_NO_INCLUDE, + OPT_SAFER, + OPT_SYNTAX, + N_SOURCE_INIT_OPTIONS }; - struct source_init *sip = state->hook; - - struct source_stream *ss = state->input; +static const struct argv_option source_init_options[N_SOURCE_INIT_OPTIONS] = + { + {"algorithm", 'a', required_argument, OPT_ALGORITHM}, + {"include", 'I', required_argument, OPT_INCLUDE}, + {"no-include", 0, no_argument, OPT_NO_INCLUDE}, + {"safer", 's', no_argument, OPT_SAFER}, + {"syntax", 'x', required_argument, OPT_SYNTAX}, + }; - if ( state->input == NULL) - return 0; +static void +source_init_option_callback (int id, void *ss_) +{ + struct source_stream *ss = ss_; - switch (key) + switch (id) { - case ARGP_KEY_INIT: - state->hook = sip = xzalloc (sizeof (struct source_init)); - sip->process_statrc = true; - break; - case ARGP_KEY_FINI: - free (sip); - break; - case 'a': - if ( 0 == strcmp (arg, "compatible") ) + case OPT_ALGORITHM: + if (!strcmp (optarg, "compatible")) settings_set_algorithm (COMPATIBLE); - else if ( 0 == strcmp (arg, "enhanced")) + else if (!strcmp (optarg, "enhanced")) settings_set_algorithm (ENHANCED); else - { - argp_failure (state, 1, 0, _("Algorithm must be either \"compatible\" or \"enhanced\".")); - } - break; - case 'B': - config_path = arg; + error (1, 0, + _("Algorithm must be either \"compatible\" or \"enhanced\".")); break; - case 'I': - if (arg == NULL || !strcmp (arg, "-")) + + case OPT_INCLUDE: + if (!strcmp (optarg, "-")) getl_clear_include_path (ss); else - getl_add_include_dir (ss, arg); + getl_add_include_dir (ss, optarg); break; - case 'r': - sip->process_statrc = false; - break; - case ARGP_KEY_SUCCESS: - if (sip->process_statrc) - { - char *pspprc_fn = fn_search_path ("rc", config_path); - if (pspprc_fn != NULL) - { - getl_append_source (ss, - create_syntax_file_source (pspprc_fn), - GETL_BATCH, - ERRMODE_CONTINUE - ); - - free (pspprc_fn); - } - } + + case OPT_NO_INCLUDE: + getl_clear_include_path (ss); break; - case 's': + + case OPT_SAFER: settings_set_safer_mode (); break; - case 'x': - if ( 0 == strcmp (arg, "compatible") ) + + case OPT_SYNTAX: + if (!strcmp (optarg, "compatible") ) settings_set_syntax (COMPATIBLE); - else if ( 0 == strcmp (arg, "enhanced")) + else if (!strcmp (optarg, "enhanced")) settings_set_syntax (ENHANCED); else - { - argp_failure (state, 1, 0, _("Syntax must be either \"compatible\" or \"enhanced\".")); - } + error (1, 0, + _("Syntax must be either \"compatible\" or \"enhanced\".")); break; + default: - return ARGP_ERR_UNKNOWN; + NOT_REACHED (); } - - return 0; } -const struct argp post_init_argp = - {post_init_options, parse_post_init_opts, 0, 0, 0, 0, 0}; - +void +source_init_register_argv_parser (struct argv_parser *ap, + struct source_stream *ss) +{ + argv_parser_add_options (ap, source_init_options, N_SOURCE_INIT_OPTIONS, + source_init_option_callback, ss); +} diff --git a/src/ui/source-init-opts.h b/src/ui/source-init-opts.h index 874935313a..cfd87f3fa0 100644 --- a/src/ui/source-init-opts.h +++ b/src/ui/source-init-opts.h @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2008 Free Software Foundation + Copyright (C) 2008, 2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -15,10 +15,13 @@ along with this program. If not, see . */ -#ifndef SOURCE_INIT_OPTS -#define SOURCE_INIT_OPTS +#ifndef UI_SOURCE_INIT_OPTS +#define UI_SOURCE_INIT_OPTS -extern const struct argp post_init_argp; +struct argv_parser; +struct source_stream; -#endif +void source_init_register_argv_parser (struct argv_parser *, + struct source_stream *); +#endif /* ui/source/source-init-opts.h */ diff --git a/src/ui/terminal/main.c b/src/ui/terminal/main.c index 1366bd7aad..10b3b7e9ab 100644 --- a/src/ui/terminal/main.c +++ b/src/ui/terminal/main.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006, 2007, 2009 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,35 +29,34 @@ #include #endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "fatal-signal.h" -#include "progname.h" -#include "relocatable.h" +#include "data/dictionary.h" +#include "data/file-handle-def.h" +#include "data/file-name.h" +#include "data/procedure.h" +#include "data/settings.h" +#include "data/variable.h" +#include "gsl/gsl_errno.h" +#include "language/command.h" +#include "language/lexer/lexer.h" +#include "language/prompt.h" +#include "libpspp/argv-parser.h" +#include "libpspp/compiler.h" +#include "libpspp/getl.h" +#include "libpspp/i18n.h" +#include "libpspp/message.h" +#include "libpspp/version.h" +#include "math/random.h" +#include "output/driver.h" +#include "ui/debugger.h" +#include "ui/source-init-opts.h" +#include "ui/terminal/msg-ui.h" +#include "ui/terminal/read-line.h" +#include "ui/terminal/terminal-opts.h" +#include "ui/terminal/terminal.h" + +#include "gl/fatal-signal.h" +#include "gl/progname.h" +#include "gl/relocatable.h" #include "gettext.h" #define _(msgid) gettext (msgid) @@ -76,15 +75,14 @@ static struct dataset * the_dataset = NULL; static struct lexer *the_lexer; static struct source_stream *the_source_stream ; -const char *argp_program_version = version; -const char *argp_program_bug_address = PACKAGE_BUGREPORT; - /* Program entry point. */ int main (int argc, char **argv) { int *view_width_p, *view_length_p; - struct command_line_processor *clp; + struct terminal_opts *terminal_opts; + struct argv_parser *parser; + set_program_name (argv[0]); signal (SIGABRT, bug_handler); @@ -96,12 +94,8 @@ main (int argc, char **argv) fpu_init (); gsl_set_error_handler_off (); - fn_init (); fh_init (); - the_source_stream = - create_source_stream ( - fn_getenv_default ("STAT_INCLUDE_PATH", include_path) - ); + the_source_stream = create_source_stream (); prompt_init (); readln_initialize (); terminal_init (&view_width_p, &view_length_p); @@ -110,21 +104,13 @@ main (int argc, char **argv) the_dataset = create_dataset (); - - - clp = command_line_processor_create (_("PSPP --- A program for statistical analysis"), - _("FILE1, FILE2 ... FILEn"), NULL); - - command_line_processor_add_options (clp, &io_argp, - _("Options affecting input and output locations:"), the_source_stream); - - command_line_processor_add_options (clp, &test_argp, - _("Diagnostic options:"), the_source_stream); - - command_line_processor_add_options (clp, &post_init_argp, - _("Options affecting syntax and behavior:"), the_source_stream); - - command_line_processor_parse (clp, argc, argv); + parser = argv_parser_create (); + terminal_opts = terminal_opts_init (parser, the_source_stream); + source_init_register_argv_parser (parser, the_source_stream); + if (!argv_parser_run (parser, argc, argv)) + exit (EXIT_FAILURE); + terminal_opts_done (terminal_opts, argc, argv); + argv_parser_destroy (parser); msg_ui_init (the_source_stream); diff --git a/src/ui/terminal/msg-ui.c b/src/ui/terminal/msg-ui.c index 383ccb8cd3..b5280fe6bb 100644 --- a/src/ui/terminal/msg-ui.c +++ b/src/ui/terminal/msg-ui.c @@ -92,14 +92,15 @@ check_msg_count (struct source_stream *ss) { if (!getl_is_interactive (ss)) { - if (settings_get_errorbreak () && error_count) - msg (MN, _("Terminating execution of syntax file due to error.")); - else if (error_count > settings_get_mxerrs () ) + int max_errors = settings_get_max_messages (MSG_S_ERROR); + int max_warnings = settings_get_max_messages (MSG_S_WARNING); + + if (error_count > max_errors) msg (MN, _("Errors (%d) exceed limit (%d)."), - error_count, settings_get_mxerrs ()); - else if (error_count + warning_count > settings_get_mxwarns () ) + error_count, max_errors); + else if (error_count + warning_count > max_warnings) msg (MN, _("Warnings (%d) exceed limit (%d)."), - error_count + warning_count, settings_get_mxwarns () ); + error_count + warning_count, max_warnings); else return; @@ -143,20 +144,22 @@ handle_msg (const struct msg *m) struct severity { + enum settings_output_type type; const char *name; /* How to identify this severity. */ int *count; /* Number of msgs with this severity so far. */ }; static struct severity severities[] = { - {N_("error"), &error_count}, /* MSG_ERROR. */ - {N_("warning"), &warning_count}, /* MSG_WARNING. */ - {NULL, NULL}, /* MSG_NOTE. */ + { SETTINGS_OUTPUT_ERROR, N_("error"), &error_count }, + { SETTINGS_OUTPUT_ERROR, N_("warning"), &warning_count }, + { SETTINGS_OUTPUT_NOTE, NULL, NULL}, }; const struct category *category = &categories[m->category]; const struct severity *severity = &severities[m->severity]; struct string string = DS_EMPTY_INITIALIZER; + enum settings_output_devices routing; if (category->show_file_location && m->where.file_name) { @@ -177,21 +180,22 @@ handle_msg (const struct msg *m) ds_put_cstr (&string, m->text); - if (msg_file != stdout || settings_get_error_routing_to_terminal ()) + routing = settings_get_output_routing (severity->type); + if (msg_file != stdout || routing & SETTINGS_DEVICE_TERMINAL) dump_message (ds_cstr (&string), isatty (fileno (msg_file)) ? settings_get_viewwidth () : INT_MAX, 8, write_stream, msg_file); dump_message (ds_cstr (&string), 78, 0, write_journal, NULL); - if (settings_get_error_routing_to_listing ()) + if (routing & SETTINGS_DEVICE_LISTING) { - /* Disable screen output devices, because the error should - already have been reported to the screen with the - dump_message call above. */ - output_set_type_enabled (false, OUTPUT_DEVICE_SCREEN); + /* Disable terminal output devices, because the error should already have + been reported to the terminal with the dump_message call above. */ + settings_set_output_routing (severity->type, + routing & ~SETTINGS_DEVICE_TERMINAL); tab_output_text (TAB_LEFT, ds_cstr (&string)); - output_set_type_enabled (true, OUTPUT_DEVICE_SCREEN); + settings_set_output_routing (severity->type, routing); } ds_destroy (&string); diff --git a/src/ui/terminal/terminal-opts.c b/src/ui/terminal/terminal-opts.c index c55dc57fd2..886bcdc2fe 100644 --- a/src/ui/terminal/terminal-opts.c +++ b/src/ui/terminal/terminal-opts.c @@ -18,192 +18,319 @@ #include "terminal-opts.h" -#include #include #include #include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include + +#include "data/settings.h" +#include "data/file-name.h" +#include "language/syntax-file.h" +#include "libpspp/argv-parser.h" +#include "libpspp/assertion.h" +#include "libpspp/compiler.h" +#include "libpspp/getl.h" +#include "libpspp/llx.h" +#include "libpspp/str.h" +#include "libpspp/string-array.h" +#include "libpspp/string-map.h" +#include "libpspp/string-set.h" +#include "libpspp/version.h" +#include "output/driver.h" +#include "output/driver-provider.h" +#include "ui/terminal/msg-ui.h" +#include "ui/terminal/read-line.h" #include "gl/error.h" +#include "gl/progname.h" +#include "gl/version-etc.h" +#include "gl/xmemdup0.h" #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid -static const struct argp_option test_options [] = +struct terminal_opts { - {"testing-mode", 'T', 0, OPTION_HIDDEN, 0, 0}, + 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 process_statrc; + }; - { 0, 0, 0, 0, 0, 0 } +enum + { + OPT_TESTING_MODE, + OPT_ERROR_FILE, + OPT_OUTPUT, + OPT_OUTPUT_OPTION, + OPT_INTERACTIVE, + OPT_NO_STATRC, + OPT_HELP, + OPT_VERSION, + N_TERMINAL_OPTIONS }; -static error_t -parse_test_opts (int key, char *arg, struct argp_state *state) +static struct argv_option terminal_argv_options[N_TERMINAL_OPTIONS] = + { + {"testing-mode", 0, no_argument, OPT_TESTING_MODE}, + {"error-file", 'e', required_argument, OPT_ERROR_FILE}, + {"output", 'o', required_argument, OPT_OUTPUT}, + {NULL, 'O', required_argument, OPT_OUTPUT_OPTION}, + {"interactive", 'i', no_argument, OPT_INTERACTIVE}, + {"no-statrc", 'r', no_argument, OPT_NO_STATRC}, + {"help", 'h', no_argument, OPT_HELP}, + {"version", 'V', no_argument, OPT_VERSION}, + }; + +static void +register_output_driver (struct terminal_opts *to) { - switch (key) + if (!string_map_is_empty (&to->options)) { - case 'T': - settings_set_testing_mode (true); - break; - default: - return ARGP_ERR_UNKNOWN; - } - - return 0; -} + struct output_driver *driver; -static const struct argp_option io_options [] = - { - {"error-file", 'e', "FILE", 0, - N_("Send error messages to FILE (appended)"), 0}, + driver = output_driver_create (&to->options); + if (driver != NULL) + { + output_driver_register (driver); - {"device", 'o', "DEVICE", 0, - N_("Select output driver DEVICE and disable defaults"), 0}, + to->has_output_driver = true; + if (driver->device_type == SETTINGS_DEVICE_TERMINAL) + to->has_terminal_driver = true; + } + string_map_clear (&to->options); + } +} - {"list", 'l', 0, 0, - N_("Print a list of known driver classes, then exit"), 0}, +static void +parse_output_option (struct terminal_opts *to, const char *option) +{ + const char *equals; + char *key, *value; - {"interactive", 'i', 0, 0, N_("Start an interactive session"), 0}, + equals = strchr (option, '='); + if (equals == NULL) + { + error (0, 0, _("%s: output option missing `='"), option); + return; + } - { 0, 0, 0, 0, 0, 0 } - }; + key = xmemdup0 (option, equals - option); + if (string_map_contains (&to->options, key)) + { + error (0, 0, _("%s: output option %s specified more than twice"), key); + free (key); + return; + } + value = xmemdup0 (equals + 1, strlen (equals + 1)); + string_map_insert_nocopy (&to->options, key, value); +} -static error_t -parse_io_opts (int key, char *arg, struct argp_state *state) +static char * +get_supported_formats (void) { - struct source_init - { - struct llx_list file_list; - bool interactive; - - /* Output devices. */ - struct string_map macros; - struct string_set drivers; - }; - - struct fn_element { - struct ll ll; - const char *fn; - }; + const struct string_set_node *node; + struct string_array format_array; + 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); + output_get_supported_formats (&format_set); + + /* Converted supported formats to sorted array. */ + string_array_init (&format_array); + STRING_SET_FOR_EACH (format, node, &format_set) + string_array_append (&format_array, format); + string_array_sort (&format_array); + string_set_destroy (&format_set); + + /* Converted supported formats to string. */ + format_string = string_array_join (&format_array, " "); + string_array_destroy (&format_array); + return format_string; +} - struct source_init *sip = state->hook; +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); +} - struct source_stream *ss = state->input; +static void +usage (void) +{ + char *supported_formats = get_supported_formats (); + char *default_include_path = get_default_include_path (); + + printf ("\ +PSPP, a program for statistical analysis of sample data.\n\ +Usage: %s [OPTION]... FILE...\n\ +\n\ +Arguments to long options also apply to equivalent short options.\n\ +\n\ +Output options:\n\ + -o, --output=FILE output to FILE, default format from FILE's name\n\ + -O format=FORMAT override format for previous -o\n\ + -O OPTION=VALUE set output option to customize previous -o\n\ + -O device={terminal|listing} override device type for previous -o\n\ + -e, --error-file=FILE append errors, warnings, and notes to FILE\n\ +Supported output formats: %s\n\ +\n\ +Language options:\n\ + -I, --include=DIR append DIR to search path\n\ + -I-, --no-include clear search path\n\ + -r, --no-statrc disable running rc file at startup\n\ + -a, --algorithm={compatible|enhanced}\n\ + set to `compatible' if you want output\n\ + calculated from broken algorithms\n\ + -x, --syntax={compatible|enhanced}\n\ + set to `compatible' to disable PSPP extensions\n\ + -i, --interactive interpret syntax in interactive mode\n\ + -s, --safer don't allow some unsafe operations\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); + + free (supported_formats); + free (default_include_path); + + emit_bug_reporting_address (); + exit (EXIT_SUCCESS); +} - struct command_line_processor *clp = get_subject (state); +static void +terminal_option_callback (int id, void *to_) +{ + struct terminal_opts *to = to_; - switch (key) + switch (id) { - case ARGP_KEY_INIT: - state->hook = sip = xzalloc (sizeof (struct source_init)); - llx_init (&sip->file_list); - string_map_init (&sip->macros); - string_set_init (&sip->drivers); - break; - case ARGP_KEY_ARG: - if (strchr (arg, '=')) - { - if (!output_define_macro (arg, &sip->macros)) - error (0, 0, _("\"%s\" is not a valid macro definition"), arg); - } - else - { - llx_push_tail (&sip->file_list, arg, &llx_malloc_mgr); - } - break; - case ARGP_KEY_SUCCESS: - { - struct llx *llx = llx_null (&sip->file_list); - while ((llx = llx_next (llx)) != llx_null (&sip->file_list)) - { - const char *fn = llx_data (llx); - /* Assume it's a syntax file */ - getl_append_source (ss, - create_syntax_file_source (fn), - GETL_BATCH, - ERRMODE_CONTINUE - ); - - } - - if (sip->interactive || llx_is_empty (&sip->file_list)) - { - getl_append_source (ss, create_readln_source (), - GETL_INTERACTIVE, - ERRMODE_CONTINUE - ); - - string_set_insert (&sip->drivers, "interactive"); - } - - if (!settings_get_testing_mode ()) - output_read_configuration (&sip->macros, &sip->drivers); - else - output_configure_driver ("csv:csv::"); - - string_map_destroy (&sip->macros); - string_set_destroy (&sip->drivers); - } + case OPT_TESTING_MODE: + settings_set_testing_mode (true); break; - case ARGP_KEY_FINI: - free (sip); + + case OPT_ERROR_FILE: + msg_ui_set_error_file (optarg); break; - case 'e': - msg_ui_set_error_file (arg); + + case OPT_OUTPUT: + register_output_driver (to); + string_map_insert (&to->options, "output-file", optarg); break; - case 'i': - sip->interactive = true; + + case OPT_OUTPUT_OPTION: + parse_output_option (to, optarg); break; - case 'l': - output_list_classes (); + + case OPT_INTERACTIVE: + to->syntax_mode = GETL_INTERACTIVE; break; - case 'o': - string_set_insert (&sip->drivers, arg); + + case OPT_NO_STATRC: + to->process_statrc = false; break; + + case OPT_HELP: + usage (); + exit (EXIT_SUCCESS); + + case OPT_VERSION: + version_etc (stdout, "pspp", PACKAGE_NAME, PACKAGE_VERSION, + "Ben Pfaff", "John Darrington", "Jason Stover", + (char *) NULL); + exit (EXIT_SUCCESS); + default: - return ARGP_ERR_UNKNOWN; + NOT_REACHED (); } - - return 0; } -const struct argp io_argp = {io_options, parse_io_opts, 0, 0, 0, 0, 0}; -const struct argp test_argp = {test_options, parse_test_opts, 0, 0, 0, 0, 0}; - -#if 0 -static const struct argp_child children [] = - { - {&io_argp, 0, N_("Options affecting input and output locations:"), 0}, - {&test_argp, 0, N_("Diagnostic options:"), 0}, - {0, 0, 0, 0} - }; +struct terminal_opts * +terminal_opts_init (struct argv_parser *ap, struct source_stream *ss) +{ + struct terminal_opts *to; + + to = xmalloc (sizeof *to); + to->source_stream = ss; + to->syntax_mode = GETL_BATCH; + string_map_init (&to->options); + to->has_output_driver = false; + to->process_statrc = true; + + 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); +} -static error_t -propagate_aux (int key, char *arg, struct argp_state *state) +void +terminal_opts_done (struct terminal_opts *to, int argc, char *argv[]) { - if ( key == ARGP_KEY_INIT) + if (to->process_statrc) { - int i; - for (i = 0 ; i < sizeof (children) / sizeof (children[0]) - 1 ; ++i) - state->child_inputs[i] = state->input; + 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); + } } - return ARGP_ERR_UNKNOWN; -} + if (optind < argc) + { + int i; + + for (i = optind; i < argc; i++) + add_syntax_file (to, argv[i]); + } + else + add_syntax_file (to, "-"); -const struct argp terminal_argp = {NULL, propagate_aux, 0, 0, children, 0, 0}; + register_output_driver (to); + if (!to->has_output_driver) + { + string_map_insert (&to->options, "output-file", "-"); + string_map_insert (&to->options, "format", "txt"); + register_output_driver (to); + } -#endif + string_map_destroy (&to->options); + free (to); +} diff --git a/src/ui/terminal/terminal-opts.h b/src/ui/terminal/terminal-opts.h index e5d032d18e..12251123db 100644 --- a/src/ui/terminal/terminal-opts.h +++ b/src/ui/terminal/terminal-opts.h @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2008 Free Software Foundation + Copyright (C) 2008, 2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -15,13 +15,15 @@ along with this program. If not, see . */ -#ifndef TERMINAL_OPTS -#define TERMINAL_OPTS +#ifndef UI_TERMINAL_TERMINAL_OPTS_H +#define UI_TERMINAL_TERMINAL_OPTS_H 1 -extern const struct argp io_argp ; -extern const struct argp test_argp ; +struct argv_parser; +struct source_stream; +struct terminal_opts; -extern const struct argp terminal_argp; - -#endif +struct terminal_opts *terminal_opts_init (struct argv_parser *, + struct source_stream *); +void terminal_opts_done (struct terminal_opts *, int argc, char *argv[]); +#endif /* ui/terminal/terminal-opts.h */ diff --git a/tests/bugs/agg-crash-2.sh b/tests/bugs/agg-crash-2.sh index 0bb8962f38..98bd8dcfe3 100755 --- a/tests/bugs/agg-crash-2.sh +++ b/tests/bugs/agg-crash-2.sh @@ -74,7 +74,7 @@ LIST /x y. EOF if [ $? -ne 0 ] ; then no_result ; fi -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare output" diff --git a/tests/bugs/agg_crash.sh b/tests/bugs/agg_crash.sh index 43fd9f8c47..449e90e949 100755 --- a/tests/bugs/agg_crash.sh +++ b/tests/bugs/agg_crash.sh @@ -76,7 +76,7 @@ if [ $? -ne 0 ] ; then no_result ; fi # So this will have a non zero error status. # But it shouldn't crash! activity="run_program" -$SUPERVISOR $PSPP --testing-mode -e /dev/null $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv -e /dev/null $TESTFILE if [ $? -ne 1 ] ; then fail ; fi diff --git a/tests/bugs/alpha-freq.sh b/tests/bugs/alpha-freq.sh index ae60e79ce4..e3adb6ef37 100755 --- a/tests/bugs/alpha-freq.sh +++ b/tests/bugs/alpha-freq.sh @@ -73,7 +73,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/prog.sps +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/prog.sps if [ $? -ne 0 ] ; then fail ; fi diff --git a/tests/bugs/big-input-2.sh b/tests/bugs/big-input-2.sh index b0da13bbf3..c400e2e905 100755 --- a/tests/bugs/big-input-2.sh +++ b/tests/bugs/big-input-2.sh @@ -84,7 +84,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode -e /dev/null $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv -e /dev/null $TESTFILE if [ $? -ne 0 ] ; then fail ; fi activity="appending to data" @@ -93,7 +93,7 @@ $PERL -e 'for ($i=0; $i<25000; $i++) { print "AB04\nAB12\n" };' >> $TEMPDIR/larg if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode -e /dev/null $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv -e /dev/null $TESTFILE if [ $? -ne 0 ] ; then fail ; fi pass; diff --git a/tests/bugs/big-input.sh b/tests/bugs/big-input.sh index 3c9365dfce..9cc3ad9307 100755 --- a/tests/bugs/big-input.sh +++ b/tests/bugs/big-input.sh @@ -75,7 +75,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode -e /dev/null $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv -e /dev/null $TESTFILE if [ $? -ne 0 ] ; then fail ; fi pass; diff --git a/tests/bugs/case-map.sh b/tests/bugs/case-map.sh index 011c344d05..17f4fedf64 100755 --- a/tests/bugs/case-map.sh +++ b/tests/bugs/case-map.sh @@ -72,7 +72,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode -e /dev/null $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv -e /dev/null $TESTFILE if [ $? -ne 0 ] ; then fail ; fi pass; diff --git a/tests/bugs/comment-at-eof.sh b/tests/bugs/comment-at-eof.sh index 342f9bc08a..f28762d194 100755 --- a/tests/bugs/comment-at-eof.sh +++ b/tests/bugs/comment-at-eof.sh @@ -63,7 +63,7 @@ COMMENT this is a comment at end of file. EOF if [ $? -ne 0 ] ; then no_result ; fi -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then fail; fi pass; diff --git a/tests/bugs/compression.sh b/tests/bugs/compression.sh index 71f9eab48d..d8c838888e 100755 --- a/tests/bugs/compression.sh +++ b/tests/bugs/compression.sh @@ -74,7 +74,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then fail ; fi # Make sure the file really was compressed diff --git a/tests/bugs/compute-fmt.sh b/tests/bugs/compute-fmt.sh index 0d4a313e26..2417cca92b 100755 --- a/tests/bugs/compute-fmt.sh +++ b/tests/bugs/compute-fmt.sh @@ -70,7 +70,7 @@ SAVE outfile='$TEMPDIR/temp.sav'. EOF if [ $? -ne 0 ] ; then no_result ; fi -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then fail; fi diff --git a/tests/bugs/compute-lv.sh b/tests/bugs/compute-lv.sh index 88c42c3c1a..5bb1321437 100755 --- a/tests/bugs/compute-lv.sh +++ b/tests/bugs/compute-lv.sh @@ -74,7 +74,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run prog" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then fail ; fi diff --git a/tests/bugs/compute-sum.sh b/tests/bugs/compute-sum.sh index 83aeae048a..455ec39d09 100755 --- a/tests/bugs/compute-sum.sh +++ b/tests/bugs/compute-sum.sh @@ -72,7 +72,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/compute-sum.stat +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/compute-sum.stat if [ $? -ne 0 ] ; then no_result ; fi activity="compare output" diff --git a/tests/bugs/computebug.sh b/tests/bugs/computebug.sh index 4f8a5731fb..4ba6a9d1a3 100755 --- a/tests/bugs/computebug.sh +++ b/tests/bugs/computebug.sh @@ -73,7 +73,7 @@ LIST. EOF activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/bugs/crosstabs-crash.sh b/tests/bugs/crosstabs-crash.sh index f7d19d834c..5bebfed5c7 100755 --- a/tests/bugs/crosstabs-crash.sh +++ b/tests/bugs/crosstabs-crash.sh @@ -70,7 +70,7 @@ CROSSTABS VARIABLES X (1,7) Y (1,7) /TABLES X BY Y. EOF if [ $? -ne 0 ] ; then no_result ; fi -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/bugs/crosstabs-crash2.sh b/tests/bugs/crosstabs-crash2.sh index 910ec0bbc8..d283516153 100755 --- a/tests/bugs/crosstabs-crash2.sh +++ b/tests/bugs/crosstabs-crash2.sh @@ -75,7 +75,7 @@ CROSSTABS /TABLES = x BY y. EOF if [ $? -ne 0 ] ; then no_result ; fi -$SUPERVISOR $PSPP --testing-mode $TESTFILE > /dev/null +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE > /dev/null if [ $? -ne 0 ] ; then no_result ; fi diff -c $TEMPDIR/pspp.csv - << EOF diff --git a/tests/bugs/crosstabs.sh b/tests/bugs/crosstabs.sh index 3ef691f376..6f02a5087a 100755 --- a/tests/bugs/crosstabs.sh +++ b/tests/bugs/crosstabs.sh @@ -84,7 +84,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/ct.stat +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/ct.stat if [ $? -ne 0 ] ; then fail ; fi diff --git a/tests/bugs/crosstabs2.sh b/tests/bugs/crosstabs2.sh index 964cf23c06..bfb6f68576 100755 --- a/tests/bugs/crosstabs2.sh +++ b/tests/bugs/crosstabs2.sh @@ -76,7 +76,7 @@ CROSSTABS EOF if [ $? -ne 0 ] ; then no_result ; fi -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/bugs/curtailed.sh b/tests/bugs/curtailed.sh index 26de22b239..624f5a5ba6 100755 --- a/tests/bugs/curtailed.sh +++ b/tests/bugs/curtailed.sh @@ -74,7 +74,7 @@ if [ $? -ne 0 ] ; then no_result ; fi #This must fail activity="run program" -$SUPERVISOR $PSPP --testing-mode -e /dev/null $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv -e /dev/null $TESTFILE if [ $? -ne 1 ] ; then fail ; fi diff --git a/tests/bugs/data-crash.sh b/tests/bugs/data-crash.sh index dfdcbfdc60..15ba9e2cb5 100755 --- a/tests/bugs/data-crash.sh +++ b/tests/bugs/data-crash.sh @@ -67,7 +67,7 @@ if [ $? -ne 0 ] ; then no_result ; fi #This must fail activity="run program" -$SUPERVISOR $PSPP --testing-mode -e /dev/null $TEMPDIR/ct.stat +$SUPERVISOR $PSPP -o pspp.csv -e /dev/null $TEMPDIR/ct.stat if [ $? -ne 1 ] ; then fail ; fi pass; diff --git a/tests/bugs/double-frequency.sh b/tests/bugs/double-frequency.sh index ca958cd1ea..c579cf36b3 100755 --- a/tests/bugs/double-frequency.sh +++ b/tests/bugs/double-frequency.sh @@ -77,7 +77,7 @@ if [ $? -ne 0 ] ; then no_result ; fi cd $TEMPDIR activity="run data" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/ff.stat +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/ff.stat if [ $? -ne 0 ] ; then fail ; fi diff --git a/tests/bugs/empty-do-repeat.sh b/tests/bugs/empty-do-repeat.sh index b96b2feab2..ddc2e7a62f 100755 --- a/tests/bugs/empty-do-repeat.sh +++ b/tests/bugs/empty-do-repeat.sh @@ -71,7 +71,7 @@ if [ $? -ne 0 ] ; then no_result ; fi # Must not crash. activity="run program" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/repeat.stat +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/repeat.stat if [ $? -ne 0 ] ; then fail ; fi pass; diff --git a/tests/bugs/examine-1sample.sh b/tests/bugs/examine-1sample.sh index 49ce086c59..dd4449d80d 100755 --- a/tests/bugs/examine-1sample.sh +++ b/tests/bugs/examine-1sample.sh @@ -73,7 +73,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then fail ; fi pass diff --git a/tests/bugs/examine-crash.sh b/tests/bugs/examine-crash.sh index 6cd172fde5..03c51c6fe9 100755 --- a/tests/bugs/examine-crash.sh +++ b/tests/bugs/examine-crash.sh @@ -73,7 +73,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then fail ; fi diff --git a/tests/bugs/examine-crash2.sh b/tests/bugs/examine-crash2.sh index 01fe8f9a32..32f0e99fc4 100755 --- a/tests/bugs/examine-crash2.sh +++ b/tests/bugs/examine-crash2.sh @@ -74,7 +74,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then fail ; fi diff --git a/tests/bugs/examine-crash3.sh b/tests/bugs/examine-crash3.sh index 6093c34390..2afc044f90 100755 --- a/tests/bugs/examine-crash3.sh +++ b/tests/bugs/examine-crash3.sh @@ -75,7 +75,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then fail ; fi diff --git a/tests/bugs/examine-missing.sh b/tests/bugs/examine-missing.sh index 5e3edec3da..86b382e65b 100755 --- a/tests/bugs/examine-missing.sh +++ b/tests/bugs/examine-missing.sh @@ -74,7 +74,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode -e /dev/null $TESTFILE 2> /dev/null +$SUPERVISOR $PSPP -o pspp.csv -e /dev/null $TESTFILE 2> /dev/null if [ $? -ne 0 ] ; then fail ; fi pass; diff --git a/tests/bugs/examine-missing2.sh b/tests/bugs/examine-missing2.sh index c95cca1be8..2ea650c881 100755 --- a/tests/bugs/examine-missing2.sh +++ b/tests/bugs/examine-missing2.sh @@ -78,7 +78,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program 1" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare results" @@ -126,7 +126,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program 2" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then fail ; fi diff --git a/tests/bugs/freq-nolabels.sh b/tests/bugs/freq-nolabels.sh index b5c44b54ac..f6c2f002f2 100755 --- a/tests/bugs/freq-nolabels.sh +++ b/tests/bugs/freq-nolabels.sh @@ -77,7 +77,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/bugs/get-no-file.sh b/tests/bugs/get-no-file.sh index d047b76758..88e539c159 100755 --- a/tests/bugs/get-no-file.sh +++ b/tests/bugs/get-no-file.sh @@ -68,7 +68,7 @@ if [ $? -ne 0 ] ; then no_result ; fi # We use the stdinput here, because the bug seems to manifest itself only in # interactive mode. activity="run program" -cat $TESTFILE | $SUPERVISOR $PSPP --testing-mode > /dev/null -if [ $? -ne 0 ] ; then fail ; fi +cat $TESTFILE | $SUPERVISOR $PSPP -o pspp.csv > /dev/null +if [ $? -ne 1 ] ; then fail ; fi pass diff --git a/tests/bugs/get.sh b/tests/bugs/get.sh index 86b39c661d..aa76a8c0c7 100755 --- a/tests/bugs/get.sh +++ b/tests/bugs/get.sh @@ -87,7 +87,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/bugs/html-frequency.sh b/tests/bugs/html-frequency.sh index 789fe32c74..3417601ae4 100755 --- a/tests/bugs/html-frequency.sh +++ b/tests/bugs/html-frequency.sh @@ -77,7 +77,7 @@ if [ $? -ne 0 ] ; then no_result ; fi cd $TEMPDIR activity="run data" -$SUPERVISOR $PSPP -o html $TESTFILE +$SUPERVISOR $PSPP -o pspp.html $TESTFILE if [ $? -ne 0 ] ; then fail ; fi diff --git a/tests/bugs/if_crash.sh b/tests/bugs/if_crash.sh index 4f07d30281..9882d0da70 100755 --- a/tests/bugs/if_crash.sh +++ b/tests/bugs/if_crash.sh @@ -80,7 +80,7 @@ if [ $? -ne 0 ] ; then no_result ; fi # So this will have a non zero error status. # But it shouldn't crash! activity="run_program" -$SUPERVISOR $PSPP --testing-mode -e /dev/null $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv -e /dev/null $TESTFILE if [ $? -ne 1 ] ; then fail ; fi diff --git a/tests/bugs/input-crash.sh b/tests/bugs/input-crash.sh index 600ca72945..947e782b9c 100755 --- a/tests/bugs/input-crash.sh +++ b/tests/bugs/input-crash.sh @@ -73,7 +73,7 @@ if [ $? -ne 0 ] ; then no_result ; fi # The above syntax is invalid, so this program should fail to parse activity="run program" -$SUPERVISOR $PSPP --testing-mode -e /dev/null $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv -e /dev/null $TESTFILE if [ $? -ne 1 ] ; then fail ; fi @@ -92,7 +92,7 @@ if [ $? -ne 0 ] ; then no_result ; fi # The above syntax is invalid, so this program should fail to parse activity="run program 2" -$SUPERVISOR $PSPP --testing-mode -e /dev/null $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv -e /dev/null $TESTFILE if [ $? -ne 1 ] ; then fail ; fi diff --git a/tests/bugs/keep-all.sh b/tests/bugs/keep-all.sh index 408255d2a2..dce4177496 100755 --- a/tests/bugs/keep-all.sh +++ b/tests/bugs/keep-all.sh @@ -73,7 +73,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run PSPP ($mode)" - $SUPERVISOR $PSPP --testing-mode $TESTFILE + $SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/bugs/lag_crash.sh b/tests/bugs/lag_crash.sh index 73bce14723..e848639cdf 100755 --- a/tests/bugs/lag_crash.sh +++ b/tests/bugs/lag_crash.sh @@ -74,7 +74,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run_program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then fail ; fi diff --git a/tests/bugs/list-overflow.sh b/tests/bugs/list-overflow.sh index e89ecadf81..296952ce01 100755 --- a/tests/bugs/list-overflow.sh +++ b/tests/bugs/list-overflow.sh @@ -78,7 +78,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then fail ; fi pass; diff --git a/tests/bugs/match-files-scratch.sh b/tests/bugs/match-files-scratch.sh index 6eb5b43994..25b0dcfbaa 100755 --- a/tests/bugs/match-files-scratch.sh +++ b/tests/bugs/match-files-scratch.sh @@ -78,7 +78,7 @@ FINISH. EOF if [ $? -ne 0 ] ; then no_result ; fi -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/bugs/multipass.sh b/tests/bugs/multipass.sh index 11e274067e..1ec496eb7b 100755 --- a/tests/bugs/multipass.sh +++ b/tests/bugs/multipass.sh @@ -78,7 +78,7 @@ DESCRIPTIVES EOF if [ $? -ne 0 ] ; then no_result ; fi -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/bugs/overwrite-input-file.sh b/tests/bugs/overwrite-input-file.sh index a255b2fcda..27795114aa 100755 --- a/tests/bugs/overwrite-input-file.sh +++ b/tests/bugs/overwrite-input-file.sh @@ -77,7 +77,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program 1" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="check and save copy of output files" @@ -103,7 +103,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program 2" -{ $SUPERVISOR $PSPP --testing-mode $TESTFILE -e /dev/null; } >/dev/null 2>&1 +{ $SUPERVISOR $PSPP -o pspp.csv $TESTFILE -e /dev/null; } >/dev/null 2>&1 # PSPP should have terminated with a signal. POSIX requires that the exit # status of a process terminated by a signal be greater than 128. if [ $? -le 128 ] ; then no_result ; fi @@ -142,7 +142,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program 3" -$SUPERVISOR $PSPP --testing-mode $TESTFILE -e /dev/null +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE -e /dev/null if [ $? -ne 0 ] ; then no_result ; fi activity="check for remaining temporary files" @@ -162,7 +162,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program 4" -$SUPERVISOR $PSPP --testing-mode $TESTFILE -e /dev/null +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE -e /dev/null if [ $? -ne 0 ] ; then no_result ; fi activity="compare output" diff --git a/tests/bugs/overwrite-special-file.sh b/tests/bugs/overwrite-special-file.sh index a40eae66eb..8089a21aca 100755 --- a/tests/bugs/overwrite-special-file.sh +++ b/tests/bugs/overwrite-special-file.sh @@ -84,7 +84,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program 1" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="check that foo2.out was created" diff --git a/tests/bugs/piechart.sh b/tests/bugs/piechart.sh index 657e538349..0296de0d1b 100755 --- a/tests/bugs/piechart.sh +++ b/tests/bugs/piechart.sh @@ -85,7 +85,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program 1" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then fail ; fi diff --git a/tests/bugs/print-crash.sh b/tests/bugs/print-crash.sh index 22b2156607..0b66ddb19e 100755 --- a/tests/bugs/print-crash.sh +++ b/tests/bugs/print-crash.sh @@ -70,7 +70,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode -e /dev/null $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv -e /dev/null $TESTFILE if [ $? -ne 1 ] ; then fail ; fi diff --git a/tests/bugs/random.sh b/tests/bugs/random.sh index d2016edb42..7d931d460b 100755 --- a/tests/bugs/random.sh +++ b/tests/bugs/random.sh @@ -75,7 +75,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/bugs/recode-copy-bug.sh b/tests/bugs/recode-copy-bug.sh index e0a18b8ff6..6e6ac06eb3 100755 --- a/tests/bugs/recode-copy-bug.sh +++ b/tests/bugs/recode-copy-bug.sh @@ -97,7 +97,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program 1" -$SUPERVISOR $PSPP --testing-mode recode-copy-bug-1.stat +$SUPERVISOR $PSPP -o pspp.csv recode-copy-bug-1.stat if [ $? -ne 0 ] ; then no_result ; fi activity="compare output 1" @@ -119,7 +119,7 @@ if [ $? -ne 0 ] ; then fail ; fi activity="run program 2" -$SUPERVISOR $PSPP --testing-mode recode-copy-bug-2.stat +$SUPERVISOR $PSPP -o pspp.csv recode-copy-bug-2.stat if [ $? -ne 0 ] ; then no_result ; fi activity="compare output 2" diff --git a/tests/bugs/shbang.sh b/tests/bugs/shbang.sh index cc3fc5e2d7..b0961302ff 100755 --- a/tests/bugs/shbang.sh +++ b/tests/bugs/shbang.sh @@ -69,7 +69,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode -e /dev/null $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv -e /dev/null $TESTFILE if [ $? -ne 0 ] ; then fail ; fi diff --git a/tests/bugs/signals.sh b/tests/bugs/signals.sh index dedfc6c834..b6cddb2a41 100755 --- a/tests/bugs/signals.sh +++ b/tests/bugs/signals.sh @@ -59,7 +59,7 @@ mkdir -p $TEMPDIR cd $TEMPDIR activity="sending SIGINT to pspp" -echo 'host kill -INT $PPID' | $PSPP --testing-mode > /dev/null 2> $TEMPDIR/stderr1 +echo 'host kill -INT $PPID' | $PSPP -o pspp.csv > /dev/null 2> $TEMPDIR/stderr1 if [ $? -ne 0 ] ; then no_result ; fi # SIGINT should have caused a clean shutdown @@ -68,7 +68,7 @@ activity="checking for absence of error messages 1" if [ $? -ne 0 ] ; then fail ; fi activity="sending SIGSEGV to pspp" -echo 'host kill -SEGV $PPID' | $PSPP --testing-mode > /dev/null 2> $TEMPDIR/stderr2 +echo 'host kill -SEGV $PPID' | $PSPP -o pspp.csv > /dev/null 2> $TEMPDIR/stderr2 if [ $? -eq 0 ] ; then no_result ; fi # SIGSEGV should have caused an error message diff --git a/tests/bugs/t-test-alpha.sh b/tests/bugs/t-test-alpha.sh index 2a1693b5ac..205a7d4c75 100755 --- a/tests/bugs/t-test-alpha.sh +++ b/tests/bugs/t-test-alpha.sh @@ -82,7 +82,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare output" diff --git a/tests/bugs/t-test-alpha2.sh b/tests/bugs/t-test-alpha2.sh index c49103a882..0fdac2afcf 100755 --- a/tests/bugs/t-test-alpha2.sh +++ b/tests/bugs/t-test-alpha2.sh @@ -81,7 +81,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE > /dev/null +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE > /dev/null #invert v if [ $? -eq 0 ] ; then fail ; fi diff --git a/tests/bugs/t-test-alpha3.sh b/tests/bugs/t-test-alpha3.sh index b197c574f3..5504e6cc46 100755 --- a/tests/bugs/t-test-alpha3.sh +++ b/tests/bugs/t-test-alpha3.sh @@ -79,7 +79,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/bugs/t-test-paired.sh b/tests/bugs/t-test-paired.sh index c5555f6f58..47b096425c 100755 --- a/tests/bugs/t-test-paired.sh +++ b/tests/bugs/t-test-paired.sh @@ -73,7 +73,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/bugs/t-test-with-temp.sh b/tests/bugs/t-test-with-temp.sh index ba355580a6..3413a51ffb 100755 --- a/tests/bugs/t-test-with-temp.sh +++ b/tests/bugs/t-test-with-temp.sh @@ -75,7 +75,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="copy output" diff --git a/tests/bugs/t-test.sh b/tests/bugs/t-test.sh index e8c43ebca0..e4940c080d 100755 --- a/tests/bugs/t-test.sh +++ b/tests/bugs/t-test.sh @@ -77,7 +77,7 @@ if [ $? -ne 0 ] ; then no_result ; fi #The syntax was invalid. Therefore pspp must return non zero. activity="run program" -$SUPERVISOR $PSPP --testing-mode -e /dev/null $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv -e /dev/null $TESTFILE if [ $? -ne 1 ] ; then fail ; fi pass; diff --git a/tests/bugs/temp-freq.sh b/tests/bugs/temp-freq.sh index b0c91fd3f6..2027c0a3a0 100755 --- a/tests/bugs/temp-freq.sh +++ b/tests/bugs/temp-freq.sh @@ -83,7 +83,7 @@ FINISH EOF if [ $? -ne 0 ] ; then no_result ; fi -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff -c $TEMPDIR/pspp.csv - << EOF diff --git a/tests/bugs/temporary.sh b/tests/bugs/temporary.sh index 345ed852ca..96856d5a51 100755 --- a/tests/bugs/temporary.sh +++ b/tests/bugs/temporary.sh @@ -80,7 +80,7 @@ list. EOF if [ $? -ne 0 ] ; then no_result ; fi -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/bugs/unwritable-dir.sh b/tests/bugs/unwritable-dir.sh index 774b6230b6..3f3a40adcf 100755 --- a/tests/bugs/unwritable-dir.sh +++ b/tests/bugs/unwritable-dir.sh @@ -81,12 +81,12 @@ chmod u-w $TEMPDIR # on a single PSPP invocation, except that charts are only supported for # a single driver at a time, and we'd prefer to test chart support for # all of our driver types. -for driver in list-ascii list-ps html; do +for file in pspp.csv pspp.html pspp.odt pspp.pdf pspp.txt; do # PSPP will fail to create the output file. Currently this doesn't cause # PSPP's exit status to be nonzero, although this is arguably incorrect. # At any rate, PSPP should not crash. - activity="run pspp with $driver driver" - $SUPERVISOR $PSPP -o $driver test.pspp >/dev/null 2>&1 + activity="run pspp with $file driver" + $SUPERVISOR $PSPP -o $file test.pspp >/dev/null 2>&1 if [ $? -ne 0 ] ; then fail ; fi done diff --git a/tests/bugs/val-labs-trailing-slash.sh b/tests/bugs/val-labs-trailing-slash.sh index 7388caaa24..d552041e89 100755 --- a/tests/bugs/val-labs-trailing-slash.sh +++ b/tests/bugs/val-labs-trailing-slash.sh @@ -77,7 +77,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then fail ; fi pass diff --git a/tests/bugs/val-labs.sh b/tests/bugs/val-labs.sh index 4d57f661e7..1f07ca6d37 100755 --- a/tests/bugs/val-labs.sh +++ b/tests/bugs/val-labs.sh @@ -77,7 +77,7 @@ if [ $? -ne 0 ] ; then no_result ; fi #Invalid syntax --- return value is non zero. activity="run program" -$SUPERVISOR $PSPP --testing-mode -e /dev/null $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv -e /dev/null $TESTFILE if [ $? -ne 1 ] ; then fail ; fi pass; diff --git a/tests/command/add-files.sh b/tests/command/add-files.sh index f0542c0b00..d2b164bf4f 100755 --- a/tests/command/add-files.sh +++ b/tests/command/add-files.sh @@ -186,7 +186,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run $name.pspp" - $SUPERVISOR $PSPP --testing-mode $name.pspp + $SUPERVISOR $PSPP -o pspp.csv $name.pspp if [ $? -ne 0 ] ; then no_result ; fi activity="check $name output" diff --git a/tests/command/aggregate.sh b/tests/command/aggregate.sh index 48b0ef6e39..ba51161c6a 100755 --- a/tests/command/aggregate.sh +++ b/tests/command/aggregate.sh @@ -228,7 +228,7 @@ for outfile in scratch active external; do if [ $? -ne 0 ] ; then no_result ; fi activity="run $name.pspp" - $SUPERVISOR $PSPP --testing-mode -e /dev/null $name.pspp + $SUPERVISOR $PSPP -o pspp.csv -e /dev/null $name.pspp if [ $? -ne 0 ] ; then no_result ; fi activity="check $name output" diff --git a/tests/command/attributes.sh b/tests/command/attributes.sh index f3a39e2909..d4dece6c47 100755 --- a/tests/command/attributes.sh +++ b/tests/command/attributes.sh @@ -96,7 +96,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare output" diff --git a/tests/command/autorecod.sh b/tests/command/autorecod.sh index e4a86dfa68..6aaf8722a3 100755 --- a/tests/command/autorecod.sh +++ b/tests/command/autorecod.sh @@ -87,7 +87,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="test output" diff --git a/tests/command/beg-data.sh b/tests/command/beg-data.sh index e3933d8f2d..45752fc7a7 100755 --- a/tests/command/beg-data.sh +++ b/tests/command/beg-data.sh @@ -86,7 +86,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare data" diff --git a/tests/command/bignum.sh b/tests/command/bignum.sh index 41e1963c17..8caa95c490 100755 --- a/tests/command/bignum.sh +++ b/tests/command/bignum.sh @@ -138,7 +138,7 @@ foobar if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi # Like the above comments say ... diff --git a/tests/command/correlation.sh b/tests/command/correlation.sh index daec5de2aa..06c1d24519 100755 --- a/tests/command/correlation.sh +++ b/tests/command/correlation.sh @@ -94,7 +94,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program 1" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare results 1" @@ -162,7 +162,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program 2" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="copy results" @@ -196,7 +196,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program 3" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="Compare weighted and unweighted results" diff --git a/tests/command/count.sh b/tests/command/count.sh index d6fd1db85e..bba7d06268 100755 --- a/tests/command/count.sh +++ b/tests/command/count.sh @@ -80,7 +80,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="Run pspp 1" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi @@ -127,7 +127,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="Run pspp 2" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/command/data-list.sh b/tests/command/data-list.sh index 52b3dcb8c9..13c2a683c6 100755 --- a/tests/command/data-list.sh +++ b/tests/command/data-list.sh @@ -147,7 +147,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then fail ; fi activity="compare output" diff --git a/tests/command/do-if.sh b/tests/command/do-if.sh index b3bbed7fac..8d2dcdae12 100755 --- a/tests/command/do-if.sh +++ b/tests/command/do-if.sh @@ -108,7 +108,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run test1" -$SUPERVISOR $PSPP --testing-mode test1.pspp +$SUPERVISOR $PSPP -o pspp.csv test1.pspp if [ $? -ne 0 ] ; then no_result ; fi activity="compare test1 results" diff --git a/tests/command/do-repeat.sh b/tests/command/do-repeat.sh index 07d67ec978..8c68a8b9a7 100755 --- a/tests/command/do-repeat.sh +++ b/tests/command/do-repeat.sh @@ -84,7 +84,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare results" diff --git a/tests/command/erase.sh b/tests/command/erase.sh index 491f79aa3b..4276661442 100755 --- a/tests/command/erase.sh +++ b/tests/command/erase.sh @@ -81,7 +81,7 @@ if [ ! -f $TEMPDIR/foobar ] ; then fail ; fi # This command must fail activity="run prog 1" -$SUPERVISOR $PSPP --testing-mode -e /dev/null $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv -e /dev/null $TESTFILE if [ $? -eq 0 ] ; then fail ; fi @@ -95,7 +95,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run prog 2" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then fail ; fi # foobar should now be gone diff --git a/tests/command/examine-extremes.sh b/tests/command/examine-extremes.sh index f771c66d01..71d7d27982 100755 --- a/tests/command/examine-extremes.sh +++ b/tests/command/examine-extremes.sh @@ -95,7 +95,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare results" diff --git a/tests/command/examine-percentiles.sh b/tests/command/examine-percentiles.sh index bf2fcbf95c..9cb0b95932 100755 --- a/tests/command/examine-percentiles.sh +++ b/tests/command/examine-percentiles.sh @@ -88,7 +88,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/command/examine.sh b/tests/command/examine.sh index 8fc9f7ca8f..1e5b0db0ee 100755 --- a/tests/command/examine.sh +++ b/tests/command/examine.sh @@ -98,7 +98,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi # NOTE: In the following data: Only the extreme values have been checked diff --git a/tests/command/file-handle.sh b/tests/command/file-handle.sh index ed44ba6b13..937f05f79e 100755 --- a/tests/command/file-handle.sh +++ b/tests/command/file-handle.sh @@ -76,7 +76,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/command/file-label.sh b/tests/command/file-label.sh index 4dc929eaa3..a275f2957b 100755 --- a/tests/command/file-label.sh +++ b/tests/command/file-label.sh @@ -119,7 +119,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi # We need to filter out the dates/times diff --git a/tests/command/filter.sh b/tests/command/filter.sh index 4c9c416151..13704791e1 100755 --- a/tests/command/filter.sh +++ b/tests/command/filter.sh @@ -86,7 +86,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/command/flip.sh b/tests/command/flip.sh index 7766ad4464..141a75cc4a 100755 --- a/tests/command/flip.sh +++ b/tests/command/flip.sh @@ -92,7 +92,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/flip.stat +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/flip.stat if [ $? -ne 0 ] ; then no_result ; fi activity="compare output" diff --git a/tests/command/get-data-gnm.sh b/tests/command/get-data-gnm.sh index cf4e6ca8ec..c6cf630c03 100755 --- a/tests/command/get-data-gnm.sh +++ b/tests/command/get-data-gnm.sh @@ -87,7 +87,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program 1" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi @@ -197,7 +197,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program 2" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE > /dev/null +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE > /dev/null if [ $? -ne 0 ] ; then fail ; fi activity="compare output 2" diff --git a/tests/command/get-data-psql.sh b/tests/command/get-data-psql.sh index 081c79745a..e15080ab92 100755 --- a/tests/command/get-data-psql.sh +++ b/tests/command/get-data-psql.sh @@ -202,7 +202,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program 1" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare output 1" @@ -320,7 +320,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program 2" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare output 2" @@ -370,7 +370,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program 3" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare output 3" @@ -431,7 +431,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program 4" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/command/get-data-txt-examples.sh b/tests/command/get-data-txt-examples.sh index 1e1a516488..3cc68499a3 100755 --- a/tests/command/get-data-txt-examples.sh +++ b/tests/command/get-data-txt-examples.sh @@ -132,7 +132,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run test" -$SUPERVISOR $PSPP --testing-mode test.pspp +$SUPERVISOR $PSPP -o pspp.csv test.pspp if [ $? -ne 0 ] ; then no_result ; fi activity="compare test results" diff --git a/tests/command/get-data-txt-importcases.sh b/tests/command/get-data-txt-importcases.sh index 8293f290f1..54d6cf8693 100755 --- a/tests/command/get-data-txt-importcases.sh +++ b/tests/command/get-data-txt-importcases.sh @@ -86,7 +86,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then fail ; fi activity="compare output" diff --git a/tests/command/get-data-txt.sh b/tests/command/get-data-txt.sh index 01bd196c39..f0560495bb 100755 --- a/tests/command/get-data-txt.sh +++ b/tests/command/get-data-txt.sh @@ -152,7 +152,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then fail ; fi activity="compare output" diff --git a/tests/command/import-export.sh b/tests/command/import-export.sh index 9a58140273..b519d4695e 100755 --- a/tests/command/import-export.sh +++ b/tests/command/import-export.sh @@ -74,7 +74,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare output" diff --git a/tests/command/input-program.sh b/tests/command/input-program.sh index 4aa5ebd260..0740128667 100755 --- a/tests/command/input-program.sh +++ b/tests/command/input-program.sh @@ -87,7 +87,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run test1" -$SUPERVISOR $PSPP --testing-mode test1.pspp +$SUPERVISOR $PSPP -o pspp.csv test1.pspp if [ $? -ne 0 ] ; then no_result ; fi activity="compare test1 results" @@ -121,7 +121,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run test2" -$SUPERVISOR $PSPP --testing-mode test2.pspp +$SUPERVISOR $PSPP -o pspp.csv test2.pspp if [ $? -ne 0 ] ; then no_result ; fi activity="compare test2 results" @@ -161,7 +161,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run test3" -$SUPERVISOR $PSPP --testing-mode test3.pspp +$SUPERVISOR $PSPP -o pspp.csv test3.pspp if [ $? -ne 0 ] ; then no_result ; fi activity="compare test3 results" @@ -207,7 +207,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run test4" -$SUPERVISOR $PSPP --testing-mode test4.pspp +$SUPERVISOR $PSPP -o pspp.csv test4.pspp if [ $? -ne 0 ] ; then no_result ; fi activity="compare test4 results" @@ -244,7 +244,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run test5" -$SUPERVISOR $PSPP --testing-mode test5.pspp +$SUPERVISOR $PSPP -o pspp.csv test5.pspp if [ $? -ne 0 ] ; then no_result ; fi activity="compare test5 results" diff --git a/tests/command/insert.sh b/tests/command/insert.sh index c6d1464cdc..0d8f1697aa 100755 --- a/tests/command/insert.sh +++ b/tests/command/insert.sh @@ -92,7 +92,7 @@ if [ $? -ne 0 ] ; then no_result ; fi #This command should fail activity="run program 1" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE > /dev/null +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE > /dev/null if [ $? -eq 0 ] ; then fail ; fi @@ -110,7 +110,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program 2" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then fail ; fi @@ -158,7 +158,7 @@ if [ $? -ne 0 ] ; then no_result ; fi # This command should fail activity="run program 3" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE > /dev/null +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE > /dev/null if [ $? -eq 0 ] ; then fail ; fi activity="create wrapper 6" @@ -174,7 +174,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program 4" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then fail ; fi @@ -210,7 +210,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program 5" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE > /dev/null +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE > /dev/null if [ $? -ne 1 ] ; then no_result ; fi activity="examine output 1" @@ -237,7 +237,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program 6" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE > /dev/null +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE > /dev/null if [ $? -ne 1 ] ; then no_result ; fi activity="examine output 2" @@ -268,7 +268,7 @@ if [ $? -ne 0 ] ; then no_result ; fi #This command should fail activity="run program 7" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE > /dev/null +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE > /dev/null if [ $? -eq 0 ] ; then no_result ; fi pass; diff --git a/tests/command/lag.sh b/tests/command/lag.sh index de197c97e4..e8c39dd2c9 100755 --- a/tests/command/lag.sh +++ b/tests/command/lag.sh @@ -77,7 +77,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/lag.stat +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/lag.stat if [ $? -ne 0 ] ; then no_result ; fi activity="compare result" diff --git a/tests/command/line-ends.sh b/tests/command/line-ends.sh index e78e4ae4f9..14612b9075 100755 --- a/tests/command/line-ends.sh +++ b/tests/command/line-ends.sh @@ -83,7 +83,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then fail ; fi diff --git a/tests/command/list.sh b/tests/command/list.sh index dfeb29c332..7079fd4d29 100755 --- a/tests/command/list.sh +++ b/tests/command/list.sh @@ -78,7 +78,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/command/longvars.sh b/tests/command/longvars.sh index 8040f44a25..a57e57323d 100755 --- a/tests/command/longvars.sh +++ b/tests/command/longvars.sh @@ -77,7 +77,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare output" diff --git a/tests/command/loop.sh b/tests/command/loop.sh index 21d883e8ff..c49633e617 100755 --- a/tests/command/loop.sh +++ b/tests/command/loop.sh @@ -131,7 +131,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode -e $TEMPDIR/stdout $TEMPDIR/loop.stat +$SUPERVISOR $PSPP -o pspp.csv -e $TEMPDIR/stdout $TEMPDIR/loop.stat if [ $? -ne 0 ] ; then no_result ; fi activity="compare stdout" diff --git a/tests/command/match-files.sh b/tests/command/match-files.sh index a125cbd6e0..29d5669617 100755 --- a/tests/command/match-files.sh +++ b/tests/command/match-files.sh @@ -174,7 +174,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run $name.pspp" - $SUPERVISOR $PSPP --testing-mode -e /dev/null $name.pspp + $SUPERVISOR $PSPP -o pspp.csv -e /dev/null $name.pspp if [ $? -ne 0 ] ; then no_result ; fi activity="check $name output" @@ -197,7 +197,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run $name.pspp" -$SUPERVISOR $PSPP --testing-mode -e /dev/null $name.pspp +$SUPERVISOR $PSPP -o pspp.csv -e /dev/null $name.pspp if [ $? -ne 0 ] ; then no_result ; fi activity="check $name output" @@ -245,7 +245,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run $name.pspp" -$SUPERVISOR $PSPP --testing-mode -e /dev/null $name.pspp +$SUPERVISOR $PSPP -o pspp.csv -e /dev/null $name.pspp if [ $? -ne 0 ] ; then no_result ; fi activity="check $name output" diff --git a/tests/command/missing-values.sh b/tests/command/missing-values.sh index c01adf3112..a4cde41ba9 100755 --- a/tests/command/missing-values.sh +++ b/tests/command/missing-values.sh @@ -119,7 +119,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode --error-file=$TEMPDIR/errs $TEMPDIR/missing-values.stat +$SUPERVISOR $PSPP -o pspp.csv --error-file=$TEMPDIR/errs $TEMPDIR/missing-values.stat # Note vv --- there are errors in input. Therefore, the command must FAIL if [ $? -eq 0 ] ; then fail ; fi diff --git a/tests/command/n_of_cases.sh b/tests/command/n_of_cases.sh index 24a3429b5b..bb685f84ac 100755 --- a/tests/command/n_of_cases.sh +++ b/tests/command/n_of_cases.sh @@ -76,7 +76,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/command/no_case_size.sh b/tests/command/no_case_size.sh index 4243f326ed..9e7921225b 100755 --- a/tests/command/no_case_size.sh +++ b/tests/command/no_case_size.sh @@ -68,7 +68,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare output" diff --git a/tests/command/npar-binomial.sh b/tests/command/npar-binomial.sh index 9a776f6ba6..ea892b15ca 100755 --- a/tests/command/npar-binomial.sh +++ b/tests/command/npar-binomial.sh @@ -247,7 +247,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program 1" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare output 1" diff --git a/tests/command/npar-chisquare.sh b/tests/command/npar-chisquare.sh index 0f4b3facbe..8ee9bb8e59 100755 --- a/tests/command/npar-chisquare.sh +++ b/tests/command/npar-chisquare.sh @@ -92,7 +92,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program 1" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare output 1" @@ -176,7 +176,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program 2" -$SUPERVISOR $PSPP --testing-mode $TESTFILE > $TEMPDIR/output +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE > $TEMPDIR/output if [ $? -eq 0 ] ; then no_result ; fi activity="compare errors 2" @@ -215,7 +215,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program 3" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi @@ -277,7 +277,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program 4" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/command/npar-sign.sh b/tests/command/npar-sign.sh index 1c7c629a67..03c8117c91 100755 --- a/tests/command/npar-sign.sh +++ b/tests/command/npar-sign.sh @@ -81,7 +81,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program 1" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare output 1" diff --git a/tests/command/npar-wilcoxon.sh b/tests/command/npar-wilcoxon.sh index f4434a6454..f259ea957a 100755 --- a/tests/command/npar-wilcoxon.sh +++ b/tests/command/npar-wilcoxon.sh @@ -91,7 +91,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program 1" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="generate results" @@ -154,7 +154,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program 2" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare output 2" diff --git a/tests/command/oneway-missing.sh b/tests/command/oneway-missing.sh index d4a4c6fd9b..5fe701b0a2 100755 --- a/tests/command/oneway-missing.sh +++ b/tests/command/oneway-missing.sh @@ -88,7 +88,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="copy output" @@ -126,7 +126,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program 2" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare outputs" @@ -166,7 +166,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program 3" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare outputs" diff --git a/tests/command/oneway-with-splits.sh b/tests/command/oneway-with-splits.sh index 8466d8f594..35cc76de5b 100755 --- a/tests/command/oneway-with-splits.sh +++ b/tests/command/oneway-with-splits.sh @@ -96,7 +96,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff -c $TEMPDIR/pspp.csv - << EOF diff --git a/tests/command/oneway.sh b/tests/command/oneway.sh index c55101d573..cb7fb79b14 100755 --- a/tests/command/oneway.sh +++ b/tests/command/oneway.sh @@ -93,7 +93,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff -c $TEMPDIR/pspp.csv - << EOF diff --git a/tests/command/permissions.sh b/tests/command/permissions.sh index db54cd5ade..0234187ee8 100755 --- a/tests/command/permissions.sh +++ b/tests/command/permissions.sh @@ -70,7 +70,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/per.sps +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/per.sps if [ $? -ne 0 ] ; then no_result ; fi activity="Check Permissions" @@ -86,7 +86,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/per.sps +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/per.sps if [ $? -ne 0 ] ; then no_result ; fi activity="Check Permissions" diff --git a/tests/command/print-strings.sh b/tests/command/print-strings.sh index 5fb730063f..b8ac189ee5 100755 --- a/tests/command/print-strings.sh +++ b/tests/command/print-strings.sh @@ -79,7 +79,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/command/print.sh b/tests/command/print.sh index f135b4c144..a0b806e5e0 100755 --- a/tests/command/print.sh +++ b/tests/command/print.sh @@ -105,7 +105,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode --error-file=$TEMPDIR/errs $TEMPDIR/print.stat +$SUPERVISOR $PSPP -o pspp.csv --error-file=$TEMPDIR/errs $TEMPDIR/print.stat if [ $? -ne 0 ] ; then fail ; fi activity="compare print.out" diff --git a/tests/command/rank.sh b/tests/command/rank.sh index bc208af8a7..67e19c9fda 100755 --- a/tests/command/rank.sh +++ b/tests/command/rank.sh @@ -82,7 +82,7 @@ if [ $? -ne 0 ] ; then no_result ; fi # Check that it properly handles failed transformations. activity="run program 1" -$SUPERVISOR $PSPP --testing-mode -e $TEMPDIR/err $TESTFILE +$SUPERVISOR $PSPP --testing-mode -o pspp.csv -e $TEMPDIR/err $TESTFILE if [ $? -ne 1 ] ; then fail ; fi activity="diff 1" @@ -131,7 +131,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program (syntax errors)" -$SUPERVISOR $PSPP --testing-mode -e $TEMPDIR/errs $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv -e $TEMPDIR/errs $TESTFILE if [ $? -ne 1 ] ; then fail ; fi activity="compare errors" @@ -359,7 +359,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program 3" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi @@ -629,7 +629,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program 4" -$SUPERVISOR $PSPP --testing-mode -e /dev/null $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv -e /dev/null $TESTFILE if [ $? -ne 0 ] ; then fail ; fi diff --git a/tests/command/regression-qr.sh b/tests/command/regression-qr.sh index 1c4211abd8..7cbb815647 100755 --- a/tests/command/regression-qr.sh +++ b/tests/command/regression-qr.sh @@ -1566,7 +1566,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff -c $TEMPDIR/pspp.csv - << EOF diff --git a/tests/command/regression.sh b/tests/command/regression.sh index 88b4cd8318..4ff48e51f2 100755 --- a/tests/command/regression.sh +++ b/tests/command/regression.sh @@ -78,7 +78,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff -c $TEMPDIR/pspp.csv - << EOF diff --git a/tests/command/reliability.sh b/tests/command/reliability.sh index c93440421a..df86fa8277 100755 --- a/tests/command/reliability.sh +++ b/tests/command/reliability.sh @@ -245,7 +245,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare output" diff --git a/tests/command/rename.sh b/tests/command/rename.sh index a4b9646ec3..1e08782a4a 100755 --- a/tests/command/rename.sh +++ b/tests/command/rename.sh @@ -80,7 +80,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="check sysfile" diff --git a/tests/command/roc.sh b/tests/command/roc.sh index 081263ee8c..c6ab046145 100755 --- a/tests/command/roc.sh +++ b/tests/command/roc.sh @@ -94,7 +94,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/command/roc2.sh b/tests/command/roc2.sh index ffed0fe6a7..7976a6e4ae 100755 --- a/tests/command/roc2.sh +++ b/tests/command/roc2.sh @@ -101,7 +101,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/command/sample.sh b/tests/command/sample.sh index 4d001bf7ff..c8d25e7598 100755 --- a/tests/command/sample.sh +++ b/tests/command/sample.sh @@ -81,7 +81,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/sample.stat +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/sample.stat if [ $? -ne 0 ] ; then no_result ; fi activity="create head" diff --git a/tests/command/sort.sh b/tests/command/sort.sh index d66681be7b..409c11965f 100755 --- a/tests/command/sort.sh +++ b/tests/command/sort.sh @@ -121,7 +121,7 @@ for count_repeat_buffers in \ } > sort.pspp || no_result activity="run program" - $SUPERVISOR $PSPP --testing-mode sort.pspp + $SUPERVISOR $PSPP --testing-mode -o pspp.csv sort.pspp if [ $? -ne 0 ] ; then no_result ; fi perl -pi -e 's/^\s*$//g' sort.exp sort.out diff --git a/tests/command/split-file.sh b/tests/command/split-file.sh index 1452588d36..5bebedc75c 100755 --- a/tests/command/split-file.sh +++ b/tests/command/split-file.sh @@ -85,7 +85,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/split.stat +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/split.stat if [ $? -ne 0 ] ; then no_result ; fi activity="compare results" diff --git a/tests/command/sysfile-info.sh b/tests/command/sysfile-info.sh index d5768252ff..35a4e53f32 100755 --- a/tests/command/sysfile-info.sh +++ b/tests/command/sysfile-info.sh @@ -74,7 +74,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="filter output" diff --git a/tests/command/sysfiles-old.sh b/tests/command/sysfiles-old.sh index e136a0b209..fefe3afcca 100755 --- a/tests/command/sysfiles-old.sh +++ b/tests/command/sysfiles-old.sh @@ -84,7 +84,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="check file exists" diff --git a/tests/command/sysfiles.sh b/tests/command/sysfiles.sh index a671dff524..08b28888e2 100755 --- a/tests/command/sysfiles.sh +++ b/tests/command/sysfiles.sh @@ -83,7 +83,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare output" diff --git a/tests/command/t-test-1-indep-val.sh b/tests/command/t-test-1-indep-val.sh index 0dcd194ba2..04f6b05e1a 100755 --- a/tests/command/t-test-1-indep-val.sh +++ b/tests/command/t-test-1-indep-val.sh @@ -90,7 +90,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/command/t-test-1-sample-missing-anal.sh b/tests/command/t-test-1-sample-missing-anal.sh index cbac8dba25..7694349142 100755 --- a/tests/command/t-test-1-sample-missing-anal.sh +++ b/tests/command/t-test-1-sample-missing-anal.sh @@ -75,7 +75,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program 1" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="copy output" @@ -101,7 +101,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program 2" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare outputs" diff --git a/tests/command/t-test-1-sample-missing-list.sh b/tests/command/t-test-1-sample-missing-list.sh index 0db7e8e9c2..476f2fe0bc 100755 --- a/tests/command/t-test-1-sample-missing-list.sh +++ b/tests/command/t-test-1-sample-missing-list.sh @@ -74,7 +74,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program 1" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="copy output" @@ -101,7 +101,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program 2" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare outputs" diff --git a/tests/command/t-test-1s.sh b/tests/command/t-test-1s.sh index c20d0f6611..b0bb6ab478 100755 --- a/tests/command/t-test-1s.sh +++ b/tests/command/t-test-1s.sh @@ -74,7 +74,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare output" diff --git a/tests/command/t-test-groups.sh b/tests/command/t-test-groups.sh index 57aef96a0f..c149ea56fa 100755 --- a/tests/command/t-test-groups.sh +++ b/tests/command/t-test-groups.sh @@ -81,7 +81,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare output" diff --git a/tests/command/t-test-indep-missing-anal.sh b/tests/command/t-test-indep-missing-anal.sh index aab5ecc4dd..8f2e85975e 100755 --- a/tests/command/t-test-indep-missing-anal.sh +++ b/tests/command/t-test-indep-missing-anal.sh @@ -74,7 +74,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program 1" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="copy output" @@ -102,7 +102,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program 2" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/command/t-test-indep-missing-list.sh b/tests/command/t-test-indep-missing-list.sh index 026dba7fe6..b77c5dc129 100755 --- a/tests/command/t-test-indep-missing-list.sh +++ b/tests/command/t-test-indep-missing-list.sh @@ -75,7 +75,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program 1" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="copy output" @@ -100,7 +100,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program 2" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/command/t-test-paired-missing-anal.sh b/tests/command/t-test-paired-missing-anal.sh index b1e4157bec..5c40a65ce9 100755 --- a/tests/command/t-test-paired-missing-anal.sh +++ b/tests/command/t-test-paired-missing-anal.sh @@ -74,7 +74,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program 1" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="copy output" @@ -100,7 +100,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program 2" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/command/t-test-paired-missing-list.sh b/tests/command/t-test-paired-missing-list.sh index f034651a94..700c1ca96f 100755 --- a/tests/command/t-test-paired-missing-list.sh +++ b/tests/command/t-test-paired-missing-list.sh @@ -74,7 +74,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program 1" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="copy output" @@ -100,7 +100,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program 2" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/command/t-test-pairs.sh b/tests/command/t-test-pairs.sh index eb23b6a1d0..4dc40cd8b7 100755 --- a/tests/command/t-test-pairs.sh +++ b/tests/command/t-test-pairs.sh @@ -73,7 +73,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare output" diff --git a/tests/command/tabs.sh b/tests/command/tabs.sh index addb170b0a..0d05c5ab91 100755 --- a/tests/command/tabs.sh +++ b/tests/command/tabs.sh @@ -78,7 +78,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/tabs.stat +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/tabs.stat if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/command/trimmed-mean.sh b/tests/command/trimmed-mean.sh index 2884392079..f410a9f55b 100755 --- a/tests/command/trimmed-mean.sh +++ b/tests/command/trimmed-mean.sh @@ -81,7 +81,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/command/update.sh b/tests/command/update.sh index 92615a641b..4d4da661d3 100755 --- a/tests/command/update.sh +++ b/tests/command/update.sh @@ -155,7 +155,7 @@ EOF activity="run $name.pspp" rm -f errors - $SUPERVISOR $PSPP --testing-mode --error-file=errors $name.pspp + $SUPERVISOR $PSPP -o pspp.csv --error-file=errors $name.pspp if [ $? -ne 0 ] ; then no_result ; fi activity="check $name output" diff --git a/tests/command/use.sh b/tests/command/use.sh index b6bc661ffd..7b26cd7bda 100755 --- a/tests/command/use.sh +++ b/tests/command/use.sh @@ -79,7 +79,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP -B $STAT_CONFIG_PATH --testing-mode $TEMPDIR/filter.stat +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/filter.stat if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/command/variable-display.sh b/tests/command/variable-display.sh index 1cf74f3488..5bf7171916 100755 --- a/tests/command/variable-display.sh +++ b/tests/command/variable-display.sh @@ -70,7 +70,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then fail ; fi activity="compare output" diff --git a/tests/command/vector.sh b/tests/command/vector.sh index 06a318670a..a0da5f1270 100755 --- a/tests/command/vector.sh +++ b/tests/command/vector.sh @@ -84,7 +84,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode -e $TEMPDIR/stdout $TEMPDIR/vector.stat +$SUPERVISOR $PSPP -o pspp.csv -e $TEMPDIR/stdout $TEMPDIR/vector.stat if [ $? -ne 0 ] ; then no_result ; fi activity="compare stdout" diff --git a/tests/command/very-long-strings.sh b/tests/command/very-long-strings.sh index e9d20e91fb..e7130c142d 100755 --- a/tests/command/very-long-strings.sh +++ b/tests/command/very-long-strings.sh @@ -73,7 +73,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program 0" -$SUPERVISOR $PSPP --testing-mode -e /dev/null $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv -e /dev/null $TESTFILE if [ $? -ne 0 ] ; then fail ; fi activity="compare variable display 0" @@ -152,7 +152,7 @@ EOF activity="run program 1 ($options)" - $SUPERVISOR $PSPP --testing-mode $TESTFILE + $SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="Create file2 ($options)" @@ -173,7 +173,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program 2 ($options)" - $SUPERVISOR $PSPP --testing-mode $TESTFILE + $SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/command/weight.sh b/tests/command/weight.sh index 40a3ca9c4e..5c6ce31b0e 100755 --- a/tests/command/weight.sh +++ b/tests/command/weight.sh @@ -73,7 +73,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="compare results" diff --git a/tests/coverage.sh b/tests/coverage.sh index de91adc6dc..3a210783c2 100755 --- a/tests/coverage.sh +++ b/tests/coverage.sh @@ -47,6 +47,6 @@ FREQUENCIES /COVERAGE EOF -src/pspp -o html $TEMPDIR/cov.sps +src/pspp -o pspp.html $TEMPDIR/cov.sps rm -rf $TEMPDIR diff --git a/tests/expressions/epoch.sh b/tests/expressions/epoch.sh index 1ceab30801..dcbfc0ac4e 100755 --- a/tests/expressions/epoch.sh +++ b/tests/expressions/epoch.sh @@ -142,7 +142,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/epoch.stat > $TEMPDIR/epoch.err 2> $TEMPDIR/epoch.out +$SUPERVISOR $PSPP --testing-mode -o pspp.csv $TEMPDIR/epoch.stat > $TEMPDIR/epoch.err 2> $TEMPDIR/epoch.out activity="compare results" perl -pi -e 's/^\s*$//g' $TEMPDIR/epoch.out diff --git a/tests/expressions/expressions.sh b/tests/expressions/expressions.sh index 339abed4dd..49ad4f7d51 100755 --- a/tests/expressions/expressions.sh +++ b/tests/expressions/expressions.sh @@ -1565,7 +1565,7 @@ sed < $TEMPDIR/expr-list >> $TEMPDIR/expr-opt.stat \ if [ $? -ne 0 ] ; then no_result ; fi activity="run optimizing program" -$SUPERVISOR $PSPP --testing-mode \ +$SUPERVISOR $PSPP --testing-mode -o pspp.csv \ $TEMPDIR/expr-opt.stat >$TEMPDIR/expr-opt.err 2> $TEMPDIR/expr-opt.out activity="compare optimizing output" @@ -1581,7 +1581,7 @@ sed < $TEMPDIR/expr-list >> $TEMPDIR/expr-noopt.stat \ if [ $? -ne 0 ] ; then no_result ; fi activity="run non-optimizing program" -$SUPERVISOR $PSPP --testing-mode \ +$SUPERVISOR $PSPP --testing-mode -o pspp.csv \ $TEMPDIR/expr-noopt.stat >$TEMPDIR/expr-noopt.err 2> $TEMPDIR/expr-noopt.out activity="compare non-optimizing output" @@ -1597,7 +1597,7 @@ sed < $TEMPDIR/expr-list >> $TEMPDIR/expr-opt-pos.stat \ if [ $? -ne 0 ] ; then no_result ; fi activity="run optimizing postfix program" -$SUPERVISOR $PSPP --testing-mode \ +$SUPERVISOR $PSPP --testing-mode -o pspp.csv \ $TEMPDIR/expr-opt-pos.stat >$TEMPDIR/expr-opt-pos.err 2> $TEMPDIR/expr-opt-pos.out if [ $? -eq 0 ] ; then no_result ; fi @@ -1609,7 +1609,7 @@ sed < $TEMPDIR/expr-list >> $TEMPDIR/expr-noopt-pos.stat \ if [ $? -ne 0 ] ; then no_result ; fi activity="run non-optimizing postfix program" -$SUPERVISOR $PSPP --testing-mode \ +$SUPERVISOR $PSPP --testing-mode -o pspp.csv \ $TEMPDIR/expr-noopt-pos.stat >$TEMPDIR/expr-noopt-pos.err 2> $TEMPDIR/expr-noopt-pos.out if [ $? -eq 0 ] ; then no_result ; fi diff --git a/tests/expressions/randist.sh b/tests/expressions/randist.sh index 58fe386d29..88a57e5fcb 100755 --- a/tests/expressions/randist.sh +++ b/tests/expressions/randist.sh @@ -60,7 +60,7 @@ perl $top_srcdir/tests/expressions/randist/randist.pl \ if [ $? -ne 0 ] ; then no_result ; fi activity="run command file" -$SUPERVISOR $PSPP --testing-mode \ +$SUPERVISOR $PSPP -o pspp.csv \ $TEMPDIR/randist.pspp >$TEMPDIR/randist.err 2> $TEMPDIR/randist.out if [ $? -ne 0 ] ; then fail ; fi diff --git a/tests/expressions/valuelabel.sh b/tests/expressions/valuelabel.sh index 1b5b92e2ac..c751689e1a 100755 --- a/tests/expressions/valuelabel.sh +++ b/tests/expressions/valuelabel.sh @@ -88,7 +88,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/valuelabel.stat +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/valuelabel.stat if [ $? -ne 0 ] ; then fail ; fi activity="compare results" diff --git a/tests/expressions/variables.sh b/tests/expressions/variables.sh index b4f3ffca20..64ea80d119 100755 --- a/tests/expressions/variables.sh +++ b/tests/expressions/variables.sh @@ -101,7 +101,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/variables.stat > $TEMPDIR/variables.err 2> $TEMPDIR/variables.out +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/variables.stat > $TEMPDIR/variables.err 2> $TEMPDIR/variables.out if [ $? -ne 0 ] ; then fail ; fi activity="compare results" diff --git a/tests/expressions/vectors.sh b/tests/expressions/vectors.sh index 9205f7fca6..3eb4140476 100755 --- a/tests/expressions/vectors.sh +++ b/tests/expressions/vectors.sh @@ -78,7 +78,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/vectors.stat > $TEMPDIR/vectors.err 2> $TEMPDIR/vectors.out +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/vectors.stat > $TEMPDIR/vectors.err 2> $TEMPDIR/vectors.out if [ $? -ne 0 ] ; then fail ; fi activity="compare results" diff --git a/tests/formats/360.sh b/tests/formats/360.sh index 9c156efdfd..57f928cf7c 100755 --- a/tests/formats/360.sh +++ b/tests/formats/360.sh @@ -235,7 +235,7 @@ EOF rm -f pspp.csv activity="run $type.pspp" - $SUPERVISOR $PSPP --testing-mode $type.pspp + $SUPERVISOR $PSPP -o pspp.csv $type.pspp if [ $? -ne 0 ] ; then fail ; fi activity="compare $type.pspp output" diff --git a/tests/formats/bcd-in.sh b/tests/formats/bcd-in.sh index 934f4302c0..46c972fead 100755 --- a/tests/formats/bcd-in.sh +++ b/tests/formats/bcd-in.sh @@ -71,7 +71,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode bcd-in.pspp +$SUPERVISOR $PSPP -o pspp.csv bcd-in.pspp if [ $? -ne 0 ] ; then no_result ; fi activity="gunzip expected results" diff --git a/tests/formats/binhex-out.sh b/tests/formats/binhex-out.sh index caffb03b1a..6fb4a97246 100755 --- a/tests/formats/binhex-out.sh +++ b/tests/formats/binhex-out.sh @@ -154,7 +154,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode binhex-out.pspp +$SUPERVISOR $PSPP -o pspp.csv binhex-out.pspp if [ $? -ne 0 ] ; then no_result ; fi activity="gunzip expected results" diff --git a/tests/formats/date-in.sh b/tests/formats/date-in.sh index edadc3f5b8..9488fb9b5a 100755 --- a/tests/formats/date-in.sh +++ b/tests/formats/date-in.sh @@ -254,7 +254,7 @@ $PERL date-in.pl if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode date-in.pspp +$SUPERVISOR $PSPP -o pspp.csv date-in.pspp if [ $? -ne 0 ] ; then no_result ; fi activity="compare adate.out output" diff --git a/tests/formats/date-out.sh b/tests/formats/date-out.sh index 6e28083cfa..5f360c73a6 100755 --- a/tests/formats/date-out.sh +++ b/tests/formats/date-out.sh @@ -88,7 +88,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode date-out.pspp +$SUPERVISOR $PSPP -o pspp.csv date-out.pspp if [ $? -ne 0 ] ; then no_result ; fi activity="compare output" @@ -510,7 +510,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode bad-date-out.pspp +$SUPERVISOR $PSPP -o pspp.csv bad-date-out.pspp if [ $? -ne 0 ] ; then no_result ; fi activity="compare output" diff --git a/tests/formats/float-format.sh b/tests/formats/float-format.sh index 2a6b608740..dee9790956 100755 --- a/tests/formats/float-format.sh +++ b/tests/formats/float-format.sh @@ -149,7 +149,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/float-format.pspp +$SUPERVISOR $PSPP --testing-mode -o pspp.csv $TEMPDIR/float-format.pspp if [ $? -ne 0 ] ; then fail ; fi pass diff --git a/tests/formats/format-guesser.sh b/tests/formats/format-guesser.sh index 75885a7830..c84860a737 100755 --- a/tests/formats/format-guesser.sh +++ b/tests/formats/format-guesser.sh @@ -186,7 +186,7 @@ activity="create syntax file" if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode \ +$SUPERVISOR $PSPP --testing-mode -o pspp.csv \ $TEMPDIR/test.stat >$TEMPDIR/test.err 2> $TEMPDIR/test.out activity="compare output" diff --git a/tests/formats/ib-in.sh b/tests/formats/ib-in.sh index 3a54c2f0fc..50c8c93bea 100755 --- a/tests/formats/ib-in.sh +++ b/tests/formats/ib-in.sh @@ -72,7 +72,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode ib-in.pspp +$SUPERVISOR $PSPP -o pspp.csv ib-in.pspp if [ $? -ne 0 ] ; then no_result ; fi activity="gunzip expected results" diff --git a/tests/formats/legacy-in.sh b/tests/formats/legacy-in.sh index 1087a06f12..eaab8e1439 100755 --- a/tests/formats/legacy-in.sh +++ b/tests/formats/legacy-in.sh @@ -71,7 +71,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode legacy-in.pspp +$SUPERVISOR $PSPP -o pspp.csv legacy-in.pspp if [ $? -ne 0 ] ; then no_result ; fi activity="gunzip expected results" diff --git a/tests/formats/month-in.sh b/tests/formats/month-in.sh index 2d32a594ec..dd5f02724c 100755 --- a/tests/formats/month-in.sh +++ b/tests/formats/month-in.sh @@ -105,7 +105,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode month-in.pspp +$SUPERVISOR $PSPP -o pspp.csv month-in.pspp if [ $? -ne 0 ] ; then no_result ; fi activity="compare output" diff --git a/tests/formats/month-out.sh b/tests/formats/month-out.sh index 65d0a42ed2..fba0ae8990 100755 --- a/tests/formats/month-out.sh +++ b/tests/formats/month-out.sh @@ -41,6 +41,7 @@ cd $TEMPDIR activity="write pspp syntax" cat > month-out.pspp < paper-size.out +PAPERSIZE=letter $SUPERVISOR $PSPP --testing-mode -o pspp.csv paper-size.pspp > paper-size.out if [ $? -ne 0 ] ; then no_result ; fi activity="compare results" @@ -88,7 +88,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="Run pspp 2" -PAPERSIZE=a4 $SUPERVISOR $PSPP --testing-mode paper-size-2.pspp > paper-size-2.out +PAPERSIZE=a4 $SUPERVISOR $PSPP --testing-mode -o pspp.csv paper-size-2.pspp > paper-size-2.out if [ $? -ne 0 ] ; then no_result ; fi activity="compare results 2" diff --git a/tests/output/render-test.c b/tests/output/render-test.c index 5d8a291816..729db85037 100644 --- a/tests/output/render-test.c +++ b/tests/output/render-test.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2009 Free Software Foundation, Inc. + Copyright (C) 2009, 2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,14 +22,16 @@ #include #include -#include -#include -#include -#include -#include +#include "libpspp/assertion.h" +#include "libpspp/compiler.h" +#include "libpspp/string-map.h" +#include "output/driver.h" +#include "output/tab.h" +#include "output/table-item.h" #include "gl/error.h" #include "gl/progname.h" +#include "gl/xalloc.h" #include "gl/xvasprintf.h" /* --transpose: Transpose the table before outputting? */ @@ -70,24 +72,67 @@ main (int argc, char **argv) return 0; } +static void +configure_drivers (int width, int length) +{ + struct string_map options, tmp; + struct output_driver *driver; + + string_map_init (&options); + string_map_insert (&options, "format", "txt"); + string_map_insert (&options, "output-file", "-"); + string_map_insert_nocopy (&options, xstrdup ("width"), + xasprintf ("%d", width)); + string_map_insert_nocopy (&options, xstrdup ("length"), + xasprintf ("%d", length)); + + /* Render to stdout. */ + string_map_clone (&tmp, &options); + driver = output_driver_create (&tmp); + if (driver == NULL) + exit (EXIT_FAILURE); + output_driver_register (driver); + string_map_destroy (&tmp); + + /* Render to render.txt. */ + string_map_replace (&options, "output-file", "render.txt"); + driver = output_driver_create (&options); + if (driver == NULL) + exit (EXIT_FAILURE); + output_driver_register (driver); + + /* Render to render.pdf. */ + string_map_insert (&options, "output-file", "render.pdf"); + string_map_insert (&options, "headers", "off"); + string_map_insert (&options, "top-margin", "0"); + string_map_insert (&options, "bottom-margin", "0"); + string_map_insert (&options, "left-margin", "0"); + string_map_insert (&options, "right-margin", "0"); + string_map_insert_nocopy (&options, xstrdup ("paper-size"), + xasprintf ("%dx%dpt", width * 5, length * 6)); + driver = output_driver_create (&options); + if (driver == NULL) + exit (EXIT_FAILURE); + output_driver_register (driver); + + string_map_destroy (&options); +} + static const char * parse_options (int argc, char **argv) { - bool configured_driver = false; int width = 79; int length = 66; for (;;) { enum { - OPT_DRIVER = UCHAR_MAX + 1, - OPT_WIDTH, + OPT_WIDTH = UCHAR_MAX + 1, OPT_LENGTH, OPT_HELP }; static const struct option options[] = { - {"driver", required_argument, NULL, OPT_DRIVER}, {"width", required_argument, NULL, OPT_WIDTH}, {"length", required_argument, NULL, OPT_LENGTH}, {"transpose", no_argument, &transpose, 1}, @@ -101,11 +146,6 @@ parse_options (int argc, char **argv) switch (c) { - case OPT_DRIVER: - output_configure_driver (optarg); - configured_driver = true; - break; - case OPT_WIDTH: width = atoi (optarg); break; @@ -130,32 +170,7 @@ parse_options (int argc, char **argv) } - if (!configured_driver) - { - char *config; - -#if 1 - config = xasprintf ("ascii:ascii:listing:headers=off top-margin=0 " - "bottom-margin=0 output-file=- emphasis=none " - "paginate=off squeeze=on width=%d length=%d", - width, length); - output_configure_driver (config); - free (config); - - config = xasprintf ("ascii:ascii:listing:headers=off top-margin=0 " - "bottom-margin=0 output-file=render.txt " - "emphasis=none paginate=off squeeze=on"); - output_configure_driver (config); - free (config); -#endif - - config = xasprintf ("pdf:cairo:listing:headers=off top-margin=0 " - "bottom-margin=0 left-margin=0 right-margin=0 " - "output-file=render.pdf paper-size=%dx%dpt", - width * 5, length * 6); - output_configure_driver (config); - free (config); - } + configure_drivers (width, length); if (optind + 1 != argc) error (1, 0, "exactly one non-option argument required; " diff --git a/tests/stats/descript-basic.sh b/tests/stats/descript-basic.sh index fedb73f6d2..3577a03b8c 100755 --- a/tests/stats/descript-basic.sh +++ b/tests/stats/descript-basic.sh @@ -82,7 +82,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/descript.stat +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/descript.stat if [ $? -ne 0 ] ; then no_result ; fi activity="compare output" diff --git a/tests/stats/descript-mean-bug.sh b/tests/stats/descript-mean-bug.sh index 532abed0ff..4a8853b47e 100755 --- a/tests/stats/descript-mean-bug.sh +++ b/tests/stats/descript-mean-bug.sh @@ -77,7 +77,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/descript.stat +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/descript.stat if [ $? -ne 0 ] ; then no_result ; fi activity="compare output" diff --git a/tests/stats/descript-missing.sh b/tests/stats/descript-missing.sh index fce8a17ecd..2370a1d58a 100755 --- a/tests/stats/descript-missing.sh +++ b/tests/stats/descript-missing.sh @@ -83,7 +83,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/descript.stat +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/descript.stat if [ $? -ne 0 ] ; then no_result ; fi activity="compare output" diff --git a/tests/stats/moments.sh b/tests/stats/moments.sh index 89854285a0..5fc7c69092 100755 --- a/tests/stats/moments.sh +++ b/tests/stats/moments.sh @@ -84,7 +84,7 @@ sed < $TEMPDIR/moments-list-2p >> $TEMPDIR/moments-2p.stat \ if [ $? -ne 0 ] ; then no_result ; fi activity="run two-pass program" -$SUPERVISOR $PSPP --testing-mode \ +$SUPERVISOR $PSPP --testing-mode -o pspp.csv \ $TEMPDIR/moments-2p.stat >$TEMPDIR/moments-2p.err 2> $TEMPDIR/moments-2p.out activity="compare two-pass output" @@ -98,7 +98,7 @@ sed < $TEMPDIR/moments-list-1p >> $TEMPDIR/moments-1p.stat \ if [ $? -ne 0 ] ; then no_result ; fi activity="run one-pass program" -$SUPERVISOR $PSPP --testing-mode \ +$SUPERVISOR $PSPP --testing-mode -o pspp.csv \ $TEMPDIR/moments-1p.stat >$TEMPDIR/moments-1p.err 2> $TEMPDIR/moments-1p.out activity="compare one-pass output" diff --git a/tests/stats/ntiles.sh b/tests/stats/ntiles.sh index 4f4eedb15e..697cc4269f 100755 --- a/tests/stats/ntiles.sh +++ b/tests/stats/ntiles.sh @@ -77,7 +77,7 @@ EOF if [ $? -ne 0 ] ; then no_result; fi activity="run program $i" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/prog.sps +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/prog.sps if [ $? -ne 0 ] ; then no_result ; fi activity="move output" @@ -106,7 +106,7 @@ EOF if [ $? -ne 0 ] ; then no_result; fi activity="run program $i" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/prog.sps +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/prog.sps if [ $? -ne 0 ] ; then no_result ; fi activity="compare output" diff --git a/tests/stats/percentiles-compatible.sh b/tests/stats/percentiles-compatible.sh index 2d539a1d24..e546a45b82 100755 --- a/tests/stats/percentiles-compatible.sh +++ b/tests/stats/percentiles-compatible.sh @@ -82,7 +82,7 @@ EOF if [ $? -ne 0 ] ; then no_result; fi activity="run program $i" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/prog.sps +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/prog.sps if [ $? -ne 0 ] ; then no_result ; fi activity="compare output $i" diff --git a/tests/stats/percentiles-enhanced.sh b/tests/stats/percentiles-enhanced.sh index 5c5accbbcf..03643f5b0d 100755 --- a/tests/stats/percentiles-enhanced.sh +++ b/tests/stats/percentiles-enhanced.sh @@ -81,7 +81,7 @@ EOF if [ $? -ne 0 ] ; then no_result; fi activity="run program $i" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/prog.sps +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/prog.sps if [ $? -ne 0 ] ; then no_result ; fi activity="compare output $i" @@ -137,7 +137,7 @@ if [ $? -ne 0 ] ; then no_result; fi activity="run program $i" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/prog.sps +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/prog.sps if [ $? -ne 0 ] ; then no_result ; fi activity="compare output $i" @@ -191,7 +191,7 @@ if [ $? -ne 0 ] ; then no_result; fi activity="run program $i" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/prog.sps +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/prog.sps if [ $? -ne 0 ] ; then no_result ; fi activity="compare output $i" @@ -244,7 +244,7 @@ if [ $? -ne 0 ] ; then no_result; fi activity="run program $i" -$SUPERVISOR $PSPP --testing-mode $TEMPDIR/prog.sps +$SUPERVISOR $PSPP -o pspp.csv $TEMPDIR/prog.sps if [ $? -ne 0 ] ; then no_result ; fi activity="compare output $i" diff --git a/tests/test_template b/tests/test_template index 5c996621eb..41f00bce4d 100755 --- a/tests/test_template +++ b/tests/test_template @@ -62,7 +62,7 @@ if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi diff --git a/tests/xforms/recode.sh b/tests/xforms/recode.sh index f36e5f2a11..a0119cb4c9 100755 --- a/tests/xforms/recode.sh +++ b/tests/xforms/recode.sh @@ -162,7 +162,7 @@ EOF if [ $? -ne 0 ] ; then no_result ; fi activity="run program" -$SUPERVISOR $PSPP --testing-mode $TESTFILE +$SUPERVISOR $PSPP -o pspp.csv $TESTFILE if [ $? -ne 0 ] ; then no_result ; fi activity="test output"