From f51ecb48027e6b1eb46840ae25888a25b429f012 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Sat, 6 Feb 2010 20:35:46 -0800 Subject: [PATCH] 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. --- Makefile.am | 1 - Smake | 3 +- config/OChangeLog | 217 ----- config/automake.mk | 7 - config/devices | 210 ----- doc/automake.mk | 1 - doc/configuring.texi | 884 ------------------ doc/invoking.texi | 514 ++++++---- doc/language.texi | 6 +- doc/pspp.texinfo | 8 +- doc/utilities.texi | 59 +- perl-module/Makefile.PL | 2 +- perl-module/t/Pspp.t | 2 +- src/data/file-name.c | 165 +--- src/data/file-name.h | 14 +- src/data/settings.c | 149 +-- src/data/settings.h | 50 +- src/language/lexer/lexer.c | 1 - src/language/syntax-file.c | 4 - src/language/utilities/set.q | 142 ++- src/libpspp/automake.mk | 4 - src/libpspp/getl.c | 53 +- src/libpspp/getl.h | 6 +- src/libpspp/message.c | 2 - src/libpspp/version.h | 8 +- src/output/ascii.c | 47 +- src/output/cairo.c | 53 +- src/output/csv.c | 13 +- src/output/driver-provider.h | 68 +- src/output/driver.c | 737 ++++----------- src/output/driver.h | 35 +- src/output/html.c | 23 +- src/output/odt.c | 16 +- src/output/options.c | 55 +- src/ui/automake.mk | 1 - src/ui/command-line.c | 166 ---- src/ui/command-line.h | 36 - src/ui/gui/helper.c | 1 - src/ui/gui/main.c | 94 +- src/ui/gui/psppire-output-window.c | 11 +- src/ui/gui/psppire.c | 223 ++--- src/ui/gui/psppire.h | 9 +- src/ui/source-init-opts.c | 156 ++-- src/ui/source-init-opts.h | 13 +- src/ui/terminal/main.c | 94 +- src/ui/terminal/msg-ui.c | 36 +- src/ui/terminal/terminal-opts.c | 411 +++++--- src/ui/terminal/terminal-opts.h | 18 +- tests/bugs/agg-crash-2.sh | 2 +- tests/bugs/agg_crash.sh | 2 +- tests/bugs/alpha-freq.sh | 2 +- tests/bugs/big-input-2.sh | 4 +- tests/bugs/big-input.sh | 2 +- tests/bugs/case-map.sh | 2 +- tests/bugs/comment-at-eof.sh | 2 +- tests/bugs/compression.sh | 2 +- tests/bugs/compute-fmt.sh | 2 +- tests/bugs/compute-lv.sh | 2 +- tests/bugs/compute-sum.sh | 2 +- tests/bugs/computebug.sh | 2 +- tests/bugs/crosstabs-crash.sh | 2 +- tests/bugs/crosstabs-crash2.sh | 2 +- tests/bugs/crosstabs.sh | 2 +- tests/bugs/crosstabs2.sh | 2 +- tests/bugs/curtailed.sh | 2 +- tests/bugs/data-crash.sh | 2 +- tests/bugs/double-frequency.sh | 2 +- tests/bugs/empty-do-repeat.sh | 2 +- tests/bugs/examine-1sample.sh | 2 +- tests/bugs/examine-crash.sh | 2 +- tests/bugs/examine-crash2.sh | 2 +- tests/bugs/examine-crash3.sh | 2 +- tests/bugs/examine-missing.sh | 2 +- tests/bugs/examine-missing2.sh | 4 +- tests/bugs/freq-nolabels.sh | 2 +- tests/bugs/get-no-file.sh | 4 +- tests/bugs/get.sh | 2 +- tests/bugs/html-frequency.sh | 2 +- tests/bugs/if_crash.sh | 2 +- tests/bugs/input-crash.sh | 4 +- tests/bugs/keep-all.sh | 2 +- tests/bugs/lag_crash.sh | 2 +- tests/bugs/list-overflow.sh | 2 +- tests/bugs/match-files-scratch.sh | 2 +- tests/bugs/multipass.sh | 2 +- tests/bugs/overwrite-input-file.sh | 8 +- tests/bugs/overwrite-special-file.sh | 2 +- tests/bugs/piechart.sh | 2 +- tests/bugs/print-crash.sh | 2 +- tests/bugs/random.sh | 2 +- tests/bugs/recode-copy-bug.sh | 4 +- tests/bugs/shbang.sh | 2 +- tests/bugs/signals.sh | 4 +- tests/bugs/t-test-alpha.sh | 2 +- tests/bugs/t-test-alpha2.sh | 2 +- tests/bugs/t-test-alpha3.sh | 2 +- tests/bugs/t-test-paired.sh | 2 +- tests/bugs/t-test-with-temp.sh | 2 +- tests/bugs/t-test.sh | 2 +- tests/bugs/temp-freq.sh | 2 +- tests/bugs/temporary.sh | 2 +- tests/bugs/unwritable-dir.sh | 6 +- tests/bugs/val-labs-trailing-slash.sh | 2 +- tests/bugs/val-labs.sh | 2 +- tests/command/add-files.sh | 2 +- tests/command/aggregate.sh | 2 +- tests/command/attributes.sh | 2 +- tests/command/autorecod.sh | 2 +- tests/command/beg-data.sh | 2 +- tests/command/bignum.sh | 2 +- tests/command/correlation.sh | 6 +- tests/command/count.sh | 4 +- tests/command/data-list.sh | 2 +- tests/command/do-if.sh | 2 +- tests/command/do-repeat.sh | 2 +- tests/command/erase.sh | 4 +- tests/command/examine-extremes.sh | 2 +- tests/command/examine-percentiles.sh | 2 +- tests/command/examine.sh | 2 +- tests/command/file-handle.sh | 2 +- tests/command/file-label.sh | 2 +- tests/command/filter.sh | 2 +- tests/command/flip.sh | 2 +- tests/command/get-data-gnm.sh | 4 +- tests/command/get-data-psql.sh | 8 +- tests/command/get-data-txt-examples.sh | 2 +- tests/command/get-data-txt-importcases.sh | 2 +- tests/command/get-data-txt.sh | 2 +- tests/command/import-export.sh | 2 +- tests/command/input-program.sh | 10 +- tests/command/insert.sh | 14 +- tests/command/lag.sh | 2 +- tests/command/line-ends.sh | 2 +- tests/command/list.sh | 2 +- tests/command/longvars.sh | 2 +- tests/command/loop.sh | 2 +- tests/command/match-files.sh | 6 +- tests/command/missing-values.sh | 2 +- tests/command/n_of_cases.sh | 2 +- tests/command/no_case_size.sh | 2 +- tests/command/npar-binomial.sh | 2 +- tests/command/npar-chisquare.sh | 8 +- tests/command/npar-sign.sh | 2 +- tests/command/npar-wilcoxon.sh | 4 +- tests/command/oneway-missing.sh | 6 +- tests/command/oneway-with-splits.sh | 2 +- tests/command/oneway.sh | 2 +- tests/command/permissions.sh | 4 +- tests/command/print-strings.sh | 2 +- tests/command/print.sh | 2 +- tests/command/rank.sh | 8 +- tests/command/regression-qr.sh | 2 +- tests/command/regression.sh | 2 +- tests/command/reliability.sh | 2 +- tests/command/rename.sh | 2 +- tests/command/roc.sh | 2 +- tests/command/roc2.sh | 2 +- tests/command/sample.sh | 2 +- tests/command/sort.sh | 2 +- tests/command/split-file.sh | 2 +- tests/command/sysfile-info.sh | 2 +- tests/command/sysfiles-old.sh | 2 +- tests/command/sysfiles.sh | 2 +- tests/command/t-test-1-indep-val.sh | 2 +- tests/command/t-test-1-sample-missing-anal.sh | 4 +- tests/command/t-test-1-sample-missing-list.sh | 4 +- tests/command/t-test-1s.sh | 2 +- tests/command/t-test-groups.sh | 2 +- tests/command/t-test-indep-missing-anal.sh | 4 +- tests/command/t-test-indep-missing-list.sh | 4 +- tests/command/t-test-paired-missing-anal.sh | 4 +- tests/command/t-test-paired-missing-list.sh | 4 +- tests/command/t-test-pairs.sh | 2 +- tests/command/tabs.sh | 2 +- tests/command/trimmed-mean.sh | 2 +- tests/command/update.sh | 2 +- tests/command/use.sh | 2 +- tests/command/variable-display.sh | 2 +- tests/command/vector.sh | 2 +- tests/command/very-long-strings.sh | 6 +- tests/command/weight.sh | 2 +- tests/coverage.sh | 2 +- tests/expressions/epoch.sh | 2 +- tests/expressions/expressions.sh | 8 +- tests/expressions/randist.sh | 2 +- tests/expressions/valuelabel.sh | 2 +- tests/expressions/variables.sh | 2 +- tests/expressions/vectors.sh | 2 +- tests/formats/360.sh | 2 +- tests/formats/bcd-in.sh | 2 +- tests/formats/binhex-out.sh | 2 +- tests/formats/date-in.sh | 2 +- tests/formats/date-out.sh | 4 +- tests/formats/float-format.sh | 2 +- tests/formats/format-guesser.sh | 2 +- tests/formats/ib-in.sh | 2 +- tests/formats/legacy-in.sh | 2 +- tests/formats/month-in.sh | 2 +- tests/formats/month-out.sh | 3 +- tests/formats/num-in.sh | 2 +- tests/formats/num-out.sh | 2 +- tests/formats/time-in.sh | 2 +- tests/formats/time-out.sh | 2 +- tests/formats/wkday-in.sh | 2 +- tests/formats/wkday-out.sh | 2 +- tests/output/paper-size.sh | 4 +- tests/output/render-test.c | 97 +- tests/stats/descript-basic.sh | 2 +- tests/stats/descript-mean-bug.sh | 2 +- tests/stats/descript-missing.sh | 2 +- tests/stats/moments.sh | 4 +- tests/stats/ntiles.sh | 4 +- tests/stats/percentiles-compatible.sh | 2 +- tests/stats/percentiles-enhanced.sh | 8 +- tests/test_template | 2 +- tests/xforms/recode.sh | 2 +- 216 files changed, 1849 insertions(+), 3529 deletions(-) delete mode 100644 config/OChangeLog delete mode 100644 config/automake.mk delete mode 100644 config/devices delete mode 100644 doc/configuring.texi delete mode 100644 src/ui/command-line.c delete mode 100644 src/ui/command-line.h diff --git a/Makefile.am b/Makefile.am index 0022e1d7..b24afdaf 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 e8ffdd57..ad228eba 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 dbf6c3ad..00000000 --- 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 509706e5..00000000 --- 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 3bc685a0..00000000 --- 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 0963e1fd..b1065a8d 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 fc3d160b..00000000 --- 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 2b8a521d..86ddc31f 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 a57d4dda..19c9a6b9 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 830e82e4..ae3db342 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 6882aa21..fabec248 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 045b4e76..56b8a930 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 4f65a4b5..50be5df2 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 d8defd1d..e3047a33 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 327d716e..8e04d36a 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 c86ac9cc..d95e3a14 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 3de1715f..7dcb0e34 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 5ff0b8bc..1c35642f 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 ad277b58..55219724 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 46d5cd8d..6a1d184f 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 04c7e9f6..0172d80f 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 302cd913..dc69f11a 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 c0399377..47dea27e 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 6b4848a3..b3025156 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 88cd3ebe..e2125154 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 ffe8515f..b427df53 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 3584f30f..c6892793 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 625ce82a..6be9c43a 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 92929b54..df316373 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 6dd25174..61852c4a 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 3fb4cabf..93802078 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 3f9c177b..a3e14ba1 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 f02ae3de..ab38cd04 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 918f718c..593adf5a 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 743d0b6d..124380cf 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 46dddd49..00000000 --- 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 98edbea1..00000000 --- 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 b09a2f58..38110f5c 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 05cc421b..517d74af 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 ebca5533..ebf29c01 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 ddf915f2..1c04e93b 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 27a633f2..ee747ef9 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 61a108e0..c91a9fef 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 87493531..cfd87f3f 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 1366bd7a..10b3b7e9 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 383ccb8c..b5280fe6 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 c55dc57f..886bcdc2 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 e5d032d1..12251123 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 0bb8962f..98bd8dcf 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 43fd9f8c..449e90e9 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 ae60e79c..e3adb6ef 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 b0da13bb..c400e2e9 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 3c9365df..9cc3ad93 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 011c344d..17f4fedf 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 342f9bc0..f28762d1 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 71f9eab4..d8c83888 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 0d4a313e..2417cca9 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 88c42c3c..5bb13214 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 83aeae04..455ec39d 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 4f8a5731..4ba6a9d1 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 f7d19d83..5bebfed5 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 910ec0bb..d2835161 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 3ef691f3..6f02a508 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 964cf23c..bfb6f685 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 26de22b2..624f5a5b 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 dfdcbfdc..15ba9e2c 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 ca958cd1..c579cf36 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 b96b2fea..ddc2e7a6 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 49ce086c..dd4449d8 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 6cd172fd..03c51c6f 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 01fe8f9a..32f0e99f 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 6093c343..2afc044f 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 5e3edec3..86b382e6 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 c95cca1b..2ea650c8 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 b5c44b54..f6c2f002 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 d047b767..88e539c1 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 86b39c66..aa76a8c0 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 789fe32c..3417601a 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 4f07d302..9882d0da 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 600ca729..947e782b 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 408255d2..dce41774 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 73bce147..e848639c 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 e89ecadf..296952ce 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 6eb5b439..25b0dcfb 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 11e27406..1ec496eb 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 a255b2fc..27795114 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 a40eae66..8089a21a 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 657e5383..0296de0d 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 22b21566..0b66ddb1 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 d2016edb..7d931d46 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 e0a18b8f..6e6ac06e 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 cc3fc5e2..b0961302 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 dedfc6c8..b6cddb2a 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 2a1693b5..205a7d4c 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 c49103a8..0fdac2af 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 b197c574..5504e6cc 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 c5555f6f..47b09642 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 ba355580..3413a51f 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 e8c43ebc..e4940c08 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 b0c91fd3..2027c0a3 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 345ed852..96856d5a 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 774b6230..3f3a40ad 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 7388caaa..d552041e 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 4d57f661..1f07ca6d 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 f0542c0b..d2b164bf 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 48b0ef6e..ba51161c 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 f3a39e29..d4dece6c 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 e4a86dfa..6aaf8722 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 e3933d8f..45752fc7 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 41e1963c..8caa95c4 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 daec5de2..06c1d245 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 d6fd1db8..bba7d062 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 52b3dcb8..13c2a683 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 b3bbed7f..8d2dcdae 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 07d67ec9..8c68a8b9 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 491f79aa..42766614 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 f771c66d..71d7d279 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 bf2fcbf9..9cb0b959 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 8fc9f7ca..1e5b0db0 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 ed44ba6b..937f05f7 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 4dc929ea..a275f295 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 4c9c4161..13704791 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 7766ad44..141a75cc 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 cf4e6ca8..c6cf630c 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 081c7974..e15080ab 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 1e1a5164..3cc68499 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 8293f290..54d6cf86 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 01bd196c..f0560495 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 9a581402..b519d469 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 4aa5ebd2..07401286 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 c6d1464c..0d8f1697 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 de197c97..e8c39dd2 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 e78e4ae4..14612b90 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 dfeb29c3..7079fd4d 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 8040f44a..a57e5732 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 21d883e8..c49633e6 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 a125cbd6..29d56696 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 c01adf31..a4cde41b 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 24a3429b..bb685f84 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 4243f326..9e792122 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 9a776f6b..ea892b15 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 0f4b3fac..8ee9bb8e 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 1c7c629a..03c8117c 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 f4434a64..f259ea95 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 d4a4c6fd..5fe701b0 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 8466d8f5..35cc76de 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 c55101d5..cb7fb79b 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 db54cd5a..0234187e 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 5fb73006..b8ac189e 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 f135b4c1..a0b806e5 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 bc208af8..67e19c9f 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 1c4211ab..7cbb8156 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 88b4cd83..4ff48e51 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 c9344042..df86fa82 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 a4b9646e..1e08782a 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 081263ee..c6ab0461 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 ffed0fe6..7976a6e4 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 4d001bf7..c8d25e75 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 d66681be..409c1196 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 1452588d..5bebedc7 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 d5768252..35a4e53f 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 e136a0b2..fefe3afc 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 a671dff5..08b28888 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 0dcd194b..04f6b05e 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 cbac8dba..76943491 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 0db7e8e9..476f2fe0 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 c20d0f66..b0bb6ab4 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 57aef96a..c149ea56 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 aab5ecc4..8f2e8597 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 026dba7f..b77c5dc1 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 b1e4157b..5c40a65c 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 f034651a..700c1ca9 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 eb23b6a1..4dc40cd8 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 addb170b..0d05c5ab 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 28843920..f410a9f5 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 92615a64..4d4da661 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 b6bc661f..7b26cd7b 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 1cf74f34..5bf71719 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 06a31867..a0da5f12 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 e9d20e91..e7130c14 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 40a3ca9c..5c6ce31b 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 de91adc6..3a210783 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 1ceab308..dcbfc0ac 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 339abed4..49ad4f7d 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 58fe386d..88a57e5f 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 1b5b92e2..c751689e 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 b4f3ffca..64ea80d1 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 9205f7fc..3eb41404 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 9c156efd..57f928cf 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 934f4302..46c972fe 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 caffb03b..6fb4a972 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 edadc3f5..9488fb9b 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 6e28083c..5f360c73 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 2a6b6087..dee97909 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 75885a78..c84860a7 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 3a54c2f0..50c8c93b 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 1087a06f..eaab8e14 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 2d32a594..dd5f0272 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 65d0a42e..fba0ae89 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 5d8a2918..729db850 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 fedb73f6..3577a03b 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 532abed0..4a8853b4 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 fce8a17e..2370a1d5 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 89854285..5fc7c690 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 4f4eedb1..697cc426 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 2d539a1d..e546a45b 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 5c5accbb..03643f5b 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 5c996621..41f00bce 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 f36e5f2a..a0119cb4 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" -- 2.30.2