Improve the way we handle the various parsing "states". Until now
authorBen Pfaff <blp@gnu.org>
Wed, 26 Apr 2006 20:54:07 +0000 (20:54 +0000)
committerBen Pfaff <blp@gnu.org>
Wed, 26 Apr 2006 20:54:07 +0000 (20:54 +0000)
we've hard-coded the state transitions in the command definition file,
but that's error-prone and, worse, it's redundant--we can figure out
what state we're in anyhow.  We can cleanly handle INPUT PROGRAM and
FILE TYPE with a nested command-processing loop.

Improve command name completion for readline.

36 files changed:
po/en_GB.po
po/pspp.pot
src/ChangeLog
src/language/ChangeLog
src/language/command.c
src/language/command.def
src/language/command.h
src/language/control/loop.c
src/language/data-io/ChangeLog
src/language/data-io/automake.mk
src/language/data-io/data-list.c
src/language/data-io/file-type.c
src/language/data-io/file-type.h [new file with mode: 0644]
src/language/data-io/get.c
src/language/data-io/inpt-pgm.c
src/language/data-io/inpt-pgm.h [new file with mode: 0644]
src/language/dictionary/formats.c
src/language/dictionary/missing-values.c
src/language/dictionary/numeric.c
src/language/dictionary/value-labels.c
src/language/dictionary/variable-display.c
src/language/dictionary/variable-label.c
src/language/dictionary/vector.c
src/language/lexer/ChangeLog
src/language/lexer/lexer.c
src/language/lexer/lexer.h
src/language/utilities/set.q
src/language/xforms/recode.c
src/procedure.c
src/procedure.h
src/ui/terminal/ChangeLog
src/ui/terminal/automake.mk
src/ui/terminal/main.c
src/ui/terminal/read-line.c
tests/ChangeLog
tests/command/missing-values.sh

index 2828fe76eefaf1201f75f52845be585a214e69f4..7ab1299e6c45c45a1c9016336e4822b2b37e907b 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: 2006-04-04 20:32+0800\n"
+"POT-Creation-Date: 2006-04-26 13:48-0700\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"
@@ -75,216 +75,216 @@ msgstr ""
 msgid "%s: Temporary file ended unexpectedly."
 msgstr ""
 
 msgid "%s: Temporary file ended unexpectedly."
 msgstr ""
 
-#: src/data/data-in.c:61
+#: src/data/data-in.c:59
 #, c-format
 msgid "(column %d"
 msgstr ""
 
 #, c-format
 msgid "(column %d"
 msgstr ""
 
-#: src/data/data-in.c:63
+#: src/data/data-in.c:61
 #, c-format
 msgid "(columns %d-%d"
 msgstr ""
 
 #, c-format
 msgid "(columns %d-%d"
 msgstr ""
 
-#: src/data/data-in.c:64
+#: src/data/data-in.c:62
 #, c-format
 msgid ", field type %s) "
 msgstr ""
 
 #, c-format
 msgid ", field type %s) "
 msgstr ""
 
-#: src/data/data-in.c:210
+#: src/data/data-in.c:208
 msgid "Field does not form a valid floating-point constant."
 msgstr ""
 
 msgid "Field does not form a valid floating-point constant."
 msgstr ""
 
-#: src/data/data-in.c:237
+#: src/data/data-in.c:235
 msgid "Field contents followed by garbage."
 msgstr ""
 
 msgid "Field contents followed by garbage."
 msgstr ""
 
-#: src/data/data-in.c:255
+#: src/data/data-in.c:253
 msgid "Underflow in floating-point constant."
 msgstr ""
 
 msgid "Underflow in floating-point constant."
 msgstr ""
 
-#: src/data/data-in.c:266
+#: src/data/data-in.c:264
 msgid "Overflow in floating-point constant."
 msgstr ""
 
 msgid "Overflow in floating-point constant."
 msgstr ""
 
-#: src/data/data-in.c:299
+#: src/data/data-in.c:297
 msgid "All characters in field must be digits."
 msgstr ""
 
 msgid "All characters in field must be digits."
 msgstr ""
 
-#: src/data/data-in.c:323
+#: src/data/data-in.c:321
 msgid "Unrecognized character in field."
 msgstr ""
 
 msgid "Unrecognized character in field."
 msgstr ""
 
-#: src/data/data-in.c:341 src/data/data-in.c:587
+#: src/data/data-in.c:339 src/data/data-in.c:585
 msgid "Field must have even length."
 msgstr ""
 
 msgid "Field must have even length."
 msgstr ""
 
-#: src/data/data-in.c:351 src/data/data-in.c:597
+#: src/data/data-in.c:349 src/data/data-in.c:595
 msgid "Field must contain only hex digits."
 msgstr ""
 
 msgid "Field must contain only hex digits."
 msgstr ""
 
-#: src/data/data-in.c:390
+#: src/data/data-in.c:388
 #, c-format
 msgid ""
 "Quality of zoned decimal (Z) input format code is suspect.  Check your "
 "results three times. Report bugs to %s."
 msgstr ""
 
 #, c-format
 msgid ""
 "Quality of zoned decimal (Z) input format code is suspect.  Check your "
 "results three times. Report bugs to %s."
 msgstr ""
 
-#: src/data/data-in.c:402
+#: src/data/data-in.c:400
 msgid "Zoned decimal field contains fewer than 2 characters."
 msgstr ""
 
 msgid "Zoned decimal field contains fewer than 2 characters."
 msgstr ""
 
-#: src/data/data-in.c:410
+#: src/data/data-in.c:408
 msgid "Bad sign byte in zoned decimal number."
 msgstr ""
 
 msgid "Bad sign byte in zoned decimal number."
 msgstr ""
 
-#: src/data/data-in.c:430
+#: src/data/data-in.c:428
 msgid "Format error in zoned decimal number."
 msgstr ""
 
 msgid "Format error in zoned decimal number."
 msgstr ""
 
-#: src/data/data-in.c:444
+#: src/data/data-in.c:442
 msgid "Error in syntax of zoned decimal number."
 msgstr ""
 
 msgid "Error in syntax of zoned decimal number."
 msgstr ""
 
-#: src/data/data-in.c:637
+#: src/data/data-in.c:635
 msgid "Unexpected end of field."
 msgstr ""
 
 msgid "Unexpected end of field."
 msgstr ""
 
-#: src/data/data-in.c:663
+#: src/data/data-in.c:661
 msgid "Digit expected in field."
 msgstr ""
 
 msgid "Digit expected in field."
 msgstr ""
 
-#: src/data/data-in.c:688
+#: src/data/data-in.c:686
 #, c-format
 msgid "Day (%ld) must be between 1 and 31."
 msgstr ""
 
 #, c-format
 msgid "Day (%ld) must be between 1 and 31."
 msgstr ""
 
-#: src/data/data-in.c:713
+#: src/data/data-in.c:711
 msgid "Delimiter expected between fields in date."
 msgstr ""
 
 msgid "Delimiter expected between fields in date."
 msgstr ""
 
-#: src/data/data-in.c:746
+#: src/data/data-in.c:744
 #, c-format
 msgid "Parse error at `%c' expecting %s."
 msgstr ""
 
 #, c-format
 msgid "Parse error at `%c' expecting %s."
 msgstr ""
 
-#: src/data/data-in.c:760
+#: src/data/data-in.c:758
 #, c-format
 msgid "Unknown %s `%.*s'."
 msgstr ""
 
 #, c-format
 msgid "Unknown %s `%.*s'."
 msgstr ""
 
-#: src/data/data-in.c:810
+#: src/data/data-in.c:808
 #, c-format
 msgid "Month (%ld) must be between 1 and 12."
 msgstr ""
 
 #, c-format
 msgid "Month (%ld) must be between 1 and 12."
 msgstr ""
 
-#: src/data/data-in.c:814
+#: src/data/data-in.c:812
 msgid "month"
 msgstr ""
 
 msgid "month"
 msgstr ""
 
-#: src/data/data-in.c:828
+#: src/data/data-in.c:826
 #, c-format
 msgid "Year (%ld) must be between 1582 and 19999."
 msgstr ""
 
 #, c-format
 msgid "Year (%ld) must be between 1582 and 19999."
 msgstr ""
 
-#: src/data/data-in.c:839
+#: src/data/data-in.c:837
 #, c-format
 msgid "Trailing garbage \"%s\" following date."
 msgstr ""
 
 #, c-format
 msgid "Trailing garbage \"%s\" following date."
 msgstr ""
 
-#: src/data/data-in.c:854
+#: src/data/data-in.c:852
 #, c-format
 msgid "Julian day (%d) must be between 1 and 366."
 msgstr ""
 
 #, c-format
 msgid "Julian day (%d) must be between 1 and 366."
 msgstr ""
 
-#: src/data/data-in.c:866
+#: src/data/data-in.c:864
 #, c-format
 msgid "Year (%d) must be between 1582 and 19999."
 msgstr ""
 
 #, c-format
 msgid "Year (%d) must be between 1582 and 19999."
 msgstr ""
 
-#: src/data/data-in.c:882
+#: src/data/data-in.c:880
 #, c-format
 msgid "Quarter (%ld) must be between 1 and 4."
 msgstr ""
 
 #, c-format
 msgid "Quarter (%ld) must be between 1 and 4."
 msgstr ""
 
-#: src/data/data-in.c:892
+#: src/data/data-in.c:890
 msgid "`Q' expected between quarter and year."
 msgstr ""
 
 msgid "`Q' expected between quarter and year."
 msgstr ""
 
-#: src/data/data-in.c:908
+#: src/data/data-in.c:906
 #, c-format
 msgid "Week (%ld) must be between 1 and 53."
 msgstr ""
 
 #, c-format
 msgid "Week (%ld) must be between 1 and 53."
 msgstr ""
 
-#: src/data/data-in.c:920
+#: src/data/data-in.c:918
 msgid "`WK' expected between week and year."
 msgstr ""
 
 msgid "`WK' expected between week and year."
 msgstr ""
 
-#: src/data/data-in.c:943
+#: src/data/data-in.c:941
 msgid "Delimiter expected between fields in time."
 msgstr ""
 
 msgid "Delimiter expected between fields in time."
 msgstr ""
 
-#: src/data/data-in.c:955
+#: src/data/data-in.c:953
 #, c-format
 msgid "Hour (%ld) must be positive."
 msgstr ""
 
 #, c-format
 msgid "Hour (%ld) must be positive."
 msgstr ""
 
-#: src/data/data-in.c:967
+#: src/data/data-in.c:965
 #, c-format
 msgid "Minute (%ld) must be between 0 and 59."
 msgstr ""
 
 #, c-format
 msgid "Minute (%ld) must be between 0 and 59."
 msgstr ""
 
-#: src/data/data-in.c:1014
+#: src/data/data-in.c:1012
 #, c-format
 msgid "Hour (%ld) must be between 0 and 23."
 msgstr ""
 
 #, c-format
 msgid "Hour (%ld) must be between 0 and 23."
 msgstr ""
 
-#: src/data/data-in.c:1042
+#: src/data/data-in.c:1040
 msgid "weekday"
 msgstr ""
 
 msgid "weekday"
 msgstr ""
 
-#: src/data/data-in.c:1373
+#: src/data/data-in.c:1371
 #, c-format
 msgid "Field too long (%d characters).  Truncated after character %d."
 msgstr ""
 
 #, c-format
 msgid "Field too long (%d characters).  Truncated after character %d."
 msgstr ""
 
-#: src/data/data-out.c:247
+#: src/data/data-out.c:245
 msgid ""
 "The N output format cannot be used to output a negative number or the system-"
 "missing value."
 msgstr ""
 
 msgid ""
 "The N output format cannot be used to output a negative number or the system-"
 "missing value."
 msgstr ""
 
-#: src/data/data-out.c:361
+#: src/data/data-out.c:359
 #, c-format
 msgid ""
 "Quality of zoned decimal (Z) output format code is suspect.  Check your "
 "results. Report bugs to %s."
 msgstr ""
 
 #, c-format
 msgid ""
 "Quality of zoned decimal (Z) output format code is suspect.  Check your "
 "results. Report bugs to %s."
 msgstr ""
 
-#: src/data/data-out.c:369
+#: src/data/data-out.c:367
 msgid "The system-missing value cannot be output as a zoned decimal number."
 msgstr ""
 
 msgid "The system-missing value cannot be output as a zoned decimal number."
 msgstr ""
 
-#: src/data/data-out.c:382
+#: src/data/data-out.c:380
 #, c-format
 msgid "Number %g too big to fit in field with format Z%d.%d."
 msgstr ""
 
 #, c-format
 msgid "Number %g too big to fit in field with format Z%d.%d."
 msgstr ""
 
-#: src/data/data-out.c:776
+#: src/data/data-out.c:774
 #, c-format
 msgid "Time value %g too large in magnitude to convert to alphanumeric time."
 msgstr ""
 
 #, c-format
 msgid "Time value %g too large in magnitude to convert to alphanumeric time."
 msgstr ""
 
-#: src/data/data-out.c:827
+#: src/data/data-out.c:825
 #, c-format
 msgid "Weekday index %f does not lie between 1 and 7."
 msgstr ""
 
 #, c-format
 msgid "Weekday index %f does not lie between 1 and 7."
 msgstr ""
 
-#: src/data/data-out.c:847
+#: src/data/data-out.c:845
 #, c-format
 msgid "Month index %f does not lie between 1 and 12."
 msgstr ""
 
 #, c-format
 msgid "Month index %f does not lie between 1 and 12."
 msgstr ""
 
-#: src/data/data-out.c:960
+#: src/data/data-out.c:958
 #, c-format
 msgid ""
 "Year %d cannot be represented in four digits for output formatting purposes."
 #, c-format
 msgid ""
 "Year %d cannot be represented in four digits for output formatting purposes."
@@ -311,21 +311,21 @@ msgstr ""
 msgid "Can't re-open %s as a %s for %s."
 msgstr ""
 
 msgid "Can't re-open %s as a %s for %s."
 msgstr ""
 
-#: src/data/filename.c:253
+#: src/data/file-name.c:236
 #, c-format
 #, c-format
-msgid "Searching for `%s'..."
+msgid "searching for \"%s\" in path \"%s\""
 msgstr ""
 
 msgstr ""
 
-#: src/data/filename.c:261 src/data/filename.c:293
-msgid "Search unsuccessful!"
+#: src/data/file-name.c:263
+#, c-format
+msgid "...found \"%s\""
 msgstr ""
 
 msgstr ""
 
-#: src/data/filename.c:286
-#, c-format
-msgid "Found `%s'."
+#: src/data/file-name.c:271
+msgid "...not found"
 msgstr ""
 
 msgstr ""
 
-#: src/data/filename.c:703
+#: src/data/file-name.c:624
 #, c-format
 msgid "Not opening pipe file `%s' because SAFER option set."
 msgstr ""
 #, c-format
 msgid "Not opening pipe file `%s' because SAFER option set."
 msgstr ""
@@ -387,30 +387,30 @@ msgid "%s variables are not compatible with %s format %s."
 msgstr ""
 
 #: src/data/format.c:197 src/data/por-file-reader.c:481
 msgstr ""
 
 #: src/data/format.c:197 src/data/por-file-reader.c:481
-#: src/data/sys-file-reader.c:994 src/data/sys-file-reader.c:1003
+#: src/data/sys-file-reader.c:997 src/data/sys-file-reader.c:1006
 #: src/ui/gui/psppire-var-store.c:435
 msgid "String"
 msgstr ""
 
 #: src/data/format.c:197 src/data/por-file-reader.c:481
 #: src/ui/gui/psppire-var-store.c:435
 msgid "String"
 msgstr ""
 
 #: src/data/format.c:197 src/data/por-file-reader.c:481
-#: src/data/sys-file-reader.c:994 src/data/sys-file-reader.c:1003
+#: src/data/sys-file-reader.c:997 src/data/sys-file-reader.c:1006
 #: src/ui/gui/psppire-var-store.c:428
 msgid "Numeric"
 msgstr ""
 
 #: src/ui/gui/psppire-var-store.c:428
 msgid "Numeric"
 msgstr ""
 
-#: src/data/format.c:198 src/data/sys-file-reader.c:996
-#: src/data/sys-file-reader.c:1141 src/data/sys-file-reader.c:1142
-#: src/data/variable.c:41 src/language/dictionary/apply-dictionary.c:74
-#: src/language/dictionary/apply-dictionary.c:75
+#: src/data/format.c:198 src/data/sys-file-reader.c:999
+#: src/data/sys-file-reader.c:1144 src/data/sys-file-reader.c:1145
+#: src/data/variable.c:41 src/language/dictionary/apply-dictionary.c:73
+#: src/language/dictionary/apply-dictionary.c:74
 #: src/language/xforms/recode.c:465 src/language/xforms/recode.c:466
 msgid "numeric"
 msgstr ""
 
 #: src/language/xforms/recode.c:465 src/language/xforms/recode.c:466
 msgid "numeric"
 msgstr ""
 
-#: src/data/format.c:198 src/data/sys-file-reader.c:996
-#: src/data/sys-file-reader.c:1141 src/data/sys-file-reader.c:1142
+#: src/data/format.c:198 src/data/sys-file-reader.c:999
+#: src/data/sys-file-reader.c:1144 src/data/sys-file-reader.c:1145
 #: src/data/variable.c:41 src/data/variable.c:49
 #: src/data/variable.c:41 src/data/variable.c:49
+#: src/language/dictionary/apply-dictionary.c:73
 #: src/language/dictionary/apply-dictionary.c:74
 #: src/language/dictionary/apply-dictionary.c:74
-#: src/language/dictionary/apply-dictionary.c:75
 #: src/language/xforms/recode.c:465 src/language/xforms/recode.c:466
 msgid "string"
 msgstr ""
 #: src/language/xforms/recode.c:465 src/language/xforms/recode.c:466
 msgid "string"
 msgstr ""
@@ -430,7 +430,7 @@ msgstr ""
 msgid "%s: Creating file: %s."
 msgstr ""
 
 msgid "%s: Creating file: %s."
 msgstr ""
 
-#: src/data/por-file-reader.c:100
+#: src/data/por-file-reader.c:93
 #, c-format
 msgid "portable file %s corrupt at offset %ld: "
 msgstr ""
 #, c-format
 msgid "portable file %s corrupt at offset %ld: "
 msgstr ""
@@ -477,12 +477,12 @@ msgstr ""
 msgid "Bad time string length %d."
 msgstr ""
 
 msgid "Bad time string length %d."
 msgstr ""
 
-#: src/data/por-file-reader.c:473 src/data/sys-file-reader.c:986
+#: src/data/por-file-reader.c:473 src/data/sys-file-reader.c:989
 #, c-format
 msgid "%s: Bad format specifier byte (%d)."
 msgstr ""
 
 #, c-format
 msgid "%s: Bad format specifier byte (%d)."
 msgstr ""
 
-#: src/data/por-file-reader.c:480 src/data/sys-file-reader.c:1002
+#: src/data/por-file-reader.c:480 src/data/sys-file-reader.c:1005
 #, c-format
 msgid "%s variable %s has invalid format specifier %s."
 msgstr ""
 #, c-format
 msgid "%s variable %s has invalid format specifier %s."
 msgstr ""
@@ -547,18 +547,18 @@ msgstr ""
 msgid "Duplicate label for value `%.*s' for variable %s."
 msgstr ""
 
 msgid "Duplicate label for value `%.*s' for variable %s."
 msgstr ""
 
-#: src/data/por-file-writer.c:145
+#: src/data/por-file-writer.c:143
 #, c-format
 msgid "Invalid decimal digits count %d.  Treating as %d."
 msgstr ""
 
 #, c-format
 msgid "Invalid decimal digits count %d.  Treating as %d."
 msgstr ""
 
-#: src/data/por-file-writer.c:165
+#: src/data/por-file-writer.c:163
 #, c-format
 msgid ""
 "An error occurred while opening \"%s\" for writing as a portable file: %s."
 msgstr ""
 
 #, c-format
 msgid ""
 "An error occurred while opening \"%s\" for writing as a portable file: %s."
 msgstr ""
 
-#: src/data/por-file-writer.c:449
+#: src/data/por-file-writer.c:447
 #, c-format
 msgid "An I/O error occurred writing portable file \"%s\"."
 msgstr ""
 #, c-format
 msgid "An I/O error occurred writing portable file \"%s\"."
 msgstr ""
@@ -575,135 +575,135 @@ msgstr ""
 msgid "Could not access definition for terminal `%s'."
 msgstr ""
 
 msgid "Could not access definition for terminal `%s'."
 msgstr ""
 
-#: src/data/sys-file-reader.c:134
+#: src/data/sys-file-reader.c:130
 msgid "corrupt system file: "
 msgstr ""
 
 msgid "corrupt system file: "
 msgstr ""
 
-#: src/data/sys-file-reader.c:151
+#: src/data/sys-file-reader.c:154
 #, c-format
 msgid "%s: Closing system file: %s."
 msgstr ""
 
 #, c-format
 msgid "%s: Closing system file: %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:242
+#: src/data/sys-file-reader.c:245
 #, c-format
 msgid ""
 "An error occurred while opening \"%s\" for reading as a system file: %s."
 msgstr ""
 
 #, c-format
 msgid ""
 "An error occurred while opening \"%s\" for reading as a system file: %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:259
+#: src/data/sys-file-reader.c:262
 #, c-format
 msgid ""
 "%s: Index of weighting variable (%d) is not between 0 and number of elements "
 "per case (%d)."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: Index of weighting variable (%d) is not between 0 and number of elements "
 "per case (%d)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:268
+#: src/data/sys-file-reader.c:271
 #, c-format
 msgid ""
 "%s: Weighting variable may not be a continuation of a long string variable."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: Weighting variable may not be a continuation of a long string variable."
 msgstr ""
 
-#: src/data/sys-file-reader.c:271
+#: src/data/sys-file-reader.c:274
 #, c-format
 msgid "%s: Weighting variable may not be a string variable."
 msgstr ""
 
 #, c-format
 msgid "%s: Weighting variable may not be a string variable."
 msgstr ""
 
-#: src/data/sys-file-reader.c:296
+#: src/data/sys-file-reader.c:299
 #, c-format
 msgid ""
 "%s: Orphaned variable index record (type 4).  Type 4 records must always "
 "immediately follow type 3 records."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: Orphaned variable index record (type 4).  Type 4 records must always "
 "immediately follow type 3 records."
 msgstr ""
 
-#: src/data/sys-file-reader.c:354
+#: src/data/sys-file-reader.c:357
 #, c-format
 msgid "%s: Invalid subrecord length. Record: 7; Subrecord: 11"
 msgstr ""
 
 #, c-format
 msgid "%s: Invalid subrecord length. Record: 7; Subrecord: 11"
 msgstr ""
 
-#: src/data/sys-file-reader.c:408
+#: src/data/sys-file-reader.c:411
 #, c-format
 msgid "%s: Trailing garbage in long variable name map."
 msgstr ""
 
 #, c-format
 msgid "%s: Trailing garbage in long variable name map."
 msgstr ""
 
-#: src/data/sys-file-reader.c:415
+#: src/data/sys-file-reader.c:418
 #, c-format
 msgid "%s: Long variable mapping to invalid variable name `%s'."
 msgstr ""
 
 #, c-format
 msgid "%s: Long variable mapping to invalid variable name `%s'."
 msgstr ""
 
-#: src/data/sys-file-reader.c:425
+#: src/data/sys-file-reader.c:428
 #, c-format
 msgid "%s: Long variable mapping for nonexistent variable %s."
 msgstr ""
 
 #, c-format
 msgid "%s: Long variable mapping for nonexistent variable %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:434
+#: src/data/sys-file-reader.c:437
 #, c-format
 msgid "%s: Duplicate long variable name `%s' within system file."
 msgstr ""
 
 #, c-format
 msgid "%s: Duplicate long variable name `%s' within system file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:461
+#: src/data/sys-file-reader.c:464
 #, c-format
 msgid "%s: Unrecognized record type 7, subtype %d encountered in system file."
 msgstr ""
 
 #, c-format
 msgid "%s: Unrecognized record type 7, subtype %d encountered in system file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:486
+#: src/data/sys-file-reader.c:489
 #, c-format
 msgid "%s: Unrecognized record type %d."
 msgstr ""
 
 #, c-format
 msgid "%s: Unrecognized record type %d."
 msgstr ""
 
-#: src/data/sys-file-reader.c:518
+#: src/data/sys-file-reader.c:521
 #, c-format
 msgid ""
 "%s: Bad size (%d) or count (%d) field on record type 7, subtype 3.\tExpected "
 "size %d, count 8."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: Bad size (%d) or count (%d) field on record type 7, subtype 3.\tExpected "
 "size %d, count 8."
 msgstr ""
 
-#: src/data/sys-file-reader.c:529
+#: src/data/sys-file-reader.c:532
 #, c-format
 msgid ""
 "%s: Floating-point representation in system file is not IEEE-754.  PSPP "
 "cannot convert between floating-point formats."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: Floating-point representation in system file is not IEEE-754.  PSPP "
 "cannot convert between floating-point formats."
 msgstr ""
 
-#: src/data/sys-file-reader.c:545
+#: src/data/sys-file-reader.c:548
 #, c-format
 msgid ""
 "%s: File-indicated endianness (%s) does not match endianness intuited from "
 "file header (%s)."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: File-indicated endianness (%s) does not match endianness intuited from "
 "file header (%s)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:548 src/data/sys-file-reader.c:549
+#: src/data/sys-file-reader.c:551 src/data/sys-file-reader.c:552
 msgid "big-endian"
 msgstr ""
 
 msgid "big-endian"
 msgstr ""
 
-#: src/data/sys-file-reader.c:548 src/data/sys-file-reader.c:549
+#: src/data/sys-file-reader.c:551 src/data/sys-file-reader.c:552
 msgid "little-endian"
 msgstr ""
 
 msgid "little-endian"
 msgstr ""
 
-#: src/data/sys-file-reader.c:550
+#: src/data/sys-file-reader.c:553
 msgid "unknown"
 msgstr ""
 
 msgid "unknown"
 msgstr ""
 
-#: src/data/sys-file-reader.c:554
+#: src/data/sys-file-reader.c:557
 #, c-format
 msgid "%s: File-indicated character representation code (%s) is not ASCII."
 msgstr ""
 
 #, c-format
 msgid "%s: File-indicated character representation code (%s) is not ASCII."
 msgstr ""
 
-#: src/data/sys-file-reader.c:558
+#: src/data/sys-file-reader.c:561
 msgid "DEC Kanji"
 msgstr ""
 
 msgid "DEC Kanji"
 msgstr ""
 
-#: src/data/sys-file-reader.c:558 src/language/dictionary/sys-file-info.c:119
+#: src/data/sys-file-reader.c:561 src/language/dictionary/sys-file-info.c:120
 msgid "Unknown"
 msgstr ""
 
 msgid "Unknown"
 msgstr ""
 
-#: src/data/sys-file-reader.c:574
+#: src/data/sys-file-reader.c:577
 #, c-format
 msgid ""
 "%s: Bad size (%d) or count (%d) field on record type 7, subtype 4.\tExpected "
 "size %d, count 8."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: Bad size (%d) or count (%d) field on record type 7, subtype 4.\tExpected "
 "size %d, count 8."
 msgstr ""
 
-#: src/data/sys-file-reader.c:589
+#: src/data/sys-file-reader.c:592
 #, c-format
 msgid ""
 "%s: File-indicated value is different from internal value for at least one "
 #, c-format
 msgid ""
 "%s: File-indicated value is different from internal value for at least one "
@@ -711,213 +711,213 @@ msgid ""
 "%g; LOWEST: %g, %g."
 msgstr ""
 
 "%g; LOWEST: %g, %g."
 msgstr ""
 
-#: src/data/sys-file-reader.c:616
+#: src/data/sys-file-reader.c:619
 #, c-format
 msgid ""
 "%s: Bad magic.  Proper system files begin with the four characters `$FL2'. "
 "This file will not be read."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: Bad magic.  Proper system files begin with the four characters `$FL2'. "
 "This file will not be read."
 msgstr ""
 
-#: src/data/sys-file-reader.c:658
+#: src/data/sys-file-reader.c:661
 #, c-format
 msgid ""
 "%s: File layout code has unexpected value %d.  Value should be 2, in big-"
 "endian or little-endian format."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: File layout code has unexpected value %d.  Value should be 2, in big-"
 "endian or little-endian format."
 msgstr ""
 
-#: src/data/sys-file-reader.c:686
+#: src/data/sys-file-reader.c:689
 #, c-format
 msgid "%s: Number of cases in file (%ld) is not between -1 and %d."
 msgstr ""
 
 #, c-format
 msgid "%s: Number of cases in file (%ld) is not between -1 and %d."
 msgstr ""
 
-#: src/data/sys-file-reader.c:691
+#: src/data/sys-file-reader.c:694
 #, c-format
 msgid "%s: Compression bias (%g) is not the usual value of 100."
 msgstr ""
 
 #, c-format
 msgid "%s: Compression bias (%g) is not the usual value of 100."
 msgstr ""
 
-#: src/data/sys-file-reader.c:816
+#: src/data/sys-file-reader.c:819
 #, c-format
 msgid ""
 "%s: position %d: String variable does not have proper number of continuation "
 "records."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: position %d: String variable does not have proper number of continuation "
 "records."
 msgstr ""
 
-#: src/data/sys-file-reader.c:827
+#: src/data/sys-file-reader.c:830
 #, c-format
 msgid "%s: position %d: Superfluous long string continuation record."
 msgstr ""
 
 #, c-format
 msgid "%s: position %d: Superfluous long string continuation record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:833
+#: src/data/sys-file-reader.c:836
 #, c-format
 msgid "%s: position %d: Bad variable type code %d."
 msgstr ""
 
 #, c-format
 msgid "%s: position %d: Bad variable type code %d."
 msgstr ""
 
-#: src/data/sys-file-reader.c:836
+#: src/data/sys-file-reader.c:839
 #, c-format
 msgid "%s: position %d: Variable label indicator field is not 0 or 1."
 msgstr ""
 
 #, c-format
 msgid "%s: position %d: Variable label indicator field is not 0 or 1."
 msgstr ""
 
-#: src/data/sys-file-reader.c:840
+#: src/data/sys-file-reader.c:843
 #, c-format
 msgid ""
 "%s: position %d: Missing value indicator field is not -3, -2, 0, 1, 2, or 3."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: position %d: Missing value indicator field is not -3, -2, 0, 1, 2, or 3."
 msgstr ""
 
-#: src/data/sys-file-reader.c:845
+#: src/data/sys-file-reader.c:848
 #, c-format
 msgid "%s: position %d: Variable name begins with invalid character."
 msgstr ""
 
 #, c-format
 msgid "%s: position %d: Variable name begins with invalid character."
 msgstr ""
 
-#: src/data/sys-file-reader.c:864
+#: src/data/sys-file-reader.c:867
 #, c-format
 msgid "%s: Invalid variable name `%s' within system file."
 msgstr ""
 
 #, c-format
 msgid "%s: Invalid variable name `%s' within system file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:870
+#: src/data/sys-file-reader.c:873
 #, c-format
 msgid "%s: Duplicate variable name `%s' within system file."
 msgstr ""
 
 #, c-format
 msgid "%s: Duplicate variable name `%s' within system file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:893
+#: src/data/sys-file-reader.c:896
 #, c-format
 msgid "%s: Variable %s indicates variable label of invalid length %d."
 msgstr ""
 
 #, c-format
 msgid "%s: Variable %s indicates variable label of invalid length %d."
 msgstr ""
 
-#: src/data/sys-file-reader.c:914
+#: src/data/sys-file-reader.c:917
 #, c-format
 msgid "%s: Long string variable %s may not have missing values."
 msgstr ""
 
 #, c-format
 msgid "%s: Long string variable %s may not have missing values."
 msgstr ""
 
-#: src/data/sys-file-reader.c:935
+#: src/data/sys-file-reader.c:938
 #, c-format
 msgid ""
 "%s: String variable %s may not have missing values specified as a range."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: String variable %s may not have missing values specified as a range."
 msgstr ""
 
-#: src/data/sys-file-reader.c:962
+#: src/data/sys-file-reader.c:965
 #, c-format
 msgid "%s: Long string continuation records omitted at end of dictionary."
 msgstr ""
 
 #, c-format
 msgid "%s: Long string continuation records omitted at end of dictionary."
 msgstr ""
 
-#: src/data/sys-file-reader.c:967
+#: src/data/sys-file-reader.c:970
 #, c-format
 msgid ""
 "%s: System file header indicates %d variable positions but %d were read from "
 "file."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: System file header indicates %d variable positions but %d were read from "
 "file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:992
+#: src/data/sys-file-reader.c:995
 #, c-format
 msgid "%s: %s variable %s has %s format specifier %s."
 msgstr ""
 
 #, c-format
 msgid "%s: %s variable %s has %s format specifier %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1045
+#: src/data/sys-file-reader.c:1048
 #, c-format
 msgid "%s: Invalid number of labels: %d.  Ignoring labels."
 msgstr ""
 
 #, c-format
 msgid "%s: Invalid number of labels: %d.  Ignoring labels."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1087
+#: src/data/sys-file-reader.c:1090
 #, c-format
 msgid ""
 "%s: Variable index record (type 4) does not immediately follow value label "
 "record (type 3) as it should."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: Variable index record (type 4) does not immediately follow value label "
 "record (type 3) as it should."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1098
+#: src/data/sys-file-reader.c:1101
 #, c-format
 msgid ""
 "%s: Number of variables associated with a value label (%d) is not between 1 "
 "and the number of variables (%d)."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: Number of variables associated with a value label (%d) is not between 1 "
 "and the number of variables (%d)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1114
+#: src/data/sys-file-reader.c:1117
 #, c-format
 msgid ""
 "%s: Variable index associated with value label (%d) is not between 1 and the "
 "number of values (%d)."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: Variable index associated with value label (%d) is not between 1 and the "
 "number of values (%d)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1121
+#: src/data/sys-file-reader.c:1124
 #, c-format
 msgid ""
 "%s: Variable index associated with value label (%d) refers to a continuation "
 "of a string variable, not to an actual variable."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: Variable index associated with value label (%d) refers to a continuation "
 "of a string variable, not to an actual variable."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1126
+#: src/data/sys-file-reader.c:1129
 #, c-format
 msgid "%s: Value labels are not allowed on long string variables (%s)."
 msgstr ""
 
 #, c-format
 msgid "%s: Value labels are not allowed on long string variables (%s)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1137
+#: src/data/sys-file-reader.c:1140
 #, c-format
 msgid ""
 "%s: Variables associated with value label are not all of identical type.  "
 "Variable %s has %s type, but variable %s has %s type."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: Variables associated with value label are not all of identical type.  "
 "Variable %s has %s type, but variable %s has %s type."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1178
+#: src/data/sys-file-reader.c:1181
 #, c-format
 msgid "%s: File contains duplicate label for value %g for variable %s."
 msgstr ""
 
 #, c-format
 msgid "%s: File contains duplicate label for value %g for variable %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1182
+#: src/data/sys-file-reader.c:1185
 #, c-format
 msgid "%s: File contains duplicate label for value `%.*s' for variable %s."
 msgstr ""
 
 #, c-format
 msgid "%s: File contains duplicate label for value `%.*s' for variable %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1224 src/data/sys-file-reader.c:1507
+#: src/data/sys-file-reader.c:1227 src/data/sys-file-reader.c:1510
 #, c-format
 msgid "%s: Reading system file: %s."
 msgstr ""
 
 #, c-format
 msgid "%s: Reading system file: %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1227 src/data/sys-file-reader.c:1345
-#: src/data/sys-file-reader.c:1386
+#: src/data/sys-file-reader.c:1230 src/data/sys-file-reader.c:1348
+#: src/data/sys-file-reader.c:1389
 #, c-format
 msgid "%s: Unexpected end of file."
 msgstr ""
 
 #, c-format
 msgid "%s: Unexpected end of file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1243
+#: src/data/sys-file-reader.c:1246
 #, c-format
 msgid "%s: Seeking system file: %s."
 msgstr ""
 
 #, c-format
 msgid "%s: Seeking system file: %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1258
+#: src/data/sys-file-reader.c:1261
 #, c-format
 msgid "%s: System file contains multiple type 6 (document) records."
 msgstr ""
 
 #, c-format
 msgid "%s: System file contains multiple type 6 (document) records."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1264
+#: src/data/sys-file-reader.c:1267
 #, c-format
 msgid "%s: Number of document lines (%ld) must be greater than 0."
 msgstr ""
 
 #, c-format
 msgid "%s: Number of document lines (%ld) must be greater than 0."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1298
+#: src/data/sys-file-reader.c:1301
 #, c-format
 msgid "%s: Error reading file: %s."
 msgstr ""
 
 #, c-format
 msgid "%s: Error reading file: %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1337
+#: src/data/sys-file-reader.c:1340
 #, c-format
 msgid "%s: Compressed data is corrupted.  Data ends in partial case."
 msgstr ""
 
 #, c-format
 msgid "%s: Compressed data is corrupted.  Data ends in partial case."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1513
+#: src/data/sys-file-reader.c:1516
 #, c-format
 msgid "%s: Partial record at end of system file."
 msgstr ""
 
 #, c-format
 msgid "%s: Partial record at end of system file."
 msgstr ""
 
-#: src/data/sys-file-writer.c:141
+#: src/data/sys-file-writer.c:139
 #, c-format
 msgid "Unknown system file version %d. Treating as version %d."
 msgstr ""
 
 #, c-format
 msgid "Unknown system file version %d. Treating as version %d."
 msgstr ""
 
-#: src/data/sys-file-writer.c:250
+#: src/data/sys-file-writer.c:248
 #, c-format
 msgid "Error opening \"%s\" for writing as a system file: %s."
 msgstr ""
 
 #, c-format
 msgid "Error opening \"%s\" for writing as a system file: %s."
 msgstr ""
 
-#: src/data/sys-file-writer.c:897
+#: src/data/sys-file-writer.c:895
 #, c-format
 msgid "An I/O error occurred writing system file \"%s\"."
 msgstr ""
 #, c-format
 msgid "An I/O error occurred writing system file \"%s\"."
 msgstr ""
@@ -968,83 +968,95 @@ msgstr ""
 msgid "scratch"
 msgstr ""
 
 msgid "scratch"
 msgstr ""
 
-#: src/language/command.c:141
+#: src/language/command.c:159
 #, c-format
 #, c-format
-msgid "%s not allowed inside FILE TYPE/END FILE TYPE."
+msgid "%s may be used only in testing mode."
 msgstr ""
 
 msgstr ""
 
-#: src/language/command.c:144
+#: src/language/command.c:164
 #, c-format
 #, c-format
-msgid "%s not allowed inside FILE TYPE GROUPED/END FILE TYPE."
+msgid "%s may be used only in enhanced syntax mode."
 msgstr ""
 
 msgstr ""
 
-#: src/language/command.c:147
-msgid "RECORD TYPE must be the first command inside a FILE TYPE structure."
+#: src/language/command.c:414
+msgid "expecting command name"
 msgstr ""
 
 msgstr ""
 
-#: src/language/command.c:194
-msgid "expecting command name"
+#: src/language/command.c:428
+#, c-format
+msgid "Unknown command %s."
+msgstr ""
+
+#: src/language/command.c:550
+msgid "before the active file has been defined"
+msgstr ""
+
+#: src/language/command.c:552
+msgid "after the active file has been defined"
+msgstr ""
+
+#: src/language/command.c:554
+msgid "inside INPUT PROGRAM"
+msgstr ""
+
+#: src/language/command.c:556
+msgid "inside FILE TYPE"
 msgstr ""
 
 msgstr ""
 
-#: src/language/command.c:204 src/language/expressions/parse.c:1222
-#: src/ui/terminal/command-line.c:125 src/ui/terminal/command-line.c:144
-#: src/ui/terminal/command-line.c:156
+#: src/language/command.c:561
 #, c-format
 #, c-format
-msgid "%s is not yet implemented."
+msgid "%s or %s"
 msgstr ""
 
 msgstr ""
 
-#: src/language/command.c:223
+#: src/language/command.c:563
 #, c-format
 #, c-format
-msgid ""
-"%s is not allowed (1) before a command to specify the input program, such as "
-"DATA LIST, (2) between FILE TYPE and END FILE TYPE, (3) between INPUT "
-"PROGRAM and END INPUT PROGRAM."
+msgid "%s, %s, or %s"
 msgstr ""
 
 msgstr ""
 
-#: src/language/command.c:227
+#: src/language/command.c:567
 #, c-format
 #, c-format
-msgid "%s is not allowed within an input program."
+msgid "%s is allowed only %s."
 msgstr ""
 
 msgstr ""
 
-#: src/language/command.c:228 src/language/command.c:229
+#: src/language/command.c:572
 #, c-format
 #, c-format
-msgid "%s is only allowed within an input program."
+msgid "%s is not allowed inside INPUT PROGRAM."
 msgstr ""
 
 msgstr ""
 
-#: src/language/command.c:504
+#: src/language/command.c:574
 #, c-format
 #, c-format
-msgid "Unknown command %s."
+msgid "%s is not allowed inside FILE TYPE."
 msgstr ""
 
 msgstr ""
 
-#: src/language/command.c:645 src/language/command.c:776
+#: src/language/command.c:666 src/language/command.c:797
 #: src/language/utilities/permissions.c:102
 msgid "This command not allowed when the SAFER option is set."
 msgstr ""
 
 #: src/language/utilities/permissions.c:102
 msgid "This command not allowed when the SAFER option is set."
 msgstr ""
 
-#: src/language/command.c:657
+#: src/language/command.c:678
 #, c-format
 msgid "Error removing `%s': %s."
 msgstr ""
 
 #, c-format
 msgid "Error removing `%s': %s."
 msgstr ""
 
-#: src/language/command.c:707
+#: src/language/command.c:728
 #, c-format
 msgid "Couldn't fork: %s."
 msgstr ""
 
 #, c-format
 msgid "Couldn't fork: %s."
 msgstr ""
 
-#: src/language/command.c:749
+#: src/language/command.c:770
 #, c-format
 msgid "Error executing command: %s."
 msgstr ""
 
 #, c-format
 msgid "Error executing command: %s."
 msgstr ""
 
-#: src/language/command.c:758 src/language/data-io/matrix-data.c:534
-#: src/language/data-io/print.c:336 src/language/data-io/print.c:1051
+#: src/language/command.c:779 src/language/data-io/matrix-data.c:532
+#: src/language/data-io/print.c:336 src/language/data-io/print.c:1038
 #: src/language/dictionary/vector.c:197 src/language/lexer/lexer.c:453
 #: src/language/stats/autorecode.c:144 src/language/xforms/select-if.c:57
 #: src/language/xforms/select-if.c:137
 msgid "expecting end of command"
 msgstr ""
 
 #: src/language/dictionary/vector.c:197 src/language/lexer/lexer.c:453
 #: src/language/stats/autorecode.c:144 src/language/xforms/select-if.c:57
 #: src/language/xforms/select-if.c:137
 msgid "expecting end of command"
 msgstr ""
 
-#: src/language/command.c:797
+#: src/language/command.c:818
 msgid "No operating system support for this command."
 msgstr ""
 
 msgid "No operating system support for this command."
 msgstr ""
 
@@ -1067,28 +1079,28 @@ msgstr ""
 msgid "This command may not follow ELSE in DO IF...END IF."
 msgstr ""
 
 msgid "This command may not follow ELSE in DO IF...END IF."
 msgstr ""
 
-#: src/language/control/repeat.c:137
+#: src/language/control/repeat.c:135
 #, c-format
 msgid "Dummy variable name \"%s\" hides dictionary variable \"%s\"."
 msgstr ""
 
 #, c-format
 msgid "Dummy variable name \"%s\" hides dictionary variable \"%s\"."
 msgstr ""
 
-#: src/language/control/repeat.c:143
+#: src/language/control/repeat.c:141
 #, c-format
 msgid "Dummy variable name \"%s\" is given twice."
 msgstr ""
 
 #, c-format
 msgid "Dummy variable name \"%s\" is given twice."
 msgstr ""
 
-#: src/language/control/repeat.c:184
+#: src/language/control/repeat.c:182
 #, c-format
 msgid ""
 "Dummy variable \"%s\" had %d substitutions, so \"%s\" must also, but %d were "
 "specified."
 msgstr ""
 
 #, c-format
 msgid ""
 "Dummy variable \"%s\" had %d substitutions, so \"%s\" must also, but %d were "
 "specified."
 msgstr ""
 
-#: src/language/control/repeat.c:453
+#: src/language/control/repeat.c:451
 msgid "String expected."
 msgstr ""
 
 msgid "String expected."
 msgstr ""
 
-#: src/language/control/repeat.c:480
+#: src/language/control/repeat.c:478
 msgid "No matching DO REPEAT."
 msgstr ""
 
 msgid "No matching DO REPEAT."
 msgstr ""
 
@@ -1121,7 +1133,7 @@ msgid ""
 "fields must be listed in order of increasing record number."
 msgstr ""
 
 "fields must be listed in order of increasing record number."
 msgstr ""
 
-#: src/language/data-io/data-list.c:378 src/language/data-io/data-list.c:1727
+#: src/language/data-io/data-list.c:378 src/language/data-io/data-list.c:1729
 msgid ""
 "SPSS-like or FORTRAN-like format specification expected after variable names."
 msgstr ""
 msgid ""
 "SPSS-like or FORTRAN-like format specification expected after variable names."
 msgstr ""
@@ -1193,9 +1205,9 @@ msgstr ""
 
 #: src/language/data-io/data-list.c:783 src/language/data-io/data-list.c:901
 #: src/language/data-io/print.c:798
 
 #: src/language/data-io/data-list.c:783 src/language/data-io/data-list.c:901
 #: src/language/data-io/print.c:798
-#: src/language/dictionary/sys-file-info.c:139
-#: src/language/dictionary/sys-file-info.c:373
-#: src/language/stats/descriptives.c:887 src/procedure.c:886
+#: src/language/dictionary/sys-file-info.c:140
+#: src/language/dictionary/sys-file-info.c:374
+#: src/language/stats/descriptives.c:887 src/procedure.c:878
 msgid "Variable"
 msgstr ""
 
 msgid "Variable"
 msgstr ""
 
@@ -1247,182 +1259,182 @@ msgid ""
 "with the system-missing value or blanks, as appropriate."
 msgstr ""
 
 "with the system-missing value or blanks, as appropriate."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1390
+#: src/language/data-io/data-list.c:1392
 msgid ""
 "REPEATING DATA must use the same file as its corresponding DATA LIST or FILE "
 "TYPE."
 msgstr ""
 
 msgid ""
 "REPEATING DATA must use the same file as its corresponding DATA LIST or FILE "
 "TYPE."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1400 src/language/data-io/data-list.c:1434
-#: src/language/data-io/data-list.c:1447 src/language/data-io/data-list.c:1460
-#: src/language/data-io/data-list.c:1494
+#: src/language/data-io/data-list.c:1402 src/language/data-io/data-list.c:1436
+#: src/language/data-io/data-list.c:1449 src/language/data-io/data-list.c:1462
+#: src/language/data-io/data-list.c:1496
 #, c-format
 msgid "%s subcommand given multiple times."
 msgstr ""
 
 #, c-format
 msgid "%s subcommand given multiple times."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1423
+#: src/language/data-io/data-list.c:1425
 #, c-format
 msgid "STARTS beginning column (%d) exceeds STARTS ending column (%d)."
 msgstr ""
 
 #, c-format
 msgid "STARTS beginning column (%d) exceeds STARTS ending column (%d)."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1480
+#: src/language/data-io/data-list.c:1482
 #, c-format
 msgid "CONTINUED beginning column (%d) exceeds CONTINUED ending column (%d)."
 msgstr ""
 
 #, c-format
 msgid "CONTINUED beginning column (%d) exceeds CONTINUED ending column (%d)."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1503
+#: src/language/data-io/data-list.c:1505
 #, c-format
 msgid "ID beginning column (%ld) must be positive."
 msgstr ""
 
 #, c-format
 msgid "ID beginning column (%ld) must be positive."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1518
+#: src/language/data-io/data-list.c:1520
 #, c-format
 msgid "ID ending column (%ld) must be positive."
 msgstr ""
 
 #, c-format
 msgid "ID ending column (%ld) must be positive."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1524
+#: src/language/data-io/data-list.c:1526
 #, c-format
 msgid "ID ending column (%ld) cannot be less than ID beginning column (%d)."
 msgstr ""
 
 #, c-format
 msgid "ID ending column (%ld) cannot be less than ID beginning column (%d)."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1564
+#: src/language/data-io/data-list.c:1566
 msgid "Missing required specification STARTS."
 msgstr ""
 
 msgid "Missing required specification STARTS."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1566
+#: src/language/data-io/data-list.c:1568
 msgid "Missing required specification OCCURS."
 msgstr ""
 
 msgid "Missing required specification OCCURS."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1573
+#: src/language/data-io/data-list.c:1575
 msgid "ID specified without CONTINUED."
 msgstr ""
 
 msgid "ID specified without CONTINUED."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1584
+#: src/language/data-io/data-list.c:1586
 #, c-format
 msgid ""
 "STARTS beginning column (%d) exceeds default STARTS ending column taken from "
 "file's record width (%d)."
 msgstr ""
 
 #, c-format
 msgid ""
 "STARTS beginning column (%d) exceeds default STARTS ending column taken from "
 "file's record width (%d)."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1597
+#: src/language/data-io/data-list.c:1599
 #, c-format
 msgid ""
 "CONTINUED beginning column (%d) exceeds default CONTINUED ending column "
 "taken from file's record width (%d)."
 msgstr ""
 
 #, c-format
 msgid ""
 "CONTINUED beginning column (%d) exceeds default CONTINUED ending column "
 "taken from file's record width (%d)."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1676
+#: src/language/data-io/data-list.c:1678
 msgid "String variable not allowed here."
 msgstr ""
 
 msgid "String variable not allowed here."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1686
+#: src/language/data-io/data-list.c:1688
 #, c-format
 msgid "%s (%d) must be at least 1."
 msgstr ""
 
 #, c-format
 msgid "%s (%d) must be at least 1."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1692
+#: src/language/data-io/data-list.c:1694
 #, c-format
 msgid "Variable or integer expected for %s."
 msgstr ""
 
 #, c-format
 msgid "Variable or integer expected for %s."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1817
+#: src/language/data-io/data-list.c:1819
 #, c-format
 msgid "Encountered mismatched record ID \"%s\" expecting \"%s\"."
 msgstr ""
 
 #, c-format
 msgid "Encountered mismatched record ID \"%s\" expecting \"%s\"."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1849
+#: src/language/data-io/data-list.c:1852
 #, c-format
 msgid ""
 "Variable %s starting in column %d extends beyond physical record length of %"
 "d."
 msgstr ""
 
 #, c-format
 msgid ""
 "Variable %s starting in column %d extends beyond physical record length of %"
 "d."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1916
+#: src/language/data-io/data-list.c:1919
 #, c-format
 msgid "Invalid value %d for OCCURS."
 msgstr ""
 
 #, c-format
 msgid "Invalid value %d for OCCURS."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1922
+#: src/language/data-io/data-list.c:1925
 #, c-format
 msgid "Beginning column for STARTS (%d) must be at least 1."
 msgstr ""
 
 #, c-format
 msgid "Beginning column for STARTS (%d) must be at least 1."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1930
+#: src/language/data-io/data-list.c:1932
 #, c-format
 msgid "Ending column for STARTS (%d) is less than beginning column (%d)."
 msgstr ""
 
 #, c-format
 msgid "Ending column for STARTS (%d) is less than beginning column (%d)."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1938
+#: src/language/data-io/data-list.c:1940
 #, c-format
 msgid "Invalid value %d for LENGTH."
 msgstr ""
 
 #, c-format
 msgid "Invalid value %d for LENGTH."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1945
+#: src/language/data-io/data-list.c:1947
 #, c-format
 msgid "Beginning column for CONTINUED (%d) must be at least 1."
 msgstr ""
 
 #, c-format
 msgid "Beginning column for CONTINUED (%d) must be at least 1."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1953
+#: src/language/data-io/data-list.c:1955
 #, c-format
 msgid "Ending column for CONTINUED (%d) is less than beginning column (%d)."
 msgstr ""
 
 #, c-format
 msgid "Ending column for CONTINUED (%d) is less than beginning column (%d)."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1985
+#: src/language/data-io/data-list.c:1987
 #, c-format
 msgid ""
 "Number of repetitions specified on OCCURS (%d) exceed number of repetitions "
 "available in space on STARTS (%d), and CONTINUED not specified."
 msgstr ""
 
 #, c-format
 msgid ""
 "Number of repetitions specified on OCCURS (%d) exceed number of repetitions "
 "available in space on STARTS (%d), and CONTINUED not specified."
 msgstr ""
 
-#: src/language/data-io/data-list.c:2003
+#: src/language/data-io/data-list.c:2005
 #, c-format
 msgid "Unexpected end of file with %d repetitions remaining out of %d."
 msgstr ""
 
 #, c-format
 msgid "Unexpected end of file with %d repetitions remaining out of %d."
 msgstr ""
 
-#: src/language/data-io/data-reader.c:138
+#: src/language/data-io/data-reader.c:131
 #, c-format
 msgid "Could not open \"%s\" for reading as a data file: %s."
 msgstr ""
 
 #, c-format
 msgid "Could not open \"%s\" for reading as a data file: %s."
 msgstr ""
 
-#: src/language/data-io/data-reader.c:175
+#: src/language/data-io/data-reader.c:168
 msgid ""
 "Unexpected end-of-file while reading data in BEGIN DATA.  This probably "
 "indicates a missing or misformatted END DATA command.  END DATA must appear "
 "by itself on a single line with exactly one space between words."
 msgstr ""
 
 msgid ""
 "Unexpected end-of-file while reading data in BEGIN DATA.  This probably "
 "indicates a missing or misformatted END DATA command.  END DATA must appear "
 "by itself on a single line with exactly one space between words."
 msgstr ""
 
-#: src/language/data-io/data-reader.c:206
-#: src/language/data-io/data-reader.c:224
+#: src/language/data-io/data-reader.c:199
+#: src/language/data-io/data-reader.c:216
 #, c-format
 msgid "Error reading file %s: %s."
 msgstr ""
 
 #, c-format
 msgid "Error reading file %s: %s."
 msgstr ""
 
-#: src/language/data-io/data-reader.c:227
+#: src/language/data-io/data-reader.c:219
 #, c-format
 msgid "%s: Partial record at end of file."
 msgstr ""
 
 #, c-format
 msgid "%s: Partial record at end of file."
 msgstr ""
 
-#: src/language/data-io/data-reader.c:278
+#: src/language/data-io/data-reader.c:270
 #, c-format
 msgid "Attempt to read beyond end-of-file on file %s."
 msgstr ""
 
 #, c-format
 msgid "Attempt to read beyond end-of-file on file %s."
 msgstr ""
 
-#: src/language/data-io/data-reader.c:281
+#: src/language/data-io/data-reader.c:273
 msgid "Attempt to read beyond END DATA."
 msgstr ""
 
 msgid "Attempt to read beyond END DATA."
 msgstr ""
 
-#: src/language/data-io/data-reader.c:425
+#: src/language/data-io/data-reader.c:417
 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/language/data-io/data-writer.c:70
+#: src/language/data-io/data-writer.c:62
 #, c-format
 msgid "An error occurred while opening \"%s\" for writing as a data file: %s."
 msgstr ""
 
 #, c-format
 msgid "An error occurred while opening \"%s\" for writing as a data file: %s."
 msgstr ""
 
-#: src/language/data-io/data-writer.c:136
+#: src/language/data-io/data-writer.c:131
 #, c-format
 msgid "I/O error occurred writing data file \"%s\"."
 msgstr ""
 #, c-format
 msgid "I/O error occurred writing data file \"%s\"."
 msgstr ""
@@ -1469,159 +1481,154 @@ msgstr ""
 msgid "Handle for %s not allowed here."
 msgstr ""
 
 msgid "Handle for %s not allowed here."
 msgstr ""
 
-#: src/language/data-io/file-type.c:134
+#: src/language/data-io/file-type.c:149
 msgid "MIXED, GROUPED, or NESTED expected."
 msgstr ""
 
 msgid "MIXED, GROUPED, or NESTED expected."
 msgstr ""
 
-#: src/language/data-io/file-type.c:157
+#: src/language/data-io/file-type.c:172
 msgid "The CASE subcommand is not valid on FILE TYPE MIXED."
 msgstr ""
 
 msgid "The CASE subcommand is not valid on FILE TYPE MIXED."
 msgstr ""
 
-#: src/language/data-io/file-type.c:175
+#: src/language/data-io/file-type.c:190
 msgid "WARN or NOWARN expected after WILD."
 msgstr ""
 
 msgid "WARN or NOWARN expected after WILD."
 msgstr ""
 
-#: src/language/data-io/file-type.c:183
+#: src/language/data-io/file-type.c:198
 msgid "The DUPLICATE subcommand is not valid on FILE TYPE MIXED."
 msgstr ""
 
 msgid "The DUPLICATE subcommand is not valid on FILE TYPE MIXED."
 msgstr ""
 
-#: src/language/data-io/file-type.c:197
+#: src/language/data-io/file-type.c:212
 msgid "DUPLICATE=CASE is only valid on FILE TYPE NESTED."
 msgstr ""
 
 msgid "DUPLICATE=CASE is only valid on FILE TYPE NESTED."
 msgstr ""
 
-#: src/language/data-io/file-type.c:206
+#: src/language/data-io/file-type.c:221
 #, c-format
 msgid "WARN%s expected after DUPLICATE."
 msgstr ""
 
 #, c-format
 msgid "WARN%s expected after DUPLICATE."
 msgstr ""
 
-#: src/language/data-io/file-type.c:207
+#: src/language/data-io/file-type.c:222
 msgid ", NOWARN, or CASE"
 msgstr ""
 
 msgid ", NOWARN, or CASE"
 msgstr ""
 
-#: src/language/data-io/file-type.c:208
+#: src/language/data-io/file-type.c:223
 msgid " or NOWARN"
 msgstr ""
 
 msgid " or NOWARN"
 msgstr ""
 
-#: src/language/data-io/file-type.c:216
+#: src/language/data-io/file-type.c:231
 msgid "The MISSING subcommand is not valid on FILE TYPE MIXED."
 msgstr ""
 
 msgid "The MISSING subcommand is not valid on FILE TYPE MIXED."
 msgstr ""
 
-#: src/language/data-io/file-type.c:228
+#: src/language/data-io/file-type.c:243
 msgid "WARN or NOWARN after MISSING."
 msgstr ""
 
 msgid "WARN or NOWARN after MISSING."
 msgstr ""
 
-#: src/language/data-io/file-type.c:236
+#: src/language/data-io/file-type.c:251
 msgid "ORDERED is only valid on FILE TYPE GROUPED."
 msgstr ""
 
 msgid "ORDERED is only valid on FILE TYPE GROUPED."
 msgstr ""
 
-#: src/language/data-io/file-type.c:247
+#: src/language/data-io/file-type.c:262
 msgid "YES or NO expected after ORDERED."
 msgstr ""
 
 msgid "YES or NO expected after ORDERED."
 msgstr ""
 
-#: src/language/data-io/file-type.c:253 src/language/data-io/file-type.c:548
+#: src/language/data-io/file-type.c:268 src/language/data-io/file-type.c:554
 msgid "while expecting a valid subcommand"
 msgstr ""
 
 msgid "while expecting a valid subcommand"
 msgstr ""
 
-#: src/language/data-io/file-type.c:260
+#: src/language/data-io/file-type.c:275
 msgid "The required RECORD subcommand was not present."
 msgstr ""
 
 msgid "The required RECORD subcommand was not present."
 msgstr ""
 
-#: src/language/data-io/file-type.c:268
+#: src/language/data-io/file-type.c:283
 msgid "The required CASE subcommand was not present."
 msgstr ""
 
 msgid "The required CASE subcommand was not present."
 msgstr ""
 
-#: src/language/data-io/file-type.c:274
+#: src/language/data-io/file-type.c:289
 msgid "CASE and RECORD must specify different variable names."
 msgstr ""
 
 msgid "CASE and RECORD must specify different variable names."
 msgstr ""
 
-#: src/language/data-io/file-type.c:332
+#: src/language/data-io/file-type.c:347
 msgid "Column value must be positive."
 msgstr ""
 
 msgid "Column value must be positive."
 msgstr ""
 
-#: src/language/data-io/file-type.c:348
+#: src/language/data-io/file-type.c:363
 msgid "Ending column precedes beginning column."
 msgstr ""
 
 msgid "Ending column precedes beginning column."
 msgstr ""
 
-#: src/language/data-io/file-type.c:368
+#: src/language/data-io/file-type.c:383
 msgid "Bad format specifier name."
 msgstr ""
 
 msgid "Bad format specifier name."
 msgstr ""
 
-#: src/language/data-io/file-type.c:397 src/language/data-io/file-type.c:586
-msgid ""
-"This command may only appear within a FILE TYPE/END FILE TYPE structure."
-msgstr ""
-
-#: src/language/data-io/file-type.c:420
+#: src/language/data-io/file-type.c:426
 msgid "OTHER may appear only on the last RECORD TYPE command."
 msgstr ""
 
 msgid "OTHER may appear only on the last RECORD TYPE command."
 msgstr ""
 
-#: src/language/data-io/file-type.c:430
+#: src/language/data-io/file-type.c:436
 msgid "No input commands (DATA LIST, REPEATING DATA) for above RECORD TYPE."
 msgstr ""
 
 msgid "No input commands (DATA LIST, REPEATING DATA) for above RECORD TYPE."
 msgstr ""
 
-#: src/language/data-io/file-type.c:481
+#: src/language/data-io/file-type.c:487
 msgid ""
 "The CASE subcommand is not allowed on the RECORD TYPE command for FILE TYPE "
 "MIXED."
 msgstr ""
 
 msgid ""
 "The CASE subcommand is not allowed on the RECORD TYPE command for FILE TYPE "
 "MIXED."
 msgstr ""
 
-#: src/language/data-io/file-type.c:491
+#: src/language/data-io/file-type.c:497
 msgid ""
 "No variable name may be specified for the CASE subcommand on RECORD TYPE."
 msgstr ""
 
 msgid ""
 "No variable name may be specified for the CASE subcommand on RECORD TYPE."
 msgstr ""
 
-#: src/language/data-io/file-type.c:499
+#: src/language/data-io/file-type.c:505
 msgid ""
 "The CASE column specification on RECORD TYPE must give a format specifier "
 "that is the same type as that of the CASE column specification given on FILE "
 "TYPE."
 msgstr ""
 
 msgid ""
 "The CASE column specification on RECORD TYPE must give a format specifier "
 "that is the same type as that of the CASE column specification given on FILE "
 "TYPE."
 msgstr ""
 
-#: src/language/data-io/file-type.c:515
+#: src/language/data-io/file-type.c:521
 msgid "WARN or NOWARN expected on DUPLICATE subcommand."
 msgstr ""
 
 msgid "WARN or NOWARN expected on DUPLICATE subcommand."
 msgstr ""
 
-#: src/language/data-io/file-type.c:529
+#: src/language/data-io/file-type.c:535
 msgid "WARN or NOWARN expected on MISSING subcommand."
 msgstr ""
 
 msgid "WARN or NOWARN expected on MISSING subcommand."
 msgstr ""
 
-#: src/language/data-io/file-type.c:542
+#: src/language/data-io/file-type.c:548
 msgid "YES or NO expected on SPREAD subcommand."
 msgstr ""
 
 msgid "YES or NO expected on SPREAD subcommand."
 msgstr ""
 
-#: src/language/data-io/file-type.c:599
+#: src/language/data-io/file-type.c:598
 msgid "No input commands (DATA LIST, REPEATING DATA) on above RECORD TYPE."
 msgstr ""
 
 msgid "No input commands (DATA LIST, REPEATING DATA) on above RECORD TYPE."
 msgstr ""
 
-#: src/language/data-io/file-type.c:606
+#: src/language/data-io/file-type.c:605
 msgid "No commands between FILE TYPE and END FILE TYPE."
 msgstr ""
 
 msgid "No commands between FILE TYPE and END FILE TYPE."
 msgstr ""
 
-#: src/language/data-io/file-type.c:675
+#: src/language/data-io/file-type.c:674
 #, c-format
 msgid "Unknown record type \"%.*s\"."
 msgstr ""
 
 #, c-format
 msgid "Unknown record type \"%.*s\"."
 msgstr ""
 
-#: src/language/data-io/file-type.c:699
+#: src/language/data-io/file-type.c:698
 #, c-format
 msgid "Unknown record type %g."
 msgstr ""
 
 #, c-format
 msgid "Unknown record type %g."
 msgstr ""
 
-#: src/language/data-io/get.c:108
+#: src/language/data-io/get.c:106
 msgid "expecting COMM or TAPE"
 msgstr ""
 
 msgid "expecting COMM or TAPE"
 msgstr ""
 
-#: src/language/data-io/get.c:350 src/language/data-io/get.c:364
-#: src/language/data-io/get.c:389
+#: src/language/data-io/get.c:348 src/language/data-io/get.c:362
+#: src/language/data-io/get.c:387
 #, c-format
 msgid "expecting %s or %s"
 msgstr ""
 
 #, c-format
 msgid "expecting %s or %s"
 msgstr ""
 
-#: src/language/data-io/get.c:596 src/language/data-io/print.c:180
+#: src/language/data-io/get.c:594 src/language/data-io/print.c:180
 msgid "expecting a valid subcommand"
 msgstr ""
 
 msgid "expecting a valid subcommand"
 msgstr ""
 
-#: src/language/data-io/get.c:629
+#: src/language/data-io/get.c:627
 #, c-format
 msgid ""
 "Cannot rename %s as %s because there already exists a variable named %s.  To "
 #, c-format
 msgid ""
 "Cannot rename %s as %s because there already exists a variable named %s.  To "
@@ -1629,319 +1636,313 @@ msgid ""
 "as \"/RENAME (A=B)(B=C)(C=A)\", or equivalently, \"/RENAME (A B C=B C A)\"."
 msgstr ""
 
 "as \"/RENAME (A=B)(B=C)(C=A)\", or equivalently, \"/RENAME (A B C=B C A)\"."
 msgstr ""
 
-#: src/language/data-io/get.c:654
+#: src/language/data-io/get.c:652
 msgid "`=' expected after variable list."
 msgstr ""
 
 msgid "`=' expected after variable list."
 msgstr ""
 
-#: src/language/data-io/get.c:661
+#: src/language/data-io/get.c:659
 #, c-format
 msgid ""
 "Number of variables on left side of `=' (%d) does not match number of "
 "variables on right side (%d), in parenthesized group %d of RENAME subcommand."
 msgstr ""
 
 #, c-format
 msgid ""
 "Number of variables on left side of `=' (%d) does not match number of "
 "variables on right side (%d), in parenthesized group %d of RENAME subcommand."
 msgstr ""
 
-#: src/language/data-io/get.c:674
+#: src/language/data-io/get.c:672
 #, c-format
 msgid "Requested renaming duplicates variable name %s."
 msgstr ""
 
 #, c-format
 msgid "Requested renaming duplicates variable name %s."
 msgstr ""
 
-#: src/language/data-io/get.c:704
+#: src/language/data-io/get.c:702
 msgid "Cannot DROP all variables from dictionary."
 msgstr ""
 
 msgid "Cannot DROP all variables from dictionary."
 msgstr ""
 
-#: src/language/data-io/get.c:883
+#: src/language/data-io/get.c:879
 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/language/data-io/get.c:892
+#: src/language/data-io/get.c:887
 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/language/data-io/get.c:900
+#: src/language/data-io/get.c:895
 msgid ""
 "MATCH FILES may not be used after TEMPORARY when the active file is an input "
 "source.  Temporary transformations will be made permanent."
 msgstr ""
 
 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/language/data-io/get.c:938
+#: src/language/data-io/get.c:933
 msgid "Multiple IN subcommands for a single FILE or TABLE."
 msgstr ""
 
 msgid "Multiple IN subcommands for a single FILE or TABLE."
 msgstr ""
 
-#: src/language/data-io/get.c:958
+#: src/language/data-io/get.c:953
 msgid "BY may appear at most once."
 msgstr ""
 
 msgid "BY may appear at most once."
 msgstr ""
 
-#: src/language/data-io/get.c:978
+#: src/language/data-io/get.c:973
 #, c-format
 msgid "File %s lacks BY variable %s."
 msgstr ""
 
 #, c-format
 msgid "File %s lacks BY variable %s."
 msgstr ""
 
-#: src/language/data-io/get.c:992
+#: src/language/data-io/get.c:987
 msgid "FIRST may appear at most once."
 msgstr ""
 
 msgid "FIRST may appear at most once."
 msgstr ""
 
-#: src/language/data-io/get.c:1006
+#: src/language/data-io/get.c:1001
 msgid "LAST may appear at most once."
 msgstr ""
 
 msgid "LAST may appear at most once."
 msgstr ""
 
-#: src/language/data-io/get.c:1047
+#: src/language/data-io/get.c:1042
 msgid "BY is required when TABLE is specified."
 msgstr ""
 
 msgid "BY is required when TABLE is specified."
 msgstr ""
 
-#: src/language/data-io/get.c:1052
+#: src/language/data-io/get.c:1047
 msgid "BY is required when IN is specified."
 msgstr ""
 
 msgid "BY is required when IN is specified."
 msgstr ""
 
-#: src/language/data-io/get.c:1080
+#: src/language/data-io/get.c:1075
 #, c-format
 msgid "IN variable name %s duplicates an existing variable name."
 msgstr ""
 
 #, c-format
 msgid "IN variable name %s duplicates an existing variable name."
 msgstr ""
 
-#: src/language/data-io/get.c:1535
+#: src/language/data-io/get.c:1530
 #, 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/language/data-io/inpt-pgm.c:85
-msgid "No matching INPUT PROGRAM command."
+#: src/language/data-io/inpt-pgm.c:98
+msgid "Unexpected end-of-file within INPUT PROGRAM."
 msgstr ""
 
 msgstr ""
 
-#: src/language/data-io/inpt-pgm.c:90
+#: src/language/data-io/inpt-pgm.c:107
 msgid ""
 "No data-input or transformation commands specified between INPUT PROGRAM and "
 "END INPUT PROGRAM."
 msgstr ""
 
 msgid ""
 "No data-input or transformation commands specified between INPUT PROGRAM and "
 "END INPUT PROGRAM."
 msgstr ""
 
-#: src/language/data-io/inpt-pgm.c:292 src/language/data-io/inpt-pgm.c:411
-msgid ""
-"This command may only be executed between INPUT PROGRAM and END INPUT "
-"PROGRAM."
-msgstr ""
-
-#: src/language/data-io/inpt-pgm.c:336
+#: src/language/data-io/inpt-pgm.c:354
 msgid "COLUMN subcommand multiply specified."
 msgstr ""
 
 msgid "COLUMN subcommand multiply specified."
 msgstr ""
 
-#: src/language/data-io/inpt-pgm.c:384
+#: src/language/data-io/inpt-pgm.c:402
 msgid ""
 "REREAD: Column numbers must be positive finite numbers.  Column set to 1."
 msgstr ""
 
 msgid ""
 "REREAD: Column numbers must be positive finite numbers.  Column set to 1."
 msgstr ""
 
-#: src/language/data-io/list.q:151 src/language/stats/descriptives.c:356
+#: src/language/data-io/list.q:149 src/language/stats/descriptives.c:356
 msgid "No variables specified."
 msgstr ""
 
 msgid "No variables specified."
 msgstr ""
 
-#: src/language/data-io/list.q:159
+#: src/language/data-io/list.q:157
 #, c-format
 msgid ""
 "The first case (%ld) specified precedes the last case (%ld) specified.  The "
 "values will be swapped."
 msgstr ""
 
 #, c-format
 msgid ""
 "The first case (%ld) specified precedes the last case (%ld) specified.  The "
 "values will be swapped."
 msgstr ""
 
-#: src/language/data-io/list.q:167
+#: src/language/data-io/list.q:165
 #, c-format
 msgid ""
 "The first case (%ld) to list is less than 1.  The value is being reset to 1."
 msgstr ""
 
 #, c-format
 msgid ""
 "The first case (%ld) to list is less than 1.  The value is being reset to 1."
 msgstr ""
 
-#: src/language/data-io/list.q:173
+#: src/language/data-io/list.q:171
 #, c-format
 msgid ""
 "The last case (%ld) to list is less than 1.  The value is being reset to 1."
 msgstr ""
 
 #, c-format
 msgid ""
 "The last case (%ld) to list is less than 1.  The value is being reset to 1."
 msgstr ""
 
-#: src/language/data-io/list.q:179
+#: src/language/data-io/list.q:177
 #, c-format
 msgid "The step value %ld is less than 1.  The value is being reset to 1."
 msgstr ""
 
 #, c-format
 msgid "The step value %ld is less than 1.  The value is being reset to 1."
 msgstr ""
 
-#: src/language/data-io/list.q:205
+#: src/language/data-io/list.q:203
 msgid "`/FORMAT WEIGHT' specified, but weighting is not on."
 msgstr ""
 
 msgid "`/FORMAT WEIGHT' specified, but weighting is not on."
 msgstr ""
 
-#: src/language/data-io/list.q:432
+#: src/language/data-io/list.q:430
 msgid "Line"
 msgstr ""
 
 msgid "Line"
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:213
+#: src/language/data-io/matrix-data.c:211
 msgid "VARIABLES subcommand multiply specified."
 msgstr ""
 
 msgid "VARIABLES subcommand multiply specified."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:228
+#: src/language/data-io/matrix-data.c:226
 msgid "VARNAME_ cannot be explicitly specified on VARIABLES."
 msgstr ""
 
 msgid "VARNAME_ cannot be explicitly specified on VARIABLES."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:289
+#: src/language/data-io/matrix-data.c:287
 msgid "in FORMAT subcommand"
 msgstr ""
 
 msgid "in FORMAT subcommand"
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:300
+#: src/language/data-io/matrix-data.c:298
 msgid "SPLIT subcommand multiply specified."
 msgstr ""
 
 msgid "SPLIT subcommand multiply specified."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:307
+#: src/language/data-io/matrix-data.c:305
 msgid "in SPLIT subcommand"
 msgstr ""
 
 msgid "in SPLIT subcommand"
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:317
+#: src/language/data-io/matrix-data.c:315
 msgid "Split variable may not be named ROWTYPE_ or VARNAME_."
 msgstr ""
 
 msgid "Split variable may not be named ROWTYPE_ or VARNAME_."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:351
+#: src/language/data-io/matrix-data.c:349
 #, c-format
 msgid "Split variable %s is already another type."
 msgstr ""
 
 #, c-format
 msgid "Split variable %s is already another type."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:366
+#: src/language/data-io/matrix-data.c:364
 msgid "FACTORS subcommand multiply specified."
 msgstr ""
 
 msgid "FACTORS subcommand multiply specified."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:385
+#: src/language/data-io/matrix-data.c:383
 #, c-format
 msgid "Factor variable %s is already another type."
 msgstr ""
 
 #, c-format
 msgid "Factor variable %s is already another type."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:400
+#: src/language/data-io/matrix-data.c:398
 msgid "CELLS subcommand multiply specified."
 msgstr ""
 
 msgid "CELLS subcommand multiply specified."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:406
-#: src/language/data-io/matrix-data.c:425
+#: src/language/data-io/matrix-data.c:404
+#: src/language/data-io/matrix-data.c:423
 msgid "expecting positive integer"
 msgstr ""
 
 msgid "expecting positive integer"
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:419
+#: src/language/data-io/matrix-data.c:417
 msgid "N subcommand multiply specified."
 msgstr ""
 
 msgid "N subcommand multiply specified."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:440
+#: src/language/data-io/matrix-data.c:438
 msgid "CONTENTS subcommand multiply specified."
 msgstr ""
 
 msgid "CONTENTS subcommand multiply specified."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:460
+#: src/language/data-io/matrix-data.c:458
 msgid "Nested parentheses not allowed."
 msgstr ""
 
 msgid "Nested parentheses not allowed."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:470
+#: src/language/data-io/matrix-data.c:468
 msgid "Mismatched right parenthesis (`(')."
 msgstr ""
 
 msgid "Mismatched right parenthesis (`(')."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:475
+#: src/language/data-io/matrix-data.c:473
 msgid "Empty parentheses not allowed."
 msgstr ""
 
 msgid "Empty parentheses not allowed."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:488
-#: src/language/data-io/matrix-data.c:496
+#: src/language/data-io/matrix-data.c:486
+#: src/language/data-io/matrix-data.c:494
 msgid "in CONTENTS subcommand"
 msgstr ""
 
 msgid "in CONTENTS subcommand"
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:503
+#: src/language/data-io/matrix-data.c:501
 #, c-format
 msgid "Content multiply specified for %s."
 msgstr ""
 
 #, c-format
 msgid "Content multiply specified for %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:520
+#: src/language/data-io/matrix-data.c:518
 msgid "Missing right parenthesis."
 msgstr ""
 
 msgid "Missing right parenthesis."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:540
+#: src/language/data-io/matrix-data.c:538
 msgid "Missing VARIABLES subcommand."
 msgstr ""
 
 msgid "Missing VARIABLES subcommand."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:546
+#: src/language/data-io/matrix-data.c:544
 msgid ""
 "CONTENTS subcommand not specified: assuming file contains only CORR matrix."
 msgstr ""
 
 msgid ""
 "CONTENTS subcommand not specified: assuming file contains only CORR matrix."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:556
+#: src/language/data-io/matrix-data.c:554
 msgid ""
 "Missing CELLS subcommand.  CELLS is required when ROWTYPE_ is not given in "
 "the data and factors are present."
 msgstr ""
 
 msgid ""
 "Missing CELLS subcommand.  CELLS is required when ROWTYPE_ is not given in "
 "the data and factors are present."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:564
+#: src/language/data-io/matrix-data.c:562
 msgid "Split file values must be present in the data when ROWTYPE_ is present."
 msgstr ""
 
 msgid "Split file values must be present in the data when ROWTYPE_ is present."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:617
+#: src/language/data-io/matrix-data.c:615
 msgid "No continuous variables specified."
 msgstr ""
 
 msgid "No continuous variables specified."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:860
+#: src/language/data-io/matrix-data.c:858
 msgid "Scope of string exceeds line."
 msgstr ""
 
 msgid "Scope of string exceeds line."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:925
+#: src/language/data-io/matrix-data.c:923
 #, c-format
 msgid "End of line expected %s while reading %s."
 msgstr ""
 
 #, c-format
 msgid "End of line expected %s while reading %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1115
+#: src/language/data-io/matrix-data.c:1113
 #, c-format
 msgid "expecting value for %s %s"
 msgstr ""
 
 #, c-format
 msgid "expecting value for %s %s"
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1281
+#: src/language/data-io/matrix-data.c:1278
 #, c-format
 msgid "Syntax error expecting SPLIT FILE value %s."
 msgstr ""
 
 #, c-format
 msgid "Syntax error expecting SPLIT FILE value %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1290
+#: src/language/data-io/matrix-data.c:1287
 #, c-format
 msgid "Expecting value %g for %s."
 msgstr ""
 
 #, c-format
 msgid "Expecting value %g for %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1331
-#: src/language/data-io/matrix-data.c:1811
+#: src/language/data-io/matrix-data.c:1328
+#: src/language/data-io/matrix-data.c:1805
 #, c-format
 msgid "Syntax error expecting factor value %s."
 msgstr ""
 
 #, c-format
 msgid "Syntax error expecting factor value %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1340
+#: src/language/data-io/matrix-data.c:1337
 #, 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/language/data-io/matrix-data.c:1587
+#: src/language/data-io/matrix-data.c:1581
 #, c-format
 msgid "Syntax error %s expecting SPLIT FILE value."
 msgstr ""
 
 #, c-format
 msgid "Syntax error %s expecting SPLIT FILE value."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1716
+#: src/language/data-io/matrix-data.c:1710
 #, 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/language/data-io/matrix-data.c:1753
+#: src/language/data-io/matrix-data.c:1747
 #, c-format
 msgid "Multiply specified ROWTYPE_ %s."
 msgstr ""
 
 #, c-format
 msgid "Multiply specified ROWTYPE_ %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1758
+#: src/language/data-io/matrix-data.c:1752
 #, c-format
 msgid "Syntax error %s expecting ROWTYPE_ string."
 msgstr ""
 
 #, c-format
 msgid "Syntax error %s expecting ROWTYPE_ string."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1778
+#: src/language/data-io/matrix-data.c:1772
 #, c-format
 msgid "Syntax error %s."
 msgstr ""
 
 #, c-format
 msgid "Syntax error %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1929
+#: src/language/data-io/matrix-data.c:1923
 #, c-format
 msgid "Duplicate specification for %s."
 msgstr ""
 
 #, c-format
 msgid "Duplicate specification for %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1941
+#: src/language/data-io/matrix-data.c:1935
 #, 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/language/data-io/matrix-data.c:1989
+#: src/language/data-io/matrix-data.c:1981
 #, c-format
 msgid "Syntax error expecting value for %s %s."
 msgstr ""
 #, c-format
 msgid "Syntax error expecting value for %s %s."
 msgstr ""
@@ -2005,62 +2006,62 @@ msgid_plural "Writing %d records."
 msgstr[0] ""
 msgstr[1] ""
 
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/language/data-io/print.c:1091
+#: src/language/data-io/print.c:1078
 msgid "The expression on PRINT SPACE evaluated to the system-missing value."
 msgstr ""
 
 msgid "The expression on PRINT SPACE evaluated to the system-missing value."
 msgstr ""
 
-#: src/language/data-io/print.c:1094
+#: src/language/data-io/print.c:1081
 #, c-format
 msgid "The expression on PRINT SPACE evaluated to %g."
 msgstr ""
 
 #, c-format
 msgid "The expression on PRINT SPACE evaluated to %g."
 msgstr ""
 
-#: src/language/dictionary/apply-dictionary.c:71
+#: src/language/dictionary/apply-dictionary.c:70
 #, c-format
 msgid "Variable %s is %s in target file, but %s in source file."
 msgstr ""
 
 #, c-format
 msgid "Variable %s is %s in target file, but %s in source file."
 msgstr ""
 
-#: src/language/dictionary/apply-dictionary.c:87
+#: src/language/dictionary/apply-dictionary.c:86
 #, c-format
 msgid "Cannot add value labels from source file to long string variable %s."
 msgstr ""
 
 #, c-format
 msgid "Cannot add value labels from source file to long string variable %s."
 msgstr ""
 
-#: src/language/dictionary/apply-dictionary.c:133
+#: src/language/dictionary/apply-dictionary.c:132
 #, c-format
 msgid ""
 "Cannot apply missing values from source file to long string variable %s."
 msgstr ""
 
 #, c-format
 msgid ""
 "Cannot apply missing values from source file to long string variable %s."
 msgstr ""
 
-#: src/language/dictionary/apply-dictionary.c:153
+#: src/language/dictionary/apply-dictionary.c:152
 msgid "No matching variables found between the source and target files."
 msgstr ""
 
 msgid "No matching variables found between the source and target files."
 msgstr ""
 
-#: src/language/dictionary/formats.c:89
+#: src/language/dictionary/formats.c:87
 msgid "`(' expected after variable list"
 msgstr ""
 
 msgid "`(' expected after variable list"
 msgstr ""
 
-#: src/language/dictionary/formats.c:99 src/language/dictionary/numeric.c:68
-#: src/language/dictionary/numeric.c:139
+#: src/language/dictionary/formats.c:97 src/language/dictionary/numeric.c:66
+#: src/language/dictionary/numeric.c:137
 msgid "`)' expected after output format."
 msgstr ""
 
 msgid "`)' expected after output format."
 msgstr ""
 
-#: src/language/dictionary/missing-values.c:55
-#: src/language/stats/aggregate.c:432
+#: src/language/dictionary/missing-values.c:53
+#: src/language/stats/aggregate.c:434
 msgid "expecting `('"
 msgstr ""
 
 msgid "expecting `('"
 msgstr ""
 
-#: src/language/dictionary/missing-values.c:71
+#: src/language/dictionary/missing-values.c:69
 #, c-format
 msgid ""
 "Cannot mix numeric variables (e.g. %s) and string variables (e.g. %s) within "
 "a single list."
 msgstr ""
 
 #, c-format
 msgid ""
 "Cannot mix numeric variables (e.g. %s) and string variables (e.g. %s) within "
 "a single list."
 msgstr ""
 
-#: src/language/dictionary/missing-values.c:111
+#: src/language/dictionary/missing-values.c:109
 #, c-format
 msgid "Truncating missing value to short string length (%d characters)."
 msgstr ""
 
 #, c-format
 msgid "Truncating missing value to short string length (%d characters)."
 msgstr ""
 
-#: src/language/dictionary/missing-values.c:130
+#: src/language/dictionary/missing-values.c:128
 #, c-format
 msgid "Missing values provided are too long to assign to variable of width %d."
 msgstr ""
 #, c-format
 msgid "Missing values provided are too long to assign to variable of width %d."
 msgstr ""
@@ -2137,18 +2138,18 @@ msgstr ""
 msgid "`/' or `.' expected."
 msgstr ""
 
 msgid "`/' or `.' expected."
 msgstr ""
 
-#: src/language/dictionary/numeric.c:61
+#: src/language/dictionary/numeric.c:59
 #, c-format
 msgid "Format type %s may not be used with a numeric variable."
 msgstr ""
 
 #, c-format
 msgid "Format type %s may not be used with a numeric variable."
 msgstr ""
 
-#: src/language/dictionary/numeric.c:80 src/language/dictionary/numeric.c:162
+#: src/language/dictionary/numeric.c:78 src/language/dictionary/numeric.c:160
 #: src/language/dictionary/vector.c:159
 #, c-format
 msgid "There is already a variable named %s."
 msgstr ""
 
 #: src/language/dictionary/vector.c:159
 #, c-format
 msgid "There is already a variable named %s."
 msgstr ""
 
-#: src/language/dictionary/numeric.c:132
+#: src/language/dictionary/numeric.c:130
 #, c-format
 msgid "Format type %s may not be used with a string variable."
 msgstr ""
 #, c-format
 msgid "Format type %s may not be used with a string variable."
 msgstr ""
@@ -2183,179 +2184,179 @@ msgstr ""
 msgid "Renaming would duplicate variable name %s."
 msgstr ""
 
 msgid "Renaming would duplicate variable name %s."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:100
+#: src/language/dictionary/sys-file-info.c:101
 msgid "File:"
 msgstr ""
 
 msgid "File:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:102
+#: src/language/dictionary/sys-file-info.c:103
 msgid "Label:"
 msgstr ""
 
 msgid "Label:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:106
+#: src/language/dictionary/sys-file-info.c:107
 msgid "No label."
 msgstr ""
 
 msgid "No label."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:109
+#: src/language/dictionary/sys-file-info.c:110
 msgid "Created:"
 msgstr ""
 
 msgid "Created:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:112
+#: src/language/dictionary/sys-file-info.c:113
 msgid "Endian:"
 msgstr ""
 
 msgid "Endian:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:113
+#: src/language/dictionary/sys-file-info.c:114
 msgid "Big."
 msgstr ""
 
 msgid "Big."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:113
+#: src/language/dictionary/sys-file-info.c:114
 msgid "Little."
 msgstr ""
 
 msgid "Little."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:114
+#: src/language/dictionary/sys-file-info.c:115
 msgid "Variables:"
 msgstr ""
 
 msgid "Variables:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:117
+#: src/language/dictionary/sys-file-info.c:118
 msgid "Cases:"
 msgstr ""
 
 msgid "Cases:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:120
+#: src/language/dictionary/sys-file-info.c:121
 msgid "Type:"
 msgstr ""
 
 msgid "Type:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:121
+#: src/language/dictionary/sys-file-info.c:122
 msgid "System File."
 msgstr ""
 
 msgid "System File."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:122
+#: src/language/dictionary/sys-file-info.c:123
 msgid "Weight:"
 msgstr ""
 
 msgid "Weight:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:126
+#: src/language/dictionary/sys-file-info.c:127
 msgid "Not weighted."
 msgstr ""
 
 msgid "Not weighted."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:128
+#: src/language/dictionary/sys-file-info.c:129
 msgid "Mode:"
 msgstr ""
 
 msgid "Mode:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:130
+#: src/language/dictionary/sys-file-info.c:131
 #, c-format
 msgid "Compression %s."
 msgstr ""
 
 #, c-format
 msgid "Compression %s."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:130
+#: src/language/dictionary/sys-file-info.c:131
 msgid "on"
 msgstr ""
 
 msgid "on"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:130
+#: src/language/dictionary/sys-file-info.c:131
 msgid "off"
 msgstr ""
 
 msgid "off"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:140
-#: src/language/dictionary/sys-file-info.c:378
+#: src/language/dictionary/sys-file-info.c:141
+#: src/language/dictionary/sys-file-info.c:379
 msgid "Description"
 msgstr ""
 
 msgid "Description"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:141
-#: src/language/dictionary/sys-file-info.c:376
+#: src/language/dictionary/sys-file-info.c:142
+#: src/language/dictionary/sys-file-info.c:377
 msgid "Position"
 msgstr ""
 
 msgid "Position"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:199
+#: src/language/dictionary/sys-file-info.c:200
 msgid "The active file does not have a file label."
 msgstr ""
 
 msgid "The active file does not have a file label."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:202
+#: src/language/dictionary/sys-file-info.c:203
 msgid "File label:"
 msgstr ""
 
 msgid "File label:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:264
+#: src/language/dictionary/sys-file-info.c:265
 msgid "No variables to display."
 msgstr ""
 
 msgid "No variables to display."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:283
+#: src/language/dictionary/sys-file-info.c:284
 msgid "Macros not supported."
 msgstr ""
 
 msgid "Macros not supported."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:293
+#: src/language/dictionary/sys-file-info.c:294
 msgid "The active file dictionary does not contain any documents."
 msgstr ""
 
 msgid "The active file dictionary does not contain any documents."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:302
+#: src/language/dictionary/sys-file-info.c:303
 msgid "Documents in the active file:"
 msgstr ""
 
 msgid "Documents in the active file:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:380
-#: src/language/dictionary/sys-file-info.c:519 src/procedure.c:888
+#: src/language/dictionary/sys-file-info.c:381
+#: src/language/dictionary/sys-file-info.c:520 src/procedure.c:880
 #: src/ui/gui/var-sheet.c:71
 msgid "Label"
 msgstr ""
 
 #: src/ui/gui/var-sheet.c:71
 msgid "Label"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:452
+#: src/language/dictionary/sys-file-info.c:453
 #, c-format
 msgid "Format: %s"
 msgstr ""
 
 #, c-format
 msgid "Format: %s"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:459
+#: src/language/dictionary/sys-file-info.c:460
 #, c-format
 msgid "Print Format: %s"
 msgstr ""
 
 #, c-format
 msgid "Print Format: %s"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:462
+#: src/language/dictionary/sys-file-info.c:463
 #, c-format
 msgid "Write Format: %s"
 msgstr ""
 
 #, c-format
 msgid "Write Format: %s"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:474
+#: src/language/dictionary/sys-file-info.c:475
 msgid "Missing Values: "
 msgstr ""
 
 msgid "Missing Values: "
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:518
-#: src/language/stats/crosstabs.q:1111 src/language/stats/crosstabs.q:1138
-#: src/language/stats/crosstabs.q:1158 src/language/stats/crosstabs.q:1180
-#: src/language/stats/examine.q:1138 src/language/stats/frequencies.q:1146
-#: src/language/stats/frequencies.q:1267 src/procedure.c:887
+#: src/language/dictionary/sys-file-info.c:519
+#: src/language/stats/crosstabs.q:1109 src/language/stats/crosstabs.q:1136
+#: src/language/stats/crosstabs.q:1156 src/language/stats/crosstabs.q:1178
+#: src/language/stats/examine.q:1141 src/language/stats/frequencies.q:1145
+#: src/language/stats/frequencies.q:1266 src/procedure.c:879
 msgid "Value"
 msgstr ""
 
 msgid "Value"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:575
+#: src/language/dictionary/sys-file-info.c:576
 msgid "No vectors defined."
 msgstr ""
 
 msgid "No vectors defined."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:590
+#: src/language/dictionary/sys-file-info.c:591
 msgid "Vector"
 msgstr ""
 
 msgid "Vector"
 msgstr ""
 
-#: src/language/dictionary/value-labels.c:121
+#: src/language/dictionary/value-labels.c:118
 #, 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/language/dictionary/value-labels.c:157 src/language/lexer/lexer.c:590
+#: src/language/dictionary/value-labels.c:154 src/language/lexer/lexer.c:590
 msgid "expecting string"
 msgstr ""
 
 msgid "expecting string"
 msgstr ""
 
-#: src/language/dictionary/value-labels.c:166 src/language/lexer/lexer.c:604
+#: src/language/dictionary/value-labels.c:163 src/language/lexer/lexer.c:604
 msgid "expecting integer"
 msgstr ""
 
 msgid "expecting integer"
 msgstr ""
 
-#: src/language/dictionary/value-labels.c:170
+#: src/language/dictionary/value-labels.c:167
 #, c-format
 msgid "Value label `%g' is not integer."
 msgstr ""
 
 #, c-format
 msgid "Value label `%g' is not integer."
 msgstr ""
 
-#: src/language/dictionary/value-labels.c:180
+#: src/language/dictionary/value-labels.c:177
 msgid "Truncating value label to 60 characters."
 msgstr ""
 
 msgid "Truncating value label to 60 characters."
 msgstr ""
 
-#: src/language/dictionary/variable-label.c:50
+#: src/language/dictionary/variable-label.c:48
 msgid "String expected for variable label."
 msgstr ""
 
 msgid "String expected for variable label."
 msgstr ""
 
-#: src/language/dictionary/variable-label.c:56
+#: src/language/dictionary/variable-label.c:54
 msgid "Truncating variable label to 255 characters."
 msgstr ""
 
 msgid "Truncating variable label to 255 characters."
 msgstr ""
 
@@ -2402,37 +2403,37 @@ msgstr ""
 msgid "expecting number or string"
 msgstr ""
 
 msgid "expecting number or string"
 msgstr ""
 
-#: src/language/expressions/helpers.c:36
+#: src/language/expressions/helpers.c:37
 msgid ""
 "One of the arguments to a DATE function is not an integer.  The result will "
 "be system-missing."
 msgstr ""
 
 msgid ""
 "One of the arguments to a DATE function is not an integer.  The result will "
 "be system-missing."
 msgstr ""
 
-#: src/language/expressions/helpers.c:58
+#: src/language/expressions/helpers.c:59
 msgid ""
 "The week argument to DATE.WKYR is not an integer.  The result will be system-"
 "missing."
 msgstr ""
 
 msgid ""
 "The week argument to DATE.WKYR is not an integer.  The result will be system-"
 "missing."
 msgstr ""
 
-#: src/language/expressions/helpers.c:64
+#: src/language/expressions/helpers.c:65
 msgid ""
 "The week argument to DATE.WKYR is outside the acceptable range of 1 to 53.  "
 "The result will be system-missing."
 msgstr ""
 
 msgid ""
 "The week argument to DATE.WKYR is outside the acceptable range of 1 to 53.  "
 "The result will be system-missing."
 msgstr ""
 
-#: src/language/expressions/helpers.c:86
+#: src/language/expressions/helpers.c:87
 msgid ""
 "The day argument to DATE.YRDAY is not an integer.  The result will be system-"
 "missing."
 msgstr ""
 
 msgid ""
 "The day argument to DATE.YRDAY is not an integer.  The result will be system-"
 "missing."
 msgstr ""
 
-#: src/language/expressions/helpers.c:92
+#: src/language/expressions/helpers.c:93
 msgid ""
 "The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366.  "
 "The result will be system-missing."
 msgstr ""
 
 msgid ""
 "The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366.  "
 "The result will be system-missing."
 msgstr ""
 
-#: src/language/expressions/helpers.c:114
+#: src/language/expressions/helpers.c:115
 msgid ""
 "The year argument to YRMODA is greater than 47516.  The result will be "
 "system-missing."
 msgid ""
 "The year argument to YRMODA is greater than 47516.  The result will be "
 "system-missing."
@@ -2480,7 +2481,7 @@ msgstr ""
 msgid "Unknown identifier %s."
 msgstr ""
 
 msgid "Unknown identifier %s."
 msgstr ""
 
-#: src/language/expressions/parse.c:846 src/language/stats/aggregate.c:488
+#: src/language/expressions/parse.c:846 src/language/stats/aggregate.c:490
 msgid "expecting `)'"
 msgstr ""
 
 msgid "expecting `)'"
 msgstr ""
 
@@ -2548,6 +2549,12 @@ msgstr ""
 msgid "%s is a PSPP extension."
 msgstr ""
 
 msgid "%s is a PSPP extension."
 msgstr ""
 
+#: src/language/expressions/parse.c:1222 src/ui/terminal/command-line.c:126
+#: src/ui/terminal/command-line.c:145 src/ui/terminal/command-line.c:157
+#, c-format
+msgid "%s is not yet implemented."
+msgstr ""
+
 #: src/language/lexer/format-parser.c:66
 msgid "X and T format specifiers not allowed here."
 msgstr ""
 #: src/language/lexer/format-parser.c:66
 msgid "X and T format specifiers not allowed here."
 msgstr ""
@@ -2619,50 +2626,50 @@ msgstr ""
 msgid "expecting identifier"
 msgstr ""
 
 msgid "expecting identifier"
 msgstr ""
 
-#: src/language/lexer/lexer.c:842
+#: src/language/lexer/lexer.c:861
 msgid "<ERROR>"
 msgstr ""
 
 msgid "<ERROR>"
 msgstr ""
 
-#: src/language/lexer/lexer.c:988
+#: src/language/lexer/lexer.c:1007
 msgid "binary"
 msgstr ""
 
 msgid "binary"
 msgstr ""
 
-#: src/language/lexer/lexer.c:993
+#: src/language/lexer/lexer.c:1012
 msgid "octal"
 msgstr ""
 
 msgid "octal"
 msgstr ""
 
-#: src/language/lexer/lexer.c:998
+#: src/language/lexer/lexer.c:1017
 msgid "hex"
 msgstr ""
 
 msgid "hex"
 msgstr ""
 
-#: src/language/lexer/lexer.c:1008
+#: src/language/lexer/lexer.c:1027
 #, c-format
 msgid "String of %s digits has %d characters, which is not a multiple of %d."
 msgstr ""
 
 #, c-format
 msgid "String of %s digits has %d characters, which is not a multiple of %d."
 msgstr ""
 
-#: src/language/lexer/lexer.c:1037
+#: src/language/lexer/lexer.c:1056
 #, c-format
 msgid "`%c' is not a valid %s digit."
 msgstr ""
 
 #, c-format
 msgid "`%c' is not a valid %s digit."
 msgstr ""
 
-#: src/language/lexer/lexer.c:1068
+#: src/language/lexer/lexer.c:1087
 msgid "Unterminated string constant."
 msgstr ""
 
 msgid "Unterminated string constant."
 msgstr ""
 
-#: src/language/lexer/lexer.c:1122
+#: src/language/lexer/lexer.c:1141
 msgid "Unexpected end of file in string concatenation."
 msgstr ""
 
 msgid "Unexpected end of file in string concatenation."
 msgstr ""
 
-#: src/language/lexer/lexer.c:1130
+#: src/language/lexer/lexer.c:1149
 msgid "String expected following `+'."
 msgstr ""
 
 msgid "String expected following `+'."
 msgstr ""
 
-#: src/language/lexer/lexer.c:1143
+#: src/language/lexer/lexer.c:1162
 #, c-format
 msgid "String exceeds 255 characters in length (%d characters)."
 msgstr ""
 
 #, c-format
 msgid "String exceeds 255 characters in length (%d characters)."
 msgstr ""
 
-#: src/language/lexer/lexer.c:1158
+#: src/language/lexer/lexer.c:1177
 msgid ""
 "Sorry, literal strings may not contain null characters.  Replacing with "
 "spaces."
 msgid ""
 "Sorry, literal strings may not contain null characters.  Replacing with "
 "spaces."
@@ -2759,79 +2766,79 @@ msgstr ""
 msgid "Bad bounds in use of TO convention."
 msgstr ""
 
 msgid "Bad bounds in use of TO convention."
 msgstr ""
 
-#: src/language/line-buffer.c:246
+#: src/language/line-buffer.c:250
 #, 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/language/line-buffer.c:330
+#: src/language/line-buffer.c:334
 #, c-format
 msgid "Closing `%s': %s."
 msgstr ""
 
 #, c-format
 msgid "Closing `%s': %s."
 msgstr ""
 
-#: src/language/line-buffer.c:441
+#: src/language/line-buffer.c:445
 #, c-format
 #, c-format
-msgid "%s: Opening as syntax file."
+msgid "opening \"%s\" as syntax file"
 msgstr ""
 
 msgstr ""
 
-#: src/language/line-buffer.c:446
+#: src/language/line-buffer.c:450
 #, c-format
 msgid "Opening `%s': %s."
 msgstr ""
 
 #, c-format
 msgid "Opening `%s': %s."
 msgstr ""
 
-#: src/language/line-buffer.c:459
+#: src/language/line-buffer.c:463
 #, c-format
 msgid "Reading `%s': %s."
 msgstr ""
 
 #, c-format
 msgid "Reading `%s': %s."
 msgstr ""
 
-#: src/language/stats/aggregate.c:198
+#: src/language/stats/aggregate.c:200
 msgid "while expecting COLUMNWISE"
 msgstr ""
 
 msgid "while expecting COLUMNWISE"
 msgstr ""
 
-#: src/language/stats/aggregate.c:227
+#: src/language/stats/aggregate.c:229
 msgid "expecting BREAK"
 msgstr ""
 
 msgid "expecting BREAK"
 msgstr ""
 
-#: src/language/stats/aggregate.c:232
+#: src/language/stats/aggregate.c:234
 msgid ""
 "When PRESORTED is specified, specifying sorting directions with (A) or (D) "
 "has no effect.  Output data will be sorted the same way as the input data."
 msgstr ""
 
 msgid ""
 "When PRESORTED is specified, specifying sorting directions with (A) or (D) "
 "has no effect.  Output data will be sorted the same way as the input data."
 msgstr ""
 
-#: src/language/stats/aggregate.c:401
+#: src/language/stats/aggregate.c:403
 msgid "expecting aggregation function"
 msgstr ""
 
 msgid "expecting aggregation function"
 msgstr ""
 
-#: src/language/stats/aggregate.c:417
+#: src/language/stats/aggregate.c:419
 #, c-format
 msgid "Unknown aggregation function %s."
 msgstr ""
 
 #, c-format
 msgid "Unknown aggregation function %s."
 msgstr ""
 
-#: src/language/stats/aggregate.c:469
+#: src/language/stats/aggregate.c:471
 #, c-format
 msgid "Missing argument %d to %s."
 msgstr ""
 
 #, c-format
 msgid "Missing argument %d to %s."
 msgstr ""
 
-#: src/language/stats/aggregate.c:478
+#: src/language/stats/aggregate.c:480
 #, 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/language/stats/aggregate.c:500
+#: src/language/stats/aggregate.c:502
 #, c-format
 msgid ""
 "Number of source variables (%u) does not match number of target variables (%"
 "u)."
 msgstr ""
 
 #, c-format
 msgid ""
 "Number of source variables (%u) does not match number of target variables (%"
 "u)."
 msgstr ""
 
-#: src/language/stats/aggregate.c:516
+#: src/language/stats/aggregate.c:518
 #, c-format
 msgid ""
 "The value arguments passed to the %s function are out-of-order.  They will "
 "be treated as if they had been specified in the correct order."
 msgstr ""
 
 #, c-format
 msgid ""
 "The value arguments passed to the %s function are out-of-order.  They will "
 "be treated as if they had been specified in the correct order."
 msgstr ""
 
-#: src/language/stats/aggregate.c:583
+#: src/language/stats/aggregate.c:585
 #, 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 "
@@ -2853,311 +2860,311 @@ msgstr ""
 msgid "Duplicate variable name %s among target variables."
 msgstr ""
 
 msgid "Duplicate variable name %s among target variables."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:267
+#: src/language/stats/crosstabs.q:265
 msgid ""
 "Missing mode REPORT not allowed in general mode.  Assuming MISSING=TABLE."
 msgstr ""
 
 msgid ""
 "Missing mode REPORT not allowed in general mode.  Assuming MISSING=TABLE."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:277
+#: src/language/stats/crosstabs.q:275
 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/language/stats/crosstabs.q:333
+#: src/language/stats/crosstabs.q:331
 msgid "Too many crosstabulation variables or dimensions."
 msgstr ""
 
 msgid "Too many crosstabulation variables or dimensions."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:343
+#: src/language/stats/crosstabs.q:341
 msgid "expecting BY"
 msgstr ""
 
 msgid "expecting BY"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:410
+#: src/language/stats/crosstabs.q:408
 msgid "VARIABLES must be specified before TABLES."
 msgstr ""
 
 msgid "VARIABLES must be specified before TABLES."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:447
+#: src/language/stats/crosstabs.q:445
 #, 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/language/stats/crosstabs.q:812
+#: src/language/stats/crosstabs.q:810
 msgid "Summary."
 msgstr ""
 
 msgid "Summary."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:814 src/language/stats/examine.q:923
+#: src/language/stats/crosstabs.q:812 src/language/stats/examine.q:926
 msgid "Cases"
 msgstr ""
 
 msgid "Cases"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:815 src/language/stats/examine.q:857
-#: src/language/stats/frequencies.q:1144 src/language/stats/frequencies.q:1517
+#: src/language/stats/crosstabs.q:813 src/language/stats/examine.q:860
+#: src/language/stats/frequencies.q:1143 src/language/stats/frequencies.q:1516
 msgid "Valid"
 msgstr ""
 
 msgid "Valid"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:816 src/language/stats/examine.q:858
-#: src/language/stats/frequencies.q:1212 src/language/stats/frequencies.q:1518
+#: src/language/stats/crosstabs.q:814 src/language/stats/examine.q:861
+#: src/language/stats/frequencies.q:1211 src/language/stats/frequencies.q:1517
 #: src/ui/gui/var-sheet.c:73
 msgid "Missing"
 msgstr ""
 
 #: src/ui/gui/var-sheet.c:73
 msgid "Missing"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:817 src/language/stats/crosstabs.q:1020
-#: src/language/stats/crosstabs.q:1740 src/language/stats/examine.q:859
-#: src/language/stats/frequencies.q:1221 src/language/stats/oneway.q:314
-#: src/language/stats/oneway.q:478 src/language/stats/regression.q:294
+#: src/language/stats/crosstabs.q:815 src/language/stats/crosstabs.q:1018
+#: src/language/stats/crosstabs.q:1738 src/language/stats/examine.q:862
+#: src/language/stats/frequencies.q:1220 src/language/stats/oneway.q:314
+#: src/language/stats/oneway.q:478 src/language/stats/regression.q:308
 msgid "Total"
 msgstr ""
 
 msgid "Total"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:827 src/language/stats/examine.q:935
-#: src/language/stats/frequencies.q:1516 src/language/stats/oneway.q:400
+#: src/language/stats/crosstabs.q:825 src/language/stats/examine.q:938
+#: src/language/stats/frequencies.q:1515 src/language/stats/oneway.q:400
 #: src/language/stats/t-test.q:682 src/language/stats/t-test.q:705
 #: src/language/stats/t-test.q:830 src/language/stats/t-test.q:1365
 msgid "N"
 msgstr ""
 
 #: src/language/stats/t-test.q:682 src/language/stats/t-test.q:705
 #: src/language/stats/t-test.q:830 src/language/stats/t-test.q:1365
 msgid "N"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:828 src/language/stats/examine.q:938
-#: src/language/stats/frequencies.q:1148 src/language/stats/frequencies.q:1149
-#: src/language/stats/frequencies.q:1150
+#: src/language/stats/crosstabs.q:826 src/language/stats/examine.q:941
+#: src/language/stats/frequencies.q:1147 src/language/stats/frequencies.q:1148
+#: src/language/stats/frequencies.q:1149
 msgid "Percent"
 msgstr ""
 
 msgid "Percent"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1070
+#: src/language/stats/crosstabs.q:1068
 msgid "count"
 msgstr ""
 
 msgid "count"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1071
+#: src/language/stats/crosstabs.q:1069
 msgid "row %"
 msgstr ""
 
 msgid "row %"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1072
+#: src/language/stats/crosstabs.q:1070
 msgid "column %"
 msgstr ""
 
 msgid "column %"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1073
+#: src/language/stats/crosstabs.q:1071
 msgid "total %"
 msgstr ""
 
 msgid "total %"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1074
+#: src/language/stats/crosstabs.q:1072
 msgid "expected"
 msgstr ""
 
 msgid "expected"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1075
+#: src/language/stats/crosstabs.q:1073
 msgid "residual"
 msgstr ""
 
 msgid "residual"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1076
+#: src/language/stats/crosstabs.q:1074
 msgid "std. resid."
 msgstr ""
 
 msgid "std. resid."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1077
+#: src/language/stats/crosstabs.q:1075
 msgid "adj. resid."
 msgstr ""
 
 msgid "adj. resid."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1107
+#: src/language/stats/crosstabs.q:1105
 msgid "Chi-square tests."
 msgstr ""
 
 msgid "Chi-square tests."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1110 src/language/stats/crosstabs.q:1137
-#: src/language/stats/crosstabs.q:1157 src/language/stats/crosstabs.q:1178
-#: src/language/stats/examine.q:1369
+#: src/language/stats/crosstabs.q:1108 src/language/stats/crosstabs.q:1135
+#: src/language/stats/crosstabs.q:1155 src/language/stats/crosstabs.q:1176
+#: src/language/stats/examine.q:1372
 msgid "Statistic"
 msgstr ""
 
 msgid "Statistic"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1112 src/language/stats/oneway.q:287
-#: src/language/stats/oneway.q:690 src/language/stats/regression.q:287
+#: src/language/stats/crosstabs.q:1110 src/language/stats/oneway.q:287
+#: src/language/stats/oneway.q:690 src/language/stats/regression.q:301
 #: src/language/stats/t-test.q:980 src/language/stats/t-test.q:1172
 #: src/language/stats/t-test.q:1264
 msgid "df"
 msgstr ""
 
 #: src/language/stats/t-test.q:980 src/language/stats/t-test.q:1172
 #: src/language/stats/t-test.q:1264
 msgid "df"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1114
+#: src/language/stats/crosstabs.q:1112
 msgid "Asymp. Sig. (2-sided)"
 msgstr ""
 
 msgid "Asymp. Sig. (2-sided)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1116
+#: src/language/stats/crosstabs.q:1114
 msgid "Exact. Sig. (2-sided)"
 msgstr ""
 
 msgid "Exact. Sig. (2-sided)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1118
+#: src/language/stats/crosstabs.q:1116
 msgid "Exact. Sig. (1-sided)"
 msgstr ""
 
 msgid "Exact. Sig. (1-sided)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1133
+#: src/language/stats/crosstabs.q:1131
 msgid "Symmetric measures."
 msgstr ""
 
 msgid "Symmetric measures."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1136 src/language/stats/crosstabs.q:1177
+#: src/language/stats/crosstabs.q:1134 src/language/stats/crosstabs.q:1175
 msgid "Category"
 msgstr ""
 
 msgid "Category"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1139 src/language/stats/crosstabs.q:1181
+#: src/language/stats/crosstabs.q:1137 src/language/stats/crosstabs.q:1179
 msgid "Asymp. Std. Error"
 msgstr ""
 
 msgid "Asymp. Std. Error"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1140 src/language/stats/crosstabs.q:1182
+#: src/language/stats/crosstabs.q:1138 src/language/stats/crosstabs.q:1180
 msgid "Approx. T"
 msgstr ""
 
 msgid "Approx. T"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1141 src/language/stats/crosstabs.q:1183
+#: src/language/stats/crosstabs.q:1139 src/language/stats/crosstabs.q:1181
 msgid "Approx. Sig."
 msgstr ""
 
 msgid "Approx. Sig."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1152
+#: src/language/stats/crosstabs.q:1150
 msgid "Risk estimate."
 msgstr ""
 
 msgid "Risk estimate."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1156
+#: src/language/stats/crosstabs.q:1154
 #, c-format
 msgid "95%% Confidence Interval"
 msgstr ""
 
 #, c-format
 msgid "95%% Confidence Interval"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1159 src/language/stats/t-test.q:984
+#: src/language/stats/crosstabs.q:1157 src/language/stats/t-test.q:984
 #: src/language/stats/t-test.q:1169 src/language/stats/t-test.q:1267
 msgid "Lower"
 msgstr ""
 
 #: src/language/stats/t-test.q:1169 src/language/stats/t-test.q:1267
 msgid "Lower"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1160 src/language/stats/t-test.q:985
+#: src/language/stats/crosstabs.q:1158 src/language/stats/t-test.q:985
 #: src/language/stats/t-test.q:1170 src/language/stats/t-test.q:1268
 msgid "Upper"
 msgstr ""
 
 #: src/language/stats/t-test.q:1170 src/language/stats/t-test.q:1268
 msgid "Upper"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1174
+#: src/language/stats/crosstabs.q:1172
 msgid "Directional measures."
 msgstr ""
 
 msgid "Directional measures."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1179 src/ui/gui/var-sheet.c:68
+#: src/language/stats/crosstabs.q:1177 src/ui/gui/var-sheet.c:68
 msgid "Type"
 msgstr ""
 
 msgid "Type"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1935
+#: src/language/stats/crosstabs.q:1933
 msgid "Pearson Chi-Square"
 msgstr ""
 
 msgid "Pearson Chi-Square"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1936
+#: src/language/stats/crosstabs.q:1934
 msgid "Likelihood Ratio"
 msgstr ""
 
 msgid "Likelihood Ratio"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1937
+#: src/language/stats/crosstabs.q:1935
 msgid "Fisher's Exact Test"
 msgstr ""
 
 msgid "Fisher's Exact Test"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1938
+#: src/language/stats/crosstabs.q:1936
 msgid "Continuity Correction"
 msgstr ""
 
 msgid "Continuity Correction"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1939
+#: src/language/stats/crosstabs.q:1937
 msgid "Linear-by-Linear Association"
 msgstr ""
 
 msgid "Linear-by-Linear Association"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1976 src/language/stats/crosstabs.q:2046
-#: src/language/stats/crosstabs.q:2105
+#: src/language/stats/crosstabs.q:1974 src/language/stats/crosstabs.q:2044
+#: src/language/stats/crosstabs.q:2103
 msgid "N of Valid Cases"
 msgstr ""
 
 msgid "N of Valid Cases"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1992 src/language/stats/crosstabs.q:2121
+#: src/language/stats/crosstabs.q:1990 src/language/stats/crosstabs.q:2119
 msgid "Nominal by Nominal"
 msgstr ""
 
 msgid "Nominal by Nominal"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1993 src/language/stats/crosstabs.q:2122
+#: src/language/stats/crosstabs.q:1991 src/language/stats/crosstabs.q:2120
 msgid "Ordinal by Ordinal"
 msgstr ""
 
 msgid "Ordinal by Ordinal"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1994
+#: src/language/stats/crosstabs.q:1992
 msgid "Interval by Interval"
 msgstr ""
 
 msgid "Interval by Interval"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1995
+#: src/language/stats/crosstabs.q:1993
 msgid "Measure of Agreement"
 msgstr ""
 
 msgid "Measure of Agreement"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2000
+#: src/language/stats/crosstabs.q:1998
 msgid "Phi"
 msgstr ""
 
 msgid "Phi"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2001
+#: src/language/stats/crosstabs.q:1999
 msgid "Cramer's V"
 msgstr ""
 
 msgid "Cramer's V"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2002
+#: src/language/stats/crosstabs.q:2000
 msgid "Contingency Coefficient"
 msgstr ""
 
 msgid "Contingency Coefficient"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2003
+#: src/language/stats/crosstabs.q:2001
 msgid "Kendall's tau-b"
 msgstr ""
 
 msgid "Kendall's tau-b"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2004
+#: src/language/stats/crosstabs.q:2002
 msgid "Kendall's tau-c"
 msgstr ""
 
 msgid "Kendall's tau-c"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2005
+#: src/language/stats/crosstabs.q:2003
 msgid "Gamma"
 msgstr ""
 
 msgid "Gamma"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2006
+#: src/language/stats/crosstabs.q:2004
 msgid "Spearman Correlation"
 msgstr ""
 
 msgid "Spearman Correlation"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2007
+#: src/language/stats/crosstabs.q:2005
 msgid "Pearson's R"
 msgstr ""
 
 msgid "Pearson's R"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2008
+#: src/language/stats/crosstabs.q:2006
 msgid "Kappa"
 msgstr ""
 
 msgid "Kappa"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2078
+#: src/language/stats/crosstabs.q:2076
 #, c-format
 msgid "Odds Ratio for %s (%g / %g)"
 msgstr ""
 
 #, c-format
 msgid "Odds Ratio for %s (%g / %g)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2081
+#: src/language/stats/crosstabs.q:2079
 #, c-format
 msgid "Odds Ratio for %s (%.*s / %.*s)"
 msgstr ""
 
 #, c-format
 msgid "Odds Ratio for %s (%.*s / %.*s)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2089
+#: src/language/stats/crosstabs.q:2087
 #, c-format
 msgid "For cohort %s = %g"
 msgstr ""
 
 #, c-format
 msgid "For cohort %s = %g"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2092
+#: src/language/stats/crosstabs.q:2090
 #, c-format
 msgid "For cohort %s = %.*s"
 msgstr ""
 
 #, c-format
 msgid "For cohort %s = %.*s"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2123
+#: src/language/stats/crosstabs.q:2121
 msgid "Nominal by Interval"
 msgstr ""
 
 msgid "Nominal by Interval"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2128
+#: src/language/stats/crosstabs.q:2126
 msgid "Lambda"
 msgstr ""
 
 msgid "Lambda"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2129
+#: src/language/stats/crosstabs.q:2127
 msgid "Goodman and Kruskal tau"
 msgstr ""
 
 msgid "Goodman and Kruskal tau"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2130
+#: src/language/stats/crosstabs.q:2128
 msgid "Uncertainty Coefficient"
 msgstr ""
 
 msgid "Uncertainty Coefficient"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2131
+#: src/language/stats/crosstabs.q:2129
 msgid "Somers' d"
 msgstr ""
 
 msgid "Somers' d"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2132
+#: src/language/stats/crosstabs.q:2130
 msgid "Eta"
 msgstr ""
 
 msgid "Eta"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2137
+#: src/language/stats/crosstabs.q:2135
 msgid "Symmetric"
 msgstr ""
 
 msgid "Symmetric"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2138 src/language/stats/crosstabs.q:2139
+#: src/language/stats/crosstabs.q:2136 src/language/stats/crosstabs.q:2137
 #, c-format
 msgid "%s Dependent"
 msgstr ""
 
 #, c-format
 msgid "%s Dependent"
 msgstr ""
 
-#: src/language/stats/descriptives.c:103 src/language/stats/examine.q:1474
-#: src/language/stats/frequencies.q:120 src/language/stats/oneway.q:401
+#: src/language/stats/descriptives.c:103 src/language/stats/examine.q:1477
+#: src/language/stats/frequencies.q:119 src/language/stats/oneway.q:401
 #: src/language/stats/t-test.q:683 src/language/stats/t-test.q:706
 #: src/language/stats/t-test.q:829 src/language/stats/t-test.q:1166
 msgid "Mean"
 #: src/language/stats/t-test.q:683 src/language/stats/t-test.q:706
 #: src/language/stats/t-test.q:829 src/language/stats/t-test.q:1166
 msgid "Mean"
@@ -3167,17 +3174,17 @@ msgstr ""
 msgid "S E Mean"
 msgstr ""
 
 msgid "S E Mean"
 msgstr ""
 
-#: src/language/stats/descriptives.c:105 src/language/stats/frequencies.q:124
+#: src/language/stats/descriptives.c:105 src/language/stats/frequencies.q:123
 msgid "Std Dev"
 msgstr ""
 
 msgid "Std Dev"
 msgstr ""
 
-#: src/language/stats/descriptives.c:106 src/language/stats/examine.q:1554
-#: src/language/stats/frequencies.q:125
+#: src/language/stats/descriptives.c:106 src/language/stats/examine.q:1557
+#: src/language/stats/frequencies.q:124
 msgid "Variance"
 msgstr ""
 
 msgid "Variance"
 msgstr ""
 
-#: src/language/stats/descriptives.c:107 src/language/stats/examine.q:1661
-#: src/language/stats/frequencies.q:126
+#: src/language/stats/descriptives.c:107 src/language/stats/examine.q:1664
+#: src/language/stats/frequencies.q:125
 msgid "Kurtosis"
 msgstr ""
 
 msgid "Kurtosis"
 msgstr ""
 
@@ -3185,8 +3192,8 @@ msgstr ""
 msgid "S E Kurt"
 msgstr ""
 
 msgid "S E Kurt"
 msgstr ""
 
-#: src/language/stats/descriptives.c:109 src/language/stats/examine.q:1641
-#: src/language/stats/frequencies.q:128
+#: src/language/stats/descriptives.c:109 src/language/stats/examine.q:1644
+#: src/language/stats/frequencies.q:127
 msgid "Skewness"
 msgstr ""
 
 msgid "Skewness"
 msgstr ""
 
@@ -3194,22 +3201,22 @@ msgstr ""
 msgid "S E Skew"
 msgstr ""
 
 msgid "S E Skew"
 msgstr ""
 
-#: src/language/stats/descriptives.c:111 src/language/stats/examine.q:1602
-#: src/language/stats/frequencies.q:130
+#: src/language/stats/descriptives.c:111 src/language/stats/examine.q:1605
+#: src/language/stats/frequencies.q:129
 msgid "Range"
 msgstr ""
 
 msgid "Range"
 msgstr ""
 
-#: src/language/stats/descriptives.c:112 src/language/stats/examine.q:1579
-#: src/language/stats/frequencies.q:131 src/language/stats/oneway.q:413
+#: src/language/stats/descriptives.c:112 src/language/stats/examine.q:1582
+#: src/language/stats/frequencies.q:130 src/language/stats/oneway.q:413
 msgid "Minimum"
 msgstr ""
 
 msgid "Minimum"
 msgstr ""
 
-#: src/language/stats/descriptives.c:113 src/language/stats/examine.q:1590
-#: src/language/stats/frequencies.q:132 src/language/stats/oneway.q:414
+#: src/language/stats/descriptives.c:113 src/language/stats/examine.q:1593
+#: src/language/stats/frequencies.q:131 src/language/stats/oneway.q:414
 msgid "Maximum"
 msgstr ""
 
 msgid "Maximum"
 msgstr ""
 
-#: src/language/stats/descriptives.c:114 src/language/stats/frequencies.q:133
+#: src/language/stats/descriptives.c:114 src/language/stats/frequencies.q:132
 msgid "Sum"
 msgstr ""
 
 msgid "Sum"
 msgstr ""
 
@@ -3257,109 +3264,109 @@ msgstr ""
 msgid "Valid cases = %g; cases with missing value(s) = %g."
 msgstr ""
 
 msgid "Valid cases = %g; cases with missing value(s) = %g."
 msgstr ""
 
-#: src/language/stats/examine.q:478 src/language/stats/examine.q:490
+#: src/language/stats/examine.q:481 src/language/stats/examine.q:493
 #, c-format
 msgid "%s and %s are mutually exclusive"
 msgstr ""
 
 #, c-format
 msgid "%s and %s are mutually exclusive"
 msgstr ""
 
-#: src/language/stats/examine.q:917
+#: src/language/stats/examine.q:920
 msgid "Case Processing Summary"
 msgstr ""
 
 msgid "Case Processing Summary"
 msgstr ""
 
-#: src/language/stats/examine.q:1123
+#: src/language/stats/examine.q:1126
 msgid "Extreme Values"
 msgstr ""
 
 msgid "Extreme Values"
 msgstr ""
 
-#: src/language/stats/examine.q:1139
+#: src/language/stats/examine.q:1142
 msgid "Case Number"
 msgstr ""
 
 msgid "Case Number"
 msgstr ""
 
-#: src/language/stats/examine.q:1224
+#: src/language/stats/examine.q:1227
 msgid "Highest"
 msgstr ""
 
 msgid "Highest"
 msgstr ""
 
-#: src/language/stats/examine.q:1229
+#: src/language/stats/examine.q:1232
 msgid "Lowest"
 msgstr ""
 
 msgid "Lowest"
 msgstr ""
 
-#: src/language/stats/examine.q:1370 src/language/stats/oneway.q:403
-#: src/language/stats/oneway.q:688 src/language/stats/regression.q:191
+#: src/language/stats/examine.q:1373 src/language/stats/oneway.q:403
+#: src/language/stats/oneway.q:688 src/language/stats/regression.q:205
 msgid "Std. Error"
 msgstr ""
 
 msgid "Std. Error"
 msgstr ""
 
-#: src/language/stats/examine.q:1372 src/language/stats/oneway.q:417
+#: src/language/stats/examine.q:1375 src/language/stats/oneway.q:417
 msgid "Descriptives"
 msgstr ""
 
 msgid "Descriptives"
 msgstr ""
 
-#: src/language/stats/examine.q:1492 src/language/stats/oneway.q:408
+#: src/language/stats/examine.q:1495 src/language/stats/oneway.q:408
 #, c-format
 msgid "%g%% Confidence Interval for Mean"
 msgstr ""
 
 #, c-format
 msgid "%g%% Confidence Interval for Mean"
 msgstr ""
 
-#: src/language/stats/examine.q:1498 src/language/stats/oneway.q:410
+#: src/language/stats/examine.q:1501 src/language/stats/oneway.q:410
 msgid "Lower Bound"
 msgstr ""
 
 msgid "Lower Bound"
 msgstr ""
 
-#: src/language/stats/examine.q:1509 src/language/stats/oneway.q:411
+#: src/language/stats/examine.q:1512 src/language/stats/oneway.q:411
 msgid "Upper Bound"
 msgstr ""
 
 msgid "Upper Bound"
 msgstr ""
 
-#: src/language/stats/examine.q:1521
+#: src/language/stats/examine.q:1524
 #, c-format
 msgid "5%% Trimmed Mean"
 msgstr ""
 
 #, c-format
 msgid "5%% Trimmed Mean"
 msgstr ""
 
-#: src/language/stats/examine.q:1532 src/language/stats/frequencies.q:122
+#: src/language/stats/examine.q:1535 src/language/stats/frequencies.q:121
 msgid "Median"
 msgstr ""
 
 msgid "Median"
 msgstr ""
 
-#: src/language/stats/examine.q:1566 src/language/stats/oneway.q:402
+#: src/language/stats/examine.q:1569 src/language/stats/oneway.q:402
 #: src/language/stats/t-test.q:684 src/language/stats/t-test.q:707
 #: src/language/stats/t-test.q:831 src/language/stats/t-test.q:1167
 msgid "Std. Deviation"
 msgstr ""
 
 #: src/language/stats/t-test.q:684 src/language/stats/t-test.q:707
 #: src/language/stats/t-test.q:831 src/language/stats/t-test.q:1167
 msgid "Std. Deviation"
 msgstr ""
 
-#: src/language/stats/examine.q:1614
+#: src/language/stats/examine.q:1617
 msgid "Interquartile Range"
 msgstr ""
 
 msgid "Interquartile Range"
 msgstr ""
 
-#: src/language/stats/examine.q:1766
+#: src/language/stats/examine.q:1769
 #, c-format
 msgid "Boxplot of %s vs. %s"
 msgstr ""
 
 #, c-format
 msgid "Boxplot of %s vs. %s"
 msgstr ""
 
-#: src/language/stats/examine.q:1791
+#: src/language/stats/examine.q:1794
 msgid "Boxplot"
 msgstr ""
 
 msgid "Boxplot"
 msgstr ""
 
-#: src/language/stats/examine.q:1833
+#: src/language/stats/examine.q:1836
 #, c-format
 msgid "Normal Q-Q Plot of %s"
 msgstr ""
 
 #, c-format
 msgid "Normal Q-Q Plot of %s"
 msgstr ""
 
-#: src/language/stats/examine.q:1834 src/language/stats/examine.q:1840
+#: src/language/stats/examine.q:1837 src/language/stats/examine.q:1843
 msgid "Observed Value"
 msgstr ""
 
 msgid "Observed Value"
 msgstr ""
 
-#: src/language/stats/examine.q:1835
+#: src/language/stats/examine.q:1838
 msgid "Expected Normal"
 msgstr ""
 
 msgid "Expected Normal"
 msgstr ""
 
-#: src/language/stats/examine.q:1838
+#: src/language/stats/examine.q:1841
 #, c-format
 msgid "Detrended Normal Q-Q Plot of %s"
 msgstr ""
 
 #, c-format
 msgid "Detrended Normal Q-Q Plot of %s"
 msgstr ""
 
-#: src/language/stats/examine.q:1841
+#: src/language/stats/examine.q:1844
 msgid "Dev from Normal"
 msgstr ""
 
 msgid "Dev from Normal"
 msgstr ""
 
-#: src/language/stats/examine.q:1960 src/language/stats/examine.q:1982
-#: src/language/stats/frequencies.q:1528
+#: src/language/stats/examine.q:1963 src/language/stats/examine.q:1985
+#: src/language/stats/frequencies.q:1527
 msgid "Percentiles"
 msgstr ""
 
 msgid "Percentiles"
 msgstr ""
 
-#: src/language/stats/examine.q:2107
+#: src/language/stats/examine.q:2110
 msgid "Tukey's Hinges"
 msgstr ""
 
 msgid "Tukey's Hinges"
 msgstr ""
 
@@ -3381,139 +3388,139 @@ msgstr ""
 msgid "Could not create temporary file for FLIP."
 msgstr ""
 
 msgid "Could not create temporary file for FLIP."
 msgstr ""
 
-#: src/language/stats/flip.c:301 src/language/stats/flip.c:371
+#: src/language/stats/flip.c:301 src/language/stats/flip.c:367
 #, c-format
 msgid "Error writing FLIP file: %s."
 msgstr ""
 
 #, c-format
 msgid "Error writing FLIP file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:418
+#: src/language/stats/flip.c:414
 #, c-format
 msgid "Error rewinding FLIP file: %s."
 msgstr ""
 
 #, c-format
 msgid "Error rewinding FLIP file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:425
+#: src/language/stats/flip.c:421
 msgid "Error creating FLIP source file."
 msgstr ""
 
 msgid "Error creating FLIP source file."
 msgstr ""
 
-#: src/language/stats/flip.c:437
+#: src/language/stats/flip.c:433
 #, c-format
 msgid "Error reading FLIP file: %s."
 msgstr ""
 
 #, c-format
 msgid "Error reading FLIP file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:461
+#: src/language/stats/flip.c:457
 #, c-format
 msgid "Error seeking FLIP source file: %s."
 msgstr ""
 
 #, c-format
 msgid "Error seeking FLIP source file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:469
+#: src/language/stats/flip.c:465
 #, c-format
 msgid "Error writing FLIP source file: %s."
 msgstr ""
 
 #, c-format
 msgid "Error writing FLIP source file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:484
+#: src/language/stats/flip.c:480
 #, c-format
 msgid "Error rewinding FLIP source file: %s."
 msgstr ""
 
 #, c-format
 msgid "Error rewinding FLIP source file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:532
+#: src/language/stats/flip.c:528
 #, c-format
 msgid "Error reading FLIP temporary file: %s."
 msgstr ""
 
 #, c-format
 msgid "Error reading FLIP temporary file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:535
+#: src/language/stats/flip.c:531
 msgid "Unexpected end of file reading FLIP temporary file."
 msgstr ""
 
 msgid "Unexpected end of file reading FLIP temporary file."
 msgstr ""
 
-#: src/language/stats/frequencies.q:121
+#: src/language/stats/frequencies.q:120
 msgid "S.E. Mean"
 msgstr ""
 
 msgid "S.E. Mean"
 msgstr ""
 
-#: src/language/stats/frequencies.q:123
+#: src/language/stats/frequencies.q:122
 msgid "Mode"
 msgstr ""
 
 msgid "Mode"
 msgstr ""
 
-#: src/language/stats/frequencies.q:127
+#: src/language/stats/frequencies.q:126
 msgid "S.E. Kurt"
 msgstr ""
 
 msgid "S.E. Kurt"
 msgstr ""
 
-#: src/language/stats/frequencies.q:129
+#: src/language/stats/frequencies.q:128
 msgid "S.E. Skew"
 msgstr ""
 
 msgid "S.E. Skew"
 msgstr ""
 
-#: src/language/stats/frequencies.q:405
+#: src/language/stats/frequencies.q:404
 msgid ""
 "At most one of BARCHART, HISTOGRAM, or HBAR should be given.  HBAR will be "
 "assumed.  Argument values will be given precedence increasing along the "
 "order given."
 msgstr ""
 
 msgid ""
 "At most one of BARCHART, HISTOGRAM, or HBAR should be given.  HBAR will be "
 "assumed.  Argument values will be given precedence increasing along the "
 "order given."
 msgstr ""
 
-#: src/language/stats/frequencies.q:488
+#: src/language/stats/frequencies.q:487
 #, c-format
 msgid ""
 "MAX must be greater than or equal to MIN, if both are specified.  However, "
 "MIN was specified as %g and MAX as %g.  MIN and MAX will be ignored."
 msgstr ""
 
 #, c-format
 msgid ""
 "MAX must be greater than or equal to MIN, if both are specified.  However, "
 "MIN was specified as %g and MAX as %g.  MIN and MAX will be ignored."
 msgstr ""
 
-#: src/language/stats/frequencies.q:811
+#: src/language/stats/frequencies.q:810
 msgid ""
 "Upper limit of integer mode value range must be greater than lower limit."
 msgstr ""
 
 msgid ""
 "Upper limit of integer mode value range must be greater than lower limit."
 msgstr ""
 
-#: src/language/stats/frequencies.q:824
+#: src/language/stats/frequencies.q:823
 #, c-format
 msgid "Variable %s specified multiple times on VARIABLES subcommand."
 msgstr ""
 
 #, c-format
 msgid "Variable %s specified multiple times on VARIABLES subcommand."
 msgstr ""
 
-#: src/language/stats/frequencies.q:830
+#: src/language/stats/frequencies.q:829
 #, c-format
 msgid "Integer mode specified, but %s is not a numeric variable."
 msgstr ""
 
 #, c-format
 msgid "Integer mode specified, but %s is not a numeric variable."
 msgstr ""
 
-#: src/language/stats/frequencies.q:896
+#: src/language/stats/frequencies.q:895
 msgid "`)' expected after GROUPED interval list."
 msgstr ""
 
 msgid "`)' expected after GROUPED interval list."
 msgstr ""
 
-#: src/language/stats/frequencies.q:908
+#: src/language/stats/frequencies.q:907
 #, c-format
 msgid "Variables %s specified on GROUPED but not on VARIABLES."
 msgstr ""
 
 #, c-format
 msgid "Variables %s specified on GROUPED but not on VARIABLES."
 msgstr ""
 
-#: src/language/stats/frequencies.q:915
+#: src/language/stats/frequencies.q:914
 #, c-format
 msgid "Variables %s specified multiple times on GROUPED subcommand."
 msgstr ""
 
 #, c-format
 msgid "Variables %s specified multiple times on GROUPED subcommand."
 msgstr ""
 
-#: src/language/stats/frequencies.q:1145 src/language/stats/frequencies.q:1237
-#: src/language/stats/frequencies.q:1238 src/language/stats/frequencies.q:1270
+#: src/language/stats/frequencies.q:1144 src/language/stats/frequencies.q:1236
+#: src/language/stats/frequencies.q:1237 src/language/stats/frequencies.q:1269
 msgid "Cum"
 msgstr ""
 
 msgid "Cum"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1147 src/output/charts/plot-hist.c:129
+#: src/language/stats/frequencies.q:1146 src/output/charts/plot-hist.c:129
 msgid "Frequency"
 msgstr ""
 
 msgid "Frequency"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1167
+#: src/language/stats/frequencies.q:1166
 msgid "Value Label"
 msgstr ""
 
 msgid "Value Label"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1268
+#: src/language/stats/frequencies.q:1267
 msgid "Freq"
 msgstr ""
 
 msgid "Freq"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1269 src/language/stats/frequencies.q:1271
+#: src/language/stats/frequencies.q:1268 src/language/stats/frequencies.q:1270
 msgid "Pct"
 msgstr ""
 
 msgid "Pct"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1490
+#: src/language/stats/frequencies.q:1489
 #, c-format
 msgid "No valid data for variable %s; statistics not displayed."
 msgstr ""
 
 #, c-format
 msgid "No valid data for variable %s; statistics not displayed."
 msgstr ""
 
-#: src/language/stats/means.q:104
+#: src/language/stats/means.q:102
 msgid "Missing required subcommand TABLES."
 msgstr ""
 
 msgid "Missing required subcommand TABLES."
 msgstr ""
 
-#: src/language/stats/means.q:138
+#: src/language/stats/means.q:136
 msgid "TABLES subcommand may not appear more than once."
 msgstr ""
 
 msgid "TABLES subcommand may not appear more than once."
 msgstr ""
 
@@ -3531,21 +3538,21 @@ msgstr ""
 msgid "`%s' is not a variable name"
 msgstr ""
 
 msgid "`%s' is not a variable name"
 msgstr ""
 
-#: src/language/stats/oneway.q:286 src/language/stats/regression.q:286
+#: src/language/stats/oneway.q:286 src/language/stats/regression.q:300
 msgid "Sum of Squares"
 msgstr ""
 
 msgid "Sum of Squares"
 msgstr ""
 
-#: src/language/stats/oneway.q:288 src/language/stats/regression.q:288
+#: src/language/stats/oneway.q:288 src/language/stats/regression.q:302
 msgid "Mean Square"
 msgstr ""
 
 msgid "Mean Square"
 msgstr ""
 
-#: src/language/stats/oneway.q:289 src/language/stats/regression.q:289
+#: src/language/stats/oneway.q:289 src/language/stats/regression.q:303
 #: src/language/stats/t-test.q:977
 msgid "F"
 msgstr ""
 
 #: src/language/stats/oneway.q:290 src/language/stats/oneway.q:544
 #: src/language/stats/t-test.q:977
 msgid "F"
 msgstr ""
 
 #: src/language/stats/oneway.q:290 src/language/stats/oneway.q:544
-#: src/language/stats/regression.q:194 src/language/stats/regression.q:290
+#: src/language/stats/regression.q:208 src/language/stats/regression.q:304
 msgid "Significance"
 msgstr ""
 
 msgid "Significance"
 msgstr ""
 
@@ -3557,7 +3564,7 @@ msgstr ""
 msgid "Within Groups"
 msgstr ""
 
 msgid "Within Groups"
 msgstr ""
 
-#: src/language/stats/oneway.q:360 src/language/stats/regression.q:316
+#: src/language/stats/oneway.q:360 src/language/stats/regression.q:330
 msgid "ANOVA"
 msgstr ""
 
 msgid "ANOVA"
 msgstr ""
 
@@ -3593,7 +3600,7 @@ msgstr ""
 msgid "Value of Contrast"
 msgstr ""
 
 msgid "Value of Contrast"
 msgstr ""
 
-#: src/language/stats/oneway.q:689 src/language/stats/regression.q:193
+#: src/language/stats/oneway.q:689 src/language/stats/regression.q:207
 #: src/language/stats/t-test.q:979 src/language/stats/t-test.q:1171
 #: src/language/stats/t-test.q:1263
 msgid "t"
 #: src/language/stats/t-test.q:979 src/language/stats/t-test.q:1171
 #: src/language/stats/t-test.q:1263
 msgid "t"
@@ -3612,72 +3619,72 @@ msgstr ""
 msgid "Does not assume equal"
 msgstr ""
 
 msgid "Does not assume equal"
 msgstr ""
 
-#: src/language/stats/rank.q:244
+#: src/language/stats/rank.q:245
 #, c-format
 msgid "Variable %s already exists."
 msgstr ""
 
 #, c-format
 msgid "Variable %s already exists."
 msgstr ""
 
-#: src/language/stats/rank.q:249
+#: src/language/stats/rank.q:250
 msgid "Too many variables in INTO clause."
 msgstr ""
 
 msgid "Too many variables in INTO clause."
 msgstr ""
 
-#: src/language/stats/regression.q:145
+#: src/language/stats/regression.q:159
 msgid "R"
 msgstr ""
 
 msgid "R"
 msgstr ""
 
-#: src/language/stats/regression.q:146
+#: src/language/stats/regression.q:160
 msgid "R Square"
 msgstr ""
 
 msgid "R Square"
 msgstr ""
 
-#: src/language/stats/regression.q:147
+#: src/language/stats/regression.q:161
 msgid "Adjusted R Square"
 msgstr ""
 
 msgid "Adjusted R Square"
 msgstr ""
 
-#: src/language/stats/regression.q:148
+#: src/language/stats/regression.q:162
 msgid "Std. Error of the Estimate"
 msgstr ""
 
 msgid "Std. Error of the Estimate"
 msgstr ""
 
-#: src/language/stats/regression.q:153
+#: src/language/stats/regression.q:167
 msgid "Model Summary"
 msgstr ""
 
 msgid "Model Summary"
 msgstr ""
 
-#: src/language/stats/regression.q:190
+#: src/language/stats/regression.q:204
 msgid "B"
 msgstr ""
 
 msgid "B"
 msgstr ""
 
-#: src/language/stats/regression.q:192
+#: src/language/stats/regression.q:206
 msgid "Beta"
 msgstr ""
 
 msgid "Beta"
 msgstr ""
 
-#: src/language/stats/regression.q:195
+#: src/language/stats/regression.q:209
 msgid "(Constant)"
 msgstr ""
 
 msgid "(Constant)"
 msgstr ""
 
-#: src/language/stats/regression.q:255
+#: src/language/stats/regression.q:269
 msgid "Coefficients"
 msgstr ""
 
 msgid "Coefficients"
 msgstr ""
 
-#: src/language/stats/regression.q:292
+#: src/language/stats/regression.q:306
 msgid "Regression"
 msgstr ""
 
 msgid "Regression"
 msgstr ""
 
-#: src/language/stats/regression.q:293
+#: src/language/stats/regression.q:307
 msgid "Residual"
 msgstr ""
 
 msgid "Residual"
 msgstr ""
 
-#: src/language/stats/regression.q:371
+#: src/language/stats/regression.q:385
 msgid "Model"
 msgstr ""
 
 msgid "Model"
 msgstr ""
 
-#: src/language/stats/regression.q:372
+#: src/language/stats/regression.q:386
 msgid "Covariances"
 msgstr ""
 
 msgid "Covariances"
 msgstr ""
 
-#: src/language/stats/regression.q:387
+#: src/language/stats/regression.q:401
 msgid "Coefficient Correlations"
 msgstr ""
 
 msgid "Coefficient Correlations"
 msgstr ""
 
-#: src/language/stats/regression.q:885
+#: src/language/stats/regression.q:1157
 msgid "Dependent variable must be numeric."
 msgstr ""
 
 msgid "Dependent variable must be numeric."
 msgstr ""
 
@@ -3830,7 +3837,7 @@ msgid "Only USE ALL is currently implemented."
 msgstr ""
 
 #: src/language/utilities/include.c:43
 msgstr ""
 
 #: src/language/utilities/include.c:43
-msgid "expecting filename"
+msgid "expecting file name"
 msgstr ""
 
 #: src/language/utilities/permissions.c:77
 msgstr ""
 
 #: src/language/utilities/permissions.c:77
@@ -3975,26 +3982,12 @@ msgstr ""
 msgid "WIDTH is %d."
 msgstr ""
 
 msgid "WIDTH is %d."
 msgstr ""
 
-#: src/language/utilities/title.c:59
-#, c-format
-msgid "%s before: %s\n"
-msgstr ""
-
-#: src/language/utilities/title.c:59
-msgid "<none>"
-msgstr ""
-
-#: src/language/utilities/title.c:71
+#: src/language/utilities/title.c:68
 #, c-format
 msgid "%s: `.' expected after string."
 msgstr ""
 
 #, c-format
 msgid "%s: `.' expected after string."
 msgstr ""
 
-#: src/language/utilities/title.c:87
-#, c-format
-msgid "%s after: %s\n"
-msgstr ""
-
-#: src/language/utilities/title.c:142
+#: src/language/utilities/title.c:138
 #, c-format
 msgid "Document entered %s by %s:"
 msgstr ""
 #, c-format
 msgid "Document entered %s by %s:"
 msgstr ""
@@ -4059,11 +4052,11 @@ msgstr ""
 msgid "Type mismatch.  Cannot store %s data in %s variable %s."
 msgstr ""
 
 msgid "Type mismatch.  Cannot store %s data in %s variable %s."
 msgstr ""
 
-#: src/language/xforms/sample.c:77
+#: src/language/xforms/sample.c:75
 msgid "The sampling factor must be between 0 and 1 exclusive."
 msgstr ""
 
 msgid "The sampling factor must be between 0 and 1 exclusive."
 msgstr ""
 
-#: src/language/xforms/sample.c:97
+#: src/language/xforms/sample.c:95
 #, c-format
 msgid "Cannot sample %d observations from a population of %d."
 msgstr ""
 #, c-format
 msgid "Cannot sample %d observations from a population of %d."
 msgstr ""
@@ -4105,43 +4098,13 @@ msgstr ""
 msgid "Empirical with averaging"
 msgstr ""
 
 msgid "Empirical with averaging"
 msgstr ""
 
-#: src/math/sort.c:431
+#: src/math/sort.c:430
 #, c-format
 msgid ""
 "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.)"
 msgstr ""
 
 #, c-format
 msgid ""
 "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.)"
 msgstr ""
 
-#: src/message.c:89
-msgid "Terminating execution of syntax file due to error."
-msgstr ""
-
-#: src/message.c:91
-#, c-format
-msgid "Errors (%d) exceeds limit (%d)."
-msgstr ""
-
-#: src/message.c:94
-#, c-format
-msgid "Warnings (%d) exceed limit (%d)."
-msgstr ""
-
-#: src/message.c:143 src/message.c:150 src/message.c:153
-msgid "error"
-msgstr ""
-
-#: src/message.c:144 src/message.c:151 src/message.c:154
-msgid "warning"
-msgstr ""
-
-#: src/message.c:145 src/message.c:155
-msgid "note"
-msgstr ""
-
-#: src/message.c:147 src/message.c:148
-msgid "installation error"
-msgstr ""
-
 #: src/output/afm.c:150
 #, c-format
 msgid "opening font metrics file \"%s\""
 #: src/output/afm.c:150
 #, c-format
 msgid "opening font metrics file \"%s\""
@@ -4209,70 +4172,70 @@ msgstr ""
 msgid "unexpected end of line expecting string"
 msgstr ""
 
 msgid "unexpected end of line expecting string"
 msgstr ""
 
-#: src/output/ascii.c:161
+#: src/output/ascii.c:160
 #, c-format
 msgid "ascii: opening output file \"%s\""
 msgstr ""
 
 #, c-format
 msgid "ascii: opening output file \"%s\""
 msgstr ""
 
-#: src/output/ascii.c:172
+#: src/output/ascii.c:171
 #, c-format
 msgid ""
 "ascii: page excluding margins and headers must be at least 59 characters "
 "wide by 15 lines long, but as configured is only %d characters by %d lines"
 msgstr ""
 
 #, c-format
 msgid ""
 "ascii: page excluding margins and headers must be at least 59 characters "
 "wide by 15 lines long, but as configured is only %d characters by %d lines"
 msgstr ""
 
-#: src/output/ascii.c:233
+#: src/output/ascii.c:232
 #, c-format
 msgid "ascii: closing output file \"%s\""
 msgstr ""
 
 #, c-format
 msgid "ascii: closing output file \"%s\""
 msgstr ""
 
-#: src/output/ascii.c:285
+#: src/output/ascii.c:284
 #, c-format
 msgid ""
 "ascii: bad index value for `box' key: syntax is box[INDEX], 0 <= INDEX < %d "
 "decimal, with INDEX expressed in base 4"
 msgstr ""
 
 #, c-format
 msgid ""
 "ascii: bad index value for `box' key: syntax is box[INDEX], 0 <= INDEX < %d "
 "decimal, with INDEX expressed in base 4"
 msgstr ""
 
-#: src/output/ascii.c:292
+#: src/output/ascii.c:291
 #, c-format
 msgid "ascii: multiple values for %s"
 msgstr ""
 
 #, c-format
 msgid "ascii: multiple values for %s"
 msgstr ""
 
-#: src/output/ascii.c:300
+#: src/output/ascii.c:299
 #, c-format
 msgid "ascii: unknown parameter `%s'"
 msgstr ""
 
 #, c-format
 msgid "ascii: unknown parameter `%s'"
 msgstr ""
 
-#: src/output/ascii.c:314
+#: src/output/ascii.c:313
 #, c-format
 msgid "ascii: positive integer required as `%s' value"
 msgstr ""
 
 #, c-format
 msgid "ascii: positive integer required as `%s' value"
 msgstr ""
 
-#: src/output/ascii.c:340
+#: src/output/ascii.c:339
 msgid "ascii: `emphasis' value must be `bold', `underline', or `none'"
 msgstr ""
 
 msgid "ascii: `emphasis' value must be `bold', `underline', or `none'"
 msgstr ""
 
-#: src/output/ascii.c:353
+#: src/output/ascii.c:352
 #, c-format
 msgid "ascii: zero or positive integer required as `%s' value"
 msgstr ""
 
 #, c-format
 msgid "ascii: zero or positive integer required as `%s' value"
 msgstr ""
 
-#: src/output/ascii.c:384
+#: src/output/ascii.c:383
 #, c-format
 msgid "ascii: boolean value expected for `%s'"
 msgstr ""
 
 #, c-format
 msgid "ascii: boolean value expected for `%s'"
 msgstr ""
 
-#: src/output/ascii.c:473
+#: src/output/ascii.c:472
 #, c-format
 msgid "ascii: bad line (%d,%d)-(%d,%d) out of (%d,%d)\n"
 msgstr ""
 
 #, c-format
 msgid "ascii: bad line (%d,%d)-(%d,%d) out of (%d,%d)\n"
 msgstr ""
 
-#: src/output/ascii.c:683 src/output/postscript.c:832
+#: src/output/ascii.c:682 src/output/postscript.c:831
 #, c-format
 msgid "%s - Page %d"
 msgstr ""
 
 #, c-format
 msgid "%s - Page %d"
 msgstr ""
 
-#: src/output/ascii.c:727
+#: src/output/ascii.c:726
 msgid "ascii: charts are unsupported by this driver"
 msgstr ""
 
 msgid "ascii: charts are unsupported by this driver"
 msgstr ""
 
@@ -4280,150 +4243,164 @@ msgstr ""
 msgid "HISTOGRAM"
 msgstr ""
 
 msgid "HISTOGRAM"
 msgstr ""
 
-#: src/output/html.c:68
+#: src/output/html.c:66
 #, c-format
 msgid "opening HTML output file: %s"
 msgstr ""
 
 #, c-format
 msgid "opening HTML output file: %s"
 msgstr ""
 
-#: src/output/html.c:79
+#: src/output/html.c:77
 msgid "PSPP Output"
 msgstr ""
 
 msgid "PSPP Output"
 msgstr ""
 
-#: src/output/html.c:165
+#: src/output/html.c:163
 #, c-format
 msgid "unknown configuration parameter `%s' for HTML device driver"
 msgstr ""
 
 #, c-format
 msgid "unknown configuration parameter `%s' for HTML device driver"
 msgstr ""
 
-#: src/output/output.c:166
+#: src/output/output.c:165
 #, c-format
 #, c-format
-msgid "Unknown output driver `%s'."
+msgid "unknown output driver `%s'"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:168
+#: src/output/output.c:167
 #, c-format
 #, c-format
-msgid "Output driver `%s' referenced but never defined."
+msgid "output driver `%s' referenced but never defined"
 msgstr ""
 
 #: src/output/output.c:261
 msgstr ""
 
 #: src/output/output.c:261
-msgid "Using default output driver configuration."
+msgid "using default output driver configuration"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:296
-msgid ""
-"Cannot find output initialization file.  Use `-vvvvv' to view search path."
+#: src/output/output.c:293
+msgid "cannot find output initialization file (use `-vv' to view search path)"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:304 src/output/output.c:1067
+#: src/output/output.c:301
 #, c-format
 #, c-format
-msgid "Opening %s: %s."
+msgid "cannot open \"%s\""
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:315 src/output/output.c:1078
+#: src/output/output.c:313
 #, c-format
 #, c-format
-msgid "Reading %s: %s."
+msgid "reading \"%s\""
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:337 src/output/output.c:503
-msgid "Syntax error."
+#: src/output/output.c:335
+msgid "syntax error"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:347
+#: src/output/output.c:344
 #, c-format
 #, c-format
-msgid "Closing %s: %s."
+msgid "error closing \"%s\""
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:355
-msgid "No output drivers are active."
+#: src/output/output.c:352
+msgid "no active output drivers"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:358
-msgid "Error reading device definition file."
+#: src/output/output.c:355
+msgid "error reading device definition file"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:475
+#: src/output/output.c:472
 #, c-format
 msgid ""
 "Driver classes:\n"
 "\t"
 msgstr ""
 
 #, c-format
 msgid ""
 "Driver classes:\n"
 "\t"
 msgstr ""
 
-#: src/output/output.c:604
-msgid "Syntax error in string constant."
+#: src/output/output.c:504
+#, c-format
+msgid "syntax error parsing options for \"%s\" driver"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:639
-msgid "Syntax error in options."
+#: src/output/output.c:521
+#, c-format
+msgid ""
+"reached end of options inside quoted string parsing options for \"%s\" driver"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:649
-msgid "Syntax error in options (`=' expected)."
+#: src/output/output.c:594
+#, c-format
+msgid "syntax error in string constant parsing options for \"%s\" driver"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:656
-msgid "Syntax error in options (value expected after `=')."
+#: src/output/output.c:639
+#, c-format
+msgid "syntax error expecting `=' parsing options for driver \"%s\""
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:698
+#: src/output/output.c:692
 #, c-format
 #, c-format
-msgid "Unknown output driver class `%s'."
+msgid "unknown output driver class `%s'"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:719
+#: src/output/output.c:714
 #, c-format
 #, c-format
-msgid "Unknown device type `%s'."
+msgid "unknown device type `%s'"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:738
+#: src/output/output.c:733
 #, c-format
 #, c-format
-msgid "Can't initialize output driver `%s' of class `%s'."
+msgid "cannot initialize output driver `%s' of class `%s'"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:783
-msgid "Driver definition line missing driver name or class name"
+#: src/output/output.c:779
+msgid "driver definition line missing driver name or class name"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:929
+#: src/output/output.c:926
 #, c-format
 #, c-format
-msgid "Unit \"%s\" is unknown in dimension \"%s\"."
+msgid "unit \"%s\" is unknown in dimension \"%s\""
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:944
+#: src/output/output.c:941
 #, c-format
 #, c-format
-msgid "Bad dimension \"%s\"."
+msgid "bad dimension \"%s\""
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:970
+#: src/output/output.c:967
 #, c-format
 #, c-format
-msgid "`x' expected in paper size `%s'."
+msgid "`x' expected in paper size `%s'"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:980
+#: src/output/output.c:977
 #, c-format
 #, c-format
-msgid "Trailing garbage `%s' on paper size `%s'."
+msgid "trailing garbage `%s' on paper size `%s'"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:1029
-msgid "Paper size name must not be empty."
+#: src/output/output.c:1021
+msgid "paper size name cannot be empty"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:1060
-msgid "Cannot find `papersize' configuration file."
+#: src/output/output.c:1039
+msgid "cannot find `papersize' configuration file"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:1105
-msgid "Syntax error in paper size definition."
+#: src/output/output.c:1046
+#, c-format
+msgid "error opening \"%s\""
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:1134
-msgid "Error reading paper size definition file."
+#: src/output/output.c:1057
+#, c-format
+msgid "error reading \"%s\""
 msgstr ""
 
 msgstr ""
 
-#: src/output/postscript.c:164
+#: src/output/output.c:1085
+msgid "syntax error in paper size definition"
+msgstr ""
+
+#: src/output/output.c:1097
+msgid "error reading paper size definition file"
+msgstr ""
+
+#: src/output/postscript.c:163
 #, c-format
 msgid "opening PostScript output file \"%s\""
 msgstr ""
 
 #, c-format
 msgid "opening PostScript output file \"%s\""
 msgstr ""
 
-#: src/output/postscript.c:202
+#: src/output/postscript.c:201
 #, c-format
 msgid ""
 "The defined PostScript page is not long enough to hold margins and headers, "
 #, c-format
 msgid ""
 "The defined PostScript page is not long enough to hold margins and headers, "
@@ -4431,87 +4408,87 @@ msgid ""
 "lines of each font at the default size of %d.%03d points."
 msgstr ""
 
 "lines of each font at the default size of %d.%03d points."
 msgstr ""
 
-#: src/output/postscript.c:250
+#: src/output/postscript.c:249
 #, c-format
 msgid "closing PostScript output file \"%s\""
 msgstr ""
 
 #, c-format
 msgid "closing PostScript output file \"%s\""
 msgstr ""
 
-#: src/output/postscript.c:310
+#: src/output/postscript.c:309
 #, c-format
 msgid "unknown configuration parameter `%s' for PostScript device driver"
 msgstr ""
 
 #, c-format
 msgid "unknown configuration parameter `%s' for PostScript device driver"
 msgstr ""
 
-#: src/output/postscript.c:326
+#: src/output/postscript.c:325
 #, c-format
 msgid ""
 "unknown orientation `%s' (valid orientations are `portrait' and `landscape')"
 msgstr ""
 
 #, c-format
 msgid ""
 "unknown orientation `%s' (valid orientations are `portrait' and `landscape')"
 msgstr ""
 
-#: src/output/postscript.c:338
+#: src/output/postscript.c:337
 #, c-format
 msgid "boolean value expected for %s"
 msgstr ""
 
 #, c-format
 msgid "boolean value expected for %s"
 msgstr ""
 
-#: src/output/postscript.c:351
+#: src/output/postscript.c:350
 #, c-format
 msgid "positive integer value required for `%s'"
 msgstr ""
 
 #, c-format
 msgid "positive integer value required for `%s'"
 msgstr ""
 
-#: src/output/postscript.c:356
+#: src/output/postscript.c:355
 #, c-format
 msgid "default font size must be at least 1 point (value of 1000 for key `%s')"
 msgstr ""
 
 #, c-format
 msgid "default font size must be at least 1 point (value of 1000 for key `%s')"
 msgstr ""
 
-#: src/output/postscript.c:388
+#: src/output/postscript.c:387
 #, c-format
 msgid "value for `%s' must be a dimension of positive length (i.e., `1in')"
 msgstr ""
 
 #, c-format
 msgid "value for `%s' must be a dimension of positive length (i.e., `1in')"
 msgstr ""
 
-#: src/output/postscript.c:1182
+#: src/output/postscript.c:1181
 #, c-format
 msgid "\"%s\": bad font specification"
 msgstr ""
 
 #, c-format
 msgid "\"%s\": bad font specification"
 msgstr ""
 
-#: src/output/postscript.c:1190
+#: src/output/postscript.c:1189
 #, c-format
 msgid "could not find AFM file \"%s\""
 msgstr ""
 
 #, c-format
 msgid "could not find AFM file \"%s\""
 msgstr ""
 
-#: src/output/postscript.c:1204
+#: src/output/postscript.c:1203
 #, c-format
 msgid "could not find font \"%s\""
 msgstr ""
 
 #, c-format
 msgid "could not find font \"%s\""
 msgstr ""
 
-#: src/output/postscript.c:1213
+#: src/output/postscript.c:1212
 #, c-format
 msgid "could not find encoding \"%s\""
 msgstr ""
 
 #, c-format
 msgid "could not find encoding \"%s\""
 msgstr ""
 
-#: src/output/postscript.c:1313
+#: src/output/postscript.c:1312
 #, c-format
 msgid "cannot open font file \"%s\""
 msgstr ""
 
 #, c-format
 msgid "cannot open font file \"%s\""
 msgstr ""
 
-#: src/output/postscript.c:1354
+#: src/output/postscript.c:1353
 #, c-format
 msgid "reading font file \"%s\""
 msgstr ""
 
 #, c-format
 msgid "reading font file \"%s\""
 msgstr ""
 
-#: src/output/postscript.c:1376
+#: src/output/postscript.c:1375
 #, c-format
 msgid "cannot open font encoding file \"%s\""
 msgstr ""
 
 #, c-format
 msgid "cannot open font encoding file \"%s\""
 msgstr ""
 
-#: src/output/postscript.c:1405
+#: src/output/postscript.c:1404
 msgid "invalid numeric format"
 msgstr ""
 
 msgid "invalid numeric format"
 msgstr ""
 
-#: src/output/table.c:239
+#: src/output/table.c:236
 #, c-format
 msgid "bad vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n"
 msgstr ""
 
 #, c-format
 msgid "bad vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n"
 msgstr ""
 
-#: src/output/table.c:310
+#: src/output/table.c:307
 #, c-format
 msgid ""
 "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n"
 #, c-format
 msgid ""
 "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n"
@@ -4549,26 +4526,18 @@ msgstr ""
 msgid "Font Selection"
 msgstr ""
 
 msgid "Font Selection"
 msgstr ""
 
-#: src/ui/gui/message-dialog.c:78
+#: src/ui/gui/message-dialog.c:75
 msgid "Script Error"
 msgstr ""
 
 msgid "Script Error"
 msgstr ""
 
-#: src/ui/gui/message-dialog.c:83
-msgid "Installation Error"
-msgstr ""
-
-#: src/ui/gui/message-dialog.c:88
+#: src/ui/gui/message-dialog.c:79
 msgid "Data File Error"
 msgstr ""
 
 msgid "Data File Error"
 msgstr ""
 
-#: src/ui/gui/message-dialog.c:95
+#: src/ui/gui/message-dialog.c:84
 msgid "PSPP Error"
 msgstr ""
 
 msgid "PSPP Error"
 msgstr ""
 
-#: src/ui/gui/message-dialog.c:155
-msgid "Terminating NOW due to fatal error"
-msgstr ""
-
 #: src/ui/gui/missing-val-dialog.c:113 src/ui/gui/missing-val-dialog.c:158
 msgid "Incorrect value for variable type"
 msgstr ""
 #: src/ui/gui/missing-val-dialog.c:113 src/ui/gui/missing-val-dialog.c:158
 msgid "Incorrect value for variable type"
 msgstr ""
@@ -4657,7 +4626,7 @@ msgstr ""
 msgid "Scale"
 msgstr ""
 
 msgid "Scale"
 msgstr ""
 
-#: src/ui/terminal/command-line.c:213
+#: src/ui/terminal/command-line.c:214
 #, 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"
@@ -4702,41 +4671,17 @@ msgid ""
 "\n"
 msgstr ""
 
 "\n"
 msgstr ""
 
-#: src/ui/terminal/command-line.c:247
+#: src/ui/terminal/command-line.c:248
 #, c-format
 msgid ""
 "\n"
 "Report bugs to <%s>.\n"
 msgstr ""
 
 #, c-format
 msgid ""
 "\n"
 "Report bugs to <%s>.\n"
 msgstr ""
 
-#: src/ui/terminal/main.c:154
-msgid "This command not executed.  Stopping here to avoid cascading failures."
-msgstr ""
-
-#: src/ui/terminal/main.c:164
-msgid "This command not executed."
-msgstr ""
-
-#: src/ui/terminal/main.c:168
-msgid ""
-"Skipping the rest of this command.  Part of this command may have been "
-"executed."
-msgstr ""
-
-#: src/ui/terminal/main.c:173
+#: src/ui/terminal/main.c:111
 msgid ""
 msgid ""
-"Skipping the rest of this command.  This command was fully executed up to "
-"this point."
-msgstr ""
-
-#: src/ui/terminal/main.c:178
-msgid ""
-"Trailing garbage was encountered following this command.  The command was "
-"fully executed to this point."
-msgstr ""
-
-#: src/ui/terminal/main.c:194
-msgid "The rest of this command has been discarded."
+"Stopping syntax file processing here to avoid a cascade of dependent command "
+"failures."
 msgstr ""
 
 #~ msgid "Text color must be in range 0-15."
 msgstr ""
 
 #~ msgid "Text color must be in range 0-15."
index ccd74ae141262c5f932a471b6715d59a924bdfb3..592b3c2a3485d363bb93da9d632c391b61828d9d 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: 2006-04-04 20:32+0800\n"
+"POT-Creation-Date: 2006-04-26 13:48-0700\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"
@@ -76,216 +76,216 @@ msgstr ""
 msgid "%s: Temporary file ended unexpectedly."
 msgstr ""
 
 msgid "%s: Temporary file ended unexpectedly."
 msgstr ""
 
-#: src/data/data-in.c:61
+#: src/data/data-in.c:59
 #, c-format
 msgid "(column %d"
 msgstr ""
 
 #, c-format
 msgid "(column %d"
 msgstr ""
 
-#: src/data/data-in.c:63
+#: src/data/data-in.c:61
 #, c-format
 msgid "(columns %d-%d"
 msgstr ""
 
 #, c-format
 msgid "(columns %d-%d"
 msgstr ""
 
-#: src/data/data-in.c:64
+#: src/data/data-in.c:62
 #, c-format
 msgid ", field type %s) "
 msgstr ""
 
 #, c-format
 msgid ", field type %s) "
 msgstr ""
 
-#: src/data/data-in.c:210
+#: src/data/data-in.c:208
 msgid "Field does not form a valid floating-point constant."
 msgstr ""
 
 msgid "Field does not form a valid floating-point constant."
 msgstr ""
 
-#: src/data/data-in.c:237
+#: src/data/data-in.c:235
 msgid "Field contents followed by garbage."
 msgstr ""
 
 msgid "Field contents followed by garbage."
 msgstr ""
 
-#: src/data/data-in.c:255
+#: src/data/data-in.c:253
 msgid "Underflow in floating-point constant."
 msgstr ""
 
 msgid "Underflow in floating-point constant."
 msgstr ""
 
-#: src/data/data-in.c:266
+#: src/data/data-in.c:264
 msgid "Overflow in floating-point constant."
 msgstr ""
 
 msgid "Overflow in floating-point constant."
 msgstr ""
 
-#: src/data/data-in.c:299
+#: src/data/data-in.c:297
 msgid "All characters in field must be digits."
 msgstr ""
 
 msgid "All characters in field must be digits."
 msgstr ""
 
-#: src/data/data-in.c:323
+#: src/data/data-in.c:321
 msgid "Unrecognized character in field."
 msgstr ""
 
 msgid "Unrecognized character in field."
 msgstr ""
 
-#: src/data/data-in.c:341 src/data/data-in.c:587
+#: src/data/data-in.c:339 src/data/data-in.c:585
 msgid "Field must have even length."
 msgstr ""
 
 msgid "Field must have even length."
 msgstr ""
 
-#: src/data/data-in.c:351 src/data/data-in.c:597
+#: src/data/data-in.c:349 src/data/data-in.c:595
 msgid "Field must contain only hex digits."
 msgstr ""
 
 msgid "Field must contain only hex digits."
 msgstr ""
 
-#: src/data/data-in.c:390
+#: src/data/data-in.c:388
 #, c-format
 msgid ""
 "Quality of zoned decimal (Z) input format code is suspect.  Check your "
 "results three times. Report bugs to %s."
 msgstr ""
 
 #, c-format
 msgid ""
 "Quality of zoned decimal (Z) input format code is suspect.  Check your "
 "results three times. Report bugs to %s."
 msgstr ""
 
-#: src/data/data-in.c:402
+#: src/data/data-in.c:400
 msgid "Zoned decimal field contains fewer than 2 characters."
 msgstr ""
 
 msgid "Zoned decimal field contains fewer than 2 characters."
 msgstr ""
 
-#: src/data/data-in.c:410
+#: src/data/data-in.c:408
 msgid "Bad sign byte in zoned decimal number."
 msgstr ""
 
 msgid "Bad sign byte in zoned decimal number."
 msgstr ""
 
-#: src/data/data-in.c:430
+#: src/data/data-in.c:428
 msgid "Format error in zoned decimal number."
 msgstr ""
 
 msgid "Format error in zoned decimal number."
 msgstr ""
 
-#: src/data/data-in.c:444
+#: src/data/data-in.c:442
 msgid "Error in syntax of zoned decimal number."
 msgstr ""
 
 msgid "Error in syntax of zoned decimal number."
 msgstr ""
 
-#: src/data/data-in.c:637
+#: src/data/data-in.c:635
 msgid "Unexpected end of field."
 msgstr ""
 
 msgid "Unexpected end of field."
 msgstr ""
 
-#: src/data/data-in.c:663
+#: src/data/data-in.c:661
 msgid "Digit expected in field."
 msgstr ""
 
 msgid "Digit expected in field."
 msgstr ""
 
-#: src/data/data-in.c:688
+#: src/data/data-in.c:686
 #, c-format
 msgid "Day (%ld) must be between 1 and 31."
 msgstr ""
 
 #, c-format
 msgid "Day (%ld) must be between 1 and 31."
 msgstr ""
 
-#: src/data/data-in.c:713
+#: src/data/data-in.c:711
 msgid "Delimiter expected between fields in date."
 msgstr ""
 
 msgid "Delimiter expected between fields in date."
 msgstr ""
 
-#: src/data/data-in.c:746
+#: src/data/data-in.c:744
 #, c-format
 msgid "Parse error at `%c' expecting %s."
 msgstr ""
 
 #, c-format
 msgid "Parse error at `%c' expecting %s."
 msgstr ""
 
-#: src/data/data-in.c:760
+#: src/data/data-in.c:758
 #, c-format
 msgid "Unknown %s `%.*s'."
 msgstr ""
 
 #, c-format
 msgid "Unknown %s `%.*s'."
 msgstr ""
 
-#: src/data/data-in.c:810
+#: src/data/data-in.c:808
 #, c-format
 msgid "Month (%ld) must be between 1 and 12."
 msgstr ""
 
 #, c-format
 msgid "Month (%ld) must be between 1 and 12."
 msgstr ""
 
-#: src/data/data-in.c:814
+#: src/data/data-in.c:812
 msgid "month"
 msgstr ""
 
 msgid "month"
 msgstr ""
 
-#: src/data/data-in.c:828
+#: src/data/data-in.c:826
 #, c-format
 msgid "Year (%ld) must be between 1582 and 19999."
 msgstr ""
 
 #, c-format
 msgid "Year (%ld) must be between 1582 and 19999."
 msgstr ""
 
-#: src/data/data-in.c:839
+#: src/data/data-in.c:837
 #, c-format
 msgid "Trailing garbage \"%s\" following date."
 msgstr ""
 
 #, c-format
 msgid "Trailing garbage \"%s\" following date."
 msgstr ""
 
-#: src/data/data-in.c:854
+#: src/data/data-in.c:852
 #, c-format
 msgid "Julian day (%d) must be between 1 and 366."
 msgstr ""
 
 #, c-format
 msgid "Julian day (%d) must be between 1 and 366."
 msgstr ""
 
-#: src/data/data-in.c:866
+#: src/data/data-in.c:864
 #, c-format
 msgid "Year (%d) must be between 1582 and 19999."
 msgstr ""
 
 #, c-format
 msgid "Year (%d) must be between 1582 and 19999."
 msgstr ""
 
-#: src/data/data-in.c:882
+#: src/data/data-in.c:880
 #, c-format
 msgid "Quarter (%ld) must be between 1 and 4."
 msgstr ""
 
 #, c-format
 msgid "Quarter (%ld) must be between 1 and 4."
 msgstr ""
 
-#: src/data/data-in.c:892
+#: src/data/data-in.c:890
 msgid "`Q' expected between quarter and year."
 msgstr ""
 
 msgid "`Q' expected between quarter and year."
 msgstr ""
 
-#: src/data/data-in.c:908
+#: src/data/data-in.c:906
 #, c-format
 msgid "Week (%ld) must be between 1 and 53."
 msgstr ""
 
 #, c-format
 msgid "Week (%ld) must be between 1 and 53."
 msgstr ""
 
-#: src/data/data-in.c:920
+#: src/data/data-in.c:918
 msgid "`WK' expected between week and year."
 msgstr ""
 
 msgid "`WK' expected between week and year."
 msgstr ""
 
-#: src/data/data-in.c:943
+#: src/data/data-in.c:941
 msgid "Delimiter expected between fields in time."
 msgstr ""
 
 msgid "Delimiter expected between fields in time."
 msgstr ""
 
-#: src/data/data-in.c:955
+#: src/data/data-in.c:953
 #, c-format
 msgid "Hour (%ld) must be positive."
 msgstr ""
 
 #, c-format
 msgid "Hour (%ld) must be positive."
 msgstr ""
 
-#: src/data/data-in.c:967
+#: src/data/data-in.c:965
 #, c-format
 msgid "Minute (%ld) must be between 0 and 59."
 msgstr ""
 
 #, c-format
 msgid "Minute (%ld) must be between 0 and 59."
 msgstr ""
 
-#: src/data/data-in.c:1014
+#: src/data/data-in.c:1012
 #, c-format
 msgid "Hour (%ld) must be between 0 and 23."
 msgstr ""
 
 #, c-format
 msgid "Hour (%ld) must be between 0 and 23."
 msgstr ""
 
-#: src/data/data-in.c:1042
+#: src/data/data-in.c:1040
 msgid "weekday"
 msgstr ""
 
 msgid "weekday"
 msgstr ""
 
-#: src/data/data-in.c:1373
+#: src/data/data-in.c:1371
 #, c-format
 msgid "Field too long (%d characters).  Truncated after character %d."
 msgstr ""
 
 #, c-format
 msgid "Field too long (%d characters).  Truncated after character %d."
 msgstr ""
 
-#: src/data/data-out.c:247
+#: src/data/data-out.c:245
 msgid ""
 "The N output format cannot be used to output a negative number or the system-"
 "missing value."
 msgstr ""
 
 msgid ""
 "The N output format cannot be used to output a negative number or the system-"
 "missing value."
 msgstr ""
 
-#: src/data/data-out.c:361
+#: src/data/data-out.c:359
 #, c-format
 msgid ""
 "Quality of zoned decimal (Z) output format code is suspect.  Check your "
 "results. Report bugs to %s."
 msgstr ""
 
 #, c-format
 msgid ""
 "Quality of zoned decimal (Z) output format code is suspect.  Check your "
 "results. Report bugs to %s."
 msgstr ""
 
-#: src/data/data-out.c:369
+#: src/data/data-out.c:367
 msgid "The system-missing value cannot be output as a zoned decimal number."
 msgstr ""
 
 msgid "The system-missing value cannot be output as a zoned decimal number."
 msgstr ""
 
-#: src/data/data-out.c:382
+#: src/data/data-out.c:380
 #, c-format
 msgid "Number %g too big to fit in field with format Z%d.%d."
 msgstr ""
 
 #, c-format
 msgid "Number %g too big to fit in field with format Z%d.%d."
 msgstr ""
 
-#: src/data/data-out.c:776
+#: src/data/data-out.c:774
 #, c-format
 msgid "Time value %g too large in magnitude to convert to alphanumeric time."
 msgstr ""
 
 #, c-format
 msgid "Time value %g too large in magnitude to convert to alphanumeric time."
 msgstr ""
 
-#: src/data/data-out.c:827
+#: src/data/data-out.c:825
 #, c-format
 msgid "Weekday index %f does not lie between 1 and 7."
 msgstr ""
 
 #, c-format
 msgid "Weekday index %f does not lie between 1 and 7."
 msgstr ""
 
-#: src/data/data-out.c:847
+#: src/data/data-out.c:845
 #, c-format
 msgid "Month index %f does not lie between 1 and 12."
 msgstr ""
 
 #, c-format
 msgid "Month index %f does not lie between 1 and 12."
 msgstr ""
 
-#: src/data/data-out.c:960
+#: src/data/data-out.c:958
 #, c-format
 msgid ""
 "Year %d cannot be represented in four digits for output formatting purposes."
 #, c-format
 msgid ""
 "Year %d cannot be represented in four digits for output formatting purposes."
@@ -312,21 +312,21 @@ msgstr ""
 msgid "Can't re-open %s as a %s for %s."
 msgstr ""
 
 msgid "Can't re-open %s as a %s for %s."
 msgstr ""
 
-#: src/data/filename.c:253
+#: src/data/file-name.c:236
 #, c-format
 #, c-format
-msgid "Searching for `%s'..."
+msgid "searching for \"%s\" in path \"%s\""
 msgstr ""
 
 msgstr ""
 
-#: src/data/filename.c:261 src/data/filename.c:293
-msgid "Search unsuccessful!"
+#: src/data/file-name.c:263
+#, c-format
+msgid "...found \"%s\""
 msgstr ""
 
 msgstr ""
 
-#: src/data/filename.c:286
-#, c-format
-msgid "Found `%s'."
+#: src/data/file-name.c:271
+msgid "...not found"
 msgstr ""
 
 msgstr ""
 
-#: src/data/filename.c:703
+#: src/data/file-name.c:624
 #, c-format
 msgid "Not opening pipe file `%s' because SAFER option set."
 msgstr ""
 #, c-format
 msgid "Not opening pipe file `%s' because SAFER option set."
 msgstr ""
@@ -388,30 +388,30 @@ msgid "%s variables are not compatible with %s format %s."
 msgstr ""
 
 #: src/data/format.c:197 src/data/por-file-reader.c:481
 msgstr ""
 
 #: src/data/format.c:197 src/data/por-file-reader.c:481
-#: src/data/sys-file-reader.c:994 src/data/sys-file-reader.c:1003
+#: src/data/sys-file-reader.c:997 src/data/sys-file-reader.c:1006
 #: src/ui/gui/psppire-var-store.c:435
 msgid "String"
 msgstr ""
 
 #: src/data/format.c:197 src/data/por-file-reader.c:481
 #: src/ui/gui/psppire-var-store.c:435
 msgid "String"
 msgstr ""
 
 #: src/data/format.c:197 src/data/por-file-reader.c:481
-#: src/data/sys-file-reader.c:994 src/data/sys-file-reader.c:1003
+#: src/data/sys-file-reader.c:997 src/data/sys-file-reader.c:1006
 #: src/ui/gui/psppire-var-store.c:428
 msgid "Numeric"
 msgstr ""
 
 #: src/ui/gui/psppire-var-store.c:428
 msgid "Numeric"
 msgstr ""
 
-#: src/data/format.c:198 src/data/sys-file-reader.c:996
-#: src/data/sys-file-reader.c:1141 src/data/sys-file-reader.c:1142
-#: src/data/variable.c:41 src/language/dictionary/apply-dictionary.c:74
-#: src/language/dictionary/apply-dictionary.c:75
+#: src/data/format.c:198 src/data/sys-file-reader.c:999
+#: src/data/sys-file-reader.c:1144 src/data/sys-file-reader.c:1145
+#: src/data/variable.c:41 src/language/dictionary/apply-dictionary.c:73
+#: src/language/dictionary/apply-dictionary.c:74
 #: src/language/xforms/recode.c:465 src/language/xforms/recode.c:466
 msgid "numeric"
 msgstr ""
 
 #: src/language/xforms/recode.c:465 src/language/xforms/recode.c:466
 msgid "numeric"
 msgstr ""
 
-#: src/data/format.c:198 src/data/sys-file-reader.c:996
-#: src/data/sys-file-reader.c:1141 src/data/sys-file-reader.c:1142
+#: src/data/format.c:198 src/data/sys-file-reader.c:999
+#: src/data/sys-file-reader.c:1144 src/data/sys-file-reader.c:1145
 #: src/data/variable.c:41 src/data/variable.c:49
 #: src/data/variable.c:41 src/data/variable.c:49
+#: src/language/dictionary/apply-dictionary.c:73
 #: src/language/dictionary/apply-dictionary.c:74
 #: src/language/dictionary/apply-dictionary.c:74
-#: src/language/dictionary/apply-dictionary.c:75
 #: src/language/xforms/recode.c:465 src/language/xforms/recode.c:466
 msgid "string"
 msgstr ""
 #: src/language/xforms/recode.c:465 src/language/xforms/recode.c:466
 msgid "string"
 msgstr ""
@@ -431,7 +431,7 @@ msgstr ""
 msgid "%s: Creating file: %s."
 msgstr ""
 
 msgid "%s: Creating file: %s."
 msgstr ""
 
-#: src/data/por-file-reader.c:100
+#: src/data/por-file-reader.c:93
 #, c-format
 msgid "portable file %s corrupt at offset %ld: "
 msgstr ""
 #, c-format
 msgid "portable file %s corrupt at offset %ld: "
 msgstr ""
@@ -478,12 +478,12 @@ msgstr ""
 msgid "Bad time string length %d."
 msgstr ""
 
 msgid "Bad time string length %d."
 msgstr ""
 
-#: src/data/por-file-reader.c:473 src/data/sys-file-reader.c:986
+#: src/data/por-file-reader.c:473 src/data/sys-file-reader.c:989
 #, c-format
 msgid "%s: Bad format specifier byte (%d)."
 msgstr ""
 
 #, c-format
 msgid "%s: Bad format specifier byte (%d)."
 msgstr ""
 
-#: src/data/por-file-reader.c:480 src/data/sys-file-reader.c:1002
+#: src/data/por-file-reader.c:480 src/data/sys-file-reader.c:1005
 #, c-format
 msgid "%s variable %s has invalid format specifier %s."
 msgstr ""
 #, c-format
 msgid "%s variable %s has invalid format specifier %s."
 msgstr ""
@@ -548,18 +548,18 @@ msgstr ""
 msgid "Duplicate label for value `%.*s' for variable %s."
 msgstr ""
 
 msgid "Duplicate label for value `%.*s' for variable %s."
 msgstr ""
 
-#: src/data/por-file-writer.c:145
+#: src/data/por-file-writer.c:143
 #, c-format
 msgid "Invalid decimal digits count %d.  Treating as %d."
 msgstr ""
 
 #, c-format
 msgid "Invalid decimal digits count %d.  Treating as %d."
 msgstr ""
 
-#: src/data/por-file-writer.c:165
+#: src/data/por-file-writer.c:163
 #, c-format
 msgid ""
 "An error occurred while opening \"%s\" for writing as a portable file: %s."
 msgstr ""
 
 #, c-format
 msgid ""
 "An error occurred while opening \"%s\" for writing as a portable file: %s."
 msgstr ""
 
-#: src/data/por-file-writer.c:449
+#: src/data/por-file-writer.c:447
 #, c-format
 msgid "An I/O error occurred writing portable file \"%s\"."
 msgstr ""
 #, c-format
 msgid "An I/O error occurred writing portable file \"%s\"."
 msgstr ""
@@ -576,135 +576,135 @@ msgstr ""
 msgid "Could not access definition for terminal `%s'."
 msgstr ""
 
 msgid "Could not access definition for terminal `%s'."
 msgstr ""
 
-#: src/data/sys-file-reader.c:134
+#: src/data/sys-file-reader.c:130
 msgid "corrupt system file: "
 msgstr ""
 
 msgid "corrupt system file: "
 msgstr ""
 
-#: src/data/sys-file-reader.c:151
+#: src/data/sys-file-reader.c:154
 #, c-format
 msgid "%s: Closing system file: %s."
 msgstr ""
 
 #, c-format
 msgid "%s: Closing system file: %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:242
+#: src/data/sys-file-reader.c:245
 #, c-format
 msgid ""
 "An error occurred while opening \"%s\" for reading as a system file: %s."
 msgstr ""
 
 #, c-format
 msgid ""
 "An error occurred while opening \"%s\" for reading as a system file: %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:259
+#: src/data/sys-file-reader.c:262
 #, c-format
 msgid ""
 "%s: Index of weighting variable (%d) is not between 0 and number of elements "
 "per case (%d)."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: Index of weighting variable (%d) is not between 0 and number of elements "
 "per case (%d)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:268
+#: src/data/sys-file-reader.c:271
 #, c-format
 msgid ""
 "%s: Weighting variable may not be a continuation of a long string variable."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: Weighting variable may not be a continuation of a long string variable."
 msgstr ""
 
-#: src/data/sys-file-reader.c:271
+#: src/data/sys-file-reader.c:274
 #, c-format
 msgid "%s: Weighting variable may not be a string variable."
 msgstr ""
 
 #, c-format
 msgid "%s: Weighting variable may not be a string variable."
 msgstr ""
 
-#: src/data/sys-file-reader.c:296
+#: src/data/sys-file-reader.c:299
 #, c-format
 msgid ""
 "%s: Orphaned variable index record (type 4).  Type 4 records must always "
 "immediately follow type 3 records."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: Orphaned variable index record (type 4).  Type 4 records must always "
 "immediately follow type 3 records."
 msgstr ""
 
-#: src/data/sys-file-reader.c:354
+#: src/data/sys-file-reader.c:357
 #, c-format
 msgid "%s: Invalid subrecord length. Record: 7; Subrecord: 11"
 msgstr ""
 
 #, c-format
 msgid "%s: Invalid subrecord length. Record: 7; Subrecord: 11"
 msgstr ""
 
-#: src/data/sys-file-reader.c:408
+#: src/data/sys-file-reader.c:411
 #, c-format
 msgid "%s: Trailing garbage in long variable name map."
 msgstr ""
 
 #, c-format
 msgid "%s: Trailing garbage in long variable name map."
 msgstr ""
 
-#: src/data/sys-file-reader.c:415
+#: src/data/sys-file-reader.c:418
 #, c-format
 msgid "%s: Long variable mapping to invalid variable name `%s'."
 msgstr ""
 
 #, c-format
 msgid "%s: Long variable mapping to invalid variable name `%s'."
 msgstr ""
 
-#: src/data/sys-file-reader.c:425
+#: src/data/sys-file-reader.c:428
 #, c-format
 msgid "%s: Long variable mapping for nonexistent variable %s."
 msgstr ""
 
 #, c-format
 msgid "%s: Long variable mapping for nonexistent variable %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:434
+#: src/data/sys-file-reader.c:437
 #, c-format
 msgid "%s: Duplicate long variable name `%s' within system file."
 msgstr ""
 
 #, c-format
 msgid "%s: Duplicate long variable name `%s' within system file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:461
+#: src/data/sys-file-reader.c:464
 #, c-format
 msgid "%s: Unrecognized record type 7, subtype %d encountered in system file."
 msgstr ""
 
 #, c-format
 msgid "%s: Unrecognized record type 7, subtype %d encountered in system file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:486
+#: src/data/sys-file-reader.c:489
 #, c-format
 msgid "%s: Unrecognized record type %d."
 msgstr ""
 
 #, c-format
 msgid "%s: Unrecognized record type %d."
 msgstr ""
 
-#: src/data/sys-file-reader.c:518
+#: src/data/sys-file-reader.c:521
 #, c-format
 msgid ""
 "%s: Bad size (%d) or count (%d) field on record type 7, subtype 3.\tExpected "
 "size %d, count 8."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: Bad size (%d) or count (%d) field on record type 7, subtype 3.\tExpected "
 "size %d, count 8."
 msgstr ""
 
-#: src/data/sys-file-reader.c:529
+#: src/data/sys-file-reader.c:532
 #, c-format
 msgid ""
 "%s: Floating-point representation in system file is not IEEE-754.  PSPP "
 "cannot convert between floating-point formats."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: Floating-point representation in system file is not IEEE-754.  PSPP "
 "cannot convert between floating-point formats."
 msgstr ""
 
-#: src/data/sys-file-reader.c:545
+#: src/data/sys-file-reader.c:548
 #, c-format
 msgid ""
 "%s: File-indicated endianness (%s) does not match endianness intuited from "
 "file header (%s)."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: File-indicated endianness (%s) does not match endianness intuited from "
 "file header (%s)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:548 src/data/sys-file-reader.c:549
+#: src/data/sys-file-reader.c:551 src/data/sys-file-reader.c:552
 msgid "big-endian"
 msgstr ""
 
 msgid "big-endian"
 msgstr ""
 
-#: src/data/sys-file-reader.c:548 src/data/sys-file-reader.c:549
+#: src/data/sys-file-reader.c:551 src/data/sys-file-reader.c:552
 msgid "little-endian"
 msgstr ""
 
 msgid "little-endian"
 msgstr ""
 
-#: src/data/sys-file-reader.c:550
+#: src/data/sys-file-reader.c:553
 msgid "unknown"
 msgstr ""
 
 msgid "unknown"
 msgstr ""
 
-#: src/data/sys-file-reader.c:554
+#: src/data/sys-file-reader.c:557
 #, c-format
 msgid "%s: File-indicated character representation code (%s) is not ASCII."
 msgstr ""
 
 #, c-format
 msgid "%s: File-indicated character representation code (%s) is not ASCII."
 msgstr ""
 
-#: src/data/sys-file-reader.c:558
+#: src/data/sys-file-reader.c:561
 msgid "DEC Kanji"
 msgstr ""
 
 msgid "DEC Kanji"
 msgstr ""
 
-#: src/data/sys-file-reader.c:558 src/language/dictionary/sys-file-info.c:119
+#: src/data/sys-file-reader.c:561 src/language/dictionary/sys-file-info.c:120
 msgid "Unknown"
 msgstr ""
 
 msgid "Unknown"
 msgstr ""
 
-#: src/data/sys-file-reader.c:574
+#: src/data/sys-file-reader.c:577
 #, c-format
 msgid ""
 "%s: Bad size (%d) or count (%d) field on record type 7, subtype 4.\tExpected "
 "size %d, count 8."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: Bad size (%d) or count (%d) field on record type 7, subtype 4.\tExpected "
 "size %d, count 8."
 msgstr ""
 
-#: src/data/sys-file-reader.c:589
+#: src/data/sys-file-reader.c:592
 #, c-format
 msgid ""
 "%s: File-indicated value is different from internal value for at least one "
 #, c-format
 msgid ""
 "%s: File-indicated value is different from internal value for at least one "
@@ -712,213 +712,213 @@ msgid ""
 "%g; LOWEST: %g, %g."
 msgstr ""
 
 "%g; LOWEST: %g, %g."
 msgstr ""
 
-#: src/data/sys-file-reader.c:616
+#: src/data/sys-file-reader.c:619
 #, c-format
 msgid ""
 "%s: Bad magic.  Proper system files begin with the four characters `$FL2'. "
 "This file will not be read."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: Bad magic.  Proper system files begin with the four characters `$FL2'. "
 "This file will not be read."
 msgstr ""
 
-#: src/data/sys-file-reader.c:658
+#: src/data/sys-file-reader.c:661
 #, c-format
 msgid ""
 "%s: File layout code has unexpected value %d.  Value should be 2, in big-"
 "endian or little-endian format."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: File layout code has unexpected value %d.  Value should be 2, in big-"
 "endian or little-endian format."
 msgstr ""
 
-#: src/data/sys-file-reader.c:686
+#: src/data/sys-file-reader.c:689
 #, c-format
 msgid "%s: Number of cases in file (%ld) is not between -1 and %d."
 msgstr ""
 
 #, c-format
 msgid "%s: Number of cases in file (%ld) is not between -1 and %d."
 msgstr ""
 
-#: src/data/sys-file-reader.c:691
+#: src/data/sys-file-reader.c:694
 #, c-format
 msgid "%s: Compression bias (%g) is not the usual value of 100."
 msgstr ""
 
 #, c-format
 msgid "%s: Compression bias (%g) is not the usual value of 100."
 msgstr ""
 
-#: src/data/sys-file-reader.c:816
+#: src/data/sys-file-reader.c:819
 #, c-format
 msgid ""
 "%s: position %d: String variable does not have proper number of continuation "
 "records."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: position %d: String variable does not have proper number of continuation "
 "records."
 msgstr ""
 
-#: src/data/sys-file-reader.c:827
+#: src/data/sys-file-reader.c:830
 #, c-format
 msgid "%s: position %d: Superfluous long string continuation record."
 msgstr ""
 
 #, c-format
 msgid "%s: position %d: Superfluous long string continuation record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:833
+#: src/data/sys-file-reader.c:836
 #, c-format
 msgid "%s: position %d: Bad variable type code %d."
 msgstr ""
 
 #, c-format
 msgid "%s: position %d: Bad variable type code %d."
 msgstr ""
 
-#: src/data/sys-file-reader.c:836
+#: src/data/sys-file-reader.c:839
 #, c-format
 msgid "%s: position %d: Variable label indicator field is not 0 or 1."
 msgstr ""
 
 #, c-format
 msgid "%s: position %d: Variable label indicator field is not 0 or 1."
 msgstr ""
 
-#: src/data/sys-file-reader.c:840
+#: src/data/sys-file-reader.c:843
 #, c-format
 msgid ""
 "%s: position %d: Missing value indicator field is not -3, -2, 0, 1, 2, or 3."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: position %d: Missing value indicator field is not -3, -2, 0, 1, 2, or 3."
 msgstr ""
 
-#: src/data/sys-file-reader.c:845
+#: src/data/sys-file-reader.c:848
 #, c-format
 msgid "%s: position %d: Variable name begins with invalid character."
 msgstr ""
 
 #, c-format
 msgid "%s: position %d: Variable name begins with invalid character."
 msgstr ""
 
-#: src/data/sys-file-reader.c:864
+#: src/data/sys-file-reader.c:867
 #, c-format
 msgid "%s: Invalid variable name `%s' within system file."
 msgstr ""
 
 #, c-format
 msgid "%s: Invalid variable name `%s' within system file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:870
+#: src/data/sys-file-reader.c:873
 #, c-format
 msgid "%s: Duplicate variable name `%s' within system file."
 msgstr ""
 
 #, c-format
 msgid "%s: Duplicate variable name `%s' within system file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:893
+#: src/data/sys-file-reader.c:896
 #, c-format
 msgid "%s: Variable %s indicates variable label of invalid length %d."
 msgstr ""
 
 #, c-format
 msgid "%s: Variable %s indicates variable label of invalid length %d."
 msgstr ""
 
-#: src/data/sys-file-reader.c:914
+#: src/data/sys-file-reader.c:917
 #, c-format
 msgid "%s: Long string variable %s may not have missing values."
 msgstr ""
 
 #, c-format
 msgid "%s: Long string variable %s may not have missing values."
 msgstr ""
 
-#: src/data/sys-file-reader.c:935
+#: src/data/sys-file-reader.c:938
 #, c-format
 msgid ""
 "%s: String variable %s may not have missing values specified as a range."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: String variable %s may not have missing values specified as a range."
 msgstr ""
 
-#: src/data/sys-file-reader.c:962
+#: src/data/sys-file-reader.c:965
 #, c-format
 msgid "%s: Long string continuation records omitted at end of dictionary."
 msgstr ""
 
 #, c-format
 msgid "%s: Long string continuation records omitted at end of dictionary."
 msgstr ""
 
-#: src/data/sys-file-reader.c:967
+#: src/data/sys-file-reader.c:970
 #, c-format
 msgid ""
 "%s: System file header indicates %d variable positions but %d were read from "
 "file."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: System file header indicates %d variable positions but %d were read from "
 "file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:992
+#: src/data/sys-file-reader.c:995
 #, c-format
 msgid "%s: %s variable %s has %s format specifier %s."
 msgstr ""
 
 #, c-format
 msgid "%s: %s variable %s has %s format specifier %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1045
+#: src/data/sys-file-reader.c:1048
 #, c-format
 msgid "%s: Invalid number of labels: %d.  Ignoring labels."
 msgstr ""
 
 #, c-format
 msgid "%s: Invalid number of labels: %d.  Ignoring labels."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1087
+#: src/data/sys-file-reader.c:1090
 #, c-format
 msgid ""
 "%s: Variable index record (type 4) does not immediately follow value label "
 "record (type 3) as it should."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: Variable index record (type 4) does not immediately follow value label "
 "record (type 3) as it should."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1098
+#: src/data/sys-file-reader.c:1101
 #, c-format
 msgid ""
 "%s: Number of variables associated with a value label (%d) is not between 1 "
 "and the number of variables (%d)."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: Number of variables associated with a value label (%d) is not between 1 "
 "and the number of variables (%d)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1114
+#: src/data/sys-file-reader.c:1117
 #, c-format
 msgid ""
 "%s: Variable index associated with value label (%d) is not between 1 and the "
 "number of values (%d)."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: Variable index associated with value label (%d) is not between 1 and the "
 "number of values (%d)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1121
+#: src/data/sys-file-reader.c:1124
 #, c-format
 msgid ""
 "%s: Variable index associated with value label (%d) refers to a continuation "
 "of a string variable, not to an actual variable."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: Variable index associated with value label (%d) refers to a continuation "
 "of a string variable, not to an actual variable."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1126
+#: src/data/sys-file-reader.c:1129
 #, c-format
 msgid "%s: Value labels are not allowed on long string variables (%s)."
 msgstr ""
 
 #, c-format
 msgid "%s: Value labels are not allowed on long string variables (%s)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1137
+#: src/data/sys-file-reader.c:1140
 #, c-format
 msgid ""
 "%s: Variables associated with value label are not all of identical type.  "
 "Variable %s has %s type, but variable %s has %s type."
 msgstr ""
 
 #, c-format
 msgid ""
 "%s: Variables associated with value label are not all of identical type.  "
 "Variable %s has %s type, but variable %s has %s type."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1178
+#: src/data/sys-file-reader.c:1181
 #, c-format
 msgid "%s: File contains duplicate label for value %g for variable %s."
 msgstr ""
 
 #, c-format
 msgid "%s: File contains duplicate label for value %g for variable %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1182
+#: src/data/sys-file-reader.c:1185
 #, c-format
 msgid "%s: File contains duplicate label for value `%.*s' for variable %s."
 msgstr ""
 
 #, c-format
 msgid "%s: File contains duplicate label for value `%.*s' for variable %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1224 src/data/sys-file-reader.c:1507
+#: src/data/sys-file-reader.c:1227 src/data/sys-file-reader.c:1510
 #, c-format
 msgid "%s: Reading system file: %s."
 msgstr ""
 
 #, c-format
 msgid "%s: Reading system file: %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1227 src/data/sys-file-reader.c:1345
-#: src/data/sys-file-reader.c:1386
+#: src/data/sys-file-reader.c:1230 src/data/sys-file-reader.c:1348
+#: src/data/sys-file-reader.c:1389
 #, c-format
 msgid "%s: Unexpected end of file."
 msgstr ""
 
 #, c-format
 msgid "%s: Unexpected end of file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1243
+#: src/data/sys-file-reader.c:1246
 #, c-format
 msgid "%s: Seeking system file: %s."
 msgstr ""
 
 #, c-format
 msgid "%s: Seeking system file: %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1258
+#: src/data/sys-file-reader.c:1261
 #, c-format
 msgid "%s: System file contains multiple type 6 (document) records."
 msgstr ""
 
 #, c-format
 msgid "%s: System file contains multiple type 6 (document) records."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1264
+#: src/data/sys-file-reader.c:1267
 #, c-format
 msgid "%s: Number of document lines (%ld) must be greater than 0."
 msgstr ""
 
 #, c-format
 msgid "%s: Number of document lines (%ld) must be greater than 0."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1298
+#: src/data/sys-file-reader.c:1301
 #, c-format
 msgid "%s: Error reading file: %s."
 msgstr ""
 
 #, c-format
 msgid "%s: Error reading file: %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1337
+#: src/data/sys-file-reader.c:1340
 #, c-format
 msgid "%s: Compressed data is corrupted.  Data ends in partial case."
 msgstr ""
 
 #, c-format
 msgid "%s: Compressed data is corrupted.  Data ends in partial case."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1513
+#: src/data/sys-file-reader.c:1516
 #, c-format
 msgid "%s: Partial record at end of system file."
 msgstr ""
 
 #, c-format
 msgid "%s: Partial record at end of system file."
 msgstr ""
 
-#: src/data/sys-file-writer.c:141
+#: src/data/sys-file-writer.c:139
 #, c-format
 msgid "Unknown system file version %d. Treating as version %d."
 msgstr ""
 
 #, c-format
 msgid "Unknown system file version %d. Treating as version %d."
 msgstr ""
 
-#: src/data/sys-file-writer.c:250
+#: src/data/sys-file-writer.c:248
 #, c-format
 msgid "Error opening \"%s\" for writing as a system file: %s."
 msgstr ""
 
 #, c-format
 msgid "Error opening \"%s\" for writing as a system file: %s."
 msgstr ""
 
-#: src/data/sys-file-writer.c:897
+#: src/data/sys-file-writer.c:895
 #, c-format
 msgid "An I/O error occurred writing system file \"%s\"."
 msgstr ""
 #, c-format
 msgid "An I/O error occurred writing system file \"%s\"."
 msgstr ""
@@ -969,83 +969,95 @@ msgstr ""
 msgid "scratch"
 msgstr ""
 
 msgid "scratch"
 msgstr ""
 
-#: src/language/command.c:141
+#: src/language/command.c:159
 #, c-format
 #, c-format
-msgid "%s not allowed inside FILE TYPE/END FILE TYPE."
+msgid "%s may be used only in testing mode."
 msgstr ""
 
 msgstr ""
 
-#: src/language/command.c:144
+#: src/language/command.c:164
 #, c-format
 #, c-format
-msgid "%s not allowed inside FILE TYPE GROUPED/END FILE TYPE."
+msgid "%s may be used only in enhanced syntax mode."
 msgstr ""
 
 msgstr ""
 
-#: src/language/command.c:147
-msgid "RECORD TYPE must be the first command inside a FILE TYPE structure."
+#: src/language/command.c:414
+msgid "expecting command name"
 msgstr ""
 
 msgstr ""
 
-#: src/language/command.c:194
-msgid "expecting command name"
+#: src/language/command.c:428
+#, c-format
+msgid "Unknown command %s."
+msgstr ""
+
+#: src/language/command.c:550
+msgid "before the active file has been defined"
+msgstr ""
+
+#: src/language/command.c:552
+msgid "after the active file has been defined"
+msgstr ""
+
+#: src/language/command.c:554
+msgid "inside INPUT PROGRAM"
+msgstr ""
+
+#: src/language/command.c:556
+msgid "inside FILE TYPE"
 msgstr ""
 
 msgstr ""
 
-#: src/language/command.c:204 src/language/expressions/parse.c:1222
-#: src/ui/terminal/command-line.c:125 src/ui/terminal/command-line.c:144
-#: src/ui/terminal/command-line.c:156
+#: src/language/command.c:561
 #, c-format
 #, c-format
-msgid "%s is not yet implemented."
+msgid "%s or %s"
 msgstr ""
 
 msgstr ""
 
-#: src/language/command.c:223
+#: src/language/command.c:563
 #, c-format
 #, c-format
-msgid ""
-"%s is not allowed (1) before a command to specify the input program, such as "
-"DATA LIST, (2) between FILE TYPE and END FILE TYPE, (3) between INPUT "
-"PROGRAM and END INPUT PROGRAM."
+msgid "%s, %s, or %s"
 msgstr ""
 
 msgstr ""
 
-#: src/language/command.c:227
+#: src/language/command.c:567
 #, c-format
 #, c-format
-msgid "%s is not allowed within an input program."
+msgid "%s is allowed only %s."
 msgstr ""
 
 msgstr ""
 
-#: src/language/command.c:228 src/language/command.c:229
+#: src/language/command.c:572
 #, c-format
 #, c-format
-msgid "%s is only allowed within an input program."
+msgid "%s is not allowed inside INPUT PROGRAM."
 msgstr ""
 
 msgstr ""
 
-#: src/language/command.c:504
+#: src/language/command.c:574
 #, c-format
 #, c-format
-msgid "Unknown command %s."
+msgid "%s is not allowed inside FILE TYPE."
 msgstr ""
 
 msgstr ""
 
-#: src/language/command.c:645 src/language/command.c:776
+#: src/language/command.c:666 src/language/command.c:797
 #: src/language/utilities/permissions.c:102
 msgid "This command not allowed when the SAFER option is set."
 msgstr ""
 
 #: src/language/utilities/permissions.c:102
 msgid "This command not allowed when the SAFER option is set."
 msgstr ""
 
-#: src/language/command.c:657
+#: src/language/command.c:678
 #, c-format
 msgid "Error removing `%s': %s."
 msgstr ""
 
 #, c-format
 msgid "Error removing `%s': %s."
 msgstr ""
 
-#: src/language/command.c:707
+#: src/language/command.c:728
 #, c-format
 msgid "Couldn't fork: %s."
 msgstr ""
 
 #, c-format
 msgid "Couldn't fork: %s."
 msgstr ""
 
-#: src/language/command.c:749
+#: src/language/command.c:770
 #, c-format
 msgid "Error executing command: %s."
 msgstr ""
 
 #, c-format
 msgid "Error executing command: %s."
 msgstr ""
 
-#: src/language/command.c:758 src/language/data-io/matrix-data.c:534
-#: src/language/data-io/print.c:336 src/language/data-io/print.c:1051
+#: src/language/command.c:779 src/language/data-io/matrix-data.c:532
+#: src/language/data-io/print.c:336 src/language/data-io/print.c:1038
 #: src/language/dictionary/vector.c:197 src/language/lexer/lexer.c:453
 #: src/language/stats/autorecode.c:144 src/language/xforms/select-if.c:57
 #: src/language/xforms/select-if.c:137
 msgid "expecting end of command"
 msgstr ""
 
 #: src/language/dictionary/vector.c:197 src/language/lexer/lexer.c:453
 #: src/language/stats/autorecode.c:144 src/language/xforms/select-if.c:57
 #: src/language/xforms/select-if.c:137
 msgid "expecting end of command"
 msgstr ""
 
-#: src/language/command.c:797
+#: src/language/command.c:818
 msgid "No operating system support for this command."
 msgstr ""
 
 msgid "No operating system support for this command."
 msgstr ""
 
@@ -1068,28 +1080,28 @@ msgstr ""
 msgid "This command may not follow ELSE in DO IF...END IF."
 msgstr ""
 
 msgid "This command may not follow ELSE in DO IF...END IF."
 msgstr ""
 
-#: src/language/control/repeat.c:137
+#: src/language/control/repeat.c:135
 #, c-format
 msgid "Dummy variable name \"%s\" hides dictionary variable \"%s\"."
 msgstr ""
 
 #, c-format
 msgid "Dummy variable name \"%s\" hides dictionary variable \"%s\"."
 msgstr ""
 
-#: src/language/control/repeat.c:143
+#: src/language/control/repeat.c:141
 #, c-format
 msgid "Dummy variable name \"%s\" is given twice."
 msgstr ""
 
 #, c-format
 msgid "Dummy variable name \"%s\" is given twice."
 msgstr ""
 
-#: src/language/control/repeat.c:184
+#: src/language/control/repeat.c:182
 #, c-format
 msgid ""
 "Dummy variable \"%s\" had %d substitutions, so \"%s\" must also, but %d were "
 "specified."
 msgstr ""
 
 #, c-format
 msgid ""
 "Dummy variable \"%s\" had %d substitutions, so \"%s\" must also, but %d were "
 "specified."
 msgstr ""
 
-#: src/language/control/repeat.c:453
+#: src/language/control/repeat.c:451
 msgid "String expected."
 msgstr ""
 
 msgid "String expected."
 msgstr ""
 
-#: src/language/control/repeat.c:480
+#: src/language/control/repeat.c:478
 msgid "No matching DO REPEAT."
 msgstr ""
 
 msgid "No matching DO REPEAT."
 msgstr ""
 
@@ -1122,7 +1134,7 @@ msgid ""
 "fields must be listed in order of increasing record number."
 msgstr ""
 
 "fields must be listed in order of increasing record number."
 msgstr ""
 
-#: src/language/data-io/data-list.c:378 src/language/data-io/data-list.c:1727
+#: src/language/data-io/data-list.c:378 src/language/data-io/data-list.c:1729
 msgid ""
 "SPSS-like or FORTRAN-like format specification expected after variable names."
 msgstr ""
 msgid ""
 "SPSS-like or FORTRAN-like format specification expected after variable names."
 msgstr ""
@@ -1194,9 +1206,9 @@ msgstr ""
 
 #: src/language/data-io/data-list.c:783 src/language/data-io/data-list.c:901
 #: src/language/data-io/print.c:798
 
 #: src/language/data-io/data-list.c:783 src/language/data-io/data-list.c:901
 #: src/language/data-io/print.c:798
-#: src/language/dictionary/sys-file-info.c:139
-#: src/language/dictionary/sys-file-info.c:373
-#: src/language/stats/descriptives.c:887 src/procedure.c:886
+#: src/language/dictionary/sys-file-info.c:140
+#: src/language/dictionary/sys-file-info.c:374
+#: src/language/stats/descriptives.c:887 src/procedure.c:878
 msgid "Variable"
 msgstr ""
 
 msgid "Variable"
 msgstr ""
 
@@ -1248,182 +1260,182 @@ msgid ""
 "with the system-missing value or blanks, as appropriate."
 msgstr ""
 
 "with the system-missing value or blanks, as appropriate."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1390
+#: src/language/data-io/data-list.c:1392
 msgid ""
 "REPEATING DATA must use the same file as its corresponding DATA LIST or FILE "
 "TYPE."
 msgstr ""
 
 msgid ""
 "REPEATING DATA must use the same file as its corresponding DATA LIST or FILE "
 "TYPE."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1400 src/language/data-io/data-list.c:1434
-#: src/language/data-io/data-list.c:1447 src/language/data-io/data-list.c:1460
-#: src/language/data-io/data-list.c:1494
+#: src/language/data-io/data-list.c:1402 src/language/data-io/data-list.c:1436
+#: src/language/data-io/data-list.c:1449 src/language/data-io/data-list.c:1462
+#: src/language/data-io/data-list.c:1496
 #, c-format
 msgid "%s subcommand given multiple times."
 msgstr ""
 
 #, c-format
 msgid "%s subcommand given multiple times."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1423
+#: src/language/data-io/data-list.c:1425
 #, c-format
 msgid "STARTS beginning column (%d) exceeds STARTS ending column (%d)."
 msgstr ""
 
 #, c-format
 msgid "STARTS beginning column (%d) exceeds STARTS ending column (%d)."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1480
+#: src/language/data-io/data-list.c:1482
 #, c-format
 msgid "CONTINUED beginning column (%d) exceeds CONTINUED ending column (%d)."
 msgstr ""
 
 #, c-format
 msgid "CONTINUED beginning column (%d) exceeds CONTINUED ending column (%d)."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1503
+#: src/language/data-io/data-list.c:1505
 #, c-format
 msgid "ID beginning column (%ld) must be positive."
 msgstr ""
 
 #, c-format
 msgid "ID beginning column (%ld) must be positive."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1518
+#: src/language/data-io/data-list.c:1520
 #, c-format
 msgid "ID ending column (%ld) must be positive."
 msgstr ""
 
 #, c-format
 msgid "ID ending column (%ld) must be positive."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1524
+#: src/language/data-io/data-list.c:1526
 #, c-format
 msgid "ID ending column (%ld) cannot be less than ID beginning column (%d)."
 msgstr ""
 
 #, c-format
 msgid "ID ending column (%ld) cannot be less than ID beginning column (%d)."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1564
+#: src/language/data-io/data-list.c:1566
 msgid "Missing required specification STARTS."
 msgstr ""
 
 msgid "Missing required specification STARTS."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1566
+#: src/language/data-io/data-list.c:1568
 msgid "Missing required specification OCCURS."
 msgstr ""
 
 msgid "Missing required specification OCCURS."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1573
+#: src/language/data-io/data-list.c:1575
 msgid "ID specified without CONTINUED."
 msgstr ""
 
 msgid "ID specified without CONTINUED."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1584
+#: src/language/data-io/data-list.c:1586
 #, c-format
 msgid ""
 "STARTS beginning column (%d) exceeds default STARTS ending column taken from "
 "file's record width (%d)."
 msgstr ""
 
 #, c-format
 msgid ""
 "STARTS beginning column (%d) exceeds default STARTS ending column taken from "
 "file's record width (%d)."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1597
+#: src/language/data-io/data-list.c:1599
 #, c-format
 msgid ""
 "CONTINUED beginning column (%d) exceeds default CONTINUED ending column "
 "taken from file's record width (%d)."
 msgstr ""
 
 #, c-format
 msgid ""
 "CONTINUED beginning column (%d) exceeds default CONTINUED ending column "
 "taken from file's record width (%d)."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1676
+#: src/language/data-io/data-list.c:1678
 msgid "String variable not allowed here."
 msgstr ""
 
 msgid "String variable not allowed here."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1686
+#: src/language/data-io/data-list.c:1688
 #, c-format
 msgid "%s (%d) must be at least 1."
 msgstr ""
 
 #, c-format
 msgid "%s (%d) must be at least 1."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1692
+#: src/language/data-io/data-list.c:1694
 #, c-format
 msgid "Variable or integer expected for %s."
 msgstr ""
 
 #, c-format
 msgid "Variable or integer expected for %s."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1817
+#: src/language/data-io/data-list.c:1819
 #, c-format
 msgid "Encountered mismatched record ID \"%s\" expecting \"%s\"."
 msgstr ""
 
 #, c-format
 msgid "Encountered mismatched record ID \"%s\" expecting \"%s\"."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1849
+#: src/language/data-io/data-list.c:1852
 #, c-format
 msgid ""
 "Variable %s starting in column %d extends beyond physical record length of %"
 "d."
 msgstr ""
 
 #, c-format
 msgid ""
 "Variable %s starting in column %d extends beyond physical record length of %"
 "d."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1916
+#: src/language/data-io/data-list.c:1919
 #, c-format
 msgid "Invalid value %d for OCCURS."
 msgstr ""
 
 #, c-format
 msgid "Invalid value %d for OCCURS."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1922
+#: src/language/data-io/data-list.c:1925
 #, c-format
 msgid "Beginning column for STARTS (%d) must be at least 1."
 msgstr ""
 
 #, c-format
 msgid "Beginning column for STARTS (%d) must be at least 1."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1930
+#: src/language/data-io/data-list.c:1932
 #, c-format
 msgid "Ending column for STARTS (%d) is less than beginning column (%d)."
 msgstr ""
 
 #, c-format
 msgid "Ending column for STARTS (%d) is less than beginning column (%d)."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1938
+#: src/language/data-io/data-list.c:1940
 #, c-format
 msgid "Invalid value %d for LENGTH."
 msgstr ""
 
 #, c-format
 msgid "Invalid value %d for LENGTH."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1945
+#: src/language/data-io/data-list.c:1947
 #, c-format
 msgid "Beginning column for CONTINUED (%d) must be at least 1."
 msgstr ""
 
 #, c-format
 msgid "Beginning column for CONTINUED (%d) must be at least 1."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1953
+#: src/language/data-io/data-list.c:1955
 #, c-format
 msgid "Ending column for CONTINUED (%d) is less than beginning column (%d)."
 msgstr ""
 
 #, c-format
 msgid "Ending column for CONTINUED (%d) is less than beginning column (%d)."
 msgstr ""
 
-#: src/language/data-io/data-list.c:1985
+#: src/language/data-io/data-list.c:1987
 #, c-format
 msgid ""
 "Number of repetitions specified on OCCURS (%d) exceed number of repetitions "
 "available in space on STARTS (%d), and CONTINUED not specified."
 msgstr ""
 
 #, c-format
 msgid ""
 "Number of repetitions specified on OCCURS (%d) exceed number of repetitions "
 "available in space on STARTS (%d), and CONTINUED not specified."
 msgstr ""
 
-#: src/language/data-io/data-list.c:2003
+#: src/language/data-io/data-list.c:2005
 #, c-format
 msgid "Unexpected end of file with %d repetitions remaining out of %d."
 msgstr ""
 
 #, c-format
 msgid "Unexpected end of file with %d repetitions remaining out of %d."
 msgstr ""
 
-#: src/language/data-io/data-reader.c:138
+#: src/language/data-io/data-reader.c:131
 #, c-format
 msgid "Could not open \"%s\" for reading as a data file: %s."
 msgstr ""
 
 #, c-format
 msgid "Could not open \"%s\" for reading as a data file: %s."
 msgstr ""
 
-#: src/language/data-io/data-reader.c:175
+#: src/language/data-io/data-reader.c:168
 msgid ""
 "Unexpected end-of-file while reading data in BEGIN DATA.  This probably "
 "indicates a missing or misformatted END DATA command.  END DATA must appear "
 "by itself on a single line with exactly one space between words."
 msgstr ""
 
 msgid ""
 "Unexpected end-of-file while reading data in BEGIN DATA.  This probably "
 "indicates a missing or misformatted END DATA command.  END DATA must appear "
 "by itself on a single line with exactly one space between words."
 msgstr ""
 
-#: src/language/data-io/data-reader.c:206
-#: src/language/data-io/data-reader.c:224
+#: src/language/data-io/data-reader.c:199
+#: src/language/data-io/data-reader.c:216
 #, c-format
 msgid "Error reading file %s: %s."
 msgstr ""
 
 #, c-format
 msgid "Error reading file %s: %s."
 msgstr ""
 
-#: src/language/data-io/data-reader.c:227
+#: src/language/data-io/data-reader.c:219
 #, c-format
 msgid "%s: Partial record at end of file."
 msgstr ""
 
 #, c-format
 msgid "%s: Partial record at end of file."
 msgstr ""
 
-#: src/language/data-io/data-reader.c:278
+#: src/language/data-io/data-reader.c:270
 #, c-format
 msgid "Attempt to read beyond end-of-file on file %s."
 msgstr ""
 
 #, c-format
 msgid "Attempt to read beyond end-of-file on file %s."
 msgstr ""
 
-#: src/language/data-io/data-reader.c:281
+#: src/language/data-io/data-reader.c:273
 msgid "Attempt to read beyond END DATA."
 msgstr ""
 
 msgid "Attempt to read beyond END DATA."
 msgstr ""
 
-#: src/language/data-io/data-reader.c:425
+#: src/language/data-io/data-reader.c:417
 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/language/data-io/data-writer.c:70
+#: src/language/data-io/data-writer.c:62
 #, c-format
 msgid "An error occurred while opening \"%s\" for writing as a data file: %s."
 msgstr ""
 
 #, c-format
 msgid "An error occurred while opening \"%s\" for writing as a data file: %s."
 msgstr ""
 
-#: src/language/data-io/data-writer.c:136
+#: src/language/data-io/data-writer.c:131
 #, c-format
 msgid "I/O error occurred writing data file \"%s\"."
 msgstr ""
 #, c-format
 msgid "I/O error occurred writing data file \"%s\"."
 msgstr ""
@@ -1470,159 +1482,154 @@ msgstr ""
 msgid "Handle for %s not allowed here."
 msgstr ""
 
 msgid "Handle for %s not allowed here."
 msgstr ""
 
-#: src/language/data-io/file-type.c:134
+#: src/language/data-io/file-type.c:149
 msgid "MIXED, GROUPED, or NESTED expected."
 msgstr ""
 
 msgid "MIXED, GROUPED, or NESTED expected."
 msgstr ""
 
-#: src/language/data-io/file-type.c:157
+#: src/language/data-io/file-type.c:172
 msgid "The CASE subcommand is not valid on FILE TYPE MIXED."
 msgstr ""
 
 msgid "The CASE subcommand is not valid on FILE TYPE MIXED."
 msgstr ""
 
-#: src/language/data-io/file-type.c:175
+#: src/language/data-io/file-type.c:190
 msgid "WARN or NOWARN expected after WILD."
 msgstr ""
 
 msgid "WARN or NOWARN expected after WILD."
 msgstr ""
 
-#: src/language/data-io/file-type.c:183
+#: src/language/data-io/file-type.c:198
 msgid "The DUPLICATE subcommand is not valid on FILE TYPE MIXED."
 msgstr ""
 
 msgid "The DUPLICATE subcommand is not valid on FILE TYPE MIXED."
 msgstr ""
 
-#: src/language/data-io/file-type.c:197
+#: src/language/data-io/file-type.c:212
 msgid "DUPLICATE=CASE is only valid on FILE TYPE NESTED."
 msgstr ""
 
 msgid "DUPLICATE=CASE is only valid on FILE TYPE NESTED."
 msgstr ""
 
-#: src/language/data-io/file-type.c:206
+#: src/language/data-io/file-type.c:221
 #, c-format
 msgid "WARN%s expected after DUPLICATE."
 msgstr ""
 
 #, c-format
 msgid "WARN%s expected after DUPLICATE."
 msgstr ""
 
-#: src/language/data-io/file-type.c:207
+#: src/language/data-io/file-type.c:222
 msgid ", NOWARN, or CASE"
 msgstr ""
 
 msgid ", NOWARN, or CASE"
 msgstr ""
 
-#: src/language/data-io/file-type.c:208
+#: src/language/data-io/file-type.c:223
 msgid " or NOWARN"
 msgstr ""
 
 msgid " or NOWARN"
 msgstr ""
 
-#: src/language/data-io/file-type.c:216
+#: src/language/data-io/file-type.c:231
 msgid "The MISSING subcommand is not valid on FILE TYPE MIXED."
 msgstr ""
 
 msgid "The MISSING subcommand is not valid on FILE TYPE MIXED."
 msgstr ""
 
-#: src/language/data-io/file-type.c:228
+#: src/language/data-io/file-type.c:243
 msgid "WARN or NOWARN after MISSING."
 msgstr ""
 
 msgid "WARN or NOWARN after MISSING."
 msgstr ""
 
-#: src/language/data-io/file-type.c:236
+#: src/language/data-io/file-type.c:251
 msgid "ORDERED is only valid on FILE TYPE GROUPED."
 msgstr ""
 
 msgid "ORDERED is only valid on FILE TYPE GROUPED."
 msgstr ""
 
-#: src/language/data-io/file-type.c:247
+#: src/language/data-io/file-type.c:262
 msgid "YES or NO expected after ORDERED."
 msgstr ""
 
 msgid "YES or NO expected after ORDERED."
 msgstr ""
 
-#: src/language/data-io/file-type.c:253 src/language/data-io/file-type.c:548
+#: src/language/data-io/file-type.c:268 src/language/data-io/file-type.c:554
 msgid "while expecting a valid subcommand"
 msgstr ""
 
 msgid "while expecting a valid subcommand"
 msgstr ""
 
-#: src/language/data-io/file-type.c:260
+#: src/language/data-io/file-type.c:275
 msgid "The required RECORD subcommand was not present."
 msgstr ""
 
 msgid "The required RECORD subcommand was not present."
 msgstr ""
 
-#: src/language/data-io/file-type.c:268
+#: src/language/data-io/file-type.c:283
 msgid "The required CASE subcommand was not present."
 msgstr ""
 
 msgid "The required CASE subcommand was not present."
 msgstr ""
 
-#: src/language/data-io/file-type.c:274
+#: src/language/data-io/file-type.c:289
 msgid "CASE and RECORD must specify different variable names."
 msgstr ""
 
 msgid "CASE and RECORD must specify different variable names."
 msgstr ""
 
-#: src/language/data-io/file-type.c:332
+#: src/language/data-io/file-type.c:347
 msgid "Column value must be positive."
 msgstr ""
 
 msgid "Column value must be positive."
 msgstr ""
 
-#: src/language/data-io/file-type.c:348
+#: src/language/data-io/file-type.c:363
 msgid "Ending column precedes beginning column."
 msgstr ""
 
 msgid "Ending column precedes beginning column."
 msgstr ""
 
-#: src/language/data-io/file-type.c:368
+#: src/language/data-io/file-type.c:383
 msgid "Bad format specifier name."
 msgstr ""
 
 msgid "Bad format specifier name."
 msgstr ""
 
-#: src/language/data-io/file-type.c:397 src/language/data-io/file-type.c:586
-msgid ""
-"This command may only appear within a FILE TYPE/END FILE TYPE structure."
-msgstr ""
-
-#: src/language/data-io/file-type.c:420
+#: src/language/data-io/file-type.c:426
 msgid "OTHER may appear only on the last RECORD TYPE command."
 msgstr ""
 
 msgid "OTHER may appear only on the last RECORD TYPE command."
 msgstr ""
 
-#: src/language/data-io/file-type.c:430
+#: src/language/data-io/file-type.c:436
 msgid "No input commands (DATA LIST, REPEATING DATA) for above RECORD TYPE."
 msgstr ""
 
 msgid "No input commands (DATA LIST, REPEATING DATA) for above RECORD TYPE."
 msgstr ""
 
-#: src/language/data-io/file-type.c:481
+#: src/language/data-io/file-type.c:487
 msgid ""
 "The CASE subcommand is not allowed on the RECORD TYPE command for FILE TYPE "
 "MIXED."
 msgstr ""
 
 msgid ""
 "The CASE subcommand is not allowed on the RECORD TYPE command for FILE TYPE "
 "MIXED."
 msgstr ""
 
-#: src/language/data-io/file-type.c:491
+#: src/language/data-io/file-type.c:497
 msgid ""
 "No variable name may be specified for the CASE subcommand on RECORD TYPE."
 msgstr ""
 
 msgid ""
 "No variable name may be specified for the CASE subcommand on RECORD TYPE."
 msgstr ""
 
-#: src/language/data-io/file-type.c:499
+#: src/language/data-io/file-type.c:505
 msgid ""
 "The CASE column specification on RECORD TYPE must give a format specifier "
 "that is the same type as that of the CASE column specification given on FILE "
 "TYPE."
 msgstr ""
 
 msgid ""
 "The CASE column specification on RECORD TYPE must give a format specifier "
 "that is the same type as that of the CASE column specification given on FILE "
 "TYPE."
 msgstr ""
 
-#: src/language/data-io/file-type.c:515
+#: src/language/data-io/file-type.c:521
 msgid "WARN or NOWARN expected on DUPLICATE subcommand."
 msgstr ""
 
 msgid "WARN or NOWARN expected on DUPLICATE subcommand."
 msgstr ""
 
-#: src/language/data-io/file-type.c:529
+#: src/language/data-io/file-type.c:535
 msgid "WARN or NOWARN expected on MISSING subcommand."
 msgstr ""
 
 msgid "WARN or NOWARN expected on MISSING subcommand."
 msgstr ""
 
-#: src/language/data-io/file-type.c:542
+#: src/language/data-io/file-type.c:548
 msgid "YES or NO expected on SPREAD subcommand."
 msgstr ""
 
 msgid "YES or NO expected on SPREAD subcommand."
 msgstr ""
 
-#: src/language/data-io/file-type.c:599
+#: src/language/data-io/file-type.c:598
 msgid "No input commands (DATA LIST, REPEATING DATA) on above RECORD TYPE."
 msgstr ""
 
 msgid "No input commands (DATA LIST, REPEATING DATA) on above RECORD TYPE."
 msgstr ""
 
-#: src/language/data-io/file-type.c:606
+#: src/language/data-io/file-type.c:605
 msgid "No commands between FILE TYPE and END FILE TYPE."
 msgstr ""
 
 msgid "No commands between FILE TYPE and END FILE TYPE."
 msgstr ""
 
-#: src/language/data-io/file-type.c:675
+#: src/language/data-io/file-type.c:674
 #, c-format
 msgid "Unknown record type \"%.*s\"."
 msgstr ""
 
 #, c-format
 msgid "Unknown record type \"%.*s\"."
 msgstr ""
 
-#: src/language/data-io/file-type.c:699
+#: src/language/data-io/file-type.c:698
 #, c-format
 msgid "Unknown record type %g."
 msgstr ""
 
 #, c-format
 msgid "Unknown record type %g."
 msgstr ""
 
-#: src/language/data-io/get.c:108
+#: src/language/data-io/get.c:106
 msgid "expecting COMM or TAPE"
 msgstr ""
 
 msgid "expecting COMM or TAPE"
 msgstr ""
 
-#: src/language/data-io/get.c:350 src/language/data-io/get.c:364
-#: src/language/data-io/get.c:389
+#: src/language/data-io/get.c:348 src/language/data-io/get.c:362
+#: src/language/data-io/get.c:387
 #, c-format
 msgid "expecting %s or %s"
 msgstr ""
 
 #, c-format
 msgid "expecting %s or %s"
 msgstr ""
 
-#: src/language/data-io/get.c:596 src/language/data-io/print.c:180
+#: src/language/data-io/get.c:594 src/language/data-io/print.c:180
 msgid "expecting a valid subcommand"
 msgstr ""
 
 msgid "expecting a valid subcommand"
 msgstr ""
 
-#: src/language/data-io/get.c:629
+#: src/language/data-io/get.c:627
 #, c-format
 msgid ""
 "Cannot rename %s as %s because there already exists a variable named %s.  To "
 #, c-format
 msgid ""
 "Cannot rename %s as %s because there already exists a variable named %s.  To "
@@ -1630,319 +1637,313 @@ msgid ""
 "as \"/RENAME (A=B)(B=C)(C=A)\", or equivalently, \"/RENAME (A B C=B C A)\"."
 msgstr ""
 
 "as \"/RENAME (A=B)(B=C)(C=A)\", or equivalently, \"/RENAME (A B C=B C A)\"."
 msgstr ""
 
-#: src/language/data-io/get.c:654
+#: src/language/data-io/get.c:652
 msgid "`=' expected after variable list."
 msgstr ""
 
 msgid "`=' expected after variable list."
 msgstr ""
 
-#: src/language/data-io/get.c:661
+#: src/language/data-io/get.c:659
 #, c-format
 msgid ""
 "Number of variables on left side of `=' (%d) does not match number of "
 "variables on right side (%d), in parenthesized group %d of RENAME subcommand."
 msgstr ""
 
 #, c-format
 msgid ""
 "Number of variables on left side of `=' (%d) does not match number of "
 "variables on right side (%d), in parenthesized group %d of RENAME subcommand."
 msgstr ""
 
-#: src/language/data-io/get.c:674
+#: src/language/data-io/get.c:672
 #, c-format
 msgid "Requested renaming duplicates variable name %s."
 msgstr ""
 
 #, c-format
 msgid "Requested renaming duplicates variable name %s."
 msgstr ""
 
-#: src/language/data-io/get.c:704
+#: src/language/data-io/get.c:702
 msgid "Cannot DROP all variables from dictionary."
 msgstr ""
 
 msgid "Cannot DROP all variables from dictionary."
 msgstr ""
 
-#: src/language/data-io/get.c:883
+#: src/language/data-io/get.c:879
 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/language/data-io/get.c:892
+#: src/language/data-io/get.c:887
 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/language/data-io/get.c:900
+#: src/language/data-io/get.c:895
 msgid ""
 "MATCH FILES may not be used after TEMPORARY when the active file is an input "
 "source.  Temporary transformations will be made permanent."
 msgstr ""
 
 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/language/data-io/get.c:938
+#: src/language/data-io/get.c:933
 msgid "Multiple IN subcommands for a single FILE or TABLE."
 msgstr ""
 
 msgid "Multiple IN subcommands for a single FILE or TABLE."
 msgstr ""
 
-#: src/language/data-io/get.c:958
+#: src/language/data-io/get.c:953
 msgid "BY may appear at most once."
 msgstr ""
 
 msgid "BY may appear at most once."
 msgstr ""
 
-#: src/language/data-io/get.c:978
+#: src/language/data-io/get.c:973
 #, c-format
 msgid "File %s lacks BY variable %s."
 msgstr ""
 
 #, c-format
 msgid "File %s lacks BY variable %s."
 msgstr ""
 
-#: src/language/data-io/get.c:992
+#: src/language/data-io/get.c:987
 msgid "FIRST may appear at most once."
 msgstr ""
 
 msgid "FIRST may appear at most once."
 msgstr ""
 
-#: src/language/data-io/get.c:1006
+#: src/language/data-io/get.c:1001
 msgid "LAST may appear at most once."
 msgstr ""
 
 msgid "LAST may appear at most once."
 msgstr ""
 
-#: src/language/data-io/get.c:1047
+#: src/language/data-io/get.c:1042
 msgid "BY is required when TABLE is specified."
 msgstr ""
 
 msgid "BY is required when TABLE is specified."
 msgstr ""
 
-#: src/language/data-io/get.c:1052
+#: src/language/data-io/get.c:1047
 msgid "BY is required when IN is specified."
 msgstr ""
 
 msgid "BY is required when IN is specified."
 msgstr ""
 
-#: src/language/data-io/get.c:1080
+#: src/language/data-io/get.c:1075
 #, c-format
 msgid "IN variable name %s duplicates an existing variable name."
 msgstr ""
 
 #, c-format
 msgid "IN variable name %s duplicates an existing variable name."
 msgstr ""
 
-#: src/language/data-io/get.c:1535
+#: src/language/data-io/get.c:1530
 #, 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/language/data-io/inpt-pgm.c:85
-msgid "No matching INPUT PROGRAM command."
+#: src/language/data-io/inpt-pgm.c:98
+msgid "Unexpected end-of-file within INPUT PROGRAM."
 msgstr ""
 
 msgstr ""
 
-#: src/language/data-io/inpt-pgm.c:90
+#: src/language/data-io/inpt-pgm.c:107
 msgid ""
 "No data-input or transformation commands specified between INPUT PROGRAM and "
 "END INPUT PROGRAM."
 msgstr ""
 
 msgid ""
 "No data-input or transformation commands specified between INPUT PROGRAM and "
 "END INPUT PROGRAM."
 msgstr ""
 
-#: src/language/data-io/inpt-pgm.c:292 src/language/data-io/inpt-pgm.c:411
-msgid ""
-"This command may only be executed between INPUT PROGRAM and END INPUT "
-"PROGRAM."
-msgstr ""
-
-#: src/language/data-io/inpt-pgm.c:336
+#: src/language/data-io/inpt-pgm.c:354
 msgid "COLUMN subcommand multiply specified."
 msgstr ""
 
 msgid "COLUMN subcommand multiply specified."
 msgstr ""
 
-#: src/language/data-io/inpt-pgm.c:384
+#: src/language/data-io/inpt-pgm.c:402
 msgid ""
 "REREAD: Column numbers must be positive finite numbers.  Column set to 1."
 msgstr ""
 
 msgid ""
 "REREAD: Column numbers must be positive finite numbers.  Column set to 1."
 msgstr ""
 
-#: src/language/data-io/list.q:151 src/language/stats/descriptives.c:356
+#: src/language/data-io/list.q:149 src/language/stats/descriptives.c:356
 msgid "No variables specified."
 msgstr ""
 
 msgid "No variables specified."
 msgstr ""
 
-#: src/language/data-io/list.q:159
+#: src/language/data-io/list.q:157
 #, c-format
 msgid ""
 "The first case (%ld) specified precedes the last case (%ld) specified.  The "
 "values will be swapped."
 msgstr ""
 
 #, c-format
 msgid ""
 "The first case (%ld) specified precedes the last case (%ld) specified.  The "
 "values will be swapped."
 msgstr ""
 
-#: src/language/data-io/list.q:167
+#: src/language/data-io/list.q:165
 #, c-format
 msgid ""
 "The first case (%ld) to list is less than 1.  The value is being reset to 1."
 msgstr ""
 
 #, c-format
 msgid ""
 "The first case (%ld) to list is less than 1.  The value is being reset to 1."
 msgstr ""
 
-#: src/language/data-io/list.q:173
+#: src/language/data-io/list.q:171
 #, c-format
 msgid ""
 "The last case (%ld) to list is less than 1.  The value is being reset to 1."
 msgstr ""
 
 #, c-format
 msgid ""
 "The last case (%ld) to list is less than 1.  The value is being reset to 1."
 msgstr ""
 
-#: src/language/data-io/list.q:179
+#: src/language/data-io/list.q:177
 #, c-format
 msgid "The step value %ld is less than 1.  The value is being reset to 1."
 msgstr ""
 
 #, c-format
 msgid "The step value %ld is less than 1.  The value is being reset to 1."
 msgstr ""
 
-#: src/language/data-io/list.q:205
+#: src/language/data-io/list.q:203
 msgid "`/FORMAT WEIGHT' specified, but weighting is not on."
 msgstr ""
 
 msgid "`/FORMAT WEIGHT' specified, but weighting is not on."
 msgstr ""
 
-#: src/language/data-io/list.q:432
+#: src/language/data-io/list.q:430
 msgid "Line"
 msgstr ""
 
 msgid "Line"
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:213
+#: src/language/data-io/matrix-data.c:211
 msgid "VARIABLES subcommand multiply specified."
 msgstr ""
 
 msgid "VARIABLES subcommand multiply specified."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:228
+#: src/language/data-io/matrix-data.c:226
 msgid "VARNAME_ cannot be explicitly specified on VARIABLES."
 msgstr ""
 
 msgid "VARNAME_ cannot be explicitly specified on VARIABLES."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:289
+#: src/language/data-io/matrix-data.c:287
 msgid "in FORMAT subcommand"
 msgstr ""
 
 msgid "in FORMAT subcommand"
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:300
+#: src/language/data-io/matrix-data.c:298
 msgid "SPLIT subcommand multiply specified."
 msgstr ""
 
 msgid "SPLIT subcommand multiply specified."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:307
+#: src/language/data-io/matrix-data.c:305
 msgid "in SPLIT subcommand"
 msgstr ""
 
 msgid "in SPLIT subcommand"
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:317
+#: src/language/data-io/matrix-data.c:315
 msgid "Split variable may not be named ROWTYPE_ or VARNAME_."
 msgstr ""
 
 msgid "Split variable may not be named ROWTYPE_ or VARNAME_."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:351
+#: src/language/data-io/matrix-data.c:349
 #, c-format
 msgid "Split variable %s is already another type."
 msgstr ""
 
 #, c-format
 msgid "Split variable %s is already another type."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:366
+#: src/language/data-io/matrix-data.c:364
 msgid "FACTORS subcommand multiply specified."
 msgstr ""
 
 msgid "FACTORS subcommand multiply specified."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:385
+#: src/language/data-io/matrix-data.c:383
 #, c-format
 msgid "Factor variable %s is already another type."
 msgstr ""
 
 #, c-format
 msgid "Factor variable %s is already another type."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:400
+#: src/language/data-io/matrix-data.c:398
 msgid "CELLS subcommand multiply specified."
 msgstr ""
 
 msgid "CELLS subcommand multiply specified."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:406
-#: src/language/data-io/matrix-data.c:425
+#: src/language/data-io/matrix-data.c:404
+#: src/language/data-io/matrix-data.c:423
 msgid "expecting positive integer"
 msgstr ""
 
 msgid "expecting positive integer"
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:419
+#: src/language/data-io/matrix-data.c:417
 msgid "N subcommand multiply specified."
 msgstr ""
 
 msgid "N subcommand multiply specified."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:440
+#: src/language/data-io/matrix-data.c:438
 msgid "CONTENTS subcommand multiply specified."
 msgstr ""
 
 msgid "CONTENTS subcommand multiply specified."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:460
+#: src/language/data-io/matrix-data.c:458
 msgid "Nested parentheses not allowed."
 msgstr ""
 
 msgid "Nested parentheses not allowed."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:470
+#: src/language/data-io/matrix-data.c:468
 msgid "Mismatched right parenthesis (`(')."
 msgstr ""
 
 msgid "Mismatched right parenthesis (`(')."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:475
+#: src/language/data-io/matrix-data.c:473
 msgid "Empty parentheses not allowed."
 msgstr ""
 
 msgid "Empty parentheses not allowed."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:488
-#: src/language/data-io/matrix-data.c:496
+#: src/language/data-io/matrix-data.c:486
+#: src/language/data-io/matrix-data.c:494
 msgid "in CONTENTS subcommand"
 msgstr ""
 
 msgid "in CONTENTS subcommand"
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:503
+#: src/language/data-io/matrix-data.c:501
 #, c-format
 msgid "Content multiply specified for %s."
 msgstr ""
 
 #, c-format
 msgid "Content multiply specified for %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:520
+#: src/language/data-io/matrix-data.c:518
 msgid "Missing right parenthesis."
 msgstr ""
 
 msgid "Missing right parenthesis."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:540
+#: src/language/data-io/matrix-data.c:538
 msgid "Missing VARIABLES subcommand."
 msgstr ""
 
 msgid "Missing VARIABLES subcommand."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:546
+#: src/language/data-io/matrix-data.c:544
 msgid ""
 "CONTENTS subcommand not specified: assuming file contains only CORR matrix."
 msgstr ""
 
 msgid ""
 "CONTENTS subcommand not specified: assuming file contains only CORR matrix."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:556
+#: src/language/data-io/matrix-data.c:554
 msgid ""
 "Missing CELLS subcommand.  CELLS is required when ROWTYPE_ is not given in "
 "the data and factors are present."
 msgstr ""
 
 msgid ""
 "Missing CELLS subcommand.  CELLS is required when ROWTYPE_ is not given in "
 "the data and factors are present."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:564
+#: src/language/data-io/matrix-data.c:562
 msgid "Split file values must be present in the data when ROWTYPE_ is present."
 msgstr ""
 
 msgid "Split file values must be present in the data when ROWTYPE_ is present."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:617
+#: src/language/data-io/matrix-data.c:615
 msgid "No continuous variables specified."
 msgstr ""
 
 msgid "No continuous variables specified."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:860
+#: src/language/data-io/matrix-data.c:858
 msgid "Scope of string exceeds line."
 msgstr ""
 
 msgid "Scope of string exceeds line."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:925
+#: src/language/data-io/matrix-data.c:923
 #, c-format
 msgid "End of line expected %s while reading %s."
 msgstr ""
 
 #, c-format
 msgid "End of line expected %s while reading %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1115
+#: src/language/data-io/matrix-data.c:1113
 #, c-format
 msgid "expecting value for %s %s"
 msgstr ""
 
 #, c-format
 msgid "expecting value for %s %s"
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1281
+#: src/language/data-io/matrix-data.c:1278
 #, c-format
 msgid "Syntax error expecting SPLIT FILE value %s."
 msgstr ""
 
 #, c-format
 msgid "Syntax error expecting SPLIT FILE value %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1290
+#: src/language/data-io/matrix-data.c:1287
 #, c-format
 msgid "Expecting value %g for %s."
 msgstr ""
 
 #, c-format
 msgid "Expecting value %g for %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1331
-#: src/language/data-io/matrix-data.c:1811
+#: src/language/data-io/matrix-data.c:1328
+#: src/language/data-io/matrix-data.c:1805
 #, c-format
 msgid "Syntax error expecting factor value %s."
 msgstr ""
 
 #, c-format
 msgid "Syntax error expecting factor value %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1340
+#: src/language/data-io/matrix-data.c:1337
 #, 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/language/data-io/matrix-data.c:1587
+#: src/language/data-io/matrix-data.c:1581
 #, c-format
 msgid "Syntax error %s expecting SPLIT FILE value."
 msgstr ""
 
 #, c-format
 msgid "Syntax error %s expecting SPLIT FILE value."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1716
+#: src/language/data-io/matrix-data.c:1710
 #, 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/language/data-io/matrix-data.c:1753
+#: src/language/data-io/matrix-data.c:1747
 #, c-format
 msgid "Multiply specified ROWTYPE_ %s."
 msgstr ""
 
 #, c-format
 msgid "Multiply specified ROWTYPE_ %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1758
+#: src/language/data-io/matrix-data.c:1752
 #, c-format
 msgid "Syntax error %s expecting ROWTYPE_ string."
 msgstr ""
 
 #, c-format
 msgid "Syntax error %s expecting ROWTYPE_ string."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1778
+#: src/language/data-io/matrix-data.c:1772
 #, c-format
 msgid "Syntax error %s."
 msgstr ""
 
 #, c-format
 msgid "Syntax error %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1929
+#: src/language/data-io/matrix-data.c:1923
 #, c-format
 msgid "Duplicate specification for %s."
 msgstr ""
 
 #, c-format
 msgid "Duplicate specification for %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1941
+#: src/language/data-io/matrix-data.c:1935
 #, 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/language/data-io/matrix-data.c:1989
+#: src/language/data-io/matrix-data.c:1981
 #, c-format
 msgid "Syntax error expecting value for %s %s."
 msgstr ""
 #, c-format
 msgid "Syntax error expecting value for %s %s."
 msgstr ""
@@ -2006,62 +2007,62 @@ msgid_plural "Writing %d records."
 msgstr[0] ""
 msgstr[1] ""
 
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/language/data-io/print.c:1091
+#: src/language/data-io/print.c:1078
 msgid "The expression on PRINT SPACE evaluated to the system-missing value."
 msgstr ""
 
 msgid "The expression on PRINT SPACE evaluated to the system-missing value."
 msgstr ""
 
-#: src/language/data-io/print.c:1094
+#: src/language/data-io/print.c:1081
 #, c-format
 msgid "The expression on PRINT SPACE evaluated to %g."
 msgstr ""
 
 #, c-format
 msgid "The expression on PRINT SPACE evaluated to %g."
 msgstr ""
 
-#: src/language/dictionary/apply-dictionary.c:71
+#: src/language/dictionary/apply-dictionary.c:70
 #, c-format
 msgid "Variable %s is %s in target file, but %s in source file."
 msgstr ""
 
 #, c-format
 msgid "Variable %s is %s in target file, but %s in source file."
 msgstr ""
 
-#: src/language/dictionary/apply-dictionary.c:87
+#: src/language/dictionary/apply-dictionary.c:86
 #, c-format
 msgid "Cannot add value labels from source file to long string variable %s."
 msgstr ""
 
 #, c-format
 msgid "Cannot add value labels from source file to long string variable %s."
 msgstr ""
 
-#: src/language/dictionary/apply-dictionary.c:133
+#: src/language/dictionary/apply-dictionary.c:132
 #, c-format
 msgid ""
 "Cannot apply missing values from source file to long string variable %s."
 msgstr ""
 
 #, c-format
 msgid ""
 "Cannot apply missing values from source file to long string variable %s."
 msgstr ""
 
-#: src/language/dictionary/apply-dictionary.c:153
+#: src/language/dictionary/apply-dictionary.c:152
 msgid "No matching variables found between the source and target files."
 msgstr ""
 
 msgid "No matching variables found between the source and target files."
 msgstr ""
 
-#: src/language/dictionary/formats.c:89
+#: src/language/dictionary/formats.c:87
 msgid "`(' expected after variable list"
 msgstr ""
 
 msgid "`(' expected after variable list"
 msgstr ""
 
-#: src/language/dictionary/formats.c:99 src/language/dictionary/numeric.c:68
-#: src/language/dictionary/numeric.c:139
+#: src/language/dictionary/formats.c:97 src/language/dictionary/numeric.c:66
+#: src/language/dictionary/numeric.c:137
 msgid "`)' expected after output format."
 msgstr ""
 
 msgid "`)' expected after output format."
 msgstr ""
 
-#: src/language/dictionary/missing-values.c:55
-#: src/language/stats/aggregate.c:432
+#: src/language/dictionary/missing-values.c:53
+#: src/language/stats/aggregate.c:434
 msgid "expecting `('"
 msgstr ""
 
 msgid "expecting `('"
 msgstr ""
 
-#: src/language/dictionary/missing-values.c:71
+#: src/language/dictionary/missing-values.c:69
 #, c-format
 msgid ""
 "Cannot mix numeric variables (e.g. %s) and string variables (e.g. %s) within "
 "a single list."
 msgstr ""
 
 #, c-format
 msgid ""
 "Cannot mix numeric variables (e.g. %s) and string variables (e.g. %s) within "
 "a single list."
 msgstr ""
 
-#: src/language/dictionary/missing-values.c:111
+#: src/language/dictionary/missing-values.c:109
 #, c-format
 msgid "Truncating missing value to short string length (%d characters)."
 msgstr ""
 
 #, c-format
 msgid "Truncating missing value to short string length (%d characters)."
 msgstr ""
 
-#: src/language/dictionary/missing-values.c:130
+#: src/language/dictionary/missing-values.c:128
 #, c-format
 msgid "Missing values provided are too long to assign to variable of width %d."
 msgstr ""
 #, c-format
 msgid "Missing values provided are too long to assign to variable of width %d."
 msgstr ""
@@ -2138,18 +2139,18 @@ msgstr ""
 msgid "`/' or `.' expected."
 msgstr ""
 
 msgid "`/' or `.' expected."
 msgstr ""
 
-#: src/language/dictionary/numeric.c:61
+#: src/language/dictionary/numeric.c:59
 #, c-format
 msgid "Format type %s may not be used with a numeric variable."
 msgstr ""
 
 #, c-format
 msgid "Format type %s may not be used with a numeric variable."
 msgstr ""
 
-#: src/language/dictionary/numeric.c:80 src/language/dictionary/numeric.c:162
+#: src/language/dictionary/numeric.c:78 src/language/dictionary/numeric.c:160
 #: src/language/dictionary/vector.c:159
 #, c-format
 msgid "There is already a variable named %s."
 msgstr ""
 
 #: src/language/dictionary/vector.c:159
 #, c-format
 msgid "There is already a variable named %s."
 msgstr ""
 
-#: src/language/dictionary/numeric.c:132
+#: src/language/dictionary/numeric.c:130
 #, c-format
 msgid "Format type %s may not be used with a string variable."
 msgstr ""
 #, c-format
 msgid "Format type %s may not be used with a string variable."
 msgstr ""
@@ -2184,179 +2185,179 @@ msgstr ""
 msgid "Renaming would duplicate variable name %s."
 msgstr ""
 
 msgid "Renaming would duplicate variable name %s."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:100
+#: src/language/dictionary/sys-file-info.c:101
 msgid "File:"
 msgstr ""
 
 msgid "File:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:102
+#: src/language/dictionary/sys-file-info.c:103
 msgid "Label:"
 msgstr ""
 
 msgid "Label:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:106
+#: src/language/dictionary/sys-file-info.c:107
 msgid "No label."
 msgstr ""
 
 msgid "No label."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:109
+#: src/language/dictionary/sys-file-info.c:110
 msgid "Created:"
 msgstr ""
 
 msgid "Created:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:112
+#: src/language/dictionary/sys-file-info.c:113
 msgid "Endian:"
 msgstr ""
 
 msgid "Endian:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:113
+#: src/language/dictionary/sys-file-info.c:114
 msgid "Big."
 msgstr ""
 
 msgid "Big."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:113
+#: src/language/dictionary/sys-file-info.c:114
 msgid "Little."
 msgstr ""
 
 msgid "Little."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:114
+#: src/language/dictionary/sys-file-info.c:115
 msgid "Variables:"
 msgstr ""
 
 msgid "Variables:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:117
+#: src/language/dictionary/sys-file-info.c:118
 msgid "Cases:"
 msgstr ""
 
 msgid "Cases:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:120
+#: src/language/dictionary/sys-file-info.c:121
 msgid "Type:"
 msgstr ""
 
 msgid "Type:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:121
+#: src/language/dictionary/sys-file-info.c:122
 msgid "System File."
 msgstr ""
 
 msgid "System File."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:122
+#: src/language/dictionary/sys-file-info.c:123
 msgid "Weight:"
 msgstr ""
 
 msgid "Weight:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:126
+#: src/language/dictionary/sys-file-info.c:127
 msgid "Not weighted."
 msgstr ""
 
 msgid "Not weighted."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:128
+#: src/language/dictionary/sys-file-info.c:129
 msgid "Mode:"
 msgstr ""
 
 msgid "Mode:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:130
+#: src/language/dictionary/sys-file-info.c:131
 #, c-format
 msgid "Compression %s."
 msgstr ""
 
 #, c-format
 msgid "Compression %s."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:130
+#: src/language/dictionary/sys-file-info.c:131
 msgid "on"
 msgstr ""
 
 msgid "on"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:130
+#: src/language/dictionary/sys-file-info.c:131
 msgid "off"
 msgstr ""
 
 msgid "off"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:140
-#: src/language/dictionary/sys-file-info.c:378
+#: src/language/dictionary/sys-file-info.c:141
+#: src/language/dictionary/sys-file-info.c:379
 msgid "Description"
 msgstr ""
 
 msgid "Description"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:141
-#: src/language/dictionary/sys-file-info.c:376
+#: src/language/dictionary/sys-file-info.c:142
+#: src/language/dictionary/sys-file-info.c:377
 msgid "Position"
 msgstr ""
 
 msgid "Position"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:199
+#: src/language/dictionary/sys-file-info.c:200
 msgid "The active file does not have a file label."
 msgstr ""
 
 msgid "The active file does not have a file label."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:202
+#: src/language/dictionary/sys-file-info.c:203
 msgid "File label:"
 msgstr ""
 
 msgid "File label:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:264
+#: src/language/dictionary/sys-file-info.c:265
 msgid "No variables to display."
 msgstr ""
 
 msgid "No variables to display."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:283
+#: src/language/dictionary/sys-file-info.c:284
 msgid "Macros not supported."
 msgstr ""
 
 msgid "Macros not supported."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:293
+#: src/language/dictionary/sys-file-info.c:294
 msgid "The active file dictionary does not contain any documents."
 msgstr ""
 
 msgid "The active file dictionary does not contain any documents."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:302
+#: src/language/dictionary/sys-file-info.c:303
 msgid "Documents in the active file:"
 msgstr ""
 
 msgid "Documents in the active file:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:380
-#: src/language/dictionary/sys-file-info.c:519 src/procedure.c:888
+#: src/language/dictionary/sys-file-info.c:381
+#: src/language/dictionary/sys-file-info.c:520 src/procedure.c:880
 #: src/ui/gui/var-sheet.c:71
 msgid "Label"
 msgstr ""
 
 #: src/ui/gui/var-sheet.c:71
 msgid "Label"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:452
+#: src/language/dictionary/sys-file-info.c:453
 #, c-format
 msgid "Format: %s"
 msgstr ""
 
 #, c-format
 msgid "Format: %s"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:459
+#: src/language/dictionary/sys-file-info.c:460
 #, c-format
 msgid "Print Format: %s"
 msgstr ""
 
 #, c-format
 msgid "Print Format: %s"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:462
+#: src/language/dictionary/sys-file-info.c:463
 #, c-format
 msgid "Write Format: %s"
 msgstr ""
 
 #, c-format
 msgid "Write Format: %s"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:474
+#: src/language/dictionary/sys-file-info.c:475
 msgid "Missing Values: "
 msgstr ""
 
 msgid "Missing Values: "
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:518
-#: src/language/stats/crosstabs.q:1111 src/language/stats/crosstabs.q:1138
-#: src/language/stats/crosstabs.q:1158 src/language/stats/crosstabs.q:1180
-#: src/language/stats/examine.q:1138 src/language/stats/frequencies.q:1146
-#: src/language/stats/frequencies.q:1267 src/procedure.c:887
+#: src/language/dictionary/sys-file-info.c:519
+#: src/language/stats/crosstabs.q:1109 src/language/stats/crosstabs.q:1136
+#: src/language/stats/crosstabs.q:1156 src/language/stats/crosstabs.q:1178
+#: src/language/stats/examine.q:1141 src/language/stats/frequencies.q:1145
+#: src/language/stats/frequencies.q:1266 src/procedure.c:879
 msgid "Value"
 msgstr ""
 
 msgid "Value"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:575
+#: src/language/dictionary/sys-file-info.c:576
 msgid "No vectors defined."
 msgstr ""
 
 msgid "No vectors defined."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:590
+#: src/language/dictionary/sys-file-info.c:591
 msgid "Vector"
 msgstr ""
 
 msgid "Vector"
 msgstr ""
 
-#: src/language/dictionary/value-labels.c:121
+#: src/language/dictionary/value-labels.c:118
 #, 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/language/dictionary/value-labels.c:157 src/language/lexer/lexer.c:590
+#: src/language/dictionary/value-labels.c:154 src/language/lexer/lexer.c:590
 msgid "expecting string"
 msgstr ""
 
 msgid "expecting string"
 msgstr ""
 
-#: src/language/dictionary/value-labels.c:166 src/language/lexer/lexer.c:604
+#: src/language/dictionary/value-labels.c:163 src/language/lexer/lexer.c:604
 msgid "expecting integer"
 msgstr ""
 
 msgid "expecting integer"
 msgstr ""
 
-#: src/language/dictionary/value-labels.c:170
+#: src/language/dictionary/value-labels.c:167
 #, c-format
 msgid "Value label `%g' is not integer."
 msgstr ""
 
 #, c-format
 msgid "Value label `%g' is not integer."
 msgstr ""
 
-#: src/language/dictionary/value-labels.c:180
+#: src/language/dictionary/value-labels.c:177
 msgid "Truncating value label to 60 characters."
 msgstr ""
 
 msgid "Truncating value label to 60 characters."
 msgstr ""
 
-#: src/language/dictionary/variable-label.c:50
+#: src/language/dictionary/variable-label.c:48
 msgid "String expected for variable label."
 msgstr ""
 
 msgid "String expected for variable label."
 msgstr ""
 
-#: src/language/dictionary/variable-label.c:56
+#: src/language/dictionary/variable-label.c:54
 msgid "Truncating variable label to 255 characters."
 msgstr ""
 
 msgid "Truncating variable label to 255 characters."
 msgstr ""
 
@@ -2403,37 +2404,37 @@ msgstr ""
 msgid "expecting number or string"
 msgstr ""
 
 msgid "expecting number or string"
 msgstr ""
 
-#: src/language/expressions/helpers.c:36
+#: src/language/expressions/helpers.c:37
 msgid ""
 "One of the arguments to a DATE function is not an integer.  The result will "
 "be system-missing."
 msgstr ""
 
 msgid ""
 "One of the arguments to a DATE function is not an integer.  The result will "
 "be system-missing."
 msgstr ""
 
-#: src/language/expressions/helpers.c:58
+#: src/language/expressions/helpers.c:59
 msgid ""
 "The week argument to DATE.WKYR is not an integer.  The result will be system-"
 "missing."
 msgstr ""
 
 msgid ""
 "The week argument to DATE.WKYR is not an integer.  The result will be system-"
 "missing."
 msgstr ""
 
-#: src/language/expressions/helpers.c:64
+#: src/language/expressions/helpers.c:65
 msgid ""
 "The week argument to DATE.WKYR is outside the acceptable range of 1 to 53.  "
 "The result will be system-missing."
 msgstr ""
 
 msgid ""
 "The week argument to DATE.WKYR is outside the acceptable range of 1 to 53.  "
 "The result will be system-missing."
 msgstr ""
 
-#: src/language/expressions/helpers.c:86
+#: src/language/expressions/helpers.c:87
 msgid ""
 "The day argument to DATE.YRDAY is not an integer.  The result will be system-"
 "missing."
 msgstr ""
 
 msgid ""
 "The day argument to DATE.YRDAY is not an integer.  The result will be system-"
 "missing."
 msgstr ""
 
-#: src/language/expressions/helpers.c:92
+#: src/language/expressions/helpers.c:93
 msgid ""
 "The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366.  "
 "The result will be system-missing."
 msgstr ""
 
 msgid ""
 "The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366.  "
 "The result will be system-missing."
 msgstr ""
 
-#: src/language/expressions/helpers.c:114
+#: src/language/expressions/helpers.c:115
 msgid ""
 "The year argument to YRMODA is greater than 47516.  The result will be "
 "system-missing."
 msgid ""
 "The year argument to YRMODA is greater than 47516.  The result will be "
 "system-missing."
@@ -2481,7 +2482,7 @@ msgstr ""
 msgid "Unknown identifier %s."
 msgstr ""
 
 msgid "Unknown identifier %s."
 msgstr ""
 
-#: src/language/expressions/parse.c:846 src/language/stats/aggregate.c:488
+#: src/language/expressions/parse.c:846 src/language/stats/aggregate.c:490
 msgid "expecting `)'"
 msgstr ""
 
 msgid "expecting `)'"
 msgstr ""
 
@@ -2549,6 +2550,12 @@ msgstr ""
 msgid "%s is a PSPP extension."
 msgstr ""
 
 msgid "%s is a PSPP extension."
 msgstr ""
 
+#: src/language/expressions/parse.c:1222 src/ui/terminal/command-line.c:126
+#: src/ui/terminal/command-line.c:145 src/ui/terminal/command-line.c:157
+#, c-format
+msgid "%s is not yet implemented."
+msgstr ""
+
 #: src/language/lexer/format-parser.c:66
 msgid "X and T format specifiers not allowed here."
 msgstr ""
 #: src/language/lexer/format-parser.c:66
 msgid "X and T format specifiers not allowed here."
 msgstr ""
@@ -2620,50 +2627,50 @@ msgstr ""
 msgid "expecting identifier"
 msgstr ""
 
 msgid "expecting identifier"
 msgstr ""
 
-#: src/language/lexer/lexer.c:842
+#: src/language/lexer/lexer.c:861
 msgid "<ERROR>"
 msgstr ""
 
 msgid "<ERROR>"
 msgstr ""
 
-#: src/language/lexer/lexer.c:988
+#: src/language/lexer/lexer.c:1007
 msgid "binary"
 msgstr ""
 
 msgid "binary"
 msgstr ""
 
-#: src/language/lexer/lexer.c:993
+#: src/language/lexer/lexer.c:1012
 msgid "octal"
 msgstr ""
 
 msgid "octal"
 msgstr ""
 
-#: src/language/lexer/lexer.c:998
+#: src/language/lexer/lexer.c:1017
 msgid "hex"
 msgstr ""
 
 msgid "hex"
 msgstr ""
 
-#: src/language/lexer/lexer.c:1008
+#: src/language/lexer/lexer.c:1027
 #, c-format
 msgid "String of %s digits has %d characters, which is not a multiple of %d."
 msgstr ""
 
 #, c-format
 msgid "String of %s digits has %d characters, which is not a multiple of %d."
 msgstr ""
 
-#: src/language/lexer/lexer.c:1037
+#: src/language/lexer/lexer.c:1056
 #, c-format
 msgid "`%c' is not a valid %s digit."
 msgstr ""
 
 #, c-format
 msgid "`%c' is not a valid %s digit."
 msgstr ""
 
-#: src/language/lexer/lexer.c:1068
+#: src/language/lexer/lexer.c:1087
 msgid "Unterminated string constant."
 msgstr ""
 
 msgid "Unterminated string constant."
 msgstr ""
 
-#: src/language/lexer/lexer.c:1122
+#: src/language/lexer/lexer.c:1141
 msgid "Unexpected end of file in string concatenation."
 msgstr ""
 
 msgid "Unexpected end of file in string concatenation."
 msgstr ""
 
-#: src/language/lexer/lexer.c:1130
+#: src/language/lexer/lexer.c:1149
 msgid "String expected following `+'."
 msgstr ""
 
 msgid "String expected following `+'."
 msgstr ""
 
-#: src/language/lexer/lexer.c:1143
+#: src/language/lexer/lexer.c:1162
 #, c-format
 msgid "String exceeds 255 characters in length (%d characters)."
 msgstr ""
 
 #, c-format
 msgid "String exceeds 255 characters in length (%d characters)."
 msgstr ""
 
-#: src/language/lexer/lexer.c:1158
+#: src/language/lexer/lexer.c:1177
 msgid ""
 "Sorry, literal strings may not contain null characters.  Replacing with "
 "spaces."
 msgid ""
 "Sorry, literal strings may not contain null characters.  Replacing with "
 "spaces."
@@ -2760,79 +2767,79 @@ msgstr ""
 msgid "Bad bounds in use of TO convention."
 msgstr ""
 
 msgid "Bad bounds in use of TO convention."
 msgstr ""
 
-#: src/language/line-buffer.c:246
+#: src/language/line-buffer.c:250
 #, 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/language/line-buffer.c:330
+#: src/language/line-buffer.c:334
 #, c-format
 msgid "Closing `%s': %s."
 msgstr ""
 
 #, c-format
 msgid "Closing `%s': %s."
 msgstr ""
 
-#: src/language/line-buffer.c:441
+#: src/language/line-buffer.c:445
 #, c-format
 #, c-format
-msgid "%s: Opening as syntax file."
+msgid "opening \"%s\" as syntax file"
 msgstr ""
 
 msgstr ""
 
-#: src/language/line-buffer.c:446
+#: src/language/line-buffer.c:450
 #, c-format
 msgid "Opening `%s': %s."
 msgstr ""
 
 #, c-format
 msgid "Opening `%s': %s."
 msgstr ""
 
-#: src/language/line-buffer.c:459
+#: src/language/line-buffer.c:463
 #, c-format
 msgid "Reading `%s': %s."
 msgstr ""
 
 #, c-format
 msgid "Reading `%s': %s."
 msgstr ""
 
-#: src/language/stats/aggregate.c:198
+#: src/language/stats/aggregate.c:200
 msgid "while expecting COLUMNWISE"
 msgstr ""
 
 msgid "while expecting COLUMNWISE"
 msgstr ""
 
-#: src/language/stats/aggregate.c:227
+#: src/language/stats/aggregate.c:229
 msgid "expecting BREAK"
 msgstr ""
 
 msgid "expecting BREAK"
 msgstr ""
 
-#: src/language/stats/aggregate.c:232
+#: src/language/stats/aggregate.c:234
 msgid ""
 "When PRESORTED is specified, specifying sorting directions with (A) or (D) "
 "has no effect.  Output data will be sorted the same way as the input data."
 msgstr ""
 
 msgid ""
 "When PRESORTED is specified, specifying sorting directions with (A) or (D) "
 "has no effect.  Output data will be sorted the same way as the input data."
 msgstr ""
 
-#: src/language/stats/aggregate.c:401
+#: src/language/stats/aggregate.c:403
 msgid "expecting aggregation function"
 msgstr ""
 
 msgid "expecting aggregation function"
 msgstr ""
 
-#: src/language/stats/aggregate.c:417
+#: src/language/stats/aggregate.c:419
 #, c-format
 msgid "Unknown aggregation function %s."
 msgstr ""
 
 #, c-format
 msgid "Unknown aggregation function %s."
 msgstr ""
 
-#: src/language/stats/aggregate.c:469
+#: src/language/stats/aggregate.c:471
 #, c-format
 msgid "Missing argument %d to %s."
 msgstr ""
 
 #, c-format
 msgid "Missing argument %d to %s."
 msgstr ""
 
-#: src/language/stats/aggregate.c:478
+#: src/language/stats/aggregate.c:480
 #, 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/language/stats/aggregate.c:500
+#: src/language/stats/aggregate.c:502
 #, c-format
 msgid ""
 "Number of source variables (%u) does not match number of target variables (%"
 "u)."
 msgstr ""
 
 #, c-format
 msgid ""
 "Number of source variables (%u) does not match number of target variables (%"
 "u)."
 msgstr ""
 
-#: src/language/stats/aggregate.c:516
+#: src/language/stats/aggregate.c:518
 #, c-format
 msgid ""
 "The value arguments passed to the %s function are out-of-order.  They will "
 "be treated as if they had been specified in the correct order."
 msgstr ""
 
 #, c-format
 msgid ""
 "The value arguments passed to the %s function are out-of-order.  They will "
 "be treated as if they had been specified in the correct order."
 msgstr ""
 
-#: src/language/stats/aggregate.c:583
+#: src/language/stats/aggregate.c:585
 #, 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 "
@@ -2854,311 +2861,311 @@ msgstr ""
 msgid "Duplicate variable name %s among target variables."
 msgstr ""
 
 msgid "Duplicate variable name %s among target variables."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:267
+#: src/language/stats/crosstabs.q:265
 msgid ""
 "Missing mode REPORT not allowed in general mode.  Assuming MISSING=TABLE."
 msgstr ""
 
 msgid ""
 "Missing mode REPORT not allowed in general mode.  Assuming MISSING=TABLE."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:277
+#: src/language/stats/crosstabs.q:275
 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/language/stats/crosstabs.q:333
+#: src/language/stats/crosstabs.q:331
 msgid "Too many crosstabulation variables or dimensions."
 msgstr ""
 
 msgid "Too many crosstabulation variables or dimensions."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:343
+#: src/language/stats/crosstabs.q:341
 msgid "expecting BY"
 msgstr ""
 
 msgid "expecting BY"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:410
+#: src/language/stats/crosstabs.q:408
 msgid "VARIABLES must be specified before TABLES."
 msgstr ""
 
 msgid "VARIABLES must be specified before TABLES."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:447
+#: src/language/stats/crosstabs.q:445
 #, 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/language/stats/crosstabs.q:812
+#: src/language/stats/crosstabs.q:810
 msgid "Summary."
 msgstr ""
 
 msgid "Summary."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:814 src/language/stats/examine.q:923
+#: src/language/stats/crosstabs.q:812 src/language/stats/examine.q:926
 msgid "Cases"
 msgstr ""
 
 msgid "Cases"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:815 src/language/stats/examine.q:857
-#: src/language/stats/frequencies.q:1144 src/language/stats/frequencies.q:1517
+#: src/language/stats/crosstabs.q:813 src/language/stats/examine.q:860
+#: src/language/stats/frequencies.q:1143 src/language/stats/frequencies.q:1516
 msgid "Valid"
 msgstr ""
 
 msgid "Valid"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:816 src/language/stats/examine.q:858
-#: src/language/stats/frequencies.q:1212 src/language/stats/frequencies.q:1518
+#: src/language/stats/crosstabs.q:814 src/language/stats/examine.q:861
+#: src/language/stats/frequencies.q:1211 src/language/stats/frequencies.q:1517
 #: src/ui/gui/var-sheet.c:73
 msgid "Missing"
 msgstr ""
 
 #: src/ui/gui/var-sheet.c:73
 msgid "Missing"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:817 src/language/stats/crosstabs.q:1020
-#: src/language/stats/crosstabs.q:1740 src/language/stats/examine.q:859
-#: src/language/stats/frequencies.q:1221 src/language/stats/oneway.q:314
-#: src/language/stats/oneway.q:478 src/language/stats/regression.q:294
+#: src/language/stats/crosstabs.q:815 src/language/stats/crosstabs.q:1018
+#: src/language/stats/crosstabs.q:1738 src/language/stats/examine.q:862
+#: src/language/stats/frequencies.q:1220 src/language/stats/oneway.q:314
+#: src/language/stats/oneway.q:478 src/language/stats/regression.q:308
 msgid "Total"
 msgstr ""
 
 msgid "Total"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:827 src/language/stats/examine.q:935
-#: src/language/stats/frequencies.q:1516 src/language/stats/oneway.q:400
+#: src/language/stats/crosstabs.q:825 src/language/stats/examine.q:938
+#: src/language/stats/frequencies.q:1515 src/language/stats/oneway.q:400
 #: src/language/stats/t-test.q:682 src/language/stats/t-test.q:705
 #: src/language/stats/t-test.q:830 src/language/stats/t-test.q:1365
 msgid "N"
 msgstr ""
 
 #: src/language/stats/t-test.q:682 src/language/stats/t-test.q:705
 #: src/language/stats/t-test.q:830 src/language/stats/t-test.q:1365
 msgid "N"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:828 src/language/stats/examine.q:938
-#: src/language/stats/frequencies.q:1148 src/language/stats/frequencies.q:1149
-#: src/language/stats/frequencies.q:1150
+#: src/language/stats/crosstabs.q:826 src/language/stats/examine.q:941
+#: src/language/stats/frequencies.q:1147 src/language/stats/frequencies.q:1148
+#: src/language/stats/frequencies.q:1149
 msgid "Percent"
 msgstr ""
 
 msgid "Percent"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1070
+#: src/language/stats/crosstabs.q:1068
 msgid "count"
 msgstr ""
 
 msgid "count"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1071
+#: src/language/stats/crosstabs.q:1069
 msgid "row %"
 msgstr ""
 
 msgid "row %"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1072
+#: src/language/stats/crosstabs.q:1070
 msgid "column %"
 msgstr ""
 
 msgid "column %"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1073
+#: src/language/stats/crosstabs.q:1071
 msgid "total %"
 msgstr ""
 
 msgid "total %"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1074
+#: src/language/stats/crosstabs.q:1072
 msgid "expected"
 msgstr ""
 
 msgid "expected"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1075
+#: src/language/stats/crosstabs.q:1073
 msgid "residual"
 msgstr ""
 
 msgid "residual"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1076
+#: src/language/stats/crosstabs.q:1074
 msgid "std. resid."
 msgstr ""
 
 msgid "std. resid."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1077
+#: src/language/stats/crosstabs.q:1075
 msgid "adj. resid."
 msgstr ""
 
 msgid "adj. resid."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1107
+#: src/language/stats/crosstabs.q:1105
 msgid "Chi-square tests."
 msgstr ""
 
 msgid "Chi-square tests."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1110 src/language/stats/crosstabs.q:1137
-#: src/language/stats/crosstabs.q:1157 src/language/stats/crosstabs.q:1178
-#: src/language/stats/examine.q:1369
+#: src/language/stats/crosstabs.q:1108 src/language/stats/crosstabs.q:1135
+#: src/language/stats/crosstabs.q:1155 src/language/stats/crosstabs.q:1176
+#: src/language/stats/examine.q:1372
 msgid "Statistic"
 msgstr ""
 
 msgid "Statistic"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1112 src/language/stats/oneway.q:287
-#: src/language/stats/oneway.q:690 src/language/stats/regression.q:287
+#: src/language/stats/crosstabs.q:1110 src/language/stats/oneway.q:287
+#: src/language/stats/oneway.q:690 src/language/stats/regression.q:301
 #: src/language/stats/t-test.q:980 src/language/stats/t-test.q:1172
 #: src/language/stats/t-test.q:1264
 msgid "df"
 msgstr ""
 
 #: src/language/stats/t-test.q:980 src/language/stats/t-test.q:1172
 #: src/language/stats/t-test.q:1264
 msgid "df"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1114
+#: src/language/stats/crosstabs.q:1112
 msgid "Asymp. Sig. (2-sided)"
 msgstr ""
 
 msgid "Asymp. Sig. (2-sided)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1116
+#: src/language/stats/crosstabs.q:1114
 msgid "Exact. Sig. (2-sided)"
 msgstr ""
 
 msgid "Exact. Sig. (2-sided)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1118
+#: src/language/stats/crosstabs.q:1116
 msgid "Exact. Sig. (1-sided)"
 msgstr ""
 
 msgid "Exact. Sig. (1-sided)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1133
+#: src/language/stats/crosstabs.q:1131
 msgid "Symmetric measures."
 msgstr ""
 
 msgid "Symmetric measures."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1136 src/language/stats/crosstabs.q:1177
+#: src/language/stats/crosstabs.q:1134 src/language/stats/crosstabs.q:1175
 msgid "Category"
 msgstr ""
 
 msgid "Category"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1139 src/language/stats/crosstabs.q:1181
+#: src/language/stats/crosstabs.q:1137 src/language/stats/crosstabs.q:1179
 msgid "Asymp. Std. Error"
 msgstr ""
 
 msgid "Asymp. Std. Error"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1140 src/language/stats/crosstabs.q:1182
+#: src/language/stats/crosstabs.q:1138 src/language/stats/crosstabs.q:1180
 msgid "Approx. T"
 msgstr ""
 
 msgid "Approx. T"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1141 src/language/stats/crosstabs.q:1183
+#: src/language/stats/crosstabs.q:1139 src/language/stats/crosstabs.q:1181
 msgid "Approx. Sig."
 msgstr ""
 
 msgid "Approx. Sig."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1152
+#: src/language/stats/crosstabs.q:1150
 msgid "Risk estimate."
 msgstr ""
 
 msgid "Risk estimate."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1156
+#: src/language/stats/crosstabs.q:1154
 #, c-format
 msgid "95%% Confidence Interval"
 msgstr ""
 
 #, c-format
 msgid "95%% Confidence Interval"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1159 src/language/stats/t-test.q:984
+#: src/language/stats/crosstabs.q:1157 src/language/stats/t-test.q:984
 #: src/language/stats/t-test.q:1169 src/language/stats/t-test.q:1267
 msgid "Lower"
 msgstr ""
 
 #: src/language/stats/t-test.q:1169 src/language/stats/t-test.q:1267
 msgid "Lower"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1160 src/language/stats/t-test.q:985
+#: src/language/stats/crosstabs.q:1158 src/language/stats/t-test.q:985
 #: src/language/stats/t-test.q:1170 src/language/stats/t-test.q:1268
 msgid "Upper"
 msgstr ""
 
 #: src/language/stats/t-test.q:1170 src/language/stats/t-test.q:1268
 msgid "Upper"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1174
+#: src/language/stats/crosstabs.q:1172
 msgid "Directional measures."
 msgstr ""
 
 msgid "Directional measures."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1179 src/ui/gui/var-sheet.c:68
+#: src/language/stats/crosstabs.q:1177 src/ui/gui/var-sheet.c:68
 msgid "Type"
 msgstr ""
 
 msgid "Type"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1935
+#: src/language/stats/crosstabs.q:1933
 msgid "Pearson Chi-Square"
 msgstr ""
 
 msgid "Pearson Chi-Square"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1936
+#: src/language/stats/crosstabs.q:1934
 msgid "Likelihood Ratio"
 msgstr ""
 
 msgid "Likelihood Ratio"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1937
+#: src/language/stats/crosstabs.q:1935
 msgid "Fisher's Exact Test"
 msgstr ""
 
 msgid "Fisher's Exact Test"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1938
+#: src/language/stats/crosstabs.q:1936
 msgid "Continuity Correction"
 msgstr ""
 
 msgid "Continuity Correction"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1939
+#: src/language/stats/crosstabs.q:1937
 msgid "Linear-by-Linear Association"
 msgstr ""
 
 msgid "Linear-by-Linear Association"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1976 src/language/stats/crosstabs.q:2046
-#: src/language/stats/crosstabs.q:2105
+#: src/language/stats/crosstabs.q:1974 src/language/stats/crosstabs.q:2044
+#: src/language/stats/crosstabs.q:2103
 msgid "N of Valid Cases"
 msgstr ""
 
 msgid "N of Valid Cases"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1992 src/language/stats/crosstabs.q:2121
+#: src/language/stats/crosstabs.q:1990 src/language/stats/crosstabs.q:2119
 msgid "Nominal by Nominal"
 msgstr ""
 
 msgid "Nominal by Nominal"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1993 src/language/stats/crosstabs.q:2122
+#: src/language/stats/crosstabs.q:1991 src/language/stats/crosstabs.q:2120
 msgid "Ordinal by Ordinal"
 msgstr ""
 
 msgid "Ordinal by Ordinal"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1994
+#: src/language/stats/crosstabs.q:1992
 msgid "Interval by Interval"
 msgstr ""
 
 msgid "Interval by Interval"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1995
+#: src/language/stats/crosstabs.q:1993
 msgid "Measure of Agreement"
 msgstr ""
 
 msgid "Measure of Agreement"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2000
+#: src/language/stats/crosstabs.q:1998
 msgid "Phi"
 msgstr ""
 
 msgid "Phi"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2001
+#: src/language/stats/crosstabs.q:1999
 msgid "Cramer's V"
 msgstr ""
 
 msgid "Cramer's V"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2002
+#: src/language/stats/crosstabs.q:2000
 msgid "Contingency Coefficient"
 msgstr ""
 
 msgid "Contingency Coefficient"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2003
+#: src/language/stats/crosstabs.q:2001
 msgid "Kendall's tau-b"
 msgstr ""
 
 msgid "Kendall's tau-b"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2004
+#: src/language/stats/crosstabs.q:2002
 msgid "Kendall's tau-c"
 msgstr ""
 
 msgid "Kendall's tau-c"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2005
+#: src/language/stats/crosstabs.q:2003
 msgid "Gamma"
 msgstr ""
 
 msgid "Gamma"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2006
+#: src/language/stats/crosstabs.q:2004
 msgid "Spearman Correlation"
 msgstr ""
 
 msgid "Spearman Correlation"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2007
+#: src/language/stats/crosstabs.q:2005
 msgid "Pearson's R"
 msgstr ""
 
 msgid "Pearson's R"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2008
+#: src/language/stats/crosstabs.q:2006
 msgid "Kappa"
 msgstr ""
 
 msgid "Kappa"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2078
+#: src/language/stats/crosstabs.q:2076
 #, c-format
 msgid "Odds Ratio for %s (%g / %g)"
 msgstr ""
 
 #, c-format
 msgid "Odds Ratio for %s (%g / %g)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2081
+#: src/language/stats/crosstabs.q:2079
 #, c-format
 msgid "Odds Ratio for %s (%.*s / %.*s)"
 msgstr ""
 
 #, c-format
 msgid "Odds Ratio for %s (%.*s / %.*s)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2089
+#: src/language/stats/crosstabs.q:2087
 #, c-format
 msgid "For cohort %s = %g"
 msgstr ""
 
 #, c-format
 msgid "For cohort %s = %g"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2092
+#: src/language/stats/crosstabs.q:2090
 #, c-format
 msgid "For cohort %s = %.*s"
 msgstr ""
 
 #, c-format
 msgid "For cohort %s = %.*s"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2123
+#: src/language/stats/crosstabs.q:2121
 msgid "Nominal by Interval"
 msgstr ""
 
 msgid "Nominal by Interval"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2128
+#: src/language/stats/crosstabs.q:2126
 msgid "Lambda"
 msgstr ""
 
 msgid "Lambda"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2129
+#: src/language/stats/crosstabs.q:2127
 msgid "Goodman and Kruskal tau"
 msgstr ""
 
 msgid "Goodman and Kruskal tau"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2130
+#: src/language/stats/crosstabs.q:2128
 msgid "Uncertainty Coefficient"
 msgstr ""
 
 msgid "Uncertainty Coefficient"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2131
+#: src/language/stats/crosstabs.q:2129
 msgid "Somers' d"
 msgstr ""
 
 msgid "Somers' d"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2132
+#: src/language/stats/crosstabs.q:2130
 msgid "Eta"
 msgstr ""
 
 msgid "Eta"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2137
+#: src/language/stats/crosstabs.q:2135
 msgid "Symmetric"
 msgstr ""
 
 msgid "Symmetric"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2138 src/language/stats/crosstabs.q:2139
+#: src/language/stats/crosstabs.q:2136 src/language/stats/crosstabs.q:2137
 #, c-format
 msgid "%s Dependent"
 msgstr ""
 
 #, c-format
 msgid "%s Dependent"
 msgstr ""
 
-#: src/language/stats/descriptives.c:103 src/language/stats/examine.q:1474
-#: src/language/stats/frequencies.q:120 src/language/stats/oneway.q:401
+#: src/language/stats/descriptives.c:103 src/language/stats/examine.q:1477
+#: src/language/stats/frequencies.q:119 src/language/stats/oneway.q:401
 #: src/language/stats/t-test.q:683 src/language/stats/t-test.q:706
 #: src/language/stats/t-test.q:829 src/language/stats/t-test.q:1166
 msgid "Mean"
 #: src/language/stats/t-test.q:683 src/language/stats/t-test.q:706
 #: src/language/stats/t-test.q:829 src/language/stats/t-test.q:1166
 msgid "Mean"
@@ -3168,17 +3175,17 @@ msgstr ""
 msgid "S E Mean"
 msgstr ""
 
 msgid "S E Mean"
 msgstr ""
 
-#: src/language/stats/descriptives.c:105 src/language/stats/frequencies.q:124
+#: src/language/stats/descriptives.c:105 src/language/stats/frequencies.q:123
 msgid "Std Dev"
 msgstr ""
 
 msgid "Std Dev"
 msgstr ""
 
-#: src/language/stats/descriptives.c:106 src/language/stats/examine.q:1554
-#: src/language/stats/frequencies.q:125
+#: src/language/stats/descriptives.c:106 src/language/stats/examine.q:1557
+#: src/language/stats/frequencies.q:124
 msgid "Variance"
 msgstr ""
 
 msgid "Variance"
 msgstr ""
 
-#: src/language/stats/descriptives.c:107 src/language/stats/examine.q:1661
-#: src/language/stats/frequencies.q:126
+#: src/language/stats/descriptives.c:107 src/language/stats/examine.q:1664
+#: src/language/stats/frequencies.q:125
 msgid "Kurtosis"
 msgstr ""
 
 msgid "Kurtosis"
 msgstr ""
 
@@ -3186,8 +3193,8 @@ msgstr ""
 msgid "S E Kurt"
 msgstr ""
 
 msgid "S E Kurt"
 msgstr ""
 
-#: src/language/stats/descriptives.c:109 src/language/stats/examine.q:1641
-#: src/language/stats/frequencies.q:128
+#: src/language/stats/descriptives.c:109 src/language/stats/examine.q:1644
+#: src/language/stats/frequencies.q:127
 msgid "Skewness"
 msgstr ""
 
 msgid "Skewness"
 msgstr ""
 
@@ -3195,22 +3202,22 @@ msgstr ""
 msgid "S E Skew"
 msgstr ""
 
 msgid "S E Skew"
 msgstr ""
 
-#: src/language/stats/descriptives.c:111 src/language/stats/examine.q:1602
-#: src/language/stats/frequencies.q:130
+#: src/language/stats/descriptives.c:111 src/language/stats/examine.q:1605
+#: src/language/stats/frequencies.q:129
 msgid "Range"
 msgstr ""
 
 msgid "Range"
 msgstr ""
 
-#: src/language/stats/descriptives.c:112 src/language/stats/examine.q:1579
-#: src/language/stats/frequencies.q:131 src/language/stats/oneway.q:413
+#: src/language/stats/descriptives.c:112 src/language/stats/examine.q:1582
+#: src/language/stats/frequencies.q:130 src/language/stats/oneway.q:413
 msgid "Minimum"
 msgstr ""
 
 msgid "Minimum"
 msgstr ""
 
-#: src/language/stats/descriptives.c:113 src/language/stats/examine.q:1590
-#: src/language/stats/frequencies.q:132 src/language/stats/oneway.q:414
+#: src/language/stats/descriptives.c:113 src/language/stats/examine.q:1593
+#: src/language/stats/frequencies.q:131 src/language/stats/oneway.q:414
 msgid "Maximum"
 msgstr ""
 
 msgid "Maximum"
 msgstr ""
 
-#: src/language/stats/descriptives.c:114 src/language/stats/frequencies.q:133
+#: src/language/stats/descriptives.c:114 src/language/stats/frequencies.q:132
 msgid "Sum"
 msgstr ""
 
 msgid "Sum"
 msgstr ""
 
@@ -3258,109 +3265,109 @@ msgstr ""
 msgid "Valid cases = %g; cases with missing value(s) = %g."
 msgstr ""
 
 msgid "Valid cases = %g; cases with missing value(s) = %g."
 msgstr ""
 
-#: src/language/stats/examine.q:478 src/language/stats/examine.q:490
+#: src/language/stats/examine.q:481 src/language/stats/examine.q:493
 #, c-format
 msgid "%s and %s are mutually exclusive"
 msgstr ""
 
 #, c-format
 msgid "%s and %s are mutually exclusive"
 msgstr ""
 
-#: src/language/stats/examine.q:917
+#: src/language/stats/examine.q:920
 msgid "Case Processing Summary"
 msgstr ""
 
 msgid "Case Processing Summary"
 msgstr ""
 
-#: src/language/stats/examine.q:1123
+#: src/language/stats/examine.q:1126
 msgid "Extreme Values"
 msgstr ""
 
 msgid "Extreme Values"
 msgstr ""
 
-#: src/language/stats/examine.q:1139
+#: src/language/stats/examine.q:1142
 msgid "Case Number"
 msgstr ""
 
 msgid "Case Number"
 msgstr ""
 
-#: src/language/stats/examine.q:1224
+#: src/language/stats/examine.q:1227
 msgid "Highest"
 msgstr ""
 
 msgid "Highest"
 msgstr ""
 
-#: src/language/stats/examine.q:1229
+#: src/language/stats/examine.q:1232
 msgid "Lowest"
 msgstr ""
 
 msgid "Lowest"
 msgstr ""
 
-#: src/language/stats/examine.q:1370 src/language/stats/oneway.q:403
-#: src/language/stats/oneway.q:688 src/language/stats/regression.q:191
+#: src/language/stats/examine.q:1373 src/language/stats/oneway.q:403
+#: src/language/stats/oneway.q:688 src/language/stats/regression.q:205
 msgid "Std. Error"
 msgstr ""
 
 msgid "Std. Error"
 msgstr ""
 
-#: src/language/stats/examine.q:1372 src/language/stats/oneway.q:417
+#: src/language/stats/examine.q:1375 src/language/stats/oneway.q:417
 msgid "Descriptives"
 msgstr ""
 
 msgid "Descriptives"
 msgstr ""
 
-#: src/language/stats/examine.q:1492 src/language/stats/oneway.q:408
+#: src/language/stats/examine.q:1495 src/language/stats/oneway.q:408
 #, c-format
 msgid "%g%% Confidence Interval for Mean"
 msgstr ""
 
 #, c-format
 msgid "%g%% Confidence Interval for Mean"
 msgstr ""
 
-#: src/language/stats/examine.q:1498 src/language/stats/oneway.q:410
+#: src/language/stats/examine.q:1501 src/language/stats/oneway.q:410
 msgid "Lower Bound"
 msgstr ""
 
 msgid "Lower Bound"
 msgstr ""
 
-#: src/language/stats/examine.q:1509 src/language/stats/oneway.q:411
+#: src/language/stats/examine.q:1512 src/language/stats/oneway.q:411
 msgid "Upper Bound"
 msgstr ""
 
 msgid "Upper Bound"
 msgstr ""
 
-#: src/language/stats/examine.q:1521
+#: src/language/stats/examine.q:1524
 #, c-format
 msgid "5%% Trimmed Mean"
 msgstr ""
 
 #, c-format
 msgid "5%% Trimmed Mean"
 msgstr ""
 
-#: src/language/stats/examine.q:1532 src/language/stats/frequencies.q:122
+#: src/language/stats/examine.q:1535 src/language/stats/frequencies.q:121
 msgid "Median"
 msgstr ""
 
 msgid "Median"
 msgstr ""
 
-#: src/language/stats/examine.q:1566 src/language/stats/oneway.q:402
+#: src/language/stats/examine.q:1569 src/language/stats/oneway.q:402
 #: src/language/stats/t-test.q:684 src/language/stats/t-test.q:707
 #: src/language/stats/t-test.q:831 src/language/stats/t-test.q:1167
 msgid "Std. Deviation"
 msgstr ""
 
 #: src/language/stats/t-test.q:684 src/language/stats/t-test.q:707
 #: src/language/stats/t-test.q:831 src/language/stats/t-test.q:1167
 msgid "Std. Deviation"
 msgstr ""
 
-#: src/language/stats/examine.q:1614
+#: src/language/stats/examine.q:1617
 msgid "Interquartile Range"
 msgstr ""
 
 msgid "Interquartile Range"
 msgstr ""
 
-#: src/language/stats/examine.q:1766
+#: src/language/stats/examine.q:1769
 #, c-format
 msgid "Boxplot of %s vs. %s"
 msgstr ""
 
 #, c-format
 msgid "Boxplot of %s vs. %s"
 msgstr ""
 
-#: src/language/stats/examine.q:1791
+#: src/language/stats/examine.q:1794
 msgid "Boxplot"
 msgstr ""
 
 msgid "Boxplot"
 msgstr ""
 
-#: src/language/stats/examine.q:1833
+#: src/language/stats/examine.q:1836
 #, c-format
 msgid "Normal Q-Q Plot of %s"
 msgstr ""
 
 #, c-format
 msgid "Normal Q-Q Plot of %s"
 msgstr ""
 
-#: src/language/stats/examine.q:1834 src/language/stats/examine.q:1840
+#: src/language/stats/examine.q:1837 src/language/stats/examine.q:1843
 msgid "Observed Value"
 msgstr ""
 
 msgid "Observed Value"
 msgstr ""
 
-#: src/language/stats/examine.q:1835
+#: src/language/stats/examine.q:1838
 msgid "Expected Normal"
 msgstr ""
 
 msgid "Expected Normal"
 msgstr ""
 
-#: src/language/stats/examine.q:1838
+#: src/language/stats/examine.q:1841
 #, c-format
 msgid "Detrended Normal Q-Q Plot of %s"
 msgstr ""
 
 #, c-format
 msgid "Detrended Normal Q-Q Plot of %s"
 msgstr ""
 
-#: src/language/stats/examine.q:1841
+#: src/language/stats/examine.q:1844
 msgid "Dev from Normal"
 msgstr ""
 
 msgid "Dev from Normal"
 msgstr ""
 
-#: src/language/stats/examine.q:1960 src/language/stats/examine.q:1982
-#: src/language/stats/frequencies.q:1528
+#: src/language/stats/examine.q:1963 src/language/stats/examine.q:1985
+#: src/language/stats/frequencies.q:1527
 msgid "Percentiles"
 msgstr ""
 
 msgid "Percentiles"
 msgstr ""
 
-#: src/language/stats/examine.q:2107
+#: src/language/stats/examine.q:2110
 msgid "Tukey's Hinges"
 msgstr ""
 
 msgid "Tukey's Hinges"
 msgstr ""
 
@@ -3382,139 +3389,139 @@ msgstr ""
 msgid "Could not create temporary file for FLIP."
 msgstr ""
 
 msgid "Could not create temporary file for FLIP."
 msgstr ""
 
-#: src/language/stats/flip.c:301 src/language/stats/flip.c:371
+#: src/language/stats/flip.c:301 src/language/stats/flip.c:367
 #, c-format
 msgid "Error writing FLIP file: %s."
 msgstr ""
 
 #, c-format
 msgid "Error writing FLIP file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:418
+#: src/language/stats/flip.c:414
 #, c-format
 msgid "Error rewinding FLIP file: %s."
 msgstr ""
 
 #, c-format
 msgid "Error rewinding FLIP file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:425
+#: src/language/stats/flip.c:421
 msgid "Error creating FLIP source file."
 msgstr ""
 
 msgid "Error creating FLIP source file."
 msgstr ""
 
-#: src/language/stats/flip.c:437
+#: src/language/stats/flip.c:433
 #, c-format
 msgid "Error reading FLIP file: %s."
 msgstr ""
 
 #, c-format
 msgid "Error reading FLIP file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:461
+#: src/language/stats/flip.c:457
 #, c-format
 msgid "Error seeking FLIP source file: %s."
 msgstr ""
 
 #, c-format
 msgid "Error seeking FLIP source file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:469
+#: src/language/stats/flip.c:465
 #, c-format
 msgid "Error writing FLIP source file: %s."
 msgstr ""
 
 #, c-format
 msgid "Error writing FLIP source file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:484
+#: src/language/stats/flip.c:480
 #, c-format
 msgid "Error rewinding FLIP source file: %s."
 msgstr ""
 
 #, c-format
 msgid "Error rewinding FLIP source file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:532
+#: src/language/stats/flip.c:528
 #, c-format
 msgid "Error reading FLIP temporary file: %s."
 msgstr ""
 
 #, c-format
 msgid "Error reading FLIP temporary file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:535
+#: src/language/stats/flip.c:531
 msgid "Unexpected end of file reading FLIP temporary file."
 msgstr ""
 
 msgid "Unexpected end of file reading FLIP temporary file."
 msgstr ""
 
-#: src/language/stats/frequencies.q:121
+#: src/language/stats/frequencies.q:120
 msgid "S.E. Mean"
 msgstr ""
 
 msgid "S.E. Mean"
 msgstr ""
 
-#: src/language/stats/frequencies.q:123
+#: src/language/stats/frequencies.q:122
 msgid "Mode"
 msgstr ""
 
 msgid "Mode"
 msgstr ""
 
-#: src/language/stats/frequencies.q:127
+#: src/language/stats/frequencies.q:126
 msgid "S.E. Kurt"
 msgstr ""
 
 msgid "S.E. Kurt"
 msgstr ""
 
-#: src/language/stats/frequencies.q:129
+#: src/language/stats/frequencies.q:128
 msgid "S.E. Skew"
 msgstr ""
 
 msgid "S.E. Skew"
 msgstr ""
 
-#: src/language/stats/frequencies.q:405
+#: src/language/stats/frequencies.q:404
 msgid ""
 "At most one of BARCHART, HISTOGRAM, or HBAR should be given.  HBAR will be "
 "assumed.  Argument values will be given precedence increasing along the "
 "order given."
 msgstr ""
 
 msgid ""
 "At most one of BARCHART, HISTOGRAM, or HBAR should be given.  HBAR will be "
 "assumed.  Argument values will be given precedence increasing along the "
 "order given."
 msgstr ""
 
-#: src/language/stats/frequencies.q:488
+#: src/language/stats/frequencies.q:487
 #, c-format
 msgid ""
 "MAX must be greater than or equal to MIN, if both are specified.  However, "
 "MIN was specified as %g and MAX as %g.  MIN and MAX will be ignored."
 msgstr ""
 
 #, c-format
 msgid ""
 "MAX must be greater than or equal to MIN, if both are specified.  However, "
 "MIN was specified as %g and MAX as %g.  MIN and MAX will be ignored."
 msgstr ""
 
-#: src/language/stats/frequencies.q:811
+#: src/language/stats/frequencies.q:810
 msgid ""
 "Upper limit of integer mode value range must be greater than lower limit."
 msgstr ""
 
 msgid ""
 "Upper limit of integer mode value range must be greater than lower limit."
 msgstr ""
 
-#: src/language/stats/frequencies.q:824
+#: src/language/stats/frequencies.q:823
 #, c-format
 msgid "Variable %s specified multiple times on VARIABLES subcommand."
 msgstr ""
 
 #, c-format
 msgid "Variable %s specified multiple times on VARIABLES subcommand."
 msgstr ""
 
-#: src/language/stats/frequencies.q:830
+#: src/language/stats/frequencies.q:829
 #, c-format
 msgid "Integer mode specified, but %s is not a numeric variable."
 msgstr ""
 
 #, c-format
 msgid "Integer mode specified, but %s is not a numeric variable."
 msgstr ""
 
-#: src/language/stats/frequencies.q:896
+#: src/language/stats/frequencies.q:895
 msgid "`)' expected after GROUPED interval list."
 msgstr ""
 
 msgid "`)' expected after GROUPED interval list."
 msgstr ""
 
-#: src/language/stats/frequencies.q:908
+#: src/language/stats/frequencies.q:907
 #, c-format
 msgid "Variables %s specified on GROUPED but not on VARIABLES."
 msgstr ""
 
 #, c-format
 msgid "Variables %s specified on GROUPED but not on VARIABLES."
 msgstr ""
 
-#: src/language/stats/frequencies.q:915
+#: src/language/stats/frequencies.q:914
 #, c-format
 msgid "Variables %s specified multiple times on GROUPED subcommand."
 msgstr ""
 
 #, c-format
 msgid "Variables %s specified multiple times on GROUPED subcommand."
 msgstr ""
 
-#: src/language/stats/frequencies.q:1145 src/language/stats/frequencies.q:1237
-#: src/language/stats/frequencies.q:1238 src/language/stats/frequencies.q:1270
+#: src/language/stats/frequencies.q:1144 src/language/stats/frequencies.q:1236
+#: src/language/stats/frequencies.q:1237 src/language/stats/frequencies.q:1269
 msgid "Cum"
 msgstr ""
 
 msgid "Cum"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1147 src/output/charts/plot-hist.c:129
+#: src/language/stats/frequencies.q:1146 src/output/charts/plot-hist.c:129
 msgid "Frequency"
 msgstr ""
 
 msgid "Frequency"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1167
+#: src/language/stats/frequencies.q:1166
 msgid "Value Label"
 msgstr ""
 
 msgid "Value Label"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1268
+#: src/language/stats/frequencies.q:1267
 msgid "Freq"
 msgstr ""
 
 msgid "Freq"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1269 src/language/stats/frequencies.q:1271
+#: src/language/stats/frequencies.q:1268 src/language/stats/frequencies.q:1270
 msgid "Pct"
 msgstr ""
 
 msgid "Pct"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1490
+#: src/language/stats/frequencies.q:1489
 #, c-format
 msgid "No valid data for variable %s; statistics not displayed."
 msgstr ""
 
 #, c-format
 msgid "No valid data for variable %s; statistics not displayed."
 msgstr ""
 
-#: src/language/stats/means.q:104
+#: src/language/stats/means.q:102
 msgid "Missing required subcommand TABLES."
 msgstr ""
 
 msgid "Missing required subcommand TABLES."
 msgstr ""
 
-#: src/language/stats/means.q:138
+#: src/language/stats/means.q:136
 msgid "TABLES subcommand may not appear more than once."
 msgstr ""
 
 msgid "TABLES subcommand may not appear more than once."
 msgstr ""
 
@@ -3532,21 +3539,21 @@ msgstr ""
 msgid "`%s' is not a variable name"
 msgstr ""
 
 msgid "`%s' is not a variable name"
 msgstr ""
 
-#: src/language/stats/oneway.q:286 src/language/stats/regression.q:286
+#: src/language/stats/oneway.q:286 src/language/stats/regression.q:300
 msgid "Sum of Squares"
 msgstr ""
 
 msgid "Sum of Squares"
 msgstr ""
 
-#: src/language/stats/oneway.q:288 src/language/stats/regression.q:288
+#: src/language/stats/oneway.q:288 src/language/stats/regression.q:302
 msgid "Mean Square"
 msgstr ""
 
 msgid "Mean Square"
 msgstr ""
 
-#: src/language/stats/oneway.q:289 src/language/stats/regression.q:289
+#: src/language/stats/oneway.q:289 src/language/stats/regression.q:303
 #: src/language/stats/t-test.q:977
 msgid "F"
 msgstr ""
 
 #: src/language/stats/oneway.q:290 src/language/stats/oneway.q:544
 #: src/language/stats/t-test.q:977
 msgid "F"
 msgstr ""
 
 #: src/language/stats/oneway.q:290 src/language/stats/oneway.q:544
-#: src/language/stats/regression.q:194 src/language/stats/regression.q:290
+#: src/language/stats/regression.q:208 src/language/stats/regression.q:304
 msgid "Significance"
 msgstr ""
 
 msgid "Significance"
 msgstr ""
 
@@ -3558,7 +3565,7 @@ msgstr ""
 msgid "Within Groups"
 msgstr ""
 
 msgid "Within Groups"
 msgstr ""
 
-#: src/language/stats/oneway.q:360 src/language/stats/regression.q:316
+#: src/language/stats/oneway.q:360 src/language/stats/regression.q:330
 msgid "ANOVA"
 msgstr ""
 
 msgid "ANOVA"
 msgstr ""
 
@@ -3594,7 +3601,7 @@ msgstr ""
 msgid "Value of Contrast"
 msgstr ""
 
 msgid "Value of Contrast"
 msgstr ""
 
-#: src/language/stats/oneway.q:689 src/language/stats/regression.q:193
+#: src/language/stats/oneway.q:689 src/language/stats/regression.q:207
 #: src/language/stats/t-test.q:979 src/language/stats/t-test.q:1171
 #: src/language/stats/t-test.q:1263
 msgid "t"
 #: src/language/stats/t-test.q:979 src/language/stats/t-test.q:1171
 #: src/language/stats/t-test.q:1263
 msgid "t"
@@ -3613,72 +3620,72 @@ msgstr ""
 msgid "Does not assume equal"
 msgstr ""
 
 msgid "Does not assume equal"
 msgstr ""
 
-#: src/language/stats/rank.q:244
+#: src/language/stats/rank.q:245
 #, c-format
 msgid "Variable %s already exists."
 msgstr ""
 
 #, c-format
 msgid "Variable %s already exists."
 msgstr ""
 
-#: src/language/stats/rank.q:249
+#: src/language/stats/rank.q:250
 msgid "Too many variables in INTO clause."
 msgstr ""
 
 msgid "Too many variables in INTO clause."
 msgstr ""
 
-#: src/language/stats/regression.q:145
+#: src/language/stats/regression.q:159
 msgid "R"
 msgstr ""
 
 msgid "R"
 msgstr ""
 
-#: src/language/stats/regression.q:146
+#: src/language/stats/regression.q:160
 msgid "R Square"
 msgstr ""
 
 msgid "R Square"
 msgstr ""
 
-#: src/language/stats/regression.q:147
+#: src/language/stats/regression.q:161
 msgid "Adjusted R Square"
 msgstr ""
 
 msgid "Adjusted R Square"
 msgstr ""
 
-#: src/language/stats/regression.q:148
+#: src/language/stats/regression.q:162
 msgid "Std. Error of the Estimate"
 msgstr ""
 
 msgid "Std. Error of the Estimate"
 msgstr ""
 
-#: src/language/stats/regression.q:153
+#: src/language/stats/regression.q:167
 msgid "Model Summary"
 msgstr ""
 
 msgid "Model Summary"
 msgstr ""
 
-#: src/language/stats/regression.q:190
+#: src/language/stats/regression.q:204
 msgid "B"
 msgstr ""
 
 msgid "B"
 msgstr ""
 
-#: src/language/stats/regression.q:192
+#: src/language/stats/regression.q:206
 msgid "Beta"
 msgstr ""
 
 msgid "Beta"
 msgstr ""
 
-#: src/language/stats/regression.q:195
+#: src/language/stats/regression.q:209
 msgid "(Constant)"
 msgstr ""
 
 msgid "(Constant)"
 msgstr ""
 
-#: src/language/stats/regression.q:255
+#: src/language/stats/regression.q:269
 msgid "Coefficients"
 msgstr ""
 
 msgid "Coefficients"
 msgstr ""
 
-#: src/language/stats/regression.q:292
+#: src/language/stats/regression.q:306
 msgid "Regression"
 msgstr ""
 
 msgid "Regression"
 msgstr ""
 
-#: src/language/stats/regression.q:293
+#: src/language/stats/regression.q:307
 msgid "Residual"
 msgstr ""
 
 msgid "Residual"
 msgstr ""
 
-#: src/language/stats/regression.q:371
+#: src/language/stats/regression.q:385
 msgid "Model"
 msgstr ""
 
 msgid "Model"
 msgstr ""
 
-#: src/language/stats/regression.q:372
+#: src/language/stats/regression.q:386
 msgid "Covariances"
 msgstr ""
 
 msgid "Covariances"
 msgstr ""
 
-#: src/language/stats/regression.q:387
+#: src/language/stats/regression.q:401
 msgid "Coefficient Correlations"
 msgstr ""
 
 msgid "Coefficient Correlations"
 msgstr ""
 
-#: src/language/stats/regression.q:885
+#: src/language/stats/regression.q:1157
 msgid "Dependent variable must be numeric."
 msgstr ""
 
 msgid "Dependent variable must be numeric."
 msgstr ""
 
@@ -3831,7 +3838,7 @@ msgid "Only USE ALL is currently implemented."
 msgstr ""
 
 #: src/language/utilities/include.c:43
 msgstr ""
 
 #: src/language/utilities/include.c:43
-msgid "expecting filename"
+msgid "expecting file name"
 msgstr ""
 
 #: src/language/utilities/permissions.c:77
 msgstr ""
 
 #: src/language/utilities/permissions.c:77
@@ -3976,26 +3983,12 @@ msgstr ""
 msgid "WIDTH is %d."
 msgstr ""
 
 msgid "WIDTH is %d."
 msgstr ""
 
-#: src/language/utilities/title.c:59
-#, c-format
-msgid "%s before: %s\n"
-msgstr ""
-
-#: src/language/utilities/title.c:59
-msgid "<none>"
-msgstr ""
-
-#: src/language/utilities/title.c:71
+#: src/language/utilities/title.c:68
 #, c-format
 msgid "%s: `.' expected after string."
 msgstr ""
 
 #, c-format
 msgid "%s: `.' expected after string."
 msgstr ""
 
-#: src/language/utilities/title.c:87
-#, c-format
-msgid "%s after: %s\n"
-msgstr ""
-
-#: src/language/utilities/title.c:142
+#: src/language/utilities/title.c:138
 #, c-format
 msgid "Document entered %s by %s:"
 msgstr ""
 #, c-format
 msgid "Document entered %s by %s:"
 msgstr ""
@@ -4060,11 +4053,11 @@ msgstr ""
 msgid "Type mismatch.  Cannot store %s data in %s variable %s."
 msgstr ""
 
 msgid "Type mismatch.  Cannot store %s data in %s variable %s."
 msgstr ""
 
-#: src/language/xforms/sample.c:77
+#: src/language/xforms/sample.c:75
 msgid "The sampling factor must be between 0 and 1 exclusive."
 msgstr ""
 
 msgid "The sampling factor must be between 0 and 1 exclusive."
 msgstr ""
 
-#: src/language/xforms/sample.c:97
+#: src/language/xforms/sample.c:95
 #, c-format
 msgid "Cannot sample %d observations from a population of %d."
 msgstr ""
 #, c-format
 msgid "Cannot sample %d observations from a population of %d."
 msgstr ""
@@ -4106,43 +4099,13 @@ msgstr ""
 msgid "Empirical with averaging"
 msgstr ""
 
 msgid "Empirical with averaging"
 msgstr ""
 
-#: src/math/sort.c:431
+#: src/math/sort.c:430
 #, c-format
 msgid ""
 "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.)"
 msgstr ""
 
 #, c-format
 msgid ""
 "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.)"
 msgstr ""
 
-#: src/message.c:89
-msgid "Terminating execution of syntax file due to error."
-msgstr ""
-
-#: src/message.c:91
-#, c-format
-msgid "Errors (%d) exceeds limit (%d)."
-msgstr ""
-
-#: src/message.c:94
-#, c-format
-msgid "Warnings (%d) exceed limit (%d)."
-msgstr ""
-
-#: src/message.c:143 src/message.c:150 src/message.c:153
-msgid "error"
-msgstr ""
-
-#: src/message.c:144 src/message.c:151 src/message.c:154
-msgid "warning"
-msgstr ""
-
-#: src/message.c:145 src/message.c:155
-msgid "note"
-msgstr ""
-
-#: src/message.c:147 src/message.c:148
-msgid "installation error"
-msgstr ""
-
 #: src/output/afm.c:150
 #, c-format
 msgid "opening font metrics file \"%s\""
 #: src/output/afm.c:150
 #, c-format
 msgid "opening font metrics file \"%s\""
@@ -4210,70 +4173,70 @@ msgstr ""
 msgid "unexpected end of line expecting string"
 msgstr ""
 
 msgid "unexpected end of line expecting string"
 msgstr ""
 
-#: src/output/ascii.c:161
+#: src/output/ascii.c:160
 #, c-format
 msgid "ascii: opening output file \"%s\""
 msgstr ""
 
 #, c-format
 msgid "ascii: opening output file \"%s\""
 msgstr ""
 
-#: src/output/ascii.c:172
+#: src/output/ascii.c:171
 #, c-format
 msgid ""
 "ascii: page excluding margins and headers must be at least 59 characters "
 "wide by 15 lines long, but as configured is only %d characters by %d lines"
 msgstr ""
 
 #, c-format
 msgid ""
 "ascii: page excluding margins and headers must be at least 59 characters "
 "wide by 15 lines long, but as configured is only %d characters by %d lines"
 msgstr ""
 
-#: src/output/ascii.c:233
+#: src/output/ascii.c:232
 #, c-format
 msgid "ascii: closing output file \"%s\""
 msgstr ""
 
 #, c-format
 msgid "ascii: closing output file \"%s\""
 msgstr ""
 
-#: src/output/ascii.c:285
+#: src/output/ascii.c:284
 #, c-format
 msgid ""
 "ascii: bad index value for `box' key: syntax is box[INDEX], 0 <= INDEX < %d "
 "decimal, with INDEX expressed in base 4"
 msgstr ""
 
 #, c-format
 msgid ""
 "ascii: bad index value for `box' key: syntax is box[INDEX], 0 <= INDEX < %d "
 "decimal, with INDEX expressed in base 4"
 msgstr ""
 
-#: src/output/ascii.c:292
+#: src/output/ascii.c:291
 #, c-format
 msgid "ascii: multiple values for %s"
 msgstr ""
 
 #, c-format
 msgid "ascii: multiple values for %s"
 msgstr ""
 
-#: src/output/ascii.c:300
+#: src/output/ascii.c:299
 #, c-format
 msgid "ascii: unknown parameter `%s'"
 msgstr ""
 
 #, c-format
 msgid "ascii: unknown parameter `%s'"
 msgstr ""
 
-#: src/output/ascii.c:314
+#: src/output/ascii.c:313
 #, c-format
 msgid "ascii: positive integer required as `%s' value"
 msgstr ""
 
 #, c-format
 msgid "ascii: positive integer required as `%s' value"
 msgstr ""
 
-#: src/output/ascii.c:340
+#: src/output/ascii.c:339
 msgid "ascii: `emphasis' value must be `bold', `underline', or `none'"
 msgstr ""
 
 msgid "ascii: `emphasis' value must be `bold', `underline', or `none'"
 msgstr ""
 
-#: src/output/ascii.c:353
+#: src/output/ascii.c:352
 #, c-format
 msgid "ascii: zero or positive integer required as `%s' value"
 msgstr ""
 
 #, c-format
 msgid "ascii: zero or positive integer required as `%s' value"
 msgstr ""
 
-#: src/output/ascii.c:384
+#: src/output/ascii.c:383
 #, c-format
 msgid "ascii: boolean value expected for `%s'"
 msgstr ""
 
 #, c-format
 msgid "ascii: boolean value expected for `%s'"
 msgstr ""
 
-#: src/output/ascii.c:473
+#: src/output/ascii.c:472
 #, c-format
 msgid "ascii: bad line (%d,%d)-(%d,%d) out of (%d,%d)\n"
 msgstr ""
 
 #, c-format
 msgid "ascii: bad line (%d,%d)-(%d,%d) out of (%d,%d)\n"
 msgstr ""
 
-#: src/output/ascii.c:683 src/output/postscript.c:832
+#: src/output/ascii.c:682 src/output/postscript.c:831
 #, c-format
 msgid "%s - Page %d"
 msgstr ""
 
 #, c-format
 msgid "%s - Page %d"
 msgstr ""
 
-#: src/output/ascii.c:727
+#: src/output/ascii.c:726
 msgid "ascii: charts are unsupported by this driver"
 msgstr ""
 
 msgid "ascii: charts are unsupported by this driver"
 msgstr ""
 
@@ -4281,150 +4244,164 @@ msgstr ""
 msgid "HISTOGRAM"
 msgstr ""
 
 msgid "HISTOGRAM"
 msgstr ""
 
-#: src/output/html.c:68
+#: src/output/html.c:66
 #, c-format
 msgid "opening HTML output file: %s"
 msgstr ""
 
 #, c-format
 msgid "opening HTML output file: %s"
 msgstr ""
 
-#: src/output/html.c:79
+#: src/output/html.c:77
 msgid "PSPP Output"
 msgstr ""
 
 msgid "PSPP Output"
 msgstr ""
 
-#: src/output/html.c:165
+#: src/output/html.c:163
 #, c-format
 msgid "unknown configuration parameter `%s' for HTML device driver"
 msgstr ""
 
 #, c-format
 msgid "unknown configuration parameter `%s' for HTML device driver"
 msgstr ""
 
-#: src/output/output.c:166
+#: src/output/output.c:165
 #, c-format
 #, c-format
-msgid "Unknown output driver `%s'."
+msgid "unknown output driver `%s'"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:168
+#: src/output/output.c:167
 #, c-format
 #, c-format
-msgid "Output driver `%s' referenced but never defined."
+msgid "output driver `%s' referenced but never defined"
 msgstr ""
 
 #: src/output/output.c:261
 msgstr ""
 
 #: src/output/output.c:261
-msgid "Using default output driver configuration."
+msgid "using default output driver configuration"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:296
-msgid ""
-"Cannot find output initialization file.  Use `-vvvvv' to view search path."
+#: src/output/output.c:293
+msgid "cannot find output initialization file (use `-vv' to view search path)"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:304 src/output/output.c:1067
+#: src/output/output.c:301
 #, c-format
 #, c-format
-msgid "Opening %s: %s."
+msgid "cannot open \"%s\""
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:315 src/output/output.c:1078
+#: src/output/output.c:313
 #, c-format
 #, c-format
-msgid "Reading %s: %s."
+msgid "reading \"%s\""
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:337 src/output/output.c:503
-msgid "Syntax error."
+#: src/output/output.c:335
+msgid "syntax error"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:347
+#: src/output/output.c:344
 #, c-format
 #, c-format
-msgid "Closing %s: %s."
+msgid "error closing \"%s\""
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:355
-msgid "No output drivers are active."
+#: src/output/output.c:352
+msgid "no active output drivers"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:358
-msgid "Error reading device definition file."
+#: src/output/output.c:355
+msgid "error reading device definition file"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:475
+#: src/output/output.c:472
 #, c-format
 msgid ""
 "Driver classes:\n"
 "\t"
 msgstr ""
 
 #, c-format
 msgid ""
 "Driver classes:\n"
 "\t"
 msgstr ""
 
-#: src/output/output.c:604
-msgid "Syntax error in string constant."
+#: src/output/output.c:504
+#, c-format
+msgid "syntax error parsing options for \"%s\" driver"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:639
-msgid "Syntax error in options."
+#: src/output/output.c:521
+#, c-format
+msgid ""
+"reached end of options inside quoted string parsing options for \"%s\" driver"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:649
-msgid "Syntax error in options (`=' expected)."
+#: src/output/output.c:594
+#, c-format
+msgid "syntax error in string constant parsing options for \"%s\" driver"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:656
-msgid "Syntax error in options (value expected after `=')."
+#: src/output/output.c:639
+#, c-format
+msgid "syntax error expecting `=' parsing options for driver \"%s\""
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:698
+#: src/output/output.c:692
 #, c-format
 #, c-format
-msgid "Unknown output driver class `%s'."
+msgid "unknown output driver class `%s'"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:719
+#: src/output/output.c:714
 #, c-format
 #, c-format
-msgid "Unknown device type `%s'."
+msgid "unknown device type `%s'"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:738
+#: src/output/output.c:733
 #, c-format
 #, c-format
-msgid "Can't initialize output driver `%s' of class `%s'."
+msgid "cannot initialize output driver `%s' of class `%s'"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:783
-msgid "Driver definition line missing driver name or class name"
+#: src/output/output.c:779
+msgid "driver definition line missing driver name or class name"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:929
+#: src/output/output.c:926
 #, c-format
 #, c-format
-msgid "Unit \"%s\" is unknown in dimension \"%s\"."
+msgid "unit \"%s\" is unknown in dimension \"%s\""
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:944
+#: src/output/output.c:941
 #, c-format
 #, c-format
-msgid "Bad dimension \"%s\"."
+msgid "bad dimension \"%s\""
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:970
+#: src/output/output.c:967
 #, c-format
 #, c-format
-msgid "`x' expected in paper size `%s'."
+msgid "`x' expected in paper size `%s'"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:980
+#: src/output/output.c:977
 #, c-format
 #, c-format
-msgid "Trailing garbage `%s' on paper size `%s'."
+msgid "trailing garbage `%s' on paper size `%s'"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:1029
-msgid "Paper size name must not be empty."
+#: src/output/output.c:1021
+msgid "paper size name cannot be empty"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:1060
-msgid "Cannot find `papersize' configuration file."
+#: src/output/output.c:1039
+msgid "cannot find `papersize' configuration file"
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:1105
-msgid "Syntax error in paper size definition."
+#: src/output/output.c:1046
+#, c-format
+msgid "error opening \"%s\""
 msgstr ""
 
 msgstr ""
 
-#: src/output/output.c:1134
-msgid "Error reading paper size definition file."
+#: src/output/output.c:1057
+#, c-format
+msgid "error reading \"%s\""
 msgstr ""
 
 msgstr ""
 
-#: src/output/postscript.c:164
+#: src/output/output.c:1085
+msgid "syntax error in paper size definition"
+msgstr ""
+
+#: src/output/output.c:1097
+msgid "error reading paper size definition file"
+msgstr ""
+
+#: src/output/postscript.c:163
 #, c-format
 msgid "opening PostScript output file \"%s\""
 msgstr ""
 
 #, c-format
 msgid "opening PostScript output file \"%s\""
 msgstr ""
 
-#: src/output/postscript.c:202
+#: src/output/postscript.c:201
 #, c-format
 msgid ""
 "The defined PostScript page is not long enough to hold margins and headers, "
 #, c-format
 msgid ""
 "The defined PostScript page is not long enough to hold margins and headers, "
@@ -4432,87 +4409,87 @@ msgid ""
 "lines of each font at the default size of %d.%03d points."
 msgstr ""
 
 "lines of each font at the default size of %d.%03d points."
 msgstr ""
 
-#: src/output/postscript.c:250
+#: src/output/postscript.c:249
 #, c-format
 msgid "closing PostScript output file \"%s\""
 msgstr ""
 
 #, c-format
 msgid "closing PostScript output file \"%s\""
 msgstr ""
 
-#: src/output/postscript.c:310
+#: src/output/postscript.c:309
 #, c-format
 msgid "unknown configuration parameter `%s' for PostScript device driver"
 msgstr ""
 
 #, c-format
 msgid "unknown configuration parameter `%s' for PostScript device driver"
 msgstr ""
 
-#: src/output/postscript.c:326
+#: src/output/postscript.c:325
 #, c-format
 msgid ""
 "unknown orientation `%s' (valid orientations are `portrait' and `landscape')"
 msgstr ""
 
 #, c-format
 msgid ""
 "unknown orientation `%s' (valid orientations are `portrait' and `landscape')"
 msgstr ""
 
-#: src/output/postscript.c:338
+#: src/output/postscript.c:337
 #, c-format
 msgid "boolean value expected for %s"
 msgstr ""
 
 #, c-format
 msgid "boolean value expected for %s"
 msgstr ""
 
-#: src/output/postscript.c:351
+#: src/output/postscript.c:350
 #, c-format
 msgid "positive integer value required for `%s'"
 msgstr ""
 
 #, c-format
 msgid "positive integer value required for `%s'"
 msgstr ""
 
-#: src/output/postscript.c:356
+#: src/output/postscript.c:355
 #, c-format
 msgid "default font size must be at least 1 point (value of 1000 for key `%s')"
 msgstr ""
 
 #, c-format
 msgid "default font size must be at least 1 point (value of 1000 for key `%s')"
 msgstr ""
 
-#: src/output/postscript.c:388
+#: src/output/postscript.c:387
 #, c-format
 msgid "value for `%s' must be a dimension of positive length (i.e., `1in')"
 msgstr ""
 
 #, c-format
 msgid "value for `%s' must be a dimension of positive length (i.e., `1in')"
 msgstr ""
 
-#: src/output/postscript.c:1182
+#: src/output/postscript.c:1181
 #, c-format
 msgid "\"%s\": bad font specification"
 msgstr ""
 
 #, c-format
 msgid "\"%s\": bad font specification"
 msgstr ""
 
-#: src/output/postscript.c:1190
+#: src/output/postscript.c:1189
 #, c-format
 msgid "could not find AFM file \"%s\""
 msgstr ""
 
 #, c-format
 msgid "could not find AFM file \"%s\""
 msgstr ""
 
-#: src/output/postscript.c:1204
+#: src/output/postscript.c:1203
 #, c-format
 msgid "could not find font \"%s\""
 msgstr ""
 
 #, c-format
 msgid "could not find font \"%s\""
 msgstr ""
 
-#: src/output/postscript.c:1213
+#: src/output/postscript.c:1212
 #, c-format
 msgid "could not find encoding \"%s\""
 msgstr ""
 
 #, c-format
 msgid "could not find encoding \"%s\""
 msgstr ""
 
-#: src/output/postscript.c:1313
+#: src/output/postscript.c:1312
 #, c-format
 msgid "cannot open font file \"%s\""
 msgstr ""
 
 #, c-format
 msgid "cannot open font file \"%s\""
 msgstr ""
 
-#: src/output/postscript.c:1354
+#: src/output/postscript.c:1353
 #, c-format
 msgid "reading font file \"%s\""
 msgstr ""
 
 #, c-format
 msgid "reading font file \"%s\""
 msgstr ""
 
-#: src/output/postscript.c:1376
+#: src/output/postscript.c:1375
 #, c-format
 msgid "cannot open font encoding file \"%s\""
 msgstr ""
 
 #, c-format
 msgid "cannot open font encoding file \"%s\""
 msgstr ""
 
-#: src/output/postscript.c:1405
+#: src/output/postscript.c:1404
 msgid "invalid numeric format"
 msgstr ""
 
 msgid "invalid numeric format"
 msgstr ""
 
-#: src/output/table.c:239
+#: src/output/table.c:236
 #, c-format
 msgid "bad vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n"
 msgstr ""
 
 #, c-format
 msgid "bad vline: x=%d+%d=%d y=(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n"
 msgstr ""
 
-#: src/output/table.c:310
+#: src/output/table.c:307
 #, c-format
 msgid ""
 "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n"
 #, c-format
 msgid ""
 "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n"
@@ -4550,26 +4527,18 @@ msgstr ""
 msgid "Font Selection"
 msgstr ""
 
 msgid "Font Selection"
 msgstr ""
 
-#: src/ui/gui/message-dialog.c:78
+#: src/ui/gui/message-dialog.c:75
 msgid "Script Error"
 msgstr ""
 
 msgid "Script Error"
 msgstr ""
 
-#: src/ui/gui/message-dialog.c:83
-msgid "Installation Error"
-msgstr ""
-
-#: src/ui/gui/message-dialog.c:88
+#: src/ui/gui/message-dialog.c:79
 msgid "Data File Error"
 msgstr ""
 
 msgid "Data File Error"
 msgstr ""
 
-#: src/ui/gui/message-dialog.c:95
+#: src/ui/gui/message-dialog.c:84
 msgid "PSPP Error"
 msgstr ""
 
 msgid "PSPP Error"
 msgstr ""
 
-#: src/ui/gui/message-dialog.c:155
-msgid "Terminating NOW due to fatal error"
-msgstr ""
-
 #: src/ui/gui/missing-val-dialog.c:113 src/ui/gui/missing-val-dialog.c:158
 msgid "Incorrect value for variable type"
 msgstr ""
 #: src/ui/gui/missing-val-dialog.c:113 src/ui/gui/missing-val-dialog.c:158
 msgid "Incorrect value for variable type"
 msgstr ""
@@ -4658,7 +4627,7 @@ msgstr ""
 msgid "Scale"
 msgstr ""
 
 msgid "Scale"
 msgstr ""
 
-#: src/ui/terminal/command-line.c:213
+#: src/ui/terminal/command-line.c:214
 #, 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"
@@ -4703,39 +4672,15 @@ msgid ""
 "\n"
 msgstr ""
 
 "\n"
 msgstr ""
 
-#: src/ui/terminal/command-line.c:247
+#: src/ui/terminal/command-line.c:248
 #, c-format
 msgid ""
 "\n"
 "Report bugs to <%s>.\n"
 msgstr ""
 
 #, c-format
 msgid ""
 "\n"
 "Report bugs to <%s>.\n"
 msgstr ""
 
-#: src/ui/terminal/main.c:154
-msgid "This command not executed.  Stopping here to avoid cascading failures."
-msgstr ""
-
-#: src/ui/terminal/main.c:164
-msgid "This command not executed."
-msgstr ""
-
-#: src/ui/terminal/main.c:168
-msgid ""
-"Skipping the rest of this command.  Part of this command may have been "
-"executed."
-msgstr ""
-
-#: src/ui/terminal/main.c:173
+#: src/ui/terminal/main.c:111
 msgid ""
 msgid ""
-"Skipping the rest of this command.  This command was fully executed up to "
-"this point."
-msgstr ""
-
-#: src/ui/terminal/main.c:178
-msgid ""
-"Trailing garbage was encountered following this command.  The command was "
-"fully executed to this point."
-msgstr ""
-
-#: src/ui/terminal/main.c:194
-msgid "The rest of this command has been discarded."
+"Stopping syntax file processing here to avoid a cascade of dependent command "
+"failures."
 msgstr ""
 msgstr ""
index e4e5014fe12ad4f62cbec014eded8e808930ba88..33f5f5f1aebce3b018f929e01d731381bbae3506 100644 (file)
@@ -1,3 +1,14 @@
+Wed Apr 26 12:58:46 2006  Ben Pfaff  <blp@gnu.org>
+
+       Improve the way we handle the various parsing "states".  Until now
+       we've hard-coded the state transitions in the command definition
+       file, but that's error-prone and, worse, it's redundant--we can
+       figure out what state we're in anyhow.  We can cleanly handle
+       INPUT PROGRAM and FILE TYPE with a nested command-processing loop.
+       
+       * procedure.c (case_source_is_complex): Removed.
+       (discard_variables) No need to set pgm_state anymore.
+
 Tue Apr 25 11:06:49 2006  Ben Pfaff  <blp@gnu.org>
 
        Finish reforming error message support.  In this phase, move
 Tue Apr 25 11:06:49 2006  Ben Pfaff  <blp@gnu.org>
 
        Finish reforming error message support.  In this phase, move
index ce8805cd38ae9b14a0a9103dbdf292989c570350..48aecc940d4a709f82a6db3d12f8de71672b5968 100644 (file)
@@ -1,3 +1,58 @@
+Wed Apr 26 13:06:42 2006  Ben Pfaff  <blp@gnu.org>
+
+       Work on readline completion.
+
+       * command.c: (pspp_completion_function) Removed.
+       (pspp_attempted_completion_function) New function.
+       (command_generator) New function.
+
+Wed Apr 26 13:04:48 2006  Ben Pfaff  <blp@gnu.org>
+
+       Improve the way we handle the various parsing "states".  Until now
+       we've hard-coded the state transitions in the command definition
+       file, but that's error-prone and, worse, it's redundant--we can
+       figure out what state we're in anyhow.  We can cleanly handle
+       INPUT PROGRAM and FILE TYPE with a nested command-processing loop.
+       
+       * command.c: (cmd_result_is_success) New function.
+       (cmd_result_is_failure) New function.
+       (enum states) New enum.
+       (enum flags) New enum.
+       (struct command) Add states, flags members.  Remove transition,
+       skip_entire_name, debug members.  Renamed func member as function.
+       (macro DEFCMD) Removed.
+       (macro DBGCMD) Removed.
+       (macro SPCCMD) Removed.
+       (macro UNIMPL) Removed.
+       (macro DEF_CMD) New.
+       (macro UNIMPL_CMD) New.
+       (macro COMMAND_CNT) Changed to static const var, renamed
+       command_cnt.  Updated all references.
+       (FILE_TYPE_okay) Removed.
+       (cmd_parse) Rewrote in terms of do_parse_command().
+       (do_parse_command) New function.
+       (find_command) New function.
+       (unknown_command_error) Use struct string to simplify code.
+       (parse_command_name) Recognize comment command names.  Handle
+       flags.  Don't reject testing-mode-only commands here--let higher
+       level do it.
+       (verify_valid_command) New function.
+       (cmd_comment) New function.
+
+       * command.def: Completely rewritten and now sensibly organized.
+
+       * command.h: (enum STATE_*) Renamed CMD_STATE_*.
+       (CMD_*) Now "enum cmd_result".  Added CMD_QUIT.  New
+       CMD_END_SUBLOOP.  Removed CMD_TRAILING_GARBAGE, CMD_PART_SUCCESS,
+       CMD_PART_SUCCESS_MAYBE and replaced all references by CMD_FAILURE.
+       Added CMD_NOT_IMPLEMENTED.
+        (macro DEFCMD) Removed.
+       (macro DBGCMD) Removed.
+       (macro SPCCMD) Removed.
+       (macro UNIMPL) Removed.
+       (macro DEF_CMD) New.
+       (macro UNIMPL_CMD) New.
+
 Mon Apr  3 11:03:36 2006  Ben Pfaff  <blp@gnu.org>
 
        * list.q: (write_all_headers) Adapt to new html and output
 Mon Apr  3 11:03:36 2006  Ben Pfaff  <blp@gnu.org>
 
        * list.q: (write_all_headers) Adapt to new html and output
index c9e93cc9ed258ee25125cdd7703fed937f909832..b842084eada0b00f33b2b0ce2d8d0b1113108aec 100644 (file)
    02110-1301, USA. */
 
 #include <config.h>
    02110-1301, USA. */
 
 #include <config.h>
-#include <libpspp/message.h>
+
 #include <language/command.h>
 #include <language/command.h>
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <ctype.h>
 #include <errno.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <ctype.h>
 #include <errno.h>
 #include <unistd.h>
+
+#include <data/dictionary.h>
+#include <data/settings.h>
+#include <data/variable.h>
+#include <language/lexer/lexer.h>
 #include <libpspp/alloc.h>
 #include <libpspp/compiler.h>
 #include <libpspp/alloc.h>
 #include <libpspp/compiler.h>
-#include <data/dictionary.h>
 #include <libpspp/message.h>
 #include <libpspp/message.h>
-#include <language/lexer/lexer.h>
-#include <data/settings.h>
-#include <output/manager.h>
+#include <libpspp/message.h>
 #include <libpspp/str.h>
 #include <libpspp/str.h>
+#include <output/manager.h>
 #include <output/table.h>
 #include <output/table.h>
-#include <data/variable.h>
 #include <procedure.h>
 
 #if HAVE_SYS_WAIT_H
 #include <sys/wait.h>
 #endif
 
 #include <procedure.h>
 
 #if HAVE_SYS_WAIT_H
 #include <sys/wait.h>
 #endif
 
+#if HAVE_READLINE
+#include <readline/readline.h>
+#endif
+
 #include "gettext.h"
 #define _(msgid) gettext (msgid)
 #define N_(msgid) msgid
 \f
 #include "gettext.h"
 #define _(msgid) gettext (msgid)
 #define N_(msgid) msgid
 \f
-/* Global variables. */
+/* Returns true if RESULT indicates success,
+   false otherwise. */
+bool
+cmd_result_is_success (enum cmd_result result) 
+{
+  return (result == CMD_SUCCESS || result == CMD_EOF
+          || result == CMD_QUIT || result == CMD_END_SUBLOOP);
+}
 
 
-/* A STATE_* constant giving the current program state. */
-int pgm_state;
+/* Returns true if RESULT indicates failure,
+   false otherwise. */
+bool
+cmd_result_is_failure (enum cmd_result result) 
+{
+  return !cmd_result_is_success (result);
+}
 \f
 \f
-/* Static variables. */
+/* Command processing states. */
+enum states
+  {
+    S_INITIAL = 0x01,         /* Allowed before active file defined. */
+    S_DATA = 0x02,            /* Allowed after active file defined. */
+    S_INPUT_PROGRAM = 0x04,   /* Allowed in INPUT PROGRAM. */
+    S_FILE_TYPE = 0x08,       /* Allowed in FILE TYPE. */
+    S_ANY = 0x0f              /* Allowed anywhere. */
+  };
+
+/* Other command requirements. */
+enum flags 
+  {
+    F_ENHANCED = 0x10,        /* Allowed only in enhanced syntax mode. */
+    F_TESTING = 0x20,         /* Allowed only in testing mode. */
+    F_KEEP_FINAL_TOKEN = 0x40 /* Don't skip final token in command name. */
+  };
 
 /* A single command. */
 struct command
   {
 
 /* A single command. */
 struct command
   {
+    enum states states;         /* States in which command is allowed. */
+    enum flags flags;           /* Other command requirements. */
     const char *name;          /* Command name. */
     const char *name;          /* Command name. */
-    int transition[4];         /* Transitions to make from each state. */
-    int (*func) (void);                /* Function to call. */
-    int skip_entire_name;       /* If zero, we don't skip the
-                                   final token in the command name. */
-    short debug;                /* Set if this cmd available only in test mode*/
+    int (*function) (void);    /* Function to call. */
   };
 
 /* Define the command array. */
   };
 
 /* Define the command array. */
-#define DEFCMD(NAME, T1, T2, T3, T4, FUNC)             \
-       {NAME, {T1, T2, T3, T4}, FUNC, 1, 0},
-#define DBGCMD(NAME, T1, T2, T3, T4, FUNC)             \
-       {NAME, {T1, T2, T3, T4}, FUNC, 1, 1},
-#define SPCCMD(NAME, T1, T2, T3, T4, FUNC)             \
-       {NAME, {T1, T2, T3, T4}, FUNC, 0, 0},
-#define UNIMPL(NAME, T1, T2, T3, T4, DESC)             \
-       {NAME, {T1, T2, T3, T4}, NULL, 1, 0},
+#define DEF_CMD(STATES, FLAGS, NAME, FUNCTION) {STATES, FLAGS, NAME, FUNCTION},
+#define UNIMPL_CMD(NAME, DESCRIPTION) {S_ANY, 0, NAME, NULL},
 static const struct command commands[] = 
   {
 #include "command.def"
   };
 static const struct command commands[] = 
   {
 #include "command.def"
   };
-#undef DEFCMD
-#undef DBGCMD
-#undef UNIMPL
+#undef DEF_CMD
+#undef UNIMPL_CMD
 
 
+static const size_t command_cnt = sizeof commands / sizeof *commands;
 
 
-/* Complete the line using the name of a command, 
- * based upon the current prg_state
- */
-char * 
-pspp_completion_function (const char *text,   int state)
-{
-  static int skip=0;
-  const struct command *cmd = 0;
-  
-  for(;;)
-    {
-      if ( state + skip >= sizeof(commands)/ sizeof(struct command))
-       {
-         skip = 0;
-         return 0;
-       }
-
-      cmd = &commands[state + skip];
-  
-      if ( cmd->transition[pgm_state] == STATE_ERROR || ( cmd->debug  &&  ! get_testing_mode () ) ) 
-       {
-         skip++; 
-         continue;
-       }
-      
-      if ( text == 0 || 0 == strncasecmp (cmd->name, text, strlen(text)))
-       {
-         break;
-       }
-
-      skip++;
-    }
-  
-
-  return xstrdup(cmd->name);
-}
-
-
-
-#define COMMAND_CNT (sizeof commands / sizeof *commands)
+static bool verify_valid_command (const struct command *, enum cmd_state);
+static const struct command *find_command (const char *name);
 \f
 /* Command parser. */
 
 static const struct command *parse_command_name (void);
 \f
 /* Command parser. */
 
 static const struct command *parse_command_name (void);
+static enum cmd_result do_parse_command (enum cmd_state);
 
 
-/* Determines whether command C is appropriate to call in this
-   part of a FILE TYPE structure. */
-static int
-FILE_TYPE_okay (const struct command *c UNUSED)
-#if 0
+/* Parses an entire command, from command name to terminating
+   dot.  On failure, skips to the terminating dot.
+   Returns the command's success or failure result. */
+enum cmd_result
+cmd_parse (enum cmd_state state) 
 {
 {
-  int okay = 0;
+  int result;
   
   
-  if (c->func != cmd_record_type
-      && c->func != cmd_data_list
-      && c->func != cmd_repeating_data
-      && c->func != cmd_end_file_type)
-    msg (SE, _("%s not allowed inside FILE TYPE/END FILE TYPE."), c->name);
-  /* FIXME */
-  else if (c->func == cmd_repeating_data && fty.type == FTY_GROUPED)
-    msg (SE, _("%s not allowed inside FILE TYPE GROUPED/END FILE TYPE."),
-        c->name);
-  else if (!fty.had_rec_type && c->func != cmd_record_type)
-    msg (SE, _("RECORD TYPE must be the first command inside a "
-                     "FILE TYPE structure."));
-  else
-    okay = 1;
+  som_new_series ();
 
 
-  if (c->func == cmd_record_type)
-    fty.had_rec_type = 1;
+  result = do_parse_command (state);
+  if (cmd_result_is_failure (result)) 
+    lex_discard_rest_of_command ();
 
 
-  return okay;
-}
-#else
-{
-  return 1;
+  unset_cmd_algorithm ();
+  dict_clear_aux (default_dict);
+
+  return result;
 }
 }
-#endif
 
 
-/* Parses an entire PSPP command.  This includes everything from the
-   command name to the terminating dot.  Does most of its work by
-   passing it off to the respective command dispatchers.  Only called
-   by parse() in main.c. */
-int
-cmd_parse (void)
+/* Parses an entire command, from command name to terminating
+   dot. */
+static enum cmd_result
+do_parse_command (enum cmd_state state)
 {
 {
-  const struct command *cp;    /* Iterator used to find the proper command. */
-
-#if C_ALLOCA
-  /* The generic alloca package performs garbage collection when it is
-     called with an argument of zero. */
-  alloca (0);
-#endif /* C_ALLOCA */
+  const struct command *command;
+  enum cmd_result result;
 
   /* Null commands can result from extra empty lines. */
   if (token == '.')
     return CMD_SUCCESS;
 
 
   /* Null commands can result from extra empty lines. */
   if (token == '.')
     return CMD_SUCCESS;
 
-  /* Parse comments. */
-  if ((token == T_ID && !strcasecmp (tokid, "COMMENT"))
-      || token == T_EXP || token == '*' || token == '[')
-    {
-      lex_skip_comment ();
-      return CMD_SUCCESS;
-    }
-
-  /* Otherwise the line must begin with a command name, which is
-     always an ID token. */
-  if (token != T_ID)
-    {
-      lex_error (_("expecting command name"));
-      return CMD_FAILURE;
-    }
-
   /* Parse the command name. */
   /* Parse the command name. */
-  cp = parse_command_name ();
-  if (cp == NULL)
+  command = parse_command_name ();
+  if (command == NULL)
     return CMD_FAILURE;
     return CMD_FAILURE;
-  if (cp->func == NULL)
+  else if (command->function == NULL)
+    return CMD_NOT_IMPLEMENTED;
+  else if ((command->flags & F_TESTING) && !get_testing_mode ()) 
     {
     {
-      msg (SE, _("%s is not yet implemented."), cp->name);
-      while (token && token != '.')
-       lex_get ();
-      return CMD_SUCCESS;
+      msg (SE, _("%s may be used only in testing mode."), command->name);
+      return CMD_FAILURE;
     }
     }
-
-  /* If we're in a FILE TYPE structure, only certain commands can be
-     allowed. */
-  if (pgm_state == STATE_INPUT
-      && case_source_is_class (vfm_source, &file_type_source_class)
-      && !FILE_TYPE_okay (cp))
-    return CMD_FAILURE;
-
-  /* Certain state transitions are not allowed.  Check for these. */
-  assert (pgm_state >= 0 && pgm_state < STATE_ERROR);
-  if (cp->transition[pgm_state] == STATE_ERROR)
+  else if ((command->flags & F_ENHANCED) && get_syntax () != ENHANCED) 
     {
     {
-      static const char *state_name[4] =
-      {
-       N_("%s is not allowed (1) before a command to specify the "
-          "input program, such as DATA LIST, (2) between FILE TYPE "
-          "and END FILE TYPE, (3) between INPUT PROGRAM and END "
-          "INPUT PROGRAM."),
-       N_("%s is not allowed within an input program."),
-       N_("%s is only allowed within an input program."),
-       N_("%s is only allowed within an input program."),
-      };
-
-      msg (SE, gettext (state_name[pgm_state]), cp->name);
-      return CMD_FAILURE;
+      msg (SE, _("%s may be used only in enhanced syntax mode."),
+           command->name);
+       return CMD_FAILURE;
     }
     }
+  else if (!verify_valid_command (command, state))
+    return CMD_FAILURE;
 
 
-  /* The structured output manager numbers all its tables.  Increment
-     the major table number for each separate procedure. */
-  som_new_series ();
-  
-  {
-    int result;
-    
-    /* Call the command dispatcher. */
-    msg_set_command_name (cp->name);
-    tab_set_command_name (cp->name);
-    result = cp->func ();
-    msg_set_command_name (NULL);
-    tab_set_command_name (NULL);
+  /* Execute command. */
+  msg_set_command_name (command->name);
+  tab_set_command_name (command->name);
+  result = command->function ();
+  tab_set_command_name (NULL);
+  msg_set_command_name (NULL);
     
     
-    /* Perform the state transition if the command completed
-       successfully (at least in part). */
-    if (result != CMD_FAILURE && result != CMD_CASCADING_FAILURE)
-      {
-       pgm_state = cp->transition[pgm_state];
-
-       if (pgm_state == STATE_ERROR)
-         {
-           discard_variables ();
-           pgm_state = STATE_INIT;
-         }
-      }
-
-    /* Pass the command's success value up to the caller. */
-    return result;
-  }
+  return result;
 }
 
 static size_t
 }
 
 static size_t
@@ -349,11 +262,11 @@ conflicting_3char_prefixes (const char *a, const char *b)
 static int
 conflicting_3char_prefix_command (const struct command *cmd) 
 {
 static int
 conflicting_3char_prefix_command (const struct command *cmd) 
 {
-  assert (cmd >= commands && cmd < commands + COMMAND_CNT);
+  assert (cmd >= commands && cmd < commands + command_cnt);
 
   return ((cmd > commands
            && conflicting_3char_prefixes (cmd[-1].name, cmd[0].name))
 
   return ((cmd > commands
            && conflicting_3char_prefixes (cmd[-1].name, cmd[0].name))
-          || (cmd < commands + COMMAND_CNT
+          || (cmd < commands + command_cnt
               && conflicting_3char_prefixes (cmd[0].name, cmd[1].name)));
 }
 
               && conflicting_3char_prefixes (cmd[0].name, cmd[1].name)));
 }
 
@@ -447,7 +360,7 @@ count_matching_commands (char *const words[], size_t word_cnt,
 
   cmd_match_count = 0;
   *dash_possible = 0;
 
   cmd_match_count = 0;
   *dash_possible = 0;
-  for (cmd = commands; cmd < commands + COMMAND_CNT; cmd++) 
+  for (cmd = commands; cmd < commands + command_cnt; cmd++) 
     if (cmd_match_words (cmd, words, word_cnt, dash_possible) != MISMATCH) 
       cmd_match_count++; 
 
     if (cmd_match_words (cmd, words, word_cnt, dash_possible) != MISMATCH) 
       cmd_match_count++; 
 
@@ -462,13 +375,26 @@ get_complete_match (char *const words[], size_t word_cnt)
 {
   const struct command *cmd;
   
 {
   const struct command *cmd;
   
-  for (cmd = commands; cmd < commands + COMMAND_CNT; cmd++) 
+  for (cmd = commands; cmd < commands + command_cnt; cmd++) 
     if (cmd_match_words (cmd, words, word_cnt, NULL) == COMPLETE_MATCH) 
       return cmd; 
   
   return NULL;
 }
 
     if (cmd_match_words (cmd, words, word_cnt, NULL) == COMPLETE_MATCH) 
       return cmd; 
   
   return NULL;
 }
 
+/* Returns the command with the given exact NAME.
+   Aborts if no such command exists. */
+static const struct command *
+find_command (const char *name) 
+{
+  const struct command *cmd;
+  
+  for (cmd = commands; cmd < commands + command_cnt; cmd++) 
+    if (!strcmp (cmd->name, name))
+      return cmd;
+  abort ();
+}
+
 /* Frees the WORD_CNT words in WORDS. */
 static void
 free_words (char *words[], size_t word_cnt) 
 /* Frees the WORD_CNT words in WORDS. */
 static void
 free_words (char *words[], size_t word_cnt) 
@@ -484,29 +410,27 @@ free_words (char *words[], size_t word_cnt)
 static void
 unknown_command_error (char *const words[], size_t word_cnt) 
 {
 static void
 unknown_command_error (char *const words[], size_t word_cnt) 
 {
-  size_t idx;
-  size_t words_len;
-  char *name, *cp;
-
-  words_len = 0;
-  for (idx = 0; idx < word_cnt; idx++)
-    words_len += strlen (words[idx]);
-
-  cp = name = xmalloc (words_len + word_cnt + 16);
-  for (idx = 0; idx < word_cnt; idx++) 
+  if (word_cnt == 0) 
+    lex_error (_("expecting command name"));
+  else 
     {
     {
-      if (idx != 0)
-        *cp++ = ' ';
-      cp = stpcpy (cp, words[idx]);
-    }
-  *cp = '\0';
+      struct string s;
+      size_t i;
+
+      ds_init (&s, 0);
+      for (i = 0; i < word_cnt; i++) 
+        {
+          if (i != 0)
+            ds_putc (&s, ' ');
+          ds_puts (&s, words[i]);
+        }
 
 
-  msg (SE, _("Unknown command %s."), name);
+      msg (SE, _("Unknown command %s."), ds_c_str (&s));
 
 
-  free (name);
+      ds_destroy (&s);
+    }
 }
 
 }
 
-
 /* Parse the command name and return a pointer to the corresponding
    struct command if successful.
    If not successful, return a null pointer. */
 /* Parse the command name and return a pointer to the corresponding
    struct command if successful.
    If not successful, return a null pointer. */
@@ -518,6 +442,9 @@ parse_command_name (void)
   int complete_word_cnt;
   int dash_possible;
 
   int complete_word_cnt;
   int dash_possible;
 
+  if (token == T_EXP || token == '*' || token == '[') 
+    return find_command ("COMMENT");
+
   dash_possible = 0;
   word_cnt = complete_word_cnt = 0;
   while (token == T_ID || (dash_possible && token == '-')) 
   dash_possible = 0;
   word_cnt = complete_word_cnt = 0;
   while (token == T_ID || (dash_possible && token == '-')) 
@@ -525,11 +452,13 @@ parse_command_name (void)
       int cmd_match_cnt;
       
       assert (word_cnt < sizeof words / sizeof *words);
       int cmd_match_cnt;
       
       assert (word_cnt < sizeof words / sizeof *words);
-      if (token == T_ID)
-        words[word_cnt] = xstrdup (ds_c_str (&tokstr));
-      else
+      if (token == T_ID) 
+        {
+          words[word_cnt] = xstrdup (ds_c_str (&tokstr));
+          str_uppercase (words[word_cnt]); 
+        }
+      else if (token == '-')
         words[word_cnt] = xstrdup ("-");
         words[word_cnt] = xstrdup ("-");
-      str_uppercase (words[word_cnt]);
       word_cnt++;
 
       cmd_match_cnt = count_matching_commands (words, word_cnt,
       word_cnt++;
 
       cmd_match_cnt = count_matching_commands (words, word_cnt,
@@ -541,10 +470,8 @@ parse_command_name (void)
           const struct command *command = get_complete_match (words, word_cnt);
           if (command != NULL) 
             {
           const struct command *command = get_complete_match (words, word_cnt);
           if (command != NULL) 
             {
-              if (command->skip_entire_name)
+              if (!(command->flags & F_KEEP_FINAL_TOKEN))
                 lex_get ();
                 lex_get ();
-             if ( command->debug & !get_testing_mode () ) 
-               goto error;
               free_words (words, word_cnt);
               return command;
             }
               free_words (words, word_cnt);
               return command;
             }
@@ -572,7 +499,7 @@ parse_command_name (void)
       /* Figure out how many words we want to keep.
          We normally want to swallow the entire command. */
       pushback_word_cnt = complete_word_cnt + 1;
       /* Figure out how many words we want to keep.
          We normally want to swallow the entire command. */
       pushback_word_cnt = complete_word_cnt + 1;
-      if (!command->skip_entire_name)
+      if (command->flags & F_KEEP_FINAL_TOKEN)
         pushback_word_cnt--;
       
       /* FIXME: We only support one-token pushback. */
         pushback_word_cnt--;
       
       /* FIXME: We only support one-token pushback. */
@@ -588,18 +515,112 @@ parse_command_name (void)
           free (words[word_cnt]);
         }
 
           free (words[word_cnt]);
         }
 
-      if ( command->debug && !get_testing_mode () ) 
-       goto error;
-
       free_words (words, word_cnt);
       return command;
     }
 
       free_words (words, word_cnt);
       return command;
     }
 
-error:
+  /* We didn't get a valid command name. */
   unknown_command_error (words, word_cnt);
   free_words (words, word_cnt);
   return NULL;
 }
   unknown_command_error (words, word_cnt);
   free_words (words, word_cnt);
   return NULL;
 }
+
+/* Returns true if COMMAND is allowed in STATE,
+   false otherwise.
+   If COMMAND is not allowed, emits an appropriate error
+   message. */
+static bool
+verify_valid_command (const struct command *command, enum cmd_state state)
+{
+  if ((state == CMD_STATE_INITIAL && command->states & S_INITIAL)
+      || (state == CMD_STATE_DATA && command->states & S_DATA)
+      || (state == CMD_STATE_INPUT_PROGRAM
+          && command->states & S_INPUT_PROGRAM)
+      || (state == CMD_STATE_FILE_TYPE && command->states & S_FILE_TYPE))
+    return true;
+
+  if (state == CMD_STATE_INITIAL || state == CMD_STATE_DATA)
+    {
+      const char *allowed[3];
+      int allowed_cnt;
+      char *s;
+
+      allowed_cnt = 0;
+      if (command->states & S_INITIAL)
+        allowed[allowed_cnt++] = _("before the active file has been defined");
+      else if (command->states & S_DATA)
+        allowed[allowed_cnt++] = _("after the active file has been defined");
+      if (command->states & S_INPUT_PROGRAM)
+        allowed[allowed_cnt++] = _("inside INPUT PROGRAM");
+      if (command->states & S_FILE_TYPE)
+        allowed[allowed_cnt++] = _("inside FILE TYPE");
+
+      if (allowed_cnt == 1)
+        s = xstrdup (allowed[0]);
+      else if (allowed_cnt == 2)
+        s = xasprintf (_("%s or %s"), allowed[0], allowed[1]);
+      else if (allowed_cnt == 3)
+        s = xasprintf (_("%s, %s, or %s"), allowed[0], allowed[1], allowed[2]);
+      else
+        abort ();
+
+      msg (SE, _("%s is allowed only %s."), command->name, s);
+
+      free (s);
+    }
+  else if (state == CMD_STATE_INPUT_PROGRAM)
+    msg (SE, _("%s is not allowed inside INPUT PROGRAM."), command->name);
+  else if (state == CMD_STATE_FILE_TYPE)
+    msg (SE, _("%s is not allowed inside FILE TYPE."), command->name);
+
+  return false;
+}
+\f
+/* Readline command name completion. */
+
+#if HAVE_READLINE
+static char *command_generator (const char *text, int state);
+
+/* Returns a set of completions for TEXT.
+   This is of the proper form for assigning to
+   rl_attempted_completion_function. */
+char **
+pspp_attempted_completion_function (const char *text,
+                                    int start, int end UNUSED)
+{
+  if (start == 0) 
+    {
+      /* Complete command name at start of line. */
+      return rl_completion_matches (text, command_generator); 
+    }
+  else 
+    {
+      /* Otherwise don't do any completion. */
+      rl_attempted_completion_over = 1;
+      return NULL; 
+    }
+}
+
+/* If STATE is 0, returns the first command name matching TEXT.
+   Otherwise, returns the next command name matching TEXT.
+   Returns a null pointer when no matches are left. */
+static char *
+command_generator (const char *text, int state) 
+{
+  static const struct command *cmd;
+  
+  if (!state)
+    cmd = commands;
+
+  for (; cmd < commands + command_cnt; cmd++) 
+    if (!memcasecmp (cmd->name, text, strlen (text))
+        && (!(cmd->flags & F_TESTING) || get_testing_mode ())
+        && (!(cmd->flags & F_ENHANCED) || get_syntax () == ENHANCED))
+      return xstrdup (cmd++->name);
+
+  return NULL;
+}
+#endif /* HAVE_READLINE */
 \f
 /* Simple commands. */
 
 \f
 /* Simple commands. */
 
@@ -607,7 +628,7 @@ error:
 int
 cmd_finish (void)
 {
 int
 cmd_finish (void)
 {
-  return CMD_EOF;
+  return CMD_QUIT;
 }
 
 /* Parses the N command. */
 }
 
 /* Parses the N command. */
@@ -756,7 +777,7 @@ run_command (void)
       if (token != '.')
        {
          lex_error (_("expecting end of command"));
       if (token != '.')
        {
          lex_error (_("expecting end of command"));
-         return CMD_TRAILING_GARBAGE;
+         return CMD_FAILURE;
        }
     }
   else
        }
     }
   else
@@ -783,7 +804,7 @@ cmd_host (void)
   if (lex_look_ahead () == '.')
     {
       lex_get ();
   if (lex_look_ahead () == '.')
     {
       lex_get ();
-      code = shell () ? CMD_PART_SUCCESS_MAYBE : CMD_SUCCESS;
+      code = shell () ? CMD_FAILURE : CMD_SUCCESS;
     }
   else
     code = run_command ();
     }
   else
     code = run_command ();
@@ -821,3 +842,11 @@ cmd_clear_transformations (void)
 
   return CMD_SUCCESS;
 }
 
   return CMD_SUCCESS;
 }
+
+/* Parses a comment. */
+int
+cmd_comment (void)
+{
+  lex_skip_comment ();
+  return CMD_SUCCESS;
+}
index 35440c07117f0a5cec02c535ec42ce39a2538bdc..2954271efbf5b05ab3761a231bbfb8392ff2267e 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - computes sample statistics.
 /* PSPP - computes sample statistics.
-   Copyright (C) 1997-9, 2000 Free Software Foundation, Inc.
+   Copyright (C) 2006 Free Software Foundation, Inc.
    Written by Ben Pfaff <blp@gnu.org>.
 
    This program is free software; you can redistribute it and/or
    Written by Ben Pfaff <blp@gnu.org>.
 
    This program is free software; you can redistribute it and/or
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA. */
 
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA. */
 
-/* State abbreviations. */
-#define INIT STATE_INIT
-#define INPU STATE_INPUT
-#define TRAN STATE_TRANS
-#define PROC STATE_PROC
-#define ERRO STATE_ERROR
+/* Utility commands acceptable anywhere. */
+DEF_CMD (S_ANY, F_ENHANCED, "CLOSE FILE HANDLE", cmd_close_file_handle)
+DEF_CMD (S_ANY, F_KEEP_FINAL_TOKEN, "COMMENT", cmd_comment)
+DEF_CMD (S_ANY, 0, "ECHO", cmd_echo)
+DEF_CMD (S_ANY, 0, "ERASE", cmd_erase)
+DEF_CMD (S_ANY, 0, "EXIT", cmd_finish)
+DEF_CMD (S_ANY, 0, "FILE HANDLE", cmd_file_handle)
+DEF_CMD (S_ANY, F_KEEP_FINAL_TOKEN, "FILE LABEL", cmd_file_label)
+DEF_CMD (S_ANY, 0, "FINISH", cmd_finish)
+DEF_CMD (S_ANY, 0, "HOST", cmd_host)
+DEF_CMD (S_ANY, 0, "INCLUDE", cmd_include)
+DEF_CMD (S_ANY, 0, "N OF CASES", cmd_n_of_cases)
+DEF_CMD (S_ANY, 0, "N", cmd_n_of_cases)
+DEF_CMD (S_ANY, 0, "NEW FILE", cmd_new_file)
+DEF_CMD (S_ANY, 0, "PERMISSIONS", cmd_permissions)
+DEF_CMD (S_ANY, 0, "Q", cmd_finish)
+DEF_CMD (S_ANY, 0, "QUIT", cmd_finish)
+DEF_CMD (S_ANY, 0, "SET", cmd_set)
+DEF_CMD (S_ANY, 0, "SHOW", cmd_show)
+DEF_CMD (S_ANY, F_KEEP_FINAL_TOKEN, "SUBTITLE", cmd_subtitle)
+DEF_CMD (S_ANY, 0, "SYSFILE INFO", cmd_sysfile_info)
+DEF_CMD (S_ANY, F_KEEP_FINAL_TOKEN, "TITLE", cmd_title)
 
 
-UNIMPL ("ACF",                   ERRO, ERRO, ERRO, ERRO, "Autocorrelation function")
-UNIMPL ("ADD FILES",             ERRO, ERRO, ERRO, ERRO, "Add files to dictionary")
-DEFCMD ("ADD VALUE LABELS",       ERRO, INPU, TRAN, TRAN, cmd_add_value_labels)
-DEFCMD ("AGGREGATE",              ERRO, ERRO, PROC, TRAN, cmd_aggregate)
-UNIMPL ("ALSCAL",                ERRO, ERRO, ERRO, ERRO, "Multidimensional scaling")
-UNIMPL ("ANOVA",                 ERRO, ERRO, ERRO, ERRO, "Factorial analysis of variance")
-DEFCMD ("APPLY DICTIONARY",       ERRO, ERRO, TRAN, TRAN, cmd_apply_dictionary)
-DEFCMD ("AUTORECODE",             ERRO, ERRO, PROC, PROC, cmd_autorecode)
-SPCCMD ("BEGIN DATA",             ERRO, ERRO, PROC, PROC, cmd_begin_data)
-DEFCMD ("BREAK",                  ERRO, INPU, TRAN, TRAN, cmd_break)
-UNIMPL ("CASEPLOT",              ERRO, ERRO, ERRO, ERRO, "Plot time series")
-UNIMPL ("CASESTOVARS",           ERRO, ERRO, ERRO, ERRO, "Restructure complex data")
-UNIMPL ("CCF",                   ERRO, ERRO, ERRO, ERRO, "Time series cross correlation")
-DEFCMD ("CLEAR TRANSFORMATIONS",  ERRO, INPU, TRAN, TRAN, cmd_clear_transformations)
-DEFCMD ("CLOSE FILE HANDLE",      INIT, INPU, TRAN, PROC, cmd_close_file_handle)
-UNIMPL ("CLUSTER",               ERRO, ERRO, ERRO, ERRO, "Hierachial clustering")
-DEFCMD ("COMPUTE",                ERRO, INPU, TRAN, TRAN, cmd_compute)
-UNIMPL ("CONJOINT",              ERRO, ERRO, ERRO, ERRO, "Analyse full concept data")
-DEFCMD ("CORRELATIONS",                  ERRO, ERRO, PROC, PROC, cmd_correlations)
-DEFCMD ("COUNT",                  ERRO, INPU, TRAN, TRAN, cmd_count)
-UNIMPL ("COXREG",                 ERRO, ERRO, ERRO, ERRO, "Cox proportional hazards regression")
-UNIMPL ("CREATE",                 ERRO, ERRO, ERRO, ERRO, "Create time series data")
-DEFCMD ("CROSSTABS",              ERRO, ERRO, PROC, PROC, cmd_crosstabs)
-UNIMPL ("CURVEFIT",               ERRO, ERRO, ERRO, ERRO, "Fit curve to line plot")
-DEFCMD ("DATA LIST",              TRAN, INPU, TRAN, TRAN, cmd_data_list)
-UNIMPL ("DATE",                   ERRO, ERRO, ERRO, ERRO, "Create time series data")
-DBGCMD ("DEBUG CASEFILE",        INIT, INPU, TRAN, PROC, cmd_debug_casefile)
-DBGCMD ("DEBUG EVALUATE",        INIT, INPU, TRAN, PROC, cmd_debug_evaluate)
-DBGCMD ("DEBUG MOMENTS",         INIT, INPU, TRAN, PROC, cmd_debug_moments)
-DBGCMD ("DEBUG POOL",            INIT, INPU, TRAN, PROC, cmd_debug_pool)
-DEFCMD ("DESCRIPTIVES",           ERRO, ERRO, PROC, PROC, cmd_descriptives)
-UNIMPL ("DISCRIMINANT",           ERRO, ERRO, ERRO, ERRO, "Linear discriminant analysis")
-DEFCMD ("DISPLAY",                ERRO, INPU, TRAN, PROC, cmd_display)
-SPCCMD ("DOCUMENT",               ERRO, INPU, TRAN, TRAN, cmd_document)
-DEFCMD ("DO IF",                  ERRO, INPU, TRAN, TRAN, cmd_do_if)
-DEFCMD ("DO REPEAT",              ERRO, INPU, TRAN, TRAN, cmd_do_repeat)
-DEFCMD ("DROP DOCUMENTS",         INIT, INPU, TRAN, PROC, cmd_drop_documents)
-DEFCMD ("ECHO",                   INIT, INPU, TRAN, PROC, cmd_echo)
-UNIMPL ("EDIT",                   ERRO, ERRO, ERRO, ERRO, "obsolete")
-DEFCMD ("ELSE",                   ERRO, INPU, TRAN, TRAN, cmd_else)
-DEFCMD ("ELSE IF",                ERRO, INPU, TRAN, TRAN, cmd_else_if)
-DEFCMD ("END CASE",               ERRO, INPU, ERRO, ERRO, cmd_end_case)
-DEFCMD ("END FILE",               ERRO, INPU, ERRO, ERRO, cmd_end_file)
-UNIMPL ("END FILE TYPE",          ERRO, TRAN, ERRO, ERRO, "Ends complex data input")
-DEFCMD ("END IF",                 ERRO, INPU, TRAN, TRAN, cmd_end_if)
-DEFCMD ("END INPUT PROGRAM",      ERRO, TRAN, ERRO, ERRO, cmd_end_input_program)
-DEFCMD ("END LOOP",               ERRO, INPU, TRAN, TRAN, cmd_end_loop)
-DEFCMD ("END REPEAT",             ERRO, INPU, TRAN, TRAN, cmd_end_repeat)
-DEFCMD ("ERASE",                  INIT, INPU, TRAN, PROC, cmd_erase)
-DEFCMD ("EXAMINE",                ERRO, ERRO, PROC, PROC, cmd_examine)
-DEFCMD ("EXECUTE",                ERRO, ERRO, PROC, PROC, cmd_execute)
-DEFCMD ("EXIT",                   INIT, INPU, TRAN, PROC, cmd_finish)
-DEFCMD ("EXPORT",                 ERRO, ERRO, PROC, PROC, cmd_export)
-UNIMPL ("FACTOR",                 ERRO, ERRO, ERRO, ERRO, "Factor analysis")
-DEFCMD ("FILE HANDLE",            INIT, INPU, TRAN, PROC, cmd_file_handle)
-SPCCMD ("FILE LABEL",             INIT, INPU, TRAN, PROC, cmd_file_label)
-UNIMPL ("FILE TYPE",              INPU, ERRO, INPU, INPU, "Complex data input")
-DEFCMD ("FILTER",                 ERRO, ERRO, TRAN, TRAN, cmd_filter)
-DEFCMD ("FINISH",                 INIT, INPU, TRAN, PROC, cmd_finish)
-UNIMPL ("FIT",                    ERRO, ERRO, ERRO, ERRO, "Goodness of Fit")
-DEFCMD ("FLIP",                          ERRO, ERRO, PROC, PROC, cmd_flip)
-DEFCMD ("FORMATS",                INIT, INPU, TRAN, PROC, cmd_formats)
-DEFCMD ("FREQUENCIES",            ERRO, ERRO, PROC, PROC, cmd_frequencies)
-DEFCMD ("GET",                    TRAN, ERRO, TRAN, TRAN, cmd_get)
-UNIMPL ("GET TRANSLATE",          ERRO, ERRO, ERRO, ERRO, "Read other file formats")
-UNIMPL ("GLM",                    ERRO, ERRO, ERRO, ERRO, "General Linear Model")
-UNIMPL ("GRAPH",                  ERRO, ERRO, ERRO, ERRO, "Draw graphs")
-DEFCMD ("HOST",                   INIT, INPU, TRAN, PROC, cmd_host)
-DEFCMD ("IF",                     ERRO, INPU, TRAN, TRAN, cmd_if)
-UNIMPL ("IGRAPH",                 ERRO, ERRO, ERRO, ERRO, "Interactive graphs")
-DEFCMD ("IMPORT",                 TRAN, ERRO, TRAN, TRAN, cmd_import)
-DEFCMD ("INCLUDE",                INIT, INPU, TRAN, PROC, cmd_include)
-UNIMPL ("INFO",                   ERRO, ERRO, ERRO, ERRO, "Local Documentation")
-DEFCMD ("INPUT PROGRAM",          INPU, ERRO, INPU, INPU, cmd_input_program)
-UNIMPL ("KEYED DATA LIST",        ERRO, ERRO, ERRO, ERRO, "Read nonsequential data")
-UNIMPL ("KM",                     ERRO, ERRO, ERRO, ERRO, "Kaplan-Meier")
-DEFCMD ("LEAVE",                  ERRO, INPU, TRAN, TRAN, cmd_leave)
-DEFCMD ("LIST",                   ERRO, ERRO, PROC, PROC, cmd_list)
-UNIMPL ("LOGISTIC REGRESSION",    ERRO, ERRO, ERRO, ERRO, "Regression Analysis")
-DEFCMD ("LOOP",                   ERRO, INPU, TRAN, TRAN, cmd_loop)
-DEFCMD ("MATCH FILES",            TRAN, ERRO, TRAN, PROC, cmd_match_files)
-DEFCMD ("MATRIX DATA",            TRAN, ERRO, TRAN, TRAN, cmd_matrix_data)
-UNIMPL ("MCONVERT",               ERRO, ERRO, ERRO, ERRO, "Convert covariance/correlation matrices")
-DEFCMD ("MEANS",                  ERRO, ERRO, PROC, PROC, cmd_means)
-DEFCMD ("MISSING VALUES",         ERRO, INPU, TRAN, TRAN, cmd_missing_values)
-DEFCMD ("MODIFY VARS",            ERRO, ERRO, TRAN, PROC, cmd_modify_vars)
-UNIMPL ("MULT RESPONSE",          ERRO, ERRO, ERRO, ERRO, "Multiple reponse analysis")
-UNIMPL ("MVA",                    ERRO, ERRO, ERRO, ERRO, "Missing value analysis")
-DEFCMD ("NEW FILE",               INIT, ERRO, INIT, INIT, cmd_new_file)
-DEFCMD ("N",                      INIT, INPU, TRAN, TRAN, cmd_n_of_cases)
-DEFCMD ("N OF CASES",             INIT, INPU, TRAN, TRAN, cmd_n_of_cases)
-UNIMPL ("NLR",                    ERRO, ERRO, ERRO, ERRO, "Non Linear Regression")
-UNIMPL ("NONPAR CORR",            ERRO, ERRO, ERRO, ERRO, "Nonparametric correlation")
-UNIMPL ("NPAR TESTS",             ERRO, ERRO, ERRO, ERRO, "Nonparametric tests")
-UNIMPL ("NUMBERED",               ERRO, ERRO, ERRO, ERRO, "")
-DEFCMD ("NUMERIC",                ERRO, INPU, TRAN, TRAN, cmd_numeric)
-DEFCMD ("ONEWAY",                 ERRO, ERRO, PROC, PROC, cmd_oneway)
-UNIMPL ("PACF",                   ERRO, ERRO, ERRO, ERRO, "Partial autocorrelation")
-UNIMPL ("PARTIAL CORR",           ERRO, ERRO, ERRO, ERRO, "Partial correlation")
-DEFCMD ("PEARSON CORRELATIONS",          ERRO, ERRO, PROC, PROC, cmd_correlations)
-DEFCMD ("PERMISSIONS",            INIT, INPU, TRAN, PROC, cmd_permissions)
-UNIMPL ("POINT",                  ERRO, ERRO, ERRO, ERRO, "Marker in keyed file")
-UNIMPL ("PPLOT",                  ERRO, ERRO, ERRO, ERRO, "Plot time series variables")
-UNIMPL ("PREDICT",                ERRO, ERRO, ERRO, ERRO, "Specify forecast period")
-UNIMPL ("PRESERVE",              ERRO, ERRO, ERRO, ERRO, "Push settings")
-DEFCMD ("PRINT EJECT",            ERRO, INPU, TRAN, TRAN, cmd_print_eject)
-DEFCMD ("PRINT",                  ERRO, INPU, TRAN, TRAN, cmd_print)
-DEFCMD ("PRINT FORMATS",          ERRO, INPU, TRAN, TRAN, cmd_print_formats)
-DEFCMD ("PRINT SPACE",            ERRO, INPU, TRAN, TRAN, cmd_print_space)
-UNIMPL ("PROCEDURE OUTPUT",       ERRO, ERRO, ERRO, ERRO, "Specify output file")
-UNIMPL ("PROBIT",                 ERRO, ERRO, ERRO, ERRO, "Probit analysis")
-DEFCMD ("PROCESS IF",             ERRO, ERRO, TRAN, TRAN, cmd_process_if)
-UNIMPL ("PROXIMITIES",            ERRO, ERRO, ERRO, ERRO, "Pairwise similarity")
-DEFCMD ("Q",                      INIT, INPU, TRAN, PROC, cmd_finish)
-UNIMPL ("QUICK CLUSTER",          ERRO, ERRO, ERRO, ERRO, "Fast clustering")
-DEFCMD ("QUIT",                   INIT, INPU, TRAN, PROC, cmd_finish)
-UNIMPL ("RANK",                   ERRO, ERRO, ERRO, ERRO, "Create rank scores")
-DEFCMD ("RECODE",                 ERRO, INPU, TRAN, TRAN, cmd_recode)
-DEFCMD ("RECORD TYPE",            ERRO, INPU, ERRO, ERRO, cmd_record_type)
-UNIMPL ("REFORMAT",               ERRO, ERRO, ERRO, ERRO, "Read obsolete files")
-DEFCMD ("REGRESSION",             ERRO, ERRO, PROC, PROC, cmd_regression)
-DEFCMD ("RENAME VARIABLES",       ERRO, INPU, TRAN, PROC, cmd_rename_variables)
-UNIMPL ("REPEATING DATA",         ERRO, INPU, ERRO, ERRO, "Specify multiple cases per input record")
-UNIMPL ("REPORT",                 ERRO, ERRO, ERRO, ERRO, "Pretty print working file")
-DEFCMD ("REREAD",                 ERRO, INPU, ERRO, ERRO, cmd_reread)
-UNIMPL ("RESTORE",               ERRO, ERRO, ERRO, ERRO, "Restore settings")
-UNIMPL ("ROC",                   ERRO, ERRO, ERRO, ERRO, "Receiver operating characteristic")
-UNIMPL ("RMV",                    ERRO, ERRO, ERRO, ERRO, "Replace missing values")
-DEFCMD ("SAMPLE",                 ERRO, ERRO, TRAN, TRAN, cmd_sample)
-DEFCMD ("SAVE",                   ERRO, ERRO, PROC, PROC, cmd_save)
-UNIMPL ("SAVE TRANSLATE",         ERRO, ERRO, ERRO, ERRO, "Save to foriegn format")
-UNIMPL ("SCRIPT",                 ERRO, ERRO, ERRO, ERRO, "Run script file")
-DEFCMD ("SELECT IF",              ERRO, ERRO, TRAN, TRAN, cmd_select_if)
-DEFCMD ("SET",                    INIT, INPU, TRAN, PROC, cmd_set)
-DEFCMD ("SHOW",                   INIT, INPU, TRAN, PROC, cmd_show)
-DEFCMD ("SORT CASES",             ERRO, ERRO, PROC, PROC, cmd_sort_cases)
-DEFCMD ("SORT",                   ERRO, ERRO, PROC, PROC, cmd_sort_cases)
-UNIMPL ("SPCHART",                ERRO, ERRO, ERRO, ERRO, "Plot control charts")
-DEFCMD ("SPLIT FILE",             ERRO, INPU, TRAN, TRAN, cmd_split_file)
-DEFCMD ("STRING",                 ERRO, INPU, TRAN, TRAN, cmd_string)
-SPCCMD ("SUBTITLE",               INIT, INPU, TRAN, PROC, cmd_subtitle)
-UNIMPL ("SUMMARIZE",              ERRO, ERRO, ERRO, ERRO, "Univariate statistics")
-UNIMPL ("SURVIVAL",               ERRO, ERRO, ERRO, ERRO, "Survival analysis")
-DEFCMD ("SYSFILE INFO",           INIT, INPU, TRAN, PROC, cmd_sysfile_info)
-DEFCMD ("TEMPORARY",              ERRO, ERRO, TRAN, TRAN, cmd_temporary)
-SPCCMD ("TITLE",                  INIT, INPU, TRAN, PROC, cmd_title)
-UNIMPL ("TSET",                   ERRO, ERRO, ERRO, ERRO, "Set time sequence variables")
-UNIMPL ("TSHOW",                  ERRO, ERRO, ERRO, ERRO, "Show time sequence variables")
-UNIMPL ("TSPLOT",                 ERRO, ERRO, ERRO, ERRO, "Plot time sequence variables")
-DEFCMD ("T-TEST",                 ERRO, ERRO, PROC, PROC, cmd_t_test)
-UNIMPL ("UNIANOVA",               ERRO, ERRO, ERRO, ERRO, "Univariate analysis")
-UNIMPL ("UNNUMBERED",             ERRO, ERRO, ERRO, ERRO, "obsolete")
-UNIMPL ("UPDATE",                 ERRO, ERRO, ERRO, ERRO, "Update working file")
-DEFCMD ("USE",                   ERRO, ERRO, TRAN, TRAN, cmd_use)
-DEFCMD ("VALUE LABELS",           ERRO, INPU, TRAN, TRAN, cmd_value_labels)
-DEFCMD ("VARIABLE LABELS",        ERRO, INPU, TRAN, TRAN, cmd_variable_labels)
-DEFCMD ("VARIABLE ALIGNMENT",     ERRO, INPU, TRAN, TRAN, cmd_variable_alignment)
-DEFCMD ("VARIABLE LEVEL",         ERRO, INPU, TRAN, TRAN, cmd_variable_level)
-DEFCMD ("VARIABLE WIDTH",         ERRO, INPU, TRAN, TRAN, cmd_variable_width)
-UNIMPL ("VARSTOCASES",           ERRO, ERRO, ERRO, ERRO, "Restructure complex data")
-DEFCMD ("VECTOR",                 ERRO, INPU, TRAN, TRAN, cmd_vector)
-UNIMPL ("VERIFY",                 ERRO, ERRO, ERRO, ERRO, "Report time series")
-DEFCMD ("WEIGHT",                 ERRO, INPU, TRAN, TRAN, cmd_weight)
-DEFCMD ("WRITE",                  ERRO, INPU, TRAN, TRAN, cmd_write)
-DEFCMD ("WRITE FORMATS",          ERRO, INPU, TRAN, TRAN, cmd_write_formats)
-DEFCMD ("XEXPORT",                ERRO, INPU, TRAN, TRAN, cmd_xexport)
-DEFCMD ("XSAVE",                  ERRO, INPU, TRAN, TRAN, cmd_xsave)
+/* Commands that define (or replace) the active file. */
+DEF_CMD (S_INITIAL | S_DATA | S_INPUT_PROGRAM | S_FILE_TYPE, 0, "DATA LIST", cmd_data_list)
+DEF_CMD (S_INITIAL | S_DATA, 0, "GET", cmd_get)
+DEF_CMD (S_INITIAL | S_DATA, 0, "IMPORT", cmd_import)
+DEF_CMD (S_INITIAL | S_DATA, 0, "INPUT PROGRAM", cmd_input_program)
+DEF_CMD (S_INITIAL | S_DATA, 0, "MATRIX DATA", cmd_matrix_data)
+
+/* Transformations and utilities that may appear after active
+   file definition or within INPUT PROGRAM. */
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "ADD VALUE LABELS", cmd_add_value_labels)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "APPLY DICTIONARY", cmd_apply_dictionary)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "BREAK", cmd_break)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "COMPUTE", cmd_compute)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "DISPLAY", cmd_display)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, F_KEEP_FINAL_TOKEN, "DOCUMENT", cmd_document)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "DO IF", cmd_do_if)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "DO REPEAT", cmd_do_repeat)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "END REPEAT", cmd_end_repeat)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "DROP DOCUMENTS", cmd_drop_documents)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "ELSE IF", cmd_else_if)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "ELSE", cmd_else)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "END IF", cmd_end_if)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "END LOOP", cmd_end_loop)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "FORMATS", cmd_formats)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "IF", cmd_if)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "LEAVE", cmd_leave)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "LOOP", cmd_loop)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "MISSING VALUES", cmd_missing_values)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "NUMERIC", cmd_numeric)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "PRINT EJECT", cmd_print_eject)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "PRINT FORMATS", cmd_print_formats)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "PRINT SPACE", cmd_print_space)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "PRINT", cmd_print)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "RECODE", cmd_recode)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "SELECT IF", cmd_select_if)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "SPLIT FILE", cmd_split_file)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "STRING", cmd_string)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "VALUE LABELS", cmd_value_labels)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "VARIABLE ALIGNMENT", cmd_variable_alignment)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "VARIABLE LABELS", cmd_variable_labels)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "VARIABLE LEVEL", cmd_variable_level)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "VARIABLE WIDTH", cmd_variable_width)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "VECTOR", cmd_vector)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "WEIGHT", cmd_weight)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "WRITE FORMATS", cmd_write_formats)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "WRITE", cmd_write)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, F_ENHANCED, "XEXPORT", cmd_xexport)
+DEF_CMD (S_DATA | S_INPUT_PROGRAM, 0, "XSAVE", cmd_xsave)
+
+/* Commands that may appear after active file definition. */
+DEF_CMD (S_DATA, 0, "AGGREGATE", cmd_aggregate)
+DEF_CMD (S_DATA, 0, "AUTORECODE", cmd_autorecode)
+DEF_CMD (S_DATA, F_KEEP_FINAL_TOKEN, "BEGIN DATA", cmd_begin_data)
+DEF_CMD (S_DATA, 0, "CLEAR TRANSFORMATIONS", cmd_clear_transformations)
+DEF_CMD (S_DATA, 0, "CORRELATIONS", cmd_correlations)
+DEF_CMD (S_DATA, 0, "COUNT", cmd_count)
+DEF_CMD (S_DATA, 0, "CROSSTABS", cmd_crosstabs)
+DEF_CMD (S_DATA, 0, "DESCRIPTIVES", cmd_descriptives)
+DEF_CMD (S_DATA, 0, "EXAMINE", cmd_examine)
+DEF_CMD (S_DATA, 0, "EXECUTE", cmd_execute)
+DEF_CMD (S_DATA, 0, "EXPORT", cmd_export)
+DEF_CMD (S_DATA, 0, "FILTER", cmd_filter)
+DEF_CMD (S_DATA, 0, "FLIP", cmd_flip)
+DEF_CMD (S_DATA, 0, "FREQUENCIES", cmd_frequencies)
+DEF_CMD (S_DATA, 0, "LIST", cmd_list)
+DEF_CMD (S_DATA, 0, "MATCH FILES", cmd_match_files)
+DEF_CMD (S_DATA, 0, "MEANS", cmd_means)
+DEF_CMD (S_DATA, 0, "MODIFY VARS", cmd_modify_vars)
+DEF_CMD (S_DATA, 0, "ONEWAY", cmd_oneway)
+DEF_CMD (S_DATA, 0, "PEARSON CORRELATIONS", cmd_correlations)
+DEF_CMD (S_DATA, 0, "PROCESS IF", cmd_process_if)
+DEF_CMD (S_DATA, 0, "REGRESSION", cmd_regression)
+DEF_CMD (S_DATA, 0, "RENAME VARIABLES", cmd_rename_variables)
+DEF_CMD (S_DATA, 0, "SAMPLE", cmd_sample)
+DEF_CMD (S_DATA, 0, "SAVE", cmd_save)
+DEF_CMD (S_DATA, 0, "SORT CASES", cmd_sort_cases)
+DEF_CMD (S_DATA, 0, "SORT", cmd_sort_cases)
+DEF_CMD (S_DATA, 0, "T-TEST", cmd_t_test)
+DEF_CMD (S_DATA, 0, "TEMPORARY", cmd_temporary)
+DEF_CMD (S_DATA, 0, "USE", cmd_use)
+
+/* FILE TYPE. */
+DEF_CMD (S_FILE_TYPE, 0, "RECORD TYPE", cmd_record_type)
+
+/* Commands valid only with INPUT PROGRAM. */
+DEF_CMD (S_INPUT_PROGRAM, 0, "END CASE", cmd_end_case)
+DEF_CMD (S_INPUT_PROGRAM, 0, "END FILE", cmd_end_file)
+DEF_CMD (S_INPUT_PROGRAM, 0, "END INPUT PROGRAM", cmd_end_input_program)
+DEF_CMD (S_INPUT_PROGRAM, 0, "REREAD", cmd_reread)
+
+/* Commands for testing PSPP. */
+DEF_CMD (S_ANY, F_TESTING, "DEBUG CASEFILE", cmd_debug_casefile)
+DEF_CMD (S_ANY, F_TESTING, "DEBUG EVALUATE", cmd_debug_evaluate)
+DEF_CMD (S_ANY, F_TESTING, "DEBUG MOMENTS", cmd_debug_moments)
+DEF_CMD (S_ANY, F_TESTING, "DEBUG POOL", cmd_debug_pool)
+
+/* Unimplemented commands. */
+UNIMPL_CMD ("ACF", "Autocorrelation function")
+UNIMPL_CMD ("ADD FILES", "Add files to dictionary")
+UNIMPL_CMD ("ALSCAL", "Multidimensional scaling")
+UNIMPL_CMD ("ANOVA", "Factorial analysis of variance")
+UNIMPL_CMD ("CASEPLOT", "Plot time series")
+UNIMPL_CMD ("CASESTOVARS", "Restructure complex data")
+UNIMPL_CMD ("CCF", "Time series cross correlation")
+UNIMPL_CMD ("CLUSTER", "Hierachial clustering")
+UNIMPL_CMD ("CONJOINT", "Analyse full concept data")
+UNIMPL_CMD ("COXREG", "Cox proportional hazards regression")
+UNIMPL_CMD ("CREATE", "Create time series data")
+UNIMPL_CMD ("CURVEFIT", "Fit curve to line plot")
+UNIMPL_CMD ("DATE", "Create time series data")
+UNIMPL_CMD ("DISCRIMINANT", "Linear discriminant analysis")
+UNIMPL_CMD ("EDIT", "obsolete")
+UNIMPL_CMD ("END FILE TYPE", "Ends complex data input")
+UNIMPL_CMD ("FACTOR", "Factor analysis")
+UNIMPL_CMD ("FILE TYPE", "Complex data input")
+UNIMPL_CMD ("FIT", "Goodness of Fit")
+UNIMPL_CMD ("GET TRANSLATE", "Read other file formats")
+UNIMPL_CMD ("GLM", "General Linear Model")
+UNIMPL_CMD ("GRAPH", "Draw graphs")
+UNIMPL_CMD ("IGRAPH", "Interactive graphs")
+UNIMPL_CMD ("INFO", "Local Documentation")
+UNIMPL_CMD ("KEYED DATA LIST", "Read nonsequential data")
+UNIMPL_CMD ("KM", "Kaplan-Meier")
+UNIMPL_CMD ("LOGISTIC REGRESSION", "Regression Analysis")
+UNIMPL_CMD ("MCONVERT", "Convert covariance/correlation matrices")
+UNIMPL_CMD ("MULT RESPONSE", "Multiple reponse analysis")
+UNIMPL_CMD ("MVA", "Missing value analysis")
+UNIMPL_CMD ("NLR", "Non Linear Regression")
+UNIMPL_CMD ("NONPAR CORR", "Nonparametric correlation")
+UNIMPL_CMD ("NPAR TESTS", "Nonparametric tests")
+UNIMPL_CMD ("NUMBERED", "")
+UNIMPL_CMD ("PACF", "Partial autocorrelation")
+UNIMPL_CMD ("PARTIAL CORR", "Partial correlation")
+UNIMPL_CMD ("POINT", "Marker in keyed file")
+UNIMPL_CMD ("PPLOT", "Plot time series variables")
+UNIMPL_CMD ("PREDICT", "Specify forecast period")
+UNIMPL_CMD ("PRESERVE", "Push settings")
+UNIMPL_CMD ("PROBIT", "Probit analysis")
+UNIMPL_CMD ("PROCEDURE OUTPUT", "Specify output file")
+UNIMPL_CMD ("PROXIMITIES", "Pairwise similarity")
+UNIMPL_CMD ("QUICK CLUSTER", "Fast clustering")
+UNIMPL_CMD ("RANK", "Create rank scores")
+UNIMPL_CMD ("REFORMAT", "Read obsolete files")
+UNIMPL_CMD ("REPEATING DATA", "Specify multiple cases per input record")
+UNIMPL_CMD ("REPORT", "Pretty print working file")
+UNIMPL_CMD ("RESTORE", "Restore settings")
+UNIMPL_CMD ("RMV", "Replace missing values")
+UNIMPL_CMD ("ROC", "Receiver operating characteristic")
+UNIMPL_CMD ("SAVE TRANSLATE", "Save to foriegn format")
+UNIMPL_CMD ("SCRIPT", "Run script file")
+UNIMPL_CMD ("SPCHART", "Plot control charts")
+UNIMPL_CMD ("SUMMARIZE", "Univariate statistics")
+UNIMPL_CMD ("SURVIVAL", "Survival analysis")
+UNIMPL_CMD ("TSET", "Set time sequence variables")
+UNIMPL_CMD ("TSHOW", "Show time sequence variables")
+UNIMPL_CMD ("TSPLOT", "Plot time sequence variables")
+UNIMPL_CMD ("UNIANOVA", "Univariate analysis")
+UNIMPL_CMD ("UNNUMBERED", "obsolete")
+UNIMPL_CMD ("UPDATE", "Update working file")
+UNIMPL_CMD ("VARSTOCASES", "Restructure complex data")
+UNIMPL_CMD ("VERIFY", "Report time series")
index ba14c0bb4418880c603ab38cd9ca028197e25d22..2e34583c09377f3d65e24ea01f3c4f7b2e7e3d26 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - computes sample statistics.
 /* PSPP - computes sample statistics.
-   Copyright (C) 1997-9, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2006 Free Software Foundation, Inc.
    Written by Ben Pfaff <blp@gnu.org>.
 
    This program is free software; you can redistribute it and/or
    Written by Ben Pfaff <blp@gnu.org>.
 
    This program is free software; you can redistribute it and/or
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA. */
 
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA. */
 
-#if !command_h
-#define command_h 1
+#ifndef COMMAND_H
+#define COMMAND_H 1
 
 
-/* Current program state. */
-enum
-  {
-    STATE_INIT,                        /* Initialization state. */
-    STATE_INPUT,               /* Input state. */
-    STATE_TRANS,               /* Transformation state. */
-    STATE_PROC,                        /* Procedure state. */
-    STATE_ERROR                        /* Invalid state transition. */
-  };
+#include <stdbool.h>
 
 /* Command return values. */
 
 /* Command return values. */
-enum
+enum cmd_result
   {
     /* Successful return values. */
   {
     /* Successful return values. */
-    CMD_SUCCESS = 0x1000,       /* Successfully parsed and executed. */
-    CMD_EOF,                    /* Requested exit. */
+    CMD_SUCCESS = 1,            /* Successfully parsed and executed. */
+    CMD_EOF,                    /* No commands left. */
+    CMD_QUIT,                   /* Requested exit. */
+    CMD_END_SUBLOOP,            /* End of INPUT PROGRAM or FILE TYPE. */
 
 
-    /* Various kinds of failures, in increasing order of severity. */
-    CMD_TRAILING_GARBAGE,      /* Followed by garbage. */
-    CMD_PART_SUCCESS,          /* Fully executed up to error. */
-    CMD_PART_SUCCESS_MAYBE,    /* May have been partially executed. */
+    /* Various kinds of failures. */
     CMD_FAILURE,                /* Not executed at all. */
     CMD_FAILURE,                /* Not executed at all. */
+    CMD_NOT_IMPLEMENTED,        /* Command not implemented. */
     CMD_CASCADING_FAILURE       /* Serious error: don't continue. */
   };
 
     CMD_CASCADING_FAILURE       /* Serious error: don't continue. */
   };
 
-extern int pgm_state;
+bool cmd_result_is_success (enum cmd_result);
+bool cmd_result_is_failure (enum cmd_result);
+
+/* Command processing state. */
+enum cmd_state
+  {
+    CMD_STATE_INITIAL,          /* No active file yet defined. */
+    CMD_STATE_DATA,             /* Active file has been defined. */
+    CMD_STATE_INPUT_PROGRAM,    /* Inside INPUT PROGRAM. */
+    CMD_STATE_FILE_TYPE         /* Inside FILE TYPE. */
+  };
 
 
-char *pspp_completion_function (const char *text,   int state);
+#if HAVE_READLINE
+char **pspp_attempted_completion_function (const char *, int start, int end);
+#endif
 
 
-int cmd_parse (void);
+enum cmd_result cmd_parse (enum cmd_state);
 
 /* Prototype all the command functions. */
 
 /* Prototype all the command functions. */
-#define DEFCMD(NAME, T1, T2, T3, T4, FUNC)     \
-       int FUNC (void);
-#define SPCCMD(NAME, T1, T2, T3, T4, FUNC)     \
-       int FUNC (void);
-#define DBGCMD(NAME, T1, T2, T3, T4, FUNC)     \
-       int FUNC (void);
-#define UNIMPL(NAME, T1, T2, T3, T4, DESC)
+#define DEF_CMD(STATES, FLAGS, NAME, FUNCTION) int FUNCTION (void);
+#define UNIMPL_CMD(NAME, DESCRIPTION)
 #include "command.def"
 #include "command.def"
-#undef DEFCMD
-#undef SPCCMD
-#undef UNIMPL
-#undef DBGCMD
+#undef DEF_CMD
+#undef UNIMPL_CMD
 
 
-#endif /* !command_h */
+#endif /* command.h */
index da1dc2fc49dfeda732b6f8e599ffe3d14fd92496..80a4d2147e363acc86ea8375296da5ca1b49c9d1 100644 (file)
@@ -116,7 +116,7 @@ cmd_loop (void)
   
   if (!ok)
     loop->max_pass_count = 0;
   
   if (!ok)
     loop->max_pass_count = 0;
-  return ok ? CMD_SUCCESS : CMD_PART_SUCCESS;
+  return ok ? CMD_SUCCESS : CMD_FAILURE;
 }
 
 /* Parses END LOOP. */
 }
 
 /* Parses END LOOP. */
@@ -141,7 +141,7 @@ cmd_end_loop (void)
 
   ctl_stack_pop (loop);
   
 
   ctl_stack_pop (loop);
   
-  return ok ? CMD_SUCCESS : CMD_PART_SUCCESS;
+  return ok ? CMD_SUCCESS : CMD_FAILURE;
 }
 
 /* Parses BREAK. */
 }
 
 /* Parses BREAK. */
index 9cdd1e547c510bb38b615515bbdc047cc965a944..71aafa44ec8a65d8e9ebc002b9739d34dd560b1a 100644 (file)
@@ -1,3 +1,41 @@
+Wed Apr 26 13:41:05 2006  Ben Pfaff  <blp@gnu.org>
+
+Wed Apr 26 13:16:28 2006  Ben Pfaff  <blp@gnu.org>
+
+       Improve the way we handle the various parsing "states".  Until now
+       we've hard-coded the state transitions in the command definition
+       file, but that's error-prone and, worse, it's redundant--we can
+       figure out what state we're in anyhow.  We can cleanly handle
+       INPUT PROGRAM and FILE TYPE with a nested command-processing loop.
+       
+       * data-list.c: (cmd_data_list) Use in_file_type() or
+       in_input_program() in place of case_source_is_class() or
+       case_source_is_complex().
+
+       * file-type.c: NB: Not really fixed except minimally to compile,
+       because it doesn't work anyway.
+       (in_file_type) New function.
+       (cmd_record_type) No need to check that we're in FILE TYPE.
+       (cmd_end_file_type) Ditto.
+       (var file_type_source_class) Make static.
+
+       * get.c: (cmd_match_files) Check vfm_source instead of pgm_state.
+
+       * inpt-pgm.c: (in_input_program) New function.
+       (cmd_input_program) Rewrite to include nested command processing
+       loop.
+       (cmd_end_input_program) Just return CMD_END_SUBLOOP.
+       (var input_program_source_class) Make static.
+       (cmd_end_case) No need to check that we're in INPUT PROGRAM.
+       (cmd_end_file) Ditto.
+       
+       * automake.mk (src_language_data_io_libdata_io_a_SOURCES): Add
+       file-type.h, inpt-pgm.h.
+
+       * file-type.h: New file.
+
+       * inpt-pgm.h: New file.
+
 Tue Apr 25 13:11:55 2006  Ben Pfaff  <blp@gnu.org>
 
        * print.c: Don't special-case MS-DOS line terminators.
 Tue Apr 25 13:11:55 2006  Ben Pfaff  <blp@gnu.org>
 
        * print.c: Don't special-case MS-DOS line terminators.
index def4c384c9e5f7d71d17cf07049743ce474d15f8..a0510caeea4b5fac03a6f5828c3b418223a281c5 100644 (file)
@@ -14,8 +14,10 @@ CLEANFILES += $(src_language_data_io_q_sources_c)
 src_language_data_io_libdata_io_a_SOURCES = \
        src/language/data-io/data-list.c \
        src/language/data-io/file-type.c \
 src_language_data_io_libdata_io_a_SOURCES = \
        src/language/data-io/data-list.c \
        src/language/data-io/file-type.c \
+       src/language/data-io/file-type.h \
        src/language/data-io/get.c \
        src/language/data-io/inpt-pgm.c \
        src/language/data-io/get.c \
        src/language/data-io/inpt-pgm.c \
+       src/language/data-io/inpt-pgm.h \
        src/language/data-io/print.c \
        src/language/data-io/matrix-data.c   \
        src/language/data-io/data-list.h \
        src/language/data-io/print.c \
        src/language/data-io/matrix-data.c   \
        src/language/data-io/data-list.h \
index 6002b1e91857e5e8787a176daadb812977a4d0c3..3a6f807c00f63a4b11af204da886b27fcd59b9f8 100644 (file)
    02110-1301, USA. */
 
 #include <config.h>
    02110-1301, USA. */
 
 #include <config.h>
-#include <language/data-io/data-list.h>
-#include <libpspp/message.h>
+
+#include "data-list.h"
+
 #include <ctype.h>
 #include <float.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <ctype.h>
 #include <float.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <libpspp/alloc.h>
+
 #include <data/case.h>
 #include <data/case.h>
-#include <language/command.h>
-#include <libpspp/compiler.h>
 #include <data/data-in.h>
 #include <data/data-in.h>
-#include <language/data-io/data-reader.h>
 #include <data/dictionary.h>
 #include <data/dictionary.h>
-#include <libpspp/message.h>
-#include <language/data-io/file-handle.h>
 #include <data/format.h>
 #include <data/format.h>
+#include <data/settings.h>
+#include <data/variable.h>
+#include <language/command.h>
+#include <language/data-io/data-list.h>
+#include <language/data-io/data-reader.h>
+#include <language/data-io/file-handle.h>
+#include <language/data-io/file-type.h>
+#include <language/data-io/inpt-pgm.h>
 #include <language/lexer/lexer.h>
 #include <language/lexer/lexer.h>
+#include <libpspp/alloc.h>
+#include <libpspp/compiler.h>
+#include <libpspp/message.h>
+#include <libpspp/message.h>
 #include <libpspp/misc.h>
 #include <libpspp/misc.h>
-#include <data/settings.h>
 #include <libpspp/str.h>
 #include <output/table.h>
 #include <libpspp/str.h>
 #include <output/table.h>
-#include <data/variable.h>
 #include <procedure.h>
 
 #include <procedure.h>
 
-#include "data-list.h"
-
 #include "gettext.h"
 #define _(msgid) gettext (msgid)
 \f
 #include "gettext.h"
 #define _(msgid) gettext (msgid)
 \f
@@ -116,7 +120,7 @@ cmd_data_list (void)
   int table = -1;                /* Print table if nonzero, -1=undecided. */
   struct file_handle *fh = fh_inline_file ();
 
   int table = -1;                /* Print table if nonzero, -1=undecided. */
   struct file_handle *fh = fh_inline_file ();
 
-  if (!case_source_is_complex (vfm_source))
+  if (!in_input_program () && !in_file_type ())
     discard_variables ();
 
   dls = xmalloc (sizeof *dls);
     discard_variables ();
 
   dls = xmalloc (sizeof *dls);
@@ -136,8 +140,7 @@ cmd_data_list (void)
          fh = fh_parse (FH_REF_FILE | FH_REF_INLINE);
          if (fh == NULL)
            goto error;
          fh = fh_parse (FH_REF_FILE | FH_REF_INLINE);
          if (fh == NULL)
            goto error;
-         if (case_source_is_class (vfm_source, &file_type_source_class)
-              && fh != fh_get_default_handle ())
+         if (in_file_type () && fh != fh_get_default_handle ())
            {
              msg (SE, _("DATA LIST must use the same file "
                         "as the enclosing FILE TYPE."));
            {
              msg (SE, _("DATA LIST must use the same file "
                         "as the enclosing FILE TYPE."));
@@ -542,7 +545,7 @@ fixed_parse_compatible (struct fixed_parsing_state *fx,
        {
          convert_fmt_ItoO (&input, &v->print);
          v->write = v->print;
        {
          convert_fmt_ItoO (&input, &v->print);
          v->write = v->print;
-          if (!case_source_is_complex (vfm_source))
+          if (!in_input_program () && !in_file_type ())
             v->init = 0;
        }
       else
             v->init = 0;
        }
       else
@@ -650,7 +653,7 @@ dump_fmt_list (struct fixed_parsing_state *fx, struct fmt_list *f,
                return 0;
              }
            
                return 0;
              }
            
-            if (!case_source_is_complex (vfm_source))
+            if (!in_input_program () && !in_file_type ())
               v->init = 0;
 
             spec = xmalloc (sizeof *spec);
               v->init = 0;
 
             spec = xmalloc (sizeof *spec);
@@ -859,7 +862,7 @@ parse_free (struct dls_var_spec **first, struct dls_var_spec **last)
            }
          v->print = v->write = output;
 
            }
          v->print = v->write = output;
 
-          if (!case_source_is_complex (vfm_source))
+          if (!in_input_program () && !in_file_type ())
             v->init = 0;
 
           spec = xmalloc (sizeof *spec);
             v->init = 0;
 
           spec = xmalloc (sizeof *spec);
@@ -1360,7 +1363,7 @@ cmd_repeating_data (void)
   bool saw_id = false;          /* Saw ID subcommand? */
   struct file_handle *const fh = fh_get_default_handle ();
   
   bool saw_id = false;          /* Saw ID subcommand? */
   struct file_handle *const fh = fh_get_default_handle ();
   
-  assert (case_source_is_complex (vfm_source));
+  assert (in_input_program () || in_file_type ());
 
   rpd = xmalloc (sizeof *rpd);
   rpd->reader = dfm_open_reader (fh);
 
   rpd = xmalloc (sizeof *rpd);
   rpd->reader = dfm_open_reader (fh);
index 99a5d050d21c5757fe521b4d47311b23eea762e6..4633c7c00ba23518b437bbd5ddf233f2d92b5a64 100644 (file)
    02110-1301, USA. */
 
 #include <config.h>
    02110-1301, USA. */
 
 #include <config.h>
+
+#include <language/data-io/file-type.h>
+
 #include <stdlib.h>
 #include <stdlib.h>
-#include <libpspp/alloc.h>
+
 #include <data/case.h>
 #include <data/case.h>
-#include <language/command.h>
-#include <libpspp/compiler.h>
 #include <data/data-in.h>
 #include <data/data-in.h>
-#include <language/data-io/data-reader.h>
 #include <data/dictionary.h>
 #include <data/dictionary.h>
-#include <libpspp/message.h>
-#include <language/data-io/file-handle.h>
 #include <data/format.h>
 #include <data/format.h>
+#include <data/variable.h>
+#include <language/command.h>
+#include <language/data-io/data-reader.h>
+#include <language/data-io/file-handle.h>
 #include <language/lexer/lexer.h>
 #include <language/lexer/lexer.h>
+#include <libpspp/alloc.h>
+#include <libpspp/compiler.h>
+#include <libpspp/message.h>
 #include <libpspp/str.h>
 #include <libpspp/str.h>
-#include <data/variable.h>
 #include <procedure.h>
 
 #include "gettext.h"
 #include <procedure.h>
 
 #include "gettext.h"
@@ -96,6 +100,17 @@ struct file_type_pgm
 
 static int parse_col_spec (struct col_spec *, const char *);
 static void create_col_var (struct col_spec *c);
 
 static int parse_col_spec (struct col_spec *, const char *);
 static void create_col_var (struct col_spec *c);
+static const struct case_source_class file_type_source_class;
+
+static bool inside_file_type;
+
+/* Returns true if we're parsing the inside of a FILE TYPE...END
+   FILE TYPE construct, false otherwise. */
+bool
+in_file_type (void) 
+{
+  return inside_file_type;
+}
 
 int cmd_file_type (void);
 
 
 int cmd_file_type (void);
 
@@ -390,15 +405,6 @@ cmd_record_type (void)
   struct file_type_pgm *fty;
   struct record_type *rct;
 
   struct file_type_pgm *fty;
   struct record_type *rct;
 
-  /* Make sure we're inside a FILE TYPE structure. */
-  if (pgm_state != STATE_INPUT
-      || !case_source_is_class (vfm_source, &file_type_source_class))
-    {
-      msg (SE, _("This command may only appear within a "
-                "FILE TYPE/END FILE TYPE structure."));
-      return CMD_CASCADING_FAILURE;
-    }
-
   fty = vfm_source->aux;
 
   /* Initialize the record_type structure. */
   fty = vfm_source->aux;
 
   /* Initialize the record_type structure. */
@@ -580,13 +586,6 @@ cmd_end_file_type (void)
 {
   struct file_type_pgm *fty;
 
 {
   struct file_type_pgm *fty;
 
-  if (pgm_state != STATE_INPUT
-      || case_source_is_class (vfm_source, &file_type_source_class))
-    {
-      msg (SE, _("This command may only appear within a "
-                "FILE TYPE/END FILE TYPE structure."));
-      return CMD_CASCADING_FAILURE;
-    }
   fty = vfm_source->aux;
   fty->case_size = dict_get_case_size (default_dict);
 
   fty = vfm_source->aux;
   fty->case_size = dict_get_case_size (default_dict);
 
@@ -735,7 +734,7 @@ file_type_source_destroy (struct case_source *source)
     }
 }
 
     }
 }
 
-const struct case_source_class file_type_source_class =
+static const struct case_source_class file_type_source_class =
   {
     "FILE TYPE",
     NULL,
   {
     "FILE TYPE",
     NULL,
diff --git a/src/language/data-io/file-type.h b/src/language/data-io/file-type.h
new file mode 100644 (file)
index 0000000..5c4d63d
--- /dev/null
@@ -0,0 +1,28 @@
+/* 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., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA. */
+
+#ifndef FILE_TYPE_H
+#define FILE_TYPE_H 1
+
+#include <stdbool.h>
+
+bool in_file_type (void);
+void cancel_file_type (void);
+
+#endif /* file-type.h */
index 78e91c3dde7269f2450265f7c4b1c47fa528d663..25387d8be44b8f0ae14a99a9abf4647018fb4e3d 100644 (file)
@@ -882,8 +882,7 @@ cmd_match_files (void)
             }
           used_active_file = true;
 
             }
           used_active_file = true;
 
-          assert (pgm_state != STATE_INPUT);
-          if (pgm_state == STATE_INIT)
+          if (vfm_source == NULL)
             {
               msg (SE, _("Cannot specify the active file since no active "
                          "file has been defined."));
             {
               msg (SE, _("Cannot specify the active file since no active "
                          "file has been defined."));
index 1fcf0f0963a66780df88498ff89d84a6f66fe41a..abda6c930691ce1ddfec33447149d154200e8b56 100644 (file)
    02110-1301, USA. */
 
 #include <config.h>
    02110-1301, USA. */
 
 #include <config.h>
-#include <libpspp/message.h>
+
+#include <language/data-io/inpt-pgm.h>
+
 #include <float.h>
 #include <stdlib.h>
 #include <float.h>
 #include <stdlib.h>
-#include <libpspp/alloc.h>
+
 #include <data/case.h>
 #include <data/case.h>
+#include <data/dictionary.h>
+#include <data/variable.h>
 #include <language/command.h>
 #include <language/command.h>
-#include <libpspp/compiler.h>
 #include <language/data-io/data-list.h>
 #include <language/data-io/data-reader.h>
 #include <language/data-io/data-list.h>
 #include <language/data-io/data-reader.h>
-#include <data/dictionary.h>
-#include <libpspp/message.h>
-#include <language/expressions/public.h>
 #include <language/data-io/file-handle.h>
 #include <language/data-io/file-handle.h>
+#include <language/expressions/public.h>
 #include <language/lexer/lexer.h>
 #include <language/lexer/lexer.h>
+#include <libpspp/alloc.h>
+#include <libpspp/compiler.h>
+#include <libpspp/message.h>
+#include <libpspp/message.h>
 #include <libpspp/misc.h>
 #include <libpspp/str.h>
 #include <libpspp/misc.h>
 #include <libpspp/str.h>
-#include <data/variable.h>
 #include <procedure.h>
 
 #include "gettext.h"
 #include <procedure.h>
 
 #include "gettext.h"
@@ -59,34 +63,49 @@ struct input_program_pgm
 
 static trns_proc_func end_case_trns_proc, reread_trns_proc, end_file_trns_proc;
 static trns_free_func reread_trns_free;
 
 static trns_proc_func end_case_trns_proc, reread_trns_proc, end_file_trns_proc;
 static trns_free_func reread_trns_free;
+static const struct case_source_class input_program_source_class;
+static bool inside_input_program;
 
 
-int
-cmd_input_program (void)
+/* Returns true if we're parsing the inside of a INPUT
+   PROGRAM...END INPUT PROGRAM construct, false otherwise. */
+bool
+in_input_program (void) 
 {
 {
-  discard_variables ();
-
-  /* FIXME: we shouldn't do this here, but I'm afraid that other
-     code will check the class of vfm_source. */
-  vfm_source = create_case_source (&input_program_source_class, NULL);
-
-  return lex_end_of_command ();
+  return inside_input_program;
 }
 
 int
 }
 
 int
-cmd_end_input_program (void)
+cmd_input_program (void)
 {
   struct input_program_pgm *inp;
   size_t i;
 
 {
   struct input_program_pgm *inp;
   size_t i;
 
-  if (!case_source_is_class (vfm_source, &input_program_source_class))
+  discard_variables ();
+  if (token != '.')
+    return lex_end_of_command ();
+
+  inside_input_program = true;
+  for (;;) 
     {
     {
-      msg (SE, _("No matching INPUT PROGRAM command."));
-      return CMD_CASCADING_FAILURE;
+      enum cmd_result result;
+      lex_get ();
+      result = cmd_parse (CMD_STATE_INPUT_PROGRAM);
+      if (result == CMD_END_SUBLOOP)
+        break;
+      if (result == CMD_EOF || result == CMD_QUIT || result == CMD_CASCADING_FAILURE)
+        {
+          if (result == CMD_EOF)
+            msg (SE, _("Unexpected end-of-file within INPUT PROGRAM."));
+          discard_variables ();
+          inside_input_program = false;
+          return result;
+        }
     }
     }
-  
+  inside_input_program = false;
+
   if (dict_get_next_value_idx (default_dict) == 0)
     msg (SW, _("No data-input or transformation commands specified "
   if (dict_get_next_value_idx (default_dict) == 0)
     msg (SW, _("No data-input or transformation commands specified "
-        "between INPUT PROGRAM and END INPUT PROGRAM."));
+               "between INPUT PROGRAM and END INPUT PROGRAM."));
 
   /* Mark the boundary between INPUT PROGRAM transformations and
      ordinary transformations. */
 
   /* Mark the boundary between INPUT PROGRAM transformations and
      ordinary transformations. */
@@ -114,10 +133,17 @@ cmd_end_input_program (void)
     assert (inp->init[i] != -1);
   inp->case_size = dict_get_case_size (default_dict);
 
     assert (inp->init[i] != -1);
   inp->case_size = dict_get_case_size (default_dict);
 
-  /* Put inp into vfm_source for later use. */
-  vfm_source->aux = inp;
+  /* Create vfm_source. */
+  vfm_source = create_case_source (&input_program_source_class, inp);
 
 
-  return lex_end_of_command ();
+  return CMD_SUCCESS;
+}
+
+int
+cmd_end_input_program (void)
+{
+  assert (in_input_program ());
+  return CMD_END_SUBLOOP; 
 }
 
 /* Initializes case C.  Called before the first case is read. */
 }
 
 /* Initializes case C.  Called before the first case is read. */
@@ -274,7 +300,7 @@ input_program_source_destroy (struct case_source *source)
     }
 }
 
     }
 }
 
-const struct case_source_class input_program_source_class =
+static const struct case_source_class input_program_source_class =
   {
     "INPUT PROGRAM",
     NULL,
   {
     "INPUT PROGRAM",
     NULL,
@@ -285,13 +311,7 @@ const struct case_source_class input_program_source_class =
 int
 cmd_end_case (void)
 {
 int
 cmd_end_case (void)
 {
-  if (!case_source_is_class (vfm_source, &input_program_source_class))
-    {
-      msg (SE, _("This command may only be executed between INPUT PROGRAM "
-                "and END INPUT PROGRAM."));
-      return CMD_CASCADING_FAILURE;
-    }
-
+  assert (in_input_program ());
   add_transformation (end_case_trns_proc, NULL, NULL);
 
   return lex_end_of_command ();
   add_transformation (end_case_trns_proc, NULL, NULL);
 
   return lex_end_of_command ();
@@ -404,12 +424,7 @@ reread_trns_free (void *t_)
 int
 cmd_end_file (void)
 {
 int
 cmd_end_file (void)
 {
-  if (!case_source_is_class (vfm_source, &input_program_source_class))
-    {
-      msg (SE, _("This command may only be executed between INPUT PROGRAM "
-                "and END INPUT PROGRAM."));
-      return CMD_CASCADING_FAILURE;
-    }
+  assert (in_input_program ());
 
   add_transformation (end_file_trns_proc, NULL, NULL);
 
 
   add_transformation (end_file_trns_proc, NULL, NULL);
 
diff --git a/src/language/data-io/inpt-pgm.h b/src/language/data-io/inpt-pgm.h
new file mode 100644 (file)
index 0000000..626a7f4
--- /dev/null
@@ -0,0 +1,28 @@
+/* PSPP - computes sample statistics.
+   Copyright (C) 2006 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., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA. */
+
+#ifndef INPT_PGM_H
+#define INPT_PGM_H 1
+
+#include <stdbool.h>
+
+bool in_input_program (void);
+void cancel_input_program (void);
+
+#endif /* inpt-pgm.h */
index 79a6711ea3a3534eb2157a453678825eca9875a7..c325b4082e40a897980d123217e0fcf4323aa3a9 100644 (file)
@@ -79,7 +79,7 @@ internal_cmd_formats (int which)
        break;
 
       if (!parse_variables (default_dict, &v, &cv, PV_NUMERIC))
        break;
 
       if (!parse_variables (default_dict, &v, &cv, PV_NUMERIC))
-       return CMD_PART_SUCCESS_MAYBE;
+       return CMD_FAILURE;
       type = v[0]->type;
 
       if (!lex_match ('('))
       type = v[0]->type;
 
       if (!lex_match ('('))
@@ -112,5 +112,5 @@ internal_cmd_formats (int which)
 
 fail:
   free (v);
 
 fail:
   free (v);
-  return CMD_PART_SUCCESS_MAYBE;
+  return CMD_FAILURE;
 }
 }
index fde8ba473cf075bc0d01eac6739df2a4bbdd4915..6b25cb072d8ac175427847fcfa07dc40c9562c0c 100644 (file)
@@ -38,7 +38,7 @@ cmd_missing_values (void)
   struct variable **v;
   size_t nv;
 
   struct variable **v;
   size_t nv;
 
-  int retval = CMD_PART_SUCCESS_MAYBE;
+  int retval = CMD_FAILURE;
   bool deferred_errors = false;
 
   while (token != '.')
   bool deferred_errors = false;
 
   while (token != '.')
@@ -147,7 +147,7 @@ cmd_missing_values (void)
  done:
   free (v);
   if (deferred_errors)
  done:
   free (v);
   if (deferred_errors)
-    retval = CMD_PART_SUCCESS_MAYBE;
+    retval = CMD_FAILURE;
   return retval;
 }
 
   return retval;
 }
 
index 3e3d7651dbe83b73e244ec9f822805fb1f891900..0cc3adb984db22ba44d7ee8462dd5c23e104e25a 100644 (file)
@@ -47,7 +47,7 @@ cmd_numeric (void)
   do
     {
       if (!parse_DATA_LIST_vars (&v, &nv, PV_NONE))
   do
     {
       if (!parse_DATA_LIST_vars (&v, &nv, PV_NONE))
-       return CMD_PART_SUCCESS_MAYBE;
+       return CMD_FAILURE;
 
       /* Get the optional format specification. */
       if (lex_match ('('))
 
       /* Get the optional format specification. */
       if (lex_match ('('))
@@ -98,7 +98,7 @@ fail:
   for (i = 0; i < nv; i++)
     free (v[i]);
   free (v);
   for (i = 0; i < nv; i++)
     free (v[i]);
   free (v);
-  return CMD_PART_SUCCESS_MAYBE;
+  return CMD_FAILURE;
 }
 
 /* Parses the STRING command. */
 }
 
 /* Parses the STRING command. */
@@ -120,7 +120,7 @@ cmd_string (void)
   do
     {
       if (!parse_DATA_LIST_vars (&v, &nv, PV_NONE))
   do
     {
       if (!parse_DATA_LIST_vars (&v, &nv, PV_NONE))
-       return CMD_PART_SUCCESS_MAYBE;
+       return CMD_FAILURE;
 
       if (!lex_force_match ('(')
          || !parse_format_specifier (&f, 0))
 
       if (!lex_force_match ('(')
          || !parse_format_specifier (&f, 0))
@@ -177,7 +177,7 @@ fail:
   for (i = 0; i < nv; i++)
     free (v[i]);
   free (v);
   for (i = 0; i < nv; i++)
     free (v[i]);
   free (v);
-  return CMD_PART_SUCCESS_MAYBE;
+  return CMD_FAILURE;
 }
 
 /* Parses the LEAVE command. */
 }
 
 /* Parses the LEAVE command. */
index 976d54790965ff26ab6598216ea9de72ecb9ca00..8479fe7fa74218feeb0c462aed2e86fa1c5df692 100644 (file)
@@ -92,17 +92,14 @@ do_value_labels (int erase)
       free (vars);
     }
 
       free (vars);
     }
 
-  if (token != '.')
-    {
-      lex_error (NULL);
-      return CMD_TRAILING_GARBAGE;
-    }
+  if (parse_err)
+    return CMD_FAILURE;
 
 
-  return parse_err ? CMD_PART_SUCCESS_MAYBE : CMD_SUCCESS;
+  return lex_end_of_command ();
 
  lossage:
   free (vars);
 
  lossage:
   free (vars);
-  return CMD_PART_SUCCESS_MAYBE;
+  return CMD_FAILURE;
 }
 
 /* Verifies that none of the VAR_CNT variables in VARS are long
 }
 
 /* Verifies that none of the VAR_CNT variables in VARS are long
index e5e3e69fffea5482016c1aa8c1cf90b151d07b0c..2632ce9e8975a5d5798c53f20a33b390831271e6 100644 (file)
@@ -44,7 +44,7 @@ cmd_variable_alignment (void)
 
 
       if (!parse_variables (default_dict, &v, &nv, PV_NONE))
 
 
       if (!parse_variables (default_dict, &v, &nv, PV_NONE))
-        return CMD_PART_SUCCESS_MAYBE;
+        return CMD_FAILURE;
 
       if ( lex_force_match('(') ) 
        {
 
       if ( lex_force_match('(') ) 
        {
@@ -95,7 +95,7 @@ cmd_variable_width (void)
       size_t i;
 
       if (!parse_variables (default_dict, &v, &nv, PV_NONE))
       size_t i;
 
       if (!parse_variables (default_dict, &v, &nv, PV_NONE))
-        return CMD_PART_SUCCESS_MAYBE;
+        return CMD_FAILURE;
 
       if ( lex_force_match('(') ) 
        {
 
       if ( lex_force_match('(') ) 
        {
@@ -130,7 +130,7 @@ cmd_variable_level (void)
       size_t i;
 
       if (!parse_variables (default_dict, &v, &nv, PV_NONE))
       size_t i;
 
       if (!parse_variables (default_dict, &v, &nv, PV_NONE))
-        return CMD_PART_SUCCESS_MAYBE;
+        return CMD_FAILURE;
 
       if ( lex_force_match('(') ) 
        {
 
       if ( lex_force_match('(') ) 
        {
index acf5f054e52359f16ca4a10d67f6348867659461..a663dc9ddb458db614e204f43f01ec11f4148796 100644 (file)
@@ -41,13 +41,13 @@ cmd_variable_labels (void)
       size_t i;
 
       if (!parse_variables (default_dict, &v, &nv, PV_NONE))
       size_t i;
 
       if (!parse_variables (default_dict, &v, &nv, PV_NONE))
-        return CMD_PART_SUCCESS_MAYBE;
+        return CMD_FAILURE;
 
       if (token != T_STRING)
        {
          msg (SE, _("String expected for variable label."));
          free (v);
 
       if (token != T_STRING)
        {
          msg (SE, _("String expected for variable label."));
          free (v);
-         return CMD_PART_SUCCESS_MAYBE;
+         return CMD_FAILURE;
        }
       if (ds_length (&tokstr) > 255)
        {
        }
       if (ds_length (&tokstr) > 255)
        {
index 20cb5f849992c5f4bad7c1cc905dfd6c79431f7c..7553ba2c86f193f99d9b5961e0303c3c703b19c0 100644 (file)
@@ -201,5 +201,5 @@ cmd_vector (void)
 
 fail:
   free (vecnames);
 
 fail:
   free (vecnames);
-  return CMD_PART_SUCCESS_MAYBE;
+  return CMD_FAILURE;
 }
 }
index dec6835f488fdfffc479572fda2d68dd3e75f256..d9634c2274c0d2a94db73475f739a98f1a0fe716 100644 (file)
@@ -1,3 +1,7 @@
+Wed Apr 26 13:30:41 2006  Ben Pfaff  <blp@gnu.org>
+
+       * lexer.c: (lex_discard_rest_of_command) New function.
+
 Mon Apr 24 14:12:08 2006  Ben Pfaff  <blp@gnu.org>
 
        * q2c.c: Use exit.h from gnulib instead of checking for and
 Mon Apr 24 14:12:08 2006  Ben Pfaff  <blp@gnu.org>
 
        * q2c.c: Use exit.h from gnulib instead of checking for and
index 3d2e29ac92aac6ca2bfd51aa9edfd1caccae7753..4cb3f593095f5c9f4c18d82a0e54a53ccbfbb0b0 100644 (file)
@@ -451,7 +451,7 @@ lex_end_of_command (void)
   if (token != '.')
     {
       lex_error (_("expecting end of command"));
   if (token != '.')
     {
       lex_error (_("expecting end of command"));
-      return CMD_TRAILING_GARBAGE;
+      return CMD_FAILURE;
     }
   else
     return CMD_SUCCESS;
     }
   else
     return CMD_SUCCESS;
@@ -736,6 +736,25 @@ lex_set_prog (char *p)
 {
   prog = p;
 }
 {
   prog = p;
 }
+
+/* Discards the rest of the current command.
+   When we're reading commands from a file, we skip tokens until
+   a terminal dot or EOF.
+   When we're reading commands interactively from the user,
+   that's just discarding the current line, because presumably
+   the user doesn't want to finish typing a command that will be
+   ignored anyway. */
+void
+lex_discard_rest_of_command (void) 
+{
+  if (!getl_is_interactive ())
+    {
+      while (token != T_STOP && token != '.')
+       lex_get ();
+    }
+  else 
+    lex_discard_line (); 
+}
 \f
 /* Weird line reading functions. */
 
 \f
 /* Weird line reading functions. */
 
index 4ea80707c2bd0a1affe002e2b11744b2dae03999..36d79d3afef7a2a25bf7cf7139195ade4f7267dc 100644 (file)
@@ -74,6 +74,7 @@ const char *lex_entire_line (void);
 const char *lex_rest_of_line (int *end_dot);
 void lex_discard_line (void);
 void lex_set_prog (char *p);
 const char *lex_rest_of_line (int *end_dot);
 void lex_discard_line (void);
 void lex_set_prog (char *p);
+void lex_discard_rest_of_command (void);
 
 /* Weird line reading functions. */
 bool lex_get_line (void);
 
 /* Weird line reading functions. */
 bool lex_get_line (void);
index 66ababdd790eeb91f06c92d35fe285327e32ab68..1e093419f99a7a7a0932c4cf7a2344a60fad5c40 100644 (file)
@@ -700,14 +700,14 @@ cmd_show (void)
                 goto found;
               }
           lex_error (NULL);
                 goto found;
               }
           lex_error (NULL);
-          return CMD_PART_SUCCESS_MAYBE;
+          return CMD_FAILURE;
 
         found: ;
         }
       else 
         {
           lex_error (NULL);
 
         found: ;
         }
       else 
         {
           lex_error (NULL);
-          return CMD_PART_SUCCESS_MAYBE;
+          return CMD_FAILURE;
         }
 
       lex_match ('/');
         }
 
       lex_match ('/');
index d2548f31dc7361c66cf0de3f1486a96f45fed182..b89071a3f3ff11b88bda381f339a9c8c576fae63 100644 (file)
@@ -139,7 +139,7 @@ cmd_recode (void)
           || !parse_dst_vars (trns))
         {
           recode_trns_free (trns);
           || !parse_dst_vars (trns))
         {
           recode_trns_free (trns);
-          return CMD_PART_SUCCESS;
+          return CMD_FAILURE;
         }
 
       /* Ensure that all the output strings are at least as wide
         }
 
       /* Ensure that all the output strings are at least as wide
index 7f48709e2af4dd7727785f45f26ab56326d88c3a..422e7c05ca167a34552ac52d0f500cbc3c1a8fbd 100644 (file)
@@ -726,14 +726,6 @@ free_case_source (struct case_source *source)
     }
 }
 
     }
 }
 
-/* Returns nonzero if a case source is "complex". */
-int
-case_source_is_complex (const struct case_source *source) 
-{
-  return source != NULL && (source->class == &input_program_source_class
-                            || source->class == &file_type_source_class);
-}
-
 /* Returns nonzero if CLASS is the class of SOURCE. */
 int
 case_source_is_class (const struct case_source *source,
 /* Returns nonzero if CLASS is the class of SOURCE. */
 int
 case_source_is_class (const struct case_source *source,
@@ -1012,6 +1004,4 @@ discard_variables (void)
   process_if_expr = NULL;
 
   cancel_temporary ();
   process_if_expr = NULL;
 
   cancel_temporary ();
-
-  pgm_state = STATE_INIT;
 }
 }
index ce2168429abb28ed005960e663cd22df3c2df63e..b35878e3bf57f068e22e5e4b9669a2962778d3ec 100644 (file)
@@ -58,15 +58,12 @@ struct case_source_class
   };
 
 extern const struct case_source_class storage_source_class;
   };
 
 extern const struct case_source_class storage_source_class;
-extern const struct case_source_class file_type_source_class;
-extern const struct case_source_class input_program_source_class;
 
 struct dictionary;
 struct case_source *create_case_source (const struct case_source_class *,
                                         void *);
 void free_case_source (struct case_source *);
 
 
 struct dictionary;
 struct case_source *create_case_source (const struct case_source_class *,
                                         void *);
 void free_case_source (struct case_source *);
 
-int case_source_is_complex (const struct case_source *);
 int case_source_is_class (const struct case_source *,
                           const struct case_source_class *);
 
 int case_source_is_class (const struct case_source *,
                           const struct case_source_class *);
 
index 070f19bc1836b244d8f325779459438eacac8b53..1d08101057104aeafb0bc547dfe5266650138fe7 100644 (file)
@@ -1,3 +1,29 @@
+Wed Apr 26 13:34:54 2006  Ben Pfaff  <blp@gnu.org>
+
+       Improve command name completion in readline.
+       
+       * read-line.c (readln_initialize): Set up readline to only break
+       words for completion at new-line.  That way we can complete a
+       whole command name.  Also, set rl_attempted_completion_function
+       instead of rl_completion_entry_function so we can disable
+       completing on file names, which is usually not what we want in
+       PSPP.
+
+Wed Apr 26 13:31:00 2006  Ben Pfaff  <blp@gnu.org>
+
+       Improve the way we handle the various parsing "states".  Until now
+       we've hard-coded the state transitions in the command definition
+       file, but that's error-prone and, worse, it's redundant--we can
+       figure out what state we're in anyhow.  We can cleanly handle
+       INPUT PROGRAM and FILE TYPE with a nested command-processing loop.
+       
+       * automake.mk (src_ui_terminal_pspp_LDADD): Move libui earlier to
+       avoid link errors.
+
+       * main.c (main): Handle new CMD_* results.
+       (execute_command) Move most per-command actions into cmd_parse().
+       (handle_error) Removed.  cmd_parse() handles command failure.
+
 Tue Apr 25 11:08:17 2006  Ben Pfaff  <blp@gnu.org>
 
        Finish reforming error message support.  In this phase, move
 Tue Apr 25 11:08:17 2006  Ben Pfaff  <blp@gnu.org>
 
        Finish reforming error message support.  In this phase, move
index 328c546dff266120847904cd57f1b1f9a2f35712..c137714672f96a9effcc218ca203e32fce0d51ec 100644 (file)
@@ -19,6 +19,7 @@ src_ui_terminal_pspp_SOURCES = \
        src/procedure.h
 
 src_ui_terminal_pspp_LDADD =                                   \
        src/procedure.h
 
 src_ui_terminal_pspp_LDADD =                                   \
+       $(top_builddir)/src/ui/terminal/libui.a \
        $(top_builddir)/src/language/expressions/libexpressions.a \
        $(top_builddir)/src/language/liblanguage.a \
        $(top_builddir)/src/language/tests/libtests.a \
        $(top_builddir)/src/language/expressions/libexpressions.a \
        $(top_builddir)/src/language/liblanguage.a \
        $(top_builddir)/src/language/tests/libtests.a \
@@ -33,7 +34,6 @@ src_ui_terminal_pspp_LDADD =                                  \
        $(top_builddir)/src/output/liboutput.a \
        $(top_builddir)/src/math/libpspp_math.a  \
        $(top_builddir)/src/math/linreg/libpspp_linreg.a  \
        $(top_builddir)/src/output/liboutput.a \
        $(top_builddir)/src/math/libpspp_math.a  \
        $(top_builddir)/src/math/linreg/libpspp_linreg.a  \
-       $(top_builddir)/src/ui/terminal/libui.a \
        $(top_builddir)/lib/linreg/liblinreg.a  \
        $(top_builddir)/lib/gsl-extras/libgsl-extras.a  \
        $(top_builddir)/src/data/libdata.a \
        $(top_builddir)/lib/linreg/liblinreg.a  \
        $(top_builddir)/lib/gsl-extras/libgsl-extras.a  \
        $(top_builddir)/src/data/libdata.a \
index 16058e45d33913dda0224d721fc7e188409e93a9..018ba8aa3df2960077796246d88f8e3882b82841 100644 (file)
@@ -22,6 +22,7 @@
 #include "command-line.h"
 #include "msg-ui.h"
 #include "progname.h"
 #include "command-line.h"
 #include "msg-ui.h"
 #include "progname.h"
+#include "procedure.h"
 #include "read-line.h"
 
 #include <data/dictionary.h>
 #include "read-line.h"
 
 #include <data/dictionary.h>
@@ -61,7 +62,6 @@
 
 static void i18n_init (void);
 static void fpu_init (void);
 
 static void i18n_init (void);
 static void fpu_init (void);
-static void handle_error (int code);
 static int execute_command (void);
 static void terminate (bool success) NO_RETURN;
 
 static int execute_command (void);
 static void terminate (bool success) NO_RETURN;
 
@@ -103,27 +103,27 @@ main (int argc, char **argv)
 
       for (;;)
         {
 
       for (;;)
         {
-          int retval;
-
-          check_msg_count ();
-
-          retval = execute_command ();
-          if (retval == CMD_EOF)
+          int result = execute_command ();
+          if (result == CMD_EOF || result == CMD_QUIT)
             break;
             break;
-          if (retval != CMD_SUCCESS)
-            handle_error (retval);
+          if (result == CMD_CASCADING_FAILURE && !getl_is_interactive ())
+            {
+              msg (SE, _("Stopping syntax file processing here to avoid "
+                         "a cascade of dependent command failures."));
+              getl_abort_noninteractive (); 
+            }
+          else
+            check_msg_count ();
         }
     }
   
   terminate (!any_errors ());
 }
 
         }
     }
   
   terminate (!any_errors ());
 }
 
-/* Parse and execute a command, returning its return code. */
+/* Parses a command and returns the result. */
 static int
 execute_command (void)
 {
 static int
 execute_command (void)
 {
-  int result;
-  
   /* Read the command's first token.  
      The first token is part of the first line of the command. */
   getl_set_prompt_style (GETL_PROMPT_FIRST);
   /* Read the command's first token.  
      The first token is part of the first line of the command. */
   getl_set_prompt_style (GETL_PROMPT_FIRST);
@@ -135,67 +135,7 @@ execute_command (void)
      Any lines read after the first token must be continuation
      lines. */
   getl_set_prompt_style (GETL_PROMPT_LATER);
      Any lines read after the first token must be continuation
      lines. */
   getl_set_prompt_style (GETL_PROMPT_LATER);
-  result = cmd_parse ();
-  /* Unset the /ALGORITHM subcommand if it was used */
-  unset_cmd_algorithm ();
-
-  /* Clear any auxiliary data from the dictionary. */
-  dict_clear_aux (default_dict);
-
-  return result;
-}
-
-/* Print an error message corresponding to the command return code
-   CODE. */
-static void
-handle_error (int code)
-{
-  if (code == CMD_CASCADING_FAILURE && !getl_is_interactive ()) 
-    {
-      msg (SW, _("This command not executed.  Stopping here "
-                 "to avoid cascading failures."));
-      getl_abort_noninteractive ();
-      return;
-    }
-
-  switch (code)
-    {
-    case CMD_FAILURE:
-    case CMD_CASCADING_FAILURE:
-      msg (SW,  _("This command not executed."));
-      break;
-
-    case CMD_PART_SUCCESS_MAYBE:
-      msg (SW, _("Skipping the rest of this command.  Part of "
-                "this command may have been executed."));
-      break;
-                 
-    case CMD_PART_SUCCESS:
-      msg (SW, _("Skipping the rest of this command.  This "
-                "command was fully executed up to this point."));
-      break;
-
-    case CMD_TRAILING_GARBAGE:
-      msg (SW, _("Trailing garbage was encountered following "
-                "this command.  The command was fully executed "
-                "to this point."));
-      break;
-
-    default:
-      abort ();
-    }
-
-  if (!getl_is_interactive ())
-    {
-      while (token != T_STOP && token != '.')
-       lex_get ();
-    }
-  else 
-    {
-      msg (SW, _("The rest of this command has been discarded."));
-      lex_discard_line (); 
-    }
+  return cmd_parse (vfm_source != NULL ? CMD_STATE_DATA : CMD_STATE_INITIAL);
 }
 \f
 static void
 }
 \f
 static void
index 2a0bfd5e2be55ca584ef6c6c2f1088a5a90d22c7..a89a953b5d0b06c5d5a5b41ecd65c516d4235793 100644 (file)
@@ -56,8 +56,9 @@ readln_initialize (void)
 {
   initialised = true;
 
 {
   initialised = true;
 
-#if HAVE_READLINE 
-  rl_completion_entry_function = pspp_completion_function;
+#if HAVE_READLINE
+  rl_basic_word_break_characters = "\n";
+  rl_attempted_completion_function = pspp_attempted_completion_function;
 #ifdef unix
   if (history_file == NULL)
     {
 #ifdef unix
   if (history_file == NULL)
     {
index bfd3507ab14c9adeb0996a0a638dca10ee7f9db1..dbd5492414f23fbf17be3e09f39fbf06b816178f 100644 (file)
@@ -1,3 +1,8 @@
+Wed Apr 26 13:36:42 2006  Ben Pfaff  <blp@gnu.org>
+
+       * command/missing-values.sh: Update output to match behavior
+       changes.
+
 Mon Apr  3 12:32:36 2006  Ben Pfaff  <blp@gnu.org>
 
        * Updated tests to match changes in output formatting.
 Mon Apr  3 12:32:36 2006  Ben Pfaff  <blp@gnu.org>
 
        * Updated tests to match changes in output formatting.
index 8e45231234eaa86bdea1a81a41ceca5af77732d5..56edebece98b56d2476a3f9224c79a3b8affc3a2 100755 (executable)
@@ -116,12 +116,9 @@ if [ $? -eq 0 ] ; then fail ; fi
 activity="compare error messages"
 diff -w $TEMPDIR/errs - <<EOF
 $TEMPDIR/missing-values.stat:34: error: MISSING VALUES: Missing values provided are too long to assign to variable of width 3.
 activity="compare error messages"
 diff -w $TEMPDIR/errs - <<EOF
 $TEMPDIR/missing-values.stat:34: error: MISSING VALUES: Missing values provided are too long to assign to variable of width 3.
-$TEMPDIR/missing-values.stat:34: warning: Skipping the rest of this command.  Part of this command may have been executed.
 $TEMPDIR/missing-values.stat:37: error: MISSING VALUES: Syntax error expecting string at \`THRU'.
 $TEMPDIR/missing-values.stat:37: error: MISSING VALUES: THRU is not a variable name.
 $TEMPDIR/missing-values.stat:37: error: MISSING VALUES: Syntax error expecting string at \`THRU'.
 $TEMPDIR/missing-values.stat:37: error: MISSING VALUES: THRU is not a variable name.
-$TEMPDIR/missing-values.stat:37: warning: Skipping the rest of this command.  Part of this command may have been executed.
 $TEMPDIR/missing-values.stat:40: error: MISSING VALUES: Cannot mix numeric variables (e.g. num1) and string variables (e.g. str1) within a single list.
 $TEMPDIR/missing-values.stat:40: error: MISSING VALUES: Cannot mix numeric variables (e.g. num1) and string variables (e.g. str1) within a single list.
-$TEMPDIR/missing-values.stat:40: warning: Skipping the rest of this command.  Part of this command may have been executed.
 EOF
 if [ $? -ne 0 ] ; then fail ; fi
 
 EOF
 if [ $? -ne 0 ] ; then fail ; fi