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"
-"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"
@@ -75,216 +75,216 @@ 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 ""
 
-#: src/data/data-in.c:63
+#: src/data/data-in.c:61
 #, 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 ""
 
-#: src/data/data-in.c:210
+#: src/data/data-in.c:208
 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 ""
 
-#: src/data/data-in.c:255
+#: src/data/data-in.c:253
 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 ""
 
-#: src/data/data-in.c:299
+#: src/data/data-in.c:297
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/data/data-in.c:402
+#: src/data/data-in.c:400
 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 ""
 
-#: src/data/data-in.c:430
+#: src/data/data-in.c:428
 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 ""
 
-#: src/data/data-in.c:637
+#: src/data/data-in.c:635
 msgid "Unexpected end of field."
 msgstr ""
 
-#: src/data/data-in.c:663
+#: src/data/data-in.c:661
 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 ""
 
-#: src/data/data-in.c:713
+#: src/data/data-in.c:711
 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 ""
 
-#: src/data/data-in.c:760
+#: src/data/data-in.c:758
 #, 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 ""
 
-#: src/data/data-in.c:814
+#: src/data/data-in.c:812
 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 ""
 
-#: src/data/data-in.c:839
+#: src/data/data-in.c:837
 #, 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 ""
 
-#: src/data/data-in.c:866
+#: src/data/data-in.c:864
 #, 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 ""
 
-#: src/data/data-in.c:892
+#: src/data/data-in.c:890
 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 ""
 
-#: src/data/data-in.c:920
+#: src/data/data-in.c:918
 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 ""
 
-#: src/data/data-in.c:955
+#: src/data/data-in.c:953
 #, 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 ""
 
-#: src/data/data-in.c:1014
+#: src/data/data-in.c:1012
 #, 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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."
@@ -311,21 +311,21 @@ 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
-msgid "Searching for `%s'..."
+msgid "searching for \"%s\" in path \"%s\""
 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 ""
 
-#: src/data/filename.c:286
-#, c-format
-msgid "Found `%s'."
+#: src/data/file-name.c:271
+msgid "...not found"
 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 ""
@@ -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
-#: 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/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/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/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/language/dictionary/apply-dictionary.c:73
 #: 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 ""
@@ -430,7 +430,7 @@ 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 ""
@@ -477,12 +477,12 @@ 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 ""
 
-#: 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 ""
@@ -547,18 +547,18 @@ 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 ""
 
-#: 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 ""
 
-#: 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 ""
@@ -575,135 +575,135 @@ 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 ""
 
-#: src/data/sys-file-reader.c:151
+#: src/data/sys-file-reader.c:154
 #, 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/data/sys-file-reader.c:486
+#: src/data/sys-file-reader.c:489
 #, 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/data/sys-file-reader.c:550
+#: src/data/sys-file-reader.c:553
 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 ""
 
-#: src/data/sys-file-reader.c:558
+#: src/data/sys-file-reader.c:561
 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 ""
 
-#: 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 ""
 
-#: 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 "
@@ -711,213 +711,213 @@ msgid ""
 "%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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/data/sys-file-reader.c:1243
+#: src/data/sys-file-reader.c:1246
 #, 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 ""
 
-#: 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 ""
 
-#: src/data/sys-file-reader.c:1298
+#: src/data/sys-file-reader.c:1301
 #, 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
@@ -968,83 +968,95 @@ msgstr ""
 msgid "scratch"
 msgstr ""
 
-#: src/language/command.c:141
+#: src/language/command.c:159
 #, c-format
-msgid "%s not allowed inside FILE TYPE/END FILE TYPE."
+msgid "%s may be used only in testing mode."
 msgstr ""
 
-#: src/language/command.c:144
+#: src/language/command.c:164
 #, c-format
-msgid "%s not allowed inside FILE TYPE GROUPED/END FILE TYPE."
+msgid "%s may be used only in enhanced syntax mode."
 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 ""
 
-#: 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 ""
 
-#: 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
-msgid "%s is not yet implemented."
+msgid "%s or %s"
 msgstr ""
 
-#: src/language/command.c:223
+#: src/language/command.c:563
 #, 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 ""
 
-#: src/language/command.c:227
+#: src/language/command.c:567
 #, c-format
-msgid "%s is not allowed within an input program."
+msgid "%s is allowed only %s."
 msgstr ""
 
-#: src/language/command.c:228 src/language/command.c:229
+#: src/language/command.c:572
 #, c-format
-msgid "%s is only allowed within an input program."
+msgid "%s is not allowed inside INPUT PROGRAM."
 msgstr ""
 
-#: src/language/command.c:504
+#: src/language/command.c:574
 #, c-format
-msgid "Unknown command %s."
+msgid "%s is not allowed inside FILE TYPE."
 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/command.c:657
+#: src/language/command.c:678
 #, 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 ""
 
-#: src/language/command.c:749
+#: src/language/command.c:770
 #, 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/command.c:797
+#: src/language/command.c:818
 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 ""
 
-#: src/language/control/repeat.c:137
+#: src/language/control/repeat.c:135
 #, 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 ""
 
-#: 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 ""
 
-#: src/language/control/repeat.c:453
+#: src/language/control/repeat.c:451
 msgid "String expected."
 msgstr ""
 
-#: src/language/control/repeat.c:480
+#: src/language/control/repeat.c:478
 msgid "No matching DO REPEAT."
 msgstr ""
 
@@ -1121,7 +1133,7 @@ msgid ""
 "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 ""
@@ -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/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 ""
 
@@ -1247,182 +1259,182 @@ msgid ""
 "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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/data-list.c:1564
+#: src/language/data-io/data-list.c:1566
 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 ""
 
-#: src/language/data-io/data-list.c:1573
+#: src/language/data-io/data-list.c:1575
 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/data-list.c:1676
+#: src/language/data-io/data-list.c:1678
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/data-reader.c:281
+#: src/language/data-io/data-reader.c:273
 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 ""
 
-#: 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 ""
 
-#: 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 ""
@@ -1469,159 +1481,154 @@ 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/file-type.c:175
+#: src/language/data-io/file-type.c:190
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/file-type.c:207
+#: src/language/data-io/file-type.c:222
 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/file-type.c:228
+#: src/language/data-io/file-type.c:243
 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 ""
 
-#: src/language/data-io/file-type.c:247
+#: src/language/data-io/file-type.c:262
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/file-type.c:332
+#: src/language/data-io/file-type.c:347
 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 ""
 
-#: src/language/data-io/file-type.c:368
+#: src/language/data-io/file-type.c:383
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/file-type.c:675
+#: src/language/data-io/file-type.c:674
 #, 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 ""
 
-#: src/language/data-io/get.c:108
+#: src/language/data-io/get.c:106
 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 ""
 
-#: 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 ""
 
-#: 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 "
@@ -1629,319 +1636,313 @@ msgid ""
 "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 ""
 
-#: 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 ""
 
-#: src/language/data-io/get.c:674
+#: src/language/data-io/get.c:672
 #, 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/get.c:958
+#: src/language/data-io/get.c:953
 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 ""
 
-#: src/language/data-io/get.c:992
+#: src/language/data-io/get.c:987
 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 ""
 
-#: src/language/data-io/get.c:1047
+#: src/language/data-io/get.c:1042
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/list.q:205
+#: src/language/data-io/list.q:203
 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 ""
 
-#: src/language/data-io/matrix-data.c:213
+#: src/language/data-io/matrix-data.c:211
 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 ""
 
-#: src/language/data-io/matrix-data.c:289
+#: src/language/data-io/matrix-data.c:287
 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 ""
 
-#: src/language/data-io/matrix-data.c:307
+#: src/language/data-io/matrix-data.c:305
 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/matrix-data.c:366
+#: src/language/data-io/matrix-data.c:364
 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 ""
 
-#: src/language/data-io/matrix-data.c:400
+#: src/language/data-io/matrix-data.c:398
 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 ""
 
-#: src/language/data-io/matrix-data.c:419
+#: src/language/data-io/matrix-data.c:417
 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 ""
 
-#: src/language/data-io/matrix-data.c:460
+#: src/language/data-io/matrix-data.c:458
 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 ""
 
-#: src/language/data-io/matrix-data.c:475
+#: src/language/data-io/matrix-data.c:473
 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/matrix-data.c:520
+#: src/language/data-io/matrix-data.c:518
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/matrix-data.c:617
+#: src/language/data-io/matrix-data.c:615
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/matrix-data.c:1753
+#: src/language/data-io/matrix-data.c:1747
 #, 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 ""
 
-#: src/language/data-io/matrix-data.c:1778
+#: src/language/data-io/matrix-data.c:1772
 #, 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 ""
 
-#: 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 ""
 
-#: 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 ""
@@ -2005,62 +2006,62 @@ msgid_plural "Writing %d records."
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/dictionary/formats.c:89
+#: src/language/dictionary/formats.c:87
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
@@ -2137,18 +2138,18 @@ 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 ""
 
-#: 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/numeric.c:132
+#: src/language/dictionary/numeric.c:130
 #, 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 ""
 
-#: src/language/dictionary/sys-file-info.c:100
+#: src/language/dictionary/sys-file-info.c:101
 msgid "File:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:102
+#: src/language/dictionary/sys-file-info.c:103
 msgid "Label:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:106
+#: src/language/dictionary/sys-file-info.c:107
 msgid "No label."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:109
+#: src/language/dictionary/sys-file-info.c:110
 msgid "Created:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:112
+#: src/language/dictionary/sys-file-info.c:113
 msgid "Endian:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:113
+#: src/language/dictionary/sys-file-info.c:114
 msgid "Big."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:113
+#: src/language/dictionary/sys-file-info.c:114
 msgid "Little."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:114
+#: src/language/dictionary/sys-file-info.c:115
 msgid "Variables:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:117
+#: src/language/dictionary/sys-file-info.c:118
 msgid "Cases:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:120
+#: src/language/dictionary/sys-file-info.c:121
 msgid "Type:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:121
+#: src/language/dictionary/sys-file-info.c:122
 msgid "System File."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:122
+#: src/language/dictionary/sys-file-info.c:123
 msgid "Weight:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:126
+#: src/language/dictionary/sys-file-info.c:127
 msgid "Not weighted."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:128
+#: src/language/dictionary/sys-file-info.c:129
 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 ""
 
-#: src/language/dictionary/sys-file-info.c:130
+#: src/language/dictionary/sys-file-info.c:131
 msgid "on"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:130
+#: src/language/dictionary/sys-file-info.c:131
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/dictionary/sys-file-info.c:202
+#: src/language/dictionary/sys-file-info.c:203
 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 ""
 
-#: src/language/dictionary/sys-file-info.c:283
+#: src/language/dictionary/sys-file-info.c:284
 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 ""
 
-#: src/language/dictionary/sys-file-info.c:302
+#: src/language/dictionary/sys-file-info.c:303
 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/language/dictionary/sys-file-info.c:452
+#: src/language/dictionary/sys-file-info.c:453
 #, 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 ""
 
-#: src/language/dictionary/sys-file-info.c:462
+#: src/language/dictionary/sys-file-info.c:463
 #, 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 ""
 
-#: 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 ""
 
-#: src/language/dictionary/sys-file-info.c:575
+#: src/language/dictionary/sys-file-info.c:576
 msgid "No vectors defined."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:590
+#: src/language/dictionary/sys-file-info.c:591
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/dictionary/value-labels.c:170
+#: src/language/dictionary/value-labels.c:167
 #, 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 ""
 
-#: src/language/dictionary/variable-label.c:50
+#: src/language/dictionary/variable-label.c:48
 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 ""
 
@@ -2402,37 +2403,37 @@ 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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."
@@ -2480,7 +2481,7 @@ 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 ""
 
@@ -2548,6 +2549,12 @@ 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 ""
@@ -2619,50 +2626,50 @@ msgstr ""
 msgid "expecting identifier"
 msgstr ""
 
-#: src/language/lexer/lexer.c:842
+#: src/language/lexer/lexer.c:861
 msgid "<ERROR>"
 msgstr ""
 
-#: src/language/lexer/lexer.c:988
+#: src/language/lexer/lexer.c:1007
 msgid "binary"
 msgstr ""
 
-#: src/language/lexer/lexer.c:993
+#: src/language/lexer/lexer.c:1012
 msgid "octal"
 msgstr ""
 
-#: src/language/lexer/lexer.c:998
+#: src/language/lexer/lexer.c:1017
 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 ""
 
-#: src/language/lexer/lexer.c:1037
+#: src/language/lexer/lexer.c:1056
 #, 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 ""
 
-#: src/language/lexer/lexer.c:1122
+#: src/language/lexer/lexer.c:1141
 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 ""
 
-#: src/language/lexer/lexer.c:1143
+#: src/language/lexer/lexer.c:1162
 #, 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."
@@ -2759,79 +2766,79 @@ 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 ""
 
-#: src/language/line-buffer.c:330
+#: src/language/line-buffer.c:334
 #, c-format
 msgid "Closing `%s': %s."
 msgstr ""
 
-#: src/language/line-buffer.c:441
+#: src/language/line-buffer.c:445
 #, c-format
-msgid "%s: Opening as syntax file."
+msgid "opening \"%s\" as syntax file"
 msgstr ""
 
-#: src/language/line-buffer.c:446
+#: src/language/line-buffer.c:450
 #, 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 ""
 
-#: src/language/stats/aggregate.c:198
+#: src/language/stats/aggregate.c:200
 msgid "while expecting COLUMNWISE"
 msgstr ""
 
-#: src/language/stats/aggregate.c:227
+#: src/language/stats/aggregate.c:229
 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 ""
 
-#: src/language/stats/aggregate.c:401
+#: src/language/stats/aggregate.c:403
 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 ""
 
-#: src/language/stats/aggregate.c:469
+#: src/language/stats/aggregate.c:471
 #, 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 "
@@ -2853,311 +2860,311 @@ 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 ""
 
-#: 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 ""
 
-#: src/language/stats/crosstabs.q:333
+#: src/language/stats/crosstabs.q:331
 msgid "Too many crosstabulation variables or dimensions."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:343
+#: src/language/stats/crosstabs.q:341
 msgid "expecting BY"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:410
+#: src/language/stats/crosstabs.q:408
 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 ""
 
-#: src/language/stats/crosstabs.q:812
+#: src/language/stats/crosstabs.q:810
 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 ""
 
-#: 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 ""
 
-#: 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/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 ""
 
-#: 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/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 ""
 
-#: src/language/stats/crosstabs.q:1070
+#: src/language/stats/crosstabs.q:1068
 msgid "count"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1071
+#: src/language/stats/crosstabs.q:1069
 msgid "row %"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1072
+#: src/language/stats/crosstabs.q:1070
 msgid "column %"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1073
+#: src/language/stats/crosstabs.q:1071
 msgid "total %"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1074
+#: src/language/stats/crosstabs.q:1072
 msgid "expected"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1075
+#: src/language/stats/crosstabs.q:1073
 msgid "residual"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1076
+#: src/language/stats/crosstabs.q:1074
 msgid "std. resid."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1077
+#: src/language/stats/crosstabs.q:1075
 msgid "adj. resid."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1107
+#: src/language/stats/crosstabs.q:1105
 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 ""
 
-#: 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/crosstabs.q:1114
+#: src/language/stats/crosstabs.q:1112
 msgid "Asymp. Sig. (2-sided)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1116
+#: src/language/stats/crosstabs.q:1114
 msgid "Exact. Sig. (2-sided)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1118
+#: src/language/stats/crosstabs.q:1116
 msgid "Exact. Sig. (1-sided)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1133
+#: src/language/stats/crosstabs.q:1131
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/stats/crosstabs.q:1152
+#: src/language/stats/crosstabs.q:1150
 msgid "Risk estimate."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1156
+#: src/language/stats/crosstabs.q:1154
 #, 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/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/crosstabs.q:1174
+#: src/language/stats/crosstabs.q:1172
 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 ""
 
-#: src/language/stats/crosstabs.q:1935
+#: src/language/stats/crosstabs.q:1933
 msgid "Pearson Chi-Square"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1936
+#: src/language/stats/crosstabs.q:1934
 msgid "Likelihood Ratio"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1937
+#: src/language/stats/crosstabs.q:1935
 msgid "Fisher's Exact Test"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1938
+#: src/language/stats/crosstabs.q:1936
 msgid "Continuity Correction"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1939
+#: src/language/stats/crosstabs.q:1937
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/stats/crosstabs.q:1994
+#: src/language/stats/crosstabs.q:1992
 msgid "Interval by Interval"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1995
+#: src/language/stats/crosstabs.q:1993
 msgid "Measure of Agreement"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2000
+#: src/language/stats/crosstabs.q:1998
 msgid "Phi"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2001
+#: src/language/stats/crosstabs.q:1999
 msgid "Cramer's V"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2002
+#: src/language/stats/crosstabs.q:2000
 msgid "Contingency Coefficient"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2003
+#: src/language/stats/crosstabs.q:2001
 msgid "Kendall's tau-b"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2004
+#: src/language/stats/crosstabs.q:2002
 msgid "Kendall's tau-c"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2005
+#: src/language/stats/crosstabs.q:2003
 msgid "Gamma"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2006
+#: src/language/stats/crosstabs.q:2004
 msgid "Spearman Correlation"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2007
+#: src/language/stats/crosstabs.q:2005
 msgid "Pearson's R"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2008
+#: src/language/stats/crosstabs.q:2006
 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 ""
 
-#: src/language/stats/crosstabs.q:2081
+#: src/language/stats/crosstabs.q:2079
 #, 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 ""
 
-#: src/language/stats/crosstabs.q:2092
+#: src/language/stats/crosstabs.q:2090
 #, 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 ""
 
-#: src/language/stats/crosstabs.q:2128
+#: src/language/stats/crosstabs.q:2126
 msgid "Lambda"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2129
+#: src/language/stats/crosstabs.q:2127
 msgid "Goodman and Kruskal tau"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2130
+#: src/language/stats/crosstabs.q:2128
 msgid "Uncertainty Coefficient"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2131
+#: src/language/stats/crosstabs.q:2129
 msgid "Somers' d"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2132
+#: src/language/stats/crosstabs.q:2130
 msgid "Eta"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2137
+#: src/language/stats/crosstabs.q:2135
 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 ""
 
-#: 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"
@@ -3167,17 +3174,17 @@ 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
@@ -3185,8 +3192,8 @@ 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 ""
 
@@ -3194,22 +3201,22 @@ 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
@@ -3257,109 +3264,109 @@ 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 ""
 
-#: src/language/stats/examine.q:917
+#: src/language/stats/examine.q:920
 msgid "Case Processing Summary"
 msgstr ""
 
-#: src/language/stats/examine.q:1123
+#: src/language/stats/examine.q:1126
 msgid "Extreme Values"
 msgstr ""
 
-#: src/language/stats/examine.q:1139
+#: src/language/stats/examine.q:1142
 msgid "Case Number"
 msgstr ""
 
-#: src/language/stats/examine.q:1224
+#: src/language/stats/examine.q:1227
 msgid "Highest"
 msgstr ""
 
-#: src/language/stats/examine.q:1229
+#: src/language/stats/examine.q:1232
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/stats/examine.q:1521
+#: src/language/stats/examine.q:1524
 #, 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 ""
 
-#: 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/examine.q:1614
+#: src/language/stats/examine.q:1617
 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 ""
 
-#: src/language/stats/examine.q:1791
+#: src/language/stats/examine.q:1794
 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 ""
 
-#: 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 ""
 
-#: src/language/stats/examine.q:1835
+#: src/language/stats/examine.q:1838
 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 ""
 
-#: src/language/stats/examine.q:1841
+#: src/language/stats/examine.q:1844
 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 ""
 
-#: src/language/stats/examine.q:2107
+#: src/language/stats/examine.q:2110
 msgid "Tukey's Hinges"
 msgstr ""
 
@@ -3381,139 +3388,139 @@ 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 ""
 
-#: src/language/stats/flip.c:418
+#: src/language/stats/flip.c:414
 #, 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 ""
 
-#: src/language/stats/flip.c:437
+#: src/language/stats/flip.c:433
 #, 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 ""
 
-#: src/language/stats/flip.c:469
+#: src/language/stats/flip.c:465
 #, 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 ""
 
-#: src/language/stats/flip.c:532
+#: src/language/stats/flip.c:528
 #, 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 ""
 
-#: src/language/stats/frequencies.q:121
+#: src/language/stats/frequencies.q:120
 msgid "S.E. Mean"
 msgstr ""
 
-#: src/language/stats/frequencies.q:123
+#: src/language/stats/frequencies.q:122
 msgid "Mode"
 msgstr ""
 
-#: src/language/stats/frequencies.q:127
+#: src/language/stats/frequencies.q:126
 msgid "S.E. Kurt"
 msgstr ""
 
-#: src/language/stats/frequencies.q:129
+#: src/language/stats/frequencies.q:128
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/stats/frequencies.q:824
+#: src/language/stats/frequencies.q:823
 #, 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 ""
 
-#: src/language/stats/frequencies.q:896
+#: src/language/stats/frequencies.q:895
 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 ""
 
-#: src/language/stats/frequencies.q:915
+#: src/language/stats/frequencies.q:914
 #, 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 ""
 
-#: 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 ""
 
-#: src/language/stats/frequencies.q:1167
+#: src/language/stats/frequencies.q:1166
 msgid "Value Label"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1268
+#: src/language/stats/frequencies.q:1267
 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 ""
 
-#: 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 ""
 
-#: src/language/stats/means.q:104
+#: src/language/stats/means.q:102
 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 ""
 
@@ -3531,21 +3538,21 @@ 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 ""
 
-#: 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 ""
 
-#: 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/regression.q:194 src/language/stats/regression.q:290
+#: src/language/stats/regression.q:208 src/language/stats/regression.q:304
 msgid "Significance"
 msgstr ""
 
@@ -3557,7 +3564,7 @@ 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 ""
 
@@ -3593,7 +3600,7 @@ 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"
@@ -3612,72 +3619,72 @@ 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 ""
 
-#: src/language/stats/rank.q:249
+#: src/language/stats/rank.q:250
 msgid "Too many variables in INTO clause."
 msgstr ""
 
-#: src/language/stats/regression.q:145
+#: src/language/stats/regression.q:159
 msgid "R"
 msgstr ""
 
-#: src/language/stats/regression.q:146
+#: src/language/stats/regression.q:160
 msgid "R Square"
 msgstr ""
 
-#: src/language/stats/regression.q:147
+#: src/language/stats/regression.q:161
 msgid "Adjusted R Square"
 msgstr ""
 
-#: src/language/stats/regression.q:148
+#: src/language/stats/regression.q:162
 msgid "Std. Error of the Estimate"
 msgstr ""
 
-#: src/language/stats/regression.q:153
+#: src/language/stats/regression.q:167
 msgid "Model Summary"
 msgstr ""
 
-#: src/language/stats/regression.q:190
+#: src/language/stats/regression.q:204
 msgid "B"
 msgstr ""
 
-#: src/language/stats/regression.q:192
+#: src/language/stats/regression.q:206
 msgid "Beta"
 msgstr ""
 
-#: src/language/stats/regression.q:195
+#: src/language/stats/regression.q:209
 msgid "(Constant)"
 msgstr ""
 
-#: src/language/stats/regression.q:255
+#: src/language/stats/regression.q:269
 msgid "Coefficients"
 msgstr ""
 
-#: src/language/stats/regression.q:292
+#: src/language/stats/regression.q:306
 msgid "Regression"
 msgstr ""
 
-#: src/language/stats/regression.q:293
+#: src/language/stats/regression.q:307
 msgid "Residual"
 msgstr ""
 
-#: src/language/stats/regression.q:371
+#: src/language/stats/regression.q:385
 msgid "Model"
 msgstr ""
 
-#: src/language/stats/regression.q:372
+#: src/language/stats/regression.q:386
 msgid "Covariances"
 msgstr ""
 
-#: src/language/stats/regression.q:387
+#: src/language/stats/regression.q:401
 msgid "Coefficient Correlations"
 msgstr ""
 
-#: src/language/stats/regression.q:885
+#: src/language/stats/regression.q:1157
 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
-msgid "expecting filename"
+msgid "expecting file name"
 msgstr ""
 
 #: src/language/utilities/permissions.c:77
@@ -3975,26 +3982,12 @@ 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 ""
 
-#: 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 ""
@@ -4059,11 +4052,11 @@ 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 ""
 
-#: 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 ""
@@ -4105,43 +4098,13 @@ 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 ""
 
-#: 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\""
@@ -4209,70 +4172,70 @@ 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 ""
 
-#: 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 ""
 
-#: src/output/ascii.c:233
+#: src/output/ascii.c:232
 #, 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 ""
 
-#: src/output/ascii.c:292
+#: src/output/ascii.c:291
 #, 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 ""
 
-#: src/output/ascii.c:314
+#: src/output/ascii.c:313
 #, 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 ""
 
-#: src/output/ascii.c:353
+#: src/output/ascii.c:352
 #, 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/output/ascii.c:727
+#: src/output/ascii.c:726
 msgid "ascii: charts are unsupported by this driver"
 msgstr ""
 
@@ -4280,150 +4243,164 @@ msgstr ""
 msgid "HISTOGRAM"
 msgstr ""
 
-#: src/output/html.c:68
+#: src/output/html.c:66
 #, c-format
 msgid "opening HTML output file: %s"
 msgstr ""
 
-#: src/output/html.c:79
+#: src/output/html.c:77
 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 ""
 
-#: src/output/output.c:166
+#: src/output/output.c:165
 #, c-format
-msgid "Unknown output driver `%s'."
+msgid "unknown output driver `%s'"
 msgstr ""
 
-#: src/output/output.c:168
+#: src/output/output.c:167
 #, c-format
-msgid "Output driver `%s' referenced but never defined."
+msgid "output driver `%s' referenced but never defined"
 msgstr ""
 
 #: src/output/output.c:261
-msgid "Using default output driver configuration."
+msgid "using default output driver configuration"
 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 ""
 
-#: src/output/output.c:304 src/output/output.c:1067
+#: src/output/output.c:301
 #, c-format
-msgid "Opening %s: %s."
+msgid "cannot open \"%s\""
 msgstr ""
 
-#: src/output/output.c:315 src/output/output.c:1078
+#: src/output/output.c:313
 #, c-format
-msgid "Reading %s: %s."
+msgid "reading \"%s\""
 msgstr ""
 
-#: src/output/output.c:337 src/output/output.c:503
-msgid "Syntax error."
+#: src/output/output.c:335
+msgid "syntax error"
 msgstr ""
 
-#: src/output/output.c:347
+#: src/output/output.c:344
 #, c-format
-msgid "Closing %s: %s."
+msgid "error closing \"%s\""
 msgstr ""
 
-#: src/output/output.c:355
-msgid "No output drivers are active."
+#: src/output/output.c:352
+msgid "no active output drivers"
 msgstr ""
 
-#: src/output/output.c:358
-msgid "Error reading device definition file."
+#: src/output/output.c:355
+msgid "error reading device definition file"
 msgstr ""
 
-#: src/output/output.c:475
+#: src/output/output.c:472
 #, 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/output/output.c:698
+#: src/output/output.c:692
 #, c-format
-msgid "Unknown output driver class `%s'."
+msgid "unknown output driver class `%s'"
 msgstr ""
 
-#: src/output/output.c:719
+#: src/output/output.c:714
 #, c-format
-msgid "Unknown device type `%s'."
+msgid "unknown device type `%s'"
 msgstr ""
 
-#: src/output/output.c:738
+#: src/output/output.c:733
 #, c-format
-msgid "Can't initialize output driver `%s' of class `%s'."
+msgid "cannot initialize output driver `%s' of class `%s'"
 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 ""
 
-#: src/output/output.c:929
+#: src/output/output.c:926
 #, c-format
-msgid "Unit \"%s\" is unknown in dimension \"%s\"."
+msgid "unit \"%s\" is unknown in dimension \"%s\""
 msgstr ""
 
-#: src/output/output.c:944
+#: src/output/output.c:941
 #, c-format
-msgid "Bad dimension \"%s\"."
+msgid "bad dimension \"%s\""
 msgstr ""
 
-#: src/output/output.c:970
+#: src/output/output.c:967
 #, c-format
-msgid "`x' expected in paper size `%s'."
+msgid "`x' expected in paper size `%s'"
 msgstr ""
 
-#: src/output/output.c:980
+#: src/output/output.c:977
 #, c-format
-msgid "Trailing garbage `%s' on paper size `%s'."
+msgid "trailing garbage `%s' on paper size `%s'"
 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 ""
 
-#: src/output/output.c:1060
-msgid "Cannot find `papersize' configuration file."
+#: src/output/output.c:1039
+msgid "cannot find `papersize' configuration file"
 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 ""
 
-#: src/output/output.c:1134
-msgid "Error reading paper size definition file."
+#: src/output/output.c:1057
+#, c-format
+msgid "error reading \"%s\""
 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 ""
 
-#: 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, "
@@ -4431,87 +4408,87 @@ msgid ""
 "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 ""
 
-#: src/output/postscript.c:310
+#: src/output/postscript.c:309
 #, 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 ""
 
-#: src/output/postscript.c:338
+#: src/output/postscript.c:337
 #, 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/output/postscript.c:1182
+#: src/output/postscript.c:1181
 #, 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 ""
 
-#: src/output/postscript.c:1204
+#: src/output/postscript.c:1203
 #, 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 ""
 
-#: src/output/postscript.c:1313
+#: src/output/postscript.c:1312
 #, 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 ""
 
-#: src/output/postscript.c:1376
+#: src/output/postscript.c:1375
 #, 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 ""
 
-#: 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 ""
 
-#: 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"
@@ -4549,26 +4526,18 @@ msgstr ""
 msgid "Font Selection"
 msgstr ""
 
-#: src/ui/gui/message-dialog.c:78
+#: src/ui/gui/message-dialog.c:75
 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 ""
 
-#: src/ui/gui/message-dialog.c:95
+#: src/ui/gui/message-dialog.c:84
 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 ""
@@ -4657,7 +4626,7 @@ 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"
@@ -4702,41 +4671,17 @@ msgid ""
 "\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 ""
 
-#: 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 ""
-"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."
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"
-"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"
@@ -76,216 +76,216 @@ 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 ""
 
-#: src/data/data-in.c:63
+#: src/data/data-in.c:61
 #, 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 ""
 
-#: src/data/data-in.c:210
+#: src/data/data-in.c:208
 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 ""
 
-#: src/data/data-in.c:255
+#: src/data/data-in.c:253
 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 ""
 
-#: src/data/data-in.c:299
+#: src/data/data-in.c:297
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/data/data-in.c:402
+#: src/data/data-in.c:400
 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 ""
 
-#: src/data/data-in.c:430
+#: src/data/data-in.c:428
 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 ""
 
-#: src/data/data-in.c:637
+#: src/data/data-in.c:635
 msgid "Unexpected end of field."
 msgstr ""
 
-#: src/data/data-in.c:663
+#: src/data/data-in.c:661
 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 ""
 
-#: src/data/data-in.c:713
+#: src/data/data-in.c:711
 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 ""
 
-#: src/data/data-in.c:760
+#: src/data/data-in.c:758
 #, 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 ""
 
-#: src/data/data-in.c:814
+#: src/data/data-in.c:812
 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 ""
 
-#: src/data/data-in.c:839
+#: src/data/data-in.c:837
 #, 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 ""
 
-#: src/data/data-in.c:866
+#: src/data/data-in.c:864
 #, 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 ""
 
-#: src/data/data-in.c:892
+#: src/data/data-in.c:890
 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 ""
 
-#: src/data/data-in.c:920
+#: src/data/data-in.c:918
 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 ""
 
-#: src/data/data-in.c:955
+#: src/data/data-in.c:953
 #, 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 ""
 
-#: src/data/data-in.c:1014
+#: src/data/data-in.c:1012
 #, 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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."
@@ -312,21 +312,21 @@ 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
-msgid "Searching for `%s'..."
+msgid "searching for \"%s\" in path \"%s\""
 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 ""
 
-#: src/data/filename.c:286
-#, c-format
-msgid "Found `%s'."
+#: src/data/file-name.c:271
+msgid "...not found"
 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 ""
@@ -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
-#: 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/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/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/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/language/dictionary/apply-dictionary.c:73
 #: 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 ""
@@ -431,7 +431,7 @@ 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 ""
@@ -478,12 +478,12 @@ 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 ""
 
-#: 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 ""
@@ -548,18 +548,18 @@ 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 ""
 
-#: 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 ""
 
-#: 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 ""
@@ -576,135 +576,135 @@ 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 ""
 
-#: src/data/sys-file-reader.c:151
+#: src/data/sys-file-reader.c:154
 #, 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/data/sys-file-reader.c:486
+#: src/data/sys-file-reader.c:489
 #, 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/data/sys-file-reader.c:550
+#: src/data/sys-file-reader.c:553
 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 ""
 
-#: src/data/sys-file-reader.c:558
+#: src/data/sys-file-reader.c:561
 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 ""
 
-#: 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 ""
 
-#: 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 "
@@ -712,213 +712,213 @@ msgid ""
 "%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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/data/sys-file-reader.c:1243
+#: src/data/sys-file-reader.c:1246
 #, 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 ""
 
-#: 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 ""
 
-#: src/data/sys-file-reader.c:1298
+#: src/data/sys-file-reader.c:1301
 #, 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
@@ -969,83 +969,95 @@ msgstr ""
 msgid "scratch"
 msgstr ""
 
-#: src/language/command.c:141
+#: src/language/command.c:159
 #, c-format
-msgid "%s not allowed inside FILE TYPE/END FILE TYPE."
+msgid "%s may be used only in testing mode."
 msgstr ""
 
-#: src/language/command.c:144
+#: src/language/command.c:164
 #, c-format
-msgid "%s not allowed inside FILE TYPE GROUPED/END FILE TYPE."
+msgid "%s may be used only in enhanced syntax mode."
 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 ""
 
-#: 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 ""
 
-#: 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
-msgid "%s is not yet implemented."
+msgid "%s or %s"
 msgstr ""
 
-#: src/language/command.c:223
+#: src/language/command.c:563
 #, 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 ""
 
-#: src/language/command.c:227
+#: src/language/command.c:567
 #, c-format
-msgid "%s is not allowed within an input program."
+msgid "%s is allowed only %s."
 msgstr ""
 
-#: src/language/command.c:228 src/language/command.c:229
+#: src/language/command.c:572
 #, c-format
-msgid "%s is only allowed within an input program."
+msgid "%s is not allowed inside INPUT PROGRAM."
 msgstr ""
 
-#: src/language/command.c:504
+#: src/language/command.c:574
 #, c-format
-msgid "Unknown command %s."
+msgid "%s is not allowed inside FILE TYPE."
 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/command.c:657
+#: src/language/command.c:678
 #, 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 ""
 
-#: src/language/command.c:749
+#: src/language/command.c:770
 #, 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/command.c:797
+#: src/language/command.c:818
 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 ""
 
-#: src/language/control/repeat.c:137
+#: src/language/control/repeat.c:135
 #, 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 ""
 
-#: 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 ""
 
-#: src/language/control/repeat.c:453
+#: src/language/control/repeat.c:451
 msgid "String expected."
 msgstr ""
 
-#: src/language/control/repeat.c:480
+#: src/language/control/repeat.c:478
 msgid "No matching DO REPEAT."
 msgstr ""
 
@@ -1122,7 +1134,7 @@ msgid ""
 "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 ""
@@ -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/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 ""
 
@@ -1248,182 +1260,182 @@ msgid ""
 "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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/data-list.c:1564
+#: src/language/data-io/data-list.c:1566
 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 ""
 
-#: src/language/data-io/data-list.c:1573
+#: src/language/data-io/data-list.c:1575
 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/data-list.c:1676
+#: src/language/data-io/data-list.c:1678
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/data-reader.c:281
+#: src/language/data-io/data-reader.c:273
 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 ""
 
-#: 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 ""
 
-#: 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 ""
@@ -1470,159 +1482,154 @@ 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/file-type.c:175
+#: src/language/data-io/file-type.c:190
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/file-type.c:207
+#: src/language/data-io/file-type.c:222
 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/file-type.c:228
+#: src/language/data-io/file-type.c:243
 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 ""
 
-#: src/language/data-io/file-type.c:247
+#: src/language/data-io/file-type.c:262
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/file-type.c:332
+#: src/language/data-io/file-type.c:347
 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 ""
 
-#: src/language/data-io/file-type.c:368
+#: src/language/data-io/file-type.c:383
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/file-type.c:675
+#: src/language/data-io/file-type.c:674
 #, 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 ""
 
-#: src/language/data-io/get.c:108
+#: src/language/data-io/get.c:106
 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 ""
 
-#: 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 ""
 
-#: 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 "
@@ -1630,319 +1637,313 @@ msgid ""
 "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 ""
 
-#: 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 ""
 
-#: src/language/data-io/get.c:674
+#: src/language/data-io/get.c:672
 #, 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/get.c:958
+#: src/language/data-io/get.c:953
 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 ""
 
-#: src/language/data-io/get.c:992
+#: src/language/data-io/get.c:987
 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 ""
 
-#: src/language/data-io/get.c:1047
+#: src/language/data-io/get.c:1042
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/list.q:205
+#: src/language/data-io/list.q:203
 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 ""
 
-#: src/language/data-io/matrix-data.c:213
+#: src/language/data-io/matrix-data.c:211
 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 ""
 
-#: src/language/data-io/matrix-data.c:289
+#: src/language/data-io/matrix-data.c:287
 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 ""
 
-#: src/language/data-io/matrix-data.c:307
+#: src/language/data-io/matrix-data.c:305
 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/matrix-data.c:366
+#: src/language/data-io/matrix-data.c:364
 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 ""
 
-#: src/language/data-io/matrix-data.c:400
+#: src/language/data-io/matrix-data.c:398
 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 ""
 
-#: src/language/data-io/matrix-data.c:419
+#: src/language/data-io/matrix-data.c:417
 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 ""
 
-#: src/language/data-io/matrix-data.c:460
+#: src/language/data-io/matrix-data.c:458
 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 ""
 
-#: src/language/data-io/matrix-data.c:475
+#: src/language/data-io/matrix-data.c:473
 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/matrix-data.c:520
+#: src/language/data-io/matrix-data.c:518
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/matrix-data.c:617
+#: src/language/data-io/matrix-data.c:615
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/data-io/matrix-data.c:1753
+#: src/language/data-io/matrix-data.c:1747
 #, 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 ""
 
-#: src/language/data-io/matrix-data.c:1778
+#: src/language/data-io/matrix-data.c:1772
 #, 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 ""
 
-#: 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 ""
 
-#: 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 ""
@@ -2006,62 +2007,62 @@ msgid_plural "Writing %d records."
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/dictionary/formats.c:89
+#: src/language/dictionary/formats.c:87
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
@@ -2138,18 +2139,18 @@ 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 ""
 
-#: 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/numeric.c:132
+#: src/language/dictionary/numeric.c:130
 #, 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 ""
 
-#: src/language/dictionary/sys-file-info.c:100
+#: src/language/dictionary/sys-file-info.c:101
 msgid "File:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:102
+#: src/language/dictionary/sys-file-info.c:103
 msgid "Label:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:106
+#: src/language/dictionary/sys-file-info.c:107
 msgid "No label."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:109
+#: src/language/dictionary/sys-file-info.c:110
 msgid "Created:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:112
+#: src/language/dictionary/sys-file-info.c:113
 msgid "Endian:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:113
+#: src/language/dictionary/sys-file-info.c:114
 msgid "Big."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:113
+#: src/language/dictionary/sys-file-info.c:114
 msgid "Little."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:114
+#: src/language/dictionary/sys-file-info.c:115
 msgid "Variables:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:117
+#: src/language/dictionary/sys-file-info.c:118
 msgid "Cases:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:120
+#: src/language/dictionary/sys-file-info.c:121
 msgid "Type:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:121
+#: src/language/dictionary/sys-file-info.c:122
 msgid "System File."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:122
+#: src/language/dictionary/sys-file-info.c:123
 msgid "Weight:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:126
+#: src/language/dictionary/sys-file-info.c:127
 msgid "Not weighted."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:128
+#: src/language/dictionary/sys-file-info.c:129
 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 ""
 
-#: src/language/dictionary/sys-file-info.c:130
+#: src/language/dictionary/sys-file-info.c:131
 msgid "on"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:130
+#: src/language/dictionary/sys-file-info.c:131
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/dictionary/sys-file-info.c:202
+#: src/language/dictionary/sys-file-info.c:203
 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 ""
 
-#: src/language/dictionary/sys-file-info.c:283
+#: src/language/dictionary/sys-file-info.c:284
 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 ""
 
-#: src/language/dictionary/sys-file-info.c:302
+#: src/language/dictionary/sys-file-info.c:303
 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/language/dictionary/sys-file-info.c:452
+#: src/language/dictionary/sys-file-info.c:453
 #, 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 ""
 
-#: src/language/dictionary/sys-file-info.c:462
+#: src/language/dictionary/sys-file-info.c:463
 #, 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 ""
 
-#: 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 ""
 
-#: src/language/dictionary/sys-file-info.c:575
+#: src/language/dictionary/sys-file-info.c:576
 msgid "No vectors defined."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:590
+#: src/language/dictionary/sys-file-info.c:591
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/dictionary/value-labels.c:170
+#: src/language/dictionary/value-labels.c:167
 #, 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 ""
 
-#: src/language/dictionary/variable-label.c:50
+#: src/language/dictionary/variable-label.c:48
 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 ""
 
@@ -2403,37 +2404,37 @@ 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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."
@@ -2481,7 +2482,7 @@ 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 ""
 
@@ -2549,6 +2550,12 @@ 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 ""
@@ -2620,50 +2627,50 @@ msgstr ""
 msgid "expecting identifier"
 msgstr ""
 
-#: src/language/lexer/lexer.c:842
+#: src/language/lexer/lexer.c:861
 msgid "<ERROR>"
 msgstr ""
 
-#: src/language/lexer/lexer.c:988
+#: src/language/lexer/lexer.c:1007
 msgid "binary"
 msgstr ""
 
-#: src/language/lexer/lexer.c:993
+#: src/language/lexer/lexer.c:1012
 msgid "octal"
 msgstr ""
 
-#: src/language/lexer/lexer.c:998
+#: src/language/lexer/lexer.c:1017
 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 ""
 
-#: src/language/lexer/lexer.c:1037
+#: src/language/lexer/lexer.c:1056
 #, 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 ""
 
-#: src/language/lexer/lexer.c:1122
+#: src/language/lexer/lexer.c:1141
 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 ""
 
-#: src/language/lexer/lexer.c:1143
+#: src/language/lexer/lexer.c:1162
 #, 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."
@@ -2760,79 +2767,79 @@ 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 ""
 
-#: src/language/line-buffer.c:330
+#: src/language/line-buffer.c:334
 #, c-format
 msgid "Closing `%s': %s."
 msgstr ""
 
-#: src/language/line-buffer.c:441
+#: src/language/line-buffer.c:445
 #, c-format
-msgid "%s: Opening as syntax file."
+msgid "opening \"%s\" as syntax file"
 msgstr ""
 
-#: src/language/line-buffer.c:446
+#: src/language/line-buffer.c:450
 #, 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 ""
 
-#: src/language/stats/aggregate.c:198
+#: src/language/stats/aggregate.c:200
 msgid "while expecting COLUMNWISE"
 msgstr ""
 
-#: src/language/stats/aggregate.c:227
+#: src/language/stats/aggregate.c:229
 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 ""
 
-#: src/language/stats/aggregate.c:401
+#: src/language/stats/aggregate.c:403
 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 ""
 
-#: src/language/stats/aggregate.c:469
+#: src/language/stats/aggregate.c:471
 #, 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 "
@@ -2854,311 +2861,311 @@ 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 ""
 
-#: 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 ""
 
-#: src/language/stats/crosstabs.q:333
+#: src/language/stats/crosstabs.q:331
 msgid "Too many crosstabulation variables or dimensions."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:343
+#: src/language/stats/crosstabs.q:341
 msgid "expecting BY"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:410
+#: src/language/stats/crosstabs.q:408
 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 ""
 
-#: src/language/stats/crosstabs.q:812
+#: src/language/stats/crosstabs.q:810
 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 ""
 
-#: 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 ""
 
-#: 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/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 ""
 
-#: 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/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 ""
 
-#: src/language/stats/crosstabs.q:1070
+#: src/language/stats/crosstabs.q:1068
 msgid "count"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1071
+#: src/language/stats/crosstabs.q:1069
 msgid "row %"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1072
+#: src/language/stats/crosstabs.q:1070
 msgid "column %"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1073
+#: src/language/stats/crosstabs.q:1071
 msgid "total %"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1074
+#: src/language/stats/crosstabs.q:1072
 msgid "expected"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1075
+#: src/language/stats/crosstabs.q:1073
 msgid "residual"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1076
+#: src/language/stats/crosstabs.q:1074
 msgid "std. resid."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1077
+#: src/language/stats/crosstabs.q:1075
 msgid "adj. resid."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1107
+#: src/language/stats/crosstabs.q:1105
 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 ""
 
-#: 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/crosstabs.q:1114
+#: src/language/stats/crosstabs.q:1112
 msgid "Asymp. Sig. (2-sided)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1116
+#: src/language/stats/crosstabs.q:1114
 msgid "Exact. Sig. (2-sided)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1118
+#: src/language/stats/crosstabs.q:1116
 msgid "Exact. Sig. (1-sided)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1133
+#: src/language/stats/crosstabs.q:1131
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/stats/crosstabs.q:1152
+#: src/language/stats/crosstabs.q:1150
 msgid "Risk estimate."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1156
+#: src/language/stats/crosstabs.q:1154
 #, 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/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/crosstabs.q:1174
+#: src/language/stats/crosstabs.q:1172
 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 ""
 
-#: src/language/stats/crosstabs.q:1935
+#: src/language/stats/crosstabs.q:1933
 msgid "Pearson Chi-Square"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1936
+#: src/language/stats/crosstabs.q:1934
 msgid "Likelihood Ratio"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1937
+#: src/language/stats/crosstabs.q:1935
 msgid "Fisher's Exact Test"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1938
+#: src/language/stats/crosstabs.q:1936
 msgid "Continuity Correction"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1939
+#: src/language/stats/crosstabs.q:1937
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/stats/crosstabs.q:1994
+#: src/language/stats/crosstabs.q:1992
 msgid "Interval by Interval"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1995
+#: src/language/stats/crosstabs.q:1993
 msgid "Measure of Agreement"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2000
+#: src/language/stats/crosstabs.q:1998
 msgid "Phi"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2001
+#: src/language/stats/crosstabs.q:1999
 msgid "Cramer's V"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2002
+#: src/language/stats/crosstabs.q:2000
 msgid "Contingency Coefficient"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2003
+#: src/language/stats/crosstabs.q:2001
 msgid "Kendall's tau-b"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2004
+#: src/language/stats/crosstabs.q:2002
 msgid "Kendall's tau-c"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2005
+#: src/language/stats/crosstabs.q:2003
 msgid "Gamma"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2006
+#: src/language/stats/crosstabs.q:2004
 msgid "Spearman Correlation"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2007
+#: src/language/stats/crosstabs.q:2005
 msgid "Pearson's R"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2008
+#: src/language/stats/crosstabs.q:2006
 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 ""
 
-#: src/language/stats/crosstabs.q:2081
+#: src/language/stats/crosstabs.q:2079
 #, 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 ""
 
-#: src/language/stats/crosstabs.q:2092
+#: src/language/stats/crosstabs.q:2090
 #, 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 ""
 
-#: src/language/stats/crosstabs.q:2128
+#: src/language/stats/crosstabs.q:2126
 msgid "Lambda"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2129
+#: src/language/stats/crosstabs.q:2127
 msgid "Goodman and Kruskal tau"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2130
+#: src/language/stats/crosstabs.q:2128
 msgid "Uncertainty Coefficient"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2131
+#: src/language/stats/crosstabs.q:2129
 msgid "Somers' d"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2132
+#: src/language/stats/crosstabs.q:2130
 msgid "Eta"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2137
+#: src/language/stats/crosstabs.q:2135
 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 ""
 
-#: 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"
@@ -3168,17 +3175,17 @@ 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
@@ -3186,8 +3193,8 @@ 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 ""
 
@@ -3195,22 +3202,22 @@ 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
@@ -3258,109 +3265,109 @@ 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 ""
 
-#: src/language/stats/examine.q:917
+#: src/language/stats/examine.q:920
 msgid "Case Processing Summary"
 msgstr ""
 
-#: src/language/stats/examine.q:1123
+#: src/language/stats/examine.q:1126
 msgid "Extreme Values"
 msgstr ""
 
-#: src/language/stats/examine.q:1139
+#: src/language/stats/examine.q:1142
 msgid "Case Number"
 msgstr ""
 
-#: src/language/stats/examine.q:1224
+#: src/language/stats/examine.q:1227
 msgid "Highest"
 msgstr ""
 
-#: src/language/stats/examine.q:1229
+#: src/language/stats/examine.q:1232
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/stats/examine.q:1521
+#: src/language/stats/examine.q:1524
 #, 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 ""
 
-#: 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/examine.q:1614
+#: src/language/stats/examine.q:1617
 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 ""
 
-#: src/language/stats/examine.q:1791
+#: src/language/stats/examine.q:1794
 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 ""
 
-#: 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 ""
 
-#: src/language/stats/examine.q:1835
+#: src/language/stats/examine.q:1838
 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 ""
 
-#: src/language/stats/examine.q:1841
+#: src/language/stats/examine.q:1844
 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 ""
 
-#: src/language/stats/examine.q:2107
+#: src/language/stats/examine.q:2110
 msgid "Tukey's Hinges"
 msgstr ""
 
@@ -3382,139 +3389,139 @@ 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 ""
 
-#: src/language/stats/flip.c:418
+#: src/language/stats/flip.c:414
 #, 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 ""
 
-#: src/language/stats/flip.c:437
+#: src/language/stats/flip.c:433
 #, 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 ""
 
-#: src/language/stats/flip.c:469
+#: src/language/stats/flip.c:465
 #, 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 ""
 
-#: src/language/stats/flip.c:532
+#: src/language/stats/flip.c:528
 #, 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 ""
 
-#: src/language/stats/frequencies.q:121
+#: src/language/stats/frequencies.q:120
 msgid "S.E. Mean"
 msgstr ""
 
-#: src/language/stats/frequencies.q:123
+#: src/language/stats/frequencies.q:122
 msgid "Mode"
 msgstr ""
 
-#: src/language/stats/frequencies.q:127
+#: src/language/stats/frequencies.q:126
 msgid "S.E. Kurt"
 msgstr ""
 
-#: src/language/stats/frequencies.q:129
+#: src/language/stats/frequencies.q:128
 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/language/stats/frequencies.q:824
+#: src/language/stats/frequencies.q:823
 #, 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 ""
 
-#: src/language/stats/frequencies.q:896
+#: src/language/stats/frequencies.q:895
 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 ""
 
-#: src/language/stats/frequencies.q:915
+#: src/language/stats/frequencies.q:914
 #, 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 ""
 
-#: 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 ""
 
-#: src/language/stats/frequencies.q:1167
+#: src/language/stats/frequencies.q:1166
 msgid "Value Label"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1268
+#: src/language/stats/frequencies.q:1267
 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 ""
 
-#: 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 ""
 
-#: src/language/stats/means.q:104
+#: src/language/stats/means.q:102
 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 ""
 
@@ -3532,21 +3539,21 @@ 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 ""
 
-#: 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 ""
 
-#: 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/regression.q:194 src/language/stats/regression.q:290
+#: src/language/stats/regression.q:208 src/language/stats/regression.q:304
 msgid "Significance"
 msgstr ""
 
@@ -3558,7 +3565,7 @@ 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 ""
 
@@ -3594,7 +3601,7 @@ 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"
@@ -3613,72 +3620,72 @@ 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 ""
 
-#: src/language/stats/rank.q:249
+#: src/language/stats/rank.q:250
 msgid "Too many variables in INTO clause."
 msgstr ""
 
-#: src/language/stats/regression.q:145
+#: src/language/stats/regression.q:159
 msgid "R"
 msgstr ""
 
-#: src/language/stats/regression.q:146
+#: src/language/stats/regression.q:160
 msgid "R Square"
 msgstr ""
 
-#: src/language/stats/regression.q:147
+#: src/language/stats/regression.q:161
 msgid "Adjusted R Square"
 msgstr ""
 
-#: src/language/stats/regression.q:148
+#: src/language/stats/regression.q:162
 msgid "Std. Error of the Estimate"
 msgstr ""
 
-#: src/language/stats/regression.q:153
+#: src/language/stats/regression.q:167
 msgid "Model Summary"
 msgstr ""
 
-#: src/language/stats/regression.q:190
+#: src/language/stats/regression.q:204
 msgid "B"
 msgstr ""
 
-#: src/language/stats/regression.q:192
+#: src/language/stats/regression.q:206
 msgid "Beta"
 msgstr ""
 
-#: src/language/stats/regression.q:195
+#: src/language/stats/regression.q:209
 msgid "(Constant)"
 msgstr ""
 
-#: src/language/stats/regression.q:255
+#: src/language/stats/regression.q:269
 msgid "Coefficients"
 msgstr ""
 
-#: src/language/stats/regression.q:292
+#: src/language/stats/regression.q:306
 msgid "Regression"
 msgstr ""
 
-#: src/language/stats/regression.q:293
+#: src/language/stats/regression.q:307
 msgid "Residual"
 msgstr ""
 
-#: src/language/stats/regression.q:371
+#: src/language/stats/regression.q:385
 msgid "Model"
 msgstr ""
 
-#: src/language/stats/regression.q:372
+#: src/language/stats/regression.q:386
 msgid "Covariances"
 msgstr ""
 
-#: src/language/stats/regression.q:387
+#: src/language/stats/regression.q:401
 msgid "Coefficient Correlations"
 msgstr ""
 
-#: src/language/stats/regression.q:885
+#: src/language/stats/regression.q:1157
 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
-msgid "expecting filename"
+msgid "expecting file name"
 msgstr ""
 
 #: src/language/utilities/permissions.c:77
@@ -3976,26 +3983,12 @@ 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 ""
 
-#: 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 ""
@@ -4060,11 +4053,11 @@ 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 ""
 
-#: 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 ""
@@ -4106,43 +4099,13 @@ 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 ""
 
-#: 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\""
@@ -4210,70 +4173,70 @@ 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 ""
 
-#: 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 ""
 
-#: src/output/ascii.c:233
+#: src/output/ascii.c:232
 #, 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 ""
 
-#: src/output/ascii.c:292
+#: src/output/ascii.c:291
 #, 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 ""
 
-#: src/output/ascii.c:314
+#: src/output/ascii.c:313
 #, 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 ""
 
-#: src/output/ascii.c:353
+#: src/output/ascii.c:352
 #, 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/output/ascii.c:727
+#: src/output/ascii.c:726
 msgid "ascii: charts are unsupported by this driver"
 msgstr ""
 
@@ -4281,150 +4244,164 @@ msgstr ""
 msgid "HISTOGRAM"
 msgstr ""
 
-#: src/output/html.c:68
+#: src/output/html.c:66
 #, c-format
 msgid "opening HTML output file: %s"
 msgstr ""
 
-#: src/output/html.c:79
+#: src/output/html.c:77
 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 ""
 
-#: src/output/output.c:166
+#: src/output/output.c:165
 #, c-format
-msgid "Unknown output driver `%s'."
+msgid "unknown output driver `%s'"
 msgstr ""
 
-#: src/output/output.c:168
+#: src/output/output.c:167
 #, c-format
-msgid "Output driver `%s' referenced but never defined."
+msgid "output driver `%s' referenced but never defined"
 msgstr ""
 
 #: src/output/output.c:261
-msgid "Using default output driver configuration."
+msgid "using default output driver configuration"
 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 ""
 
-#: src/output/output.c:304 src/output/output.c:1067
+#: src/output/output.c:301
 #, c-format
-msgid "Opening %s: %s."
+msgid "cannot open \"%s\""
 msgstr ""
 
-#: src/output/output.c:315 src/output/output.c:1078
+#: src/output/output.c:313
 #, c-format
-msgid "Reading %s: %s."
+msgid "reading \"%s\""
 msgstr ""
 
-#: src/output/output.c:337 src/output/output.c:503
-msgid "Syntax error."
+#: src/output/output.c:335
+msgid "syntax error"
 msgstr ""
 
-#: src/output/output.c:347
+#: src/output/output.c:344
 #, c-format
-msgid "Closing %s: %s."
+msgid "error closing \"%s\""
 msgstr ""
 
-#: src/output/output.c:355
-msgid "No output drivers are active."
+#: src/output/output.c:352
+msgid "no active output drivers"
 msgstr ""
 
-#: src/output/output.c:358
-msgid "Error reading device definition file."
+#: src/output/output.c:355
+msgid "error reading device definition file"
 msgstr ""
 
-#: src/output/output.c:475
+#: src/output/output.c:472
 #, 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/output/output.c:698
+#: src/output/output.c:692
 #, c-format
-msgid "Unknown output driver class `%s'."
+msgid "unknown output driver class `%s'"
 msgstr ""
 
-#: src/output/output.c:719
+#: src/output/output.c:714
 #, c-format
-msgid "Unknown device type `%s'."
+msgid "unknown device type `%s'"
 msgstr ""
 
-#: src/output/output.c:738
+#: src/output/output.c:733
 #, c-format
-msgid "Can't initialize output driver `%s' of class `%s'."
+msgid "cannot initialize output driver `%s' of class `%s'"
 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 ""
 
-#: src/output/output.c:929
+#: src/output/output.c:926
 #, c-format
-msgid "Unit \"%s\" is unknown in dimension \"%s\"."
+msgid "unit \"%s\" is unknown in dimension \"%s\""
 msgstr ""
 
-#: src/output/output.c:944
+#: src/output/output.c:941
 #, c-format
-msgid "Bad dimension \"%s\"."
+msgid "bad dimension \"%s\""
 msgstr ""
 
-#: src/output/output.c:970
+#: src/output/output.c:967
 #, c-format
-msgid "`x' expected in paper size `%s'."
+msgid "`x' expected in paper size `%s'"
 msgstr ""
 
-#: src/output/output.c:980
+#: src/output/output.c:977
 #, c-format
-msgid "Trailing garbage `%s' on paper size `%s'."
+msgid "trailing garbage `%s' on paper size `%s'"
 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 ""
 
-#: src/output/output.c:1060
-msgid "Cannot find `papersize' configuration file."
+#: src/output/output.c:1039
+msgid "cannot find `papersize' configuration file"
 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 ""
 
-#: src/output/output.c:1134
-msgid "Error reading paper size definition file."
+#: src/output/output.c:1057
+#, c-format
+msgid "error reading \"%s\""
 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 ""
 
-#: 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, "
@@ -4432,87 +4409,87 @@ msgid ""
 "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 ""
 
-#: src/output/postscript.c:310
+#: src/output/postscript.c:309
 #, 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 ""
 
-#: src/output/postscript.c:338
+#: src/output/postscript.c:337
 #, 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 ""
 
-#: 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 ""
 
-#: 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 ""
 
-#: src/output/postscript.c:1182
+#: src/output/postscript.c:1181
 #, 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 ""
 
-#: src/output/postscript.c:1204
+#: src/output/postscript.c:1203
 #, 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 ""
 
-#: src/output/postscript.c:1313
+#: src/output/postscript.c:1312
 #, 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 ""
 
-#: src/output/postscript.c:1376
+#: src/output/postscript.c:1375
 #, 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 ""
 
-#: 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 ""
 
-#: 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"
@@ -4550,26 +4527,18 @@ msgstr ""
 msgid "Font Selection"
 msgstr ""
 
-#: src/ui/gui/message-dialog.c:78
+#: src/ui/gui/message-dialog.c:75
 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 ""
 
-#: src/ui/gui/message-dialog.c:95
+#: src/ui/gui/message-dialog.c:84
 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 ""
@@ -4658,7 +4627,7 @@ 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"
@@ -4703,39 +4672,15 @@ msgid ""
 "\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 ""
 
-#: 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 ""
-"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 ""
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
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
index c9e93cc9ed258ee25125cdd7703fed937f909832..b842084eada0b00f33b2b0ce2d8d0b1113108aec 100644 (file)
    02110-1301, USA. */
 
 #include <config.h>
-#include <libpspp/message.h>
+
 #include <language/command.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 <data/dictionary.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 <output/manager.h>
 #include <output/table.h>
-#include <data/variable.h>
 #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
-/* 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
-/* 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
   {
+    enum states states;         /* States in which command is allowed. */
+    enum flags flags;           /* Other command requirements. */
     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 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"
   };
-#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);
+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;
 
-  /* 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. */
-  cp = parse_command_name ();
-  if (cp == NULL)
+  command = parse_command_name ();
+  if (command == NULL)
     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
@@ -349,11 +262,11 @@ conflicting_3char_prefixes (const char *a, const char *b)
 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))
-          || (cmd < commands + COMMAND_CNT
+          || (cmd < commands + command_cnt
               && 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;
-  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++; 
 
@@ -462,13 +375,26 @@ get_complete_match (char *const words[], size_t word_cnt)
 {
   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;
 }
 
+/* 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) 
@@ -484,29 +410,27 @@ free_words (char *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. */
@@ -518,6 +442,9 @@ parse_command_name (void)
   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 == '-')) 
@@ -525,11 +452,13 @@ parse_command_name (void)
       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 ("-");
-      str_uppercase (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) 
             {
-              if (command->skip_entire_name)
+              if (!(command->flags & F_KEEP_FINAL_TOKEN))
                 lex_get ();
-             if ( command->debug & !get_testing_mode () ) 
-               goto error;
               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;
-      if (!command->skip_entire_name)
+      if (command->flags & F_KEEP_FINAL_TOKEN)
         pushback_word_cnt--;
       
       /* FIXME: We only support one-token pushback. */
@@ -588,18 +515,112 @@ parse_command_name (void)
           free (words[word_cnt]);
         }
 
-      if ( command->debug && !get_testing_mode () ) 
-       goto error;
-
       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;
 }
+
+/* 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. */
 
@@ -607,7 +628,7 @@ error:
 int
 cmd_finish (void)
 {
-  return CMD_EOF;
+  return CMD_QUIT;
 }
 
 /* Parses the N command. */
@@ -756,7 +777,7 @@ run_command (void)
       if (token != '.')
        {
          lex_error (_("expecting end of command"));
-         return CMD_TRAILING_GARBAGE;
+         return CMD_FAILURE;
        }
     }
   else
@@ -783,7 +804,7 @@ cmd_host (void)
   if (lex_look_ahead () == '.')
     {
       lex_get ();
-      code = shell () ? CMD_PART_SUCCESS_MAYBE : CMD_SUCCESS;
+      code = shell () ? CMD_FAILURE : CMD_SUCCESS;
     }
   else
     code = run_command ();
@@ -821,3 +842,11 @@ cmd_clear_transformations (void)
 
   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.
-   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
    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.
-   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
    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. */
-enum
+enum cmd_result
   {
     /* 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_NOT_IMPLEMENTED,        /* Command not implemented. */
     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. */
-#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"
-#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;
-  return ok ? CMD_SUCCESS : CMD_PART_SUCCESS;
+  return ok ? CMD_SUCCESS : CMD_FAILURE;
 }
 
 /* Parses END LOOP. */
@@ -141,7 +141,7 @@ cmd_end_loop (void)
 
   ctl_stack_pop (loop);
   
-  return ok ? CMD_SUCCESS : CMD_PART_SUCCESS;
+  return ok ? CMD_SUCCESS : CMD_FAILURE;
 }
 
 /* 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.
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/file-type.h \
        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 \
index 6002b1e91857e5e8787a176daadb812977a4d0c3..3a6f807c00f63a4b11af204da886b27fcd59b9f8 100644 (file)
    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 <libpspp/alloc.h>
+
 #include <data/case.h>
-#include <language/command.h>
-#include <libpspp/compiler.h>
 #include <data/data-in.h>
-#include <language/data-io/data-reader.h>
 #include <data/dictionary.h>
-#include <libpspp/message.h>
-#include <language/data-io/file-handle.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 <libpspp/alloc.h>
+#include <libpspp/compiler.h>
+#include <libpspp/message.h>
+#include <libpspp/message.h>
 #include <libpspp/misc.h>
-#include <data/settings.h>
 #include <libpspp/str.h>
 #include <output/table.h>
-#include <data/variable.h>
 #include <procedure.h>
 
-#include "data-list.h"
-
 #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 ();
 
-  if (!case_source_is_complex (vfm_source))
+  if (!in_input_program () && !in_file_type ())
     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;
-         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."));
@@ -542,7 +545,7 @@ fixed_parse_compatible (struct fixed_parsing_state *fx,
        {
          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
@@ -650,7 +653,7 @@ dump_fmt_list (struct fixed_parsing_state *fx, struct fmt_list *f,
                return 0;
              }
            
-            if (!case_source_is_complex (vfm_source))
+            if (!in_input_program () && !in_file_type ())
               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;
 
-          if (!case_source_is_complex (vfm_source))
+          if (!in_input_program () && !in_file_type ())
             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 ();
   
-  assert (case_source_is_complex (vfm_source));
+  assert (in_input_program () || in_file_type ());
 
   rpd = xmalloc (sizeof *rpd);
   rpd->reader = dfm_open_reader (fh);
index 99a5d050d21c5757fe521b4d47311b23eea762e6..4633c7c00ba23518b437bbd5ddf233f2d92b5a64 100644 (file)
    02110-1301, USA. */
 
 #include <config.h>
+
+#include <language/data-io/file-type.h>
+
 #include <stdlib.h>
-#include <libpspp/alloc.h>
+
 #include <data/case.h>
-#include <language/command.h>
-#include <libpspp/compiler.h>
 #include <data/data-in.h>
-#include <language/data-io/data-reader.h>
 #include <data/dictionary.h>
-#include <libpspp/message.h>
-#include <language/data-io/file-handle.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 <libpspp/alloc.h>
+#include <libpspp/compiler.h>
+#include <libpspp/message.h>
 #include <libpspp/str.h>
-#include <data/variable.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 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);
 
@@ -390,15 +405,6 @@ cmd_record_type (void)
   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. */
@@ -580,13 +586,6 @@ cmd_end_file_type (void)
 {
   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);
 
@@ -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,
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;
 
-          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."));
index 1fcf0f0963a66780df88498ff89d84a6f66fe41a..abda6c930691ce1ddfec33447149d154200e8b56 100644 (file)
    02110-1301, USA. */
 
 #include <config.h>
-#include <libpspp/message.h>
+
+#include <language/data-io/inpt-pgm.h>
+
 #include <float.h>
 #include <stdlib.h>
-#include <libpspp/alloc.h>
+
 #include <data/case.h>
+#include <data/dictionary.h>
+#include <data/variable.h>
 #include <language/command.h>
-#include <libpspp/compiler.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/expressions/public.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 <data/variable.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 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
-cmd_end_input_program (void)
+cmd_input_program (void)
 {
   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 "
-        "between INPUT PROGRAM and END INPUT PROGRAM."));
+               "between INPUT PROGRAM and END INPUT PROGRAM."));
 
   /* 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);
 
-  /* 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. */
@@ -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,
@@ -285,13 +311,7 @@ const struct case_source_class input_program_source_class =
 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 ();
@@ -404,12 +424,7 @@ reread_trns_free (void *t_)
 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);
 
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))
-       return CMD_PART_SUCCESS_MAYBE;
+       return CMD_FAILURE;
       type = v[0]->type;
 
       if (!lex_match ('('))
@@ -112,5 +112,5 @@ internal_cmd_formats (int which)
 
 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;
 
-  int retval = CMD_PART_SUCCESS_MAYBE;
+  int retval = CMD_FAILURE;
   bool deferred_errors = false;
 
   while (token != '.')
@@ -147,7 +147,7 @@ cmd_missing_values (void)
  done:
   free (v);
   if (deferred_errors)
-    retval = CMD_PART_SUCCESS_MAYBE;
+    retval = CMD_FAILURE;
   return retval;
 }
 
index 3e3d7651dbe83b73e244ec9f822805fb1f891900..0cc3adb984db22ba44d7ee8462dd5c23e104e25a 100644 (file)
@@ -47,7 +47,7 @@ cmd_numeric (void)
   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 ('('))
@@ -98,7 +98,7 @@ fail:
   for (i = 0; i < nv; i++)
     free (v[i]);
   free (v);
-  return CMD_PART_SUCCESS_MAYBE;
+  return CMD_FAILURE;
 }
 
 /* Parses the STRING command. */
@@ -120,7 +120,7 @@ cmd_string (void)
   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))
@@ -177,7 +177,7 @@ fail:
   for (i = 0; i < nv; i++)
     free (v[i]);
   free (v);
-  return CMD_PART_SUCCESS_MAYBE;
+  return CMD_FAILURE;
 }
 
 /* Parses the LEAVE command. */
index 976d54790965ff26ab6598216ea9de72ecb9ca00..8479fe7fa74218feeb0c462aed2e86fa1c5df692 100644 (file)
@@ -92,17 +92,14 @@ do_value_labels (int erase)
       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);
-  return CMD_PART_SUCCESS_MAYBE;
+  return CMD_FAILURE;
 }
 
 /* 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))
-        return CMD_PART_SUCCESS_MAYBE;
+        return CMD_FAILURE;
 
       if ( lex_force_match('(') ) 
        {
@@ -95,7 +95,7 @@ cmd_variable_width (void)
       size_t i;
 
       if (!parse_variables (default_dict, &v, &nv, PV_NONE))
-        return CMD_PART_SUCCESS_MAYBE;
+        return CMD_FAILURE;
 
       if ( lex_force_match('(') ) 
        {
@@ -130,7 +130,7 @@ cmd_variable_level (void)
       size_t i;
 
       if (!parse_variables (default_dict, &v, &nv, PV_NONE))
-        return CMD_PART_SUCCESS_MAYBE;
+        return CMD_FAILURE;
 
       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))
-        return CMD_PART_SUCCESS_MAYBE;
+        return CMD_FAILURE;
 
       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)
        {
index 20cb5f849992c5f4bad7c1cc905dfd6c79431f7c..7553ba2c86f193f99d9b5961e0303c3c703b19c0 100644 (file)
@@ -201,5 +201,5 @@ cmd_vector (void)
 
 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
index 3d2e29ac92aac6ca2bfd51aa9edfd1caccae7753..4cb3f593095f5c9f4c18d82a0e54a53ccbfbb0b0 100644 (file)
@@ -451,7 +451,7 @@ lex_end_of_command (void)
   if (token != '.')
     {
       lex_error (_("expecting end of command"));
-      return CMD_TRAILING_GARBAGE;
+      return CMD_FAILURE;
     }
   else
     return CMD_SUCCESS;
@@ -736,6 +736,25 @@ lex_set_prog (char *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. */
 
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);
+void lex_discard_rest_of_command (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);
-          return CMD_PART_SUCCESS_MAYBE;
+          return CMD_FAILURE;
 
         found: ;
         }
       else 
         {
           lex_error (NULL);
-          return CMD_PART_SUCCESS_MAYBE;
+          return CMD_FAILURE;
         }
 
       lex_match ('/');
index d2548f31dc7361c66cf0de3f1486a96f45fed182..b89071a3f3ff11b88bda381f339a9c8c576fae63 100644 (file)
@@ -139,7 +139,7 @@ cmd_recode (void)
           || !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
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,
@@ -1012,6 +1004,4 @@ discard_variables (void)
   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 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 *);
 
-int case_source_is_complex (const struct case_source *);
 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
index 328c546dff266120847904cd57f1b1f9a2f35712..c137714672f96a9effcc218ca203e32fce0d51ec 100644 (file)
@@ -19,6 +19,7 @@ src_ui_terminal_pspp_SOURCES = \
        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 \
@@ -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/ui/terminal/libui.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 "procedure.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 handle_error (int code);
 static int execute_command (void);
 static void terminate (bool success) NO_RETURN;
 
@@ -103,27 +103,27 @@ main (int argc, char **argv)
 
       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;
-          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 ());
 }
 
-/* Parse and execute a command, returning its return code. */
+/* Parses a command and returns the result. */
 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);
@@ -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);
-  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
index 2a0bfd5e2be55ca584ef6c6c2f1088a5a90d22c7..a89a953b5d0b06c5d5a5b41ecd65c516d4235793 100644 (file)
@@ -56,8 +56,9 @@ readln_initialize (void)
 {
   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)
     {
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.
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.
-$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: 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: warning: Skipping the rest of this command.  Part of this command may have been executed.
 EOF
 if [ $? -ne 0 ] ; then fail ; fi