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.
 
 
 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.
 
 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.
 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.
 * 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
 * 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.
 
 
 This command is not valid within a command file.
 
-@node SET, SUBTITLE, QUIT, Utilities
+@node SET, SHOW, QUIT, Utilities
 @section SET
 @vindex SET
 
 @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
 
 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
 
 @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"
 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"
 "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"
 
 "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/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 ""
 
 msgid "while expecting COLUMNWISE"
 msgstr ""
 
-#: src/aggregate.c:261
+#: src/aggregate.c:244
 msgid "BREAK subcommand not specified."
 msgstr ""
 
 msgid "BREAK subcommand not specified."
 msgstr ""
 
-#: src/aggregate.c:490
+#: src/aggregate.c:400
 msgid "expecting aggregation function"
 msgstr ""
 
 msgid "expecting aggregation function"
 msgstr ""
 
-#: src/aggregate.c:506
+#: src/aggregate.c:416
 #, c-format
 msgid "Unknown aggregation function %s."
 msgstr ""
 
 #, c-format
 msgid "Unknown aggregation function %s."
 msgstr ""
 
-#: src/aggregate.c:521
+#: src/aggregate.c:431
 msgid "expecting `('"
 msgstr ""
 
 msgid "expecting `('"
 msgstr ""
 
-#: src/aggregate.c:556
+#: src/aggregate.c:466
 #, c-format
 msgid "Missing argument %d to %s."
 msgstr ""
 
 #, 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 ""
 
 #, 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 ""
 
 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 ""
 
 #, 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 "
 #, 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 ""
 
 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/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/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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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"
 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 ""
 
 "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"
 #, c-format
 msgid ""
 "PSPP, a program for statistical analysis of sample data.\n"
@@ -299,7 +304,7 @@ msgid ""
 "\n"
 msgstr ""
 
 "\n"
 msgstr ""
 
-#: src/cmdline.c:249
+#: src/cmdline.c:253
 #, c-format
 msgid ""
 "\n"
 #, c-format
 msgid ""
 "\n"
@@ -378,30 +383,30 @@ msgstr ""
 msgid "The sentinel may not be the empty string."
 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 ""
 
 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 ""
 
 #, c-format
 msgid "Error removing `%s': %s."
 msgstr ""
 
-#: src/command.c:647
+#: src/command.c:640
 #, c-format
 msgid "Couldn't fork: %s."
 msgstr ""
 
 #, c-format
 msgid "Couldn't fork: %s."
 msgstr ""
 
-#: src/command.c:688
+#: src/command.c:681
 #, c-format
 msgid "Error executing command: %s."
 msgstr ""
 
 #, 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 ""
 
 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 ""
 
 msgid "This command is not valid in a syntax file."
 msgstr ""
 
@@ -427,11 +432,11 @@ msgstr ""
 msgid "Extra characters after expression."
 msgstr ""
 
 msgid "Extra characters after expression."
 msgstr ""
 
-#: src/count.c:171
+#: src/count.c:156
 msgid "Destination cannot be a string variable."
 msgstr ""
 
 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 "
 #, 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
 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 ""
 #: src/descript.q:791
 msgid "Variable"
 msgstr ""
@@ -1026,25 +1031,25 @@ msgstr ""
 msgid "Error writing file %s: %s."
 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 ""
 
 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 ""
 
 msgid "inline file: Opening for reading."
 msgstr ""
 
-#: src/dfm.c:678
+#: src/dfm.c:677
 msgid "Skipping remaining inline data."
 msgstr ""
 
 msgid "Skipping remaining inline data."
 msgstr ""
 
-#: src/dfm.c:690
+#: src/dfm.c:689
 msgid "reading as a data file"
 msgstr ""
 
 msgid "reading as a data file"
 msgstr ""
 
-#: src/dfm.c:697
+#: src/dfm.c:696
 msgid "writing as a data file"
 msgstr ""
 
 msgid "writing as a data file"
 msgstr ""
 
@@ -1089,41 +1094,41 @@ msgstr ""
 msgid "DO IF %d: missing\n"
 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 ""
 
 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 ""
 
 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 ""
 
 #, 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 ""
 
 #, c-format
 msgid "Warnings (%d) exceed limit (%d)."
 msgstr ""
 
-#: src/error.c:253
+#: src/error.c:255
 msgid "fatal"
 msgstr ""
 
 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 ""
 
 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 ""
 
 msgid "warning"
 msgstr ""
 
-#: src/error.c:257 src/error.c:267
+#: src/error.c:259 src/error.c:269
 msgid "note"
 msgstr ""
 
 msgid "note"
 msgstr ""
 
-#: src/error.c:259 src/error.c:260
+#: src/error.c:261 src/error.c:262
 msgid "installation error"
 msgstr ""
 
 msgid "installation error"
 msgstr ""
 
@@ -1531,59 +1536,64 @@ msgstr ""
 msgid "Unknown record type %g."
 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 ""
 
 #, 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 ""
 
 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 ""
 
 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 ""
 
 #, 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 ""
 
 #, c-format
 msgid "Error rewinding FLIP file: %s."
 msgstr ""
 
-#: src/flip.c:385
+#: src/flip.c:393
 msgid "Error creating FLIP source file."
 msgstr ""
 
 msgid "Error creating FLIP source file."
 msgstr ""
 
-#: src/flip.c:394
+#: src/flip.c:402
 #, c-format
 msgid "Error reading FLIP file: %s."
 msgstr ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 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 ""
 
 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 ""
 #, c-format
 msgid "  %8s from %3d,%3d to %3d,%3d\n"
 msgstr ""
@@ -1737,110 +1747,95 @@ msgid ""
 "Variables in dictionary:\n"
 msgstr ""
 
 "Variables in dictionary:\n"
 msgstr ""
 
-#: src/get.c:607
+#: src/get.c:610
 msgid "The BY subcommand may be given once at most."
 msgstr ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 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 ""
 
 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, c-format
 msgid "%s: Opening as syntax file."
 msgstr ""
 
-#: src/getline.c:321
+#: src/getline.c:323
 #, c-format
 msgid "Opening `%s': %s."
 msgstr ""
 
 #, 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 ""
 
 #, c-format
 msgid "Reading `%s': %s."
 msgstr ""
 
-#: src/getline.c:388
+#: src/getline.c:390
 #, c-format
 msgid "Closing `%s': %s."
 msgstr ""
 
 #, 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..."
 #: src/groff-font.c:107
 #, c-format
 msgid "%s: Opening Groff font file..."
@@ -2110,11 +2105,11 @@ msgstr ""
 msgid "expecting %s"
 msgstr ""
 
 msgid "expecting %s"
 msgstr ""
 
-#: src/lexer.c:524
+#: src/lexer.c:524 src/val-labs.c:148
 msgid "expecting string"
 msgstr ""
 
 msgid "expecting string"
 msgstr ""
 
-#: src/lexer.c:538
+#: src/lexer.c:538 src/val-labs.c:157
 msgid "expecting integer"
 msgstr ""
 
 msgid "expecting integer"
 msgstr ""
 
@@ -2198,32 +2193,6 @@ msgstr ""
 msgid "%s without %s."
 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 ""
 #: 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 ""
 
 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 #, c-format
 msgid "Syntax error expecting value for %s %s."
 msgstr ""
@@ -2458,69 +2427,75 @@ msgstr ""
 msgid "(!!!INTERNAL ERROR--%d!!!)\n"
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 #, 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 #, c-format
 msgid "Unrecognized subcommand name `%s'."
 msgstr ""
 
-#: src/modify-vars.c:295
+#: src/modify-vars.c:302
 msgid "Subcommand name expected."
 msgstr ""
 
 msgid "Subcommand name expected."
 msgstr ""
 
-#: src/modify-vars.c:303
+#: src/modify-vars.c:310
 msgid "`/' or `.' expected."
 msgstr ""
 
 msgid "`/' or `.' expected."
 msgstr ""
 
@@ -3137,14 +3112,14 @@ msgid ""
 "SPACE a negative number of lines."
 msgstr ""
 
 "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 ""
 
 #, 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 "
 #, c-format
 msgid ""
 "There is no string variable named %s.  (All string variables specified on "
@@ -3152,77 +3127,73 @@ msgid ""
 "variable.)"
 msgstr ""
 
 "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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 msgstr ""
 
-#: src/rename-vars.c:55
+#: src/rename-vars.c:62
 msgid "`(' expected."
 msgstr ""
 
 msgid "`(' expected."
 msgstr ""
 
-#: src/rename-vars.c:63
+#: src/rename-vars.c:70
 msgid "`=' expected between lists of new and old variable names."
 msgstr ""
 
 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 ""
 
 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 ""
 #, c-format
 msgid "Renaming would duplicate variable name %s."
 msgstr ""
@@ -3704,65 +3675,71 @@ msgstr ""
 msgid "writing as a system file"
 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
 msgstr ""
 
 #: src/sort.c:127
+msgid "`A' or `D' expected inside parentheses."
+msgstr ""
+
+#: src/sort.c:132
 msgid "`)' expected."
 msgstr ""
 
 msgid "`)' expected."
 msgstr ""
 
-#: src/sort.c:418
+#: src/sort.c:421
 #, c-format
 msgid "%s: Creating temporary directory: %s."
 msgstr ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 "
 #, 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 ""
 
 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 ""
 
 msgid "Label"
 msgstr ""
 
@@ -3893,8 +3870,8 @@ msgstr ""
 msgid "Missing Values: "
 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 ""
 #: 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 ""
 
 "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 ""
 
 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."
 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 ""
 
 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 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 ""
 #: 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 ""
 
 "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 ""
 
 msgstr ""
 
-#: src/vfm.c:554
+#: src/vfm.c:520
 #, c-format
 msgid ""
 #, 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 ""
 
 msgstr ""
 
-#: src/vfm.c:579
+#: src/vfm.c:599
 #, c-format
 msgid ""
 #, 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 ""
 
 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 ""
 
 #, 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 ""
 
 #, 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 ""
 #: 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 ""
 
 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 ""
 
 msgid "expecting BY"
 msgstr ""
 
-#: src/crosstabs.q:388
+#: src/crosstabs.q:389
 msgid "VARIABLES must be specified before TABLES."
 msgstr ""
 
 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 ""
 
 #, c-format
 msgid "Maximum value (%ld) less than minimum value (%ld)."
 msgstr ""
 
-#: src/crosstabs.q:859
+#: src/crosstabs.q:860
 msgid "Summary."
 msgstr ""
 
 msgid "Summary."
 msgstr ""
 
-#: src/crosstabs.q:861
+#: src/crosstabs.q:862
 msgid "Cases"
 msgstr ""
 
 msgid "Cases"
 msgstr ""
 
-#: src/crosstabs.q:862 src/frequencies.q:1007
+#: src/crosstabs.q:863 src/frequencies.q:1007
 msgid "Valid"
 msgstr ""
 
 msgid "Valid"
 msgstr ""
 
-#: src/crosstabs.q:863 src/frequencies.q:1074
+#: src/crosstabs.q:864 src/frequencies.q:1074
 msgid "Missing"
 msgstr ""
 
 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/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 ""
 
 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/frequencies.q:1013
 msgid "Percent"
 msgstr ""
 
-#: src/crosstabs.q:1117
+#: src/crosstabs.q:1118
 msgid "count"
 msgstr ""
 
 msgid "count"
 msgstr ""
 
-#: src/crosstabs.q:1118
+#: src/crosstabs.q:1119
 msgid "row %"
 msgstr ""
 
 msgid "row %"
 msgstr ""
 
-#: src/crosstabs.q:1119
+#: src/crosstabs.q:1120
 msgid "column %"
 msgstr ""
 
 msgid "column %"
 msgstr ""
 
-#: src/crosstabs.q:1120
+#: src/crosstabs.q:1121
 msgid "total %"
 msgstr ""
 
 msgid "total %"
 msgstr ""
 
-#: src/crosstabs.q:1121
+#: src/crosstabs.q:1122
 msgid "expected"
 msgstr ""
 
 msgid "expected"
 msgstr ""
 
-#: src/crosstabs.q:1122
+#: src/crosstabs.q:1123
 msgid "residual"
 msgstr ""
 
 msgid "residual"
 msgstr ""
 
-#: src/crosstabs.q:1123
+#: src/crosstabs.q:1124
 msgid "std. resid."
 msgstr ""
 
 msgid "std. resid."
 msgstr ""
 
-#: src/crosstabs.q:1124
+#: src/crosstabs.q:1125
 msgid "adj. resid."
 msgstr ""
 
 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 ""
 
 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 ""
 
 msgid "df"
 msgstr ""
 
-#: src/crosstabs.q:1161
+#: src/crosstabs.q:1162
 msgid "Asymp. Sig. (2-sided)"
 msgstr ""
 
 msgid "Asymp. Sig. (2-sided)"
 msgstr ""
 
-#: src/crosstabs.q:1163
+#: src/crosstabs.q:1164
 msgid "Exact. Sig. (2-sided)"
 msgstr ""
 
 msgid "Exact. Sig. (2-sided)"
 msgstr ""
 
-#: src/crosstabs.q:1165
+#: src/crosstabs.q:1166
 msgid "Exact. Sig. (1-sided)"
 msgstr ""
 
 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 ""
 
 msgid "Category"
 msgstr ""
 
-#: src/crosstabs.q:1186 src/crosstabs.q:1228
+#: src/crosstabs.q:1187 src/crosstabs.q:1229
 msgid "Asymp. Std. Error"
 msgstr ""
 
 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 ""
 
 msgid "Approx. T"
 msgstr ""
 
-#: src/crosstabs.q:1188 src/crosstabs.q:1230
+#: src/crosstabs.q:1189 src/crosstabs.q:1231
 msgid "Approx. Sig."
 msgstr ""
 
 msgid "Approx. Sig."
 msgstr ""
 
-#: src/crosstabs.q:1203
+#: src/crosstabs.q:1204
 #, c-format
 msgid " 95%% Confidence Interval"
 msgstr ""
 
 #, 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 ""
 
 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 ""
 
 msgid "Upper"
 msgstr ""
 
-#: src/crosstabs.q:1226
+#: src/crosstabs.q:1227
 msgid "Type"
 msgstr ""
 
 msgid "Type"
 msgstr ""
 
-#: src/crosstabs.q:1976
+#: src/crosstabs.q:1977
 msgid "Pearson Chi-Square"
 msgstr ""
 
 msgid "Pearson Chi-Square"
 msgstr ""
 
-#: src/crosstabs.q:1977
+#: src/crosstabs.q:1978
 msgid "Likelihood Ratio"
 msgstr ""
 
 msgid "Likelihood Ratio"
 msgstr ""
 
-#: src/crosstabs.q:1978
+#: src/crosstabs.q:1979
 msgid "Fisher's Exact Test"
 msgstr ""
 
 msgid "Fisher's Exact Test"
 msgstr ""
 
-#: src/crosstabs.q:1979
+#: src/crosstabs.q:1980
 msgid "Continuity Correction"
 msgstr ""
 
 msgid "Continuity Correction"
 msgstr ""
 
-#: src/crosstabs.q:1980
+#: src/crosstabs.q:1981
 msgid "Linear-by-Linear Association"
 msgstr ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 msgid "Ordinal by Ordinal"
 msgstr ""
 
-#: src/crosstabs.q:2035
+#: src/crosstabs.q:2036
 msgid "Interval by Interval"
 msgstr ""
 
 msgid "Interval by Interval"
 msgstr ""
 
-#: src/crosstabs.q:2036
+#: src/crosstabs.q:2037
 msgid "Measure of Agreement"
 msgstr ""
 
 msgid "Measure of Agreement"
 msgstr ""
 
-#: src/crosstabs.q:2041
+#: src/crosstabs.q:2042
 msgid "Phi"
 msgstr ""
 
 msgid "Phi"
 msgstr ""
 
-#: src/crosstabs.q:2042
+#: src/crosstabs.q:2043
 msgid "Cramer's V"
 msgstr ""
 
 msgid "Cramer's V"
 msgstr ""
 
-#: src/crosstabs.q:2043
+#: src/crosstabs.q:2044
 msgid "Contingency Coefficient"
 msgstr ""
 
 msgid "Contingency Coefficient"
 msgstr ""
 
-#: src/crosstabs.q:2044
+#: src/crosstabs.q:2045
 msgid "Kendall's tau-b"
 msgstr ""
 
 msgid "Kendall's tau-b"
 msgstr ""
 
-#: src/crosstabs.q:2045
+#: src/crosstabs.q:2046
 msgid "Kendall's tau-c"
 msgstr ""
 
 msgid "Kendall's tau-c"
 msgstr ""
 
-#: src/crosstabs.q:2046
+#: src/crosstabs.q:2047
 msgid "Gamma"
 msgstr ""
 
 msgid "Gamma"
 msgstr ""
 
-#: src/crosstabs.q:2047
+#: src/crosstabs.q:2048
 msgid "Spearman Correlation"
 msgstr ""
 
 msgid "Spearman Correlation"
 msgstr ""
 
-#: src/crosstabs.q:2048
+#: src/crosstabs.q:2049
 msgid "Pearson's R"
 msgstr ""
 
 msgid "Pearson's R"
 msgstr ""
 
-#: src/crosstabs.q:2049
+#: src/crosstabs.q:2050
 msgid "Kappa"
 msgstr ""
 
 msgid "Kappa"
 msgstr ""
 
-#: src/crosstabs.q:2119
+#: src/crosstabs.q:2120
 #, c-format
 msgid "Odds Ratio for %s (%g / %g)"
 msgstr ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, c-format
 msgid "For cohort %s = %g"
 msgstr ""
 
-#: src/crosstabs.q:2133
+#: src/crosstabs.q:2134
 #, c-format
 msgid "For cohort %s = %.*s"
 msgstr ""
 
 #, c-format
 msgid "For cohort %s = %.*s"
 msgstr ""
 
-#: src/crosstabs.q:2164
+#: src/crosstabs.q:2165
 msgid "Nominal by Interval"
 msgstr ""
 
 msgid "Nominal by Interval"
 msgstr ""
 
-#: src/crosstabs.q:2169
+#: src/crosstabs.q:2170
 msgid "Lambda"
 msgstr ""
 
 msgid "Lambda"
 msgstr ""
 
-#: src/crosstabs.q:2170
+#: src/crosstabs.q:2171
 msgid "Goodman and Kruskal tau"
 msgstr ""
 
 msgid "Goodman and Kruskal tau"
 msgstr ""
 
-#: src/crosstabs.q:2171
+#: src/crosstabs.q:2172
 msgid "Uncertainty Coefficient"
 msgstr ""
 
 msgid "Uncertainty Coefficient"
 msgstr ""
 
-#: src/crosstabs.q:2172
+#: src/crosstabs.q:2173
 msgid "Somers' d"
 msgstr ""
 
 msgid "Somers' d"
 msgstr ""
 
-#: src/crosstabs.q:2173
+#: src/crosstabs.q:2174
 msgid "Eta"
 msgstr ""
 
 msgid "Eta"
 msgstr ""
 
-#: src/crosstabs.q:2178
+#: src/crosstabs.q:2179
 msgid "Symmetric"
 msgstr ""
 
 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 ""
 
 #, 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 ""
 
 msgid "Mean"
 msgstr ""
 
@@ -4865,119 +4808,138 @@ msgstr ""
 msgid "Upper value (%g) is less than lower value (%g) on VARIABLES subcommand."
 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
 #, 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 ""
 
 msgstr ""
 
-#: src/set.q:233
-msgid "CPI must be greater than 0."
+#: src/set.q:226
+msgid "LISTING is OFF"
 msgstr ""
 
 msgstr ""
 
-#: src/set.q:242
-msgid "LPI must be greater than 0."
+#: src/set.q:252
+msgid "Journalling is off"
 msgstr ""
 
 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 ""
 
 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
 #, 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 ""
 
 msgstr ""
 
-#: src/set.q:287
+#: src/set.q:463
 #, c-format
 #, 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 ""
 
 msgstr ""
 
-#: src/set.q:295
-msgid "MXERRS must be at least 1."
+#: src/set.q:516
+msgid "None"
 msgstr ""
 
 msgstr ""
 
-#: src/set.q:302
-msgid "MXLOOPS must be at least 1."
+#: src/set.q:522
+msgid "Disabled"
 msgstr ""
 
 msgstr ""
 
-#: src/set.q:323
-msgid "Workspace limit must be at least 1 MB."
+#: src/set.q:527
+msgid "Screen"
 msgstr ""
 
 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 ""
 
 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 ""
 
 msgstr ""
 
-#: src/set.q:566
+#: src/set.q:650
 msgid "LENGTH must be at least 1."
 msgstr ""
 
 msgid "LENGTH must be at least 1."
 msgstr ""
 
-#: src/set.q:603
+#: src/set.q:689
 msgid "Missing identifier in RESULTS subcommand."
 msgstr ""
 
 msgid "Missing identifier in RESULTS subcommand."
 msgstr ""
 
-#: src/set.q:614
+#: src/set.q:700
 msgid "Unrecognized identifier in RESULTS subcommand."
 msgstr ""
 
 msgid "Unrecognized identifier in RESULTS subcommand."
 msgstr ""
 
-#: src/set.q:651
+#: src/set.q:738
 msgid "WIDTH must be at least 1."
 msgstr ""
 
 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 ""
 
 #, 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."
 
 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."
 
 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."
 
 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."
 
 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."
 
 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."
 
 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 ""
 
 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 ""
 #: 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 ""
 
 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 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 ""
 
 #, 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 msgid "SE. Mean"
 msgstr ""
 
-#: src/t-test.q:675
+#: src/t-test.q:677
 msgid "Group Statistics"
 msgstr ""
 
 msgid "Group Statistics"
 msgstr ""
 
-#: src/t-test.q:765
+#: src/t-test.q:767
 msgid "Paired Sample Statistics"
 msgstr ""
 
 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 ""
 
 #, c-format
 msgid "Pair %d"
 msgstr ""
 
-#: src/t-test.q:905
+#: src/t-test.q:907
 msgid "Independent Samples Test"
 msgstr ""
 
 msgid "Independent Samples Test"
 msgstr ""
 
-#: src/t-test.q:913
+#: src/t-test.q:915
 msgid "Levene's Test for Equality of Variances"
 msgstr ""
 
 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 ""
 
 msgid "t-test for Equality of Means"
 msgstr ""
 
-#: src/t-test.q:917
+#: src/t-test.q:919
 msgid "F"
 msgstr ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 msgid "Mean Difference"
 msgstr ""
 
-#: src/t-test.q:923
+#: src/t-test.q:925
 msgid "Std. Error Difference"
 msgstr ""
 
 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 ""
 
 #, 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 ""
 
 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 msgid "Equal variances not assumed"
 msgstr ""
 
-#: src/t-test.q:1102
+#: src/t-test.q:1104
 msgid "Paired Samples Test"
 msgstr ""
 
 msgid "Paired Samples Test"
 msgstr ""
 
-#: src/t-test.q:1105
+#: src/t-test.q:1107
 msgid "Paired Differences"
 msgstr ""
 
 msgid "Paired Differences"
 msgstr ""
 
-#: src/t-test.q:1117
+#: src/t-test.q:1119
 msgid "Std. Error Mean"
 msgstr ""
 
 msgid "Std. Error Mean"
 msgstr ""
 
-#: src/t-test.q:1210
+#: src/t-test.q:1212
 msgid "One-Sample Test"
 msgstr ""
 
 msgid "One-Sample Test"
 msgstr ""
 
-#: src/t-test.q:1215
+#: src/t-test.q:1217
 #, c-format
 msgid "Test Value = %f"
 msgstr ""
 
 #, c-format
 msgid "Test Value = %f"
 msgstr ""
 
-#: src/t-test.q:1340
+#: src/t-test.q:1342
 msgid "Paired Samples Correlations"
 msgstr ""
 
 msgid "Paired Samples Correlations"
 msgstr ""
 
-#: src/t-test.q:1344
+#: src/t-test.q:1346
 msgid "Correlation"
 msgstr ""
 
 msgid "Correlation"
 msgstr ""
 
-#: src/t-test.q:1367
+#: src/t-test.q:1369
 #, c-format
 msgid "%s & %s"
 msgstr ""
 #, 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"
 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"
 "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"
 
 "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/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 ""
 
 msgid "while expecting COLUMNWISE"
 msgstr ""
 
-#: src/aggregate.c:261
+#: src/aggregate.c:244
 msgid "BREAK subcommand not specified."
 msgstr ""
 
 msgid "BREAK subcommand not specified."
 msgstr ""
 
-#: src/aggregate.c:490
+#: src/aggregate.c:400
 msgid "expecting aggregation function"
 msgstr ""
 
 msgid "expecting aggregation function"
 msgstr ""
 
-#: src/aggregate.c:506
+#: src/aggregate.c:416
 #, c-format
 msgid "Unknown aggregation function %s."
 msgstr ""
 
 #, c-format
 msgid "Unknown aggregation function %s."
 msgstr ""
 
-#: src/aggregate.c:521
+#: src/aggregate.c:431
 msgid "expecting `('"
 msgstr ""
 
 msgid "expecting `('"
 msgstr ""
 
-#: src/aggregate.c:556
+#: src/aggregate.c:466
 #, c-format
 msgid "Missing argument %d to %s."
 msgstr ""
 
 #, 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 ""
 
 #, 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 ""
 
 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 ""
 
 #, 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 "
 #, 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 ""
 
 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/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/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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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"
 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 ""
 
 "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"
 #, c-format
 msgid ""
 "PSPP, a program for statistical analysis of sample data.\n"
@@ -300,7 +305,7 @@ msgid ""
 "\n"
 msgstr ""
 
 "\n"
 msgstr ""
 
-#: src/cmdline.c:249
+#: src/cmdline.c:253
 #, c-format
 msgid ""
 "\n"
 #, c-format
 msgid ""
 "\n"
@@ -379,30 +384,30 @@ msgstr ""
 msgid "The sentinel may not be the empty string."
 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 ""
 
 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 ""
 
 #, c-format
 msgid "Error removing `%s': %s."
 msgstr ""
 
-#: src/command.c:647
+#: src/command.c:640
 #, c-format
 msgid "Couldn't fork: %s."
 msgstr ""
 
 #, c-format
 msgid "Couldn't fork: %s."
 msgstr ""
 
-#: src/command.c:688
+#: src/command.c:681
 #, c-format
 msgid "Error executing command: %s."
 msgstr ""
 
 #, 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 ""
 
 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 ""
 
 msgid "This command is not valid in a syntax file."
 msgstr ""
 
@@ -428,11 +433,11 @@ msgstr ""
 msgid "Extra characters after expression."
 msgstr ""
 
 msgid "Extra characters after expression."
 msgstr ""
 
-#: src/count.c:171
+#: src/count.c:156
 msgid "Destination cannot be a string variable."
 msgstr ""
 
 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 "
 #, 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
 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 ""
 #: src/descript.q:791
 msgid "Variable"
 msgstr ""
@@ -1027,25 +1032,25 @@ msgstr ""
 msgid "Error writing file %s: %s."
 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 ""
 
 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 ""
 
 msgid "inline file: Opening for reading."
 msgstr ""
 
-#: src/dfm.c:678
+#: src/dfm.c:677
 msgid "Skipping remaining inline data."
 msgstr ""
 
 msgid "Skipping remaining inline data."
 msgstr ""
 
-#: src/dfm.c:690
+#: src/dfm.c:689
 msgid "reading as a data file"
 msgstr ""
 
 msgid "reading as a data file"
 msgstr ""
 
-#: src/dfm.c:697
+#: src/dfm.c:696
 msgid "writing as a data file"
 msgstr ""
 
 msgid "writing as a data file"
 msgstr ""
 
@@ -1090,41 +1095,41 @@ msgstr ""
 msgid "DO IF %d: missing\n"
 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 ""
 
 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 ""
 
 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 ""
 
 #, 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 ""
 
 #, c-format
 msgid "Warnings (%d) exceed limit (%d)."
 msgstr ""
 
-#: src/error.c:253
+#: src/error.c:255
 msgid "fatal"
 msgstr ""
 
 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 ""
 
 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 ""
 
 msgid "warning"
 msgstr ""
 
-#: src/error.c:257 src/error.c:267
+#: src/error.c:259 src/error.c:269
 msgid "note"
 msgstr ""
 
 msgid "note"
 msgstr ""
 
-#: src/error.c:259 src/error.c:260
+#: src/error.c:261 src/error.c:262
 msgid "installation error"
 msgstr ""
 
 msgid "installation error"
 msgstr ""
 
@@ -1532,59 +1537,64 @@ msgstr ""
 msgid "Unknown record type %g."
 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 ""
 
 #, 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 ""
 
 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 ""
 
 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 ""
 
 #, 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 ""
 
 #, c-format
 msgid "Error rewinding FLIP file: %s."
 msgstr ""
 
-#: src/flip.c:385
+#: src/flip.c:393
 msgid "Error creating FLIP source file."
 msgstr ""
 
 msgid "Error creating FLIP source file."
 msgstr ""
 
-#: src/flip.c:394
+#: src/flip.c:402
 #, c-format
 msgid "Error reading FLIP file: %s."
 msgstr ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 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 ""
 
 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 ""
 #, c-format
 msgid "  %8s from %3d,%3d to %3d,%3d\n"
 msgstr ""
@@ -1738,110 +1748,95 @@ msgid ""
 "Variables in dictionary:\n"
 msgstr ""
 
 "Variables in dictionary:\n"
 msgstr ""
 
-#: src/get.c:607
+#: src/get.c:610
 msgid "The BY subcommand may be given once at most."
 msgstr ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 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 ""
 
 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, c-format
 msgid "%s: Opening as syntax file."
 msgstr ""
 
-#: src/getline.c:321
+#: src/getline.c:323
 #, c-format
 msgid "Opening `%s': %s."
 msgstr ""
 
 #, 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 ""
 
 #, c-format
 msgid "Reading `%s': %s."
 msgstr ""
 
-#: src/getline.c:388
+#: src/getline.c:390
 #, c-format
 msgid "Closing `%s': %s."
 msgstr ""
 
 #, 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..."
 #: src/groff-font.c:107
 #, c-format
 msgid "%s: Opening Groff font file..."
@@ -2111,11 +2106,11 @@ msgstr ""
 msgid "expecting %s"
 msgstr ""
 
 msgid "expecting %s"
 msgstr ""
 
-#: src/lexer.c:524
+#: src/lexer.c:524 src/val-labs.c:148
 msgid "expecting string"
 msgstr ""
 
 msgid "expecting string"
 msgstr ""
 
-#: src/lexer.c:538
+#: src/lexer.c:538 src/val-labs.c:157
 msgid "expecting integer"
 msgstr ""
 
 msgid "expecting integer"
 msgstr ""
 
@@ -2199,32 +2194,6 @@ msgstr ""
 msgid "%s without %s."
 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 ""
 #: 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 ""
 
 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 #, c-format
 msgid "Syntax error expecting value for %s %s."
 msgstr ""
@@ -2459,69 +2428,75 @@ msgstr ""
 msgid "(!!!INTERNAL ERROR--%d!!!)\n"
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 #, 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 #, c-format
 msgid "Unrecognized subcommand name `%s'."
 msgstr ""
 
-#: src/modify-vars.c:295
+#: src/modify-vars.c:302
 msgid "Subcommand name expected."
 msgstr ""
 
 msgid "Subcommand name expected."
 msgstr ""
 
-#: src/modify-vars.c:303
+#: src/modify-vars.c:310
 msgid "`/' or `.' expected."
 msgstr ""
 
 msgid "`/' or `.' expected."
 msgstr ""
 
@@ -3138,14 +3113,14 @@ msgid ""
 "SPACE a negative number of lines."
 msgstr ""
 
 "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 ""
 
 #, 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 "
 #, c-format
 msgid ""
 "There is no string variable named %s.  (All string variables specified on "
@@ -3153,77 +3128,73 @@ msgid ""
 "variable.)"
 msgstr ""
 
 "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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 msgstr ""
 
-#: src/rename-vars.c:55
+#: src/rename-vars.c:62
 msgid "`(' expected."
 msgstr ""
 
 msgid "`(' expected."
 msgstr ""
 
-#: src/rename-vars.c:63
+#: src/rename-vars.c:70
 msgid "`=' expected between lists of new and old variable names."
 msgstr ""
 
 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 ""
 
 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 ""
 #, c-format
 msgid "Renaming would duplicate variable name %s."
 msgstr ""
@@ -3705,65 +3676,71 @@ msgstr ""
 msgid "writing as a system file"
 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
 msgstr ""
 
 #: src/sort.c:127
+msgid "`A' or `D' expected inside parentheses."
+msgstr ""
+
+#: src/sort.c:132
 msgid "`)' expected."
 msgstr ""
 
 msgid "`)' expected."
 msgstr ""
 
-#: src/sort.c:418
+#: src/sort.c:421
 #, c-format
 msgid "%s: Creating temporary directory: %s."
 msgstr ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, 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 "
 #, 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 ""
 
 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 ""
 
 msgid "Label"
 msgstr ""
 
@@ -3894,8 +3871,8 @@ msgstr ""
 msgid "Missing Values: "
 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 ""
 #: 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 ""
 
 "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 ""
 
 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."
 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 ""
 
 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 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 ""
 #: 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 ""
 
 "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 ""
 
 msgstr ""
 
-#: src/vfm.c:554
+#: src/vfm.c:520
 #, c-format
 msgid ""
 #, 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 ""
 
 msgstr ""
 
-#: src/vfm.c:579
+#: src/vfm.c:599
 #, c-format
 msgid ""
 #, 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 ""
 
 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 ""
 
 #, 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 ""
 
 #, 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 ""
 #: 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 ""
 
 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 ""
 
 msgid "expecting BY"
 msgstr ""
 
-#: src/crosstabs.q:388
+#: src/crosstabs.q:389
 msgid "VARIABLES must be specified before TABLES."
 msgstr ""
 
 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 ""
 
 #, c-format
 msgid "Maximum value (%ld) less than minimum value (%ld)."
 msgstr ""
 
-#: src/crosstabs.q:859
+#: src/crosstabs.q:860
 msgid "Summary."
 msgstr ""
 
 msgid "Summary."
 msgstr ""
 
-#: src/crosstabs.q:861
+#: src/crosstabs.q:862
 msgid "Cases"
 msgstr ""
 
 msgid "Cases"
 msgstr ""
 
-#: src/crosstabs.q:862 src/frequencies.q:1007
+#: src/crosstabs.q:863 src/frequencies.q:1007
 msgid "Valid"
 msgstr ""
 
 msgid "Valid"
 msgstr ""
 
-#: src/crosstabs.q:863 src/frequencies.q:1074
+#: src/crosstabs.q:864 src/frequencies.q:1074
 msgid "Missing"
 msgstr ""
 
 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/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 ""
 
 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/frequencies.q:1013
 msgid "Percent"
 msgstr ""
 
-#: src/crosstabs.q:1117
+#: src/crosstabs.q:1118
 msgid "count"
 msgstr ""
 
 msgid "count"
 msgstr ""
 
-#: src/crosstabs.q:1118
+#: src/crosstabs.q:1119
 msgid "row %"
 msgstr ""
 
 msgid "row %"
 msgstr ""
 
-#: src/crosstabs.q:1119
+#: src/crosstabs.q:1120
 msgid "column %"
 msgstr ""
 
 msgid "column %"
 msgstr ""
 
-#: src/crosstabs.q:1120
+#: src/crosstabs.q:1121
 msgid "total %"
 msgstr ""
 
 msgid "total %"
 msgstr ""
 
-#: src/crosstabs.q:1121
+#: src/crosstabs.q:1122
 msgid "expected"
 msgstr ""
 
 msgid "expected"
 msgstr ""
 
-#: src/crosstabs.q:1122
+#: src/crosstabs.q:1123
 msgid "residual"
 msgstr ""
 
 msgid "residual"
 msgstr ""
 
-#: src/crosstabs.q:1123
+#: src/crosstabs.q:1124
 msgid "std. resid."
 msgstr ""
 
 msgid "std. resid."
 msgstr ""
 
-#: src/crosstabs.q:1124
+#: src/crosstabs.q:1125
 msgid "adj. resid."
 msgstr ""
 
 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 ""
 
 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 ""
 
 msgid "df"
 msgstr ""
 
-#: src/crosstabs.q:1161
+#: src/crosstabs.q:1162
 msgid "Asymp. Sig. (2-sided)"
 msgstr ""
 
 msgid "Asymp. Sig. (2-sided)"
 msgstr ""
 
-#: src/crosstabs.q:1163
+#: src/crosstabs.q:1164
 msgid "Exact. Sig. (2-sided)"
 msgstr ""
 
 msgid "Exact. Sig. (2-sided)"
 msgstr ""
 
-#: src/crosstabs.q:1165
+#: src/crosstabs.q:1166
 msgid "Exact. Sig. (1-sided)"
 msgstr ""
 
 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 ""
 
 msgid "Category"
 msgstr ""
 
-#: src/crosstabs.q:1186 src/crosstabs.q:1228
+#: src/crosstabs.q:1187 src/crosstabs.q:1229
 msgid "Asymp. Std. Error"
 msgstr ""
 
 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 ""
 
 msgid "Approx. T"
 msgstr ""
 
-#: src/crosstabs.q:1188 src/crosstabs.q:1230
+#: src/crosstabs.q:1189 src/crosstabs.q:1231
 msgid "Approx. Sig."
 msgstr ""
 
 msgid "Approx. Sig."
 msgstr ""
 
-#: src/crosstabs.q:1203
+#: src/crosstabs.q:1204
 #, c-format
 msgid " 95%% Confidence Interval"
 msgstr ""
 
 #, 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 ""
 
 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 ""
 
 msgid "Upper"
 msgstr ""
 
-#: src/crosstabs.q:1226
+#: src/crosstabs.q:1227
 msgid "Type"
 msgstr ""
 
 msgid "Type"
 msgstr ""
 
-#: src/crosstabs.q:1976
+#: src/crosstabs.q:1977
 msgid "Pearson Chi-Square"
 msgstr ""
 
 msgid "Pearson Chi-Square"
 msgstr ""
 
-#: src/crosstabs.q:1977
+#: src/crosstabs.q:1978
 msgid "Likelihood Ratio"
 msgstr ""
 
 msgid "Likelihood Ratio"
 msgstr ""
 
-#: src/crosstabs.q:1978
+#: src/crosstabs.q:1979
 msgid "Fisher's Exact Test"
 msgstr ""
 
 msgid "Fisher's Exact Test"
 msgstr ""
 
-#: src/crosstabs.q:1979
+#: src/crosstabs.q:1980
 msgid "Continuity Correction"
 msgstr ""
 
 msgid "Continuity Correction"
 msgstr ""
 
-#: src/crosstabs.q:1980
+#: src/crosstabs.q:1981
 msgid "Linear-by-Linear Association"
 msgstr ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 msgid "Ordinal by Ordinal"
 msgstr ""
 
-#: src/crosstabs.q:2035
+#: src/crosstabs.q:2036
 msgid "Interval by Interval"
 msgstr ""
 
 msgid "Interval by Interval"
 msgstr ""
 
-#: src/crosstabs.q:2036
+#: src/crosstabs.q:2037
 msgid "Measure of Agreement"
 msgstr ""
 
 msgid "Measure of Agreement"
 msgstr ""
 
-#: src/crosstabs.q:2041
+#: src/crosstabs.q:2042
 msgid "Phi"
 msgstr ""
 
 msgid "Phi"
 msgstr ""
 
-#: src/crosstabs.q:2042
+#: src/crosstabs.q:2043
 msgid "Cramer's V"
 msgstr ""
 
 msgid "Cramer's V"
 msgstr ""
 
-#: src/crosstabs.q:2043
+#: src/crosstabs.q:2044
 msgid "Contingency Coefficient"
 msgstr ""
 
 msgid "Contingency Coefficient"
 msgstr ""
 
-#: src/crosstabs.q:2044
+#: src/crosstabs.q:2045
 msgid "Kendall's tau-b"
 msgstr ""
 
 msgid "Kendall's tau-b"
 msgstr ""
 
-#: src/crosstabs.q:2045
+#: src/crosstabs.q:2046
 msgid "Kendall's tau-c"
 msgstr ""
 
 msgid "Kendall's tau-c"
 msgstr ""
 
-#: src/crosstabs.q:2046
+#: src/crosstabs.q:2047
 msgid "Gamma"
 msgstr ""
 
 msgid "Gamma"
 msgstr ""
 
-#: src/crosstabs.q:2047
+#: src/crosstabs.q:2048
 msgid "Spearman Correlation"
 msgstr ""
 
 msgid "Spearman Correlation"
 msgstr ""
 
-#: src/crosstabs.q:2048
+#: src/crosstabs.q:2049
 msgid "Pearson's R"
 msgstr ""
 
 msgid "Pearson's R"
 msgstr ""
 
-#: src/crosstabs.q:2049
+#: src/crosstabs.q:2050
 msgid "Kappa"
 msgstr ""
 
 msgid "Kappa"
 msgstr ""
 
-#: src/crosstabs.q:2119
+#: src/crosstabs.q:2120
 #, c-format
 msgid "Odds Ratio for %s (%g / %g)"
 msgstr ""
 
 #, 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 ""
 
 #, 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 ""
 
 #, c-format
 msgid "For cohort %s = %g"
 msgstr ""
 
-#: src/crosstabs.q:2133
+#: src/crosstabs.q:2134
 #, c-format
 msgid "For cohort %s = %.*s"
 msgstr ""
 
 #, c-format
 msgid "For cohort %s = %.*s"
 msgstr ""
 
-#: src/crosstabs.q:2164
+#: src/crosstabs.q:2165
 msgid "Nominal by Interval"
 msgstr ""
 
 msgid "Nominal by Interval"
 msgstr ""
 
-#: src/crosstabs.q:2169
+#: src/crosstabs.q:2170
 msgid "Lambda"
 msgstr ""
 
 msgid "Lambda"
 msgstr ""
 
-#: src/crosstabs.q:2170
+#: src/crosstabs.q:2171
 msgid "Goodman and Kruskal tau"
 msgstr ""
 
 msgid "Goodman and Kruskal tau"
 msgstr ""
 
-#: src/crosstabs.q:2171
+#: src/crosstabs.q:2172
 msgid "Uncertainty Coefficient"
 msgstr ""
 
 msgid "Uncertainty Coefficient"
 msgstr ""
 
-#: src/crosstabs.q:2172
+#: src/crosstabs.q:2173
 msgid "Somers' d"
 msgstr ""
 
 msgid "Somers' d"
 msgstr ""
 
-#: src/crosstabs.q:2173
+#: src/crosstabs.q:2174
 msgid "Eta"
 msgstr ""
 
 msgid "Eta"
 msgstr ""
 
-#: src/crosstabs.q:2178
+#: src/crosstabs.q:2179
 msgid "Symmetric"
 msgstr ""
 
 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 ""
 
 #, 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 ""
 
 msgid "Mean"
 msgstr ""
 
@@ -4866,119 +4809,138 @@ msgstr ""
 msgid "Upper value (%g) is less than lower value (%g) on VARIABLES subcommand."
 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
 #, 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 ""
 
 msgstr ""
 
-#: src/set.q:233
-msgid "CPI must be greater than 0."
+#: src/set.q:226
+msgid "LISTING is OFF"
 msgstr ""
 
 msgstr ""
 
-#: src/set.q:242
-msgid "LPI must be greater than 0."
+#: src/set.q:252
+msgid "Journalling is off"
 msgstr ""
 
 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 ""
 
 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
 #, 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 ""
 
 msgstr ""
 
-#: src/set.q:287
+#: src/set.q:463
 #, c-format
 #, 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 ""
 
 msgstr ""
 
-#: src/set.q:295
-msgid "MXERRS must be at least 1."
+#: src/set.q:516
+msgid "None"
 msgstr ""
 
 msgstr ""
 
-#: src/set.q:302
-msgid "MXLOOPS must be at least 1."
+#: src/set.q:522
+msgid "Disabled"
 msgstr ""
 
 msgstr ""
 
-#: src/set.q:323
-msgid "Workspace limit must be at least 1 MB."
+#: src/set.q:527
+msgid "Screen"
 msgstr ""
 
 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 ""
 
 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 ""
 
 msgstr ""
 
-#: src/set.q:566
+#: src/set.q:650
 msgid "LENGTH must be at least 1."
 msgstr ""
 
 msgid "LENGTH must be at least 1."
 msgstr ""
 
-#: src/set.q:603
+#: src/set.q:689
 msgid "Missing identifier in RESULTS subcommand."
 msgstr ""
 
 msgid "Missing identifier in RESULTS subcommand."
 msgstr ""
 
-#: src/set.q:614
+#: src/set.q:700
 msgid "Unrecognized identifier in RESULTS subcommand."
 msgstr ""
 
 msgid "Unrecognized identifier in RESULTS subcommand."
 msgstr ""
 
-#: src/set.q:651
+#: src/set.q:738
 msgid "WIDTH must be at least 1."
 msgstr ""
 
 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 ""
 
 #, 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 #: 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 ""
 
 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 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 ""
 
 #, 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 msgid "SE. Mean"
 msgstr ""
 
-#: src/t-test.q:675
+#: src/t-test.q:677
 msgid "Group Statistics"
 msgstr ""
 
 msgid "Group Statistics"
 msgstr ""
 
-#: src/t-test.q:765
+#: src/t-test.q:767
 msgid "Paired Sample Statistics"
 msgstr ""
 
 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 ""
 
 #, c-format
 msgid "Pair %d"
 msgstr ""
 
-#: src/t-test.q:905
+#: src/t-test.q:907
 msgid "Independent Samples Test"
 msgstr ""
 
 msgid "Independent Samples Test"
 msgstr ""
 
-#: src/t-test.q:913
+#: src/t-test.q:915
 msgid "Levene's Test for Equality of Variances"
 msgstr ""
 
 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 ""
 
 msgid "t-test for Equality of Means"
 msgstr ""
 
-#: src/t-test.q:917
+#: src/t-test.q:919
 msgid "F"
 msgstr ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 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 ""
 
 msgid "Mean Difference"
 msgstr ""
 
-#: src/t-test.q:923
+#: src/t-test.q:925
 msgid "Std. Error Difference"
 msgstr ""
 
 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 ""
 
 #, 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 ""
 
 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 ""
 
 #, 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 ""
 
 #, 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 ""
 
 msgid "Equal variances not assumed"
 msgstr ""
 
-#: src/t-test.q:1102
+#: src/t-test.q:1104
 msgid "Paired Samples Test"
 msgstr ""
 
 msgid "Paired Samples Test"
 msgstr ""
 
-#: src/t-test.q:1105
+#: src/t-test.q:1107
 msgid "Paired Differences"
 msgstr ""
 
 msgid "Paired Differences"
 msgstr ""
 
-#: src/t-test.q:1117
+#: src/t-test.q:1119
 msgid "Std. Error Mean"
 msgstr ""
 
 msgid "Std. Error Mean"
 msgstr ""
 
-#: src/t-test.q:1210
+#: src/t-test.q:1212
 msgid "One-Sample Test"
 msgstr ""
 
 msgid "One-Sample Test"
 msgstr ""
 
-#: src/t-test.q:1215
+#: src/t-test.q:1217
 #, c-format
 msgid "Test Value = %f"
 msgstr ""
 
 #, c-format
 msgid "Test Value = %f"
 msgstr ""
 
-#: src/t-test.q:1340
+#: src/t-test.q:1342
 msgid "Paired Samples Correlations"
 msgstr ""
 
 msgid "Paired Samples Correlations"
 msgstr ""
 
-#: src/t-test.q:1344
+#: src/t-test.q:1346
 msgid "Correlation"
 msgstr ""
 
 msgid "Correlation"
 msgstr ""
 
-#: src/t-test.q:1367
+#: src/t-test.q:1369
 #, c-format
 msgid "%s & %s"
 msgstr ""
 #, 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
 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      \
        ./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      \
 
 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          \
 
 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    \
 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;
   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;
 
   if (!sfm_write_dictionary (&w))
     return 0;
 
index ac33ee4aaa7ee43e451efca6ca36e35551c1ae0b..fd4e6c450dc7ab82410b57a0897238f683e5a32f 100644 (file)
@@ -41,6 +41,8 @@ static void usage (void);
 
 char *subst_vars (char *);
 
 
 char *subst_vars (char *);
 
+static int testing_mode=0;
+
 /* Parses the command line specified by ARGC and ARGV as received by
    main(). */
 void
 /* 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'},
     {"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},
     {"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':
          no_statrc = 1;
          break;
        case 's':
-         set_safer = 1;
+         make_safe();
          break;
        case 'v':
          err_verbosity++;
          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. */
     {
       /* FIXME: Later this option should do some other things, too. */
-      set_viewwidth = 9999;
+      force_long_view();
     }
     }
+    
 
   for (i = optind; i < argc; i++)
     {
 
   for (i = optind; i < argc; i++)
     {
index 316868a2be5d5663ffb72ba4745144b62e8ea694..163f9845742ee095096f8791c7d18d64d47f4a52 100644 (file)
@@ -566,21 +566,17 @@ cmd_execute (void)
   return lex_end_of_command ();
 }
 
   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)
 {
 
 /* 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"))
   
   lex_match_id ("ERASE");
   if (!lex_force_match_id ("FILE"))
@@ -707,8 +703,12 @@ cmd_host (void)
 {
   int code;
 
 {
   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
   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)
 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)
 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)
     {
   
   if (type != FMT_DOT)
     {
-      decimal = set_decimal;
-      grouping = set_grouping;
+      decimal = get_decimal();
+      grouping = get_grouping();
     }
   else
     {
     }
   else
     {
-      decimal = set_grouping;
-      grouping = set_decimal;
+      decimal = get_grouping();
+      grouping = get_decimal();
     }
 
   i->v->f = SYSMIS;
     }
 
   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
   if (fmt->cat & FCAT_STRING)
     memset (i->v->s, ' ', i->format.w);
   else
-    i->v->f = set_blanks;
+    i->v->f = get_blanks();
 }
 
 int
 }
 
 int
@@ -1529,7 +1529,7 @@ data_in (struct data_in *i)
 
          if (++cp == i->e)
            {
 
          if (++cp == i->e)
            {
-             i->v->f = set_blanks;
+             i->v->f = get_blanks();
              return 1;
            }
        }
              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;
          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)
        }
 
       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 (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."),
            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. */
 
   /* 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)
     {
       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--;
       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++;
     }
        }
       *dst++ = *sp++;
     }
@@ -1052,7 +1052,7 @@ year4 (int year)
 static int
 try_CCx (char *dst, const struct fmt_spec *fp, double number)
 {
 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;
 
 
   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. */
 
   /* 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;
   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 (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)
            {
              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, ...)
 {
 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);
   /* 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);
   }
   
     va_end (args);
   }
   
@@ -97,7 +99,7 @@ msg (int class, const char *format, ...)
     e.class = class;
     err_location (&e.where);
     e.title = NULL;
     e.class = class;
     err_location (&e.where);
     e.title = NULL;
-    e.text = buf;
+    e.text = buf.string;
     err_vmsg (&e);
   }
 }
     err_vmsg (&e);
   }
 }
@@ -186,14 +188,14 @@ err_check_count (void)
 {
   int error_class = getl_interactive ? MM : FE;
 
 {
   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."));
     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)."),
     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)."),
     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;
 
   else
     return;
 
@@ -243,7 +245,7 @@ err_vmsg (const struct error *e)
   /* Describes one class of error. */
   struct error_class
     {
   /* 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. */
     };
       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. */
      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);
 
 
   ds_destroy (&msg);
 
@@ -337,13 +339,20 @@ puts_stdout (const char *s)
   puts (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)
 /* 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
 }
 
 /* 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;
   
   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. */
 
   /* 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;
 
     if (*cp == '"')
       quote ^= 1;
 
@@ -430,44 +440,71 @@ dump_message (char *msg, unsigned indent, void (*func) (const char *),
     *cp = c;
   }
 
     *cp = c;
   }
 
+
   /* Repeat above procedure for remaining lines. */
   for (;;)
     {
   /* Repeat above procedure for remaining lines. */
   for (;;)
     {
+      static int hard_break=0;
+
+      int idx=0;
       char *cp2;
 
       /* Advance past whitespace. */
       char *cp2;
 
       /* Advance past whitespace. */
-      while (isspace ((unsigned char) *cp))
+      if (! hard_break ) 
+       while ( isspace ((unsigned char) *cp) )
+         cp++;
+      else
        cp++;
        cp++;
+
       if (*cp == 0)
       if (*cp == 0)
-       break;
+         break; 
+
 
       /* Advance WIDTH - INDENT characters. */
 
       /* 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 (*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;
 
       /* 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--)
               cp2--)
+         {
+
            if (*cp2 == '"')
              quote ^= 1;
            if (*cp2 == '"')
              quote ^= 1;
+         }
 
        if (w == width - indent
            && (unsigned) (cp2 - cp) <= (width - indent) * BREAK_LONG_WORD)
 
        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;
       }
 
            if (*cp2 == '"')
              quote ^= 1;
       }
 
+      
       /* Write out the line. */
       /* Write out the line. */
+
       memset (buf, ' ', indent);
       memcpy (&buf[indent], cp, cp2 - cp);
       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;
     }
 
       cp = cp2;
     }
 
index c9f0b62ecc9247455631e1b45014ee3132c9ddd2..a56918f334c4686443c0028843233798ae66d0ab 100644 (file)
@@ -695,7 +695,7 @@ fn_open (const char *fn, const char *mode)
 #ifdef unix
   if (fn[0] == '|')
     {
 #ifdef unix
   if (fn[0] == '|')
     {
-      if (set_safer)
+      if (safer_mode())
        return safety_violation (fn);
 
       return popen (&fn[1], 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;
 
       char *s;
       FILE *f;
 
-      if (set_safer)
+      if (safer_mode())
        return safety_violation (fn);
       
       s = local_alloc (strlen (fn));
        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;
 
   /* 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)
   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)
 {
 static int
 trim_dictionary (struct dictionary *dict, int *options)
 {
-  if (set_scompression)
+  if (get_scompression())
     *options |= GTSV_OPT_COMPRESSED;
 
   if (*options & GTSV_OPT_SAVE)
     *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 */
 
 #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
 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 (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++;
        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:
   switch (getl_prompt)
     {
     case GETL_PRPT_STANDARD:
-      prompt = set_prompt;
+      prompt = get_prompt();
       break;
 
     case GETL_PRPT_CONTINUATION:
       break;
 
     case GETL_PRPT_CONTINUATION:
-      prompt = set_cprompt;
+      prompt = get_cprompt();
       break;
 
     case GETL_PRPT_DATA:
       break;
 
     case GETL_PRPT_DATA:
-      prompt = set_dprompt;
+      prompt = get_dprompt();
       break;
 
     default:
       break;
 
     default:
@@ -472,7 +474,7 @@ read_console (void)
   err_error_count = err_warning_count = 0;
   err_already_flagged = 0;
 
   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;
   ds_clear (&getl_buf);
   if (ds_getline (&getl_buf, stdin))
     return 1;
index 60da1fffd3b2e54e2a6995de86fafcc833b14c01..61c70b46c2e5efbc34e7cce5e62b1a2b6472af72 100644 (file)
 #endif
 #endif
 
 #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>
 #if HAVE_LIBHISTORY
 #if HAVE_READLINE_HISTORY_H
 #include <readline/history.h>
@@ -120,9 +111,6 @@ int logging;
 
 static void get_date (void);
 
 
 static void get_date (void);
 
-#if HAVE_LIBTERMCAP
-static char term_buffer[16384];
-#endif
 
 void
 init_glob (int argc UNUSED, char **argv)
 
 void
 init_glob (int argc UNUSED, char **argv)
@@ -137,10 +125,6 @@ init_glob (int argc UNUSED, char **argv)
   textdomain (PACKAGE);
 #endif /* ENABLE_NLS */
 
   textdomain (PACKAGE);
 #endif /* ENABLE_NLS */
 
-  /* Workable defaults before we determine the real terminal size. */
-  set_viewwidth = 79;
-  set_viewlength = 24;
-
   fn_init ();
   getl_initialize ();
 
   fn_init ();
   getl_initialize ();
 
@@ -184,111 +168,8 @@ init_glob (int argc UNUSED, char **argv)
     cur_proc = NULL;
   }
 
     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;
 
   /* log.h */
   logging = 1;
index a3b43a96f63b33d0151c8efa32df3569ba64f018..5b1b39415393548b4619dc16873a09bfaa28c48f 100644 (file)
@@ -794,12 +794,12 @@ lex_preprocess_line (void)
       len--;
 
     /* Check for and remove terminal dot. */
       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--;
       }
       {
        dot = 1;
        len--;
       }
-    else if (len == 0 && set_nullline)
+    else if (len == 0 && get_nullline() )
       dot = 1;
     else
       dot = 0;
       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->flags == 0)
     {
       two->pass++;
-      if (two->pass > set_mxloops)
+      if (two->pass > get_mxloops() )
          return two->loop_term;
     }
 
          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++)
     {
 
   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');
        {
          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. */
 
 /* 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 *);
 
 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"))
     {
       return d->value;
   if (!strcmp (key, "viewwidth"))
     {
-      sprintf (buf, "%d", set_viewwidth);
+      sprintf (buf, "%d", get_viewwidth());
       return buf;
     }
   else if (!strcmp (key, "viewlength"))
     {
       return buf;
     }
   else if (!strcmp (key, "viewlength"))
     {
-      sprintf (buf, "%d", set_viewlength);
+      sprintf (buf, "%d", get_viewlength());
       return buf;
     }
   else
       return buf;
     }
   else
@@ -455,7 +455,7 @@ outp_done (void)
 void
 outp_list_classes (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"));
   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");
       if ((int) strlen (c->class->name) + 1 > width)
        {
          printf ("\n\t");
-         width = set_viewwidth - 8;
+         width = get_viewwidth() - 8;
        }
       else
        putc (' ', stdout);
        }
       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;
 }
 
   return iter;
 }
 
-#if DEBUGGING
+#if DEBUGGING 
 /* Writes a printable representation of the current token to
    stdout. */
 void
 /* Writes a printable representation of the current token to
    stdout. */
 void
@@ -346,6 +346,9 @@ dump_token (void)
 {
   switch (token)
     {
 {
   switch (token)
     {
+    case T_TSTRING:
+      printf ("TR_STRING\t\"%s\"\n", tokstr);
+      break;
     case T_STRING:
       printf ("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);
     }
   
        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;
     {
       char *dest = tokstr;
       token = T_STRING;
@@ -403,6 +398,14 @@ lex_get (void)
        error ("Unterminated string literal.");
       cp++;
     }
        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++;
   
   else
     token = *cp++;
   
@@ -543,11 +546,22 @@ struct subcommand
     const char *prefix;                /* Prefix for variable and constant names. */
     specifier *spec;           /* Array of specifiers. */
     
     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. */
     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;
 
 /* 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->narray = 0;
   sbc->type = SBC_PLAIN;
   sbc->spec = NULL;
+  sbc->translatable = 0;
 
   if (match_token ('['))
     {
 
   if (match_token ('['))
     {
@@ -796,7 +811,29 @@ parse_subcommand (subcommand *sbc)
          sbc->type = SBC_VARLIST;
        }
       else if (match_id ("INTEGER"))
          sbc->type = SBC_VARLIST;
        }
       else if (match_id ("INTEGER"))
+       {
        sbc->type = match_id ("LIST") ? SBC_INT_LIST : SBC_INT;
        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"))
       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
 
 /* Write code to initialize all variables. */
 static void
-dump_vars_init (void)
+dump_vars_init (int persistent)
 {
   /* Loop through all the subcommands. */
   {
     subcommand *sbc;
 {
   /* 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));
     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 (-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 ();");
       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)
     {
     }
   else if (sbc->type == SBC_INT)
     {
+      dump(1, "{");
+      dump(0, "int x;");
       dump (1, "if (!lex_force_int ())");
       dump (0, "goto lossage;");
       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();");
       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)
     {
     }
   else if (sbc->type == SBC_PINT)
     {
@@ -1581,7 +1639,7 @@ dump_subcommand (const subcommand *sbc)
 
 /* Write out entire parser. */
 static void
 
 /* Write out entire parser. */
 static void
-dump_parser (void)
+dump_parser (int persistent)
 {
   int f;
 
 {
   int f;
 
@@ -1592,7 +1650,7 @@ dump_parser (void)
        make_identifier (cmdname));
   dump (1, "{");
 
        make_identifier (cmdname));
   dump (1, "{");
 
-  dump_vars_init ();
+  dump_vars_init (persistent);
 
   dump (1, "for (;;)");
   dump (1, "{");
 
   dump (1, "for (;;)");
   dump (1, "{");
@@ -1691,6 +1749,148 @@ dump_parser (void)
   dump (0, nullstr);
 }
 
   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)
 /* 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
 
 /* Write out commands to free variable state. */
 static void
-dump_free (void)
+dump_free (int persistent)
 {
   subcommand *sbc;
   int used;
 {
   subcommand *sbc;
   int used;
@@ -1722,22 +1922,32 @@ dump_free (void)
   indent = 0;
 
   used = 0;
   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, "{");
 
 
   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, "}");
 
   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 *
 /* 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;
 }
   
   return directive;
 }
   
+static void aux_parse (void);
+
 int
 main (int argc, char *argv[])
 {
 int
 main (int argc, char *argv[])
 {
@@ -1828,8 +2040,18 @@ main (int argc, char *argv[])
        dump_declarations ();
       else if (!strcmp (directive, "functions"))
        {
        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);
        }
       else
        error ("unknown directive `%s'", directive);
@@ -1840,3 +2062,33 @@ main (int argc, char *argv[])
   return EXIT_SUCCESS;
 }
 
   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;
   };
 
     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;
 /* 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);
 
   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) 
   if (t == 0 || set_seed_used)
   {
     if (set_seed == NOT_LONG) 
@@ -59,7 +84,8 @@ rng_create (void)
   }
   else
     t++;
   }
   else
     t++;
-  rng_seed (rng, &t, sizeof t);
+  */
+  rng_seed (rng, &seed, sizeof seed);
   rng->next_normal = NOT_DOUBLE;
   return rng;
 }
   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);
 
 
 struct rng *pspp_rng (void);
 
+/* Return a `random' seed by using the real time clock */
+unsigned long random_seed(void);
+
+
 #endif /* random.h */
 #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);
   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);
     {
       dot = 1;
       ds_truncate (&getl_buf, ds_length (&getl_buf) - 1);
@@ -592,7 +592,7 @@ perform_DO_REPEAT_substitutions (void)
       }
     }
   if (dot)
       }
     }
   if (dot)
-    ds_putchar (&output, (unsigned char) set_endcmd);
+    ds_putchar (&output, get_endcmd() );
 
   ds_destroy (&getl_buf);
   getl_buf = output;
 
   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 "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
 #if !USE_INTERNAL_PAGER
-char *set_pager;
+static char *set_pager=0;
 #endif /* !USE_INTERNAL_PAGER */
 #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 void set_routing (int q, int *setting);
+
 static int set_ccx (const char *cc_string, struct set_cust_currency * cc,
                    int cc_name);
 static int set_ccx (const char *cc_string, struct set_cust_currency * cc,
                    int cc_name);
-
 /* (specification)
    "SET" (stc_):
      automenu=automenu:on/off;
 /* (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;
      cce=string;
      color=custom;
      compression=compress:on/off;
-     cpi=integer;
+     cpi=integer "x>0" "%s must be greater than 0";
      cprompt=string;
      cprompt=string;
-     decimal=dec:dot/_comma;
+     decimal=dec:dot/comma;
      disk=custom;
      dprompt=string;
      echo=echo:on/off;
      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;
      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;
      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;
      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;
      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;
      tbfonts=string;
      undefined=undef:warn/nowarn;
      viewlength=custom;
-     viewwidth=integer;
+     viewwidth=custom;
      width=custom;
      workdev=custom;
      width=custom;
      workdev=custom;
-     workspace=integer;
+     workspace=integer "x>=1024" "%s must be at least 1 MB";
      xsort=xsort:yes/no.
 */
 
 /* (declarations) */
      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)
 {
 
 int
 cmd_set (void)
 {
-  struct cmd_set cmd;
 
   lex_match_id ("SET");
 
   if (!parse_set (&cmd))
     return CMD_FAILURE;
 
 
   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)
   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');
     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);
     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);
     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. */
 
   /* PC+ compatible syntax. */
-  if (cmd.scrn != -1)
+  if (cmd.sbc_screen)
     outp_enable_device (cmd.scrn == STC_OFF ? 0 : 1, OUTP_DEV_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");
     msg (SW, _("%s is obsolete."),"AUTOMENU");
-  if (cmd.beep != -1)
+  if (cmd.sbc_beep )
     msg (SW, _("%s is obsolete."),"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");
     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");
     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");
     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");
     msg (SW, _("%s is obsolete."),"PTRANSLATE");
-  if (cmd.runrev != -1)
+  if (cmd.sbc_runreview )
     msg (SW, _("%s is obsolete."),"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");
     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;
 }
 
   return CMD_SUCCESS;
 }
@@ -463,6 +503,50 @@ set_ccx (const char *cc_string, struct set_cust_currency * cc, int cc_name)
   return 1;
 }
 
   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. */
 /* 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)
     {
 {
   switch (q)
     {
-    case STC_ON:
+    case STC_OFF:
       *setting |= SET_ROUTE_DISABLE;
       break;
       *setting |= SET_ROUTE_DISABLE;
       break;
-    case STC_OFF:
+    case STC_ON:
       *setting &= ~SET_ROUTE_DISABLE;
       break;
     case STC_TERMINAL:
       *setting &= ~SET_ROUTE_DISABLE;
       break;
     case STC_TERMINAL:
@@ -570,7 +654,9 @@ stc_custom_length (struct cmd_set *cmd UNUSED)
       lex_get ();
     }
 
       lex_get ();
     }
 
-  /* FIXME: Set page length. */
+  if ( page_length != -1 ) 
+    set_viewlength = page_length;
+
   return 1;
 }
 
   return 1;
 }
 
@@ -620,7 +706,7 @@ stc_custom_seed (struct cmd_set *cmd UNUSED)
 {
   lex_match ('=');
   if (lex_match_id ("RANDOM"))
 {
   lex_match ('=');
   if (lex_match_id ("RANDOM"))
-    set_seed = NOT_LONG;
+    set_seed = random_seed();
   else
     {
       if (!lex_force_num ())
   else
     {
       if (!lex_force_num ())
@@ -628,7 +714,8 @@ stc_custom_seed (struct cmd_set *cmd UNUSED)
       set_seed = tokval;
       lex_get ();
     }
       set_seed = tokval;
       lex_get ();
     }
-  set_seed_used=1;
+  seed_flag = 1;
+
   return 1;
 }
 
   return 1;
 }
 
@@ -655,7 +742,7 @@ stc_custom_width (struct cmd_set *cmd UNUSED)
       lex_get ();
     }
 
       lex_get ();
     }
 
-  /* FIXME: Set page width. */
+  set_viewwidth = page_width;
   return 1;
 }
 
   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"))
 {
   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"))
   else if (lex_match_id ("OFF") || lex_match_id ("NO"))
-    outp_enable_device (0, OUTP_DEV_LISTING);
+    set_listing = 0;
   else
     {
       /* FIXME */
   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)
 {
 }
 
 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)
 { 
 }
 
 static int
 stc_custom_log (struct cmd_set *cmd UNUSED)
 { 
-  stc_custom_journal (cmd);
-  return 0;
+  return stc_custom_journal (cmd);
 }
 
 static int
 }
 
 static int
@@ -829,6 +916,20 @@ stc_custom_rcolor (struct cmd_set *cmd UNUSED)
   return 1;
 }
 
   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)
 {
 static int
 stc_custom_viewlength (struct cmd_set *cmd UNUSED)
 {
@@ -877,6 +978,353 @@ stc_custom_workdev (struct cmd_set *cmd UNUSED)
   return 0;
 }
 
   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
 /*
    Local Variables:
    mode: c
index 30256ae3ed4965cfb27153f9f7ffe51a66658df8..5ca015263531f8685b48ab93be4fc0a6fb4201ac 100644 (file)
 #include <stddef.h>
 #include <float.h>
 
 #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
 
 /* Describes one custom currency specification. */
 struct set_cust_currency
@@ -117,35 +114,8 @@ struct set_cust_currency
     int grouping;              /* Grouping character. */
   };
 
     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
 
 /* Types of routing. */
 enum
@@ -156,103 +126,112 @@ enum
     SET_ROUTE_DISABLE = 010    /* Disable output--overrides all other bits. */
   };
 
     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. */
 
 /* 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 */
 
 #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 <= 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);
         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 *));
                       + 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++)
     {
   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.)"),
       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;
       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 *));
   /* 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;
   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.)"),
       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 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;
 }
 
   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, ...)
 /* 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. */
 {
   /* 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;
 
 
   int avail, needed;
 
-  va_start (args, format);
   avail = st->size - st->length + 1;
   needed = vsnprintf (st->string + st->length, avail, format, args);
   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);
       
 
   if (needed >= avail)
     {
       ds_extend (st, st->length + needed);
       
-      va_start (args, format);
       vsprintf (st->string + st->length, format, args);
       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;
     }
   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);
        needed = vsnprintf (st->string + st->length, avail, format, args);
-       va_end (args);
+
       }
 
   st->length += needed;
       }
 
   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_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);
 
 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; 
   else 
     {
       info->mode = MEMORY; 
-      info->max_cases = (set_max_workspace
+      info->max_cases = (get_max_workspace()
                          / (sizeof (struct case_list) + info->case_size));
     }
 }
                          / (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."),
           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);
                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
 
 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
 
 
 $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
 --------
 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"
 
 
 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
 
 # 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
 
 
 if [ $? -ne 0 ] ; then fail ; fi
 
 
-
 activity="compare output"
 diff -b -B $TEMPDIR/pspp.list - << EOF
 ----------------------------------------------------------------------
 activity="compare output"
 diff -b -B $TEMPDIR/pspp.list - << EOF
 ----------------------------------------------------------------------
@@ -194,9919 +193,6 @@ Testing use of DATA LIST LIST.
    12.00      .        .        .   
    12.00      .        .        .   
 
    12.00      .        .        .   
    12.00      .        .        .   
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 EOF
 if [ $? -ne 0 ] ; then fail ; fi
 
 EOF
 if [ $? -ne 0 ] ; then fail ; fi