Implemented the SHOW command and massaged the SET command to fit
authorJohn Darrington <john@darrington.wattle.id.au>
Fri, 19 Mar 2004 16:58:57 +0000 (16:58 +0000)
committerJohn Darrington <john@darrington.wattle.id.au>
Fri, 19 Mar 2004 16:58:57 +0000 (16:58 +0000)
38 files changed:
TODO
doc/ChangeLog
doc/pspp.texi
po/en_GB.po
po/pspp.pot
src/ChangeLog
src/Makefile.am
src/aggregate.c
src/cmdline.c
src/command.c
src/command.def
src/copyleft.c [new file with mode: 0644]
src/copyleft.h [new file with mode: 0644]
src/data-in.c
src/data-list.c
src/data-out.c
src/error.c
src/filename.c
src/flip.c
src/get.c
src/getline.c
src/glob.c
src/lexer.c
src/loop.c
src/matrix.c
src/output.c
src/q2c.c
src/random.c
src/random.h
src/repeat.c
src/set.q
src/settings.h
src/sort.c
src/str.c
src/str.h
src/vfm.c
tests/bugs/random.sh
tests/command/print.sh

diff --git a/TODO b/TODO
index 7fb66b1deaf50320332571822d0da7b4a045bc65..0071c4b03847380dc21687a8a2408e44b0474d18 100644 (file)
--- a/TODO
+++ b/TODO
@@ -16,8 +16,6 @@ In debug mode hash table code should verify that collisions are reasonably low.
 
 Use posix_fadvise(POSIX_FADV_SEQUENTIAL) where available.
 
-random.c should not know about set_seed.
-
 Use AFM files instead of Groff font files, and include AFMs for our default
 fonts with the distribution.
 
index 99a3e95e3383017e0bcd861640e1d06c857000d0..fe4498659c6d2d74f8580b15d311e1209d9f4940 100644 (file)
@@ -1,3 +1,7 @@
+Sat Mar 20 00:53:10 WST 2004 John Darrington <john@darrington.wattle.id.au>
+
+       * pspp.texi: Added a brief mention of the SHOW command.
+       
 Sun Mar 14 21:50:56 2004  Ben Pfaff  <blp@gnu.org>
 
        * pspp.texi: Added details on how various features interact.
index e79f8f62392fe63b061e95bd0a34d65a2f28320b..31ad84b75c03ef6a7f76ae0c5fa1ae1d25faee0b 100644 (file)
@@ -8057,6 +8057,7 @@ encountered in the input.
 * INCLUDE::                     Include a file within the current one.
 * QUIT::                        Terminate the PSPP session.
 * SET::                         Adjust PSPP runtime parameters.
+* SHOW::                        Display runtime parameters.
 * SUBTITLE::                    Provide a document subtitle.
 * TITLE::                       Provide a document title.
 @end menu
@@ -8236,7 +8237,7 @@ to the operating system.
 
 This command is not valid within a command file.
 
-@node SET, SUBTITLE, QUIT, Utilities
+@node SET, SHOW, QUIT, Utilities
 @section SET
 @vindex SET
 
@@ -8551,7 +8552,33 @@ Be aware that this setting does not guarantee safety (commands can still
 overwrite files, for instance) but it is an improvement.
 @end table
 
-@node SUBTITLE, TITLE, SET, Utilities
+@node SHOW, SUBTITLE, SET, Utilities
+@comment  node-name,  next,  previous,  up
+@section SHOW
+@vindex SHOW
+
+@display
+SHOW
+        /@var{subcommand}
+        
+@end display
+
+@cmd{SHOW} can be used to display the current state of PSPP's
+execution parameters.  All of the parameters which can be changed 
+using  @code{SET} @xref{SET}, can be examined using @cmd{SHOW}, by
+using a subcommand with the same name.
+In addition, @code{SHOW} supports the following subcommands:
+
+@table @code
+@item WARRANTY
+Show details of the lack of warranty for PSPP.
+@item COPYING
+Display the terms of PSPP's copyright licence @ref{License}.
+@end table
+
+
+
+@node SUBTITLE, TITLE, SHOW, Utilities
 @section SUBTITLE
 @vindex SUBTITLE
 
index 82622e7bb110a1af4fe99f0c2171f6d65b2d7179..80e9967b053ad6303d42c66f1747fbcda1aa27c7 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PSPP 0.3.1\n"
 "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
-"POT-Creation-Date: 2004-03-13 14:14+0800\n"
+"POT-Creation-Date: 2004-03-20 00:30+0800\n"
 "PO-Revision-Date: 2004-01-23 13:04+0800\n"
 "Last-Translator: John Darrington <john@darrington.wattle.id.au>\n"
 "Language-Team: John Darrington <john@darrington.wattle.id.au>\n"
@@ -16,56 +16,56 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n!=1);\n"
 
-#: src/aggregate.c:190 src/aggregate.c:231 src/data-list.c:1363
+#: src/aggregate.c:183 src/aggregate.c:216 src/data-list.c:1363
 #: src/data-list.c:1398 src/data-list.c:1411 src/data-list.c:1424
 #: src/data-list.c:1457
 #, c-format
 msgid "%s subcommand given multiple times."
 msgstr ""
 
-#: src/aggregate.c:216
+#: src/aggregate.c:203
 msgid "while expecting COLUMNWISE"
 msgstr ""
 
-#: src/aggregate.c:261
+#: src/aggregate.c:244
 msgid "BREAK subcommand not specified."
 msgstr ""
 
-#: src/aggregate.c:490
+#: src/aggregate.c:400
 msgid "expecting aggregation function"
 msgstr ""
 
-#: src/aggregate.c:506
+#: src/aggregate.c:416
 #, c-format
 msgid "Unknown aggregation function %s."
 msgstr ""
 
-#: src/aggregate.c:521
+#: src/aggregate.c:431
 msgid "expecting `('"
 msgstr ""
 
-#: src/aggregate.c:556
+#: src/aggregate.c:466
 #, c-format
 msgid "Missing argument %d to %s."
 msgstr ""
 
-#: src/aggregate.c:564
+#: src/aggregate.c:474
 #, c-format
 msgid "Arguments to %s must be of same type as source variables."
 msgstr ""
 
-#: src/aggregate.c:574 src/expr-prs.c:665
+#: src/aggregate.c:484 src/expr-prs.c:665
 msgid "expecting `)'"
 msgstr ""
 
-#: src/aggregate.c:586 src/autorecode.c:110
+#: src/aggregate.c:496
 #, c-format
 msgid ""
 "Number of source variables (%d) does not match number of target variables (%"
 "d)."
 msgstr ""
 
-#: src/aggregate.c:653
+#: src/aggregate.c:564
 #, c-format
 msgid ""
 "Variable name %s is not unique within the aggregate file dictionary, which "
@@ -221,31 +221,36 @@ msgstr ""
 msgid "%s - Page %d"
 msgstr ""
 
-#: src/autorecode.c:121 src/command.c:697 src/compute.c:293
+#: src/autorecode.c:121
+#, c-format
+msgid "Source variable count (%d) does not match target variable count (%d)."
+msgstr ""
+
+#: src/autorecode.c:138 src/command.c:690 src/compute.c:293
 #: src/data-list.c:380 src/data-list.c:878 src/data-list.c:1690
 #: src/do-if.c:263 src/get.c:381 src/lexer.c:387 src/loop.c:241
-#: src/matrix-data.c:510 src/print.c:338 src/print.c:1060 src/recode.c:409
+#: src/matrix-data.c:510 src/print.c:338 src/print.c:1060 src/recode.c:405
 #: src/sel-if.c:56 src/sel-if.c:138 src/vector.c:194 src/file-handle.q:88
 msgid "expecting end of command"
 msgstr ""
 
-#: src/autorecode.c:131
+#: src/autorecode.c:148
 #, c-format
 msgid "Target variable %s duplicates existing variable %s."
 msgstr ""
 
-#: src/autorecode.c:138
+#: src/autorecode.c:155
 #, c-format
 msgid "Duplicate variable name %s among target variables."
 msgstr ""
 
-#: src/cmdline.c:112 src/cmdline.c:131 src/cmdline.c:143 src/command.c:196
-#: src/set.q:315 src/set.q:317 src/set.q:857
+#: src/cmdline.c:114 src/cmdline.c:133 src/cmdline.c:145 src/command.c:196
+#: src/set.q:416 src/set.q:418 src/set.q:958
 #, c-format
 msgid "%s is not yet implemented."
 msgstr ""
 
-#: src/cmdline.c:157
+#: src/cmdline.c:159
 msgid ""
 "\n"
 "Copyright (C) 1997-9, 2000 Free Software Foundation, Inc.\n"
@@ -255,7 +260,7 @@ msgid ""
 "Written by Ben Pfaff <blp@gnu.org>."
 msgstr ""
 
-#: src/cmdline.c:217
+#: src/cmdline.c:221
 #, c-format
 msgid ""
 "PSPP, a program for statistical analysis of sample data.\n"
@@ -299,7 +304,7 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/cmdline.c:249
+#: src/cmdline.c:253
 #, c-format
 msgid ""
 "\n"
@@ -378,30 +383,30 @@ msgstr ""
 msgid "The sentinel may not be the empty string."
 msgstr ""
 
-#: src/command.c:574
+#: src/command.c:576 src/command.c:708
 msgid "This command not allowed when the SAFER option is set."
 msgstr ""
 
-#: src/command.c:597
+#: src/command.c:590
 #, c-format
 msgid "Error removing `%s': %s."
 msgstr ""
 
-#: src/command.c:647
+#: src/command.c:640
 #, c-format
 msgid "Couldn't fork: %s."
 msgstr ""
 
-#: src/command.c:688
+#: src/command.c:681
 #, c-format
 msgid "Error executing command: %s."
 msgstr ""
 
-#: src/command.c:734
+#: src/command.c:731
 msgid "No operating system support for this command."
 msgstr ""
 
-#: src/command.c:763
+#: src/command.c:760
 msgid "This command is not valid in a syntax file."
 msgstr ""
 
@@ -427,11 +432,11 @@ msgstr ""
 msgid "Extra characters after expression."
 msgstr ""
 
-#: src/count.c:171
+#: src/count.c:156
 msgid "Destination cannot be a string variable."
 msgstr ""
 
-#: src/count.c:282
+#: src/count.c:263
 #, c-format
 msgid ""
 "%g THRU %g is not a valid range.  The number following THRU must be at least "
@@ -709,7 +714,7 @@ msgid ""
 msgstr ""
 
 #: src/data-list.c:768 src/data-list.c:899 src/print.c:803
-#: src/sysfile-info.c:135 src/sysfile-info.c:370 src/vfm.c:1148
+#: src/sysfile-info.c:135 src/sysfile-info.c:370 src/vfm.c:1011
 #: src/descript.q:791
 msgid "Variable"
 msgstr ""
@@ -1026,25 +1031,25 @@ msgstr ""
 msgid "Error writing file %s: %s."
 msgstr ""
 
-#: src/dfm.c:657
+#: src/dfm.c:656
 msgid ""
 "This command is not valid here since the current input program does not "
 "access the inline file."
 msgstr ""
 
-#: src/dfm.c:664
+#: src/dfm.c:663
 msgid "inline file: Opening for reading."
 msgstr ""
 
-#: src/dfm.c:678
+#: src/dfm.c:677
 msgid "Skipping remaining inline data."
 msgstr ""
 
-#: src/dfm.c:690
+#: src/dfm.c:689
 msgid "reading as a data file"
 msgstr ""
 
-#: src/dfm.c:697
+#: src/dfm.c:696
 msgid "writing as a data file"
 msgstr ""
 
@@ -1089,41 +1094,41 @@ msgstr ""
 msgid "DO IF %d: missing\n"
 msgstr ""
 
-#: src/error.c:113
+#: src/error.c:115
 msgid "Terminating NOW due to a fatal error!"
 msgstr ""
 
-#: src/error.c:190
+#: src/error.c:192
 msgid "Terminating execution of syntax file due to error."
 msgstr ""
 
-#: src/error.c:192
+#: src/error.c:194
 #, c-format
 msgid "Errors (%d) exceeds limit (%d)."
 msgstr ""
 
-#: src/error.c:195
+#: src/error.c:197
 #, c-format
 msgid "Warnings (%d) exceed limit (%d)."
 msgstr ""
 
-#: src/error.c:253
+#: src/error.c:255
 msgid "fatal"
 msgstr ""
 
-#: src/error.c:255 src/error.c:262 src/error.c:265 src/expr-prs.c:1464
+#: src/error.c:257 src/error.c:264 src/error.c:267 src/expr-prs.c:1464
 msgid "error"
 msgstr ""
 
-#: src/error.c:256 src/error.c:263 src/error.c:266
+#: src/error.c:258 src/error.c:265 src/error.c:268
 msgid "warning"
 msgstr ""
 
-#: src/error.c:257 src/error.c:267
+#: src/error.c:259 src/error.c:269
 msgid "note"
 msgstr ""
 
-#: src/error.c:259 src/error.c:260
+#: src/error.c:261 src/error.c:262
 msgid "installation error"
 msgstr ""
 
@@ -1531,59 +1536,64 @@ msgstr ""
 msgid "Unknown record type %g."
 msgstr ""
 
-#: src/flip.c:210
+#: src/flip.c:76
+msgid ""
+"FLIP ignores TEMPORARY.  Temporary transformations will be made permanent."
+msgstr ""
+
+#: src/flip.c:217
 #, c-format
 msgid "Could not create acceptable variant for variable %s."
 msgstr ""
 
-#: src/flip.c:226
+#: src/flip.c:233
 msgid "Cannot create more than 99999 variable names."
 msgstr ""
 
-#: src/flip.c:270
+#: src/flip.c:277
 msgid "Could not create temporary file for FLIP."
 msgstr ""
 
-#: src/flip.c:277 src/flip.c:339
+#: src/flip.c:284 src/flip.c:347
 #, c-format
 msgid "Error writing FLIP file: %s."
 msgstr ""
 
-#: src/flip.c:381
+#: src/flip.c:389
 #, c-format
 msgid "Error rewinding FLIP file: %s."
 msgstr ""
 
-#: src/flip.c:385
+#: src/flip.c:393
 msgid "Error creating FLIP source file."
 msgstr ""
 
-#: src/flip.c:394
+#: src/flip.c:402
 #, c-format
 msgid "Error reading FLIP file: %s."
 msgstr ""
 
-#: src/flip.c:406
+#: src/flip.c:414
 #, c-format
 msgid "Error seeking FLIP source file: %s."
 msgstr ""
 
-#: src/flip.c:411
+#: src/flip.c:419
 #, c-format
 msgid "Error writing FLIP source file: %s."
 msgstr ""
 
-#: src/flip.c:422
+#: src/flip.c:430
 #, c-format
 msgid "Error rewind FLIP source file: %s."
 msgstr ""
 
-#: src/flip.c:470
+#: src/flip.c:478
 #, c-format
 msgid "Error reading FLIP temporary file: %s."
 msgstr ""
 
-#: src/flip.c:473
+#: src/flip.c:481
 msgid "Unexpected end of file reading FLIP temporary file."
 msgstr ""
 
@@ -1697,7 +1707,7 @@ msgstr ""
 msgid "GET translation table from file to memory:\n"
 msgstr ""
 
-#: src/get.c:117 src/get.c:1416
+#: src/get.c:117 src/get.c:1429
 #, c-format
 msgid "  %8s from %3d,%3d to %3d,%3d\n"
 msgstr ""
@@ -1737,110 +1747,95 @@ msgid ""
 "Variables in dictionary:\n"
 msgstr ""
 
-#: src/get.c:607
+#: src/get.c:610
 msgid "The BY subcommand may be given once at most."
 msgstr ""
 
-#: src/get.c:674
+#: src/get.c:677
 msgid "The active file may not be specified more than once."
 msgstr ""
 
-#: src/get.c:683
+#: src/get.c:686
 msgid "Cannot specify the active file since no active file has been defined."
 msgstr ""
 
-#: src/get.c:715
+#: src/get.c:694
+msgid ""
+"MATCH FILES may not be used after TEMPORARY when the active file is an input "
+"source.  Temporary transformations will be made permanent."
+msgstr ""
+
+#: src/get.c:727
 msgid ""
 "IN, FIRST, and LAST subcommands may not occur before the first FILE or TABLE."
 msgstr ""
 
-#: src/get.c:747
+#: src/get.c:759
 #, c-format
 msgid "Multiple %s subcommands for a single FILE or TABLE."
 msgstr ""
 
-#: src/get.c:757
+#: src/get.c:769
 #, c-format
 msgid "Duplicate variable name %s while creating %s variable."
 msgstr ""
 
-#: src/get.c:771
+#: src/get.c:783
 msgid ""
 "RENAME, KEEP, and DROP subcommands may not occur before the first FILE or "
 "TABLE."
 msgstr ""
 
-#: src/get.c:795
+#: src/get.c:807
 msgid "The BY subcommand is required when a TABLE subcommand is given."
 msgstr ""
 
-#: src/get.c:816
+#: src/get.c:828
 #, c-format
 msgid "File %s lacks BY variable %s."
 msgstr ""
 
-#: src/get.c:1328
+#: src/get.c:1341
 #, c-format
 msgid ""
 "Variable %s in file %s (%s) has different type or width from the same "
 "variable in earlier file (%s)."
 msgstr ""
 
-#: src/get.c:1378
+#: src/get.c:1391
 msgid "expecting COMM or TAPE"
 msgstr ""
 
-#: src/get.c:1411
+#: src/get.c:1424
 #, c-format
 msgid "IMPORT translation table from file to memory:\n"
 msgstr ""
 
-#: src/getline.c:161
+#: src/getline.c:163
 #, c-format
 msgid "Can't find `%s' in include file search path."
 msgstr ""
 
-#: src/getline.c:316
+#: src/getline.c:318
 #, c-format
 msgid "%s: Opening as syntax file."
 msgstr ""
 
-#: src/getline.c:321
+#: src/getline.c:323
 #, c-format
 msgid "Opening `%s': %s."
 msgstr ""
 
-#: src/getline.c:330 src/html.c:330 src/postscript.c:1461
+#: src/getline.c:332 src/html.c:330 src/postscript.c:1461
 #, c-format
 msgid "Reading `%s': %s."
 msgstr ""
 
-#: src/getline.c:388
+#: src/getline.c:390
 #, c-format
 msgid "Closing `%s': %s."
 msgstr ""
 
-#: src/glob.c:212
-msgid "data> "
-msgstr ""
-
-#: src/glob.c:269
-msgid "Specify a terminal type with `setenv TERM <yourtype>'."
-msgstr ""
-
-#: src/glob.c:275
-msgid "Could not access the termcap data base."
-msgstr ""
-
-#: src/glob.c:277
-#, c-format
-msgid "Terminal type `%s' is not defined."
-msgstr ""
-
-#: src/glob.c:278
-msgid "Assuming screen of size 79x25."
-msgstr ""
-
 #: src/groff-font.c:107
 #, c-format
 msgid "%s: Opening Groff font file..."
@@ -2110,11 +2105,11 @@ msgstr ""
 msgid "expecting %s"
 msgstr ""
 
-#: src/lexer.c:524
+#: src/lexer.c:524 src/val-labs.c:148
 msgid "expecting string"
 msgstr ""
 
-#: src/lexer.c:538
+#: src/lexer.c:538 src/val-labs.c:157
 msgid "expecting integer"
 msgstr ""
 
@@ -2198,32 +2193,6 @@ msgstr ""
 msgid "%s without %s."
 msgstr ""
 
-#: src/main.c:71
-msgid "Error initializing output drivers."
-msgstr ""
-
-#: src/main.c:132
-msgid "This command not executed."
-msgstr ""
-
-#: src/main.c:136
-msgid ""
-"Skipping the rest of this command.  Part of this command may have been "
-"executed."
-msgstr ""
-
-#: src/main.c:141
-msgid ""
-"Skipping the rest of this command.  This command was fully executed up to "
-"this point."
-msgstr ""
-
-#: src/main.c:146
-msgid ""
-"Trailing garbage was encountered following this command.  The command was "
-"fully executed to this point."
-msgstr ""
-
 #: src/matrix-data.c:191
 msgid "VARIABLES subcommand multiply specified."
 msgstr ""
@@ -2331,69 +2300,69 @@ msgstr ""
 msgid "End of line expected %s while reading %s."
 msgstr ""
 
-#: src/matrix-data.c:1179
+#: src/matrix-data.c:1174
 #, c-format
 msgid "expecting value for %s %s"
 msgstr ""
 
-#: src/matrix-data.c:1339
+#: src/matrix-data.c:1336
 #, c-format
 msgid "Syntax error expecting SPLIT FILE value %s."
 msgstr ""
 
-#: src/matrix-data.c:1348
+#: src/matrix-data.c:1345
 #, c-format
 msgid "Expecting value %g for %s."
 msgstr ""
 
-#: src/matrix-data.c:1387 src/matrix-data.c:1842
+#: src/matrix-data.c:1386 src/matrix-data.c:1854
 #, c-format
 msgid "Syntax error expecting factor value %s."
 msgstr ""
 
-#: src/matrix-data.c:1396
+#: src/matrix-data.c:1395
 #, c-format
 msgid "Syntax error expecting value %g for %s %s."
 msgstr ""
 
-#: src/matrix-data.c:1623
+#: src/matrix-data.c:1631
 #, c-format
 msgid "Syntax error %s expecting SPLIT FILE value."
 msgstr ""
 
-#: src/matrix-data.c:1751
+#: src/matrix-data.c:1761
 #, c-format
 msgid ""
 "Expected %d lines of data for %s content; actually saw %d lines.  No data "
 "will be output for this content."
 msgstr ""
 
-#: src/matrix-data.c:1785
+#: src/matrix-data.c:1796
 #, c-format
 msgid "Multiply specified ROWTYPE_ %s."
 msgstr ""
 
-#: src/matrix-data.c:1790
+#: src/matrix-data.c:1801
 #, c-format
 msgid "Syntax error %s expecting ROWTYPE_ string."
 msgstr ""
 
-#: src/matrix-data.c:1810
+#: src/matrix-data.c:1821
 #, c-format
 msgid "Syntax error %s."
 msgstr ""
 
-#: src/matrix-data.c:1958
+#: src/matrix-data.c:1971
 #, c-format
 msgid "Duplicate specification for %s."
 msgstr ""
 
-#: src/matrix-data.c:1970
+#: src/matrix-data.c:1983
 #, c-format
 msgid "Too many rows of matrix data for %s."
 msgstr ""
 
-#: src/matrix-data.c:2016
+#: src/matrix-data.c:2029
 #, c-format
 msgid "Syntax error expecting value for %s %s."
 msgstr ""
@@ -2458,69 +2427,75 @@ msgstr ""
 msgid "(!!!INTERNAL ERROR--%d!!!)\n"
 msgstr ""
 
-#: src/modify-vars.c:108
+#: src/modify-vars.c:88
+msgid ""
+"MODIFY VARS may not be used after TEMPORARY.  Temporary transformations will "
+"be made permanent."
+msgstr ""
+
+#: src/modify-vars.c:115
 msgid "REORDER subcommand may be given at most once."
 msgstr ""
 
-#: src/modify-vars.c:131
+#: src/modify-vars.c:138
 msgid "Cannot specify ALL after specifying a set of variables."
 msgstr ""
 
-#: src/modify-vars.c:141
+#: src/modify-vars.c:148
 msgid "`(' expected on REORDER subcommand."
 msgstr ""
 
-#: src/modify-vars.c:153
+#: src/modify-vars.c:160
 msgid "`)' expected following variable names on REORDER subcommand."
 msgstr ""
 
-#: src/modify-vars.c:171
+#: src/modify-vars.c:178
 msgid "RENAME subcommand may be given at most once."
 msgstr ""
 
-#: src/modify-vars.c:184
+#: src/modify-vars.c:191
 msgid "`(' expected on RENAME subcommand."
 msgstr ""
 
-#: src/modify-vars.c:192
+#: src/modify-vars.c:199
 msgid ""
 "`=' expected between lists of new and old variable names on RENAME "
 "subcommand."
 msgstr ""
 
-#: src/modify-vars.c:200 src/rename-vars.c:70
+#: src/modify-vars.c:207 src/rename-vars.c:77
 #, c-format
 msgid ""
 "Differing number of variables in old name list (%d) and in new name list (%"
 "d)."
 msgstr ""
 
-#: src/modify-vars.c:211
+#: src/modify-vars.c:218
 msgid "`)' expected after variable lists on RENAME subcommand."
 msgstr ""
 
-#: src/modify-vars.c:225
+#: src/modify-vars.c:232
 msgid ""
 "KEEP subcommand may be given at most once.  It may notbe given in "
 "conjunction with the DROP subcommand."
 msgstr ""
 
-#: src/modify-vars.c:267
+#: src/modify-vars.c:274
 msgid ""
 "DROP subcommand may be given at most once.  It may not be given in "
 "conjunction with the KEEP subcommand."
 msgstr ""
 
-#: src/modify-vars.c:293
+#: src/modify-vars.c:300
 #, c-format
 msgid "Unrecognized subcommand name `%s'."
 msgstr ""
 
-#: src/modify-vars.c:295
+#: src/modify-vars.c:302
 msgid "Subcommand name expected."
 msgstr ""
 
-#: src/modify-vars.c:303
+#: src/modify-vars.c:310
 msgid "`/' or `.' expected."
 msgstr ""
 
@@ -3137,14 +3112,14 @@ msgid ""
 "SPACE a negative number of lines."
 msgstr ""
 
-#: src/recode.c:288
+#: src/recode.c:283
 #, c-format
 msgid ""
 "%d variable(s) cannot be recoded into %d variable(s).  Specify the same "
 "number of variables as input and output variables."
 msgstr ""
 
-#: src/recode.c:302
+#: src/recode.c:297
 #, c-format
 msgid ""
 "There is no string variable named %s.  (All string variables specified on "
@@ -3152,77 +3127,73 @@ msgid ""
 "variable.)"
 msgstr ""
 
-#: src/recode.c:311
+#: src/recode.c:306
 #, c-format
 msgid ""
 "Type mismatch between input and output variables.  Output variable %s is not "
 "a string variable, but all the input variables are string variables."
 msgstr ""
 
-#: src/recode.c:330
+#: src/recode.c:325
 #, c-format
 msgid "Type mismatch after INTO: %s is not a numeric variable."
 msgstr ""
 
-#: src/recode.c:360
+#: src/recode.c:355
 msgid ""
 "INTO must be used when the input values are numeric and output values are "
 "string."
 msgstr ""
 
-#: src/recode.c:368
+#: src/recode.c:363
 msgid ""
 "INTO must be used when the input values are string and output values are "
 "numeric."
 msgstr ""
 
-#: src/recode.c:493
+#: src/recode.c:486
 msgid "expecting output value"
 msgstr ""
 
-#: src/recode.c:507
+#: src/recode.c:500
 msgid ""
 "Inconsistent output types.  The output values must be all numeric or all "
 "string."
 msgstr ""
 
-#: src/recode.c:558
+#: src/recode.c:551
 msgid "following LO THRU"
 msgstr ""
 
-#: src/recode.c:574 src/recode.c:603
+#: src/recode.c:567 src/recode.c:596
 msgid "in source value"
 msgstr ""
 
-#: src/recode.c:616
+#: src/recode.c:609
 msgid ""
 "Keyword CONVERT may only be used with string input values and numeric output "
 "values."
 msgstr ""
 
-#: src/recode.c:876
-#, c-format
-msgid "!!END!!"
-msgstr ""
-
-#: src/recode.c:897 src/recode.c:913
-#, c-format
-msgid "!!ERROR!!"
+#: src/rename-vars.c:47
+msgid ""
+"RENAME VARS may not be used after TEMPORARY.  Temporary transformations will "
+"be made permanent."
 msgstr ""
 
-#: src/rename-vars.c:55
+#: src/rename-vars.c:62
 msgid "`(' expected."
 msgstr ""
 
-#: src/rename-vars.c:63
+#: src/rename-vars.c:70
 msgid "`=' expected between lists of new and old variable names."
 msgstr ""
 
-#: src/rename-vars.c:81
+#: src/rename-vars.c:88
 msgid "`)' expected after variable names."
 msgstr ""
 
-#: src/rename-vars.c:91
+#: src/rename-vars.c:98
 #, c-format
 msgid "Renaming would duplicate variable name %s."
 msgstr ""
@@ -3704,65 +3675,71 @@ msgstr ""
 msgid "writing as a system file"
 msgstr ""
 
-#: src/sort.c:122
-msgid "`A' or `D' expected inside parentheses."
+#: src/sort.c:82
+msgid ""
+"SORT CASES may not be used after TEMPORARY.  Temporary transformations will "
+"be made permanent."
 msgstr ""
 
 #: src/sort.c:127
+msgid "`A' or `D' expected inside parentheses."
+msgstr ""
+
+#: src/sort.c:132
 msgid "`)' expected."
 msgstr ""
 
-#: src/sort.c:418
+#: src/sort.c:421
 #, c-format
 msgid "%s: Creating temporary directory: %s."
 msgstr ""
 
-#: src/sort.c:449
+#: src/sort.c:452
 #, c-format
 msgid "Generating temporary directory name failed: %s."
 msgstr ""
 
-#: src/sort.c:457
+#: src/sort.c:460
 #, c-format
 msgid "Creating temporary directory failed: %s."
 msgstr ""
 
-#: src/sort.c:509
+#: src/sort.c:512
 #, c-format
 msgid "%s: Error removing directory for temporary files: %s."
 msgstr ""
 
-#: src/sort.c:538
+#: src/sort.c:541
 #, c-format
 msgid "%s: Error opening temporary file for %s: %s."
 msgstr ""
 
-#: src/sort.c:555
+#: src/sort.c:558
 #, c-format
 msgid "%s: Error closing temporary file: %s."
 msgstr ""
 
-#: src/sort.c:571
+#: src/sort.c:574
 #, c-format
 msgid "%s: Error removing temporary file: %s."
 msgstr ""
 
-#: src/sort.c:587
+#: src/sort.c:590
 #, c-format
 msgid "%s: Error writing temporary file: %s."
 msgstr ""
 
-#: src/sort.c:605
+#: src/sort.c:608
 #, c-format
 msgid "%s: Error reading temporary file: %s."
 msgstr ""
 
-#: src/sort.c:608
+#: src/sort.c:611
 #, c-format
 msgid "%s: Unexpected end of temporary file."
 msgstr ""
 
-#: src/sort.c:798 src/sort.c:1033
+#: src/sort.c:806 src/sort.c:1037
 #, c-format
 msgid ""
 "Out of memory.  Could not allocate room for minimum of %d cases of %d bytes "
@@ -3870,7 +3847,7 @@ msgstr ""
 msgid "Documents in the active file:"
 msgstr ""
 
-#: src/sysfile-info.c:377 src/sysfile-info.c:535 src/vfm.c:1150
+#: src/sysfile-info.c:377 src/sysfile-info.c:535 src/vfm.c:1013
 msgid "Label"
 msgstr ""
 
@@ -3893,8 +3870,8 @@ msgstr ""
 msgid "Missing Values: "
 msgstr ""
 
-#: src/sysfile-info.c:534 src/vfm.c:1149 src/crosstabs.q:1158
-#: src/crosstabs.q:1185 src/crosstabs.q:1205 src/crosstabs.q:1227
+#: src/sysfile-info.c:534 src/vfm.c:1012 src/crosstabs.q:1159
+#: src/crosstabs.q:1186 src/crosstabs.q:1206 src/crosstabs.q:1228
 #: src/frequencies.q:1009 src/frequencies.q:1126
 msgid "Value"
 msgstr ""
@@ -3918,11 +3895,11 @@ msgid ""
 "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n"
 msgstr ""
 
-#: src/temporary.c:49
+#: src/temporary.c:47
 msgid "This command is not valid inside DO IF or LOOP."
 msgstr ""
 
-#: src/temporary.c:56
+#: src/temporary.c:54
 msgid ""
 "This command may only appear once between procedures and procedure-like "
 "commands."
@@ -3952,39 +3929,22 @@ msgstr ""
 msgid "Document entered %s %02d:%02d:%02d by %s (%s):"
 msgstr ""
 
-#: src/val-labs.c:138
+#: src/val-labs.c:112
 #, c-format
 msgid ""
 "It is not possible to assign value labels to long string variables such as %"
 "s."
 msgstr ""
 
-#: src/val-labs.c:176
-msgid "String expected for value."
-msgstr ""
-
-#: src/val-labs.c:185
-msgid "Number expected for value."
-msgstr ""
-
-#: src/val-labs.c:189
+#: src/val-labs.c:161
 #, c-format
 msgid "Value label `%g' is not integer."
 msgstr ""
 
-#: src/val-labs.c:199
+#: src/val-labs.c:171
 msgid "Truncating value label to 60 characters."
 msgstr ""
 
-#: src/val-labs.c:220
-msgid "Value labels:"
-msgstr ""
-
-#: src/val-labs.c:237
-#, c-format
-msgid "    (no value labels)\n"
-msgstr ""
-
 #: src/var-labs.c:53
 msgid "String expected for variable label."
 msgstr ""
@@ -4109,56 +4069,39 @@ msgid ""
 "the long form or the short form of VECTOR."
 msgstr ""
 
-#: src/vfm.c:391
-msgid "<NOVAR>"
+#: src/vfm.c:507
+#, c-format
+msgid ""
+"An error occurred creating a temporary file for use as the active file: %s."
 msgstr ""
 
-#: src/vfm.c:554
+#: src/vfm.c:520
 #, c-format
 msgid ""
-"An error occurred attempting to create a temporary file for use as the "
-"active file: %s."
+"An error occurred writing to a temporary file used as the active file: %s."
 msgstr ""
 
-#: src/vfm.c:579
+#: src/vfm.c:599
 #, c-format
 msgid ""
-"An error occurred while attempting to write to a temporary file used as the "
-"active file: %s."
+"Workspace limit of %d KB (%d cases at %d bytes each) overflowed.  Writing "
+"active file to disk."
 msgstr ""
 
-#: src/vfm.c:606
+#: src/vfm.c:631
 #, c-format
 msgid ""
 "An error occurred while attempting to rewind a temporary file used as the "
 "active file: %s."
 msgstr ""
 
-#: src/vfm.c:651
+#: src/vfm.c:680
 #, c-format
 msgid ""
 "An error occurred while attempting to read from a temporary file created for "
 "the active file: %s."
 msgstr ""
 
-#: src/vfm.c:755
-msgid "Virtual memory exhausted.  Writing active file to disk."
-msgstr ""
-
-#: src/vfm.c:758
-#, c-format
-msgid ""
-"Workspace limit of %d KB (%d cases at %d bytes each) overflowed.  Writing "
-"active file to disk."
-msgstr ""
-
-#: src/vfm.c:778 src/vfm.c:817
-#, c-format
-msgid ""
-"An error occurred while attempting to write to a temporary file created as "
-"the active file: %s."
-msgstr ""
-
 #: src/weight.c:54
 msgid "The weighting variable must be numeric."
 msgstr ""
@@ -4176,267 +4119,267 @@ msgstr ""
 msgid "Write mode ALL not allowed in general mode.  Assuming WRITE=CELLS."
 msgstr ""
 
-#: src/crosstabs.q:321
+#: src/crosstabs.q:322
 msgid "expecting BY"
 msgstr ""
 
-#: src/crosstabs.q:388
+#: src/crosstabs.q:389
 msgid "VARIABLES must be specified before TABLES."
 msgstr ""
 
-#: src/crosstabs.q:425
+#: src/crosstabs.q:426
 #, c-format
 msgid "Maximum value (%ld) less than minimum value (%ld)."
 msgstr ""
 
-#: src/crosstabs.q:859
+#: src/crosstabs.q:860
 msgid "Summary."
 msgstr ""
 
-#: src/crosstabs.q:861
+#: src/crosstabs.q:862
 msgid "Cases"
 msgstr ""
 
-#: src/crosstabs.q:862 src/frequencies.q:1007
+#: src/crosstabs.q:863 src/frequencies.q:1007
 msgid "Valid"
 msgstr ""
 
-#: src/crosstabs.q:863 src/frequencies.q:1074
+#: src/crosstabs.q:864 src/frequencies.q:1074
 msgid "Missing"
 msgstr ""
 
-#: src/crosstabs.q:864 src/crosstabs.q:1067 src/crosstabs.q:1800
+#: src/crosstabs.q:865 src/crosstabs.q:1068 src/crosstabs.q:1801
 #: src/frequencies.q:1083
 msgid "Total"
 msgstr ""
 
-#: src/crosstabs.q:874 src/t-test.q:655 src/t-test.q:678 src/t-test.q:769
-#: src/t-test.q:1343
+#: src/crosstabs.q:875 src/t-test.q:657 src/t-test.q:680 src/t-test.q:771
+#: src/t-test.q:1345
 msgid "N"
 msgstr ""
 
-#: src/crosstabs.q:875 src/frequencies.q:1011 src/frequencies.q:1012
+#: src/crosstabs.q:876 src/frequencies.q:1011 src/frequencies.q:1012
 #: src/frequencies.q:1013
 msgid "Percent"
 msgstr ""
 
-#: src/crosstabs.q:1117
+#: src/crosstabs.q:1118
 msgid "count"
 msgstr ""
 
-#: src/crosstabs.q:1118
+#: src/crosstabs.q:1119
 msgid "row %"
 msgstr ""
 
-#: src/crosstabs.q:1119
+#: src/crosstabs.q:1120
 msgid "column %"
 msgstr ""
 
-#: src/crosstabs.q:1120
+#: src/crosstabs.q:1121
 msgid "total %"
 msgstr ""
 
-#: src/crosstabs.q:1121
+#: src/crosstabs.q:1122
 msgid "expected"
 msgstr ""
 
-#: src/crosstabs.q:1122
+#: src/crosstabs.q:1123
 msgid "residual"
 msgstr ""
 
-#: src/crosstabs.q:1123
+#: src/crosstabs.q:1124
 msgid "std. resid."
 msgstr ""
 
-#: src/crosstabs.q:1124
+#: src/crosstabs.q:1125
 msgid "adj. resid."
 msgstr ""
 
-#: src/crosstabs.q:1157 src/crosstabs.q:1184 src/crosstabs.q:1204
-#: src/crosstabs.q:1225
+#: src/crosstabs.q:1158 src/crosstabs.q:1185 src/crosstabs.q:1205
+#: src/crosstabs.q:1226
 msgid "Statistic"
 msgstr ""
 
-#: src/crosstabs.q:1159 src/t-test.q:920 src/t-test.q:1121 src/t-test.q:1227
+#: src/crosstabs.q:1160 src/t-test.q:922 src/t-test.q:1123 src/t-test.q:1229
 msgid "df"
 msgstr ""
 
-#: src/crosstabs.q:1161
+#: src/crosstabs.q:1162
 msgid "Asymp. Sig. (2-sided)"
 msgstr ""
 
-#: src/crosstabs.q:1163
+#: src/crosstabs.q:1164
 msgid "Exact. Sig. (2-sided)"
 msgstr ""
 
-#: src/crosstabs.q:1165
+#: src/crosstabs.q:1166
 msgid "Exact. Sig. (1-sided)"
 msgstr ""
 
-#: src/crosstabs.q:1183 src/crosstabs.q:1224
+#: src/crosstabs.q:1184 src/crosstabs.q:1225
 msgid "Category"
 msgstr ""
 
-#: src/crosstabs.q:1186 src/crosstabs.q:1228
+#: src/crosstabs.q:1187 src/crosstabs.q:1229
 msgid "Asymp. Std. Error"
 msgstr ""
 
-#: src/crosstabs.q:1187 src/crosstabs.q:1229
+#: src/crosstabs.q:1188 src/crosstabs.q:1230
 msgid "Approx. T"
 msgstr ""
 
-#: src/crosstabs.q:1188 src/crosstabs.q:1230
+#: src/crosstabs.q:1189 src/crosstabs.q:1231
 msgid "Approx. Sig."
 msgstr ""
 
-#: src/crosstabs.q:1203
+#: src/crosstabs.q:1204
 #, c-format
 msgid " 95%% Confidence Interval"
 msgstr ""
 
-#: src/crosstabs.q:1206 src/t-test.q:924 src/t-test.q:1118 src/t-test.q:1230
+#: src/crosstabs.q:1207 src/t-test.q:926 src/t-test.q:1120 src/t-test.q:1232
 msgid "Lower"
 msgstr ""
 
-#: src/crosstabs.q:1207 src/t-test.q:925 src/t-test.q:1119 src/t-test.q:1231
+#: src/crosstabs.q:1208 src/t-test.q:927 src/t-test.q:1121 src/t-test.q:1233
 msgid "Upper"
 msgstr ""
 
-#: src/crosstabs.q:1226
+#: src/crosstabs.q:1227
 msgid "Type"
 msgstr ""
 
-#: src/crosstabs.q:1976
+#: src/crosstabs.q:1977
 msgid "Pearson Chi-Square"
 msgstr ""
 
-#: src/crosstabs.q:1977
+#: src/crosstabs.q:1978
 msgid "Likelihood Ratio"
 msgstr ""
 
-#: src/crosstabs.q:1978
+#: src/crosstabs.q:1979
 msgid "Fisher's Exact Test"
 msgstr ""
 
-#: src/crosstabs.q:1979
+#: src/crosstabs.q:1980
 msgid "Continuity Correction"
 msgstr ""
 
-#: src/crosstabs.q:1980
+#: src/crosstabs.q:1981
 msgid "Linear-by-Linear Association"
 msgstr ""
 
-#: src/crosstabs.q:2017 src/crosstabs.q:2087 src/crosstabs.q:2146
+#: src/crosstabs.q:2018 src/crosstabs.q:2088 src/crosstabs.q:2147
 msgid "N of Valid Cases"
 msgstr ""
 
-#: src/crosstabs.q:2033 src/crosstabs.q:2162
+#: src/crosstabs.q:2034 src/crosstabs.q:2163
 msgid "Nominal by Nominal"
 msgstr ""
 
-#: src/crosstabs.q:2034 src/crosstabs.q:2163
+#: src/crosstabs.q:2035 src/crosstabs.q:2164
 msgid "Ordinal by Ordinal"
 msgstr ""
 
-#: src/crosstabs.q:2035
+#: src/crosstabs.q:2036
 msgid "Interval by Interval"
 msgstr ""
 
-#: src/crosstabs.q:2036
+#: src/crosstabs.q:2037
 msgid "Measure of Agreement"
 msgstr ""
 
-#: src/crosstabs.q:2041
+#: src/crosstabs.q:2042
 msgid "Phi"
 msgstr ""
 
-#: src/crosstabs.q:2042
+#: src/crosstabs.q:2043
 msgid "Cramer's V"
 msgstr ""
 
-#: src/crosstabs.q:2043
+#: src/crosstabs.q:2044
 msgid "Contingency Coefficient"
 msgstr ""
 
-#: src/crosstabs.q:2044
+#: src/crosstabs.q:2045
 msgid "Kendall's tau-b"
 msgstr ""
 
-#: src/crosstabs.q:2045
+#: src/crosstabs.q:2046
 msgid "Kendall's tau-c"
 msgstr ""
 
-#: src/crosstabs.q:2046
+#: src/crosstabs.q:2047
 msgid "Gamma"
 msgstr ""
 
-#: src/crosstabs.q:2047
+#: src/crosstabs.q:2048
 msgid "Spearman Correlation"
 msgstr ""
 
-#: src/crosstabs.q:2048
+#: src/crosstabs.q:2049
 msgid "Pearson's R"
 msgstr ""
 
-#: src/crosstabs.q:2049
+#: src/crosstabs.q:2050
 msgid "Kappa"
 msgstr ""
 
-#: src/crosstabs.q:2119
+#: src/crosstabs.q:2120
 #, c-format
 msgid "Odds Ratio for %s (%g / %g)"
 msgstr ""
 
-#: src/crosstabs.q:2122
+#: src/crosstabs.q:2123
 #, c-format
 msgid "Odds Ratio for %s (%.*s / %.*s)"
 msgstr ""
 
-#: src/crosstabs.q:2130
+#: src/crosstabs.q:2131
 #, c-format
 msgid "For cohort %s = %g"
 msgstr ""
 
-#: src/crosstabs.q:2133
+#: src/crosstabs.q:2134
 #, c-format
 msgid "For cohort %s = %.*s"
 msgstr ""
 
-#: src/crosstabs.q:2164
+#: src/crosstabs.q:2165
 msgid "Nominal by Interval"
 msgstr ""
 
-#: src/crosstabs.q:2169
+#: src/crosstabs.q:2170
 msgid "Lambda"
 msgstr ""
 
-#: src/crosstabs.q:2170
+#: src/crosstabs.q:2171
 msgid "Goodman and Kruskal tau"
 msgstr ""
 
-#: src/crosstabs.q:2171
+#: src/crosstabs.q:2172
 msgid "Uncertainty Coefficient"
 msgstr ""
 
-#: src/crosstabs.q:2172
+#: src/crosstabs.q:2173
 msgid "Somers' d"
 msgstr ""
 
-#: src/crosstabs.q:2173
+#: src/crosstabs.q:2174
 msgid "Eta"
 msgstr ""
 
-#: src/crosstabs.q:2178
+#: src/crosstabs.q:2179
 msgid "Symmetric"
 msgstr ""
 
-#: src/crosstabs.q:2179 src/crosstabs.q:2180
+#: src/crosstabs.q:2180 src/crosstabs.q:2181
 #, c-format
 msgid "%s Dependent"
 msgstr ""
 
-#: src/descript.q:151 src/frequencies.q:94 src/t-test.q:656 src/t-test.q:679
-#: src/t-test.q:768 src/t-test.q:1115
+#: src/descript.q:151 src/frequencies.q:94 src/t-test.q:658 src/t-test.q:681
+#: src/t-test.q:770 src/t-test.q:1117
 msgid "Mean"
 msgstr ""
 
@@ -4865,119 +4808,138 @@ msgstr ""
 msgid "Upper value (%g) is less than lower value (%g) on VARIABLES subcommand."
 msgstr ""
 
-#: src/set.q:217 src/set.q:220 src/set.q:238 src/set.q:307 src/set.q:313
-#: src/set.q:338 src/set.q:340 src/set.q:359 src/set.q:363 src/set.q:367
-#: src/set.q:381 src/set.q:383 src/set.q:387 src/set.q:705 src/set.q:786
-#: src/set.q:867
+#: src/set.q:216 src/set.q:288 src/set.q:332 src/set.q:389 src/set.q:391
+#: src/set.q:393 src/set.q:395 src/set.q:397 src/set.q:399 src/set.q:401
+#: src/set.q:403 src/set.q:405 src/set.q:407 src/set.q:409 src/set.q:411
+#: src/set.q:413 src/set.q:792 src/set.q:873 src/set.q:968
 #, c-format
 msgid "%s is obsolete."
 msgstr ""
 
 #: src/set.q:224
-msgid "Active file compression is not yet implemented (and probably won't be)."
+msgid "LISTING is ON"
 msgstr ""
 
-#: src/set.q:233
-msgid "CPI must be greater than 0."
+#: src/set.q:226
+msgid "LISTING is OFF"
 msgstr ""
 
-#: src/set.q:242
-msgid "LPI must be greater than 0."
+#: src/set.q:252
+msgid "Journalling is off"
 msgstr ""
 
-#: src/set.q:249
+#: src/set.q:422
 msgid ""
 "CASE is not implemented and probably won't be.  If you care, complain about "
 "it."
 msgstr ""
 
-#: src/set.q:279
+#: src/set.q:427
+msgid "Active file compression is not yet implemented (and probably won't be)."
+msgstr ""
+
+#: src/set.q:441
 #, c-format
-msgid "Value for MITERATE (%ld) must be greater than 0."
+msgid ""
+"CC%c: Length of custom currency string `%s' (%d) exceeds maximum length of "
+"16."
 msgstr ""
 
-#: src/set.q:287
+#: src/set.q:463
 #, c-format
-msgid "Value for MNEST (%ld) must be greater than 0."
+msgid ""
+"CC%c: Custom currency string `%s' does not contain exactly three periods or "
+"commas (not both)."
 msgstr ""
 
-#: src/set.q:295
-msgid "MXERRS must be at least 1."
+#: src/set.q:516
+msgid "None"
 msgstr ""
 
-#: src/set.q:302
-msgid "MXLOOPS must be at least 1."
+#: src/set.q:522
+msgid "Disabled"
 msgstr ""
 
-#: src/set.q:323
-msgid "Workspace limit must be at least 1 MB."
+#: src/set.q:527
+msgid "Screen"
 msgstr ""
 
-#: src/set.q:401
-#, c-format
-msgid ""
-"CC%c: Length of custom currency string `%s' (%d) exceeds maximum length of "
-"16."
+#: src/set.q:534
+msgid "Listing"
 msgstr ""
 
-#: src/set.q:423
-#, c-format
-msgid ""
-"CC%c: Custom currency string `%s' does not contain exactly three periods or "
-"commas (not both)."
+#: src/set.q:541
+msgid "Other"
 msgstr ""
 
-#: src/set.q:566
+#: src/set.q:650
 msgid "LENGTH must be at least 1."
 msgstr ""
 
-#: src/set.q:603
+#: src/set.q:689
 msgid "Missing identifier in RESULTS subcommand."
 msgstr ""
 
-#: src/set.q:614
+#: src/set.q:700
 msgid "Unrecognized identifier in RESULTS subcommand."
 msgstr ""
 
-#: src/set.q:651
+#: src/set.q:738
 msgid "WIDTH must be at least 1."
 msgstr ""
 
-#: src/set.q:674
+#: src/set.q:761
 #, c-format
 msgid ""
 "FORMAT requires numeric output format as an argument.  Specified format %s "
 "is of type string."
 msgstr ""
 
-#: src/set.q:718
+#: src/set.q:805
 msgid "Text color must be in range 0-15."
 msgstr "Text colour must be in range 0-15."
 
-#: src/set.q:731
+#: src/set.q:818
 msgid "Background color must be in range 0-7."
 msgstr "Background colour must be in range 0-7."
 
-#: src/set.q:742
+#: src/set.q:829
 msgid "Border color must be in range 0-7."
 msgstr "Border colour must be in range 0-7."
 
-#: src/set.q:798
+#: src/set.q:885
 msgid "Lower window color must be between 0 and 6."
 msgstr "Lower window colour must be between 0 and 6."
 
-#: src/set.q:812
+#: src/set.q:899
 msgid "Upper window color must be between 0 and 6."
 msgstr "Upper window colour must be between 0 and 6."
 
-#: src/set.q:824
+#: src/set.q:911
 msgid "Frame color must be between 0 and 6."
 msgstr "Frame colour must be between 0 and 6."
 
-#: src/set.q:876
+#: src/set.q:977
 msgid "Drive letter expected in WORKDEV subcommand."
 msgstr ""
 
+#: src/set.q:1012
+msgid "Specify a terminal type with `setenv TERM <yourtype>'."
+msgstr ""
+
+#: src/set.q:1018
+msgid "Could not access the termcap data base."
+msgstr ""
+
+#: src/set.q:1020
+#, c-format
+msgid "Terminal type `%s' is not defined."
+msgstr ""
+
+#: src/set.q:1048
+msgid "data> "
+msgstr ""
+
 #: src/t-test.q:237
 msgid "TESTVAL, GROUPS and PAIRS subcommands are mutually exclusive."
 msgstr ""
@@ -4986,149 +4948,149 @@ msgstr ""
 msgid "VARIABLES subcommand is not appropriate with PAIRS"
 msgstr ""
 
-#: src/t-test.q:352 src/t-test.q:429
+#: src/t-test.q:354 src/t-test.q:431
 #, c-format
 msgid "`%s' is not a variable name"
 msgstr ""
 
-#: src/t-test.q:365
+#: src/t-test.q:367
 #, c-format
 msgid "Long string variable %s is not valid here."
 msgstr ""
 
-#: src/t-test.q:382
+#: src/t-test.q:384
 msgid ""
 "When applying GROUPS to a string variable, at least one value must be "
 "specified."
 msgstr ""
 
-#: src/t-test.q:464
+#: src/t-test.q:466
 #, c-format
 msgid ""
 "PAIRED was specified but the number of variables preceding WITH (%d) did not "
 "match the number following (%d)."
 msgstr ""
 
-#: src/t-test.q:481
+#: src/t-test.q:483
 msgid "At least two variables must be specified on PAIRS."
 msgstr ""
 
-#: src/t-test.q:653
+#: src/t-test.q:655
 msgid "One-Sample Statistics"
 msgstr ""
 
-#: src/t-test.q:657 src/t-test.q:680 src/t-test.q:770 src/t-test.q:1116
+#: src/t-test.q:659 src/t-test.q:682 src/t-test.q:772 src/t-test.q:1118
 msgid "Std. Deviation"
 msgstr ""
 
-#: src/t-test.q:658 src/t-test.q:681 src/t-test.q:771
+#: src/t-test.q:660 src/t-test.q:683 src/t-test.q:773
 msgid "SE. Mean"
 msgstr ""
 
-#: src/t-test.q:675
+#: src/t-test.q:677
 msgid "Group Statistics"
 msgstr ""
 
-#: src/t-test.q:765
+#: src/t-test.q:767
 msgid "Paired Sample Statistics"
 msgstr ""
 
-#: src/t-test.q:787 src/t-test.q:1144 src/t-test.q:1364
+#: src/t-test.q:789 src/t-test.q:1146 src/t-test.q:1366
 #, c-format
 msgid "Pair %d"
 msgstr ""
 
-#: src/t-test.q:905
+#: src/t-test.q:907
 msgid "Independent Samples Test"
 msgstr ""
 
-#: src/t-test.q:913
+#: src/t-test.q:915
 msgid "Levene's Test for Equality of Variances"
 msgstr ""
 
-#: src/t-test.q:915
+#: src/t-test.q:917
 msgid "t-test for Equality of Means"
 msgstr ""
 
-#: src/t-test.q:917
+#: src/t-test.q:919
 msgid "F"
 msgstr ""
 
-#: src/t-test.q:918 src/t-test.q:1345
+#: src/t-test.q:920 src/t-test.q:1347
 msgid "Sig."
 msgstr ""
 
-#: src/t-test.q:919 src/t-test.q:1120 src/t-test.q:1226
+#: src/t-test.q:921 src/t-test.q:1122 src/t-test.q:1228
 msgid "t"
 msgstr ""
 
-#: src/t-test.q:921 src/t-test.q:1122 src/t-test.q:1228
+#: src/t-test.q:923 src/t-test.q:1124 src/t-test.q:1230
 msgid "Sig. (2-tailed)"
 msgstr ""
 
-#: src/t-test.q:922 src/t-test.q:1229
+#: src/t-test.q:924 src/t-test.q:1231
 msgid "Mean Difference"
 msgstr ""
 
-#: src/t-test.q:923
+#: src/t-test.q:925
 msgid "Std. Error Difference"
 msgstr ""
 
-#: src/t-test.q:928 src/t-test.q:1112 src/t-test.q:1221
+#: src/t-test.q:930 src/t-test.q:1114 src/t-test.q:1223
 #, c-format
 msgid "%d%% Confidence Interval of the Difference"
 msgstr ""
 
-#: src/t-test.q:962
+#: src/t-test.q:964
 msgid "Equal variances assumed"
 msgstr ""
 
-#: src/t-test.q:977
+#: src/t-test.q:979
 #, c-format
 msgid "Error calculating F statistic (cdff returned %d)."
 msgstr ""
 
-#: src/t-test.q:1000 src/t-test.q:1020 src/t-test.q:1058 src/t-test.q:1070
-#: src/t-test.q:1165 src/t-test.q:1191 src/t-test.q:1271 src/t-test.q:1288
-#: src/t-test.q:1377
+#: src/t-test.q:1002 src/t-test.q:1022 src/t-test.q:1060 src/t-test.q:1072
+#: src/t-test.q:1167 src/t-test.q:1193 src/t-test.q:1273 src/t-test.q:1290
+#: src/t-test.q:1379
 #, c-format
 msgid "Error calculating T statistic (cdft returned %d)."
 msgstr ""
 
-#: src/t-test.q:1034
+#: src/t-test.q:1036
 msgid "Equal variances not assumed"
 msgstr ""
 
-#: src/t-test.q:1102
+#: src/t-test.q:1104
 msgid "Paired Samples Test"
 msgstr ""
 
-#: src/t-test.q:1105
+#: src/t-test.q:1107
 msgid "Paired Differences"
 msgstr ""
 
-#: src/t-test.q:1117
+#: src/t-test.q:1119
 msgid "Std. Error Mean"
 msgstr ""
 
-#: src/t-test.q:1210
+#: src/t-test.q:1212
 msgid "One-Sample Test"
 msgstr ""
 
-#: src/t-test.q:1215
+#: src/t-test.q:1217
 #, c-format
 msgid "Test Value = %f"
 msgstr ""
 
-#: src/t-test.q:1340
+#: src/t-test.q:1342
 msgid "Paired Samples Correlations"
 msgstr ""
 
-#: src/t-test.q:1344
+#: src/t-test.q:1346
 msgid "Correlation"
 msgstr ""
 
-#: src/t-test.q:1367
+#: src/t-test.q:1369
 #, c-format
 msgid "%s & %s"
 msgstr ""
index d1039a6c97ef384eab0308d22fba1f4da85a3d77..90b5cffc5d6e2602f43a47797b9ecee04cef74b3 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
-"POT-Creation-Date: 2004-03-13 14:14+0800\n"
+"POT-Creation-Date: 2004-03-20 00:30+0800\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,56 +17,56 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
 
-#: src/aggregate.c:190 src/aggregate.c:231 src/data-list.c:1363
+#: src/aggregate.c:183 src/aggregate.c:216 src/data-list.c:1363
 #: src/data-list.c:1398 src/data-list.c:1411 src/data-list.c:1424
 #: src/data-list.c:1457
 #, c-format
 msgid "%s subcommand given multiple times."
 msgstr ""
 
-#: src/aggregate.c:216
+#: src/aggregate.c:203
 msgid "while expecting COLUMNWISE"
 msgstr ""
 
-#: src/aggregate.c:261
+#: src/aggregate.c:244
 msgid "BREAK subcommand not specified."
 msgstr ""
 
-#: src/aggregate.c:490
+#: src/aggregate.c:400
 msgid "expecting aggregation function"
 msgstr ""
 
-#: src/aggregate.c:506
+#: src/aggregate.c:416
 #, c-format
 msgid "Unknown aggregation function %s."
 msgstr ""
 
-#: src/aggregate.c:521
+#: src/aggregate.c:431
 msgid "expecting `('"
 msgstr ""
 
-#: src/aggregate.c:556
+#: src/aggregate.c:466
 #, c-format
 msgid "Missing argument %d to %s."
 msgstr ""
 
-#: src/aggregate.c:564
+#: src/aggregate.c:474
 #, c-format
 msgid "Arguments to %s must be of same type as source variables."
 msgstr ""
 
-#: src/aggregate.c:574 src/expr-prs.c:665
+#: src/aggregate.c:484 src/expr-prs.c:665
 msgid "expecting `)'"
 msgstr ""
 
-#: src/aggregate.c:586 src/autorecode.c:110
+#: src/aggregate.c:496
 #, c-format
 msgid ""
 "Number of source variables (%d) does not match number of target variables (%"
 "d)."
 msgstr ""
 
-#: src/aggregate.c:653
+#: src/aggregate.c:564
 #, c-format
 msgid ""
 "Variable name %s is not unique within the aggregate file dictionary, which "
@@ -222,31 +222,36 @@ msgstr ""
 msgid "%s - Page %d"
 msgstr ""
 
-#: src/autorecode.c:121 src/command.c:697 src/compute.c:293
+#: src/autorecode.c:121
+#, c-format
+msgid "Source variable count (%d) does not match target variable count (%d)."
+msgstr ""
+
+#: src/autorecode.c:138 src/command.c:690 src/compute.c:293
 #: src/data-list.c:380 src/data-list.c:878 src/data-list.c:1690
 #: src/do-if.c:263 src/get.c:381 src/lexer.c:387 src/loop.c:241
-#: src/matrix-data.c:510 src/print.c:338 src/print.c:1060 src/recode.c:409
+#: src/matrix-data.c:510 src/print.c:338 src/print.c:1060 src/recode.c:405
 #: src/sel-if.c:56 src/sel-if.c:138 src/vector.c:194 src/file-handle.q:88
 msgid "expecting end of command"
 msgstr ""
 
-#: src/autorecode.c:131
+#: src/autorecode.c:148
 #, c-format
 msgid "Target variable %s duplicates existing variable %s."
 msgstr ""
 
-#: src/autorecode.c:138
+#: src/autorecode.c:155
 #, c-format
 msgid "Duplicate variable name %s among target variables."
 msgstr ""
 
-#: src/cmdline.c:112 src/cmdline.c:131 src/cmdline.c:143 src/command.c:196
-#: src/set.q:315 src/set.q:317 src/set.q:857
+#: src/cmdline.c:114 src/cmdline.c:133 src/cmdline.c:145 src/command.c:196
+#: src/set.q:416 src/set.q:418 src/set.q:958
 #, c-format
 msgid "%s is not yet implemented."
 msgstr ""
 
-#: src/cmdline.c:157
+#: src/cmdline.c:159
 msgid ""
 "\n"
 "Copyright (C) 1997-9, 2000 Free Software Foundation, Inc.\n"
@@ -256,7 +261,7 @@ msgid ""
 "Written by Ben Pfaff <blp@gnu.org>."
 msgstr ""
 
-#: src/cmdline.c:217
+#: src/cmdline.c:221
 #, c-format
 msgid ""
 "PSPP, a program for statistical analysis of sample data.\n"
@@ -300,7 +305,7 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/cmdline.c:249
+#: src/cmdline.c:253
 #, c-format
 msgid ""
 "\n"
@@ -379,30 +384,30 @@ msgstr ""
 msgid "The sentinel may not be the empty string."
 msgstr ""
 
-#: src/command.c:574
+#: src/command.c:576 src/command.c:708
 msgid "This command not allowed when the SAFER option is set."
 msgstr ""
 
-#: src/command.c:597
+#: src/command.c:590
 #, c-format
 msgid "Error removing `%s': %s."
 msgstr ""
 
-#: src/command.c:647
+#: src/command.c:640
 #, c-format
 msgid "Couldn't fork: %s."
 msgstr ""
 
-#: src/command.c:688
+#: src/command.c:681
 #, c-format
 msgid "Error executing command: %s."
 msgstr ""
 
-#: src/command.c:734
+#: src/command.c:731
 msgid "No operating system support for this command."
 msgstr ""
 
-#: src/command.c:763
+#: src/command.c:760
 msgid "This command is not valid in a syntax file."
 msgstr ""
 
@@ -428,11 +433,11 @@ msgstr ""
 msgid "Extra characters after expression."
 msgstr ""
 
-#: src/count.c:171
+#: src/count.c:156
 msgid "Destination cannot be a string variable."
 msgstr ""
 
-#: src/count.c:282
+#: src/count.c:263
 #, c-format
 msgid ""
 "%g THRU %g is not a valid range.  The number following THRU must be at least "
@@ -710,7 +715,7 @@ msgid ""
 msgstr ""
 
 #: src/data-list.c:768 src/data-list.c:899 src/print.c:803
-#: src/sysfile-info.c:135 src/sysfile-info.c:370 src/vfm.c:1148
+#: src/sysfile-info.c:135 src/sysfile-info.c:370 src/vfm.c:1011
 #: src/descript.q:791
 msgid "Variable"
 msgstr ""
@@ -1027,25 +1032,25 @@ msgstr ""
 msgid "Error writing file %s: %s."
 msgstr ""
 
-#: src/dfm.c:657
+#: src/dfm.c:656
 msgid ""
 "This command is not valid here since the current input program does not "
 "access the inline file."
 msgstr ""
 
-#: src/dfm.c:664
+#: src/dfm.c:663
 msgid "inline file: Opening for reading."
 msgstr ""
 
-#: src/dfm.c:678
+#: src/dfm.c:677
 msgid "Skipping remaining inline data."
 msgstr ""
 
-#: src/dfm.c:690
+#: src/dfm.c:689
 msgid "reading as a data file"
 msgstr ""
 
-#: src/dfm.c:697
+#: src/dfm.c:696
 msgid "writing as a data file"
 msgstr ""
 
@@ -1090,41 +1095,41 @@ msgstr ""
 msgid "DO IF %d: missing\n"
 msgstr ""
 
-#: src/error.c:113
+#: src/error.c:115
 msgid "Terminating NOW due to a fatal error!"
 msgstr ""
 
-#: src/error.c:190
+#: src/error.c:192
 msgid "Terminating execution of syntax file due to error."
 msgstr ""
 
-#: src/error.c:192
+#: src/error.c:194
 #, c-format
 msgid "Errors (%d) exceeds limit (%d)."
 msgstr ""
 
-#: src/error.c:195
+#: src/error.c:197
 #, c-format
 msgid "Warnings (%d) exceed limit (%d)."
 msgstr ""
 
-#: src/error.c:253
+#: src/error.c:255
 msgid "fatal"
 msgstr ""
 
-#: src/error.c:255 src/error.c:262 src/error.c:265 src/expr-prs.c:1464
+#: src/error.c:257 src/error.c:264 src/error.c:267 src/expr-prs.c:1464
 msgid "error"
 msgstr ""
 
-#: src/error.c:256 src/error.c:263 src/error.c:266
+#: src/error.c:258 src/error.c:265 src/error.c:268
 msgid "warning"
 msgstr ""
 
-#: src/error.c:257 src/error.c:267
+#: src/error.c:259 src/error.c:269
 msgid "note"
 msgstr ""
 
-#: src/error.c:259 src/error.c:260
+#: src/error.c:261 src/error.c:262
 msgid "installation error"
 msgstr ""
 
@@ -1532,59 +1537,64 @@ msgstr ""
 msgid "Unknown record type %g."
 msgstr ""
 
-#: src/flip.c:210
+#: src/flip.c:76
+msgid ""
+"FLIP ignores TEMPORARY.  Temporary transformations will be made permanent."
+msgstr ""
+
+#: src/flip.c:217
 #, c-format
 msgid "Could not create acceptable variant for variable %s."
 msgstr ""
 
-#: src/flip.c:226
+#: src/flip.c:233
 msgid "Cannot create more than 99999 variable names."
 msgstr ""
 
-#: src/flip.c:270
+#: src/flip.c:277
 msgid "Could not create temporary file for FLIP."
 msgstr ""
 
-#: src/flip.c:277 src/flip.c:339
+#: src/flip.c:284 src/flip.c:347
 #, c-format
 msgid "Error writing FLIP file: %s."
 msgstr ""
 
-#: src/flip.c:381
+#: src/flip.c:389
 #, c-format
 msgid "Error rewinding FLIP file: %s."
 msgstr ""
 
-#: src/flip.c:385
+#: src/flip.c:393
 msgid "Error creating FLIP source file."
 msgstr ""
 
-#: src/flip.c:394
+#: src/flip.c:402
 #, c-format
 msgid "Error reading FLIP file: %s."
 msgstr ""
 
-#: src/flip.c:406
+#: src/flip.c:414
 #, c-format
 msgid "Error seeking FLIP source file: %s."
 msgstr ""
 
-#: src/flip.c:411
+#: src/flip.c:419
 #, c-format
 msgid "Error writing FLIP source file: %s."
 msgstr ""
 
-#: src/flip.c:422
+#: src/flip.c:430
 #, c-format
 msgid "Error rewind FLIP source file: %s."
 msgstr ""
 
-#: src/flip.c:470
+#: src/flip.c:478
 #, c-format
 msgid "Error reading FLIP temporary file: %s."
 msgstr ""
 
-#: src/flip.c:473
+#: src/flip.c:481
 msgid "Unexpected end of file reading FLIP temporary file."
 msgstr ""
 
@@ -1698,7 +1708,7 @@ msgstr ""
 msgid "GET translation table from file to memory:\n"
 msgstr ""
 
-#: src/get.c:117 src/get.c:1416
+#: src/get.c:117 src/get.c:1429
 #, c-format
 msgid "  %8s from %3d,%3d to %3d,%3d\n"
 msgstr ""
@@ -1738,110 +1748,95 @@ msgid ""
 "Variables in dictionary:\n"
 msgstr ""
 
-#: src/get.c:607
+#: src/get.c:610
 msgid "The BY subcommand may be given once at most."
 msgstr ""
 
-#: src/get.c:674
+#: src/get.c:677
 msgid "The active file may not be specified more than once."
 msgstr ""
 
-#: src/get.c:683
+#: src/get.c:686
 msgid "Cannot specify the active file since no active file has been defined."
 msgstr ""
 
-#: src/get.c:715
+#: src/get.c:694
+msgid ""
+"MATCH FILES may not be used after TEMPORARY when the active file is an input "
+"source.  Temporary transformations will be made permanent."
+msgstr ""
+
+#: src/get.c:727
 msgid ""
 "IN, FIRST, and LAST subcommands may not occur before the first FILE or TABLE."
 msgstr ""
 
-#: src/get.c:747
+#: src/get.c:759
 #, c-format
 msgid "Multiple %s subcommands for a single FILE or TABLE."
 msgstr ""
 
-#: src/get.c:757
+#: src/get.c:769
 #, c-format
 msgid "Duplicate variable name %s while creating %s variable."
 msgstr ""
 
-#: src/get.c:771
+#: src/get.c:783
 msgid ""
 "RENAME, KEEP, and DROP subcommands may not occur before the first FILE or "
 "TABLE."
 msgstr ""
 
-#: src/get.c:795
+#: src/get.c:807
 msgid "The BY subcommand is required when a TABLE subcommand is given."
 msgstr ""
 
-#: src/get.c:816
+#: src/get.c:828
 #, c-format
 msgid "File %s lacks BY variable %s."
 msgstr ""
 
-#: src/get.c:1328
+#: src/get.c:1341
 #, c-format
 msgid ""
 "Variable %s in file %s (%s) has different type or width from the same "
 "variable in earlier file (%s)."
 msgstr ""
 
-#: src/get.c:1378
+#: src/get.c:1391
 msgid "expecting COMM or TAPE"
 msgstr ""
 
-#: src/get.c:1411
+#: src/get.c:1424
 #, c-format
 msgid "IMPORT translation table from file to memory:\n"
 msgstr ""
 
-#: src/getline.c:161
+#: src/getline.c:163
 #, c-format
 msgid "Can't find `%s' in include file search path."
 msgstr ""
 
-#: src/getline.c:316
+#: src/getline.c:318
 #, c-format
 msgid "%s: Opening as syntax file."
 msgstr ""
 
-#: src/getline.c:321
+#: src/getline.c:323
 #, c-format
 msgid "Opening `%s': %s."
 msgstr ""
 
-#: src/getline.c:330 src/html.c:330 src/postscript.c:1461
+#: src/getline.c:332 src/html.c:330 src/postscript.c:1461
 #, c-format
 msgid "Reading `%s': %s."
 msgstr ""
 
-#: src/getline.c:388
+#: src/getline.c:390
 #, c-format
 msgid "Closing `%s': %s."
 msgstr ""
 
-#: src/glob.c:212
-msgid "data> "
-msgstr ""
-
-#: src/glob.c:269
-msgid "Specify a terminal type with `setenv TERM <yourtype>'."
-msgstr ""
-
-#: src/glob.c:275
-msgid "Could not access the termcap data base."
-msgstr ""
-
-#: src/glob.c:277
-#, c-format
-msgid "Terminal type `%s' is not defined."
-msgstr ""
-
-#: src/glob.c:278
-msgid "Assuming screen of size 79x25."
-msgstr ""
-
 #: src/groff-font.c:107
 #, c-format
 msgid "%s: Opening Groff font file..."
@@ -2111,11 +2106,11 @@ msgstr ""
 msgid "expecting %s"
 msgstr ""
 
-#: src/lexer.c:524
+#: src/lexer.c:524 src/val-labs.c:148
 msgid "expecting string"
 msgstr ""
 
-#: src/lexer.c:538
+#: src/lexer.c:538 src/val-labs.c:157
 msgid "expecting integer"
 msgstr ""
 
@@ -2199,32 +2194,6 @@ msgstr ""
 msgid "%s without %s."
 msgstr ""
 
-#: src/main.c:71
-msgid "Error initializing output drivers."
-msgstr ""
-
-#: src/main.c:132
-msgid "This command not executed."
-msgstr ""
-
-#: src/main.c:136
-msgid ""
-"Skipping the rest of this command.  Part of this command may have been "
-"executed."
-msgstr ""
-
-#: src/main.c:141
-msgid ""
-"Skipping the rest of this command.  This command was fully executed up to "
-"this point."
-msgstr ""
-
-#: src/main.c:146
-msgid ""
-"Trailing garbage was encountered following this command.  The command was "
-"fully executed to this point."
-msgstr ""
-
 #: src/matrix-data.c:191
 msgid "VARIABLES subcommand multiply specified."
 msgstr ""
@@ -2332,69 +2301,69 @@ msgstr ""
 msgid "End of line expected %s while reading %s."
 msgstr ""
 
-#: src/matrix-data.c:1179
+#: src/matrix-data.c:1174
 #, c-format
 msgid "expecting value for %s %s"
 msgstr ""
 
-#: src/matrix-data.c:1339
+#: src/matrix-data.c:1336
 #, c-format
 msgid "Syntax error expecting SPLIT FILE value %s."
 msgstr ""
 
-#: src/matrix-data.c:1348
+#: src/matrix-data.c:1345
 #, c-format
 msgid "Expecting value %g for %s."
 msgstr ""
 
-#: src/matrix-data.c:1387 src/matrix-data.c:1842
+#: src/matrix-data.c:1386 src/matrix-data.c:1854
 #, c-format
 msgid "Syntax error expecting factor value %s."
 msgstr ""
 
-#: src/matrix-data.c:1396
+#: src/matrix-data.c:1395
 #, c-format
 msgid "Syntax error expecting value %g for %s %s."
 msgstr ""
 
-#: src/matrix-data.c:1623
+#: src/matrix-data.c:1631
 #, c-format
 msgid "Syntax error %s expecting SPLIT FILE value."
 msgstr ""
 
-#: src/matrix-data.c:1751
+#: src/matrix-data.c:1761
 #, c-format
 msgid ""
 "Expected %d lines of data for %s content; actually saw %d lines.  No data "
 "will be output for this content."
 msgstr ""
 
-#: src/matrix-data.c:1785
+#: src/matrix-data.c:1796
 #, c-format
 msgid "Multiply specified ROWTYPE_ %s."
 msgstr ""
 
-#: src/matrix-data.c:1790
+#: src/matrix-data.c:1801
 #, c-format
 msgid "Syntax error %s expecting ROWTYPE_ string."
 msgstr ""
 
-#: src/matrix-data.c:1810
+#: src/matrix-data.c:1821
 #, c-format
 msgid "Syntax error %s."
 msgstr ""
 
-#: src/matrix-data.c:1958
+#: src/matrix-data.c:1971
 #, c-format
 msgid "Duplicate specification for %s."
 msgstr ""
 
-#: src/matrix-data.c:1970
+#: src/matrix-data.c:1983
 #, c-format
 msgid "Too many rows of matrix data for %s."
 msgstr ""
 
-#: src/matrix-data.c:2016
+#: src/matrix-data.c:2029
 #, c-format
 msgid "Syntax error expecting value for %s %s."
 msgstr ""
@@ -2459,69 +2428,75 @@ msgstr ""
 msgid "(!!!INTERNAL ERROR--%d!!!)\n"
 msgstr ""
 
-#: src/modify-vars.c:108
+#: src/modify-vars.c:88
+msgid ""
+"MODIFY VARS may not be used after TEMPORARY.  Temporary transformations will "
+"be made permanent."
+msgstr ""
+
+#: src/modify-vars.c:115
 msgid "REORDER subcommand may be given at most once."
 msgstr ""
 
-#: src/modify-vars.c:131
+#: src/modify-vars.c:138
 msgid "Cannot specify ALL after specifying a set of variables."
 msgstr ""
 
-#: src/modify-vars.c:141
+#: src/modify-vars.c:148
 msgid "`(' expected on REORDER subcommand."
 msgstr ""
 
-#: src/modify-vars.c:153
+#: src/modify-vars.c:160
 msgid "`)' expected following variable names on REORDER subcommand."
 msgstr ""
 
-#: src/modify-vars.c:171
+#: src/modify-vars.c:178
 msgid "RENAME subcommand may be given at most once."
 msgstr ""
 
-#: src/modify-vars.c:184
+#: src/modify-vars.c:191
 msgid "`(' expected on RENAME subcommand."
 msgstr ""
 
-#: src/modify-vars.c:192
+#: src/modify-vars.c:199
 msgid ""
 "`=' expected between lists of new and old variable names on RENAME "
 "subcommand."
 msgstr ""
 
-#: src/modify-vars.c:200 src/rename-vars.c:70
+#: src/modify-vars.c:207 src/rename-vars.c:77
 #, c-format
 msgid ""
 "Differing number of variables in old name list (%d) and in new name list (%"
 "d)."
 msgstr ""
 
-#: src/modify-vars.c:211
+#: src/modify-vars.c:218
 msgid "`)' expected after variable lists on RENAME subcommand."
 msgstr ""
 
-#: src/modify-vars.c:225
+#: src/modify-vars.c:232
 msgid ""
 "KEEP subcommand may be given at most once.  It may notbe given in "
 "conjunction with the DROP subcommand."
 msgstr ""
 
-#: src/modify-vars.c:267
+#: src/modify-vars.c:274
 msgid ""
 "DROP subcommand may be given at most once.  It may not be given in "
 "conjunction with the KEEP subcommand."
 msgstr ""
 
-#: src/modify-vars.c:293
+#: src/modify-vars.c:300
 #, c-format
 msgid "Unrecognized subcommand name `%s'."
 msgstr ""
 
-#: src/modify-vars.c:295
+#: src/modify-vars.c:302
 msgid "Subcommand name expected."
 msgstr ""
 
-#: src/modify-vars.c:303
+#: src/modify-vars.c:310
 msgid "`/' or `.' expected."
 msgstr ""
 
@@ -3138,14 +3113,14 @@ msgid ""
 "SPACE a negative number of lines."
 msgstr ""
 
-#: src/recode.c:288
+#: src/recode.c:283
 #, c-format
 msgid ""
 "%d variable(s) cannot be recoded into %d variable(s).  Specify the same "
 "number of variables as input and output variables."
 msgstr ""
 
-#: src/recode.c:302
+#: src/recode.c:297
 #, c-format
 msgid ""
 "There is no string variable named %s.  (All string variables specified on "
@@ -3153,77 +3128,73 @@ msgid ""
 "variable.)"
 msgstr ""
 
-#: src/recode.c:311
+#: src/recode.c:306
 #, c-format
 msgid ""
 "Type mismatch between input and output variables.  Output variable %s is not "
 "a string variable, but all the input variables are string variables."
 msgstr ""
 
-#: src/recode.c:330
+#: src/recode.c:325
 #, c-format
 msgid "Type mismatch after INTO: %s is not a numeric variable."
 msgstr ""
 
-#: src/recode.c:360
+#: src/recode.c:355
 msgid ""
 "INTO must be used when the input values are numeric and output values are "
 "string."
 msgstr ""
 
-#: src/recode.c:368
+#: src/recode.c:363
 msgid ""
 "INTO must be used when the input values are string and output values are "
 "numeric."
 msgstr ""
 
-#: src/recode.c:493
+#: src/recode.c:486
 msgid "expecting output value"
 msgstr ""
 
-#: src/recode.c:507
+#: src/recode.c:500
 msgid ""
 "Inconsistent output types.  The output values must be all numeric or all "
 "string."
 msgstr ""
 
-#: src/recode.c:558
+#: src/recode.c:551
 msgid "following LO THRU"
 msgstr ""
 
-#: src/recode.c:574 src/recode.c:603
+#: src/recode.c:567 src/recode.c:596
 msgid "in source value"
 msgstr ""
 
-#: src/recode.c:616
+#: src/recode.c:609
 msgid ""
 "Keyword CONVERT may only be used with string input values and numeric output "
 "values."
 msgstr ""
 
-#: src/recode.c:876
-#, c-format
-msgid "!!END!!"
-msgstr ""
-
-#: src/recode.c:897 src/recode.c:913
-#, c-format
-msgid "!!ERROR!!"
+#: src/rename-vars.c:47
+msgid ""
+"RENAME VARS may not be used after TEMPORARY.  Temporary transformations will "
+"be made permanent."
 msgstr ""
 
-#: src/rename-vars.c:55
+#: src/rename-vars.c:62
 msgid "`(' expected."
 msgstr ""
 
-#: src/rename-vars.c:63
+#: src/rename-vars.c:70
 msgid "`=' expected between lists of new and old variable names."
 msgstr ""
 
-#: src/rename-vars.c:81
+#: src/rename-vars.c:88
 msgid "`)' expected after variable names."
 msgstr ""
 
-#: src/rename-vars.c:91
+#: src/rename-vars.c:98
 #, c-format
 msgid "Renaming would duplicate variable name %s."
 msgstr ""
@@ -3705,65 +3676,71 @@ msgstr ""
 msgid "writing as a system file"
 msgstr ""
 
-#: src/sort.c:122
-msgid "`A' or `D' expected inside parentheses."
+#: src/sort.c:82
+msgid ""
+"SORT CASES may not be used after TEMPORARY.  Temporary transformations will "
+"be made permanent."
 msgstr ""
 
 #: src/sort.c:127
+msgid "`A' or `D' expected inside parentheses."
+msgstr ""
+
+#: src/sort.c:132
 msgid "`)' expected."
 msgstr ""
 
-#: src/sort.c:418
+#: src/sort.c:421
 #, c-format
 msgid "%s: Creating temporary directory: %s."
 msgstr ""
 
-#: src/sort.c:449
+#: src/sort.c:452
 #, c-format
 msgid "Generating temporary directory name failed: %s."
 msgstr ""
 
-#: src/sort.c:457
+#: src/sort.c:460
 #, c-format
 msgid "Creating temporary directory failed: %s."
 msgstr ""
 
-#: src/sort.c:509
+#: src/sort.c:512
 #, c-format
 msgid "%s: Error removing directory for temporary files: %s."
 msgstr ""
 
-#: src/sort.c:538
+#: src/sort.c:541
 #, c-format
 msgid "%s: Error opening temporary file for %s: %s."
 msgstr ""
 
-#: src/sort.c:555
+#: src/sort.c:558
 #, c-format
 msgid "%s: Error closing temporary file: %s."
 msgstr ""
 
-#: src/sort.c:571
+#: src/sort.c:574
 #, c-format
 msgid "%s: Error removing temporary file: %s."
 msgstr ""
 
-#: src/sort.c:587
+#: src/sort.c:590
 #, c-format
 msgid "%s: Error writing temporary file: %s."
 msgstr ""
 
-#: src/sort.c:605
+#: src/sort.c:608
 #, c-format
 msgid "%s: Error reading temporary file: %s."
 msgstr ""
 
-#: src/sort.c:608
+#: src/sort.c:611
 #, c-format
 msgid "%s: Unexpected end of temporary file."
 msgstr ""
 
-#: src/sort.c:798 src/sort.c:1033
+#: src/sort.c:806 src/sort.c:1037
 #, c-format
 msgid ""
 "Out of memory.  Could not allocate room for minimum of %d cases of %d bytes "
@@ -3871,7 +3848,7 @@ msgstr ""
 msgid "Documents in the active file:"
 msgstr ""
 
-#: src/sysfile-info.c:377 src/sysfile-info.c:535 src/vfm.c:1150
+#: src/sysfile-info.c:377 src/sysfile-info.c:535 src/vfm.c:1013
 msgid "Label"
 msgstr ""
 
@@ -3894,8 +3871,8 @@ msgstr ""
 msgid "Missing Values: "
 msgstr ""
 
-#: src/sysfile-info.c:534 src/vfm.c:1149 src/crosstabs.q:1158
-#: src/crosstabs.q:1185 src/crosstabs.q:1205 src/crosstabs.q:1227
+#: src/sysfile-info.c:534 src/vfm.c:1012 src/crosstabs.q:1159
+#: src/crosstabs.q:1186 src/crosstabs.q:1206 src/crosstabs.q:1228
 #: src/frequencies.q:1009 src/frequencies.q:1126
 msgid "Value"
 msgstr ""
@@ -3919,11 +3896,11 @@ msgid ""
 "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n"
 msgstr ""
 
-#: src/temporary.c:49
+#: src/temporary.c:47
 msgid "This command is not valid inside DO IF or LOOP."
 msgstr ""
 
-#: src/temporary.c:56
+#: src/temporary.c:54
 msgid ""
 "This command may only appear once between procedures and procedure-like "
 "commands."
@@ -3953,39 +3930,22 @@ msgstr ""
 msgid "Document entered %s %02d:%02d:%02d by %s (%s):"
 msgstr ""
 
-#: src/val-labs.c:138
+#: src/val-labs.c:112
 #, c-format
 msgid ""
 "It is not possible to assign value labels to long string variables such as %"
 "s."
 msgstr ""
 
-#: src/val-labs.c:176
-msgid "String expected for value."
-msgstr ""
-
-#: src/val-labs.c:185
-msgid "Number expected for value."
-msgstr ""
-
-#: src/val-labs.c:189
+#: src/val-labs.c:161
 #, c-format
 msgid "Value label `%g' is not integer."
 msgstr ""
 
-#: src/val-labs.c:199
+#: src/val-labs.c:171
 msgid "Truncating value label to 60 characters."
 msgstr ""
 
-#: src/val-labs.c:220
-msgid "Value labels:"
-msgstr ""
-
-#: src/val-labs.c:237
-#, c-format
-msgid "    (no value labels)\n"
-msgstr ""
-
 #: src/var-labs.c:53
 msgid "String expected for variable label."
 msgstr ""
@@ -4110,56 +4070,39 @@ msgid ""
 "the long form or the short form of VECTOR."
 msgstr ""
 
-#: src/vfm.c:391
-msgid "<NOVAR>"
+#: src/vfm.c:507
+#, c-format
+msgid ""
+"An error occurred creating a temporary file for use as the active file: %s."
 msgstr ""
 
-#: src/vfm.c:554
+#: src/vfm.c:520
 #, c-format
 msgid ""
-"An error occurred attempting to create a temporary file for use as the "
-"active file: %s."
+"An error occurred writing to a temporary file used as the active file: %s."
 msgstr ""
 
-#: src/vfm.c:579
+#: src/vfm.c:599
 #, c-format
 msgid ""
-"An error occurred while attempting to write to a temporary file used as the "
-"active file: %s."
+"Workspace limit of %d KB (%d cases at %d bytes each) overflowed.  Writing "
+"active file to disk."
 msgstr ""
 
-#: src/vfm.c:606
+#: src/vfm.c:631
 #, c-format
 msgid ""
 "An error occurred while attempting to rewind a temporary file used as the "
 "active file: %s."
 msgstr ""
 
-#: src/vfm.c:651
+#: src/vfm.c:680
 #, c-format
 msgid ""
 "An error occurred while attempting to read from a temporary file created for "
 "the active file: %s."
 msgstr ""
 
-#: src/vfm.c:755
-msgid "Virtual memory exhausted.  Writing active file to disk."
-msgstr ""
-
-#: src/vfm.c:758
-#, c-format
-msgid ""
-"Workspace limit of %d KB (%d cases at %d bytes each) overflowed.  Writing "
-"active file to disk."
-msgstr ""
-
-#: src/vfm.c:778 src/vfm.c:817
-#, c-format
-msgid ""
-"An error occurred while attempting to write to a temporary file created as "
-"the active file: %s."
-msgstr ""
-
 #: src/weight.c:54
 msgid "The weighting variable must be numeric."
 msgstr ""
@@ -4177,267 +4120,267 @@ msgstr ""
 msgid "Write mode ALL not allowed in general mode.  Assuming WRITE=CELLS."
 msgstr ""
 
-#: src/crosstabs.q:321
+#: src/crosstabs.q:322
 msgid "expecting BY"
 msgstr ""
 
-#: src/crosstabs.q:388
+#: src/crosstabs.q:389
 msgid "VARIABLES must be specified before TABLES."
 msgstr ""
 
-#: src/crosstabs.q:425
+#: src/crosstabs.q:426
 #, c-format
 msgid "Maximum value (%ld) less than minimum value (%ld)."
 msgstr ""
 
-#: src/crosstabs.q:859
+#: src/crosstabs.q:860
 msgid "Summary."
 msgstr ""
 
-#: src/crosstabs.q:861
+#: src/crosstabs.q:862
 msgid "Cases"
 msgstr ""
 
-#: src/crosstabs.q:862 src/frequencies.q:1007
+#: src/crosstabs.q:863 src/frequencies.q:1007
 msgid "Valid"
 msgstr ""
 
-#: src/crosstabs.q:863 src/frequencies.q:1074
+#: src/crosstabs.q:864 src/frequencies.q:1074
 msgid "Missing"
 msgstr ""
 
-#: src/crosstabs.q:864 src/crosstabs.q:1067 src/crosstabs.q:1800
+#: src/crosstabs.q:865 src/crosstabs.q:1068 src/crosstabs.q:1801
 #: src/frequencies.q:1083
 msgid "Total"
 msgstr ""
 
-#: src/crosstabs.q:874 src/t-test.q:655 src/t-test.q:678 src/t-test.q:769
-#: src/t-test.q:1343
+#: src/crosstabs.q:875 src/t-test.q:657 src/t-test.q:680 src/t-test.q:771
+#: src/t-test.q:1345
 msgid "N"
 msgstr ""
 
-#: src/crosstabs.q:875 src/frequencies.q:1011 src/frequencies.q:1012
+#: src/crosstabs.q:876 src/frequencies.q:1011 src/frequencies.q:1012
 #: src/frequencies.q:1013
 msgid "Percent"
 msgstr ""
 
-#: src/crosstabs.q:1117
+#: src/crosstabs.q:1118
 msgid "count"
 msgstr ""
 
-#: src/crosstabs.q:1118
+#: src/crosstabs.q:1119
 msgid "row %"
 msgstr ""
 
-#: src/crosstabs.q:1119
+#: src/crosstabs.q:1120
 msgid "column %"
 msgstr ""
 
-#: src/crosstabs.q:1120
+#: src/crosstabs.q:1121
 msgid "total %"
 msgstr ""
 
-#: src/crosstabs.q:1121
+#: src/crosstabs.q:1122
 msgid "expected"
 msgstr ""
 
-#: src/crosstabs.q:1122
+#: src/crosstabs.q:1123
 msgid "residual"
 msgstr ""
 
-#: src/crosstabs.q:1123
+#: src/crosstabs.q:1124
 msgid "std. resid."
 msgstr ""
 
-#: src/crosstabs.q:1124
+#: src/crosstabs.q:1125
 msgid "adj. resid."
 msgstr ""
 
-#: src/crosstabs.q:1157 src/crosstabs.q:1184 src/crosstabs.q:1204
-#: src/crosstabs.q:1225
+#: src/crosstabs.q:1158 src/crosstabs.q:1185 src/crosstabs.q:1205
+#: src/crosstabs.q:1226
 msgid "Statistic"
 msgstr ""
 
-#: src/crosstabs.q:1159 src/t-test.q:920 src/t-test.q:1121 src/t-test.q:1227
+#: src/crosstabs.q:1160 src/t-test.q:922 src/t-test.q:1123 src/t-test.q:1229
 msgid "df"
 msgstr ""
 
-#: src/crosstabs.q:1161
+#: src/crosstabs.q:1162
 msgid "Asymp. Sig. (2-sided)"
 msgstr ""
 
-#: src/crosstabs.q:1163
+#: src/crosstabs.q:1164
 msgid "Exact. Sig. (2-sided)"
 msgstr ""
 
-#: src/crosstabs.q:1165
+#: src/crosstabs.q:1166
 msgid "Exact. Sig. (1-sided)"
 msgstr ""
 
-#: src/crosstabs.q:1183 src/crosstabs.q:1224
+#: src/crosstabs.q:1184 src/crosstabs.q:1225
 msgid "Category"
 msgstr ""
 
-#: src/crosstabs.q:1186 src/crosstabs.q:1228
+#: src/crosstabs.q:1187 src/crosstabs.q:1229
 msgid "Asymp. Std. Error"
 msgstr ""
 
-#: src/crosstabs.q:1187 src/crosstabs.q:1229
+#: src/crosstabs.q:1188 src/crosstabs.q:1230
 msgid "Approx. T"
 msgstr ""
 
-#: src/crosstabs.q:1188 src/crosstabs.q:1230
+#: src/crosstabs.q:1189 src/crosstabs.q:1231
 msgid "Approx. Sig."
 msgstr ""
 
-#: src/crosstabs.q:1203
+#: src/crosstabs.q:1204
 #, c-format
 msgid " 95%% Confidence Interval"
 msgstr ""
 
-#: src/crosstabs.q:1206 src/t-test.q:924 src/t-test.q:1118 src/t-test.q:1230
+#: src/crosstabs.q:1207 src/t-test.q:926 src/t-test.q:1120 src/t-test.q:1232
 msgid "Lower"
 msgstr ""
 
-#: src/crosstabs.q:1207 src/t-test.q:925 src/t-test.q:1119 src/t-test.q:1231
+#: src/crosstabs.q:1208 src/t-test.q:927 src/t-test.q:1121 src/t-test.q:1233
 msgid "Upper"
 msgstr ""
 
-#: src/crosstabs.q:1226
+#: src/crosstabs.q:1227
 msgid "Type"
 msgstr ""
 
-#: src/crosstabs.q:1976
+#: src/crosstabs.q:1977
 msgid "Pearson Chi-Square"
 msgstr ""
 
-#: src/crosstabs.q:1977
+#: src/crosstabs.q:1978
 msgid "Likelihood Ratio"
 msgstr ""
 
-#: src/crosstabs.q:1978
+#: src/crosstabs.q:1979
 msgid "Fisher's Exact Test"
 msgstr ""
 
-#: src/crosstabs.q:1979
+#: src/crosstabs.q:1980
 msgid "Continuity Correction"
 msgstr ""
 
-#: src/crosstabs.q:1980
+#: src/crosstabs.q:1981
 msgid "Linear-by-Linear Association"
 msgstr ""
 
-#: src/crosstabs.q:2017 src/crosstabs.q:2087 src/crosstabs.q:2146
+#: src/crosstabs.q:2018 src/crosstabs.q:2088 src/crosstabs.q:2147
 msgid "N of Valid Cases"
 msgstr ""
 
-#: src/crosstabs.q:2033 src/crosstabs.q:2162
+#: src/crosstabs.q:2034 src/crosstabs.q:2163
 msgid "Nominal by Nominal"
 msgstr ""
 
-#: src/crosstabs.q:2034 src/crosstabs.q:2163
+#: src/crosstabs.q:2035 src/crosstabs.q:2164
 msgid "Ordinal by Ordinal"
 msgstr ""
 
-#: src/crosstabs.q:2035
+#: src/crosstabs.q:2036
 msgid "Interval by Interval"
 msgstr ""
 
-#: src/crosstabs.q:2036
+#: src/crosstabs.q:2037
 msgid "Measure of Agreement"
 msgstr ""
 
-#: src/crosstabs.q:2041
+#: src/crosstabs.q:2042
 msgid "Phi"
 msgstr ""
 
-#: src/crosstabs.q:2042
+#: src/crosstabs.q:2043
 msgid "Cramer's V"
 msgstr ""
 
-#: src/crosstabs.q:2043
+#: src/crosstabs.q:2044
 msgid "Contingency Coefficient"
 msgstr ""
 
-#: src/crosstabs.q:2044
+#: src/crosstabs.q:2045
 msgid "Kendall's tau-b"
 msgstr ""
 
-#: src/crosstabs.q:2045
+#: src/crosstabs.q:2046
 msgid "Kendall's tau-c"
 msgstr ""
 
-#: src/crosstabs.q:2046
+#: src/crosstabs.q:2047
 msgid "Gamma"
 msgstr ""
 
-#: src/crosstabs.q:2047
+#: src/crosstabs.q:2048
 msgid "Spearman Correlation"
 msgstr ""
 
-#: src/crosstabs.q:2048
+#: src/crosstabs.q:2049
 msgid "Pearson's R"
 msgstr ""
 
-#: src/crosstabs.q:2049
+#: src/crosstabs.q:2050
 msgid "Kappa"
 msgstr ""
 
-#: src/crosstabs.q:2119
+#: src/crosstabs.q:2120
 #, c-format
 msgid "Odds Ratio for %s (%g / %g)"
 msgstr ""
 
-#: src/crosstabs.q:2122
+#: src/crosstabs.q:2123
 #, c-format
 msgid "Odds Ratio for %s (%.*s / %.*s)"
 msgstr ""
 
-#: src/crosstabs.q:2130
+#: src/crosstabs.q:2131
 #, c-format
 msgid "For cohort %s = %g"
 msgstr ""
 
-#: src/crosstabs.q:2133
+#: src/crosstabs.q:2134
 #, c-format
 msgid "For cohort %s = %.*s"
 msgstr ""
 
-#: src/crosstabs.q:2164
+#: src/crosstabs.q:2165
 msgid "Nominal by Interval"
 msgstr ""
 
-#: src/crosstabs.q:2169
+#: src/crosstabs.q:2170
 msgid "Lambda"
 msgstr ""
 
-#: src/crosstabs.q:2170
+#: src/crosstabs.q:2171
 msgid "Goodman and Kruskal tau"
 msgstr ""
 
-#: src/crosstabs.q:2171
+#: src/crosstabs.q:2172
 msgid "Uncertainty Coefficient"
 msgstr ""
 
-#: src/crosstabs.q:2172
+#: src/crosstabs.q:2173
 msgid "Somers' d"
 msgstr ""
 
-#: src/crosstabs.q:2173
+#: src/crosstabs.q:2174
 msgid "Eta"
 msgstr ""
 
-#: src/crosstabs.q:2178
+#: src/crosstabs.q:2179
 msgid "Symmetric"
 msgstr ""
 
-#: src/crosstabs.q:2179 src/crosstabs.q:2180
+#: src/crosstabs.q:2180 src/crosstabs.q:2181
 #, c-format
 msgid "%s Dependent"
 msgstr ""
 
-#: src/descript.q:151 src/frequencies.q:94 src/t-test.q:656 src/t-test.q:679
-#: src/t-test.q:768 src/t-test.q:1115
+#: src/descript.q:151 src/frequencies.q:94 src/t-test.q:658 src/t-test.q:681
+#: src/t-test.q:770 src/t-test.q:1117
 msgid "Mean"
 msgstr ""
 
@@ -4866,119 +4809,138 @@ msgstr ""
 msgid "Upper value (%g) is less than lower value (%g) on VARIABLES subcommand."
 msgstr ""
 
-#: src/set.q:217 src/set.q:220 src/set.q:238 src/set.q:307 src/set.q:313
-#: src/set.q:338 src/set.q:340 src/set.q:359 src/set.q:363 src/set.q:367
-#: src/set.q:381 src/set.q:383 src/set.q:387 src/set.q:705 src/set.q:786
-#: src/set.q:867
+#: src/set.q:216 src/set.q:288 src/set.q:332 src/set.q:389 src/set.q:391
+#: src/set.q:393 src/set.q:395 src/set.q:397 src/set.q:399 src/set.q:401
+#: src/set.q:403 src/set.q:405 src/set.q:407 src/set.q:409 src/set.q:411
+#: src/set.q:413 src/set.q:792 src/set.q:873 src/set.q:968
 #, c-format
 msgid "%s is obsolete."
 msgstr ""
 
 #: src/set.q:224
-msgid "Active file compression is not yet implemented (and probably won't be)."
+msgid "LISTING is ON"
 msgstr ""
 
-#: src/set.q:233
-msgid "CPI must be greater than 0."
+#: src/set.q:226
+msgid "LISTING is OFF"
 msgstr ""
 
-#: src/set.q:242
-msgid "LPI must be greater than 0."
+#: src/set.q:252
+msgid "Journalling is off"
 msgstr ""
 
-#: src/set.q:249
+#: src/set.q:422
 msgid ""
 "CASE is not implemented and probably won't be.  If you care, complain about "
 "it."
 msgstr ""
 
-#: src/set.q:279
+#: src/set.q:427
+msgid "Active file compression is not yet implemented (and probably won't be)."
+msgstr ""
+
+#: src/set.q:441
 #, c-format
-msgid "Value for MITERATE (%ld) must be greater than 0."
+msgid ""
+"CC%c: Length of custom currency string `%s' (%d) exceeds maximum length of "
+"16."
 msgstr ""
 
-#: src/set.q:287
+#: src/set.q:463
 #, c-format
-msgid "Value for MNEST (%ld) must be greater than 0."
+msgid ""
+"CC%c: Custom currency string `%s' does not contain exactly three periods or "
+"commas (not both)."
 msgstr ""
 
-#: src/set.q:295
-msgid "MXERRS must be at least 1."
+#: src/set.q:516
+msgid "None"
 msgstr ""
 
-#: src/set.q:302
-msgid "MXLOOPS must be at least 1."
+#: src/set.q:522
+msgid "Disabled"
 msgstr ""
 
-#: src/set.q:323
-msgid "Workspace limit must be at least 1 MB."
+#: src/set.q:527
+msgid "Screen"
 msgstr ""
 
-#: src/set.q:401
-#, c-format
-msgid ""
-"CC%c: Length of custom currency string `%s' (%d) exceeds maximum length of "
-"16."
+#: src/set.q:534
+msgid "Listing"
 msgstr ""
 
-#: src/set.q:423
-#, c-format
-msgid ""
-"CC%c: Custom currency string `%s' does not contain exactly three periods or "
-"commas (not both)."
+#: src/set.q:541
+msgid "Other"
 msgstr ""
 
-#: src/set.q:566
+#: src/set.q:650
 msgid "LENGTH must be at least 1."
 msgstr ""
 
-#: src/set.q:603
+#: src/set.q:689
 msgid "Missing identifier in RESULTS subcommand."
 msgstr ""
 
-#: src/set.q:614
+#: src/set.q:700
 msgid "Unrecognized identifier in RESULTS subcommand."
 msgstr ""
 
-#: src/set.q:651
+#: src/set.q:738
 msgid "WIDTH must be at least 1."
 msgstr ""
 
-#: src/set.q:674
+#: src/set.q:761
 #, c-format
 msgid ""
 "FORMAT requires numeric output format as an argument.  Specified format %s "
 "is of type string."
 msgstr ""
 
-#: src/set.q:718
+#: src/set.q:805
 msgid "Text color must be in range 0-15."
 msgstr ""
 
-#: src/set.q:731
+#: src/set.q:818
 msgid "Background color must be in range 0-7."
 msgstr ""
 
-#: src/set.q:742
+#: src/set.q:829
 msgid "Border color must be in range 0-7."
 msgstr ""
 
-#: src/set.q:798
+#: src/set.q:885
 msgid "Lower window color must be between 0 and 6."
 msgstr ""
 
-#: src/set.q:812
+#: src/set.q:899
 msgid "Upper window color must be between 0 and 6."
 msgstr ""
 
-#: src/set.q:824
+#: src/set.q:911
 msgid "Frame color must be between 0 and 6."
 msgstr ""
 
-#: src/set.q:876
+#: src/set.q:977
 msgid "Drive letter expected in WORKDEV subcommand."
 msgstr ""
 
+#: src/set.q:1012
+msgid "Specify a terminal type with `setenv TERM <yourtype>'."
+msgstr ""
+
+#: src/set.q:1018
+msgid "Could not access the termcap data base."
+msgstr ""
+
+#: src/set.q:1020
+#, c-format
+msgid "Terminal type `%s' is not defined."
+msgstr ""
+
+#: src/set.q:1048
+msgid "data> "
+msgstr ""
+
 #: src/t-test.q:237
 msgid "TESTVAL, GROUPS and PAIRS subcommands are mutually exclusive."
 msgstr ""
@@ -4987,149 +4949,149 @@ msgstr ""
 msgid "VARIABLES subcommand is not appropriate with PAIRS"
 msgstr ""
 
-#: src/t-test.q:352 src/t-test.q:429
+#: src/t-test.q:354 src/t-test.q:431
 #, c-format
 msgid "`%s' is not a variable name"
 msgstr ""
 
-#: src/t-test.q:365
+#: src/t-test.q:367
 #, c-format
 msgid "Long string variable %s is not valid here."
 msgstr ""
 
-#: src/t-test.q:382
+#: src/t-test.q:384
 msgid ""
 "When applying GROUPS to a string variable, at least one value must be "
 "specified."
 msgstr ""
 
-#: src/t-test.q:464
+#: src/t-test.q:466
 #, c-format
 msgid ""
 "PAIRED was specified but the number of variables preceding WITH (%d) did not "
 "match the number following (%d)."
 msgstr ""
 
-#: src/t-test.q:481
+#: src/t-test.q:483
 msgid "At least two variables must be specified on PAIRS."
 msgstr ""
 
-#: src/t-test.q:653
+#: src/t-test.q:655
 msgid "One-Sample Statistics"
 msgstr ""
 
-#: src/t-test.q:657 src/t-test.q:680 src/t-test.q:770 src/t-test.q:1116
+#: src/t-test.q:659 src/t-test.q:682 src/t-test.q:772 src/t-test.q:1118
 msgid "Std. Deviation"
 msgstr ""
 
-#: src/t-test.q:658 src/t-test.q:681 src/t-test.q:771
+#: src/t-test.q:660 src/t-test.q:683 src/t-test.q:773
 msgid "SE. Mean"
 msgstr ""
 
-#: src/t-test.q:675
+#: src/t-test.q:677
 msgid "Group Statistics"
 msgstr ""
 
-#: src/t-test.q:765
+#: src/t-test.q:767
 msgid "Paired Sample Statistics"
 msgstr ""
 
-#: src/t-test.q:787 src/t-test.q:1144 src/t-test.q:1364
+#: src/t-test.q:789 src/t-test.q:1146 src/t-test.q:1366
 #, c-format
 msgid "Pair %d"
 msgstr ""
 
-#: src/t-test.q:905
+#: src/t-test.q:907
 msgid "Independent Samples Test"
 msgstr ""
 
-#: src/t-test.q:913
+#: src/t-test.q:915
 msgid "Levene's Test for Equality of Variances"
 msgstr ""
 
-#: src/t-test.q:915
+#: src/t-test.q:917
 msgid "t-test for Equality of Means"
 msgstr ""
 
-#: src/t-test.q:917
+#: src/t-test.q:919
 msgid "F"
 msgstr ""
 
-#: src/t-test.q:918 src/t-test.q:1345
+#: src/t-test.q:920 src/t-test.q:1347
 msgid "Sig."
 msgstr ""
 
-#: src/t-test.q:919 src/t-test.q:1120 src/t-test.q:1226
+#: src/t-test.q:921 src/t-test.q:1122 src/t-test.q:1228
 msgid "t"
 msgstr ""
 
-#: src/t-test.q:921 src/t-test.q:1122 src/t-test.q:1228
+#: src/t-test.q:923 src/t-test.q:1124 src/t-test.q:1230
 msgid "Sig. (2-tailed)"
 msgstr ""
 
-#: src/t-test.q:922 src/t-test.q:1229
+#: src/t-test.q:924 src/t-test.q:1231
 msgid "Mean Difference"
 msgstr ""
 
-#: src/t-test.q:923
+#: src/t-test.q:925
 msgid "Std. Error Difference"
 msgstr ""
 
-#: src/t-test.q:928 src/t-test.q:1112 src/t-test.q:1221
+#: src/t-test.q:930 src/t-test.q:1114 src/t-test.q:1223
 #, c-format
 msgid "%d%% Confidence Interval of the Difference"
 msgstr ""
 
-#: src/t-test.q:962
+#: src/t-test.q:964
 msgid "Equal variances assumed"
 msgstr ""
 
-#: src/t-test.q:977
+#: src/t-test.q:979
 #, c-format
 msgid "Error calculating F statistic (cdff returned %d)."
 msgstr ""
 
-#: src/t-test.q:1000 src/t-test.q:1020 src/t-test.q:1058 src/t-test.q:1070
-#: src/t-test.q:1165 src/t-test.q:1191 src/t-test.q:1271 src/t-test.q:1288
-#: src/t-test.q:1377
+#: src/t-test.q:1002 src/t-test.q:1022 src/t-test.q:1060 src/t-test.q:1072
+#: src/t-test.q:1167 src/t-test.q:1193 src/t-test.q:1273 src/t-test.q:1290
+#: src/t-test.q:1379
 #, c-format
 msgid "Error calculating T statistic (cdft returned %d)."
 msgstr ""
 
-#: src/t-test.q:1034
+#: src/t-test.q:1036
 msgid "Equal variances not assumed"
 msgstr ""
 
-#: src/t-test.q:1102
+#: src/t-test.q:1104
 msgid "Paired Samples Test"
 msgstr ""
 
-#: src/t-test.q:1105
+#: src/t-test.q:1107
 msgid "Paired Differences"
 msgstr ""
 
-#: src/t-test.q:1117
+#: src/t-test.q:1119
 msgid "Std. Error Mean"
 msgstr ""
 
-#: src/t-test.q:1210
+#: src/t-test.q:1212
 msgid "One-Sample Test"
 msgstr ""
 
-#: src/t-test.q:1215
+#: src/t-test.q:1217
 #, c-format
 msgid "Test Value = %f"
 msgstr ""
 
-#: src/t-test.q:1340
+#: src/t-test.q:1342
 msgid "Paired Samples Correlations"
 msgstr ""
 
-#: src/t-test.q:1344
+#: src/t-test.q:1346
 msgid "Correlation"
 msgstr ""
 
-#: src/t-test.q:1367
+#: src/t-test.q:1369
 #, c-format
 msgid "%s & %s"
 msgstr ""
index 3a8fdf716155c0d43e146a877de2669710c5ebe7..30730f0a2eed915e78aba57981ea67d3324954c4 100644 (file)
@@ -1,3 +1,24 @@
+Sat Mar 20 00:05:42 WST 2004 John Darrington <john@darrington.wattle.id.au>
+
+       * set.q:  Implemented the SHOW command, and synced it to the existing 
+       SET cmd.
+
+       Added a handler for SIGWINCH so that viewlength and viewwidth follow
+       changes as the window size is changed.
+
+       Added fallback to set viewlength and viewwidth from LINES and COLUMS
+       environment variables if other methods are not available.
+
+       glob.c: Removed a lot of global variables from glob.c and encapsulated 
+       them in set.q
+
+       random.c: Tidied up the way the random seed is set.
+
+       str.c: Added a ds_vprintf function.
+
+       error.c: Extended dump_message so that messages are always broken at
+       '\n' characters.
+       
 Thu Mar 18 11:07:14 2004  Ben Pfaff  <blp@gnu.org>
 
        * pfm-write.c: (bufwrite) Write out the correct element for string
index b982637366ce4c435510a6fea87afc6138e6e671..487b4e36234b01a8eafe642040ddde350e9c34c3 100644 (file)
@@ -28,15 +28,16 @@ $(q_sources_c): q2c$(EXEEXT)
        ./q2c $< $@
 
 q_sources_c = correlations.c crosstabs.c descript.c file-handle.c      \
-frequencies.c list.c means.c set.c t-test.c
+frequencies.c list.c means.c set.c  t-test.c
 
 q_sources_q = correlations.q crosstabs.q descript.q file-handle.q      \
-frequencies.q list.q means.q set.q t-test.q
+frequencies.q list.q means.q set.q  t-test.q
 
 pspp_SOURCES = $(q_sources_c) \
 aggregate.c algorithm.c algorithm.h alloc.c alloc.h    \
 apply-dict.c ascii.c autorecode.c bitvector.h  \
 cmdline.c cmdline.h command.c command.def command.h compute.c          \
+copyleft.c copyleft.h \
 count.c data-in.c data-in.h data-list.c        data-list.h \
 data-out.c debug-print.h devind.c devind.h dfm.c dfm.h \
 dictionary.c do-if.c do-ifP.h error.c error.h expr-evl.c expr-opt.c    \
index cb7cff064d2371e87ef9ea08ec75152d1eaf98ec..72b4605978a650d7c6da5127fd2ab9388e5ae658 100644 (file)
@@ -326,7 +326,7 @@ create_sysfile (struct agr_proc *agr)
   struct sfm_write_info w;
   w.h = agr->out_file;
   w.dict = agr->dict;
-  w.compress = set_scompression;
+  w.compress = get_scompression();
   if (!sfm_write_dictionary (&w))
     return 0;
 
index ac33ee4aaa7ee43e451efca6ca36e35551c1ae0b..fd4e6c450dc7ab82410b57a0897238f683e5a32f 100644 (file)
@@ -41,6 +41,8 @@ static void usage (void);
 
 char *subst_vars (char *);
 
+static int testing_mode=0;
+
 /* Parses the command line specified by ARGC and ARGV as received by
    main(). */
 void
@@ -64,7 +66,7 @@ parse_command_line (int argc, char **argv)
     {"pipe", no_argument, NULL, 'p'},
     {"recon", no_argument, NULL, 'n'},
     {"safer", no_argument, NULL, 's'},
-    {"testing-mode", no_argument, &set_testing_mode, 1},
+    {"testing-mode", no_argument, &testing_mode, 1},
     {"verbose", no_argument, NULL, 'v'},
     {"version", no_argument, NULL, 'V'},
     {0, 0, 0, 0},
@@ -147,7 +149,7 @@ parse_command_line (int argc, char **argv)
          no_statrc = 1;
          break;
        case 's':
-         set_safer = 1;
+         make_safe();
          break;
        case 'v':
          err_verbosity++;
@@ -172,11 +174,13 @@ parse_command_line (int argc, char **argv)
        }
     }
 
-  if (set_testing_mode)
+
+  if (testing_mode)
     {
       /* FIXME: Later this option should do some other things, too. */
-      set_viewwidth = 9999;
+      force_long_view();
     }
+    
 
   for (i = optind; i < argc; i++)
     {
index 316868a2be5d5663ffb72ba4745144b62e8ea694..163f9845742ee095096f8791c7d18d64d47f4a52 100644 (file)
@@ -566,21 +566,17 @@ cmd_execute (void)
   return lex_end_of_command ();
 }
 
-#define assert_not_safer() \
-  do { \
-   if (set_safer) \
-    { \
-      msg (SE, _("This command not allowed when the SAFER option is set.")); \
-      return CMD_FAILURE; \
-    } \
-} while(0) 
-
 /* Parses, performs the ERASE command. */
 int
 cmd_erase (void)
 {
 
-  assert_not_safer();
+  if ( safer_mode() ) 
+    { 
+      msg (SE, _("This command not allowed when the SAFER option is set.")); 
+      return CMD_FAILURE; 
+    } 
+
   
   lex_match_id ("ERASE");
   if (!lex_force_match_id ("FILE"))
@@ -707,8 +703,12 @@ cmd_host (void)
 {
   int code;
 
-  assert_not_safer();
-  
+  if ( safer_mode() ) 
+    { 
+      msg (SE, _("This command not allowed when the SAFER option is set.")); 
+      return CMD_FAILURE; 
+    } 
+
   lex_match_id ("HOST");
 
 #ifdef unix
index 790ed05dc265219c7a8f77bfe63186bceecdabba..c3ee874b617405ac146a6351cfd1f6fb17c79e56 100644 (file)
@@ -114,7 +114,7 @@ DEFCMD ("SAMPLE",                 ERRO, ERRO, TRAN, TRAN, cmd_sample)
 DEFCMD ("SAVE",                   ERRO, ERRO, PROC, PROC, cmd_save)
 DEFCMD ("SELECT IF",              ERRO, ERRO, TRAN, TRAN, cmd_select_if)
 DEFCMD ("SET",                    INIT, INPU, TRAN, PROC, cmd_set)
-UNIMPL ("SHOW",                   INIT, INPU, TRAN, PROC)
+DEFCMD ("SHOW",                    INIT, INPU, TRAN, PROC, cmd_show)
 DEFCMD ("SORT CASES",             ERRO, ERRO, PROC, PROC, cmd_sort_cases)
 DEFCMD ("SPLIT FILE",             ERRO, INPU, TRAN, TRAN, cmd_split_file)
 DEFCMD ("STRING",                 ERRO, INPU, TRAN, TRAN, cmd_string)
diff --git a/src/copyleft.c b/src/copyleft.c
new file mode 100644 (file)
index 0000000..74799f5
--- /dev/null
@@ -0,0 +1,365 @@
+char lack_of_warranty[]=""
+"                          NO WARRANTY\n"
+"\n"
+"BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY "
+"FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN "
+"OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES "
+"PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED "
+"OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF "
+"MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS "
+"TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE "
+"PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, "
+"REPAIR OR CORRECTION.\n"
+"\n"
+"IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING "
+"WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR "
+"REDISTRIBUTE THE PROGRAM, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY  "
+"GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE "
+"OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA  "
+"OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD  "
+"PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),  "
+"EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY  "
+"OF SUCH DAMAGES.";
+
+char copyleft[]=""
+"                  GNU GENERAL PUBLIC LICENSE\n "
+"                     Version 2, June 1991\n "
+" \n"
+" Copyright (C) 1989, 1991 Free Software Foundation, Inc. \n"
+"     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n "
+" Everyone is permitted to copy and distribute verbatim copies "
+" of this license document, but changing it is not allowed. "
+" \n"
+"                          Preamble \n"
+"\n"
+"  The licenses for most software are designed to take away your "
+"freedom to share and change it.  By contrast, the GNU General Public "
+"License is intended to guarantee your freedom to share and change free "
+"software--to make sure the software is free for all its users.  This "
+"General Public License applies to most of the Free Software "
+"Foundation\'s software and to any other program whose authors commit to "
+"using it.  (Some other Free Software Foundation software is covered by "
+"the GNU Library General Public License instead.)  You can apply it to "
+"your programs, too. "
+"\n"
+"  When we speak of free software, we are referring to freedom, not "
+"price.  Our General Public Licenses are designed to make sure that you "
+"have the freedom to distribute copies of free software (and charge for "
+"this service if you wish), that you receive source code or can get it "
+"if you want it, that you can change the software or use pieces of it "
+"in new free programs; and that you know you can do these things. "
+" \n"
+"  To protect your rights, we need to make restrictions that forbid "
+"anyone to deny you these rights or to ask you to surrender the rights. "
+"These restrictions translate to certain responsibilities for you if you "
+"distribute copies of the software, or if you modify it. "
+" \n"
+"  For example, if you distribute copies of such a program, whether "
+"gratis or for a fee, you must give the recipients all the rights that "
+"you have.  You must make sure that they, too, receive or can get the "
+"source code.  And you must show them these terms so they know their "
+"rights. "
+" \n"
+"  We protect your rights with two steps: (1) copyright the software, and "
+"(2) offer you this license which gives you legal permission to copy, "
+"distribute and/or modify the software. "
+" \n"
+"  Also, for each author's protection and ours, we want to make certain "
+"that everyone understands that there is no warranty for this free "
+"software.  If the software is modified by someone else and passed on, we "
+"want its recipients to know that what they have is not the original, so "
+"that any problems introduced by others will not reflect on the original "
+"authors' reputations. "
+" \n"
+"  Finally, any free program is threatened constantly by software "
+"patents.  We wish to avoid the danger that redistributors of a free "
+"program will individually obtain patent licenses, in effect making the "
+"program proprietary.  To prevent this, we have made it clear that any "
+"patent must be licensed for everyone's free use or not licensed at all. "
+" \n"
+"  The precise terms and conditions for copying, distribution and "
+"modification follow. "
+"\n "
+"                  GNU GENERAL PUBLIC LICENSE \n"
+"   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION \n"
+" \n"
+"  0. This License applies to any program or other work which contains "
+"a notice placed by the copyright holder saying it may be distributed "
+"under the terms of this General Public License.  The \"Program\", below, "
+"refers to any such program or work, and a \"work based on the Program\" "
+"means either the Program or any derivative work under copyright law: "
+"that is to say, a work containing the Program or a portion of it, "
+"either verbatim or with modifications and/or translated into another "
+"language.  (Hereinafter, translation is included without limitation in "
+"the term \"modification\".)  Each licensee is addressed as \"you\". "
+" \n"
+"Activities other than copying, distribution and modification are not "
+"covered by this License; they are outside its scope.  The act of "
+"running the Program is not restricted, and the output from the Program "
+"is covered only if its contents constitute a work based on the "
+"Program (independent of having been made by running the Program). "
+"Whether that is true depends on what the Program does. "
+"\n"
+"  1. You may copy and distribute verbatim copies of the Program's "
+"source code as you receive it, in any medium, provided that you "
+"conspicuously and appropriately publish on each copy an appropriate "
+"copyright notice and disclaimer of warranty; keep intact all the "
+"notices that refer to this License and to the absence of any warranty; "
+"and give any other recipients of the Program a copy of this License "
+"along with the Program. "
+"\n"
+"You may charge a fee for the physical act of transferring a copy, and "
+"you may at your option offer warranty protection in exchange for a fee. "
+"\n"
+"  2. You may modify your copy or copies of the Program or any portion "
+"of it, thus forming a work based on the Program, and copy and "
+"distribute such modifications or work under the terms of Section 1 "
+"above, provided that you also meet all of these conditions: "
+"\n"
+"    a) You must cause the modified files to carry prominent notices "
+"    stating that you changed the files and the date of any change. "
+"\n"
+"    b) You must cause any work that you distribute or publish, that in "
+"    whole or in part contains or is derived from the Program or any "
+"    part thereof, to be licensed as a whole at no charge to all third "
+"    parties under the terms of this License. "
+"\n"
+"    c) If the modified program normally reads commands interactively "
+"    when run, you must cause it, when started running for such "
+"    interactive use in the most ordinary way, to print or display an "
+"    announcement including an appropriate copyright notice and a "
+"    notice that there is no warranty (or else, saying that you provide "
+"    a warranty) and that users may redistribute the program under "
+"    these conditions, and telling the user how to view a copy of this "
+"    License.  (Exception: if the Program itself is interactive but "
+"    does not normally print such an announcement, your work based on "
+"    the Program is not required to print an announcement.) "
+"\n "
+"These requirements apply to the modified work as a whole.  If "
+"identifiable sections of that work are not derived from the Program, "
+"and can be reasonably considered independent and separate works in "
+"themselves, then this License, and its terms, do not apply to those "
+"sections when you distribute them as separate works.  But when you "
+"distribute the same sections as part of a whole which is a work based "
+"on the Program, the distribution of the whole must be on the terms of "
+"this License, whose permissions for other licensees extend to the "
+"entire whole, and thus to each and every part regardless of who wrote it. "
+"\n"
+"Thus, it is not the intent of this section to claim rights or contest "
+"your rights to work written entirely by you; rather, the intent is to "
+"exercise the right to control the distribution of derivative or "
+"collective works based on the Program. "
+"\n"
+"In addition, mere aggregation of another work not based on the Program "
+"with the Program (or with a work based on the Program) on a volume of "
+"a storage or distribution medium does not bring the other work under "
+"the scope of this License. "
+"\n"
+"  3. You may copy and distribute the Program (or a work based on it, "
+"under Section 2) in object code or executable form under the terms of "
+"Sections 1 and 2 above provided that you also do one of the following: "
+"\n"
+"    a) Accompany it with the complete corresponding machine-readable "
+"    source code, which must be distributed under the terms of Sections "
+"    1 and 2 above on a medium customarily used for software interchange; or, "
+"\n"
+"    b) Accompany it with a written offer, valid for at least three "
+"    years, to give any third party, for a charge no more than your "
+"    cost of physically performing source distribution, a complete "
+"    machine-readable copy of the corresponding source code, to be "
+"    distributed under the terms of Sections 1 and 2 above on a medium "
+"    customarily used for software interchange; or, "
+"\n"
+"    c) Accompany it with the information you received as to the offer "
+"    to distribute corresponding source code.  (This alternative is "
+"    allowed only for noncommercial distribution and only if you "
+"    received the program in object code or executable form with such "
+"    an offer, in accord with Subsection b above.) "
+"\n"
+"The source code for a work means the preferred form of the work for "
+"making modifications to it.  For an executable work, complete source "
+"code means all the source code for all modules it contains, plus any "
+"associated interface definition files, plus the scripts used to "
+"control compilation and installation of the executable.  However, as a "
+"special exception, the source code distributed need not include "
+"anything that is normally distributed (in either source or binary "
+"form) with the major components (compiler, kernel, and so on) of the "
+"operating system on which the executable runs, unless that component "
+"itself accompanies the executable. "
+"\n"
+"If distribution of executable or object code is made by offering "
+"access to copy from a designated place, then offering equivalent "
+"access to copy the source code from the same place counts as "
+"distribution of the source code, even though third parties are not "
+"compelled to copy the source along with the object code. "
+"\n "
+"  4. You may not copy, modify, sublicense, or distribute the Program "
+"except as expressly provided under this License.  Any attempt "
+"otherwise to copy, modify, sublicense or distribute the Program is "
+"void, and will automatically terminate your rights under this License. "
+"However, parties who have received copies, or rights, from you under "
+"this License will not have their licenses terminated so long as such "
+"parties remain in full compliance. "
+"\n"
+"  5. You are not required to accept this License, since you have not "
+"signed it.  However, nothing else grants you permission to modify or "
+"distribute the Program or its derivative works.  These actions are "
+"prohibited by law if you do not accept this License.  Therefore, by "
+"modifying or distributing the Program (or any work based on the "
+"Program), you indicate your acceptance of this License to do so, and "
+"all its terms and conditions for copying, distributing or modifying "
+"the Program or works based on it. "
+"\n"
+"  6. Each time you redistribute the Program (or any work based on the "
+"Program), the recipient automatically receives a license from the "
+"original licensor to copy, distribute or modify the Program subject to "
+"these terms and conditions.  You may not impose any further "
+"restrictions on the recipients' exercise of the rights granted herein. "
+"You are not responsible for enforcing compliance by third parties to "
+"this License. "
+"\n"
+"  7. If, as a consequence of a court judgment or allegation of patent "
+"infringement or for any other reason (not limited to patent issues), "
+"conditions are imposed on you (whether by court order, agreement or "
+"otherwise) that contradict the conditions of this License, they do not "
+"excuse you from the conditions of this License.  If you cannot "
+"distribute so as to satisfy simultaneously your obligations under this "
+"License and any other pertinent obligations, then as a consequence you "
+"may not distribute the Program at all.  For example, if a patent "
+"license would not permit royalty-free redistribution of the Program by "
+"all those who receive copies directly or indirectly through you, then "
+"the only way you could satisfy both it and this License would be to "
+"refrain entirely from distribution of the Program. "
+"\n"
+"If any portion of this section is held invalid or unenforceable under "
+"any particular circumstance, the balance of the section is intended to "
+"apply and the section as a whole is intended to apply in other "
+"circumstances. "
+"\n"
+"It is not the purpose of this section to induce you to infringe any "
+"patents or other property right claims or to contest validity of any "
+"such claims; this section has the sole purpose of protecting the "
+"integrity of the free software distribution system, which is "
+"implemented by public license practices.  Many people have made "
+"generous contributions to the wide range of software distributed "
+"through that system in reliance on consistent application of that "
+"system; it is up to the author/donor to decide if he or she is willing "
+"to distribute software through any other system and a licensee cannot "
+"impose that choice. "
+"\n"
+"This section is intended to make thoroughly clear what is believed to "
+"be a consequence of the rest of this License. "
+"\n "
+"  8. If the distribution and/or use of the Program is restricted in "
+"certain countries either by patents or by copyrighted interfaces, the "
+"original copyright holder who places the Program under this License "
+"may add an explicit geographical distribution limitation excluding "
+"those countries, so that distribution is permitted only in or among "
+"countries not thus excluded.  In such case, this License incorporates "
+"the limitation as if written in the body of this License. "
+"\n"
+"  9. The Free Software Foundation may publish revised and/or new versions "
+"of the General Public License from time to time.  Such new versions will "
+"be similar in spirit to the present version, but may differ in detail to "
+"address new problems or concerns. "
+"\n"
+"Each version is given a distinguishing version number.  If the Program "
+"specifies a version number of this License which applies to it and \"any "
+"later version\", you have the option of following the terms and conditions "
+"either of that version or of any later version published by the Free "
+"Software Foundation.  If the Program does not specify a version number of "
+"this License, you may choose any version ever published by the Free Software "
+"Foundation. "
+"\n"
+"  10. If you wish to incorporate parts of the Program into other free "
+"programs whose distribution conditions are different, write to the author "
+"to ask for permission.  For software which is copyrighted by the Free "
+"Software Foundation, write to the Free Software Foundation; we sometimes "
+"make exceptions for this.  Our decision will be guided by the two goals "
+"of preserving the free status of all derivatives of our free software and "
+"of promoting the sharing and reuse of software generally. "
+"\n"
+"                          NO WARRANTY "
+"\n"
+"  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY "
+"FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN "
+"OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES "
+"PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED "
+"OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF "
+"MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS "
+"TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE "
+"PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, "
+"REPAIR OR CORRECTION. "
+"\n"
+"  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING "
+"WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR "
+"REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, "
+"INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING "
+"OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED "
+"TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY "
+"YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER "
+"PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE "
+"POSSIBILITY OF SUCH DAMAGES. "
+"\n"
+"                   END OF TERMS AND CONDITIONS "
+"\n "
+"          How to Apply These Terms to Your New Programs "
+"\n"
+"  If you develop a new program, and you want it to be of the greatest "
+"possible use to the public, the best way to achieve this is to make it "
+"free software which everyone can redistribute and change under these terms. "
+"\n"
+"  To do so, attach the following notices to the program.  It is safest "
+"to attach them to the start of each source file to most effectively "
+"convey the exclusion of warranty; and each file should have at least "
+"the \"copyright\" line and a pointer to where the full notice is found. "
+"\n"
+"    <one line to give the program's name and a brief idea of what it does.>\n"
+"    Copyright (C) <year>  <name of author>\n"
+"\n"
+"    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 2 of the License, or"
+"    (at your option) any later version.\n"
+"\n"
+"    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.\n"
+"\n"
+"    You should have received a copy of the GNU General Public License"
+"    along with this program; if not, write to the Free Software"
+"    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n"
+"\n"
+"\n"
+"Also add information on how to contact you by electronic and paper mail. "
+"\n"
+"If the program is interactive, make it output a short notice like this "
+"when it starts in an interactive mode: "
+"\n"
+"    Gnomovision version 69, Copyright (C) year  name of author\n"
+"    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n"
+"    This is free software, and you are welcome to redistribute it\n"
+"    under certain conditions; type `show c' for details.\n"
+"\n"
+"The hypothetical commands `show w' and `show c' should show the appropriate "
+"parts of the General Public License.  Of course, the commands you use may "
+"be called something other than `show w' and `show c'; they could even be "
+"mouse-clicks or menu items--whatever suits your program. "
+"\n"
+"You should also get your employer (if you work as a programmer) or your "
+"school, if any, to sign a \"copyright disclaimer\" for the program, if "
+"necessary.  Here is a sample; alter the names: "
+"\n"
+"  Yoyodyne, Inc., hereby disclaims all copyright interest in the program"
+"  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n"
+"\n"
+"  <signature of Ty Coon>, 1 April 1989\n"
+"  Ty Coon, President of Vice\n"
+"\n"
+"This General Public License does not permit incorporating your program into "
+"proprietary programs.  If your program is a subroutine library, you may "
+"consider it more useful to permit linking proprietary applications with the "
+"library.  If this is what you want to do, use the GNU Library General "
+"Public License instead of this License. "
+""; 
diff --git a/src/copyleft.h b/src/copyleft.h
new file mode 100644 (file)
index 0000000..0467aad
--- /dev/null
@@ -0,0 +1,26 @@
+/* PSPP - computes sample statistics.
+   Copyright (C) 1997-9, 2000 Free Software Foundation, Inc.
+   Written by Ben Pfaff <blp@gnu.org>.
+
+   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 2 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, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+   02111-1307, USA. */
+
+#if !copyleft_h
+#define copyleft_h 1
+
+extern char lack_of_warranty[];
+extern char copyleft[];
+
+#endif
index 3a15f89612bc5048a1e7d2c13c888e8c98f9d3d5..0c477fa2a162edbccdb21040f4230cf62994b030 100644 (file)
@@ -145,13 +145,13 @@ parse_numeric (struct data_in *i)
   
   if (type != FMT_DOT)
     {
-      decimal = set_decimal;
-      grouping = set_grouping;
+      decimal = get_decimal();
+      grouping = get_grouping();
     }
   else
     {
-      decimal = set_grouping;
-      grouping = set_decimal;
+      decimal = get_grouping();
+      grouping = get_decimal();
     }
 
   i->v->f = SYSMIS;
@@ -1491,7 +1491,7 @@ default_result (struct data_in *i)
   if (fmt->cat & FCAT_STRING)
     memset (i->v->s, ' ', i->format.w);
   else
-    i->v->f = set_blanks;
+    i->v->f = get_blanks();
 }
 
 int
@@ -1529,7 +1529,7 @@ data_in (struct data_in *i)
 
          if (++cp == i->e)
            {
-             i->v->f = set_blanks;
+             i->v->f = get_blanks();
              return 1;
            }
        }
index de50b437990fdf16a88ca6b7a98646a4e9182a1d..a5ec8da24cbae3ba5eb36a36e7a953995ad3566f 100644 (file)
@@ -839,7 +839,7 @@ parse_free (struct dls_var_spec **first, struct dls_var_spec **last)
          input.type = FMT_F;
          input.w = 8;
          input.d = 0;
-         output = set_format;
+         output = get_format();
        }
 
       if (input.type == FMT_A || input.type == FMT_AHEX)
@@ -1129,7 +1129,7 @@ read_from_data_list_list (const struct data_list_pgm *dls,
       
       if (column == 0)
        {
-         if (set_undefined)
+         if (get_undefined() )
            msg (SW, _("Missing value(s) for all variables from %s onward.  "
                 "These will be filled with the system-missing value "
                 "or blanks, as appropriate."),
index c1f3ff8120feaa93c13844c4c280ed87babe4b1c..1206dd9951d14addec9590ec1f5d7fdb77daf114 100644 (file)
@@ -413,8 +413,8 @@ convert_E (char *dst, const struct fmt_spec *fp, double number)
 
   /* The C locale always uses a period `.' as a decimal point.
      Translate to comma if necessary. */
-  if ((set_decimal == ',' && fp->type != FMT_DOT)
-      || (set_decimal == '.' && fp->type == FMT_DOT))
+  if ((get_decimal() == ',' && fp->type != FMT_DOT)
+      || (get_decimal() == '.' && fp->type == FMT_DOT))
     {
       char *cp = strchr (buf, '.');
       if (cp)
@@ -1026,7 +1026,7 @@ insert_commas (char *dst, const char *src, const struct fmt_spec *fp)
       if (i % 3 == 0 && n_digits > i && n_items > n_reserved)
        {
          n_items--;
-         *dst++ = fp->type == FMT_COMMA ? set_grouping : set_decimal;
+         *dst++ = fp->type == FMT_COMMA ? get_grouping() : get_decimal();
        }
       *dst++ = *sp++;
     }
@@ -1052,7 +1052,7 @@ year4 (int year)
 static int
 try_CCx (char *dst, const struct fmt_spec *fp, double number)
 {
-  struct set_cust_currency *cc = &set_cc[fp->type - FMT_CCA];
+  const struct set_cust_currency *cc = get_cc(fp->type - FMT_CCA);
 
   struct fmt_spec f;
 
@@ -1062,7 +1062,7 @@ try_CCx (char *dst, const struct fmt_spec *fp, double number)
 
   /* Determine length available, decimal character for number
      proper. */
-  f.type = cc->decimal == set_decimal ? FMT_COMMA : FMT_DOT;
+  f.type = cc->decimal == get_decimal() ? FMT_COMMA : FMT_DOT;
   f.w = fp->w - strlen (cc->prefix) - strlen (cc->suffix);
   if (number < 0)
     f.w -= strlen (cc->neg_prefix) + strlen (cc->neg_suffix) - 1;
@@ -1297,8 +1297,8 @@ try_F (char *dst, const struct fmt_spec *fp, double number)
       if (n == n_int + n_dec)
        {
          /* Convert periods `.' to commas `,' for our foreign friends. */
-         if ((set_decimal == ',' && fp->type != FMT_DOT)
-             || (set_decimal == '.' && fp->type == FMT_DOT))
+         if ((get_decimal() == ',' && fp->type != FMT_DOT)
+             || (get_decimal() == '.' && fp->type == FMT_DOT))
            {
              cp = strchr (cp, '.');
              if (cp)
index 9896fb279cba29d08c2fe1d4d672894ba5eb9eb1..3dadab42464d624bb9a429f54ef47b6c027045fe 100644 (file)
@@ -79,14 +79,16 @@ tmsg (int class, const char *title, const char *format, ...)
 void
 msg (int class, const char *format, ...)
 {
-  char buf[1024];
+  struct string buf;
   
+  ds_init (NULL, &buf, 1024);
+
   /* Format the message into BUF. */
   {
     va_list args;
 
     va_start (args, format);
-    vsnprintf (buf, 1024, format, args);
+    ds_vprintf (&buf, format, args);
     va_end (args);
   }
   
@@ -97,7 +99,7 @@ msg (int class, const char *format, ...)
     e.class = class;
     err_location (&e.where);
     e.title = NULL;
-    e.text = buf;
+    e.text = buf.string;
     err_vmsg (&e);
   }
 }
@@ -186,14 +188,14 @@ err_check_count (void)
 {
   int error_class = getl_interactive ? MM : FE;
 
-  if (set_errorbreak && err_error_count)
+  if (get_errorbreak() && err_error_count)
     msg (error_class, _("Terminating execution of syntax file due to error."));
-  else if (err_error_count > set_mxerrs)
+  else if (err_error_count > get_mxerrs() )
     msg (error_class, _("Errors (%d) exceeds limit (%d)."),
-        err_error_count, set_mxerrs);
-  else if (err_error_count + err_warning_count > set_mxwarns)
+        err_error_count, get_mxerrs());
+  else if (err_error_count + err_warning_count > get_mxwarns() )
     msg (error_class, _("Warnings (%d) exceed limit (%d)."),
-        err_error_count + err_warning_count, set_mxwarns);
+        err_error_count + err_warning_count, get_mxwarns() );
   else
     return;
 
@@ -243,7 +245,7 @@ err_vmsg (const struct error *e)
   /* Describes one class of error. */
   struct error_class
     {
-      int flags;               /* Zero or more of MSG_*. */
+      int flags;               /* Zero or more of ERR_*. */
       int *count;              /* Counting category. */
       const char *banner;      /* Banner. */
     };
@@ -310,7 +312,7 @@ err_vmsg (const struct error *e)
      Please note that this is not trivial.  We have to avoid an
      infinite loop in reporting errors that originate in the output
      section. */
-  dump_message (ds_value (&msg), 8, puts_stdout, set_viewwidth);
+  dump_message (ds_value (&msg), 8, puts_stdout, get_viewwidth());
 
   ds_destroy (&msg);
 
@@ -337,13 +339,20 @@ puts_stdout (const char *s)
   puts (s);
 }
 
+/* Returns 1 if the line must be broken here */
+static int
+compulsory_break(int c)
+{
+  return ( c == '\n' );
+}
+
 /* Returns 1 if C is a `break character', that is, if it is a good
    place to break a message into lines. */
 static inline int
 char_is_break (int quote, int c)
 {
   return ((quote && c == DIR_SEPARATOR)
-         || (!quote && (isspace (c) || c == '-' || c == '/')));
+         || (!quote && (isspace (c) || c == '-' || c == '/'))); 
 }
 
 /* Returns 1 if C is a break character where the break should be made
@@ -399,12 +408,13 @@ dump_message (char *msg, unsigned indent, void (*func) (const char *),
   if (indent > width / 3)
     indent = width / 3;
   
-  buf = local_alloc (width + 1);
+  buf = local_alloc (width + 2);
 
   /* Advance WIDTH characters into MSG.
      If that's a valid breakpoint, keep it; otherwise, back up.
      Output the line. */
-  for (cp = msg; (unsigned) (cp - msg) < width - 1; cp++)
+  for (cp = msg; (unsigned) (cp - msg) < width - 1 && 
+        ! compulsory_break(*cp); cp++)
     if (*cp == '"')
       quote ^= 1;
 
@@ -430,44 +440,71 @@ dump_message (char *msg, unsigned indent, void (*func) (const char *),
     *cp = c;
   }
 
+
   /* Repeat above procedure for remaining lines. */
   for (;;)
     {
+      static int hard_break=0;
+
+      int idx=0;
       char *cp2;
 
       /* Advance past whitespace. */
-      while (isspace ((unsigned char) *cp))
+      if (! hard_break ) 
+       while ( isspace ((unsigned char) *cp) )
+         cp++;
+      else
        cp++;
+
       if (*cp == 0)
-       break;
+         break; 
+
 
       /* Advance WIDTH - INDENT characters. */
-      for (cp2 = cp; (unsigned) (cp2 - cp) < width - indent && *cp2; cp2++)
+      for (cp2 = cp; (unsigned) (cp2 - cp) < width - indent && 
+            *cp2 && !compulsory_break(*cp2);  cp2++)
        if (*cp2 == '"')
          quote ^= 1;
+      
+      if ( compulsory_break(*cp2) )
+       hard_break = 1;
+      else
+       hard_break = 0;
+
 
       /* Back up if this isn't a breakpoint. */
       {
        unsigned w = cp2 - cp;
-       if (*cp2)
-         for (cp2--; !char_is_break (quote, (unsigned char) *cp2) && cp2 > cp;
+       if (*cp2 && ! compulsory_break(*cp2) )
+       for (cp2--; !char_is_break (quote, (unsigned char) *cp2) && 
+              cp2 > cp;
               cp2--)
+         {
+
            if (*cp2 == '"')
              quote ^= 1;
+         }
 
        if (w == width - indent
            && (unsigned) (cp2 - cp) <= (width - indent) * BREAK_LONG_WORD)
-         for (; (unsigned) (cp2 - cp) < width - indent && *cp2; cp2++)
+         for (; (unsigned) (cp2 - cp) < width - indent && *cp2 ; cp2++)
            if (*cp2 == '"')
              quote ^= 1;
       }
 
+      
       /* Write out the line. */
+
       memset (buf, ' ', indent);
       memcpy (&buf[indent], cp, cp2 - cp);
-      buf[indent + cp2 - cp] = '\0';
-      func (buf);
 
+      if ( hard_break) 
+       {
+         buf[indent + idx + cp2 - cp] = '\n';
+         ++idx;
+       }
+      buf[indent + idx + cp2 - cp] = '\0';
+      func (buf);
       cp = cp2;
     }
 
index c9f0b62ecc9247455631e1b45014ee3132c9ddd2..a56918f334c4686443c0028843233798ae66d0ab 100644 (file)
@@ -695,7 +695,7 @@ fn_open (const char *fn, const char *mode)
 #ifdef unix
   if (fn[0] == '|')
     {
-      if (set_safer)
+      if (safer_mode())
        return safety_violation (fn);
 
       return popen (&fn[1], mode);
@@ -705,7 +705,7 @@ fn_open (const char *fn, const char *mode)
       char *s;
       FILE *f;
 
-      if (set_safer)
+      if (safer_mode())
        return safety_violation (fn);
       
       s = local_alloc (strlen (fn));
index 7e424ba2e0f0705f170c54433c41e14494fdfa42..5fd1dea30fa15fdd908446e20e01e15dd66c83cd 100644 (file)
@@ -359,7 +359,7 @@ flip_file (struct flip_pgm *flip)
 
   /* Allocate memory for many cases. */
   case_bytes = flip->var_cnt * sizeof *input_buf;
-  case_capacity = set_max_workspace / case_bytes;
+  case_capacity = get_max_workspace() / case_bytes;
   if (case_capacity > flip->case_cnt * 2)
     case_capacity = flip->case_cnt * 2;
   if (case_capacity < 2)
index 0906d71125b45a320558fa9c173d71e297996432..c33680fd5a4c11f939c03d9274f68cc84af7cfb5 100644 (file)
--- a/src/get.c
+++ b/src/get.c
@@ -299,7 +299,7 @@ static int rename_variables (struct dictionary * dict);
 static int
 trim_dictionary (struct dictionary *dict, int *options)
 {
-  if (set_scompression)
+  if (get_scompression())
     *options |= GTSV_OPT_COMPRESSED;
 
   if (*options & GTSV_OPT_SAVE)
index 89370b1332b3c9b5d9e50f1314bbedc78985910c..2988b0787b45f1747a959b834733057194a76575 100644 (file)
@@ -57,6 +57,8 @@ extern int write_history (char *);
 #endif /* no readline/history.h */
 #endif /* -lhistory */
 
+extern struct cmd_set cmd;
+
 static struct string getl_include_path;
 
 /* Number of levels of DO REPEAT structures we're nested inside.  If
@@ -334,7 +336,7 @@ getl_read_line (void)
       if (ds_length (&getl_buf) > 0 && ds_end (&getl_buf)[-1] == '\n')
        ds_truncate (&getl_buf, ds_length (&getl_buf) - 1);
 
-      if (set_echo)
+      if (get_echo())
        tab_output_text (TAB_LEFT | TAT_FIX, ds_value (&getl_buf));
 
       getl_head->ln++;
@@ -436,15 +438,15 @@ read_console (void)
   switch (getl_prompt)
     {
     case GETL_PRPT_STANDARD:
-      prompt = set_prompt;
+      prompt = get_prompt();
       break;
 
     case GETL_PRPT_CONTINUATION:
-      prompt = set_cprompt;
+      prompt = get_cprompt();
       break;
 
     case GETL_PRPT_DATA:
-      prompt = set_dprompt;
+      prompt = get_dprompt();
       break;
 
     default:
@@ -472,7 +474,7 @@ read_console (void)
   err_error_count = err_warning_count = 0;
   err_already_flagged = 0;
 
-  fputs (getl_prompt ? set_cprompt : set_prompt, stdout);
+  fputs (getl_prompt ? get_cprompt() : get_prompt(), stdout);
   ds_clear (&getl_buf);
   if (ds_getline (&getl_buf, stdin))
     return 1;
index 60da1fffd3b2e54e2a6995de86fafcc833b14c01..61c70b46c2e5efbc34e7cce5e62b1a2b6472af72 100644 (file)
 #endif
 #endif
 
-#if HAVE_LIBTERMCAP
-#if HAVE_TERMCAP_H
-#include <termcap.h>
-#else /* !HAVE_TERMCAP_H */
-int tgetent (char *, char *);
-int tgetnum (char *);
-#endif /* !HAVE_TERMCAP_H */
-#endif /* !HAVE_LIBTERMCAP */
-
 #if HAVE_LIBHISTORY
 #if HAVE_READLINE_HISTORY_H
 #include <readline/history.h>
@@ -120,9 +111,6 @@ int logging;
 
 static void get_date (void);
 
-#if HAVE_LIBTERMCAP
-static char term_buffer[16384];
-#endif
 
 void
 init_glob (int argc UNUSED, char **argv)
@@ -137,10 +125,6 @@ init_glob (int argc UNUSED, char **argv)
   textdomain (PACKAGE);
 #endif /* ENABLE_NLS */
 
-  /* Workable defaults before we determine the real terminal size. */
-  set_viewwidth = 79;
-  set_viewlength = 24;
-
   fn_init ();
   getl_initialize ();
 
@@ -184,111 +168,8 @@ init_glob (int argc UNUSED, char **argv)
     cur_proc = NULL;
   }
 
-  /* settings.h */
-#if !USE_INTERNAL_PAGER
-  {
-    char *pager;
-
-    pager = getenv ("STAT_PAGER");
-    if (!pager)
-      pager = getenv ("PAGER");
-    if (pager)
-      set_pager = xstrdup (pager);
-#if DEFAULT_PAGER
-    else
-      set_pager = xstrdup (DEFAULT_PAGER);
-#endif /* DEFAULT_PAGER */
-  }
-#endif /* !USE_INTERNAL_PAGER */
-
-  set_blanks = SYSMIS;
-  set_scompression = 1;
-  set_format.type = FMT_F;
-  set_format.w = 8;
-  set_format.d = 2;
-  set_cpi = 6;
-  set_lpi = 10;
-  set_results_file = xstrdup ("pspp.prc");
-  set_dprompt = xstrdup (_("data> "));
-  
-  {
-    int i;
-    
-    for (i = 0; i < 5; i++)
-      {
-       struct set_cust_currency *cc = &set_cc[i];
-       strcpy (cc->buf, "-");
-       cc->neg_prefix = cc->buf;
-       cc->prefix = &cc->buf[1];
-       cc->suffix = &cc->buf[1];
-       cc->neg_suffix = &cc->buf[1];
-       cc->decimal = '.';
-       cc->grouping = ',';
-      }
-  }
-  
-  set_decimal = '.';
-  set_grouping = ',';
-  set_headers = 1;
-  set_journaling = 1;
-  set_journal = xstrdup ("pspp.jnl");
-  set_messages = 1;
-  set_mexpand = 1;
-  set_mprint = 1;
-  set_mxerrs = 50;
-  set_mxwarns = 100;
-  set_printback = 1;
-  set_undefined = 1;
-
-  set_cprompt = xstrdup ("    > ");
-  set_echo = 0;
-  set_endcmd = '.';
-  set_errorbreak = 0;
-  set_include = 1;
-  set_nullline = 1;
-  set_more = 1;
-  set_prompt = xstrdup ("PSPP> ");
-  set_seed = NOT_LONG;
-
-#if __DJGPP__ || __BORLANDC__
-  {
-    struct text_info ti;
-
-    gettextinfo (&ti);
-    set_viewlength = max (ti.screenheight, 25);
-    set_viewwidth = max (ti.screenwidth, 79);
-  }
-#elif HAVE_LIBTERMCAP
-  {
-    char *termtype;
-    int success;
-
-    /* This code stolen from termcap.info, though modified. */
-    termtype = getenv ("TERM");
-    if (!termtype)
-      msg (FE, _("Specify a terminal type with `setenv TERM <yourtype>'."));
 
-    success = tgetent (term_buffer, termtype);
-    if (success <= 0)
-      {
-       if (success < 0)
-         msg (IE, _("Could not access the termcap data base."));
-       else
-         msg (IE, _("Terminal type `%s' is not defined."), termtype);
-       msg (MM, _("Assuming screen of size 79x25."));
-       set_viewlength = 25;
-       set_viewwidth = 79;
-      }
-    else
-      {
-       set_viewlength = tgetnum ("li");
-       set_viewwidth = tgetnum ("co") - 1;
-      }
-  }
-#else /* !HAVE_LIBTERMCAP */
-  set_viewlength = 25;
-  set_viewwidth = 79;
-#endif /* !HAVE_LIBTERMCAP */
+  init_settings();
 
   /* log.h */
   logging = 1;
index a3b43a96f63b33d0151c8efa32df3569ba64f018..5b1b39415393548b4619dc16873a09bfaa28c48f 100644 (file)
@@ -794,12 +794,12 @@ lex_preprocess_line (void)
       len--;
 
     /* Check for and remove terminal dot. */
-    if (len > 0 && s[len - 1] == set_endcmd)
+    if (len > 0 && s[len - 1] == get_endcmd() )
       {
        dot = 1;
        len--;
       }
-    else if (len == 0 && set_nullline)
+    else if (len == 0 && get_nullline() )
       dot = 1;
     else
       dot = 0;
index b0c836bcc784fe832c19bc35306d3158fec258d2..7a31234c4f681629c7f9baf37abafc9618a9c9d1 100644 (file)
@@ -418,7 +418,7 @@ loop_2_trns_proc (struct trns_header * trns, struct ccase * c,
   if (two->flags == 0)
     {
       two->pass++;
-      if (two->pass > set_mxloops)
+      if (two->pass > get_mxloops() )
          return two->loop_term;
     }
 
index 30e3fde231860fadb0a7055255345bccae42abf9..42911f1847011ddcd2578c9882c7f9f0e8e37520 100644 (file)
@@ -107,7 +107,7 @@ vec_print (const struct vector *vec)
 
   for (i = 0; i < vec->n; i++)
     {
-      if (i % ((set_viewwidth - 4) / 8) == 0)
+      if (i % ((get_viewwidth() - 4) / 8) == 0)
        {
          if (i)
            putchar ('\n');
index 64c1e8e8e780b9de4868b0add0067d9684ecd01b..bdbbf30a81427b5f19d2492f48682c26536ba082 100644 (file)
@@ -74,7 +74,7 @@ char *outp_subtitle;
 
 /* A set of OUTP_DEV_* bits indicating the devices that are
    disabled. */
-int disabled_devices;
+static int disabled_devices;
 
 static void destroy_driver (struct outp_driver *);
 static void configure_driver (char *);
@@ -206,12 +206,12 @@ find_defn_value (const char *key)
       return d->value;
   if (!strcmp (key, "viewwidth"))
     {
-      sprintf (buf, "%d", set_viewwidth);
+      sprintf (buf, "%d", get_viewwidth());
       return buf;
     }
   else if (!strcmp (key, "viewlength"))
     {
-      sprintf (buf, "%d", set_viewlength);
+      sprintf (buf, "%d", get_viewlength());
       return buf;
     }
   else
@@ -455,7 +455,7 @@ outp_done (void)
 void
 outp_list_classes (void)
 {
-  int width = set_viewwidth;
+  int width = get_viewwidth();
   struct outp_driver_class_list *c;
 
   printf (_("Driver classes:\n\t"));
@@ -465,7 +465,7 @@ outp_list_classes (void)
       if ((int) strlen (c->class->name) + 1 > width)
        {
          printf ("\n\t");
-         width = set_viewwidth - 8;
+         width = get_viewwidth() - 8;
        }
       else
        putc (' ', stdout);
index 20b245986b127b3bc8ddd703048d11def95f7682..13e8013e89ab9d17cb7b0b3fa25517e6cc7869b2 100644 (file)
--- a/src/q2c.c
+++ b/src/q2c.c
@@ -338,7 +338,7 @@ find_symbol (int x)
   return iter;
 }
 
-#if DEBUGGING
+#if DEBUGGING 
 /* Writes a printable representation of the current token to
    stdout. */
 void
@@ -346,6 +346,9 @@ dump_token (void)
 {
   switch (token)
     {
+    case T_TSTRING:
+      printf ("TR_STRING\t\"%s\"\n", tokstr);
+      break;
     case T_STRING:
       printf ("STRING\t\"%s\"\n", tokstr);
       break;
@@ -373,15 +376,7 @@ lex_get (void)
        fail ("%s: Unexpected end of file.", ifn);
     }
   
-  if (*cp == '_' || isalnum ((unsigned char) *cp))
-    {
-      char *dest = tokstr;
-      token = T_ID;
-      while (*cp == '_' || isalnum ((unsigned char) *cp))
-       *dest++ = toupper ((unsigned char) (*cp++));
-      *dest++ = '\0';
-    }
-  else if (*cp == '"')
+  if (*cp == '"')
     {
       char *dest = tokstr;
       token = T_STRING;
@@ -403,6 +398,14 @@ lex_get (void)
        error ("Unterminated string literal.");
       cp++;
     }
+  else if (*cp == '_' || isalnum ((unsigned char) *cp))
+    {
+      char *dest = tokstr;
+      token = T_ID;
+      while (*cp == '_' || isalnum ((unsigned char) *cp))
+       *dest++ = toupper ((unsigned char) (*cp++));
+      *dest++ = '\0';
+    }
   else
     token = *cp++;
   
@@ -543,11 +546,22 @@ struct subcommand
     const char *prefix;                /* Prefix for variable and constant names. */
     specifier *spec;           /* Array of specifiers. */
     
-    /* SBC_STRING only. */
+    /* SBC_STRING and SBC_INT only. */
     char *restriction;         /* Expression restricting string length. */
     char *message;             /* Error message. */
+    int translatable;           /* Error message is translatable */
+  };
+
+typedef struct aux_subcommand aux_subcommand;
+struct aux_subcommand
+  {
+    aux_subcommand *next;      /* Next in the chain. */
+    char *name;                        /* Subcommand name. */
+    char *value;                /* Subcommand value */
   };
 
+static aux_subcommand *aux_subcommands ;
+
 /* Name of the command; i.e., DESCRIPTIVES. */
 char *cmdname;
 
@@ -751,6 +765,7 @@ parse_subcommand (subcommand *sbc)
   sbc->narray = 0;
   sbc->type = SBC_PLAIN;
   sbc->spec = NULL;
+  sbc->translatable = 0;
 
   if (match_token ('['))
     {
@@ -796,7 +811,29 @@ parse_subcommand (subcommand *sbc)
          sbc->type = SBC_VARLIST;
        }
       else if (match_id ("INTEGER"))
+       {
        sbc->type = match_id ("LIST") ? SBC_INT_LIST : SBC_INT;
+        if ( token == T_STRING) 
+         {
+             sbc->restriction = xstrdup (tokstr);
+             lex_get ();
+              if ( match_id("N_") )
+              {
+               skip_token('(');
+               force_string ();
+               lex_get();
+               skip_token(')');
+               sbc->translatable = 1;
+              }
+             else {
+               force_string ();
+               lex_get ();
+              }
+             sbc->message = xstrdup (tokstr);
+         }
+       else
+           sbc->restriction = NULL;
+       }
       else if (match_id ("PINT"))
        sbc->type = SBC_PINT;
       else if (match_id ("DOUBLE"))
@@ -1175,71 +1212,74 @@ dump_specifier_init (const specifier *spec, const subcommand *sbc)
 
 /* Write code to initialize all variables. */
 static void
-dump_vars_init (void)
+dump_vars_init (int persistent)
 {
   /* Loop through all the subcommands. */
   {
     subcommand *sbc;
-
+    
     for (sbc = subcommands; sbc; sbc = sbc->next)
       {
        int f = 0;
        
        dump (0, "p->sbc_%s = 0;", st_lower (sbc->name));
-       switch (sbc->type)
+       if ( ! persistent ) 
          {
-         case SBC_DBL:
-         case SBC_INT_LIST:
-         case SBC_DBL_LIST:
-         case SBC_CUSTOM:
-           /* nothing */
-           break;
+           switch (sbc->type)
+             {
+             case SBC_DBL:
+             case SBC_INT_LIST:
+             case SBC_DBL_LIST:
+             case SBC_CUSTOM:
+               /* nothing */
+               break;
            
-         case SBC_PLAIN:
-         case SBC_ARRAY:
-           {
-             specifier *spec;
+             case SBC_PLAIN:
+             case SBC_ARRAY:
+               {
+                 specifier *spec;
            
-             for (spec = sbc->spec; spec; spec = spec->next)
-               if (spec->s == NULL)
-                 {
-                   if (sbc->type == SBC_PLAIN)
-                     dump (0, "p->%s%s = 0;", sbc->prefix, spec->varname);
-                   else if (f == 0)
+                 for (spec = sbc->spec; spec; spec = spec->next)
+                   if (spec->s == NULL)
                      {
-                       dump (0, "memset (p->a_%s, 0, sizeof p->a_%s);",
-                             st_lower (sbc->name), st_lower (sbc->name));
-                       f = 1;
+                       if (sbc->type == SBC_PLAIN)
+                         dump (0, "p->%s%s = 0;", sbc->prefix, spec->varname);
+                       else if (f == 0)
+                         {
+                           dump (0, "memset (p->a_%s, 0, sizeof p->a_%s);",
+                                 st_lower (sbc->name), st_lower (sbc->name));
+                           f = 1;
+                         }
                      }
-                 }
-               else
-                 dump_specifier_init (spec, sbc);
-           }
-           break;
-
-         case SBC_VARLIST:
-           dump (0, "p->%sn_%s = 0;",
-                 st_lower (sbc->prefix), st_lower (sbc->name));
-           dump (0, "p->%sv_%s = NULL;",
-                 st_lower (sbc->prefix), st_lower (sbc->name));
-           break;
+                   else
+                     dump_specifier_init (spec, sbc);
+               }
+               break;
+
+             case SBC_VARLIST:
+               dump (0, "p->%sn_%s = 0;",
+                     st_lower (sbc->prefix), st_lower (sbc->name));
+               dump (0, "p->%sv_%s = NULL;",
+                     st_lower (sbc->prefix), st_lower (sbc->name));
+               break;
            
-         case SBC_VAR:
-           dump (0, "p->%sv_%s = NULL;",
-                 st_lower (sbc->prefix), st_lower (sbc->name));
-           break;
-
-         case SBC_STRING:
-           dump (0, "p->s_%s = NULL;", st_lower (sbc->name));
-           break;
-
-         case SBC_INT:
-         case SBC_PINT:
-           dump (0, "p->n_%s = NOT_LONG;", st_lower (sbc->name));
-           break;
-
-         default:
-           assert (0);
+             case SBC_VAR:
+               dump (0, "p->%sv_%s = NULL;",
+                     st_lower (sbc->prefix), st_lower (sbc->name));
+               break;
+
+             case SBC_STRING:
+               dump (0, "p->s_%s = NULL;", st_lower (sbc->name));
+               break;
+
+             case SBC_INT:
+             case SBC_PINT:
+               dump (0, "p->n_%s = NOT_LONG;", st_lower (sbc->name));
+               break;
+
+             default:
+               assert (0);
+             }
          }
       }
   }
@@ -1529,6 +1569,7 @@ dump_subcommand (const subcommand *sbc)
          dump (-1, "}");
          outdent ();
        }
+      dump (0, "free(p->s_%s);", st_lower(sbc->name) );
       dump (0, "p->s_%s = xstrdup (ds_value (&tokstr));",
            st_lower (sbc->name));
       dump (0, "lex_get ();");
@@ -1544,10 +1585,27 @@ dump_subcommand (const subcommand *sbc)
     }
   else if (sbc->type == SBC_INT)
     {
+      dump(1, "{");
+      dump(0, "int x;");
       dump (1, "if (!lex_force_int ())");
       dump (0, "goto lossage;");
-      dump (-1, "p->n_%s = lex_integer ();", st_lower (sbc->name));
+      dump (-1, "x = lex_integer ();");
       dump (0, "lex_get();");
+      if (sbc->restriction)
+       {
+         char buf[1024];
+         dump (1, "if (!(%s))", sbc->restriction);
+         dump (1, "{");
+          sprintf(buf,sbc->message,sbc->name);
+         if ( sbc->translatable ) 
+                 dump (0, "msg (SE, gettext(\"%s\"));",buf);
+         else
+                 dump (0, "msg (SE, \"%s\");",buf);
+         dump (0, "goto lossage;");
+         dump (-1, "}");
+      }
+      dump (-1, "p->n_%s = x;", st_lower (sbc->name));
+      dump (-1,"}");
     }
   else if (sbc->type == SBC_PINT)
     {
@@ -1581,7 +1639,7 @@ dump_subcommand (const subcommand *sbc)
 
 /* Write out entire parser. */
 static void
-dump_parser (void)
+dump_parser (int persistent)
 {
   int f;
 
@@ -1592,7 +1650,7 @@ dump_parser (void)
        make_identifier (cmdname));
   dump (1, "{");
 
-  dump_vars_init ();
+  dump_vars_init (persistent);
 
   dump (1, "for (;;)");
   dump (1, "{");
@@ -1691,6 +1749,148 @@ dump_parser (void)
   dump (0, nullstr);
 }
 
+
+/* Write out the code to parse aux subcommand SBC. */
+static void
+dump_aux_subcommand (const subcommand *sbc)
+{
+  if (sbc->type == SBC_PLAIN )
+    {
+      specifier *spec;
+       
+      for (spec = sbc->spec; spec; spec = spec->next)
+       {
+         char buf[80];
+         sprintf(buf,"p->%s%s",st_lower(sbc->prefix),spec->varname);
+
+         dump (0, "msg(MM,\"%s is %%s\",",sbc->name);
+         dump (0, "(%s < 1000)?\"not set\":settings[%s - 1000]", buf, buf);
+      
+         dump (0, ");");
+       }
+    }
+  else if (sbc->type == SBC_STRING)
+    {
+      dump (0, "msg(MM,\"%s is \\\"%%s\\\"\",p->s_%s);", sbc->name,st_lower(sbc->name) );
+    }
+  else if (sbc->type == SBC_INT)
+    {
+      dump (0, "msg(MM,\"%s is %%ld\",p->n_%s);", sbc->name,st_lower(sbc->name) ); 
+    }
+  else if (sbc->type == SBC_CUSTOM)
+    {
+      dump (0, "aux_%scustom_%s(p);",st_lower(prefix),make_identifier(sbc->name));
+    }
+  else
+    assert(0);
+}
+
+
+
+/* Write out auxilliary parser. */
+static void
+dump_aux_parser (void)
+{
+  int f=0;
+  subcommand *sbc;
+  aux_subcommand *asbc;
+
+  /* Write out English strings for all the identifiers in the symbol table. */
+  {
+    int f, k;
+    symbol *sym;
+    char *buf = NULL;
+
+    /* Note the squirmings necessary to make sure that the last string
+       is not followed by a comma (is it necessary to do that ?? ) */
+    for (sym = symtab, f = k = 0; sym; sym = sym->next)
+      if (!sym->unique && !is_keyword (sym->name))
+       {
+         if (!f)
+           {
+             dump (0, "/* Strings for subcommand specifiers. */");
+             dump (1, "static const char *settings[]=");
+             dump (1, "{");
+             f = 1;
+           }
+
+         if (buf == NULL)
+           buf = xmalloc (1024);
+         else
+           dump (0, buf);
+
+         sprintf (buf, "\"%s\",",sym->name);
+       }
+    if (buf)
+      {
+       buf[strlen (buf) - 1] = 0;
+       dump (0, buf);
+       free (buf);
+      }
+    if (f)
+      {
+       dump (-1, "};");
+       dump (-1, nullstr);
+      }
+  }
+
+  
+  indent = 0;
+
+  dump (0, "static int");
+  dump (0, "aux_parse_%s (struct cmd_%s *p)", make_identifier (cmdname),
+       make_identifier (cmdname));
+  dump (1, "{");
+
+  dump (1, "for (;;)");
+  dump (1, "{");
+
+
+  for (sbc = subcommands; sbc; sbc = sbc->next)
+    {
+      dump (1, "%sif (%s)", f ? "else " : "", make_match (sbc->name));
+      f = 1;
+      dump (1, "{");
+
+      dump_aux_subcommand (sbc);
+
+      dump (-1, "}");
+      outdent ();
+    }
+
+  for (asbc = aux_subcommands ; asbc ; asbc = asbc->next)
+    {
+      dump (1, "%sif (%s)", f ? "else " : "", make_match (asbc->name));
+      f = 1;
+      dump (1, "{");
+      dump(0,"aux_%s();",make_identifier(asbc->value));
+      dump (-1, "}");
+      outdent ();
+    }
+  
+  dump (1, "if (!lex_match ('/'))");
+  dump (0, "break;");
+  dump (-2, "}");
+  outdent ();
+  dump (0, nullstr);
+  dump (1, "if (token != '.')");
+  dump (1, "{");
+  dump (0, "lex_error (_(\"expecting end of command\"));");
+  dump (0, "goto lossage;");
+  dump (-1, "}");
+  dump (0, nullstr);
+  dump (-1, "return 1;");
+  dump (0, nullstr);
+  dump (-1, "lossage:");
+  indent ();
+  dump (0, "free_%s (p);", make_identifier (cmdname));
+  dump (0, "return 0;");
+  dump (-1, "} /* aux_parse_%s (struct cmd_%s *p) */", 
+       make_identifier (cmdname), make_identifier (cmdname));
+  dump (0, nullstr);
+}
+
+
 /* Write the output file header. */
 static void
 dump_header (void)
@@ -1714,7 +1914,7 @@ dump_header (void)
 
 /* Write out commands to free variable state. */
 static void
-dump_free (void)
+dump_free (int persistent)
 {
   subcommand *sbc;
   int used;
@@ -1722,22 +1922,32 @@ dump_free (void)
   indent = 0;
 
   used = 0;
-  for (sbc = subcommands; sbc; sbc = sbc->next)
-    if (sbc->type == SBC_STRING)
-      used = 1;
+  if ( ! persistent ) 
+    {
+      for (sbc = subcommands; sbc; sbc = sbc->next)
+       if (sbc->type == SBC_STRING)
+         used = 1;
+    }
 
   dump (0, "static void");
   dump (0, "free_%s (struct cmd_%s *p%s)", make_identifier (cmdname),
        make_identifier (cmdname), used ? "" : " UNUSED");
   dump (1, "{");
 
-  for (sbc = subcommands; sbc; sbc = sbc->next)
-    if (sbc->type == SBC_STRING)
-      dump (0, "free (p->s_%s);", st_lower (sbc->name));
+  if ( ! persistent ) 
+    {
+
+      for (sbc = subcommands; sbc; sbc = sbc->next)
+       if (sbc->type == SBC_STRING)
+         dump (0, "free (p->s_%s);", st_lower (sbc->name));
+    }
 
   dump (-1, "}");
+
 }
 
+
+
 /* Returns the name of a directive found on the current input line, if
    any, or a null pointer if none found. */
 static const char *
@@ -1765,6 +1975,8 @@ recognize_directive (void)
   return directive;
 }
   
+static void aux_parse (void);
+
 int
 main (int argc, char *argv[])
 {
@@ -1828,8 +2040,18 @@ main (int argc, char *argv[])
        dump_declarations ();
       else if (!strcmp (directive, "functions"))
        {
-         dump_parser ();
-         dump_free ();
+         dump_parser (0);
+         dump_free (0); 
+       }
+      else if (!strcmp (directive, "_functions"))
+       {
+         dump_parser (1);
+         dump_free (1); 
+       }
+      else if (!strcmp (directive, "aux_functions"))
+       {
+         aux_parse();
+         dump_aux_parser ();
        }
       else
        error ("unknown directive `%s'", directive);
@@ -1840,3 +2062,33 @@ main (int argc, char *argv[])
   return EXIT_SUCCESS;
 }
 
+/* Parse an entire auxilliary specification. */
+static void
+aux_parse (void)
+{
+  aux_subcommand *sbc;
+  aux_subcommand *prevsbc = 0 ;
+  get_line();
+  lex_get();
+
+  for (;;)
+    {
+       sbc = xmalloc(sizeof(aux_subcommand));
+       sbc->next = prevsbc;
+        sbc->name = xstrdup (tokstr);
+       lex_get();
+       skip_token('=');
+       sbc->value = xstrdup (tokstr);
+       lex_get();
+      if (token == '.')
+       break;
+       skip_token(';');
+       prevsbc = sbc;
+
+    }
+  /* Skip trailing star-slash line. */
+  get_line ();
+  aux_subcommands = sbc;
+}
+
+
index cae3f9e70a3fb9f0f05411bfa3114509d9fd768c..0352b602bb585a1b0e48ea95774aa1b0f36a87e8 100644 (file)
@@ -40,15 +40,40 @@ struct rng
     double next_normal;
   };
 
+
+/* Return a `random' seed by using the real time clock */
+unsigned long
+random_seed(void)
+{
+  time_t t;
+  
+  time(&t);
+
+  return (unsigned long) t;
+}
+
 /* Creates a new random number generator, seeds it based on
    the current time, and returns it. */
 struct rng *
 rng_create (void) 
 {
   struct rng *rng;
-  static time_t t=0;
+  static unsigned long seed=0;
+  unsigned long s;
 
   rng = xmalloc (sizeof *rng);
+
+
+  if ( seed_is_set(&s) ) 
+    {
+      seed = s;
+    }
+  else if ( seed == 0 ) 
+    {
+      seed = random_seed();
+    }
+  assert(seed);
+  /* 
   if (t == 0 || set_seed_used)
   {
     if (set_seed == NOT_LONG) 
@@ -59,7 +84,8 @@ rng_create (void)
   }
   else
     t++;
-  rng_seed (rng, &t, sizeof t);
+  */
+  rng_seed (rng, &seed, sizeof seed);
   rng->next_normal = NOT_DOUBLE;
   return rng;
 }
index 21aef7c96191cdac332a8a3aec0d4ded141de3f5..7ab723773d83a48e485425ec672d014a8ea40bda 100644 (file)
@@ -33,4 +33,8 @@ double rng_get_double_normal (struct rng *);
 
 struct rng *pspp_rng (void);
 
+/* Return a `random' seed by using the real time clock */
+unsigned long random_seed(void);
+
+
 #endif /* random.h */
index bf89fedecd50f0b5e131ed3c2141d814e59fa5f1..9141684c82de5262ce306f34c2a25eeeb0c9008c 100644 (file)
@@ -548,7 +548,7 @@ perform_DO_REPEAT_substitutions (void)
   while (ds_length (&getl_buf) > 0
         && isspace ((unsigned char) ds_end (&getl_buf)[-1]))
     ds_truncate (&getl_buf, ds_length (&getl_buf) - 1);
-  if (ds_length (&getl_buf) > 0 && ds_end (&getl_buf)[-1] == set_endcmd)
+  if (ds_length (&getl_buf) > 0 && ds_end (&getl_buf)[-1] == get_endcmd() )
     {
       dot = 1;
       ds_truncate (&getl_buf, ds_length (&getl_buf) - 1);
@@ -592,7 +592,7 @@ perform_DO_REPEAT_substitutions (void)
       }
     }
   if (dot)
-    ds_putchar (&output, (unsigned char) set_endcmd);
+    ds_putchar (&output, get_endcmd() );
 
   ds_destroy (&getl_buf);
   getl_buf = output;
index 2d90ac7e66604c15b65bdb1a24cadbfa95641c7f..f297bc847d77231e6a4ab666bf97727023639ef3 100644 (file)
--- a/src/set.q
+++ b/src/set.q
 #include "output.h"
 #include "var.h"
 #include "format.h"
+#include "copyleft.h"
+#include "random.h"
+
+#include "signal.h"
+
+#if HAVE_LIBTERMCAP
+#if HAVE_TERMCAP_H
+#include <termcap.h>
+#else /* !HAVE_TERMCAP_H */
+int tgetent (char *, const char *);
+int tgetnum (const char *);
+#endif /* !HAVE_TERMCAP_H */
+#endif /* !HAVE_LIBTERMCAP */
+
+static int set_errors;
+static int set_messages;
+static int set_results;
+
+static double set_blanks=SYSMIS;
+
+static struct fmt_spec set_format={FMT_F,8,2};
+
+static struct set_cust_currency set_cc[5];
+  
+static char *set_journal;
+static int set_journaling;
+
+static int set_listing=1;
 
-double set_blanks;
-int set_compression;
-struct set_cust_currency set_cc[5];
-int set_cpi;
-char *set_cprompt;
-int set_decimal;
-int set_grouping;
-char *set_dprompt;
-int set_echo;
-int set_endcmd;
-int set_errorbreak;
-int set_errors, set_messages, set_results;
-struct fmt_spec set_format;
-int set_headers;
-int set_include;
-char *set_journal;
-int set_journaling;
-int set_lpi;
-int set_messages;
-int set_mexpand;
-int set_miterate;
-int set_mnest;
-int set_more;
-int set_mprint;
-int set_mxerrs;
-int set_mxloops;
-int set_mxwarns;
-int set_nullline;
-int set_printback;
-int set_output = 1;
 #if !USE_INTERNAL_PAGER
-char *set_pager;
+static char *set_pager=0;
 #endif /* !USE_INTERNAL_PAGER */
-int set_printer;
-char *set_prompt;
-char *set_results_file;
-int set_safer;
-int set_scompression;
-int set_screen;
-long set_seed;
-int set_seed_used;
-int set_testing_mode;
-int set_undefined;
-int set_viewlength;
-int set_viewwidth;
-size_t set_max_workspace = 4L * 1024 * 1024;
 
+static unsigned long set_seed;
+static int seed_flag=0;
+
+static int long_view=0;
+int set_testing_mode=0;
+static int set_viewlength;
+static int set_viewwidth;
+
+void aux_show_warranty(void);
+void aux_show_copying(void);
+
+static const char *route_to_string(int routing);
 static void set_routing (int q, int *setting);
+
 static int set_ccx (const char *cc_string, struct set_cust_currency * cc,
                    int cc_name);
-
 /* (specification)
    "SET" (stc_):
      automenu=automenu:on/off;
@@ -140,9 +137,9 @@ static int set_ccx (const char *cc_string, struct set_cust_currency * cc,
      cce=string;
      color=custom;
      compression=compress:on/off;
-     cpi=integer;
+     cpi=integer "x>0" "%s must be greater than 0";
      cprompt=string;
-     decimal=dec:dot/_comma;
+     decimal=dec:dot/comma;
      disk=custom;
      dprompt=string;
      echo=echo:on/off;
@@ -161,16 +158,16 @@ static int set_ccx (const char *cc_string, struct set_cust_currency * cc,
      listing=custom;
      log=custom;
      lowres=lores:auto/on/off;
-     lpi=integer;
+     lpi=integer "x>0" "% must be greater than 0";
      menus=menus:standard/extended;
      messages=messages:on/off/terminal/listing/both/none;
      mexpand=mexp:on/off;
-     miterate=integer;
-     mnest=integer;
+     miterate=integer "x>0" "%s must be greater than 0";
+     mnest=integer "x>0" "%s must be greater than 0";
      more=more:on/off;
      mprint=mprint:on/off;
-     mxerrs=integer;
-     mxloops=integer;
+     mxerrs=integer "x >= 1" "%s must be at least 1";
+     mxloops=integer "x >=1" "%s must be at least 1";
      mxmemory=integer;
      mxwarns=integer;
      nulline=null:on/off;
@@ -191,63 +188,181 @@ static int set_ccx (const char *cc_string, struct set_cust_currency * cc,
      tbfonts=string;
      undefined=undef:warn/nowarn;
      viewlength=custom;
-     viewwidth=integer;
+     viewwidth=custom;
      width=custom;
      workdev=custom;
-     workspace=integer;
+     workspace=integer "x>=1024" "%s must be at least 1 MB";
      xsort=xsort:yes/no.
 */
 
 /* (declarations) */
-/* (functions) */
 
-int internal_cmd_set (void);
+/* (_functions) */
+
+static int
+aux_stc_custom_blanks(struct cmd_set *cmd UNUSED)
+{
+  if ( set_blanks == SYSMIS ) 
+    msg(MM, "SYSMIS");
+  else
+    msg(MM, "%g", set_blanks);
+  return 0;
+}
+
+
+static int
+aux_stc_custom_color(struct cmd_set *cmd UNUSED)
+{
+  msg (MW, _("%s is obsolete."),"COLOR");
+  return 0;
+}
+
+static int
+aux_stc_custom_listing(struct cmd_set *cmd UNUSED)
+{
+  if ( set_listing ) 
+    msg(MM, _("LISTING is ON"));
+  else
+    msg(MM, _("LISTING is OFF"));
+
+  return 0;
+}
+
+static int
+aux_stc_custom_disk(struct cmd_set *cmd UNUSED)
+{
+  return aux_stc_custom_listing(cmd);
+}
+
+static int
+aux_stc_custom_format(struct cmd_set *cmd UNUSED)
+{
+  msg(MM, fmt_to_string(&set_format));
+  return 0;
+}
+
+
+
+static int
+aux_stc_custom_journal(struct cmd_set *cmd UNUSED)
+{
+  if (set_journaling) 
+    msg(MM, set_journal);
+  else
+    msg(MM, _("Journalling is off") );
+       
+  return 0;
+}
+
+static int
+aux_stc_custom_length(struct cmd_set *cmd UNUSED)
+{
+  msg(MM, "%d", set_viewlength);
+  return 0;
+}
+
+static int
+aux_stc_custom_log(struct cmd_set *cmd )
+{
+  return aux_stc_custom_journal (cmd);
+}
+
+static int
+aux_stc_custom_pager(struct cmd_set *cmd UNUSED)
+{
+#if !USE_INTERNAL_PAGER 
+  if ( set_pager ) 
+    msg(MM, set_pager);
+  else
+    msg(MM, "No pager");
+#else /* USE_INTERNAL_PAGER */
+  msg (MM, "Internal pager.");
+#endif /* USE_INTERNAL_PAGER */
+
+  return 0;
+}
+
+static int
+aux_stc_custom_rcolor(struct cmd_set *cmd UNUSED)
+{
+  msg (SW, _("%s is obsolete."),"RCOLOR");
+  return 0;
+}
+
+static int
+aux_stc_custom_results(struct cmd_set *cmd UNUSED)
+{
+  
+  msg(MM, route_to_string(set_results) );
+
+  return 0;
+}
+
+static int
+aux_stc_custom_seed(struct cmd_set *cmd UNUSED)
+{
+  msg(MM, "%ld",set_seed);
+  return 0;
+}
+
+static int
+aux_stc_custom_viewlength(struct cmd_set *cmd UNUSED)
+{
+  msg(MM, "%d", set_viewlength);
+  return 0;
+}
+
+static int
+aux_stc_custom_viewwidth(struct cmd_set *cmd UNUSED)
+{
+  msg(MM, "%d", set_viewwidth);
+  return 0;
+}
+
+static int
+aux_stc_custom_width(struct cmd_set *cmd UNUSED)
+{
+  msg(MM, "%d", set_viewwidth);
+  return 0;
+}
+
+static int
+aux_stc_custom_workdev(struct cmd_set *cmd UNUSED)
+{
+  msg (SW, _("%s is obsolete."),"WORKDEV");
+  return 0;
+}
+
+
+
+/* (aux_functions) 
+     warranty=show_warranty;
+     copying=show_copying.
+*/
+
+
+static struct cmd_set cmd;
+
+int
+cmd_show (void)
+{
+  lex_match_id ("SHOW");
+
+  if (!aux_parse_set (&cmd))
+    return CMD_FAILURE;
+
+  return CMD_SUCCESS;
+}
 
 int
 cmd_set (void)
 {
-  struct cmd_set cmd;
 
   lex_match_id ("SET");
 
   if (!parse_set (&cmd))
     return CMD_FAILURE;
 
-  if (cmd.sbc_block)
-    msg (SW, _("%s is obsolete."),"BLOCK");
-
-  if (cmd.sbc_boxstring)
-    msg (SW, _("%s is obsolete."),"BOXSTRING");
-
-  if (cmd.compress != -1)
-    {
-      msg (MW, _("Active file compression is not yet implemented "
-                "(and probably won't be)."));
-      set_compression = cmd.compress == STC_OFF ? 0 : 1;
-    }
-  if (cmd.scompress != -1)
-    set_scompression = cmd.scompress == STC_OFF ? 0 : 1;
-  if (cmd.n_cpi != NOT_LONG)
-    {
-      if (cmd.n_cpi <= 0)
-       msg (SE, _("CPI must be greater than 0."));
-      else
-       set_cpi = cmd.n_cpi;
-    }
-  if (cmd.sbc_histogram)
-    msg (MW, _("%s is obsolete."),"HISTOGRAM");
-  if (cmd.n_lpi != NOT_LONG)
-    {
-      if (cmd.n_lpi <= 0)
-       msg (SE, _("LPI must be greater than 0."));
-      else
-       set_lpi = cmd.n_lpi;
-    }
-  
-  /* Windows compatible syntax. */
-  if (cmd.sbc_case)
-    msg (SW, _("CASE is not implemented and probably won't be.  If you care, "
-              "complain about it."));
   if (cmd.sbc_cca)
     set_ccx (cmd.s_cca, &set_cc[0], 'A');
   if (cmd.sbc_ccb)
@@ -258,135 +373,60 @@ cmd_set (void)
     set_ccx (cmd.s_ccd, &set_cc[3], 'D');
   if (cmd.sbc_cce)
     set_ccx (cmd.s_cce, &set_cc[4], 'E');
-  if (cmd.dec != -1)
-    {
-      set_decimal = cmd.dec == STC_DOT ? '.' : ',';
-      set_grouping = cmd.dec == STC_DOT ? ',' : '.';
-    }
-  if (cmd.errors != -1)
+
+  if (cmd.sbc_errors)
     set_routing (cmd.errors, &set_errors);
-  if (cmd.headers != -1)
-    set_headers = cmd.headers == STC_NO ? 0 : (cmd.headers == STC_YES ? 1 : 2);
-  if (cmd.messages != -1)
+  if (cmd.sbc_messages)
     set_routing (cmd.messages, &set_messages);
-  if (cmd.mexp != -1)
-    set_mexpand = cmd.mexp == STC_OFF ? 0 : 1;
-  if (cmd.n_miterate != NOT_LONG)
-    {
-      if (cmd.n_miterate > 0)
-       set_miterate = cmd.n_miterate;
-      else
-       msg (SE, _("Value for MITERATE (%ld) must be greater than 0."),
-            cmd.n_miterate);
-    }
-  if (cmd.n_mnest != NOT_LONG)
-    {
-      if (cmd.n_mnest > 0)
-       set_mnest = cmd.n_mnest;
-      else
-       msg (SE, _("Value for MNEST (%ld) must be greater than 0."),
-            cmd.n_mnest);
-    }
-  if (cmd.mprint != -1)
-    set_mprint = cmd.mprint == STC_OFF ? 0 : 1;
-  if (cmd.n_mxerrs != NOT_LONG)
-    {
-      if (set_mxerrs < 1)
-       msg (SE, _("MXERRS must be at least 1."));
-      else
-       set_mxerrs = cmd.n_mxerrs;
-    }
-  if (cmd.n_mxloops != NOT_LONG)
-    {
-      if (set_mxloops < 1)
-       msg (SE, _("MXLOOPS must be at least 1."));
-      else
-       set_mxloops = cmd.n_mxloops;
-    }
-  if (cmd.n_mxmemory != NOT_LONG)
-    msg (SE, _("%s is obsolete."),"MXMEMORY");
-  if (cmd.n_mxwarns != NOT_LONG)
-    set_mxwarns = cmd.n_mxwarns;
-  if (cmd.prtbck != -1)
-    set_printback = cmd.prtbck == STC_OFF ? 0 : 1;
-  if (cmd.s_scripttab)
-    msg (SE, _("%s is obsolete."),"SCRIPTTAB");
-  if (cmd.s_tbfonts)
-    msg (SW, _("%s is not yet implemented."),"TBFONTS");
-  if (cmd.s_tb1)
-    msg (SW, _("%s is not yet implemented."),"TB1");
-  if (cmd.undef != -1)
-    set_undefined = cmd.undef == STC_NOWARN ? 0 : 1;
-  if (cmd.n_workspace != NOT_LONG) 
-    {
-      if (cmd.n_workspace < 1024)
-        msg (SE, _("Workspace limit must be at least 1 MB."));
-      else
-        {
-          if (cmd.n_workspace > (size_t) -1 / 1024)
-            set_max_workspace = -1;
-          else
-            set_max_workspace = 1024 * cmd.n_workspace; 
-        }
-    }
 
   /* PC+ compatible syntax. */
-  if (cmd.scrn != -1)
+  if (cmd.sbc_screen)
     outp_enable_device (cmd.scrn == STC_OFF ? 0 : 1, OUTP_DEV_SCREEN);
+  if (cmd.sbc_printer)
+    outp_enable_device (cmd.prtr == STC_OFF ? 0 : 1, OUTP_DEV_PRINTER);
 
-  if (cmd.automenu != -1)
+  if (cmd.sbc_automenu )
     msg (SW, _("%s is obsolete."),"AUTOMENU");
-  if (cmd.beep != -1)
+  if (cmd.sbc_beep )
     msg (SW, _("%s is obsolete."),"BEEP");
-
-  if (cmd.s_cprompt)
-    {
-      free (set_cprompt);
-      set_cprompt = cmd.s_cprompt;
-      cmd.s_cprompt = NULL;
-    }
-  if (cmd.s_dprompt)
-    {
-      free (set_dprompt);
-      set_dprompt = cmd.s_dprompt;
-      cmd.s_dprompt = NULL;
-    }
-  if (cmd.echo != -1)
-    set_echo = cmd.echo == STC_OFF ? 0 : 1;
-  if (cmd.s_endcmd)
-    set_endcmd = cmd.s_endcmd[0];
-  if (cmd.eject != -1)
+  if (cmd.sbc_block)
+    msg (SW, _("%s is obsolete."),"BLOCK");
+  if (cmd.sbc_boxstring)
+    msg (SW, _("%s is obsolete."),"BOXSTRING");
+  if (cmd.sbc_eject )
     msg (SW, _("%s is obsolete."),"EJECT");
-  if (cmd.errbrk != -1)
-    set_errorbreak = cmd.errbrk == STC_OFF ? 0 : 1;
-  if (cmd.helpwin != -1)
+  if (cmd.sbc_helpwindows )
     msg (SW, _("%s is obsolete."),"HELPWINDOWS");
-  if (cmd.inc != -1)
-    set_include = cmd.inc == STC_OFF ? 0 : 1;
-  if (cmd.menus != -1)
+  if (cmd.sbc_histogram)
+    msg (MW, _("%s is obsolete."),"HISTOGRAM");
+  if (cmd.sbc_menus )
     msg (MW, _("%s is obsolete."),"MENUS");
-  if (cmd.null != -1)
-    set_nullline = cmd.null == STC_OFF ? 0 : 1;
-  if (cmd.more != -1)
-    set_more = cmd.more == STC_OFF ? 0 : 1;
-  if (cmd.prtr != -1)
-    outp_enable_device (cmd.prtr == STC_OFF ? 0 : 1, OUTP_DEV_PRINTER);
-  if (cmd.s_prompt)
-    {
-      free (set_prompt);
-      set_prompt = cmd.s_prompt;
-      cmd.s_prompt = NULL;
-    }
-  if (cmd.ptrans != -1)
+  if (cmd.sbc_ptranslate )
     msg (SW, _("%s is obsolete."),"PTRANSLATE");
-  if (cmd.runrev != -1)
+  if (cmd.sbc_runreview )
     msg (SW, _("%s is obsolete."),"RUNREVIEW");
-  if (cmd.safe == STC_ON)
-    set_safer = 1;
-  if (cmd.xsort != -1)
+  if (cmd.sbc_xsort )
     msg (SW, _("%s is obsolete."),"XSORT");
+  if (cmd.sbc_mxmemory )
+    msg (SE, _("%s is obsolete."),"MXMEMORY");
+  if (cmd.sbc_scripttab)
+    msg (SE, _("%s is obsolete."),"SCRIPTTAB");
 
-  free_set (&cmd);
+  if (cmd.sbc_tbfonts)
+    msg (SW, _("%s is not yet implemented."),"TBFONTS");
+  if (cmd.sbc_tb1 && cmd.s_tb1)
+    msg (SW, _("%s is not yet implemented."),"TB1");
+
+  /* Windows compatible syntax. */
+  if (cmd.sbc_case)
+    msg (SW, _("CASE is not implemented and probably won't be.  "
+       "If you care, complain about it."));
+
+  if (cmd.sbc_compression)
+    {
+      msg (MW, _("Active file compression is not yet implemented "
+                "(and probably won't be)."));
+    }
 
   return CMD_SUCCESS;
 }
@@ -463,6 +503,50 @@ set_ccx (const char *cc_string, struct set_cust_currency * cc, int cc_name)
   return 1;
 }
 
+
+const char *
+route_to_string(int routing)
+{
+  static char s[255];
+  
+  s[0]='\0';
+
+  if ( routing == 0 )
+    {
+      strcpy(s, _("None"));
+      return s;
+    }
+
+  if (routing & SET_ROUTE_DISABLE ) 
+    {
+    strcpy(s, _("Disabled") );
+    return s;
+    }
+
+  if (routing & SET_ROUTE_SCREEN)
+    strcat(s, _("Screen") );
+  
+  if (routing & SET_ROUTE_LISTING)
+    {
+      if(s[0] != '\0') 
+       strcat(s,", ");
+       
+      strcat(s, _("Listing") );
+    }
+
+  if (routing & SET_ROUTE_OTHER)
+    {
+      if(s[0] != '\0') 
+       strcat(s,", ");
+      strcat(s, _("Other") );
+    }
+    
+  return s;
+  
+    
+}
+
 /* Sets *SETTING, which is a combination of SET_ROUTE_* bits that
    indicates what to do with some sort of output, to the value
    indicated by Q, which is a value provided by the input parser. */
@@ -471,10 +555,10 @@ set_routing (int q, int *setting)
 {
   switch (q)
     {
-    case STC_ON:
+    case STC_OFF:
       *setting |= SET_ROUTE_DISABLE;
       break;
-    case STC_OFF:
+    case STC_ON:
       *setting &= ~SET_ROUTE_DISABLE;
       break;
     case STC_TERMINAL:
@@ -570,7 +654,9 @@ stc_custom_length (struct cmd_set *cmd UNUSED)
       lex_get ();
     }
 
-  /* FIXME: Set page length. */
+  if ( page_length != -1 ) 
+    set_viewlength = page_length;
+
   return 1;
 }
 
@@ -620,7 +706,7 @@ stc_custom_seed (struct cmd_set *cmd UNUSED)
 {
   lex_match ('=');
   if (lex_match_id ("RANDOM"))
-    set_seed = NOT_LONG;
+    set_seed = random_seed();
   else
     {
       if (!lex_force_num ())
@@ -628,7 +714,8 @@ stc_custom_seed (struct cmd_set *cmd UNUSED)
       set_seed = tokval;
       lex_get ();
     }
-  set_seed_used=1;
+  seed_flag = 1;
+
   return 1;
 }
 
@@ -655,7 +742,7 @@ stc_custom_width (struct cmd_set *cmd UNUSED)
       lex_get ();
     }
 
-  /* FIXME: Set page width. */
+  set_viewwidth = page_width;
   return 1;
 }
 
@@ -755,29 +842,29 @@ stc_custom_listing (struct cmd_set *cmd UNUSED)
 {
   lex_match ('=');
   if (lex_match_id ("ON") || lex_match_id ("YES"))
-    outp_enable_device (1, OUTP_DEV_LISTING);
+    set_listing = 1;
   else if (lex_match_id ("OFF") || lex_match_id ("NO"))
-    outp_enable_device (0, OUTP_DEV_LISTING);
+    set_listing = 0;
   else
     {
       /* FIXME */
+      return 0;
     }
+  outp_enable_device (set_listing, OUTP_DEV_LISTING);
 
-  return 0;
+  return 1;
 }
 
 static int
 stc_custom_disk (struct cmd_set *cmd UNUSED)
 {
-  stc_custom_listing (cmd);
-  return 0;
+  return stc_custom_listing (cmd);
 }
 
 static int
 stc_custom_log (struct cmd_set *cmd UNUSED)
 { 
-  stc_custom_journal (cmd);
-  return 0;
+  return stc_custom_journal (cmd);
 }
 
 static int
@@ -829,6 +916,20 @@ stc_custom_rcolor (struct cmd_set *cmd UNUSED)
   return 1;
 }
 
+static int
+stc_custom_viewwidth (struct cmd_set *cmd UNUSED)
+{
+  lex_match ('=');
+
+  if ( !lex_force_int() ) 
+    return 0;
+
+  set_viewwidth = lex_integer();
+  lex_get();
+  
+  return 1;
+}
+
 static int
 stc_custom_viewlength (struct cmd_set *cmd UNUSED)
 {
@@ -877,6 +978,353 @@ stc_custom_workdev (struct cmd_set *cmd UNUSED)
   return 0;
 }
 
+
+
+static void 
+set_viewport(void)
+{
+#if HAVE_LIBTERMCAP
+  static char term_buffer[16384];
+#endif
+
+  /* Workable defaults before we determine the real terminal size. */
+  set_viewwidth = 79;
+  set_viewlength = 24;
+
+
+
+#if __DJGPP__ || __BORLANDC__
+  {
+    struct text_info ti;
+
+    gettextinfo (&ti);
+    set_viewlength = max (ti.screenheight, 25);
+    set_viewwidth = max (ti.screenwidth, 79);
+  }
+#elif HAVE_LIBTERMCAP
+  {
+    char *termtype;
+    int success;
+
+    /* This code stolen from termcap.info, though modified. */
+    termtype = getenv ("TERM");
+    if (!termtype)
+      msg (FE, _("Specify a terminal type with `setenv TERM <yourtype>'."));
+
+    success = tgetent (term_buffer, termtype);
+    if (success <= 0)
+      {
+       if (success < 0)
+         msg (IE, _("Could not access the termcap data base."));
+       else
+         msg (IE, _("Terminal type `%s' is not defined."), termtype);
+      }
+    else
+      {
+       set_viewlength = tgetnum ("li");
+       set_viewwidth = tgetnum ("co") - 1;
+      }
+  }
+#else
+  {
+  char *s;
+
+  /* Try the environment variables */
+  s = getenv("COLUMNS");
+  if ( s )  set_viewwidth = atoi(s);
+
+  s = getenv("LINES");
+  if ( s )  set_viewlength = atoi(s);
+  }
+#endif /* !HAVE_LIBTERMCAP */
+
+}
+
+/* Public functions */
+
+void
+init_settings(void)
+{
+  cmd.s_dprompt = xstrdup (_("data> "));
+  cmd.s_cprompt = xstrdup ("    > ");  
+  cmd.s_prompt = xstrdup ("PSPP> ");
+  cmd.s_endcmd = xstrdup (".");
+
+  assert(cmd.safe == 0 );
+  cmd.safe = STC_OFF;
+
+  cmd.dec = STC_DOT;
+  cmd.n_cpi = 6;
+  cmd.n_lpi = 10;
+  cmd.echo = STC_OFF;
+  cmd.more = STC_ON;
+  cmd.headers = STC_YES;
+  cmd.errbrk = STC_OFF;
+
+  cmd.scompress = STC_OFF;
+  cmd.undef = STC_WARN;
+  cmd.mprint = STC_ON ;
+  cmd.prtbck = STC_ON ;
+  cmd.null = STC_ON ;
+  cmd.inc = STC_ON ;
+
+  set_journal = xstrdup ("pspp.jnl");
+  set_journaling = 1;
+
+  cmd.n_mxwarns = 100;
+  cmd.n_mxerrs = 100;
+  cmd.n_mxloops = 1;
+  cmd.n_workspace = 4L * 1024 * 1024;
+
+
+#if !USE_INTERNAL_PAGER
+  {
+    char *pager;
+
+    pager = getenv ("STAT_PAGER");
+    if (!pager)  set_pager = getenv ("PAGER");
+
+    if (pager)  
+      set_pager = xstrdup (pager);
+#if DEFAULT_PAGER
+    else
+      set_pager = xstrdup (DEFAULT_PAGER);
+#endif /* DEFAULT_PAGER */
+  }
+#endif /* !USE_INTERNAL_PAGER */
+
+
+  {
+    int i;
+    
+    for (i = 0; i < 5; i++)
+      {
+       struct set_cust_currency *cc = &set_cc[i];
+       strcpy (cc->buf, "-");
+       cc->neg_prefix = cc->buf;
+       cc->prefix = &cc->buf[1];
+       cc->suffix = &cc->buf[1];
+       cc->neg_suffix = &cc->buf[1];
+       cc->decimal = '.';
+       cc->grouping = ',';
+      }
+  }
+
+  if ( ! long_view )
+    {
+      set_viewport();
+      signal (SIGWINCH,set_viewport);
+    }
+
+}
+
+void
+force_long_view(void)
+{
+  long_view = 1;
+  set_viewwidth=9999;
+}
+
+int 
+safer_mode(void)
+{
+  return !(cmd.safe != STC_ON) ;
+}
+
+
+/* Set safer mode */
+void
+make_safe(void)
+{
+  cmd.safe = STC_ON;
+}
+
+
+char 
+get_decimal(void)
+{
+  return (cmd.dec == STC_DOT ? '.' : ',');
+}
+
+
+char
+get_grouping(void)
+{
+  return (cmd.dec == STC_DOT ? ',' : '.');
+}
+
+char * 
+get_prompt(void)
+{
+  return cmd.s_prompt;
+}
+
+char * 
+get_dprompt(void)
+{
+  return cmd.s_dprompt;
+}
+
+char * 
+get_cprompt(void)
+{
+  return cmd.s_cprompt;
+}
+
+
+int
+get_echo(void)
+{
+    return (cmd.echo != STC_OFF );
+}
+
+
+int 
+get_errorbreak(void)
+{
+  return (cmd.errbrk != STC_OFF);
+}
+
+
+int 
+get_scompression(void)
+{
+  return (cmd.scompress != STC_OFF );
+}
+
+int
+get_undefined(void)
+{
+  return (cmd.undef != STC_NOWARN);
+}
+
+int
+get_mxwarns(void)
+{  
+  return cmd.n_mxwarns;
+}
+
+int
+get_mxerrs(void)
+{
+  return cmd.n_mxerrs;
+}
+
+int
+get_mprint(void)
+{
+  return ( cmd.mprint != STC_OFF );
+}
+
+int
+get_printback(void)
+{
+  return (cmd.prtbck != STC_OFF );
+}
+
+int
+get_mxloops(void)
+{
+  return cmd.n_mxloops;
+}
+
+int
+get_nullline(void)
+{
+  return (cmd.null != STC_OFF );
+}
+
+int
+get_include(void)
+{
+ return (cmd.inc != STC_OFF );
+}
+
+unsigned char
+get_endcmd(void)
+{
+  return cmd.s_endcmd[0];
+}
+
+
+size_t
+get_max_workspace(void)
+{
+  return cmd.n_workspace;
+}
+
+double
+get_blanks(void)
+{
+  return set_blanks;
+}
+
+struct fmt_spec 
+get_format(void)
+{ 
+  return set_format;
+}
+
+/* CCA through CCE. */
+const struct set_cust_currency *
+get_cc(int i)
+{
+  return &set_cc[i];
+}
+
+void
+aux_show_warranty(void)
+{
+  msg(MM,lack_of_warranty);
+}
+
+void
+aux_show_copying(void)
+{
+  msg(MM,copyleft);
+}
+
+
+int
+get_viewlength(void)
+{
+  return set_viewlength;
+}
+
+int
+get_viewwidth(void)
+{
+  return set_viewwidth;
+}
+
+const char *
+get_pager(void)
+{
+  return set_pager;
+}
+
+/* Return 1 if the seed has been set since the last time this function
+   was called.
+   Fill the value pointed to by seed with the seed .
+*/
+int
+seed_is_set(unsigned long *seed)
+{
+  int result = 0;
+
+  *seed = set_seed ;
+
+  if ( seed_flag ) 
+    result = 1;
+  
+  seed_flag = 0;
+
+  return result;
+    
+}
+
+
 /*
    Local Variables:
    mode: c
index 30256ae3ed4965cfb27153f9f7ffe51a66658df8..5ca015263531f8685b48ab93be4fc0a6fb4201ac 100644 (file)
 #include <stddef.h>
 #include <float.h>
 
-/* The value that blank numeric fields are set to when read in;
-   normally SYSMIS. */
-extern double set_blanks;
 
 /* Describes one custom currency specification. */
 struct set_cust_currency
@@ -117,35 +114,8 @@ struct set_cust_currency
     int grouping;              /* Grouping character. */
   };
 
-/* CCA through CCE. */
-extern struct set_cust_currency set_cc[5];
-
-/* Whether the active file should be compressed. */
-extern int set_compression;
-
-/* Characters per inch (horizontal). */
-extern int set_cpi;
 
-/* Continuation prompt. */
-extern char *set_cprompt;
-
-/* The character used for a decimal point: ',' or '.'.  Only respected
-   for data input and output. */
-extern int set_decimal;
 
-/* The character used for grouping in numbers: '.' or ','; the
-   opposite of set_decimal.  Only used in COMMA data input and
-   output. */
-extern int set_grouping;
-
-/* Prompt used for lines between BEGIN DATA and END DATA. */
-extern char *set_dprompt;
-
-/* Whether we echo commands to the listing file/printer; 0=no, 1=yes. */
-extern int set_echo;
-
-/* The character used to terminate commands. */
-extern int set_endcmd;
 
 /* Types of routing. */
 enum
@@ -156,103 +126,112 @@ enum
     SET_ROUTE_DISABLE = 010    /* Disable output--overrides all other bits. */
   };
 
-/* Routing for errors, messages, and procedure results. */
-extern int set_errors, set_messages, set_results;
 
-/* Whether an error stops execution; 0=no, 1=yes. */
-extern int set_errorbreak;
+/* Set view width to a very long value, and prevent it from 
+   ever changing */
+void force_long_view(void);
 
-/* Default format for variables created by transformations and by DATA
-   LIST {FREE,LIST}. */
-extern struct fmt_spec set_format;
 
-/* I don't know what this setting means; 0=no, 1=yes, 2=blank. */
-extern int set_headers;
+/* Requested "view length" in lines. */
+int get_viewlength(void);
 
-/* If set_echo is on, whether commands from include files are echoed;
- * 0=no, 1=yes. */
-extern int set_include;
+/* Screen width. */
+int get_viewwidth(void);
 
-/* Journal file's name. */
-extern char *set_journal;
+void init_settings(void) ;
 
-/* Whether we're journaling. */
-extern int set_journaling;
+/* Whether pspp can erase and overwrite files */
+int safer_mode(void);
 
-/* Lines per inch (vertical). */
-extern int set_lpi;
+/* Put into safer mode */
+void make_safe(void);
 
-/* 0=macro expansion is disabled, 1=macro expansion is enabled. */
-extern int set_mexpand;
+/* The character used for a decimal point: ',' or '.'.  Only respected
+   for data input and output. */
+char get_decimal(void);
 
-/* Maximum number of iterations in a macro loop. */
-extern int set_miterate;
+/* The character used for grouping in numbers: '.' or ','; the
+   opposite of set_decimal.  Only used in COMMA data input and
+   output. */
 
-/* Maximum nesting level for macros. */
-extern int set_mnest;
+char get_grouping(void);
 
-/* Whether we pause after each screen of output; 0=no, 1=yes. */
-extern int set_more;
+char *get_prompt(void);
 
-/* Independent of set_printback, controls whether the commands
-   generated by macro invocations are displayed. */
-extern int set_mprint;
+/* Prompt used for lines between BEGIN DATA and END DATA. */
+char *get_dprompt(void);
 
-/* Maximum number of errors. */
-extern int set_mxerrs;
+/* Continuation prompt. */
+char *get_cprompt(void);
 
-/* Implied limit of unbounded loop. */
-extern int set_mxloops;
 
-/* Maximum number of warnings + errors. */
-extern int set_mxwarns;
+/* Whether we echo commands to the listing file/printer;*/
+int get_echo(void);
 
-/* Whether a blank line is a command terminator; 0=no, 1=yes. */
-extern int set_nullline;
+/* If echo is on, whether commands from include files are echoed */
+int get_include(void);
 
-/* Whether commands are written to the display; 0=off, 1=on. */
-extern int set_printback;
+/* Whether an error stops execution; */
+int  get_errorbreak(void);
 
-#if !USE_INTERNAL_PAGER
-/* Name of the pager program. */
-extern char *set_pager;
-#endif /* !USE_INTERNAL_PAGER */
-
-/* The command prompt. */
-extern char *set_prompt;
+/* Whether save files should be compressed by default. */
+int get_scompression(void);
 
-/* Name of the results file. */
-extern char *set_results_file;
+/* Whether to warn on undefined values in numeric data. */
+int get_undefined(void);
 
-/* Whether to allow certain unsafe operations.  Cannot be unset after
-   it is set. */
-extern int set_safer;
+/* Maximum number of warnings + errors. */
+int get_mxwarns(void);
 
-/* Whether save files should be compressed by default. */
-extern int set_scompression;
+/* Maximum number of errors. */
+int get_mxerrs(void);
 
-/* The random number seed; NOT_LONG if we want a "random" random
-   number seed.  */
-extern long set_seed;
+/* 0=macro expansion is disabled, 1=macro expansion is enabled. */
+int get_mexpand(void);
 
-/* 1=The user has modified or made use of the random number seed. */
-extern int set_seed_used;
+/* Whether commands are written to the display */
+int get_printback(void);
 
-/* 1=Turn on some heuristics that make testing PSPP for correct
-   workings a little easier. */
-extern int set_testing_mode;
+/* Independent of get_printback, controls whether the commands
+   generated by macro invocations are displayed. */
+int get_mprint(void);
 
-/* Whether to warn on undefined values in numeric data. */
-extern int set_undefined;
+/* Implied limit of unbounded loop. */
+int get_mxloops(void);
 
-/* Requested "view length" in lines. */
-extern int set_viewlength;
+/* Whether a blank line is a command terminator */
+int get_nullline(void);
 
-/* Screen width. */
-extern int set_viewwidth;
+/* The character used to terminate commands. */
+unsigned char get_endcmd(void);
 
 /* Approximate maximum amount of memory to use for cases, in
    bytes. */
-extern size_t set_max_workspace;
+size_t get_max_workspace(void);
+
+/* The value that blank numeric fields are set to when read in;
+   normally SYSMIS. */
+double get_blanks(void);
+
+
+/* Default format for variables created by transformations and by DATA
+   LIST {FREE,LIST}. */
+struct fmt_spec get_format(void);
+
+/* CCA through CCE. */
+const struct set_cust_currency *get_cc(int i);
+
+#if !USE_INTERNAL_PAGER
+/* Name of the pager program. */
+const char *get_pager(void);
+#endif /* !USE_INTERNAL_PAGER */
+
+
+/* Return 1 if the seed has been set since the last time this function
+   was called.
+   Fill the value pointed to by seed with the seed .
+*/
+int seed_is_set(unsigned long *seed);
+
 
 #endif /* !settings_h */
index 5fd2eaec9e991129229f22e5a9deac913a0521a9..ac70da11814c3a92b659c40a86e918def89e65f5 100644 (file)
@@ -231,7 +231,7 @@ do_internal_sort (struct sort_cases_pgm *scp, int separate)
       if (case_cnt <= 0)
         return isrt;
 
-      if (case_cnt > set_max_workspace / sizeof *case_array)
+      if (case_cnt > get_max_workspace() / sizeof *case_array)
         goto error;
 
       case_list = storage_source_get_cases (vfm_source);
@@ -780,7 +780,7 @@ allocate_cases (struct initial_run_state *irs)
                       + sizeof *irs->free_list
                       + irs->xsrt->scp->case_size
                       + 4 * sizeof (void *));
-  max_cases = set_max_workspace / approx_case_cost;
+  max_cases = get_max_workspace() / approx_case_cost;
   irs->records = malloc (sizeof *irs->records * max_cases);
   for (i = 0; i < max_cases; i++)
     {
@@ -806,7 +806,7 @@ allocate_cases (struct initial_run_state *irs)
       msg (SE, _("Out of memory.  Could not allocate room for minimum of %d "
                 "cases of %d bytes each.  (PSPP workspace is currently "
                 "restricted to a maximum of %d KB.)"),
-          MIN_BUFFER_TOTAL_SIZE_RECS, approx_case_cost, set_max_workspace / 1024);
+          MIN_BUFFER_TOTAL_SIZE_RECS, approx_case_cost, get_max_workspace() / 1024);
       return 0;
     }
   return 1;
@@ -1019,7 +1019,7 @@ merge (struct external_sort *xsrt)
   /* Allocate as many cases as possible into cases. */
   approx_case_cost = (sizeof *mrg.cases
                       + xsrt->scp->case_size + 4 * sizeof (void *));
-  mrg.case_cnt = set_max_workspace / approx_case_cost;
+  mrg.case_cnt = get_max_workspace() / approx_case_cost;
   mrg.cases = malloc (sizeof *mrg.cases * mrg.case_cnt);
   if (mrg.cases == NULL)
     goto done;
@@ -1037,7 +1037,7 @@ merge (struct external_sort *xsrt)
       msg (SE, _("Out of memory.  Could not allocate room for minimum of %d "
                 "cases of %d bytes each.  (PSPP workspace is currently "
                 "restricted to a maximum of %d KB.)"),
-          MIN_BUFFER_TOTAL_SIZE_RECS, approx_case_cost, set_max_workspace / 1024);
+          MIN_BUFFER_TOTAL_SIZE_RECS, approx_case_cost, get_max_workspace() / 1024);
       return 0;
     }
 
index 8912f3e58b6a4ec5921e58a952fd316dcb137560..98a8e52e3caf543b1afe47313ca59e9fcb98a732 100644 (file)
--- a/src/str.c
+++ b/src/str.c
@@ -350,40 +350,50 @@ ds_concat_buffer (struct string *st, const char *buf, size_t len)
   st->length += len;
 }
 
+void ds_vprintf (struct string *st, const char *format, va_list args);
+
+
 /* Formats FORMAT as a printf string and appends the result to ST. */
 void
 ds_printf (struct string *st, const char *format, ...)
+{
+  va_list args;
+
+  va_start (args, format);
+  ds_vprintf(st,format,args);
+  va_end (args);
+
+}
+
+/* Formats FORMAT as a printf string and appends the result to ST. */
+void
+ds_vprintf (struct string *st, const char *format, va_list args)
 {
   /* Fscking glibc silently changed behavior between 2.0 and 2.1.
      Fsck fsck fsck.  Before, it returned -1 on buffer overflow.  Now,
      it returns the number of characters (not bytes) that would have
      been written. */
-  va_list args;
 
   int avail, needed;
 
-  va_start (args, format);
   avail = st->size - st->length + 1;
   needed = vsnprintf (st->string + st->length, avail, format, args);
-  va_end (args);
+
 
   if (needed >= avail)
     {
       ds_extend (st, st->length + needed);
       
-      va_start (args, format);
       vsprintf (st->string + st->length, format, args);
-      va_end (args);
     }
   else
     while (needed == -1)
       {
        ds_extend (st, (st->size + 1) * 2);
        avail = st->size - st->length + 1;
-       
-       va_start (args, format);
+
        needed = vsnprintf (st->string + st->length, avail, format, args);
-       va_end (args);
+
       }
 
   st->length += needed;
index 719b503b8e66d8fc69fc665a94aed4cdcf11ca6e..1951507cc92047dafe8acf4bfd0d0111005204a7 100644 (file)
--- a/src/str.h
+++ b/src/str.h
@@ -180,6 +180,7 @@ int ds_get_config_line (FILE *, struct string *, struct file_locator *);
 void ds_putchar (struct string *, int ch);
 void ds_concat (struct string *, const char *);
 void ds_concat_buffer (struct string *, const char *buf, size_t len);
+void ds_vprintf (struct string *st, const char *format, va_list args);
 void ds_printf (struct string *, const char *, ...)
      PRINTF_FORMAT (2, 3);
 
index 4a693bc297f2b05a788cc2252b3111b5917def19..0c152c09f78bb17cf551182d6e9aa563f47c5847 100644 (file)
--- a/src/vfm.c
+++ b/src/vfm.c
@@ -492,7 +492,7 @@ storage_sink_open (struct case_sink *sink)
   else 
     {
       info->mode = MEMORY; 
-      info->max_cases = (set_max_workspace
+      info->max_cases = (get_max_workspace()
                          / (sizeof (struct case_list) + info->case_size));
     }
 }
@@ -598,7 +598,7 @@ storage_sink_write (struct case_sink *sink, const struct ccase *c)
           workspace_overflow = 1;
           msg (MW, _("Workspace limit of %d KB (%d cases at %d bytes each) "
                      "overflowed.  Writing active file to disk."),
-               set_max_workspace / 1024, info->max_cases,
+               get_max_workspace() / 1024, info->max_cases,
                sizeof (struct case_list) + info->case_size);
 
           storage_to_disk (info, sink->value_cnt);
index 72da71fcd5436841d553c05a76fb6c331126ac93..1e0e55e296253fa3942f6377d2c00b77ef9604c2 100755 (executable)
@@ -63,10 +63,12 @@ list.
 EOF
 if [ $? -ne 0 ] ; then no_result ; fi
 
+activity="run program"
 $SUPERVISOR $here/../src/pspp -o raw-ascii $TEMPDIR/rnd.sps
 if [ $? -ne 0 ] ; then no_result ; fi
 
 
+activity="compare output"
 diff -b -B -w $TEMPDIR/pspp.list - << EOF
       R1
 --------
index fdfcf9cb5d798f929fa631f742df21bf0393833f..f408a0fa2f8e8ff7173329860567ce9adadb6575 100755 (executable)
@@ -86,7 +86,7 @@ if [ $? -ne 0 ] ; then no_result ; fi
 
 
 activity="run program"
-$SUPERVISOR $here/../src/pspp -o raw-ascii --testing-mode $TEMPDIR/print.stat > $TEMPDIR/errs
+$SUPERVISOR $here/../src/pspp --testing-mode -o raw-ascii --testing-mode $TEMPDIR/print.stat > $TEMPDIR/errs
 # Note   vv   --- there are errors in input.  Therefore, the  command must FAIL
 if [ $? -eq 0 ] ; then fail ; fi
 
@@ -110,7 +110,6 @@ EOF
 if [ $? -ne 0 ] ; then fail ; fi
 
 
-
 activity="compare output"
 diff -b -B $TEMPDIR/pspp.list - << EOF
 ----------------------------------------------------------------------
@@ -194,9919 +193,6 @@ Testing use of DATA LIST LIST.
    12.00      .        .        .   
    12.00      .        .        .   
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 EOF
 if [ $? -ne 0 ] ; then fail ; fi