Committed patch #5636
authorJohn Darrington <john@darrington.wattle.id.au>
Sat, 16 Dec 2006 03:40:41 +0000 (03:40 +0000)
committerJohn Darrington <john@darrington.wattle.id.au>
Sat, 16 Dec 2006 03:40:41 +0000 (03:40 +0000)
32 files changed:
po/de.po
src/data/ChangeLog
src/data/dictionary.c
src/data/dictionary.h
src/data/missing-values.c
src/data/missing-values.h
src/data/procedure.h
src/data/value-labels.c
src/data/vardict.h
src/data/variable.c
src/language/expressions/evaluate.c
src/language/stats/aggregate.c
src/ui/gui/ChangeLog
src/ui/gui/automake.mk
src/ui/gui/data-sheet.c
src/ui/gui/menu-actions.c
src/ui/gui/missing-val-dialog.c
src/ui/gui/missing-val-dialog.h
src/ui/gui/psppire-data-store.c
src/ui/gui/psppire-dict.c
src/ui/gui/psppire-dict.h
src/ui/gui/psppire-var-store.c
src/ui/gui/psppire-var-store.h
src/ui/gui/psppire-variable.c [deleted file]
src/ui/gui/psppire-variable.h [deleted file]
src/ui/gui/sort-cases-dialog.c
src/ui/gui/val-labs-dialog.c
src/ui/gui/val-labs-dialog.h
src/ui/gui/var-sheet.c
src/ui/gui/var-type-dialog.c
src/ui/gui/var-type-dialog.h
src/ui/terminal/main.c

index 0d96640b9abaca9c433ddbb12c89fc14de02dccb..972fcfb9c40bd10ae1feedec2f45444bc84adeab 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PSPP 0.4.2\n"
 "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
-"POT-Creation-Date: 2006-12-14 19:01+0900\n"
+"POT-Creation-Date: 2006-12-16 11:13+0900\n"
 "PO-Revision-Date: 2006-05-26 17:49+0800\n"
 "Last-Translator: John Darrington <john@darrington.wattle.id.au>\n"
 "Language-Team: German <pspp-dev@gnu.org>\n"
@@ -18,17 +18,17 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: src/data/any-reader.c:75
+#: src/data/any-reader.c:74
 #, c-format
 msgid "An error occurred while opening \"%s\": %s."
 msgstr "Ein Fehler ist passiert als \\\"%s\\\" geoffnet war: %s"
 
-#: src/data/any-reader.c:130
+#: src/data/any-reader.c:129
 #, c-format
 msgid "\"%s\" is not a system or portable file."
 msgstr "\"%s\" ist kein Systemdatei und kein Tragbardatei."
 
-#: src/data/any-reader.c:136 src/data/any-writer.c:81
+#: src/data/any-reader.c:135 src/data/any-writer.c:80
 msgid "The inline file is not allowed here."
 msgstr "Diese Inlindatei ist hier verboten."
 
@@ -47,233 +47,233 @@ msgstr "Tag %d muß zwischen 0 bit 31 sein."
 msgid "Date %04d-%d-%d is before the earliest acceptable date of 1582-10-15."
 msgstr ""
 
-#: src/data/data-in.c:272 src/data/data-in.c:462
+#: src/data/data-in.c:271 src/data/data-in.c:461
 msgid "Field contents are not numeric."
 msgstr ""
 
-#: src/data/data-in.c:274 src/data/data-in.c:464
+#: src/data/data-in.c:273 src/data/data-in.c:463
 msgid "Number followed by garbage."
 msgstr ""
 
-#: src/data/data-in.c:285
+#: src/data/data-in.c:284
 msgid "Invalid numeric syntax."
 msgstr ""
 
-#: src/data/data-in.c:294 src/data/data-in.c:477
+#: src/data/data-in.c:293 src/data/data-in.c:476
 msgid "Too-large number set to system-missing."
 msgstr ""
 
-#: src/data/data-in.c:299 src/data/data-in.c:482
+#: src/data/data-in.c:298 src/data/data-in.c:481
 msgid "Too-small number set to zero."
 msgstr ""
 
-#: src/data/data-in.c:325
+#: src/data/data-in.c:324
 msgid "All characters in field must be digits."
 msgstr ""
 
-#: src/data/data-in.c:348
+#: src/data/data-in.c:347
 msgid "Unrecognized character in field."
 msgstr ""
 
-#: src/data/data-in.c:372 src/data/data-in.c:636
+#: src/data/data-in.c:371 src/data/data-in.c:635
 msgid "Field must have even length."
 msgstr ""
 
-#: src/data/data-in.c:377 src/data/data-in.c:642
+#: src/data/data-in.c:376 src/data/data-in.c:641
 msgid "Field must contain only hex digits."
 msgstr ""
 
-#: src/data/data-in.c:681 src/data/data-in.c:728
+#: src/data/data-in.c:680 src/data/data-in.c:727
 msgid "Syntax error in date field."
 msgstr ""
 
-#: src/data/data-in.c:697
+#: src/data/data-in.c:696
 #, c-format
 msgid "Day (%ld) must be between 1 and 31."
 msgstr ""
 
-#: src/data/data-in.c:744
+#: src/data/data-in.c:743
 msgid "Delimiter expected between fields in date."
 msgstr ""
 
-#: src/data/data-in.c:818
+#: src/data/data-in.c:817
 msgid ""
 "Unrecognized month format.  Months may be specified as Arabic or Roman "
 "numerals or as at least 3 letters of their English names."
 msgstr ""
 
-#: src/data/data-in.c:845
+#: src/data/data-in.c:844
 #, c-format
 msgid "Year (%ld) must be between 1582 and 19999."
 msgstr ""
 
-#: src/data/data-in.c:857
+#: src/data/data-in.c:856
 #, c-format
 msgid "Trailing garbage \"%.*s\" following date."
 msgstr ""
 
-#: src/data/data-in.c:873
+#: src/data/data-in.c:872
 msgid "Julian day must have exactly three digits."
 msgstr ""
 
-#: src/data/data-in.c:878
+#: src/data/data-in.c:877
 #, c-format
 msgid "Julian day (%ld) must be between 1 and 366."
 msgstr ""
 
-#: src/data/data-in.c:902
+#: src/data/data-in.c:901
 #, c-format
 msgid "Quarter (%ld) must be between 1 and 4."
 msgstr ""
 
-#: src/data/data-in.c:922
+#: src/data/data-in.c:921
 #, c-format
 msgid "Week (%ld) must be between 1 and 53."
 msgstr ""
 
-#: src/data/data-in.c:935
+#: src/data/data-in.c:934
 msgid "Delimiter expected between fields in time."
 msgstr ""
 
-#: src/data/data-in.c:955
+#: src/data/data-in.c:954
 #, c-format
 msgid "Minute (%ld) must be between 0 and 59."
 msgstr ""
 
-#: src/data/data-in.c:995
+#: src/data/data-in.c:994
 msgid ""
 "Unrecognized weekday name.  At least the first two letters of an English "
 "weekday name must be specified."
 msgstr ""
 
-#: src/data/data-in.c:1133
+#: src/data/data-in.c:1132
 #, fuzzy, c-format
 msgid "`%c' expected in date field."
 msgstr "plotzlich ist der Datei beendet"
 
-#: src/data/data-in.c:1174
+#: src/data/data-in.c:1173
 #, fuzzy, c-format
 msgid "column %d"
 msgstr "Spalten"
 
-#: src/data/data-in.c:1176
+#: src/data/data-in.c:1175
 #, fuzzy, c-format
 msgid "columns %d-%d"
 msgstr "Spalten"
 
-#: src/data/data-in.c:1180
+#: src/data/data-in.c:1179
 #, c-format
 msgid "%s field) "
 msgstr ""
 
-#: src/data/data-out.c:470
+#: src/data/data-out.c:469
 #, c-format
 msgid "Weekday number %f is not between 1 and 7."
 msgstr ""
 
-#: src/data/data-out.c:491
+#: src/data/data-out.c:490
 #, c-format
 msgid "Month number %f is not between 1 and 12."
 msgstr ""
 
-#: src/data/dictionary.c:676
+#: src/data/dictionary.c:700
 msgid ""
 "At least one case in the data file had a weight value that was user-missing, "
 "system-missing, zero, or negative.  These case(s) were ignored."
 msgstr ""
 
-#: src/data/dictionary.c:1156
+#: src/data/dictionary.c:1180
 msgid "Variable suffix too large."
 msgstr ""
 
-#: src/data/fastfile.c:536
+#: src/data/fastfile.c:535
 #, c-format
 msgid "%s: Removing temporary file: %s."
 msgstr ""
 
-#: src/data/fastfile.c:660
+#: src/data/fastfile.c:659
 #, c-format
 msgid "Error writing temporary file: %s."
 msgstr ""
 
-#: src/data/fastfile.c:688
+#: src/data/fastfile.c:687
 #, c-format
 msgid "%s: Opening temporary file: %s."
 msgstr ""
 
-#: src/data/fastfile.c:732
+#: src/data/fastfile.c:731
 #, c-format
 msgid "%s: Seeking temporary file: %s."
 msgstr ""
 
-#: src/data/fastfile.c:754
+#: src/data/fastfile.c:753
 #, c-format
 msgid "%s: Reading temporary file: %s."
 msgstr ""
 
-#: src/data/fastfile.c:757
+#: src/data/fastfile.c:756
 #, c-format
 msgid "%s: Temporary file ended unexpectedly."
 msgstr ""
 
-#: src/data/file-handle-def.c:304
+#: src/data/file-handle-def.c:303
 #, c-format
 msgid "Can't open %s as a %s because it is already open as a %s."
 msgstr ""
 
-#: src/data/file-handle-def.c:311
+#: src/data/file-handle-def.c:310
 #, c-format
 msgid "Can't open %s as a %s for %s because it is already open for %s."
 msgstr ""
 
-#: src/data/file-handle-def.c:319
+#: src/data/file-handle-def.c:318
 #, c-format
 msgid "Can't re-open %s as a %s for %s."
 msgstr ""
 
-#: src/data/file-name.c:194
+#: src/data/file-name.c:193
 #, c-format
 msgid "searching for \"%s\" in path \"%s\""
 msgstr ""
 
-#: src/data/file-name.c:220
+#: src/data/file-name.c:219
 #, c-format
 msgid "...found \"%s\""
 msgstr ""
 
-#: src/data/file-name.c:227
+#: src/data/file-name.c:226
 msgid "...not found"
 msgstr ""
 
-#: src/data/file-name.c:579
+#: src/data/file-name.c:578
 #, c-format
 msgid "Not opening pipe file `%s' because SAFER option set."
 msgstr ""
 
-#: src/data/format.c:219
+#: src/data/format.c:218
 msgid "Input format"
 msgstr ""
 
-#: src/data/format.c:219
+#: src/data/format.c:218
 msgid "Output format"
 msgstr ""
 
-#: src/data/format.c:228
+#: src/data/format.c:227
 #, c-format
 msgid "Format %s may not be used for input."
 msgstr ""
 
-#: src/data/format.c:235
+#: src/data/format.c:234
 #, c-format
 msgid "%s specifies width %d, but %s requires an even width."
 msgstr ""
 
-#: src/data/format.c:244
+#: src/data/format.c:243
 #, c-format
 msgid "%s %s specifies width %d, but %s requires a width between %d and %d."
 msgstr ""
 
-#: src/data/format.c:253
+#: src/data/format.c:252
 #, c-format
 msgid "%s %s specifies %d decimal place, but %s does not allow any decimals."
 msgid_plural ""
@@ -281,7 +281,7 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/data/format.c:264
+#: src/data/format.c:263
 #, c-format
 msgid ""
 "%s %s specifies %d decimal place, but the given width allows at most %d "
@@ -292,7 +292,7 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/data/format.c:271
+#: src/data/format.c:270
 #, c-format
 msgid ""
 "%s %s specifies %d decimal place, but the given width does not allow for any "
@@ -303,485 +303,485 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/data/format.c:310
+#: src/data/format.c:309
 #, c-format
 msgid "%s variables are not compatible with %s format %s."
 msgstr ""
 
-#: src/data/format.c:311 src/data/por-file-reader.c:490
-#: src/data/sys-file-reader.c:603 src/ui/gui/psppire.glade:1227
-#: src/ui/gui/psppire-var-store.c:451
+#: src/data/format.c:310 src/data/por-file-reader.c:489
+#: src/data/sys-file-reader.c:602 src/ui/gui/psppire.glade:1227
+#: src/ui/gui/psppire-var-store.c:484
 msgid "String"
 msgstr "Zeichenkette"
 
-#: src/data/format.c:311 src/data/por-file-reader.c:490
-#: src/data/sys-file-reader.c:603 src/ui/gui/psppire.glade:1088
-#: src/ui/gui/psppire-var-store.c:444
+#: src/data/format.c:310 src/data/por-file-reader.c:489
+#: src/data/sys-file-reader.c:602 src/ui/gui/psppire.glade:1088
+#: src/ui/gui/psppire-var-store.c:477
 msgid "Numeric"
 msgstr "Nummer"
 
-#: src/data/format.c:312 src/data/sys-file-reader.c:1023
-#: src/data/sys-file-reader.c:1025
+#: src/data/format.c:311 src/data/sys-file-reader.c:1022
+#: src/data/sys-file-reader.c:1024
+#: src/language/dictionary/apply-dictionary.c:77
 #: src/language/dictionary/apply-dictionary.c:78
-#: src/language/dictionary/apply-dictionary.c:79
-#: src/language/xforms/recode.c:468 src/language/xforms/recode.c:469
-#: src/language/xforms/recode.c:481 src/language/xforms/recode.c:482
+#: src/language/xforms/recode.c:467 src/language/xforms/recode.c:468
+#: src/language/xforms/recode.c:480 src/language/xforms/recode.c:481
 msgid "numeric"
 msgstr "numerisch"
 
-#: src/data/format.c:312 src/data/sys-file-reader.c:1023
-#: src/data/sys-file-reader.c:1025
+#: src/data/format.c:311 src/data/sys-file-reader.c:1022
+#: src/data/sys-file-reader.c:1024
+#: src/language/dictionary/apply-dictionary.c:77
 #: src/language/dictionary/apply-dictionary.c:78
-#: src/language/dictionary/apply-dictionary.c:79
-#: src/language/xforms/recode.c:468 src/language/xforms/recode.c:469
-#: src/language/xforms/recode.c:481 src/language/xforms/recode.c:482
+#: src/language/xforms/recode.c:467 src/language/xforms/recode.c:468
+#: src/language/xforms/recode.c:480 src/language/xforms/recode.c:481
 msgid "string"
 msgstr "kette"
 
-#: src/data/format.c:330
+#: src/data/format.c:329
 #, c-format
 msgid "String variable with width %d is not compatible with format %s."
 msgstr ""
 
-#: src/data/make-file.c:60
+#: src/data/make-file.c:59
 #, c-format
 msgid "%s: Creating temporary file: %s."
 msgstr ""
 
-#: src/data/make-file.c:102
+#: src/data/make-file.c:101
 #, c-format
 msgid "%s: Creating file: %s."
 msgstr ""
 
-#: src/data/por-file-reader.c:94
+#: src/data/por-file-reader.c:93
 #, c-format
 msgid "portable file %s corrupt at offset %ld: "
 msgstr ""
 
-#: src/data/por-file-reader.c:130
+#: src/data/por-file-reader.c:129
 msgid "unexpected end of file"
 msgstr "plotzlich ist der Datei beendet"
 
-#: src/data/por-file-reader.c:189
+#: src/data/por-file-reader.c:188
 #, c-format
 msgid ""
 "An error occurred while opening \"%s\" for reading as a portable file: %s."
 msgstr ""
 
-#: src/data/por-file-reader.c:206
+#: src/data/por-file-reader.c:205
 msgid "Data record expected."
 msgstr ""
 
-#: src/data/por-file-reader.c:314
+#: src/data/por-file-reader.c:313
 msgid "Missing numeric terminator."
 msgstr ""
 
-#: src/data/por-file-reader.c:337
+#: src/data/por-file-reader.c:336
 msgid "Invalid integer."
 msgstr ""
 
-#: src/data/por-file-reader.c:348
+#: src/data/por-file-reader.c:347
 #, c-format
 msgid "Bad string length %d."
 msgstr ""
 
-#: src/data/por-file-reader.c:409
+#: src/data/por-file-reader.c:408
 #, c-format
 msgid "%s: Not a portable file."
 msgstr ""
 
-#: src/data/por-file-reader.c:434
+#: src/data/por-file-reader.c:433
 #, c-format
 msgid "Bad date string length %d."
 msgstr ""
 
-#: src/data/por-file-reader.c:436
+#: src/data/por-file-reader.c:435
 #, c-format
 msgid "Bad time string length %d."
 msgstr ""
 
-#: src/data/por-file-reader.c:476
+#: src/data/por-file-reader.c:475
 #, c-format
 msgid "%s: Bad format specifier byte (%d)."
 msgstr ""
 
-#: src/data/por-file-reader.c:489
+#: src/data/por-file-reader.c:488
 #, c-format
 msgid "%s variable %s has invalid format specifier %s."
 msgstr ""
 
-#: src/data/por-file-reader.c:508
+#: src/data/por-file-reader.c:507
 msgid "Expected variable count record."
 msgstr ""
 
-#: src/data/por-file-reader.c:512
+#: src/data/por-file-reader.c:511
 #, c-format
 msgid "Invalid number of variables %d."
 msgstr ""
 
-#: src/data/por-file-reader.c:522
+#: src/data/por-file-reader.c:521
 #, c-format
 msgid "Weight variable name (%s) truncated."
 msgstr ""
 
-#: src/data/por-file-reader.c:536
+#: src/data/por-file-reader.c:535
 msgid "Expected variable record."
 msgstr ""
 
-#: src/data/por-file-reader.c:540
+#: src/data/por-file-reader.c:539
 #, c-format
 msgid "Invalid variable width %d."
 msgstr ""
 
-#: src/data/por-file-reader.c:548
+#: src/data/por-file-reader.c:547
 #, c-format
 msgid "position %d: Invalid variable name `%s'."
 msgstr ""
 
-#: src/data/por-file-reader.c:556 src/language/expressions/evaluate.c:170
+#: src/data/por-file-reader.c:555 src/language/expressions/evaluate.c:169
 #, c-format
 msgid "Duplicate variable name %s."
 msgstr ""
 
-#: src/data/por-file-reader.c:597
+#: src/data/por-file-reader.c:596
 #, c-format
 msgid "Weighting variable %s not present in dictionary."
 msgstr ""
 
-#: src/data/por-file-reader.c:644
+#: src/data/por-file-reader.c:643
 #, c-format
 msgid "Unknown variable %s while parsing value labels."
 msgstr ""
 
-#: src/data/por-file-reader.c:647
+#: src/data/por-file-reader.c:646
 #, c-format
 msgid ""
 "Cannot assign value labels to %s and %s, which have different variable types "
 "or widths."
 msgstr ""
 
-#: src/data/por-file-reader.c:671
+#: src/data/por-file-reader.c:670
 #, c-format
 msgid "Duplicate label for value %g for variable %s."
 msgstr ""
 
-#: src/data/por-file-reader.c:674
+#: src/data/por-file-reader.c:673
 #, c-format
 msgid "Duplicate label for value `%.*s' for variable %s."
 msgstr ""
 
-#: src/data/por-file-writer.c:147
+#: src/data/por-file-writer.c:146
 #, c-format
 msgid "Invalid decimal digits count %d.  Treating as %d."
 msgstr ""
 
-#: src/data/por-file-writer.c:167
+#: src/data/por-file-writer.c:166
 #, c-format
 msgid ""
 "An error occurred while opening \"%s\" for writing as a portable file: %s."
 msgstr ""
 
-#: src/data/por-file-writer.c:452
+#: src/data/por-file-writer.c:451
 #, c-format
 msgid "An I/O error occurred writing portable file \"%s\"."
 msgstr ""
 
-#: src/data/scratch-reader.c:64
+#: src/data/scratch-reader.c:63
 #, c-format
 msgid ""
 "Scratch file handle %s has not yet been written, using SAVE or another "
 "procedure, so it cannot yet be used for reading."
 msgstr ""
 
-#: src/data/settings.c:136
+#: src/data/settings.c:135
 #, c-format
 msgid "Could not access definition for terminal `%s'."
 msgstr ""
 
-#: src/data/sys-file-reader.c:208
+#: src/data/sys-file-reader.c:207
 #, c-format
 msgid "Error opening \"%s\" for reading as a system file: %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:238
+#: src/data/sys-file-reader.c:237
 msgid "Misplaced type 4 record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:249
+#: src/data/sys-file-reader.c:248
 #, c-format
 msgid "Unrecognized record type %d."
 msgstr ""
 
-#: src/data/sys-file-reader.c:258
+#: src/data/sys-file-reader.c:257
 #, c-format
 msgid "File header claims %d variable positions but %d were read from file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:290
+#: src/data/sys-file-reader.c:289
 #, c-format
 msgid "Error closing system file \"%s\": %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:350 src/data/sys-file-reader.c:360
+#: src/data/sys-file-reader.c:349 src/data/sys-file-reader.c:359
 #, fuzzy
 msgid "This is not an SPSS system file."
 msgstr "\"%s\" ist kein Systemdatei und kein Tragbardatei."
 
-#: src/data/sys-file-reader.c:378
+#: src/data/sys-file-reader.c:377
 #, c-format
 msgid ""
 "Compression bias (%g) is not the usual value of 100, or system file uses "
 "unrecognized floating-point format."
 msgstr ""
 
-#: src/data/sys-file-reader.c:452
+#: src/data/sys-file-reader.c:451
 #, c-format
 msgid "Invalid variable name `%s'."
 msgstr ""
 
-#: src/data/sys-file-reader.c:456
+#: src/data/sys-file-reader.c:455
 #, c-format
 msgid "Bad variable width %d."
 msgstr ""
 
-#: src/data/sys-file-reader.c:460
+#: src/data/sys-file-reader.c:459
 #, c-format
 msgid "Duplicate variable name `%s' within system file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:468
+#: src/data/sys-file-reader.c:467
 msgid "Variable label indicator field is not 0 or 1."
 msgstr ""
 
-#: src/data/sys-file-reader.c:476
+#: src/data/sys-file-reader.c:475
 #, c-format
 msgid "Variable %s has label of invalid length %d."
 msgstr ""
 
-#: src/data/sys-file-reader.c:487
+#: src/data/sys-file-reader.c:486
 msgid "Missing value indicator field is not -3, -2, 0, 1, 2, or 3."
 msgstr ""
 
-#: src/data/sys-file-reader.c:523
+#: src/data/sys-file-reader.c:522
 #, c-format
 msgid "String variable %s may not have missing values specified as a range."
 msgstr ""
 
-#: src/data/sys-file-reader.c:528
+#: src/data/sys-file-reader.c:527
 #, c-format
 msgid "Long string variable %s may not have missing values."
 msgstr ""
 
-#: src/data/sys-file-reader.c:550
+#: src/data/sys-file-reader.c:549
 msgid "Missing string continuation record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:584
+#: src/data/sys-file-reader.c:583
 #, c-format
 msgid "Unknown variable format %d."
 msgstr ""
 
-#: src/data/sys-file-reader.c:602
+#: src/data/sys-file-reader.c:601
 #, c-format
 msgid "%s variable %s has invalid %s format %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:605
+#: src/data/sys-file-reader.c:604
 #, fuzzy
 msgid "print"
 msgstr "Drucken"
 
-#: src/data/sys-file-reader.c:605
+#: src/data/sys-file-reader.c:604
 #, fuzzy
 msgid "write"
 msgstr "Drucken"
 
-#: src/data/sys-file-reader.c:609
+#: src/data/sys-file-reader.c:608
 msgid "Suppressing further invalid format warnings."
 msgstr ""
 
-#: src/data/sys-file-reader.c:627
+#: src/data/sys-file-reader.c:626
 msgid "Weighting variable must be numeric."
 msgstr ""
 
-#: src/data/sys-file-reader.c:641
+#: src/data/sys-file-reader.c:640
 msgid "Multiple type 6 (document) records."
 msgstr ""
 
-#: src/data/sys-file-reader.c:645
+#: src/data/sys-file-reader.c:644
 #, c-format
 msgid "Number of document lines (%d) must be greater than 0."
 msgstr ""
 
-#: src/data/sys-file-reader.c:716
+#: src/data/sys-file-reader.c:715
 #, c-format
 msgid "Unrecognized record type 7, subtype %d."
 msgstr ""
 
-#: src/data/sys-file-reader.c:740
+#: src/data/sys-file-reader.c:739
 #, c-format
 msgid "Bad size (%d) or count (%d) field on record type 7, subtype 3."
 msgstr ""
 
-#: src/data/sys-file-reader.c:755
+#: src/data/sys-file-reader.c:754
 #, c-format
 msgid ""
 "Floating-point representation indicated by system file (%d) differs from "
 "expected (%d)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:768
+#: src/data/sys-file-reader.c:767
 msgid "little-endian"
 msgstr ""
 
-#: src/data/sys-file-reader.c:768
+#: src/data/sys-file-reader.c:767
 msgid "big-endian"
 msgstr ""
 
-#: src/data/sys-file-reader.c:769
+#: src/data/sys-file-reader.c:768
 #, c-format
 msgid ""
 "Integer format indicated by system file (%s) differs from expected (%s)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:785
+#: src/data/sys-file-reader.c:784
 #, c-format
 msgid "Bad size (%d) or count (%d) on extension 4."
 msgstr ""
 
-#: src/data/sys-file-reader.c:789
+#: src/data/sys-file-reader.c:788
 #, c-format
 msgid "File specifies unexpected value %g as SYSMIS."
 msgstr ""
 
-#: src/data/sys-file-reader.c:791
+#: src/data/sys-file-reader.c:790
 #, c-format
 msgid "File specifies unexpected value %g as HIGHEST."
 msgstr ""
 
-#: src/data/sys-file-reader.c:793
+#: src/data/sys-file-reader.c:792
 #, c-format
 msgid "File specifies unexpected value %g as LOWEST."
 msgstr ""
 
-#: src/data/sys-file-reader.c:807
+#: src/data/sys-file-reader.c:806
 #, c-format
 msgid "Bad size (%d) or count (%d) on extension 11."
 msgstr ""
 
-#: src/data/sys-file-reader.c:820
+#: src/data/sys-file-reader.c:819
 msgid "Invalid variable display parameters.  Default parameters substituted."
 msgstr ""
 
-#: src/data/sys-file-reader.c:855
+#: src/data/sys-file-reader.c:854
 #, c-format
 msgid "Long variable mapping from %s to invalid variable name `%s'."
 msgstr ""
 
-#: src/data/sys-file-reader.c:865
+#: src/data/sys-file-reader.c:864
 #, c-format
 msgid "Duplicate long variable name `%s' within system file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:903
+#: src/data/sys-file-reader.c:902
 #, c-format
 msgid "%s listed as string of length %s in length table."
 msgstr ""
 
-#: src/data/sys-file-reader.c:917
+#: src/data/sys-file-reader.c:916
 #, c-format
 msgid "Very long string %s overflows dictionary."
 msgstr ""
 
-#: src/data/sys-file-reader.c:964
+#: src/data/sys-file-reader.c:963
 #, c-format
 msgid "Invalid number of labels: %d.  Ignoring labels."
 msgstr ""
 
-#: src/data/sys-file-reader.c:995
+#: src/data/sys-file-reader.c:994
 msgid ""
 "Variable index record (type 4) does not immediately follow value label "
 "record (type 3) as it should."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1002
+#: src/data/sys-file-reader.c:1001
 #, c-format
 msgid ""
 "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:1012
+#: src/data/sys-file-reader.c:1011
 #, c-format
 msgid "Value labels are not allowed on long string variables (%s)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1019
+#: src/data/sys-file-reader.c:1018
 #, c-format
 msgid ""
 "Variables associated with value label are not all of identical type.  "
 "Variable %s is %s, but variable %s is %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1052
+#: src/data/sys-file-reader.c:1051
 #, c-format
 msgid "Duplicate value label for %g on %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1055
+#: src/data/sys-file-reader.c:1054
 #, c-format
 msgid "Duplicate value label for \"%.*s\" on %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1173
+#: src/data/sys-file-reader.c:1172
 msgid "File ends in partial case."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1269 src/data/sys-file-reader.c:1305
+#: src/data/sys-file-reader.c:1268 src/data/sys-file-reader.c:1304
 msgid "Compressed data is corrupt."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1378
+#: src/data/sys-file-reader.c:1377
 #, c-format
 msgid "Variable index %d not in valid range 1...%d."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1383
+#: src/data/sys-file-reader.c:1382
 #, c-format
 msgid "Variable index %d refers to long string continuation."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1469
+#: src/data/sys-file-reader.c:1468
 #, c-format
 msgid "Suppressed %d additional variable map warnings."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1482
+#: src/data/sys-file-reader.c:1481
 #, c-format
 msgid "Variable map refers to unknown variable %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1558
+#: src/data/sys-file-reader.c:1557
 #, c-format
 msgid "System error: %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1560
+#: src/data/sys-file-reader.c:1559
 #, fuzzy
 msgid "Unexpected end of file."
 msgstr "plotzlich ist der Datei beendet"
 
-#: src/data/sys-file-writer.c:237
+#: src/data/sys-file-writer.c:236
 #, c-format
 msgid "Unknown system file version %d. Treating as version %d."
 msgstr ""
 
-#: src/data/sys-file-writer.c:389
+#: src/data/sys-file-writer.c:388
 #, c-format
 msgid "Error opening \"%s\" for writing as a system file: %s."
 msgstr ""
 
-#: src/data/sys-file-writer.c:1102
+#: src/data/sys-file-writer.c:1101
 #, c-format
 msgid "An I/O error occurred writing system file \"%s\"."
 msgstr ""
@@ -812,111 +812,111 @@ msgstr "Der Variabelname %s ist große als %d Buchstaben."
 msgid "`%s' may not be used as a variable name because it is a reserved word."
 msgstr ""
 
-#: src/data/variable.c:986
+#: src/data/variable.c:1002
 msgid "ordinary"
 msgstr ""
 
-#: src/data/variable.c:988
+#: src/data/variable.c:1004
 msgid "system"
 msgstr ""
 
-#: src/data/variable.c:990
+#: src/data/variable.c:1006
 msgid "scratch"
 msgstr ""
 
-#: src/language/command.c:183
+#: src/language/command.c:182
 #, c-format
 msgid "%s is unimplemented."
 msgstr ""
 
-#: src/language/command.c:188
+#: src/language/command.c:187
 #, c-format
 msgid "%s may be used only in testing mode."
 msgstr ""
 
-#: src/language/command.c:193
+#: src/language/command.c:192
 #, c-format
 msgid "%s may be used only in enhanced syntax mode."
 msgstr ""
 
-#: src/language/command.c:447
+#: src/language/command.c:446
 msgid "expecting command name"
 msgstr ""
 
-#: src/language/command.c:461
+#: src/language/command.c:460
 #, c-format
 msgid "Unknown command %s."
 msgstr ""
 
-#: src/language/command.c:588
+#: src/language/command.c:587
 msgid "before the active file has been defined"
 msgstr ""
 
-#: src/language/command.c:590
+#: src/language/command.c:589
 msgid "after the active file has been defined"
 msgstr ""
 
-#: src/language/command.c:592
+#: src/language/command.c:591
 msgid "inside INPUT PROGRAM"
 msgstr ""
 
-#: src/language/command.c:594
+#: src/language/command.c:593
 msgid "inside FILE TYPE"
 msgstr ""
 
-#: src/language/command.c:599
+#: src/language/command.c:598
 #, c-format
 msgid "%s or %s"
 msgstr ""
 
-#: src/language/command.c:601
+#: src/language/command.c:600
 #, c-format
 msgid "%s, %s, or %s"
 msgstr ""
 
-#: src/language/command.c:605
+#: src/language/command.c:604
 #, c-format
 msgid "%s is allowed only %s."
 msgstr ""
 
-#: src/language/command.c:610
+#: src/language/command.c:609
 #, c-format
 msgid "%s is not allowed inside INPUT PROGRAM."
 msgstr ""
 
-#: src/language/command.c:612
+#: src/language/command.c:611
 #, c-format
 msgid "%s is not allowed inside FILE TYPE."
 msgstr ""
 
-#: src/language/command.c:690 src/language/command.c:819
+#: src/language/command.c:689 src/language/command.c:818
 #: src/language/utilities/permissions.c:102
 msgid "This command not allowed when the SAFER option is set."
 msgstr ""
 
-#: src/language/command.c:702
+#: src/language/command.c:701
 #, c-format
 msgid "Error removing `%s': %s."
 msgstr ""
 
-#: src/language/command.c:752
+#: src/language/command.c:751
 #, c-format
 msgid "Couldn't fork: %s."
 msgstr ""
 
-#: src/language/command.c:794
+#: src/language/command.c:793
 #, c-format
 msgid "Error executing command: %s."
 msgstr ""
 
-#: src/language/command.c:803 src/language/data-io/matrix-data.c:539
-#: src/language/data-io/print-space.c:76 src/language/dictionary/vector.c:203
-#: src/language/lexer/lexer.c:466 src/language/stats/autorecode.c:154
-#: src/language/xforms/select-if.c:62
+#: src/language/command.c:802 src/language/data-io/matrix-data.c:538
+#: src/language/data-io/print-space.c:75 src/language/dictionary/vector.c:202
+#: src/language/lexer/lexer.c:465 src/language/stats/autorecode.c:153
+#: src/language/xforms/select-if.c:61
 msgid "expecting end of command"
 msgstr ""
 
-#: src/language/command.c:840
+#: src/language/command.c:839
 msgid "No operating system support for this command."
 msgstr ""
 
@@ -935,243 +935,243 @@ msgstr ""
 msgid "This command cannot appear outside %s...%s."
 msgstr ""
 
-#: src/language/control/do-if.c:180
+#: src/language/control/do-if.c:179
 msgid "This command may not follow ELSE in DO IF...END IF."
 msgstr ""
 
-#: src/language/control/repeat.c:171
+#: src/language/control/repeat.c:170
 #, c-format
 msgid "Dummy variable name \"%s\" hides dictionary variable \"%s\"."
 msgstr ""
 
-#: src/language/control/repeat.c:176
+#: src/language/control/repeat.c:175
 #, c-format
 msgid "Dummy variable name \"%s\" is given twice."
 msgstr ""
 
-#: src/language/control/repeat.c:222
+#: src/language/control/repeat.c:221
 #, c-format
 msgid ""
 "Dummy variable \"%.*s\" had %d substitutions, so \"%.*s\" must also, but %d "
 "were specified."
 msgstr ""
 
-#: src/language/control/repeat.c:334
+#: src/language/control/repeat.c:333
 msgid "DO REPEAT may not nest in compatibility mode."
 msgstr ""
 
-#: src/language/control/repeat.c:434
+#: src/language/control/repeat.c:433
 #, c-format
 msgid "%ld TO %ld is an invalid range."
 msgstr ""
 
-#: src/language/control/repeat.c:469
+#: src/language/control/repeat.c:468
 msgid "String expected."
 msgstr ""
 
-#: src/language/control/repeat.c:488
+#: src/language/control/repeat.c:487
 msgid "No matching DO REPEAT."
 msgstr ""
 
-#: src/language/control/temporary.c:49
+#: src/language/control/temporary.c:48
 msgid ""
 "This command may only appear once between procedures and procedure-like "
 "commands."
 msgstr ""
 
-#: src/language/data-io/data-list.c:175
+#: src/language/data-io/data-list.c:174
 msgid "The END subcommand may only be specified once."
 msgstr ""
 
-#: src/language/data-io/data-list.c:210
+#: src/language/data-io/data-list.c:209
 msgid "Only one of FIXED, FREE, or LIST may be specified."
 msgstr ""
 
-#: src/language/data-io/data-list.c:350 src/language/data-io/data-list.c:494
+#: src/language/data-io/data-list.c:349 src/language/data-io/data-list.c:493
 #, c-format
 msgid "%s is a duplicate variable name."
 msgstr ""
 
-#: src/language/data-io/data-list.c:357
+#: src/language/data-io/data-list.c:356
 #, c-format
 msgid "There is already a variable %s of a different type."
 msgstr ""
 
-#: src/language/data-io/data-list.c:364
+#: src/language/data-io/data-list.c:363
 #, c-format
 msgid "There is already a string variable %s of a different width."
 msgstr ""
 
-#: src/language/data-io/data-list.c:385
+#: src/language/data-io/data-list.c:384
 msgid "At least one variable must be specified."
 msgstr ""
 
-#: src/language/data-io/data-list.c:392
+#: src/language/data-io/data-list.c:391
 msgid ""
 "Variables are specified on records that should not exist according to "
 "RECORDS subcommand."
 msgstr ""
 
-#: src/language/data-io/data-list.c:417 src/language/data-io/data-list.c:526
-#: src/language/data-io/print.c:397 src/language/dictionary/split-file.c:86
-#: src/language/dictionary/sys-file-info.c:161
-#: src/language/dictionary/sys-file-info.c:396
-#: src/language/stats/descriptives.c:891
+#: src/language/data-io/data-list.c:416 src/language/data-io/data-list.c:525
+#: src/language/data-io/print.c:396 src/language/dictionary/split-file.c:85
+#: src/language/dictionary/sys-file-info.c:160
+#: src/language/dictionary/sys-file-info.c:395
+#: src/language/stats/descriptives.c:890
 msgid "Variable"
 msgstr ""
 
-#: src/language/data-io/data-list.c:418 src/language/data-io/print.c:398
+#: src/language/data-io/data-list.c:417 src/language/data-io/print.c:397
 msgid "Record"
 msgstr ""
 
-#: src/language/data-io/data-list.c:419 src/language/data-io/print.c:399
-#: src/ui/gui/var-sheet.c:78
+#: src/language/data-io/data-list.c:418 src/language/data-io/print.c:398
+#: src/ui/gui/var-sheet.c:77
 msgid "Columns"
 msgstr "Spalten"
 
-#: src/language/data-io/data-list.c:420 src/language/data-io/data-list.c:527
-#: src/language/data-io/print.c:400
+#: src/language/data-io/data-list.c:419 src/language/data-io/data-list.c:526
+#: src/language/data-io/print.c:399
 msgid "Format"
 msgstr ""
 
-#: src/language/data-io/data-list.c:438
+#: src/language/data-io/data-list.c:437
 #, c-format
 msgid "Reading %d record from %s."
 msgid_plural "Reading %d records from %s."
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/language/data-io/data-list.c:541
+#: src/language/data-io/data-list.c:540
 #, c-format
 msgid "Reading free-form data from %s."
 msgstr ""
 
-#: src/language/data-io/data-list.c:587
+#: src/language/data-io/data-list.c:586
 msgid "Quoted string extends beyond end of line."
 msgstr ""
 
-#: src/language/data-io/data-list.c:672
+#: src/language/data-io/data-list.c:671
 #, c-format
 msgid "Partial case of %d of %d records discarded."
 msgstr ""
 
-#: src/language/data-io/data-list.c:710
+#: src/language/data-io/data-list.c:709
 #, c-format
 msgid "Partial case discarded.  The first variable missing was %s."
 msgstr ""
 
-#: src/language/data-io/data-list.c:741
+#: src/language/data-io/data-list.c:740
 #, c-format
 msgid ""
 "Missing value(s) for all variables from %s onward.  These will be filled "
 "with the system-missing value or blanks, as appropriate."
 msgstr ""
 
-#: src/language/data-io/data-reader.c:140
+#: src/language/data-io/data-reader.c:139
 #, c-format
 msgid "Could not open \"%s\" for reading as a data file: %s."
 msgstr ""
 
-#: src/language/data-io/data-reader.c:177
+#: src/language/data-io/data-reader.c:176
 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:209
-#: src/language/data-io/data-reader.c:222
+#: src/language/data-io/data-reader.c:208
+#: src/language/data-io/data-reader.c:221
 #, c-format
 msgid "Error reading file %s: %s."
 msgstr ""
 
-#: src/language/data-io/data-reader.c:225
+#: src/language/data-io/data-reader.c:224
 #, c-format
 msgid "%s: Partial record at end of file."
 msgstr ""
 
-#: src/language/data-io/data-reader.c:276
+#: src/language/data-io/data-reader.c:275
 #, c-format
 msgid "Attempt to read beyond end-of-file on file %s."
 msgstr ""
 
-#: src/language/data-io/data-reader.c:279
+#: src/language/data-io/data-reader.c:278
 msgid "Attempt to read beyond END DATA."
 msgstr ""
 
-#: src/language/data-io/data-reader.c:437
+#: src/language/data-io/data-reader.c:436
 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:66
+#: src/language/data-io/data-writer.c:65
 #, c-format
 msgid "An error occurred while opening \"%s\" for writing as a data file: %s."
 msgstr ""
 
-#: src/language/data-io/data-writer.c:150
+#: src/language/data-io/data-writer.c:149
 #, c-format
 msgid "I/O error occurred writing data file \"%s\"."
 msgstr ""
 
-#: src/language/data-io/file-handle.q:68
+#: src/language/data-io/file-handle.q:67
 #, c-format
 msgid ""
 "File handle %s is already defined.  Use CLOSE FILE HANDLE before redefining "
 "a file handle."
 msgstr ""
 
-#: src/language/data-io/file-handle.q:100
+#: src/language/data-io/file-handle.q:99
 #, c-format
 msgid ""
 "Fixed-length records were specified on /RECFORM, but record length was not "
 "specified on /LRECL.  Assuming %d-character records."
 msgstr ""
 
-#: src/language/data-io/file-handle.q:105
+#: src/language/data-io/file-handle.q:104
 #, c-format
 msgid ""
 "Record length (%ld) must be at least one byte.  Assuming %d-character "
 "records."
 msgstr ""
 
-#: src/language/data-io/file-handle.q:151
+#: src/language/data-io/file-handle.q:150
 msgid "file"
 msgstr ""
 
-#: src/language/data-io/file-handle.q:153
+#: src/language/data-io/file-handle.q:152
 msgid "inline file"
 msgstr ""
 
-#: src/language/data-io/file-handle.q:155
+#: src/language/data-io/file-handle.q:154
 msgid "scratch file"
 msgstr ""
 
-#: src/language/data-io/file-handle.q:176
+#: src/language/data-io/file-handle.q:175
 msgid "expecting a file name or handle name"
 msgstr ""
 
-#: src/language/data-io/file-handle.q:203
+#: src/language/data-io/file-handle.q:202
 #, c-format
 msgid "Handle for %s not allowed here."
 msgstr ""
 
-#: src/language/data-io/get.c:117
+#: src/language/data-io/get.c:116
 msgid "expecting COMM or TAPE"
 msgstr ""
 
-#: src/language/data-io/get.c:361 src/language/data-io/get.c:375
-#: src/language/data-io/get.c:400
+#: src/language/data-io/get.c:360 src/language/data-io/get.c:374
+#: src/language/data-io/get.c:399
 #, c-format
 msgid "expecting %s or %s"
 msgstr ""
 
-#: src/language/data-io/get.c:609 src/language/data-io/print.c:178
+#: src/language/data-io/get.c:608 src/language/data-io/print.c:177
 msgid "expecting a valid subcommand"
 msgstr ""
 
-#: src/language/data-io/get.c:642
+#: src/language/data-io/get.c:641
 #, c-format
 msgid ""
 "Cannot rename %s as %s because there already exists a variable named %s.  To "
@@ -1179,801 +1179,801 @@ 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:668
+#: src/language/data-io/get.c:667
 msgid "`=' expected after variable list."
 msgstr ""
 
-#: src/language/data-io/get.c:675
+#: src/language/data-io/get.c:674
 #, 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:688
+#: src/language/data-io/get.c:687
 #, c-format
 msgid "Requested renaming duplicates variable name %s."
 msgstr ""
 
-#: src/language/data-io/get.c:718
+#: src/language/data-io/get.c:717
 msgid "Cannot DROP all variables from dictionary."
 msgstr ""
 
-#: src/language/data-io/get.c:896
+#: src/language/data-io/get.c:895
 msgid "The active file may not be specified more than once."
 msgstr ""
 
-#: src/language/data-io/get.c:904
+#: src/language/data-io/get.c:903
 msgid "Cannot specify the active file since no active file has been defined."
 msgstr ""
 
-#: src/language/data-io/get.c:911
+#: src/language/data-io/get.c:910
 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:947
+#: src/language/data-io/get.c:946
 msgid "Multiple IN subcommands for a single FILE or TABLE."
 msgstr ""
 
-#: src/language/data-io/get.c:967
+#: src/language/data-io/get.c:966
 msgid "BY may appear at most once."
 msgstr ""
 
-#: src/language/data-io/get.c:988
+#: src/language/data-io/get.c:987
 #, c-format
 msgid "File %s lacks BY variable %s."
 msgstr ""
 
-#: src/language/data-io/get.c:1002
+#: src/language/data-io/get.c:1001
 msgid "FIRST may appear at most once."
 msgstr ""
 
-#: src/language/data-io/get.c:1016
+#: src/language/data-io/get.c:1015
 msgid "LAST may appear at most once."
 msgstr ""
 
-#: src/language/data-io/get.c:1057
+#: src/language/data-io/get.c:1056
 msgid "BY is required when TABLE is specified."
 msgstr ""
 
-#: src/language/data-io/get.c:1062
+#: src/language/data-io/get.c:1061
 msgid "BY is required when IN is specified."
 msgstr ""
 
-#: src/language/data-io/get.c:1091
+#: src/language/data-io/get.c:1090
 #, c-format
 msgid "IN variable name %s duplicates an existing variable name."
 msgstr ""
 
-#: src/language/data-io/get.c:1547
+#: src/language/data-io/get.c:1546
 #, 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:134
+#: src/language/data-io/inpt-pgm.c:133
 msgid "Unexpected end-of-file within INPUT PROGRAM."
 msgstr ""
 
-#: src/language/data-io/inpt-pgm.c:147
+#: src/language/data-io/inpt-pgm.c:146
 msgid "Input program did not create any variables."
 msgstr ""
 
-#: src/language/data-io/inpt-pgm.c:341
+#: src/language/data-io/inpt-pgm.c:340
 msgid "COLUMN subcommand multiply specified."
 msgstr ""
 
-#: src/language/data-io/inpt-pgm.c:389
+#: src/language/data-io/inpt-pgm.c:388
 msgid ""
 "REREAD: Column numbers must be positive finite numbers.  Column set to 1."
 msgstr ""
 
-#: src/language/data-io/list.q:155 src/language/stats/descriptives.c:365
+#: src/language/data-io/list.q:154 src/language/stats/descriptives.c:364
 msgid "No variables specified."
 msgstr ""
 
-#: src/language/data-io/list.q:163
+#: src/language/data-io/list.q:162
 #, 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:171
+#: src/language/data-io/list.q:170
 #, 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:177
+#: src/language/data-io/list.q:176
 #, 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:183
+#: src/language/data-io/list.q:182
 #, 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:209
+#: src/language/data-io/list.q:208
 msgid "`/FORMAT WEIGHT' specified, but weighting is not on."
 msgstr ""
 
-#: src/language/data-io/list.q:443
+#: src/language/data-io/list.q:442
 msgid "Line"
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:219
+#: src/language/data-io/matrix-data.c:218
 msgid "VARIABLES subcommand multiply specified."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:234
+#: src/language/data-io/matrix-data.c:233
 msgid "VARNAME_ cannot be explicitly specified on VARIABLES."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:295
+#: src/language/data-io/matrix-data.c:294
 msgid "in FORMAT subcommand"
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:306
+#: src/language/data-io/matrix-data.c:305
 msgid "SPLIT subcommand multiply specified."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:313
+#: src/language/data-io/matrix-data.c:312
 msgid "in SPLIT subcommand"
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:323
+#: src/language/data-io/matrix-data.c:322
 msgid "Split variable may not be named ROWTYPE_ or VARNAME_."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:357
+#: src/language/data-io/matrix-data.c:356
 #, c-format
 msgid "Split variable %s is already another type."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:372
+#: src/language/data-io/matrix-data.c:371
 msgid "FACTORS subcommand multiply specified."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:390
+#: src/language/data-io/matrix-data.c:389
 #, c-format
 msgid "Factor variable %s is already another type."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:405
+#: src/language/data-io/matrix-data.c:404
 msgid "CELLS subcommand multiply specified."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:411
-#: src/language/data-io/matrix-data.c:430
+#: src/language/data-io/matrix-data.c:410
+#: src/language/data-io/matrix-data.c:429
 msgid "expecting positive integer"
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:424
+#: src/language/data-io/matrix-data.c:423
 msgid "N subcommand multiply specified."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:445
+#: src/language/data-io/matrix-data.c:444
 msgid "CONTENTS subcommand multiply specified."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:465
+#: src/language/data-io/matrix-data.c:464
 msgid "Nested parentheses not allowed."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:475
+#: src/language/data-io/matrix-data.c:474
 msgid "Mismatched right parenthesis (`(')."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:480
+#: src/language/data-io/matrix-data.c:479
 msgid "Empty parentheses not allowed."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:493
-#: src/language/data-io/matrix-data.c:501
+#: src/language/data-io/matrix-data.c:492
+#: src/language/data-io/matrix-data.c:500
 msgid "in CONTENTS subcommand"
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:508
+#: src/language/data-io/matrix-data.c:507
 #, c-format
 msgid "Content multiply specified for %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:525
+#: src/language/data-io/matrix-data.c:524
 msgid "Missing right parenthesis."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:545
+#: src/language/data-io/matrix-data.c:544
 msgid "Missing VARIABLES subcommand."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:551
+#: src/language/data-io/matrix-data.c:550
 msgid ""
 "CONTENTS subcommand not specified: assuming file contains only CORR matrix."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:561
+#: src/language/data-io/matrix-data.c:560
 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:569
+#: src/language/data-io/matrix-data.c:568
 msgid "Split file values must be present in the data when ROWTYPE_ is present."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:622
+#: src/language/data-io/matrix-data.c:621
 msgid "No continuous variables specified."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:841
+#: src/language/data-io/matrix-data.c:840
 msgid "Scope of string exceeds line."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:894
+#: src/language/data-io/matrix-data.c:893
 #, c-format
 msgid "End of line expected %s while reading %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1085
+#: src/language/data-io/matrix-data.c:1084
 #, c-format
 msgid "expecting value for %s %s"
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1250
+#: src/language/data-io/matrix-data.c:1249
 #, c-format
 msgid "Syntax error expecting SPLIT FILE value %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1259
+#: src/language/data-io/matrix-data.c:1258
 #, c-format
 msgid "Expecting value %g for %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1300
-#: src/language/data-io/matrix-data.c:1782
+#: src/language/data-io/matrix-data.c:1299
+#: src/language/data-io/matrix-data.c:1781
 #, c-format
 msgid "Syntax error expecting factor value %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1309
+#: src/language/data-io/matrix-data.c:1308
 #, c-format
 msgid "Syntax error expecting value %g for %s %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1558
+#: src/language/data-io/matrix-data.c:1557
 #, c-format
 msgid "Syntax error %s expecting SPLIT FILE value."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1686
+#: src/language/data-io/matrix-data.c:1685
 #, 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:1724
+#: src/language/data-io/matrix-data.c:1723
 #, c-format
 msgid "Multiply specified ROWTYPE_ %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1729
+#: src/language/data-io/matrix-data.c:1728
 #, c-format
 msgid "Syntax error %s expecting ROWTYPE_ string."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1749
+#: src/language/data-io/matrix-data.c:1748
 #, c-format
 msgid "Syntax error %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1900
+#: src/language/data-io/matrix-data.c:1899
 #, c-format
 msgid "Duplicate specification for %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1912
+#: src/language/data-io/matrix-data.c:1911
 #, c-format
 msgid "Too many rows of matrix data for %s."
 msgstr ""
 
-#: src/language/data-io/matrix-data.c:1956
+#: src/language/data-io/matrix-data.c:1955
 #, c-format
 msgid "Syntax error expecting value for %s %s."
 msgstr ""
 
-#: src/language/data-io/placement-parser.c:88
+#: src/language/data-io/placement-parser.c:87
 #, c-format
 msgid ""
 "Number of variables specified (%d) differs from number of variable formats (%"
 "d)."
 msgstr ""
 
-#: src/language/data-io/placement-parser.c:98
+#: src/language/data-io/placement-parser.c:97
 msgid ""
 "SPSS-like or Fortran-like format specification expected after variable names."
 msgstr ""
 
-#: src/language/data-io/placement-parser.c:120
+#: src/language/data-io/placement-parser.c:119
 #, c-format
 msgid "The %d columns %d-%d can't be evenly divided into %d fields."
 msgstr ""
 
-#: src/language/data-io/placement-parser.c:227
-#: src/language/lexer/format-parser.c:111
-#: src/language/lexer/format-parser.c:130
+#: src/language/data-io/placement-parser.c:226
+#: src/language/lexer/format-parser.c:110
+#: src/language/lexer/format-parser.c:129
 #, c-format
 msgid "Unknown format type \"%s\"."
 msgstr ""
 
-#: src/language/data-io/placement-parser.c:311
-#: src/language/data-io/placement-parser.c:325
+#: src/language/data-io/placement-parser.c:310
+#: src/language/data-io/placement-parser.c:324
 msgid "Column positions for fields must be positive."
 msgstr ""
 
-#: src/language/data-io/placement-parser.c:330
+#: src/language/data-io/placement-parser.c:329
 msgid "The ending column for a field must be greater than the starting column."
 msgstr ""
 
-#: src/language/data-io/placement-parser.c:365
+#: src/language/data-io/placement-parser.c:364
 #, c-format
 msgid ""
 "The record number specified, %ld, is at or before the previous record, %d.  "
 "Data fields must be listed in order of increasing record number."
 msgstr ""
 
-#: src/language/data-io/print.c:261
+#: src/language/data-io/print.c:260
 #, c-format
 msgid "Output calls for %d records but %d specified on RECORDS subcommand."
 msgstr ""
 
-#: src/language/data-io/print.c:430
+#: src/language/data-io/print.c:429
 #, c-format
 msgid "Writing %d record to %s."
 msgid_plural "Writing %d records to %s."
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/language/data-io/print.c:434
+#: src/language/data-io/print.c:433
 #, c-format
 msgid "Writing %d record."
 msgid_plural "Writing %d records."
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/language/data-io/print-space.c:117
+#: src/language/data-io/print-space.c:116
 msgid "The expression on PRINT SPACE evaluated to the system-missing value."
 msgstr ""
 
-#: src/language/data-io/print-space.c:120
+#: src/language/data-io/print-space.c:119
 #, c-format
 msgid "The expression on PRINT SPACE evaluated to %g."
 msgstr ""
 
-#: src/language/dictionary/apply-dictionary.c:75
+#: src/language/dictionary/apply-dictionary.c:74
 #, c-format
 msgid "Variable %s is %s in target file, but %s in source file."
 msgstr ""
 
-#: src/language/dictionary/apply-dictionary.c:99
+#: src/language/dictionary/apply-dictionary.c:98
 #, c-format
 msgid "Cannot add value labels from source file to long string variable %s."
 msgstr ""
 
-#: src/language/dictionary/apply-dictionary.c:113
+#: src/language/dictionary/apply-dictionary.c:112
 #, c-format
 msgid ""
 "Cannot apply missing values from source file to long string variable %s."
 msgstr ""
 
-#: src/language/dictionary/apply-dictionary.c:126
+#: src/language/dictionary/apply-dictionary.c:125
 msgid "No matching variables found between the source and target files."
 msgstr ""
 
-#: src/language/dictionary/formats.c:92
+#: src/language/dictionary/formats.c:91
 msgid "`(' expected after variable list."
 msgstr ""
 
-#: src/language/dictionary/formats.c:102 src/language/dictionary/numeric.c:72
+#: src/language/dictionary/formats.c:101 src/language/dictionary/numeric.c:71
 msgid "`)' expected after output format."
 msgstr ""
 
-#: src/language/dictionary/missing-values.c:59
-#: src/language/stats/aggregate.c:468
+#: src/language/dictionary/missing-values.c:58
+#: src/language/stats/aggregate.c:467
 msgid "expecting `('"
 msgstr ""
 
-#: src/language/dictionary/missing-values.c:75
+#: src/language/dictionary/missing-values.c:74
 #, 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:120
+#: src/language/dictionary/missing-values.c:119
 #, c-format
 msgid "Truncating missing value to short string length (%d characters)."
 msgstr ""
 
-#: src/language/dictionary/missing-values.c:142
+#: src/language/dictionary/missing-values.c:141
 #, c-format
 msgid "Missing values provided are too long to assign to variable of width %d."
 msgstr ""
 
-#: src/language/dictionary/modify-variables.c:96
+#: src/language/dictionary/modify-variables.c:95
 msgid ""
 "MODIFY VARS may not be used after TEMPORARY.  Temporary transformations will "
 "be made permanent."
 msgstr ""
 
-#: src/language/dictionary/modify-variables.c:118
+#: src/language/dictionary/modify-variables.c:117
 msgid "REORDER subcommand may be given at most once."
 msgstr ""
 
-#: src/language/dictionary/modify-variables.c:141
+#: src/language/dictionary/modify-variables.c:140
 msgid "Cannot specify ALL after specifying a set of variables."
 msgstr ""
 
-#: src/language/dictionary/modify-variables.c:151
+#: src/language/dictionary/modify-variables.c:150
 msgid "`(' expected on REORDER subcommand."
 msgstr ""
 
-#: src/language/dictionary/modify-variables.c:163
+#: src/language/dictionary/modify-variables.c:162
 msgid "`)' expected following variable names on REORDER subcommand."
 msgstr ""
 
-#: src/language/dictionary/modify-variables.c:181
+#: src/language/dictionary/modify-variables.c:180
 msgid "RENAME subcommand may be given at most once."
 msgstr ""
 
-#: src/language/dictionary/modify-variables.c:194
+#: src/language/dictionary/modify-variables.c:193
 msgid "`(' expected on RENAME subcommand."
 msgstr ""
 
-#: src/language/dictionary/modify-variables.c:203
+#: src/language/dictionary/modify-variables.c:202
 msgid ""
 "`=' expected between lists of new and old variable names on RENAME "
 "subcommand."
 msgstr ""
 
-#: src/language/dictionary/modify-variables.c:212
+#: src/language/dictionary/modify-variables.c:211
 #, c-format
 msgid ""
 "Differing number of variables in old name list (%d) and in new name list (%"
 "d)."
 msgstr ""
 
-#: src/language/dictionary/modify-variables.c:223
+#: src/language/dictionary/modify-variables.c:222
 msgid "`)' expected after variable lists on RENAME subcommand."
 msgstr ""
 
-#: src/language/dictionary/modify-variables.c:237
+#: src/language/dictionary/modify-variables.c:236
 msgid ""
 "KEEP subcommand may be given at most once.  It may notbe given in "
 "conjunction with the DROP subcommand."
 msgstr ""
 
-#: src/language/dictionary/modify-variables.c:280
+#: src/language/dictionary/modify-variables.c:279
 msgid ""
 "DROP subcommand may be given at most once.  It may not be given in "
 "conjunction with the KEEP subcommand."
 msgstr ""
 
-#: src/language/dictionary/modify-variables.c:306
+#: src/language/dictionary/modify-variables.c:305
 #, c-format
 msgid "Unrecognized subcommand name `%s'."
 msgstr ""
 
-#: src/language/dictionary/modify-variables.c:308
+#: src/language/dictionary/modify-variables.c:307
 msgid "Subcommand name expected."
 msgstr ""
 
-#: src/language/dictionary/modify-variables.c:316
+#: src/language/dictionary/modify-variables.c:315
 msgid "`/' or `.' expected."
 msgstr ""
 
-#: src/language/dictionary/numeric.c:65
+#: src/language/dictionary/numeric.c:64
 #, c-format
 msgid "Format type %s may not be used with a numeric variable."
 msgstr ""
 
-#: src/language/dictionary/numeric.c:84 src/language/dictionary/numeric.c:153
-#: src/language/dictionary/vector.c:165
+#: src/language/dictionary/numeric.c:83 src/language/dictionary/numeric.c:152
+#: src/language/dictionary/vector.c:164
 #, c-format
 msgid "There is already a variable named %s."
 msgstr ""
 
-#: src/language/dictionary/numeric.c:138
+#: src/language/dictionary/numeric.c:137
 #, c-format
 msgid "Format type %s may not be used with a string variable."
 msgstr ""
 
-#: src/language/dictionary/rename-variables.c:51
+#: src/language/dictionary/rename-variables.c:50
 msgid ""
 "RENAME VARS may not be used after TEMPORARY.  Temporary transformations will "
 "be made permanent."
 msgstr ""
 
-#: src/language/dictionary/rename-variables.c:61
+#: src/language/dictionary/rename-variables.c:60
 msgid "`(' expected."
 msgstr ""
 
-#: src/language/dictionary/rename-variables.c:69
+#: src/language/dictionary/rename-variables.c:68
 msgid "`=' expected between lists of new and old variable names."
 msgstr ""
 
-#: src/language/dictionary/rename-variables.c:78
+#: src/language/dictionary/rename-variables.c:77
 #, c-format
 msgid ""
 "Differing number of variables in old name list (%u) and in new name list (%"
 "u)."
 msgstr ""
 
-#: src/language/dictionary/rename-variables.c:90
+#: src/language/dictionary/rename-variables.c:89
 msgid "`)' expected after variable names."
 msgstr ""
 
-#: src/language/dictionary/rename-variables.c:100
+#: src/language/dictionary/rename-variables.c:99
 #, c-format
 msgid "Renaming would duplicate variable name %s."
 msgstr ""
 
-#: src/language/dictionary/split-file.c:87
-#: src/language/dictionary/sys-file-info.c:550
-#: src/language/stats/crosstabs.q:1115 src/language/stats/crosstabs.q:1142
-#: src/language/stats/crosstabs.q:1162 src/language/stats/crosstabs.q:1184
-#: src/language/stats/examine.q:1193 src/language/stats/frequencies.q:1178
-#: src/language/stats/frequencies.q:1301
+#: src/language/dictionary/split-file.c:86
+#: src/language/dictionary/sys-file-info.c:549
+#: src/language/stats/crosstabs.q:1114 src/language/stats/crosstabs.q:1141
+#: src/language/stats/crosstabs.q:1161 src/language/stats/crosstabs.q:1183
+#: src/language/stats/examine.q:1193 src/language/stats/frequencies.q:1177
+#: src/language/stats/frequencies.q:1300
 msgid "Value"
 msgstr ""
 
-#: src/language/dictionary/split-file.c:88
-#: src/language/dictionary/sys-file-info.c:403
-#: src/language/dictionary/sys-file-info.c:551 src/ui/gui/var-sheet.c:75
+#: src/language/dictionary/split-file.c:87
+#: src/language/dictionary/sys-file-info.c:402
+#: src/language/dictionary/sys-file-info.c:550 src/ui/gui/var-sheet.c:74
 msgid "Label"
 msgstr "Kennsatz"
 
-#: src/language/dictionary/sys-file-info.c:110
+#: src/language/dictionary/sys-file-info.c:109
 msgid "File:"
 msgstr "Datei:"
 
-#: src/language/dictionary/sys-file-info.c:112
+#: src/language/dictionary/sys-file-info.c:111
 msgid "Label:"
 msgstr "Kennsatz:"
 
-#: src/language/dictionary/sys-file-info.c:116
+#: src/language/dictionary/sys-file-info.c:115
 msgid "No label."
 msgstr "Kein Kennsatz."
 
-#: src/language/dictionary/sys-file-info.c:119
+#: src/language/dictionary/sys-file-info.c:118
 msgid "Created:"
 msgstr "Gemacht:"
 
-#: src/language/dictionary/sys-file-info.c:122
+#: src/language/dictionary/sys-file-info.c:121
 msgid "Integer Format:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:124
+#: src/language/dictionary/sys-file-info.c:123
 msgid "Big Endian."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:125
+#: src/language/dictionary/sys-file-info.c:124
 msgid "Little Endian."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:126
-#: src/language/dictionary/sys-file-info.c:134
+#: src/language/dictionary/sys-file-info.c:125
+#: src/language/dictionary/sys-file-info.c:133
 msgid "Unknown."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:127
+#: src/language/dictionary/sys-file-info.c:126
 msgid "Real Format:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:129
+#: src/language/dictionary/sys-file-info.c:128
 msgid "IEEE 754 LE."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:130
+#: src/language/dictionary/sys-file-info.c:129
 msgid "IEEE 754 BE."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:131
+#: src/language/dictionary/sys-file-info.c:130
 msgid "VAX D."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:132
+#: src/language/dictionary/sys-file-info.c:131
 msgid "VAX G."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:133
+#: src/language/dictionary/sys-file-info.c:132
 msgid "IBM 390 Hex Long."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:135
+#: src/language/dictionary/sys-file-info.c:134
 msgid "Variables:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:138
+#: src/language/dictionary/sys-file-info.c:137
 msgid "Cases:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:140
+#: src/language/dictionary/sys-file-info.c:139
 msgid "Unknown"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:141
+#: src/language/dictionary/sys-file-info.c:140
 msgid "Type:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:142
+#: src/language/dictionary/sys-file-info.c:141
 msgid "System File."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:143
+#: src/language/dictionary/sys-file-info.c:142
 msgid "Weight:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:148
+#: src/language/dictionary/sys-file-info.c:147
 msgid "Not weighted."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:150
+#: src/language/dictionary/sys-file-info.c:149
 msgid "Mode:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:152
+#: src/language/dictionary/sys-file-info.c:151
 #, c-format
 msgid "Compression %s."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:152
+#: src/language/dictionary/sys-file-info.c:151
 msgid "on"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:152
+#: src/language/dictionary/sys-file-info.c:151
 msgid "off"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:162
-#: src/language/dictionary/sys-file-info.c:401
+#: src/language/dictionary/sys-file-info.c:161
+#: src/language/dictionary/sys-file-info.c:400
 msgid "Description"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:163
-#: src/language/dictionary/sys-file-info.c:399
+#: src/language/dictionary/sys-file-info.c:162
+#: src/language/dictionary/sys-file-info.c:398
 msgid "Position"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:221
+#: src/language/dictionary/sys-file-info.c:220
 msgid "The active file does not have a file label."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:224
+#: src/language/dictionary/sys-file-info.c:223
 msgid "File label:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:287
+#: src/language/dictionary/sys-file-info.c:286
 msgid "No variables to display."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:306
+#: src/language/dictionary/sys-file-info.c:305
 msgid "Macros not supported."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:316
+#: src/language/dictionary/sys-file-info.c:315
 msgid "The active file dictionary does not contain any documents."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:325
+#: src/language/dictionary/sys-file-info.c:324
 msgid "Documents in the active file:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:481
+#: src/language/dictionary/sys-file-info.c:480
 #, c-format
 msgid "Format: %s"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:489
+#: src/language/dictionary/sys-file-info.c:488
 #, c-format
 msgid "Print Format: %s"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:492
+#: src/language/dictionary/sys-file-info.c:491
 #, c-format
 msgid "Write Format: %s"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:504
+#: src/language/dictionary/sys-file-info.c:503
 msgid "Missing Values: "
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:596
+#: src/language/dictionary/sys-file-info.c:595
 msgid "No vectors defined."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:611
+#: src/language/dictionary/sys-file-info.c:610
 msgid "Vector"
 msgstr ""
 
-#: src/language/dictionary/value-labels.c:123
+#: src/language/dictionary/value-labels.c:122
 #, 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:159 src/language/lexer/lexer.c:601
+#: src/language/dictionary/value-labels.c:158 src/language/lexer/lexer.c:600
 msgid "expecting string"
 msgstr ""
 
-#: src/language/dictionary/value-labels.c:168 src/language/lexer/lexer.c:615
+#: src/language/dictionary/value-labels.c:167 src/language/lexer/lexer.c:614
 msgid "expecting integer"
 msgstr ""
 
-#: src/language/dictionary/value-labels.c:172
+#: src/language/dictionary/value-labels.c:171
 #, c-format
 msgid "Value label `%g' is not integer."
 msgstr ""
 
-#: src/language/dictionary/value-labels.c:186
+#: src/language/dictionary/value-labels.c:185
 msgid "Truncating value label to 60 characters."
 msgstr ""
 
-#: src/language/dictionary/variable-label.c:53
+#: src/language/dictionary/variable-label.c:52
 msgid "String expected for variable label."
 msgstr ""
 
-#: src/language/dictionary/variable-label.c:61
+#: src/language/dictionary/variable-label.c:60
 msgid "Truncating variable label to 255 characters."
 msgstr ""
 
-#: src/language/dictionary/vector.c:76
+#: src/language/dictionary/vector.c:75
 #, c-format
 msgid "Vector name %s is given twice."
 msgstr ""
 
-#: src/language/dictionary/vector.c:82
+#: src/language/dictionary/vector.c:81
 #, c-format
 msgid "There is already a vector with name %s."
 msgstr ""
 
-#: src/language/dictionary/vector.c:103
+#: src/language/dictionary/vector.c:102
 msgid ""
 "A slash must be used to separate each vector specification when using the "
 "long form.  Commands such as VECTOR A,B=Q1 TO Q20 are not supported."
 msgstr ""
 
-#: src/language/dictionary/vector.c:137
+#: src/language/dictionary/vector.c:136
 msgid "Vectors must have at least one element."
 msgstr ""
 
-#: src/language/dictionary/vector.c:151
+#: src/language/dictionary/vector.c:150
 #, c-format
 msgid "%s%d is too long for a variable name."
 msgstr ""
 
-#: src/language/dictionary/vector.c:190
+#: src/language/dictionary/vector.c:189
 msgid ""
 "The syntax for this command does not match the expected syntax for either "
 "the long form or the short form of VECTOR."
 msgstr ""
 
-#: src/language/dictionary/weight.c:52
+#: src/language/dictionary/weight.c:51
 msgid "The weighting variable must be numeric."
 msgstr ""
 
-#: src/language/dictionary/weight.c:57
+#: src/language/dictionary/weight.c:56
 msgid "The weighting variable may not be scratch."
 msgstr ""
 
-#: src/language/expressions/evaluate.c:156
+#: src/language/expressions/evaluate.c:155
 msgid "expecting number or string"
 msgstr ""
 
@@ -2025,24 +2025,24 @@ msgid ""
 "Invalid DATESUM method.  Valid choices are \"closest\" and \"rollover\"."
 msgstr ""
 
-#: src/language/expressions/parse.c:261
+#: src/language/expressions/parse.c:260
 #, c-format
 msgid ""
 "Type mismatch: expression has %s type, but a numeric value is required here."
 msgstr ""
 
-#: src/language/expressions/parse.c:273
+#: src/language/expressions/parse.c:272
 #, c-format
 msgid ""
 "Type mismatch: expression has %s type, but a string value is required here."
 msgstr ""
 
-#: src/language/expressions/parse.c:429
+#: src/language/expressions/parse.c:428
 #, c-format
 msgid "Type mismatch while applying %s operator: cannot convert %s to %s."
 msgstr ""
 
-#: src/language/expressions/parse.c:645
+#: src/language/expressions/parse.c:644
 msgid ""
 "Chaining relational operators (e.g. \"a < b < c\") will not produce the "
 "mathematically expected result.  Use the AND logical operator to fix the "
@@ -2050,272 +2050,272 @@ msgid ""
 "parentheses will disable this warning (e.g. \"(a < b) < c\".)"
 msgstr ""
 
-#: src/language/expressions/parse.c:746
+#: src/language/expressions/parse.c:745
 msgid ""
 "The exponentiation operator (\"**\") is left-associative, even though right-"
 "associative semantics are more useful.  That is, \"a**b**c\" equals \"(a**b)"
 "**c\", not as \"a**(b**c)\".  To disable this warning, insert parentheses."
 msgstr ""
 
-#: src/language/expressions/parse.c:811
+#: src/language/expressions/parse.c:810
 #, c-format
 msgid "Unknown system variable %s."
 msgstr ""
 
-#: src/language/expressions/parse.c:859
+#: src/language/expressions/parse.c:858
 #, c-format
 msgid "Unknown identifier %s."
 msgstr ""
 
-#: src/language/expressions/parse.c:887 src/language/stats/aggregate.c:526
+#: src/language/expressions/parse.c:886 src/language/stats/aggregate.c:525
 msgid "expecting `)'"
 msgstr ""
 
-#: src/language/expressions/parse.c:894
+#: src/language/expressions/parse.c:893
 msgid "in expression"
 msgstr ""
 
-#: src/language/expressions/parse.c:1075
+#: src/language/expressions/parse.c:1074
 #, c-format
 msgid "%s must have at least %d arguments in list."
 msgstr ""
 
-#: src/language/expressions/parse.c:1084
+#: src/language/expressions/parse.c:1083
 #, c-format
 msgid "%s must have even number of arguments in list."
 msgstr ""
 
-#: src/language/expressions/parse.c:1087
+#: src/language/expressions/parse.c:1086
 #, c-format
 msgid "%s must have multiple of %d arguments in list."
 msgstr ""
 
-#: src/language/expressions/parse.c:1097
+#: src/language/expressions/parse.c:1096
 #, c-format
 msgid "%s function does not accept a minimum valid argument count."
 msgstr ""
 
-#: src/language/expressions/parse.c:1106
+#: src/language/expressions/parse.c:1105
 #, c-format
 msgid "%s requires at least %d valid arguments in list."
 msgstr ""
 
-#: src/language/expressions/parse.c:1112
+#: src/language/expressions/parse.c:1111
 #, c-format
 msgid ""
 "With %s, using minimum valid argument count of %d does not make sense when "
 "passing only %d arguments in list."
 msgstr ""
 
-#: src/language/expressions/parse.c:1166
+#: src/language/expressions/parse.c:1165
 #, c-format
 msgid "Type mismatch invoking %s as "
 msgstr ""
 
-#: src/language/expressions/parse.c:1171
+#: src/language/expressions/parse.c:1170
 msgid "Function invocation "
 msgstr ""
 
-#: src/language/expressions/parse.c:1173
+#: src/language/expressions/parse.c:1172
 msgid " does not match any known function.  Candidates are:"
 msgstr ""
 
-#: src/language/expressions/parse.c:1203
+#: src/language/expressions/parse.c:1202
 #, c-format
 msgid "No function or vector named %s."
 msgstr ""
 
-#: src/language/expressions/parse.c:1245
+#: src/language/expressions/parse.c:1244
 #, c-format
 msgid "expecting `,' or `)' invoking %s function"
 msgstr ""
 
-#: src/language/expressions/parse.c:1265
+#: src/language/expressions/parse.c:1264
 #, c-format
 msgid "%s is a PSPP extension."
 msgstr ""
 
-#: src/language/expressions/parse.c:1268 src/ui/terminal/command-line.c:133
-#: src/ui/terminal/command-line.c:152 src/ui/terminal/command-line.c:164
+#: src/language/expressions/parse.c:1267 src/ui/terminal/command-line.c:132
+#: src/ui/terminal/command-line.c:151 src/ui/terminal/command-line.c:163
 #, c-format
 msgid "%s is not yet implemented."
 msgstr ""
 
-#: src/language/expressions/parse.c:1274
+#: src/language/expressions/parse.c:1273
 #, c-format
 msgid "%s may not appear after TEMPORARY."
 msgstr ""
 
-#: src/language/lexer/format-parser.c:92
+#: src/language/lexer/format-parser.c:91
 msgid "expecting valid format specifier"
 msgstr ""
 
-#: src/language/lexer/format-parser.c:125
+#: src/language/lexer/format-parser.c:124
 msgid "expecting format type"
 msgstr ""
 
-#: src/language/lexer/lexer.c:272
+#: src/language/lexer/lexer.c:271
 #, c-format
 msgid "%s does not form a valid number."
 msgstr ""
 
-#: src/language/lexer/lexer.c:376
+#: src/language/lexer/lexer.c:375
 #, c-format
 msgid "Bad character in input: `%c'."
 msgstr ""
 
-#: src/language/lexer/lexer.c:378
+#: src/language/lexer/lexer.c:377
 #, c-format
 msgid "Bad character in input: `\\%o'."
 msgstr ""
 
-#: src/language/lexer/lexer.c:414
+#: src/language/lexer/lexer.c:413
 #, c-format
 msgid "Subcommand %s may only be specified once."
 msgstr ""
 
-#: src/language/lexer/lexer.c:422
+#: src/language/lexer/lexer.c:421
 #, c-format
 msgid "missing required subcommand %s"
 msgstr ""
 
-#: src/language/lexer/lexer.c:451
+#: src/language/lexer/lexer.c:450
 #, c-format
 msgid "Syntax error %s at %s."
 msgstr ""
 
-#: src/language/lexer/lexer.c:454
+#: src/language/lexer/lexer.c:453
 #, c-format
 msgid "Syntax error at %s."
 msgstr ""
 
-#: src/language/lexer/lexer.c:570 src/language/lexer/lexer.c:587
+#: src/language/lexer/lexer.c:569 src/language/lexer/lexer.c:586
 #, c-format
 msgid "expecting `%s'"
 msgstr ""
 
-#: src/language/lexer/lexer.c:628
+#: src/language/lexer/lexer.c:627
 msgid "expecting number"
 msgstr ""
 
-#: src/language/lexer/lexer.c:640
+#: src/language/lexer/lexer.c:639
 msgid "expecting identifier"
 msgstr ""
 
-#: src/language/lexer/lexer.c:1029
+#: src/language/lexer/lexer.c:1028
 msgid "binary"
 msgstr ""
 
-#: src/language/lexer/lexer.c:1034
+#: src/language/lexer/lexer.c:1033
 msgid "octal"
 msgstr ""
 
-#: src/language/lexer/lexer.c:1039
+#: src/language/lexer/lexer.c:1038
 msgid "hex"
 msgstr ""
 
-#: src/language/lexer/lexer.c:1049
+#: src/language/lexer/lexer.c:1048
 #, c-format
 msgid "String of %s digits has %d characters, which is not a multiple of %d."
 msgstr ""
 
-#: src/language/lexer/lexer.c:1078
+#: src/language/lexer/lexer.c:1077
 #, c-format
 msgid "`%c' is not a valid %s digit."
 msgstr ""
 
-#: src/language/lexer/lexer.c:1112
+#: src/language/lexer/lexer.c:1111
 msgid "Unterminated string constant."
 msgstr ""
 
-#: src/language/lexer/lexer.c:1166
+#: src/language/lexer/lexer.c:1165
 msgid "Unexpected end of file in string concatenation."
 msgstr ""
 
-#: src/language/lexer/lexer.c:1174
+#: src/language/lexer/lexer.c:1173
 msgid "String expected following `+'."
 msgstr ""
 
-#: src/language/lexer/lexer.c:1187
+#: src/language/lexer/lexer.c:1186
 #, c-format
 msgid "String exceeds 255 characters in length (%d characters)."
 msgstr ""
 
-#: src/language/lexer/range-parser.c:63
+#: src/language/lexer/range-parser.c:62
 #, c-format
 msgid ""
 "Low end of range (%g) is below high end (%g).  The range will be treated as "
 "reversed."
 msgstr ""
 
-#: src/language/lexer/range-parser.c:71
+#: src/language/lexer/range-parser.c:70
 #, c-format
 msgid "Ends of range are equal (%g)."
 msgstr ""
 
-#: src/language/lexer/range-parser.c:79
+#: src/language/lexer/range-parser.c:78
 msgid "LO or LOWEST must be part of a range."
 msgstr ""
 
-#: src/language/lexer/range-parser.c:110
+#: src/language/lexer/range-parser.c:109
 msgid "System-missing value is not valid here."
 msgstr ""
 
-#: src/language/lexer/range-parser.c:118
+#: src/language/lexer/range-parser.c:117
 msgid "expecting number or data string"
 msgstr ""
 
-#: src/language/lexer/variable-parser.c:55
+#: src/language/lexer/variable-parser.c:54
 msgid "expecting variable name"
 msgstr ""
 
-#: src/language/lexer/variable-parser.c:65
+#: src/language/lexer/variable-parser.c:64
 #, c-format
 msgid "%s is not a variable name."
 msgstr ""
 
-#: src/language/lexer/variable-parser.c:170
+#: src/language/lexer/variable-parser.c:169
 #, c-format
 msgid ""
 "%s is not a numeric variable.  It will not be included in the variable list."
 msgstr ""
 
-#: src/language/lexer/variable-parser.c:173
+#: src/language/lexer/variable-parser.c:172
 #, c-format
 msgid ""
 "%s is not a string variable.  It will not be included in the variable list."
 msgstr ""
 
-#: src/language/lexer/variable-parser.c:177
+#: src/language/lexer/variable-parser.c:176
 #, c-format
 msgid "Scratch variables (such as %s) are not allowed here."
 msgstr ""
 
-#: src/language/lexer/variable-parser.c:181
+#: src/language/lexer/variable-parser.c:180
 #, c-format
 msgid ""
 "%s and %s are not the same type.  All variables in this variable list must "
 "be of the same type.  %s will be omitted from the list."
 msgstr ""
 
-#: src/language/lexer/variable-parser.c:187
+#: src/language/lexer/variable-parser.c:186
 #, c-format
 msgid ""
 "%s and %s are string variables with different widths.  All variables in this "
 "variable list must have the same width.  %s will be omttied from the list."
 msgstr ""
 
-#: src/language/lexer/variable-parser.c:192
+#: src/language/lexer/variable-parser.c:191
 #, c-format
 msgid "Variable %s appears twice in variable list."
 msgstr ""
 
-#: src/language/lexer/variable-parser.c:305
+#: src/language/lexer/variable-parser.c:304
 #, c-format
 msgid "%s TO %s is not valid syntax since %s precedes %s in the dictionary."
 msgstr ""
 
-#: src/language/lexer/variable-parser.c:313
+#: src/language/lexer/variable-parser.c:312
 #, c-format
 msgid ""
 "When using the TO keyword to specify several variables, both variables must "
@@ -2323,492 +2323,492 @@ msgid ""
 "system variables.  %s is a %s variable, whereas %s is %s."
 msgstr ""
 
-#: src/language/lexer/variable-parser.c:387
+#: src/language/lexer/variable-parser.c:386
 msgid "incorrect use of TO convention"
 msgstr ""
 
-#: src/language/lexer/variable-parser.c:430
+#: src/language/lexer/variable-parser.c:429
 msgid "Scratch variables not allowed here."
 msgstr ""
 
-#: src/language/lexer/variable-parser.c:452
+#: src/language/lexer/variable-parser.c:451
 msgid "Prefixes don't match in use of TO convention."
 msgstr ""
 
-#: src/language/lexer/variable-parser.c:457
+#: src/language/lexer/variable-parser.c:456
 msgid "Bad bounds in use of TO convention."
 msgstr ""
 
-#: src/language/stats/aggregate.c:219
+#: src/language/stats/aggregate.c:218
 msgid "while expecting COLUMNWISE"
 msgstr ""
 
-#: src/language/stats/aggregate.c:248
+#: src/language/stats/aggregate.c:247
 msgid "expecting BREAK"
 msgstr ""
 
-#: src/language/stats/aggregate.c:253
+#: src/language/stats/aggregate.c:252
 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:433
+#: src/language/stats/aggregate.c:432
 msgid "expecting aggregation function"
 msgstr ""
 
-#: src/language/stats/aggregate.c:451
+#: src/language/stats/aggregate.c:450
 #, c-format
 msgid "Unknown aggregation function %s."
 msgstr ""
 
-#: src/language/stats/aggregate.c:507
+#: src/language/stats/aggregate.c:506
 #, c-format
 msgid "Missing argument %d to %s."
 msgstr ""
 
-#: src/language/stats/aggregate.c:516
+#: src/language/stats/aggregate.c:515
 #, c-format
 msgid "Arguments to %s must be of same type as source variables."
 msgstr ""
 
-#: src/language/stats/aggregate.c:538
+#: src/language/stats/aggregate.c:537
 #, c-format
 msgid ""
 "Number of source variables (%u) does not match number of target variables (%"
 "u)."
 msgstr ""
 
-#: src/language/stats/aggregate.c:554
+#: src/language/stats/aggregate.c:553
 #, 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:624
+#: src/language/stats/aggregate.c:623
 #, c-format
 msgid ""
 "Variable name %s is not unique within the aggregate file dictionary, which "
 "contains the aggregate variables and the break variables."
 msgstr ""
 
-#: src/language/stats/autorecode.c:136
+#: src/language/stats/autorecode.c:135
 #, c-format
 msgid "Source variable count (%u) does not match target variable count (%u)."
 msgstr ""
 
-#: src/language/stats/autorecode.c:164
+#: src/language/stats/autorecode.c:163
 #, c-format
 msgid "Target variable %s duplicates existing variable %s."
 msgstr ""
 
-#: src/language/stats/autorecode.c:171
+#: src/language/stats/autorecode.c:170
 #, c-format
 msgid "Duplicate variable name %s among target variables."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:272
+#: src/language/stats/crosstabs.q:271
 msgid ""
 "Missing mode REPORT not allowed in general mode.  Assuming MISSING=TABLE."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:282
+#: src/language/stats/crosstabs.q:281
 msgid "Write mode ALL not allowed in general mode.  Assuming WRITE=CELLS."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:338
+#: src/language/stats/crosstabs.q:337
 msgid "Too many crosstabulation variables or dimensions."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:348
+#: src/language/stats/crosstabs.q:347
 msgid "expecting BY"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:415
+#: src/language/stats/crosstabs.q:414
 msgid "VARIABLES must be specified before TABLES."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:453
+#: src/language/stats/crosstabs.q:452
 #, c-format
 msgid "Maximum value (%ld) less than minimum value (%ld)."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:817
+#: src/language/stats/crosstabs.q:816
 msgid "Summary."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:819 src/language/stats/examine.q:977
+#: src/language/stats/crosstabs.q:818 src/language/stats/examine.q:977
 msgid "Cases"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:820 src/language/stats/examine.q:911
-#: src/language/stats/frequencies.q:1176 src/language/stats/frequencies.q:1551
+#: src/language/stats/crosstabs.q:819 src/language/stats/examine.q:911
+#: src/language/stats/frequencies.q:1175 src/language/stats/frequencies.q:1550
 msgid "Valid"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:821 src/language/stats/examine.q:912
-#: src/language/stats/frequencies.q:1245 src/language/stats/frequencies.q:1552
-#: src/ui/gui/var-sheet.c:77
+#: src/language/stats/crosstabs.q:820 src/language/stats/examine.q:912
+#: src/language/stats/frequencies.q:1244 src/language/stats/frequencies.q:1551
+#: src/ui/gui/var-sheet.c:76
 msgid "Missing"
 msgstr "Löse"
 
-#: src/language/stats/crosstabs.q:822 src/language/stats/crosstabs.q:1022
-#: src/language/stats/crosstabs.q:1745 src/language/stats/examine.q:913
-#: src/language/stats/frequencies.q:1254 src/language/stats/oneway.q:307
+#: src/language/stats/crosstabs.q:821 src/language/stats/crosstabs.q:1021
+#: src/language/stats/crosstabs.q:1744 src/language/stats/examine.q:913
+#: src/language/stats/frequencies.q:1253 src/language/stats/oneway.q:307
 #: src/language/stats/oneway.q:471 src/language/stats/regression.q:315
 msgid "Total"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:832 src/language/stats/examine.q:989
-#: src/language/stats/frequencies.q:1550 src/language/stats/oneway.q:392
+#: src/language/stats/crosstabs.q:831 src/language/stats/examine.q:989
+#: src/language/stats/frequencies.q:1549 src/language/stats/oneway.q:392
 #: src/language/stats/t-test.q:683 src/language/stats/t-test.q:706
 #: src/language/stats/t-test.q:832 src/language/stats/t-test.q:1369
 msgid "N"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:833 src/language/stats/examine.q:992
-#: src/language/stats/frequencies.q:1180 src/language/stats/frequencies.q:1181
-#: src/language/stats/frequencies.q:1182
+#: src/language/stats/crosstabs.q:832 src/language/stats/examine.q:992
+#: src/language/stats/frequencies.q:1179 src/language/stats/frequencies.q:1180
+#: src/language/stats/frequencies.q:1181
 msgid "Percent"
 msgstr "Prozent"
 
-#: src/language/stats/crosstabs.q:1074
+#: src/language/stats/crosstabs.q:1073
 msgid "count"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1075
+#: src/language/stats/crosstabs.q:1074
 msgid "row %"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1076
+#: src/language/stats/crosstabs.q:1075
 msgid "column %"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1077
+#: src/language/stats/crosstabs.q:1076
 msgid "total %"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1078
+#: src/language/stats/crosstabs.q:1077
 msgid "expected"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1079
+#: src/language/stats/crosstabs.q:1078
 msgid "residual"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1080
+#: src/language/stats/crosstabs.q:1079
 msgid "std. resid."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1081
+#: src/language/stats/crosstabs.q:1080
 msgid "adj. resid."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1111
+#: src/language/stats/crosstabs.q:1110
 msgid "Chi-square tests."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1114 src/language/stats/crosstabs.q:1141
-#: src/language/stats/crosstabs.q:1161 src/language/stats/crosstabs.q:1182
+#: src/language/stats/crosstabs.q:1113 src/language/stats/crosstabs.q:1140
+#: src/language/stats/crosstabs.q:1160 src/language/stats/crosstabs.q:1181
 #: src/language/stats/examine.q:1424
 msgid "Statistic"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1116 src/language/stats/oneway.q:280
+#: src/language/stats/crosstabs.q:1115 src/language/stats/oneway.q:280
 #: src/language/stats/oneway.q:681 src/language/stats/regression.q:308
 #: src/language/stats/t-test.q:983 src/language/stats/t-test.q:1175
 #: src/language/stats/t-test.q:1268
 msgid "df"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1118
+#: src/language/stats/crosstabs.q:1117
 msgid "Asymp. Sig. (2-sided)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1120
+#: src/language/stats/crosstabs.q:1119
 msgid "Exact. Sig. (2-sided)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1122
+#: src/language/stats/crosstabs.q:1121
 msgid "Exact. Sig. (1-sided)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1137
+#: src/language/stats/crosstabs.q:1136
 msgid "Symmetric measures."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1140 src/language/stats/crosstabs.q:1181
+#: src/language/stats/crosstabs.q:1139 src/language/stats/crosstabs.q:1180
 msgid "Category"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1143 src/language/stats/crosstabs.q:1185
+#: src/language/stats/crosstabs.q:1142 src/language/stats/crosstabs.q:1184
 msgid "Asymp. Std. Error"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1144 src/language/stats/crosstabs.q:1186
+#: src/language/stats/crosstabs.q:1143 src/language/stats/crosstabs.q:1185
 msgid "Approx. T"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1145 src/language/stats/crosstabs.q:1187
+#: src/language/stats/crosstabs.q:1144 src/language/stats/crosstabs.q:1186
 msgid "Approx. Sig."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1156
+#: src/language/stats/crosstabs.q:1155
 msgid "Risk estimate."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1160
+#: src/language/stats/crosstabs.q:1159
 #, c-format
 msgid "95%% Confidence Interval"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1163 src/language/stats/t-test.q:987
+#: src/language/stats/crosstabs.q:1162 src/language/stats/t-test.q:987
 #: src/language/stats/t-test.q:1172 src/language/stats/t-test.q:1271
 msgid "Lower"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1164 src/language/stats/t-test.q:988
+#: src/language/stats/crosstabs.q:1163 src/language/stats/t-test.q:988
 #: src/language/stats/t-test.q:1173 src/language/stats/t-test.q:1272
 msgid "Upper"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1178
+#: src/language/stats/crosstabs.q:1177
 msgid "Directional measures."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1183 src/ui/gui/var-sheet.c:72
+#: src/language/stats/crosstabs.q:1182 src/ui/gui/var-sheet.c:71
 msgid "Type"
 msgstr "Typ"
 
-#: src/language/stats/crosstabs.q:1936
+#: src/language/stats/crosstabs.q:1935
 msgid "Pearson Chi-Square"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1937
+#: src/language/stats/crosstabs.q:1936
 msgid "Likelihood Ratio"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1938
+#: src/language/stats/crosstabs.q:1937
 msgid "Fisher's Exact Test"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1939
+#: src/language/stats/crosstabs.q:1938
 msgid "Continuity Correction"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1940
+#: src/language/stats/crosstabs.q:1939
 msgid "Linear-by-Linear Association"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1977 src/language/stats/crosstabs.q:2047
-#: src/language/stats/crosstabs.q:2106
+#: src/language/stats/crosstabs.q:1976 src/language/stats/crosstabs.q:2046
+#: src/language/stats/crosstabs.q:2105
 msgid "N of Valid Cases"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1993 src/language/stats/crosstabs.q:2122
+#: src/language/stats/crosstabs.q:1992 src/language/stats/crosstabs.q:2121
 msgid "Nominal by Nominal"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1994 src/language/stats/crosstabs.q:2123
+#: src/language/stats/crosstabs.q:1993 src/language/stats/crosstabs.q:2122
 msgid "Ordinal by Ordinal"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1995
+#: src/language/stats/crosstabs.q:1994
 msgid "Interval by Interval"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1996
+#: src/language/stats/crosstabs.q:1995
 msgid "Measure of Agreement"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2001
+#: src/language/stats/crosstabs.q:2000
 msgid "Phi"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2002
+#: src/language/stats/crosstabs.q:2001
 msgid "Cramer's V"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2003
+#: src/language/stats/crosstabs.q:2002
 msgid "Contingency Coefficient"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2004
+#: src/language/stats/crosstabs.q:2003
 msgid "Kendall's tau-b"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2005
+#: src/language/stats/crosstabs.q:2004
 msgid "Kendall's tau-c"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2006
+#: src/language/stats/crosstabs.q:2005
 msgid "Gamma"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2007
+#: src/language/stats/crosstabs.q:2006
 msgid "Spearman Correlation"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2008
+#: src/language/stats/crosstabs.q:2007
 msgid "Pearson's R"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2009
+#: src/language/stats/crosstabs.q:2008
 msgid "Kappa"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2079
+#: src/language/stats/crosstabs.q:2078
 #, c-format
 msgid "Odds Ratio for %s (%g / %g)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2082
+#: src/language/stats/crosstabs.q:2081
 #, c-format
 msgid "Odds Ratio for %s (%.*s / %.*s)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2090
+#: src/language/stats/crosstabs.q:2089
 #, c-format
 msgid "For cohort %s = %g"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2093
+#: src/language/stats/crosstabs.q:2092
 #, c-format
 msgid "For cohort %s = %.*s"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2124
+#: src/language/stats/crosstabs.q:2123
 msgid "Nominal by Interval"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2129
+#: src/language/stats/crosstabs.q:2128
 msgid "Lambda"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2130
+#: src/language/stats/crosstabs.q:2129
 msgid "Goodman and Kruskal tau"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2131
+#: src/language/stats/crosstabs.q:2130
 msgid "Uncertainty Coefficient"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2132
+#: src/language/stats/crosstabs.q:2131
 msgid "Somers' d"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2133
+#: src/language/stats/crosstabs.q:2132
 msgid "Eta"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2138
+#: src/language/stats/crosstabs.q:2137
 msgid "Symmetric"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2139 src/language/stats/crosstabs.q:2140
+#: src/language/stats/crosstabs.q:2138 src/language/stats/crosstabs.q:2139
 #, c-format
 msgid "%s Dependent"
 msgstr ""
 
-#: src/language/stats/descriptives.c:107 src/language/stats/examine.q:1529
-#: src/language/stats/frequencies.q:124 src/language/stats/oneway.q:393
+#: src/language/stats/descriptives.c:106 src/language/stats/examine.q:1529
+#: src/language/stats/frequencies.q:123 src/language/stats/oneway.q:393
 #: 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:1169
 msgid "Mean"
 msgstr ""
 
-#: src/language/stats/descriptives.c:108
+#: src/language/stats/descriptives.c:107
 msgid "S E Mean"
 msgstr ""
 
-#: src/language/stats/descriptives.c:109 src/language/stats/frequencies.q:128
+#: src/language/stats/descriptives.c:108 src/language/stats/frequencies.q:127
 msgid "Std Dev"
 msgstr ""
 
-#: src/language/stats/descriptives.c:110 src/language/stats/examine.q:1609
-#: src/language/stats/frequencies.q:129
+#: src/language/stats/descriptives.c:109 src/language/stats/examine.q:1609
+#: src/language/stats/frequencies.q:128
 msgid "Variance"
 msgstr ""
 
-#: src/language/stats/descriptives.c:111 src/language/stats/examine.q:1716
-#: src/language/stats/frequencies.q:130
+#: src/language/stats/descriptives.c:110 src/language/stats/examine.q:1716
+#: src/language/stats/frequencies.q:129
 msgid "Kurtosis"
 msgstr ""
 
-#: src/language/stats/descriptives.c:112
+#: src/language/stats/descriptives.c:111
 msgid "S E Kurt"
 msgstr ""
 
-#: src/language/stats/descriptives.c:113 src/language/stats/examine.q:1696
-#: src/language/stats/frequencies.q:132
+#: src/language/stats/descriptives.c:112 src/language/stats/examine.q:1696
+#: src/language/stats/frequencies.q:131
 msgid "Skewness"
 msgstr ""
 
-#: src/language/stats/descriptives.c:114
+#: src/language/stats/descriptives.c:113
 msgid "S E Skew"
 msgstr ""
 
-#: src/language/stats/descriptives.c:115 src/language/stats/examine.q:1657
-#: src/language/stats/frequencies.q:134
+#: src/language/stats/descriptives.c:114 src/language/stats/examine.q:1657
+#: src/language/stats/frequencies.q:133
 msgid "Range"
 msgstr ""
 
-#: src/language/stats/descriptives.c:116 src/language/stats/examine.q:1634
-#: src/language/stats/frequencies.q:135 src/language/stats/oneway.q:405
+#: src/language/stats/descriptives.c:115 src/language/stats/examine.q:1634
+#: src/language/stats/frequencies.q:134 src/language/stats/oneway.q:405
 msgid "Minimum"
 msgstr ""
 
-#: src/language/stats/descriptives.c:117 src/language/stats/examine.q:1645
-#: src/language/stats/frequencies.q:136 src/language/stats/oneway.q:406
+#: src/language/stats/descriptives.c:116 src/language/stats/examine.q:1645
+#: src/language/stats/frequencies.q:135 src/language/stats/oneway.q:406
 msgid "Maximum"
 msgstr ""
 
-#: src/language/stats/descriptives.c:118 src/language/stats/frequencies.q:137
+#: src/language/stats/descriptives.c:117 src/language/stats/frequencies.q:136
 msgid "Sum"
 msgstr ""
 
-#: src/language/stats/descriptives.c:347
+#: src/language/stats/descriptives.c:346
 #, c-format
 msgid "Z-score variable name %s would be a duplicate variable name."
 msgstr ""
 
-#: src/language/stats/descriptives.c:450
+#: src/language/stats/descriptives.c:449
 msgid "expecting statistic name: reverting to default"
 msgstr ""
 
-#: src/language/stats/descriptives.c:523
+#: src/language/stats/descriptives.c:522
 msgid ""
 "Ran out of generic names for Z-score variables.  There are only 126 generic "
 "names: ZSC001-ZSC0999, STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09."
 msgstr ""
 
-#: src/language/stats/descriptives.c:555
+#: src/language/stats/descriptives.c:554
 msgid "Mapping of variables to corresponding Z-scores."
 msgstr ""
 
-#: src/language/stats/descriptives.c:560
+#: src/language/stats/descriptives.c:559
 msgid "Source"
 msgstr ""
 
-#: src/language/stats/descriptives.c:561
+#: src/language/stats/descriptives.c:560
 msgid "Target"
 msgstr ""
 
-#: src/language/stats/descriptives.c:675
+#: src/language/stats/descriptives.c:674
 #, c-format
 msgid "Z-score of %s"
 msgstr ""
 
-#: src/language/stats/descriptives.c:894
+#: src/language/stats/descriptives.c:893
 msgid "Valid N"
 msgstr ""
 
-#: src/language/stats/descriptives.c:895
+#: src/language/stats/descriptives.c:894
 msgid "Missing N"
 msgstr ""
 
-#: src/language/stats/descriptives.c:922
+#: src/language/stats/descriptives.c:921
 #, c-format
 msgid "Valid cases = %g; cases with missing value(s) = %g."
 msgstr ""
@@ -2870,7 +2870,7 @@ msgstr ""
 msgid "5%% Trimmed Mean"
 msgstr ""
 
-#: src/language/stats/examine.q:1587 src/language/stats/frequencies.q:126
+#: src/language/stats/examine.q:1587 src/language/stats/frequencies.q:125
 msgid "Median"
 msgstr ""
 
@@ -2916,7 +2916,7 @@ msgid "Dev from Normal"
 msgstr ""
 
 #: src/language/stats/examine.q:2015 src/language/stats/examine.q:2037
-#: src/language/stats/frequencies.q:1562
+#: src/language/stats/frequencies.q:1561
 msgid "Percentiles"
 msgstr ""
 
@@ -2924,162 +2924,162 @@ msgstr ""
 msgid "Tukey's Hinges"
 msgstr ""
 
-#: src/language/stats/flip.c:102
+#: src/language/stats/flip.c:101
 msgid ""
 "FLIP ignores TEMPORARY.  Temporary transformations will be made permanent."
 msgstr ""
 
-#: src/language/stats/flip.c:244
+#: src/language/stats/flip.c:243
 #, c-format
 msgid "Could not create acceptable variant for variable %s."
 msgstr ""
 
-#: src/language/stats/flip.c:260
+#: src/language/stats/flip.c:259
 msgid "Cannot create more than 99999 variable names."
 msgstr ""
 
-#: src/language/stats/flip.c:297
+#: src/language/stats/flip.c:296
 msgid "Could not create temporary file for FLIP."
 msgstr ""
 
-#: src/language/stats/flip.c:308 src/language/stats/flip.c:377
+#: src/language/stats/flip.c:307 src/language/stats/flip.c:376
 #, c-format
 msgid "Error writing FLIP file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:424
+#: src/language/stats/flip.c:423
 #, c-format
 msgid "Error rewinding FLIP file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:431
+#: src/language/stats/flip.c:430
 msgid "Error creating FLIP source file."
 msgstr ""
 
-#: src/language/stats/flip.c:443
+#: src/language/stats/flip.c:442
 #, c-format
 msgid "Error reading FLIP file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:467
+#: src/language/stats/flip.c:466
 #, c-format
 msgid "Error seeking FLIP source file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:475
+#: src/language/stats/flip.c:474
 #, c-format
 msgid "Error writing FLIP source file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:486
+#: src/language/stats/flip.c:485
 #, c-format
 msgid "Error closing FLIP source file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:494
+#: src/language/stats/flip.c:493
 #, c-format
 msgid "Error rewinding FLIP source file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:542
+#: src/language/stats/flip.c:541
 #, c-format
 msgid "Error reading FLIP temporary file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:545
+#: src/language/stats/flip.c:544
 msgid "Unexpected end of file reading FLIP temporary file."
 msgstr ""
 
-#: src/language/stats/frequencies.q:125
+#: src/language/stats/frequencies.q:124
 msgid "S.E. Mean"
 msgstr ""
 
-#: src/language/stats/frequencies.q:127
+#: src/language/stats/frequencies.q:126
 msgid "Mode"
 msgstr ""
 
-#: src/language/stats/frequencies.q:131
+#: src/language/stats/frequencies.q:130
 msgid "S.E. Kurt"
 msgstr ""
 
-#: src/language/stats/frequencies.q:133
+#: src/language/stats/frequencies.q:132
 msgid "S.E. Skew"
 msgstr ""
 
-#: src/language/stats/frequencies.q:415
+#: src/language/stats/frequencies.q:414
 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:498
+#: src/language/stats/frequencies.q:497
 #, 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:830
+#: src/language/stats/frequencies.q:829
 msgid ""
 "Upper limit of integer mode value range must be greater than lower limit."
 msgstr ""
 
-#: src/language/stats/frequencies.q:843
+#: src/language/stats/frequencies.q:842
 #, c-format
 msgid "Variable %s specified multiple times on VARIABLES subcommand."
 msgstr ""
 
-#: src/language/stats/frequencies.q:849
+#: src/language/stats/frequencies.q:848
 #, c-format
 msgid "Integer mode specified, but %s is not a numeric variable."
 msgstr ""
 
-#: src/language/stats/frequencies.q:923
+#: src/language/stats/frequencies.q:922
 msgid "`)' expected after GROUPED interval list."
 msgstr ""
 
-#: src/language/stats/frequencies.q:935
+#: src/language/stats/frequencies.q:934
 #, c-format
 msgid "Variables %s specified on GROUPED but not on VARIABLES."
 msgstr ""
 
-#: src/language/stats/frequencies.q:942
+#: src/language/stats/frequencies.q:941
 #, c-format
 msgid "Variables %s specified multiple times on GROUPED subcommand."
 msgstr ""
 
-#: src/language/stats/frequencies.q:1177 src/language/stats/frequencies.q:1269
-#: src/language/stats/frequencies.q:1270 src/language/stats/frequencies.q:1304
+#: src/language/stats/frequencies.q:1176 src/language/stats/frequencies.q:1268
+#: src/language/stats/frequencies.q:1269 src/language/stats/frequencies.q:1303
 msgid "Cum"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1179 src/output/charts/plot-hist.c:129
+#: src/language/stats/frequencies.q:1178 src/output/charts/plot-hist.c:129
 msgid "Frequency"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1200
+#: src/language/stats/frequencies.q:1199
 msgid "Value Label"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1302
+#: src/language/stats/frequencies.q:1301
 msgid "Freq"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1303 src/language/stats/frequencies.q:1305
+#: src/language/stats/frequencies.q:1302 src/language/stats/frequencies.q:1304
 msgid "Pct"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1524
+#: src/language/stats/frequencies.q:1523
 #, c-format
 msgid "No valid data for variable %s; statistics not displayed."
 msgstr ""
 
-#: src/language/stats/means.q:103
+#: src/language/stats/means.q:102
 msgid "Missing required subcommand TABLES."
 msgstr ""
 
-#: src/language/stats/means.q:137
+#: src/language/stats/means.q:136
 msgid "TABLES subcommand may not appear more than once."
 msgstr ""
 
@@ -3291,15 +3291,15 @@ msgstr ""
 msgid "Dependent variable must be numeric."
 msgstr ""
 
-#: src/language/stats/sort-cases.c:64
+#: src/language/stats/sort-cases.c:63
 msgid "Buffer limit must be at least 2."
 msgstr ""
 
-#: src/language/stats/sort-criteria.c:98
+#: src/language/stats/sort-criteria.c:97
 msgid "`A' or `D' expected inside parentheses."
 msgstr ""
 
-#: src/language/stats/sort-criteria.c:103
+#: src/language/stats/sort-criteria.c:102
 msgid "`)' expected."
 msgstr ""
 
@@ -3431,59 +3431,59 @@ msgstr ""
 msgid "%s & %s"
 msgstr ""
 
-#: src/language/syntax-file.c:89
+#: src/language/syntax-file.c:88
 #, c-format
 msgid "opening \"%s\" as syntax file"
 msgstr ""
 
-#: src/language/syntax-file.c:94
+#: src/language/syntax-file.c:93
 #, c-format
 msgid "Opening `%s': %s."
 msgstr ""
 
-#: src/language/syntax-file.c:107
+#: src/language/syntax-file.c:106
 #, c-format
 msgid "Reading `%s': %s."
 msgstr ""
 
-#: src/language/syntax-file.c:128
+#: src/language/syntax-file.c:127
 #, c-format
 msgid "Closing `%s': %s."
 msgstr ""
 
-#: src/language/tests/float-format.c:127
+#: src/language/tests/float-format.c:126
 #, c-format
 msgid "%d-byte string needed but %d-byte string supplied."
 msgstr ""
 
-#: src/language/tests/float-format.c:138
+#: src/language/tests/float-format.c:137
 msgid "Hexadecimal floating constant too long."
 msgstr ""
 
-#: src/language/tests/float-format.c:203
+#: src/language/tests/float-format.c:202
 #, c-format
 msgid ""
 "%s conversion of %s from %s to %s should have produced %s but actually "
 "produced %s."
 msgstr ""
 
-#: src/language/tests/float-format.c:249
+#: src/language/tests/float-format.c:248
 msgid "Too many values in single command."
 msgstr ""
 
-#: src/language/tests/moments-test.c:50
+#: src/language/tests/moments-test.c:49
 msgid "expecting weight value"
 msgstr ""
 
-#: src/language/utilities/date.c:35
+#: src/language/utilities/date.c:34
 msgid "Only USE ALL is currently implemented."
 msgstr ""
 
-#: src/language/utilities/include.c:50
+#: src/language/utilities/include.c:49
 msgid "expecting file name"
 msgstr ""
 
-#: src/language/utilities/include.c:65
+#: src/language/utilities/include.c:64
 #, c-format
 msgid "Can't find `%s' in include file search path."
 msgstr ""
@@ -3503,235 +3503,235 @@ msgstr ""
 msgid "Cannot change mode of %s: %s"
 msgstr ""
 
-#: src/language/utilities/set.q:202 src/language/utilities/set.q:204
-#: src/language/utilities/set.q:206 src/language/utilities/set.q:208
-#: src/language/utilities/set.q:210 src/language/utilities/set.q:212
-#: src/language/utilities/set.q:214 src/language/utilities/set.q:216
-#: src/language/utilities/set.q:218
+#: src/language/utilities/set.q:201 src/language/utilities/set.q:203
+#: src/language/utilities/set.q:205 src/language/utilities/set.q:207
+#: src/language/utilities/set.q:209 src/language/utilities/set.q:211
+#: src/language/utilities/set.q:213 src/language/utilities/set.q:215
+#: src/language/utilities/set.q:217
 #, c-format
 msgid "%s is obsolete."
 msgstr ""
 
-#: src/language/utilities/set.q:221
+#: src/language/utilities/set.q:220
 #, c-format
 msgid "%s is not implemented."
 msgstr ""
 
-#: src/language/utilities/set.q:224
+#: src/language/utilities/set.q:223
 msgid "Active file compression is not implemented."
 msgstr ""
 
-#: src/language/utilities/set.q:348
+#: src/language/utilities/set.q:347
 #, c-format
 msgid ""
 "%s: Custom currency string `%s' does not contain exactly three periods or "
 "commas (or it contains both)."
 msgstr ""
 
-#: src/language/utilities/set.q:404
+#: src/language/utilities/set.q:403
 msgid "EPOCH must be 1500 or later."
 msgstr ""
 
-#: src/language/utilities/set.q:411
+#: src/language/utilities/set.q:410
 msgid "expecting AUTOMATIC or year"
 msgstr ""
 
-#: src/language/utilities/set.q:432
+#: src/language/utilities/set.q:431
 msgid "LENGTH must be at least 1."
 msgstr ""
 
-#: src/language/utilities/set.q:476
+#: src/language/utilities/set.q:475
 msgid "WIDTH must be at least 40."
 msgstr ""
 
-#: src/language/utilities/set.q:499
+#: src/language/utilities/set.q:498
 #, c-format
 msgid ""
 "FORMAT requires numeric output format as an argument.  Specified format %s "
 "is of type string."
 msgstr ""
 
-#: src/language/utilities/set.q:556
+#: src/language/utilities/set.q:555
 msgid "BLANKS is SYSMIS."
 msgstr ""
 
-#: src/language/utilities/set.q:558
+#: src/language/utilities/set.q:557
 #, c-format
 msgid "BLANKS is %g."
 msgstr ""
 
-#: src/language/utilities/set.q:593
+#: src/language/utilities/set.q:592
 #, c-format
 msgid "%s is \"%s\"."
 msgstr ""
 
-#: src/language/utilities/set.q:629
+#: src/language/utilities/set.q:628
 #, c-format
 msgid "DECIMAL is \"%c\"."
 msgstr ""
 
-#: src/language/utilities/set.q:635
+#: src/language/utilities/set.q:634
 #, c-format
 msgid "ENDCMD is \"%c\"."
 msgstr ""
 
-#: src/language/utilities/set.q:643
+#: src/language/utilities/set.q:642
 #, c-format
 msgid "ERRORS is \"%s\"."
 msgstr ""
 
-#: src/language/utilities/set.q:654
+#: src/language/utilities/set.q:653
 #, c-format
 msgid "FORMAT is %s."
 msgstr ""
 
-#: src/language/utilities/set.q:660
+#: src/language/utilities/set.q:659
 #, c-format
 msgid "LENGTH is %d."
 msgstr ""
 
-#: src/language/utilities/set.q:666
+#: src/language/utilities/set.q:665
 #, c-format
 msgid "MXERRS is %d."
 msgstr ""
 
-#: src/language/utilities/set.q:672
+#: src/language/utilities/set.q:671
 #, c-format
 msgid "MXLOOPS is %d."
 msgstr ""
 
-#: src/language/utilities/set.q:678
+#: src/language/utilities/set.q:677
 #, c-format
 msgid "MXWARNS is %d."
 msgstr ""
 
-#: src/language/utilities/set.q:685 src/language/utilities/set.q:736
+#: src/language/utilities/set.q:684 src/language/utilities/set.q:735
 #, c-format
 msgid "%s is %s (%s)."
 msgstr ""
 
-#: src/language/utilities/set.q:757
+#: src/language/utilities/set.q:756
 msgid "SCOMPRESSION is ON."
 msgstr ""
 
-#: src/language/utilities/set.q:759
+#: src/language/utilities/set.q:758
 msgid "SCOMPRESSION is OFF."
 msgstr ""
 
-#: src/language/utilities/set.q:766
+#: src/language/utilities/set.q:765
 msgid "UNDEFINED is WARN."
 msgstr ""
 
-#: src/language/utilities/set.q:768
+#: src/language/utilities/set.q:767
 msgid "UNDEFINED is NOWARN."
 msgstr ""
 
-#: src/language/utilities/set.q:776
+#: src/language/utilities/set.q:775
 msgid "WEIGHT is off."
 msgstr ""
 
-#: src/language/utilities/set.q:778
+#: src/language/utilities/set.q:777
 #, c-format
 msgid "WEIGHT is variable %s."
 msgstr ""
 
-#: src/language/utilities/set.q:796
+#: src/language/utilities/set.q:795
 #, c-format
 msgid "WIDTH is %d."
 msgstr ""
 
-#: src/language/utilities/title.c:70
+#: src/language/utilities/title.c:69
 #, c-format
 msgid "%s: `.' expected after string."
 msgstr ""
 
-#: src/language/utilities/title.c:139
+#: src/language/utilities/title.c:138
 #, c-format
 msgid "Document entered %s by %s:"
 msgstr ""
 
-#: src/language/xforms/compute.c:148 src/language/xforms/compute.c:196
+#: src/language/xforms/compute.c:147 src/language/xforms/compute.c:195
 #, c-format
 msgid ""
 "When executing COMPUTE: SYSMIS is not a valid value as an index into vector %"
 "s."
 msgstr ""
 
-#: src/language/xforms/compute.c:152 src/language/xforms/compute.c:203
+#: src/language/xforms/compute.c:151 src/language/xforms/compute.c:202
 #, c-format
 msgid ""
 "When executing COMPUTE: %g is not a valid value as an index into vector %s."
 msgstr ""
 
-#: src/language/xforms/compute.c:346
+#: src/language/xforms/compute.c:345
 #, c-format
 msgid "There is no vector named %s."
 msgstr ""
 
-#: src/language/xforms/count.c:125
+#: src/language/xforms/count.c:124
 msgid "Destination cannot be a string variable."
 msgstr ""
 
-#: src/language/xforms/recode.c:249
+#: src/language/xforms/recode.c:248
 msgid ""
 "Inconsistent target variable types.  Target variables must be all numeric or "
 "all string."
 msgstr ""
 
-#: src/language/xforms/recode.c:269
+#: src/language/xforms/recode.c:268
 msgid "CONVERT requires string input values and numeric output values."
 msgstr ""
 
-#: src/language/xforms/recode.c:387
+#: src/language/xforms/recode.c:386
 msgid "expecting output value"
 msgstr ""
 
-#: src/language/xforms/recode.c:436
+#: src/language/xforms/recode.c:435
 #, c-format
 msgid ""
 "%u variable(s) cannot be recoded into %u variable(s).  Specify the same "
 "number of variables as source and target variables."
 msgstr ""
 
-#: src/language/xforms/recode.c:451
+#: src/language/xforms/recode.c:450
 #, c-format
 msgid ""
 "There is no variable named %s.  (All string variables specified on INTO must "
 "already exist.  Use the STRING command to create a string variable.)"
 msgstr ""
 
-#: src/language/xforms/recode.c:466
+#: src/language/xforms/recode.c:465
 #, c-format
 msgid "INTO is required with %s input values and %s output values."
 msgstr ""
 
-#: src/language/xforms/recode.c:479
+#: src/language/xforms/recode.c:478
 #, c-format
 msgid "Type mismatch.  Cannot store %s data in %s variable %s."
 msgstr ""
 
-#: src/language/xforms/sample.c:78
+#: src/language/xforms/sample.c:77
 msgid "The sampling factor must be between 0 and 1 exclusive."
 msgstr ""
 
-#: src/language/xforms/sample.c:98
+#: src/language/xforms/sample.c:97
 #, c-format
 msgid "Cannot sample %d observations from a population of %d."
 msgstr ""
 
-#: src/language/xforms/select-if.c:102
+#: src/language/xforms/select-if.c:101
 msgid "Syntax error expecting OFF or BY.  Turning off case filtering."
 msgstr ""
 
-#: src/language/xforms/select-if.c:117
+#: src/language/xforms/select-if.c:116
 msgid "The filter variable must be numeric."
 msgstr ""
 
-#: src/language/xforms/select-if.c:123
+#: src/language/xforms/select-if.c:122
 msgid "The filter variable may not be scratch."
 msgstr ""
 
-#: src/libpspp/hash.c:617
+#: src/libpspp/hash.c:616
 #, c-format
 msgid "hash table:"
 msgstr ""
@@ -3756,144 +3756,144 @@ msgstr ""
 msgid "Empirical with averaging"
 msgstr ""
 
-#: src/math/sort.c:439
+#: src/math/sort.c:438
 #, 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/output/afm.c:151
+#: src/output/afm.c:150
 #, c-format
 msgid "opening font metrics file \"%s\""
 msgstr ""
 
-#: src/output/afm.c:241
+#: src/output/afm.c:240
 msgid "first line must be StartFontMetrics"
 msgstr ""
 
-#: src/output/afm.c:268
+#: src/output/afm.c:267
 #, c-format
 msgid "unsupported MappingScheme %d"
 msgstr ""
 
-#: src/output/afm.c:289
+#: src/output/afm.c:288
 msgid "required FontName is missing"
 msgstr ""
 
-#: src/output/afm.c:396
+#: src/output/afm.c:395
 msgid "CharMetrics line must start with C or CH"
 msgstr ""
 
-#: src/output/afm.c:537
+#: src/output/afm.c:536
 #, c-format
 msgid "reference to unknown character \"%s\""
 msgstr ""
 
-#: src/output/afm.c:595
+#: src/output/afm.c:594
 msgid "expected end of file"
 msgstr ""
 
-#: src/output/afm.c:607
+#: src/output/afm.c:606
 msgid "syntax error expecting end of line"
 msgstr ""
 
-#: src/output/afm.c:625 src/output/afm.c:662
+#: src/output/afm.c:624 src/output/afm.c:661
 msgid "number out of valid range"
 msgstr ""
 
-#: src/output/afm.c:627 src/output/afm.c:664
+#: src/output/afm.c:626 src/output/afm.c:663
 msgid "invalid numeric syntax"
 msgstr ""
 
-#: src/output/afm.c:643
+#: src/output/afm.c:642
 msgid "syntax error expecting integer"
 msgstr ""
 
-#: src/output/afm.c:681
+#: src/output/afm.c:680
 msgid "syntax error expecting number"
 msgstr ""
 
-#: src/output/afm.c:694
+#: src/output/afm.c:693
 msgid "syntax error in hex constant"
 msgstr ""
 
-#: src/output/afm.c:709
+#: src/output/afm.c:708
 msgid "syntax error expecting hex constant"
 msgstr ""
 
-#: src/output/afm.c:747
+#: src/output/afm.c:746
 msgid "unexpected end of line"
 msgstr ""
 
-#: src/output/afm.c:797
+#: src/output/afm.c:796
 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:830
+#: src/output/ascii.c:682 src/output/postscript.c:829
 #, 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 ""
 
@@ -3901,173 +3901,173 @@ msgstr ""
 msgid "HISTOGRAM"
 msgstr ""
 
-#: src/output/html.c:70
+#: src/output/html.c:69
 #, c-format
 msgid "opening HTML output file: %s"
 msgstr ""
 
-#: src/output/html.c:81
+#: src/output/html.c:80
 msgid "PSPP Output"
 msgstr ""
 
-#: src/output/html.c:170
+#: src/output/html.c:169
 #, c-format
 msgid "unknown configuration parameter `%s' for HTML device driver"
 msgstr ""
 
-#: src/output/html.c:186
+#: src/output/html.c:185
 msgid "`chart-files' value must contain `#'"
 msgstr ""
 
-#: src/output/html.c:384
+#: src/output/html.c:383
 #, c-format
 msgid "creating \"%s\""
 msgstr ""
 
-#: src/output/output.c:165
+#: src/output/output.c:164
 #, c-format
 msgid "unknown output driver `%s'"
 msgstr ""
 
-#: src/output/output.c:167
+#: src/output/output.c:166
 #, c-format
 msgid "output driver `%s' referenced but never defined"
 msgstr ""
 
-#: src/output/output.c:258
+#: src/output/output.c:257
 msgid "using default output driver configuration"
 msgstr ""
 
-#: src/output/output.c:287
+#: src/output/output.c:286
 msgid "cannot find output initialization file (use `-vv' to view search path)"
 msgstr ""
 
-#: src/output/output.c:295
+#: src/output/output.c:294
 #, c-format
 msgid "cannot open \"%s\""
 msgstr ""
 
-#: src/output/output.c:307
+#: src/output/output.c:306
 #, c-format
 msgid "reading \"%s\""
 msgstr ""
 
-#: src/output/output.c:329
+#: src/output/output.c:328
 msgid "syntax error"
 msgstr ""
 
-#: src/output/output.c:338
+#: src/output/output.c:337
 #, c-format
 msgid "error closing \"%s\""
 msgstr ""
 
-#: src/output/output.c:346
+#: src/output/output.c:345
 msgid "no active output drivers"
 msgstr ""
 
-#: src/output/output.c:349
+#: src/output/output.c:348
 msgid "error reading device definition file"
 msgstr ""
 
-#: src/output/output.c:466
+#: src/output/output.c:465
 #, c-format
 msgid ""
 "Driver classes:\n"
 "\t"
 msgstr ""
 
-#: src/output/output.c:498
+#: src/output/output.c:497
 #, c-format
 msgid "syntax error parsing options for \"%s\" driver"
 msgstr ""
 
-#: src/output/output.c:514
+#: src/output/output.c:513
 #, c-format
 msgid ""
 "reached end of options inside quoted string parsing options for \"%s\" driver"
 msgstr ""
 
-#: src/output/output.c:584
+#: src/output/output.c:583
 #, c-format
 msgid "syntax error in string constant parsing options for \"%s\" driver"
 msgstr ""
 
-#: src/output/output.c:632
+#: src/output/output.c:631
 #, c-format
 msgid "syntax error expecting `=' parsing options for driver \"%s\""
 msgstr ""
 
-#: src/output/output.c:683
+#: src/output/output.c:682
 #, c-format
 msgid "unknown output driver class `%.*s'"
 msgstr ""
 
-#: src/output/output.c:698
+#: src/output/output.c:697
 #, c-format
 msgid "unknown device type `%.*s'"
 msgstr ""
 
-#: src/output/output.c:715
+#: src/output/output.c:714
 #, c-format
 msgid "cannot initialize output driver `%s' of class `%s'"
 msgstr ""
 
-#: src/output/output.c:761
+#: src/output/output.c:760
 msgid "driver definition line missing driver name or class name"
 msgstr ""
 
-#: src/output/output.c:907
+#: src/output/output.c:906
 #, c-format
 msgid "unit \"%s\" is unknown in dimension \"%s\""
 msgstr ""
 
-#: src/output/output.c:922
+#: src/output/output.c:921
 #, c-format
 msgid "bad dimension \"%s\""
 msgstr ""
 
-#: src/output/output.c:948
+#: src/output/output.c:947
 #, c-format
 msgid "`x' expected in paper size `%s'"
 msgstr ""
 
-#: src/output/output.c:958
+#: src/output/output.c:957
 #, c-format
 msgid "trailing garbage `%s' on paper size `%s'"
 msgstr ""
 
-#: src/output/output.c:1002
+#: src/output/output.c:1001
 msgid "paper size name cannot be empty"
 msgstr ""
 
-#: src/output/output.c:1019
+#: src/output/output.c:1018
 msgid "cannot find `papersize' configuration file"
 msgstr ""
 
-#: src/output/output.c:1026
+#: src/output/output.c:1025
 #, c-format
 msgid "error opening \"%s\""
 msgstr ""
 
-#: src/output/output.c:1037
+#: src/output/output.c:1036
 #, c-format
 msgid "error reading \"%s\""
 msgstr ""
 
-#: src/output/output.c:1063
+#: src/output/output.c:1062
 msgid "syntax error in paper size definition"
 msgstr ""
 
-#: src/output/output.c:1075
+#: src/output/output.c:1074
 msgid "error reading paper size definition file"
 msgstr ""
 
-#: src/output/postscript.c:163
+#: src/output/postscript.c:162
 #, c-format
 msgid "opening PostScript output file \"%s\""
 msgstr ""
 
-#: src/output/postscript.c:201
+#: src/output/postscript.c:200
 #, c-format
 msgid ""
 "The defined PostScript page is not long enough to hold margins and headers, "
@@ -4075,87 +4075,87 @@ msgid ""
 "lines of each font at the default size of %d.%03d points."
 msgstr ""
 
-#: src/output/postscript.c:249
+#: src/output/postscript.c:248
 #, c-format
 msgid "closing PostScript output file \"%s\""
 msgstr ""
 
-#: src/output/postscript.c:309
+#: src/output/postscript.c:308
 #, c-format
 msgid "unknown configuration parameter `%s' for PostScript device driver"
 msgstr ""
 
-#: src/output/postscript.c:325
+#: src/output/postscript.c:324
 #, c-format
 msgid ""
 "unknown orientation `%s' (valid orientations are `portrait' and `landscape')"
 msgstr ""
 
-#: src/output/postscript.c:337
+#: src/output/postscript.c:336
 #, c-format
 msgid "boolean value expected for %s"
 msgstr ""
 
-#: src/output/postscript.c:350
+#: src/output/postscript.c:349
 #, c-format
 msgid "positive integer value required for `%s'"
 msgstr ""
 
-#: src/output/postscript.c:355
+#: src/output/postscript.c:354
 #, c-format
 msgid "default font size must be at least 1 point (value of 1000 for key `%s')"
 msgstr ""
 
-#: src/output/postscript.c:387
+#: src/output/postscript.c:386
 #, c-format
 msgid "value for `%s' must be a dimension of positive length (i.e., `1in')"
 msgstr ""
 
-#: src/output/postscript.c:1180
+#: src/output/postscript.c:1179
 #, c-format
 msgid "\"%s\": bad font specification"
 msgstr ""
 
-#: src/output/postscript.c:1188
+#: src/output/postscript.c:1187
 #, c-format
 msgid "could not find AFM file \"%s\""
 msgstr ""
 
-#: src/output/postscript.c:1202
+#: src/output/postscript.c:1201
 #, c-format
 msgid "could not find font \"%s\""
 msgstr ""
 
-#: src/output/postscript.c:1211
+#: src/output/postscript.c:1210
 #, c-format
 msgid "could not find encoding \"%s\""
 msgstr ""
 
-#: src/output/postscript.c:1311
+#: src/output/postscript.c:1310
 #, c-format
 msgid "cannot open font file \"%s\""
 msgstr ""
 
-#: src/output/postscript.c:1352
+#: src/output/postscript.c:1351
 #, c-format
 msgid "reading font file \"%s\""
 msgstr ""
 
-#: src/output/postscript.c:1374
+#: src/output/postscript.c:1373
 #, c-format
 msgid "cannot open font encoding file \"%s\""
 msgstr ""
 
-#: src/output/postscript.c:1403
+#: src/output/postscript.c:1402
 msgid "invalid numeric format"
 msgstr ""
 
-#: src/output/table.c:238
+#: src/output/table.c:237
 #, 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:309
+#: src/output/table.c:308
 #, c-format
 msgid ""
 "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n"
@@ -4165,37 +4165,37 @@ msgstr ""
 msgid "Style of bevel around the custom entry button"
 msgstr ""
 
-#: src/ui/gui/menu-actions.c:63 src/ui/gui/syntax-editor.c:61
+#: src/ui/gui/menu-actions.c:64 src/ui/gui/syntax-editor.c:61
 #: src/ui/gui/syntax-editor.c:83
 msgid "Untitled"
 msgstr "Unbetitelt"
 
-#: src/ui/gui/menu-actions.c:65
+#: src/ui/gui/menu-actions.c:66
 msgid "PSPP Data Editor"
 msgstr "PSPP Dateiaufbereiter"
 
-#: src/ui/gui/menu-actions.c:219 src/ui/gui/psppire.glade:502
+#: src/ui/gui/menu-actions.c:220 src/ui/gui/psppire.glade:502
 msgid "Open"
 msgstr "Öffen"
 
-#: src/ui/gui/menu-actions.c:227
+#: src/ui/gui/menu-actions.c:228
 msgid "System Files (*.sav)"
 msgstr "Systemedatein (*.sav)"
 
-#: src/ui/gui/menu-actions.c:233
+#: src/ui/gui/menu-actions.c:234
 msgid "Portable Files (*.por) "
 msgstr "Tragbardatein (*.por)"
 
-#: src/ui/gui/menu-actions.c:239 src/ui/gui/syntax-editor.c:122
+#: src/ui/gui/menu-actions.c:240 src/ui/gui/syntax-editor.c:122
 #: src/ui/gui/syntax-editor.c:378
 msgid "All Files"
 msgstr "Alle Datei"
 
-#: src/ui/gui/menu-actions.c:287
+#: src/ui/gui/menu-actions.c:288
 msgid "Save Data As"
 msgstr "Speichern unter"
 
-#: src/ui/gui/menu-actions.c:514
+#: src/ui/gui/menu-actions.c:515
 msgid "Font Selection"
 msgstr "Schriftwahlung"
 
@@ -4223,13 +4223,13 @@ msgstr "Falshe Spannweitebeschreibung"
 msgid "Sorry. The help system hasn't yet been implemented."
 msgstr "Es gibt noch nicht kein Helpsysteme. Schade!"
 
-#: src/ui/gui/psppire-data-store.c:724
+#: src/ui/gui/psppire-data-store.c:725
 msgid "var"
 msgstr ""
 
-#: src/ui/gui/psppire-data-store.c:805 src/ui/gui/psppire-var-store.c:521
-#: src/ui/gui/psppire-var-store.c:531 src/ui/gui/psppire-var-store.c:541
-#: src/ui/gui/psppire-var-store.c:738
+#: src/ui/gui/psppire-data-store.c:806 src/ui/gui/psppire-var-store.c:554
+#: src/ui/gui/psppire-var-store.c:564 src/ui/gui/psppire-var-store.c:574
+#: src/ui/gui/psppire-var-store.c:772
 #, c-format
 msgid "%d"
 msgstr ""
@@ -4421,11 +4421,11 @@ msgstr ""
 msgid "Variable Type"
 msgstr "Variableansicht"
 
-#: src/ui/gui/psppire.glade:1107 src/ui/gui/psppire-var-store.c:445
+#: src/ui/gui/psppire.glade:1107 src/ui/gui/psppire-var-store.c:478
 msgid "Comma"
 msgstr "Komma"
 
-#: src/ui/gui/psppire.glade:1127 src/ui/gui/psppire-var-store.c:446
+#: src/ui/gui/psppire.glade:1127 src/ui/gui/psppire-var-store.c:479
 msgid "Dot"
 msgstr "Punkt"
 
@@ -4433,11 +4433,11 @@ msgstr "Punkt"
 msgid "Scientific notation"
 msgstr "Wissenschaftlichnotation"
 
-#: src/ui/gui/psppire.glade:1167 src/ui/gui/psppire-var-store.c:448
+#: src/ui/gui/psppire.glade:1167 src/ui/gui/psppire-var-store.c:481
 msgid "Date"
 msgstr "Datum"
 
-#: src/ui/gui/psppire.glade:1187 src/ui/gui/psppire-var-store.c:449
+#: src/ui/gui/psppire.glade:1187 src/ui/gui/psppire-var-store.c:482
 msgid "Dollar"
 msgstr "Euro"
 
@@ -4505,11 +4505,11 @@ msgstr "Di_skretwerte"
 msgid "Case Number:"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:2732 src/ui/gui/sort-cases-dialog.c:282
+#: src/ui/gui/psppire.glade:2732 src/ui/gui/sort-cases-dialog.c:280
 msgid "Ascending"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:2751 src/ui/gui/sort-cases-dialog.c:284
+#: src/ui/gui/psppire.glade:2751 src/ui/gui/sort-cases-dialog.c:282
 msgid "Descending"
 msgstr ""
 
@@ -4546,23 +4546,23 @@ msgstr ""
 msgid "To End"
 msgstr ""
 
-#: src/ui/gui/psppire-var-store.c:440
+#: src/ui/gui/psppire-var-store.c:473
 msgid "None"
 msgstr "Keine"
 
-#: src/ui/gui/psppire-var-store.c:447
+#: src/ui/gui/psppire-var-store.c:480
 msgid "Scientific"
 msgstr "Wissenschäflich"
 
-#: src/ui/gui/psppire-var-store.c:450
+#: src/ui/gui/psppire-var-store.c:483
 msgid "Custom"
 msgstr "Spezial"
 
-#: src/ui/gui/sort-cases-dialog.c:342
+#: src/ui/gui/sort-cases-dialog.c:340
 msgid "Var"
 msgstr ""
 
-#: src/ui/gui/sort-cases-dialog.c:370
+#: src/ui/gui/sort-cases-dialog.c:368
 msgid "Criteria"
 msgstr ""
 
@@ -4590,55 +4590,55 @@ msgstr "PSPP Dateiaufbereiter"
 msgid "Open Syntax"
 msgstr ""
 
-#: src/ui/gui/var-sheet.c:71
+#: src/ui/gui/var-sheet.c:70
 msgid "Name"
 msgstr "Name"
 
-#: src/ui/gui/var-sheet.c:73
+#: src/ui/gui/var-sheet.c:72
 msgid "Width"
 msgstr "Große"
 
-#: src/ui/gui/var-sheet.c:74
+#: src/ui/gui/var-sheet.c:73
 msgid "Decimals"
 msgstr "Dezimalstellen"
 
-#: src/ui/gui/var-sheet.c:76
+#: src/ui/gui/var-sheet.c:75
 msgid "Values"
 msgstr "Werten"
 
-#: src/ui/gui/var-sheet.c:79
+#: src/ui/gui/var-sheet.c:78
 msgid "Align"
 msgstr "Einstellung"
 
-#: src/ui/gui/var-sheet.c:80
+#: src/ui/gui/var-sheet.c:79
 msgid "Measure"
 msgstr "Messe"
 
-#: src/ui/gui/var-sheet.c:103
+#: src/ui/gui/var-sheet.c:102
 msgid "Left"
 msgstr "Links"
 
-#: src/ui/gui/var-sheet.c:104
+#: src/ui/gui/var-sheet.c:103
 msgid "Right"
 msgstr "Rechts"
 
-#: src/ui/gui/var-sheet.c:105
+#: src/ui/gui/var-sheet.c:104
 msgid "Centre"
 msgstr "Mittel"
 
-#: src/ui/gui/var-sheet.c:110
+#: src/ui/gui/var-sheet.c:109
 msgid "Nominal"
 msgstr "Nominalwert"
 
-#: src/ui/gui/var-sheet.c:111
+#: src/ui/gui/var-sheet.c:110
 msgid "Ordinal"
 msgstr "Ordinalwert"
 
-#: src/ui/gui/var-sheet.c:112
+#: src/ui/gui/var-sheet.c:111
 msgid "Scale"
 msgstr "Skalwert"
 
-#: src/ui/terminal/command-line.c:222
+#: src/ui/terminal/command-line.c:221
 #, c-format
 msgid ""
 "PSPP, a program for statistical analysis of sample data.\n"
@@ -4684,43 +4684,43 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/ui/terminal/command-line.c:257
+#: src/ui/terminal/command-line.c:256
 #, c-format
 msgid ""
 "\n"
 "Report bugs to <%s>.\n"
 msgstr ""
 
-#: src/ui/terminal/main.c:126
+#: src/ui/terminal/main.c:125
 msgid ""
 "Stopping syntax file processing here to avoid a cascade of dependent command "
 "failures."
 msgstr ""
 
-#: src/ui/terminal/msg-ui.c:66
+#: src/ui/terminal/msg-ui.c:65
 #, c-format
 msgid "Cannot open %s (%s). Writing errors to stdout instead.\n"
 msgstr ""
 
-#: src/ui/terminal/msg-ui.c:93
+#: src/ui/terminal/msg-ui.c:92
 msgid "Terminating execution of syntax file due to error."
 msgstr ""
 
-#: src/ui/terminal/msg-ui.c:95
+#: src/ui/terminal/msg-ui.c:94
 #, c-format
 msgid "Errors (%d) exceeds limit (%d)."
 msgstr ""
 
-#: src/ui/terminal/msg-ui.c:98
+#: src/ui/terminal/msg-ui.c:97
 #, c-format
 msgid "Warnings (%d) exceed limit (%d)."
 msgstr ""
 
-#: src/ui/terminal/msg-ui.c:147
+#: src/ui/terminal/msg-ui.c:146
 msgid "error"
 msgstr "Fehler"
 
-#: src/ui/terminal/msg-ui.c:148
+#: src/ui/terminal/msg-ui.c:147
 msgid "warning"
 msgstr "Warnung"
 
index e88749621d7193141dc1f7031eff29a581617c6f..aae7ca9562b0943fec2a588ca11ab9637768b96a 100644 (file)
@@ -1,3 +1,13 @@
+Sat Dec 16 12:17:34 WST 2006 John Darrington <john@darrington.wattle.id.au>
+
+       * dictionary.c dictionary.h vardict.h variable.c: Added optional
+               callbacks which are invoked when the dictionary or its 
+               variables are changed.  
+       
+       * missing-values.c missing-values.h value-labels.c: Tidied up
+               consistency checks, and made some of them return false 
+               instead of assert-failing. 
+
 Wed Dec 13 19:30:11 2006  Ben Pfaff  <blp@gnu.org>
 
        * calendar.c (calendar_days_in_month): New function.
index d344e7516ac17b00da06567369d47b519e1254da..a5a36527c3d2803d48a686f02e82070c078de42c 100644 (file)
@@ -61,14 +61,33 @@ struct dictionary
     char *documents;           /* Documents, as a string. */
     struct vector **vector;     /* Vectors of variables. */
     size_t vector_cnt;          /* Number of vectors. */
+    const struct dict_callbacks *callbacks; /* Callbacks on dictionary
+                                              modification */
+    void *cb_data ;                  /* Data passed to callbacks */
   };
 
+
+/* Associate CALLBACKS with DICT.  Callbacks will be invoked whenever
+   the dictionary or any of the variables it contains are modified.
+   Each callback will get passed CALLBACK_DATA.
+   Any callback may be NULL, in which case it'll be ignored.
+*/
+void
+dict_set_callbacks (struct dictionary *dict,
+                   const struct dict_callbacks *callbacks,
+                   void *callback_data)
+{
+  dict->callbacks = callbacks;
+  dict->cb_data = callback_data;
+}
+
+
 /* Creates and returns a new dictionary. */
 struct dictionary *
-dict_create (void) 
+dict_create (void)
 {
-  struct dictionary *d = xmalloc (sizeof *d);
-  
+  struct dictionary *d = xzalloc (sizeof *d);
+
   d->var = NULL;
   d->var_cnt = d->var_cap = 0;
   d->name_tab = hsh_create (8, compare_vars_by_name, hash_var_by_name,
@@ -90,7 +109,7 @@ dict_create (void)
 /* Creates and returns a (deep) copy of an existing
    dictionary. */
 struct dictionary *
-dict_clone (const struct dictionary *s) 
+dict_clone (const struct dictionary *s)
 {
   struct dictionary *d;
   size_t i;
@@ -99,7 +118,7 @@ dict_clone (const struct dictionary *s)
 
   d = dict_create ();
 
-  for (i = 0; i < s->var_cnt; i++) 
+  for (i = 0; i < s->var_cnt; i++)
     {
       struct variable *sv = s->var[i];
       struct variable *dv = dict_clone_var_assert (d, sv, var_get_name (sv));
@@ -109,17 +128,17 @@ dict_clone (const struct dictionary *s)
   d->next_value_idx = s->next_value_idx;
 
   d->split_cnt = s->split_cnt;
-  if (d->split_cnt > 0) 
+  if (d->split_cnt > 0)
     {
       d->split = xnmalloc (d->split_cnt, sizeof *d->split);
-      for (i = 0; i < d->split_cnt; i++) 
+      for (i = 0; i < d->split_cnt; i++)
         d->split[i] = dict_lookup_var_assert (d, var_get_name (s->split[i]));
     }
 
-  if (s->weight != NULL) 
+  if (s->weight != NULL)
     d->weight = dict_lookup_var_assert (d, var_get_name (s->weight));
 
-  if (s->filter != NULL) 
+  if (s->filter != NULL)
     d->filter = dict_lookup_var_assert (d, var_get_name (s->filter));
 
   d->case_limit = s->case_limit;
@@ -137,7 +156,7 @@ dict_clone (const struct dictionary *s)
 /* Clears the contents from a dictionary without destroying the
    dictionary itself. */
 void
-dict_clear (struct dictionary *d) 
+dict_clear (struct dictionary *d)
 {
   /* FIXME?  Should we really clear case_limit, label, documents?
      Others are necessarily cleared by deleting all the variables.*/
@@ -148,7 +167,7 @@ dict_clear (struct dictionary *d)
   for (i = 0; i < d->var_cnt; i++)
     {
       var_clear_vardict (d->var[i]);
-      var_destroy (d->var[i]); 
+      var_destroy (d->var[i]);
     }
   free (d->var);
   d->var = NULL;
@@ -171,12 +190,12 @@ dict_clear (struct dictionary *d)
 /* Destroys the aux data for every variable in D, by calling
    var_clear_aux() for each variable. */
 void
-dict_clear_aux (struct dictionary *d) 
+dict_clear_aux (struct dictionary *d)
 {
   int i;
-  
+
   assert (d != NULL);
-  
+
   for (i = 0; i < d->var_cnt; i++)
     var_clear_aux (d->var[i]);
 }
@@ -185,7 +204,7 @@ dict_clear_aux (struct dictionary *d)
 void
 dict_destroy (struct dictionary *d)
 {
-  if (d != NULL) 
+  if (d != NULL)
     {
       dict_clear (d);
       hsh_destroy (d->name_tab);
@@ -195,7 +214,7 @@ dict_destroy (struct dictionary *d)
 
 /* Returns the number of variables in D. */
 size_t
-dict_get_var_cnt (const struct dictionary *d) 
+dict_get_var_cnt (const struct dictionary *d)
 {
   assert (d != NULL);
 
@@ -206,7 +225,7 @@ dict_get_var_cnt (const struct dictionary *d)
    must be between 0 and the count returned by
    dict_get_var_cnt(), exclusive. */
 struct variable *
-dict_get_var (const struct dictionary *d, size_t idx) 
+dict_get_var (const struct dictionary *d, size_t idx)
 {
   assert (d != NULL);
   assert (idx < d->var_cnt);
@@ -225,14 +244,14 @@ dict_get_vars (const struct dictionary *d, struct variable ***vars,
 {
   size_t count;
   size_t i;
-  
+
   assert (d != NULL);
   assert (vars != NULL);
   assert (cnt != NULL);
   assert ((exclude_classes & ~((1u << DC_ORDINARY)
                                | (1u << DC_SYSTEM)
                                | (1u << DC_SCRATCH))) == 0);
-  
+
   count = 0;
   for (i = 0; i < d->var_cnt; i++)
     {
@@ -240,36 +259,40 @@ dict_get_vars (const struct dictionary *d, struct variable ***vars,
       if (!(exclude_classes & (1u << class)))
         count++;
     }
-  
+
   *vars = xnmalloc (count, sizeof **vars);
   *cnt = 0;
-  for (i = 0; i < d->var_cnt; i++) 
+  for (i = 0; i < d->var_cnt; i++)
     {
       enum dict_class class = dict_class_from_id (var_get_name (d->var[i]));
       if (!(exclude_classes & (1u << class)))
-        (*vars)[(*cnt)++] = d->var[i]; 
+        (*vars)[(*cnt)++] = d->var[i];
     }
   assert (*cnt == count);
 }
 
 static struct variable *
-add_var (struct dictionary *d, struct variable *v) 
+add_var (struct dictionary *d, struct variable *v)
 {
   /* Add dictionary info to variable. */
   struct vardict_info vdi;
   vdi.case_index = d->next_value_idx;
   vdi.dict_index = d->var_cnt;
+  vdi.dict = d;
   var_set_vardict (v, &vdi);
 
   /* Update dictionary. */
-  if (d->var_cnt >= d->var_cap) 
+  if (d->var_cnt >= d->var_cap)
     {
-      d->var_cap = 8 + 2 * d->var_cap; 
+      d->var_cap = 8 + 2 * d->var_cap;
       d->var = xnrealloc (d->var, d->var_cap, sizeof *d->var);
     }
   d->var[d->var_cnt++] = v;
   hsh_force_insert (d->name_tab, v);
 
+  if ( d->callbacks && d->callbacks->var_added )
+    d->callbacks->var_added (d, d->next_value_idx, d->cb_data);
+
   d->next_value_idx += var_get_value_cnt (v);
 
   return v;
@@ -350,12 +373,12 @@ dict_lookup_var_assert (const struct dictionary *d, const char *name)
 bool
 dict_contains_var (const struct dictionary *d, const struct variable *v)
 {
-  if (var_has_vardict (v)) 
+  if (var_has_vardict (v))
     {
       const struct vardict_info *vdi = var_get_vardict (v);
       return (vdi->dict_index >= 0
               && vdi->dict_index < d->var_cnt
-              && d->var[vdi->dict_index] == v); 
+              && d->var[vdi->dict_index] == v);
     }
   else
     return false;
@@ -378,7 +401,7 @@ set_var_dict_index (struct variable *v, int dict_index)
 {
   struct vardict_info vdi = *var_get_vardict (v);
   vdi.dict_index = dict_index;
-  var_set_vardict (v, &vdi); 
+  var_set_vardict (v, &vdi);
 }
 
 /* Sets the case_index in V's vardict to DICT_INDEX. */
@@ -387,16 +410,16 @@ set_var_case_index (struct variable *v, int case_index)
 {
   struct vardict_info vdi = *var_get_vardict (v);
   vdi.case_index = case_index;
-  var_set_vardict (v, &vdi); 
+  var_set_vardict (v, &vdi);
 }
 
 /* Re-sets the dict_index in the dictionary variables with
    indexes from FROM to TO (exclusive). */
 static void
-reindex_vars (struct dictionary *d, size_t from, size_t to) 
+reindex_vars (struct dictionary *d, size_t from, size_t to)
 {
   size_t i;
-  
+
   for (i = from; i < to; i++)
     set_var_dict_index (d->var[i], i);
 }
@@ -442,9 +465,13 @@ dict_delete_var (struct dictionary *d, struct variable *v)
   /* Update name hash. */
   hsh_force_delete (d->name_tab, v);
 
+
   /* Free memory. */
   var_clear_vardict (v);
   var_destroy (v);
+
+  if (d->callbacks && d->callbacks->var_deleted )
+    d->callbacks->var_deleted (d, dict_index, d->cb_data);
 }
 
 /* Deletes the COUNT variables listed in VARS from D.  This is
@@ -559,9 +586,9 @@ rename_var (struct dictionary *d, struct variable *v, const char *new_name)
 /* Changes the name of V in D to name NEW_NAME.  Assert-fails if
    a variable named NEW_NAME is already in D, except that
    NEW_NAME may be the same as V's existing name. */
-void 
+void
 dict_rename_var (struct dictionary *d, struct variable *v,
-                 const char *new_name) 
+                 const char *new_name)
 {
   assert (!strcasecmp (var_get_name (v), new_name)
           || dict_lookup_var (d, new_name) == NULL);
@@ -572,6 +599,9 @@ dict_rename_var (struct dictionary *d, struct variable *v,
 
   if (get_algorithm () == ENHANCED)
     var_clear_short_name (v);
+
+  if ( d->callbacks && d->callbacks->var_changed )
+    d->callbacks->var_changed (d, var_get_dict_index (v), d->cb_data);
 }
 
 /* Renames COUNT variables specified in VARS to the names given
@@ -1237,3 +1267,21 @@ dict_assign_short_names (struct dictionary *d)
   /* Get rid of hash table. */
   hsh_destroy (short_names);
 }
+
+
+/* Called from variable.c to notify the dictionary that some property of 
+   the variable has changed */
+void
+dict_var_changed (const struct variable *v)
+{
+  if ( var_has_vardict (v))
+    {
+      const struct vardict_info *vdi = var_get_vardict (v);
+      struct dictionary *d;
+
+      d = vdi->dict;
+
+      if ( d->callbacks && d->callbacks->var_changed )
+       d->callbacks->var_changed (d, var_get_dict_index (v), d->cb_data);
+    }
+}
index 02e04f67af9ac569513938603e3c16bf2bba9755..7a40e0dc5f820f6348aa9976bea6e85754e5aed9 100644 (file)
 #include <stdbool.h>
 #include <stddef.h>
 
-/* Dictionary. */ 
+/* Dictionary. */
 
 struct variable;
+struct dictionary;
+
+struct dict_callbacks
+ {
+  void (*var_added) (struct dictionary *, int, void *);
+  void (*var_deleted) (struct dictionary *, int, void *);
+  void (*var_changed) (struct dictionary *, int, void *);
+ };
+
+
 struct dictionary *dict_create (void);
 struct dictionary *dict_clone (const struct dictionary *);
+void dict_set_callbacks (struct dictionary *, const struct dict_callbacks *,
+                        void *);
+
 void dict_clear (struct dictionary *);
 void dict_clear_aux (struct dictionary *);
 void dict_destroy (struct dictionary *);
@@ -115,4 +128,8 @@ void dict_clear_vectors (struct dictionary *);
 
 void dict_assign_short_names (struct dictionary *);
 
+/* Called only from variable.c */
+void dict_var_changed (const struct variable *v);
+
+
 #endif /* dictionary.h */
index fac56d0257bed1cf82b9d70895b96ed6f2103b9a..ba9ab53b98d58d9545c183695a86123ad14fa421 100644 (file)
@@ -21,6 +21,7 @@
 #include <assert.h>
 #include <stdlib.h>
 #include <libpspp/assertion.h>
+#include "variable.h"
 #include <libpspp/str.h>
 
 
@@ -302,17 +303,20 @@ can_resize_string (const char *s, int old_width, int new_width)
    contains only spaces in the characters that will be
    trimmed. */
 bool
-mv_is_resizable (const struct missing_values *mv, int width) 
+mv_is_resizable (const struct missing_values *mv, int width)
 {
-  assert ((width == 0) == (mv->width == 0));
+  if ( var_type_from_width (width) != var_type_from_width (mv->width) )
+    return false;
+
   if (width > MAX_SHORT_STRING && mv->type != MV_NONE)
     return false;
-  else if (width >= mv->width)
+
+  if (width >= mv->width)
     return true;
-  else 
+  else
     {
       int i;
-      
+
       for (i = 0; i < 3; i++)
         if (using_element (mv->type, i)
             && !can_resize_string (mv->values[i].s, mv->width, width))
index 5e30c65c67805228a52ee11083ecaad91736f716..535e99a863a28e68e57dda70e278202103fa8c94 100644 (file)
@@ -24,7 +24,7 @@
 
 /* Types of user-missing values.
    Invisible--use access functions defined below instead. */
-enum mv_type 
+enum mv_type
   {
     MV_NONE = 0,                /* No user-missing values. */
     MV_1 = 1,                   /* One user-missing value. */
@@ -36,9 +36,9 @@ enum mv_type
 
 /* Missing values.
    Opaque--use access functions defined below. */
-struct missing_values 
+struct missing_values
   {
-    unsigned type;              /* Number and type of missing values. */
+    enum mv_type type;          /* Number and type of missing values. */
     int width;                  /* 0=numeric, otherwise string width. */
     union value values[3];      /* Missing values.  [y,z] are the range. */
   };
index 835f883535f3a8c94733fa8f2786dadfb9f9fcd6..d426c8e4324818ef47aceb3f97bd5e827d8b4519 100644 (file)
@@ -57,8 +57,7 @@ bool proc_cancel_temporary_transformations (struct dataset *ds);
 \f
 /* Procedures. */
 
-
-struct dataset *create_dataset (void);
+struct dataset * create_dataset (void);
 void destroy_dataset (struct dataset *);
 
 void proc_set_source (struct dataset *ds, struct case_source *);
index 56491535fca0f940817acd76512bca638db10bcb..f54a4870fc05bf3b02ac9a2e6405cde5dbfefe62 100644 (file)
@@ -90,7 +90,8 @@ val_labs_copy (const struct val_labs *vls)
 bool
 val_labs_can_set_width (const struct val_labs *vls, int new_width) 
 {
-  assert ((vls->width == 0) == (new_width == 0));
+  if ( var_type_from_width (new_width) != var_type_from_width (vls->width ))
+    return false;
 
   if (vls->width == 0)
     return new_width == 0;
index 8ae72866053da78758958ff125d6c304c3c3b606..2af9b92b8721c45b9764883eadd9e73b47501660 100644 (file)
    This header file should only be included by variable.c and
    dictionary.c. */
 
+struct dictionary ;
+
 /* Dictionary data stored in variable. */
 struct vardict_info 
   {
     int dict_index;     /* Dictionary index containing the variable. */
     int case_index;     /* Index into case of variable data. */
+    struct dictionary *dict;  /* The dictionary containing the variable */
   };
 
 const struct vardict_info *var_get_vardict (const struct variable *);
index 9a64da1baf0b9c6316f0e017caf593002a59b241..3a5024034088210d775c135239eed1de5c36acad 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.
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
 #include <stdlib.h>
 
 #include "cat-routines.h"
-#include "category.h"
 #include "data-out.h"
-#include "dictionary.h"
 #include "format.h"
+#include "dictionary.h"
 #include "identifier.h"
 #include "missing-values.h"
-#include "value.h"
 #include "value-labels.h"
 #include "vardict.h"
 
 #include <libpspp/compiler.h>
 #include <libpspp/hash.h>
 #include <libpspp/message.h>
-#include <libpspp/misc.h>
 #include <libpspp/str.h>
 
-#include "minmax.h"
-
 #include "gettext.h"
 #define _(msgid) gettext (msgid)
 
@@ -207,6 +202,7 @@ var_set_name (struct variable *v, const char *name)
   assert (var_is_plausible_name (name, false));
 
   str_copy_trunc (v->name, sizeof v->name, name);
+  dict_var_changed (v);
 }
 
 /* Returns true if NAME is an acceptable name for a variable,
@@ -353,27 +349,27 @@ var_get_width (const struct variable *v)
 
 /* Sets the width of V to WIDTH. */
 void
-var_set_width (struct variable *v, int new_width) 
+var_set_width (struct variable *v, int new_width)
 {
   enum var_type new_type = var_type_from_width (new_width);
-  
+
   if (mv_is_resizable (&v->miss, new_width))
     mv_resize (&v->miss, new_width);
   else
     mv_init (&v->miss, new_width);
 
-  if (v->val_labs != NULL) 
+  if (v->val_labs != NULL)
     {
       if (val_labs_can_set_width (v->val_labs, new_width))
         val_labs_set_width (v->val_labs, new_width);
-      else 
+      else
         {
           val_labs_destroy (v->val_labs);
           v->val_labs = NULL;
         }
     }
-  
-  if (var_get_type (v) != new_type) 
+
+  if (var_get_type (v) != new_type)
     {
       v->print = (new_type == VAR_NUMERIC
                   ? fmt_for_output (FMT_F, 8, 2)
@@ -387,6 +383,8 @@ var_set_width (struct variable *v, int new_width)
     }
 
   v->width = new_width;
+
+  dict_var_changed (v);
 }
 
 /* Returns true if variable V is numeric, false otherwise. */
@@ -450,6 +448,8 @@ var_set_missing_values (struct variable *v, const struct missing_values *miss)
     }
   else
     mv_init (&v->miss, v->width);
+
+  dict_var_changed (v);
 }
 
 /* Sets variable V to have no user-missing values. */
@@ -557,6 +557,7 @@ var_set_value_labels (struct variable *v, const struct val_labs *vls)
       assert (val_labs_can_set_width (vls, v->width));
       v->val_labs = val_labs_copy (vls);
       val_labs_set_width (v->val_labs, v->width);
+      dict_var_changed (v);
     }
 }
 
@@ -642,6 +643,7 @@ var_set_print_format (struct variable *v, const struct fmt_spec *print)
 {
   assert (fmt_check_width_compat (print, v->width));
   v->print = *print;
+  dict_var_changed (v);
 }
 
 /* Returns V's write format specification. */
@@ -659,6 +661,7 @@ var_set_write_format (struct variable *v, const struct fmt_spec *write)
 {
   assert (fmt_check_width_compat (write, v->width));
   v->write = *write;
+  dict_var_changed (v);
 }
 
 /* Sets V's print and write format specifications to FORMAT,
@@ -705,6 +708,7 @@ var_set_label (struct variable *v, const char *label)
       ss_truncate (&s, 255);
       if (!ss_is_empty (s)) 
         v->label = ss_xstrdup (s);
+      dict_var_changed (v);
     }
 }
 
@@ -744,6 +748,7 @@ var_set_measure (struct variable *v, enum measure measure)
 {
   assert (measure_is_valid (measure));
   v->measure = measure;
+  dict_var_changed (v);
 }
 \f
 /* Returns V's display width, which applies only to GUIs. */
@@ -753,11 +758,15 @@ var_get_display_width (const struct variable *v)
   return v->display_width;
 }
 
+
+
+
 /* Sets V's display width to DISPLAY_WIDTH. */
 void
 var_set_display_width (struct variable *v, int display_width) 
 {
   v->display_width = display_width;
+  dict_var_changed (v);
 }
 \f
 /* Returns true if A is a valid alignment,
@@ -781,6 +790,7 @@ var_set_alignment (struct variable *v, enum alignment alignment)
 {
   assert (alignment_is_valid (alignment));
   v->alignment = alignment;
+  dict_var_changed (v);
 }
 \f
 /* Whether variables' values should be preserved from case to
@@ -800,6 +810,7 @@ var_set_leave (struct variable *v, bool leave)
 {
   assert (leave || !var_must_leave (v));
   v->leave = leave;
+  dict_var_changed (v);
 }
 
 /* Returns true if V must be left from case to case,
@@ -841,6 +852,7 @@ var_set_short_name (struct variable *v, const char *short_name)
     }
   else
     v->short_name[0] = '\0';
+  dict_var_changed (v);
 }
 
 /* Clears V's short name. */
index 471c411850d30ac01e5b274656a98d04564dfd93..aeb374ced57d63a2bc52020257a70eab617a50f2 100644 (file)
@@ -155,13 +155,13 @@ cmd_debug_evaluate (struct lexer *lexer, struct dataset *dsother UNUSED)
               lex_error (lexer, _("expecting number or string"));
               goto done;
             }
-         
-         if  ( ds == NULL ) 
+
+         if  ( ds == NULL )
            {
              ds = create_dataset ();
              d = dataset_dict (ds);
            }
-          
+
           old_value_cnt = dict_get_next_value_idx (d);
           v = dict_create_var (d, name, width);
           if (v == NULL)
index 883f12fd9d7c8ca345f23f0054df00f28d3c4357..4c85592bc58973baf0ef7ddd6aaf19e8d350455c 100644 (file)
@@ -188,7 +188,7 @@ cmd_aggregate (struct lexer *lexer, struct dataset *ds)
   memset(&agr, 0 , sizeof (agr));
   agr.missing = ITEMWISE;
   case_nullify (&agr.break_case);
-  
+
   agr.dict = dict_create ();
   agr.src_dict = dict;
   dict_set_label (agr.dict, dict_get_label (dict));
index 1fbddc3e5ebc2d6d74d6e4cc195e47e44eaf2477..c8ea53ce6c8f50e68d076e94a366f1c621f7ae65 100644 (file)
@@ -1,3 +1,19 @@
+Sat Dec 16 12:24:35 WST 2006 John Darrington <john@darrington.wattle.id.au>
+
+       * psppire-variable.c psppire-variable.h: Deleted.
+
+       * psppire-dict.c psppire-dict.h: Removed the caching of the variable 
+           data, which is now unecessary because src/data/vardict.h maintains 
+           an association between variables and their dictionary.
+       
+       * data-sheet.c menu-actions.c missing-val-dialog.c 
+         missing-val-dialog.h psppire-data-store.c 
+         psppire-var-store.c psppire-var-store.h 
+         sort-cases-dialog.c val-labs-dialog.c val-labs-dialog.h 
+         var-sheet.c var-type-dialog.c var-type-dialog.h: Dealt with the 
+           consequences of deleting psppire-variable.[ch]. 
+
+
 Sat Dec  9 20:03:04 2006  Ben Pfaff  <blp@gnu.org>
 
        * var-type-dialog.c (var_type_dialog_create): Use
index e198b7e327bdb2d60a6f64e8606ed9386abdcf8b..2e537cfdb7f48340d07d3f86dc5d7be2fa38633c 100644 (file)
@@ -55,8 +55,6 @@ src_ui_gui_psppire_SOURCES = \
        src/ui/gui/psppire-dict.h \
        src/ui/gui/psppire-object.c \
        src/ui/gui/psppire-object.h \
-       src/ui/gui/psppire-variable.c \
-       src/ui/gui/psppire-variable.h \
        src/ui/gui/psppire-var-store.c \
        src/ui/gui/psppire-var-store.h \
        src/ui/gui/sort-cases-dialog.c \
index de4a357bf3d5c60991df18e2a29a91eebbda5f4c..a1301d19a62c99d1bda5b3b30e06f9a07958ad4e 100644 (file)
@@ -29,7 +29,6 @@
 #include <gtksheet/gsheet-uniform-row.h>
 
 #include "psppire-dict.h"
-#include "psppire-variable.h"
 #include "psppire-data-store.h"
 #include "helper.h"
 
@@ -103,7 +102,7 @@ update_data_ref_entry(const GtkSheet *sheet, gint row, gint col)
   PsppireDataStore *data_store = PSPPIRE_DATA_STORE(gtk_sheet_get_model(sheet));
   if (data_store)
     {
-      const struct PsppireVariable *pv = 
+      const struct variable *pv = 
        psppire_dict_get_variable(data_store->dict, col);
 
       gchar *text ;
@@ -113,7 +112,7 @@ update_data_ref_entry(const GtkSheet *sheet, gint row, gint col)
        return FALSE;
 
       text = g_strdup_printf("%d: %s", row, 
-                            pv ? psppire_variable_get_name(pv) : "");
+                            pv ? var_get_name (pv) : "");
   
       cell_ref_entry = GTK_ENTRY(get_widget_assert(xml, "cell_ref_entry"));
 
index ce9732826ab0b52288d1e6e5003ffa0882eb2c53..f30bf74f75ba86987665d8130b0b3701ea71c3cb 100644 (file)
@@ -30,6 +30,7 @@
 #include <data/file-handle-def.h>
 #include <data/sys-file-reader.h>
 #include <data/case.h>
+#include <data/variable.h>
 
 #include <glade/glade.h>
 #include <gtk/gtk.h>
@@ -39,7 +40,7 @@
 #include <gtksheet/gtksheet.h>
 #include "helper.h"
 #include "menu-actions.h"
-#include "psppire-variable.h"
+
 #include "psppire-dict.h"
 
 #include "var-sheet.h"
@@ -398,24 +399,24 @@ on_clear_activate                    (GtkMenuItem     *menuitem,
          case GTK_SHEET_COLUMN_SELECTED:
            {
              gint fv;
-             struct PsppireVariable *pv =
-               psppire_dict_get_variable(the_dictionary,
-                                         data_sheet->range.col0);
-             fv = psppire_variable_get_fv(pv);
+             struct variable *pv =
+               psppire_dict_get_variable (the_dictionary,
+                                          data_sheet->range.col0);
 
+             fv = var_get_case_index (pv);
 
-             psppire_dict_delete_variables(the_dictionary,
-                                           data_sheet->range.col0,
-                                           1);
+             psppire_dict_delete_variables (the_dictionary,
+                                            data_sheet->range.col0,
+                                            1);
 
-             psppire_case_file_insert_values(data_store->case_file,
-                                             -1, fv);
+             psppire_case_file_insert_values (data_store->case_file,
+                                              -1, fv);
            }
            break;
          default:
-           gtk_sheet_cell_clear(data_sheet,
-                                data_sheet->active_cell.row,
-                                data_sheet->active_cell.col);
+           gtk_sheet_cell_clear (data_sheet,
+                                 data_sheet->active_cell.row,
+                                 data_sheet->active_cell.col);
            break;
          }
 
index 945cebe3aa55d93d18e228642feac7fdfcc2985a..78714fd959db31bc0ffd6befce8f9e45e4d97f30 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
     PSPPIRE --- A Graphical User Interface for PSPP
     Copyright (C) 2005, 2006  Free Software Foundation
     Written by John Darrington
@@ -32,7 +32,7 @@
 #include <data/missing-values.h>
 #include <data/variable.h>
 #include <data/data-in.h>
-#include "psppire-variable.h"
+
 
 #include <gtk/gtk.h>
 #include <glade/glade.h>
@@ -84,7 +84,7 @@ missing_val_dialog_accept(GtkWidget *w, gpointer data)
 {
   struct missing_val_dialog *dialog = data;
 
-  const struct fmt_spec *write_spec = psppire_variable_get_write_spec(dialog->pv);
+  const struct fmt_spec *write_spec = var_get_write_format (dialog->pv);
   
   if ( gtk_toggle_button_get_active(dialog->button_discrete))
     {
@@ -174,9 +174,9 @@ missing_val_dialog_accept(GtkWidget *w, gpointer data)
   if (gtk_toggle_button_get_active(dialog->button_none))
     mv_set_type(&dialog->mvl, MV_NONE);
 
-  psppire_variable_set_missing(dialog->pv, &dialog->mvl);
+  var_set_missing_values (dialog->pv, &dialog->mvl);
 
-  gtk_widget_hide(dialog->window);
+  gtk_widget_hide (dialog->window);
 }
 
 
@@ -266,9 +266,9 @@ missing_val_dialog_show(struct missing_val_dialog *dialog)
   g_return_if_fail(dialog);
   g_return_if_fail(dialog->pv);
 
-  mv_copy (&dialog->mvl, psppire_variable_get_missing(dialog->pv));
+  mv_copy (&dialog->mvl, var_get_missing_values (dialog->pv));
 
-  write_spec = psppire_variable_get_write_spec(dialog->pv);
+  write_spec = var_get_write_format (dialog->pv);
 
   /* Blank all entry boxes and make them insensitive */
   gtk_entry_set_text(GTK_ENTRY(dialog->low), "");
@@ -278,10 +278,11 @@ missing_val_dialog_show(struct missing_val_dialog *dialog)
   gtk_widget_set_sensitive(dialog->high, FALSE);      
   gtk_widget_set_sensitive(dialog->discrete, FALSE);   
 
-  gtk_widget_set_sensitive(GTK_WIDGET(dialog->button_range), 
-                          psppire_variable_get_type(dialog->pv) == VAR_NUMERIC);
+  gtk_widget_set_sensitive(GTK_WIDGET(dialog->button_range),
+                          var_is_numeric (dialog->pv));
 
-  for(i = 0 ; i < 3 ; ++i ) 
+
+  for(i = 0 ; i < 3 ; ++i )
     {
       gtk_entry_set_text(GTK_ENTRY(dialog->mv[i]), "");          
       gtk_widget_set_sensitive(dialog->mv[i], FALSE);
index 44f025e68c252a974eb4f26488350d0f939d4a32..210ee193c84f5ca20c3a0a801ffd5b21722137c2 100644 (file)
@@ -35,8 +35,8 @@ struct missing_val_dialog
   GtkWidget *window;
 
   /* The variable whose missing values are to be updated */
-  struct PsppireVariable *pv;
-  
+  struct variable *pv;
+
   /* local copy */
   struct missing_values mvl;
 
index 59c7f4947c213ab662dbf2b6eaf88e5221af3298..660e24dd352eb8332ade378ac745747cf308c24c 100644 (file)
@@ -29,6 +29,7 @@
 #include <data/casefile.h>
 #include <data/case.h>
 #include <data/data-out.h>
+#include <data/variable.h>
 
 #include <gtksheet/gtksheet.h>
 #include <gtksheet/gsheetmodel.h>
@@ -36,7 +37,6 @@
 
 #include <pango/pango-context.h>
 
-#include "psppire-variable.h"
 #include "psppire-data-store.h"
 #include "psppire-case-file.h"
 #include "helper.h"
@@ -299,10 +299,10 @@ insert_variable_callback(GObject *obj, gint var_num, gpointer data)
   
   if ( var_num > 0 ) 
     {
-      struct PsppireVariable *variable;
+      struct variable *variable;
       variable = psppire_dict_get_variable(store->dict, var_num);
 
-      posn = psppire_variable_get_fv(variable);
+      posn = var_get_case_index (variable);
     }
   else
     {
@@ -441,11 +441,11 @@ psppire_data_store_insert_new_case(PsppireDataStore *ds, gint posn)
 
   for (v = 0 ; v < psppire_dict_get_var_cnt (ds->dict) ; ++v) 
     {
-      const struct PsppireVariable *pv = psppire_dict_get_variable(ds->dict, v);
-      if (VAR_STRING ==  psppire_variable_get_type(pv) ) 
+      const struct variable *pv = psppire_dict_get_variable (ds->dict, v);
+      if ( var_is_alpha (pv))
        continue;
 
-      case_data_rw_idx (&cc, psppire_variable_get_fv (pv))->f = SYSMIS;
+      case_data_rw (&cc, pv)->f = SYSMIS;
     }
 
   result = psppire_case_file_insert_case (ds->case_file, &cc, posn);
@@ -462,7 +462,7 @@ psppire_data_store_get_string (const GSheetModel *model, gint row, gint column)
   gint idx;
   char *text;
   const struct fmt_spec *fp ;
-  const struct PsppireVariable *pv ;
+  const struct variable *pv ;
   const union value *v ;
   GString *s;
   PsppireDataStore *store = PSPPIRE_DATA_STORE(model);
@@ -478,7 +478,7 @@ psppire_data_store_get_string (const GSheetModel *model, gint row, gint column)
 
   pv = psppire_dict_get_variable (store->dict, column);
 
-  idx = psppire_variable_get_fv (pv);
+  idx = var_get_case_index (pv);
 
   v = psppire_case_file_get_value (store->case_file, row, idx);
 
@@ -486,7 +486,7 @@ psppire_data_store_get_string (const GSheetModel *model, gint row, gint column)
 
   if ( store->show_labels) 
     {
-      const struct val_labs * vl = psppire_variable_get_value_labels (pv);
+      const struct val_labs * vl = var_get_value_labels (pv);
 
       const gchar *label;
       if ( (label = val_labs_find(vl, *v)) )
@@ -495,7 +495,7 @@ psppire_data_store_get_string (const GSheetModel *model, gint row, gint column)
        }
     }
 
-  fp = psppire_variable_get_write_spec (pv);
+  fp = var_get_write_format (pv);
 
   s = g_string_sized_new (fp->w + 1);
   g_string_set_size (s, fp->w);
@@ -526,17 +526,18 @@ psppire_data_store_clear_datum (GSheetModel *model,
   PsppireDataStore *store = PSPPIRE_DATA_STORE(model);
 
   union value v;
-  const struct PsppireVariable *pv = psppire_dict_get_variable(store->dict, col);
+  const struct variable *pv = psppire_dict_get_variable (store->dict, col);
 
-  const gint index = psppire_variable_get_fv(pv) ;
+  const gint index = var_get_case_index (pv) ;
 
-  if ( psppire_variable_get_type(pv) == VAR_NUMERIC) 
+  if ( var_is_numeric (pv))
     v.f = SYSMIS;
   else
     memcpy(v.s, "", MAX_SHORT_STRING);
 
   psppire_case_file_set_value(store->case_file, row, index, &v, 
-                             psppire_variable_get_width(pv));
+                             var_get_width (pv));
+
   return TRUE;
 }
 
@@ -551,7 +552,7 @@ psppire_data_store_set_string(GSheetModel *model,
 {
   PsppireDataStore *store = PSPPIRE_DATA_STORE(model);
 
-  const struct PsppireVariable *pv = psppire_dict_get_variable(store->dict, col);
+  const struct variable *pv = psppire_dict_get_variable(store->dict, col);
   g_return_val_if_fail(pv, FALSE);
 
 #if 0
@@ -570,8 +571,8 @@ psppire_data_store_set_string(GSheetModel *model,
 #endif
 
   psppire_case_file_data_in (store->case_file, row,
-                             psppire_variable_get_fv (pv), ss_cstr (text),
-                             psppire_variable_get_write_spec (pv));
+                             var_get_case_index (pv), ss_cstr (text),
+                             var_get_write_format (pv));
   
   return TRUE;
 }
@@ -677,18 +678,18 @@ geometry_get_column_count(const GSheetColumn *geom)
 static gint
 geometry_get_width(const GSheetColumn *geom, gint unit)
 {
-  const struct PsppireVariable *pv ;
+  const struct variable *pv ;
   PsppireDataStore *ds = PSPPIRE_DATA_STORE(geom);
 
   if ( unit >= psppire_dict_get_var_cnt(ds->dict) )
     return ds->width_of_m * 8 ;
 
-  pv = psppire_dict_get_variable(ds->dict, unit);
+  pv = psppire_dict_get_variable (ds->dict, unit);
 
   if ( pv == NULL ) 
     return ds->width_of_m * 8 ;
 
-  return ds->width_of_m * psppire_variable_get_columns(pv);
+  return ds->width_of_m * var_get_display_width (pv);
 }
 
 static void
@@ -696,9 +697,9 @@ geometry_set_width(GSheetColumn *geom, gint unit, gint width)
 {
   PsppireDataStore *ds = PSPPIRE_DATA_STORE(geom);
 
-  struct PsppireVariable *pv = psppire_dict_get_variable(ds->dict, unit);
+  struct variable *pv = psppire_dict_get_variable (ds->dict, unit);
 
-  psppire_variable_set_columns(pv, width / ds->width_of_m );
+  var_set_display_width (pv, width / ds->width_of_m );
 }
 
 
@@ -707,7 +708,7 @@ static GtkJustification
 geometry_get_justification(const GSheetColumn *geom, gint unit)
 {
   PsppireDataStore *ds = PSPPIRE_DATA_STORE(geom);
-  const struct PsppireVariable *pv ;
+  const struct variable *pv ;
 
 
   if ( unit >= psppire_dict_get_var_cnt(ds->dict) )
@@ -717,7 +718,7 @@ geometry_get_justification(const GSheetColumn *geom, gint unit)
 
   /* Kludge: Happily GtkJustification is defined similarly
      to enum alignment from pspp/variable.h */
-  return psppire_variable_get_alignment(pv);
+  return var_get_alignment(pv);
 }
 
 
@@ -727,15 +728,15 @@ static gchar *
 geometry_get_column_button_label(const GSheetColumn *geom, gint unit)
 {
   gchar *text;
-  struct PsppireVariable *pv ;
+  struct variable *pv ;
   PsppireDataStore *ds = PSPPIRE_DATA_STORE(geom);
 
   if ( unit >= psppire_dict_get_var_cnt(ds->dict) )
     return g_locale_to_utf8(null_var_name, -1, 0, 0, 0);
 
-  pv = psppire_dict_get_variable(ds->dict, unit);
+  pv = psppire_dict_get_variable (ds->dict, unit);
 
-  text =  pspp_locale_to_utf8(psppire_variable_get_name(pv), -1, 0);
+  text =  pspp_locale_to_utf8 (var_get_name (pv), -1, 0);
 
   return text;
 }
index 94023f55bded26ed7c944163656951c2c9dd1575..0d700fe5a4a12b9eb595c4bce1efd7b4eb75f0e6 100644 (file)
 #include <data/dictionary.h>
 #include <data/missing-values.h>
 #include <data/value-labels.h>
-
+#include <data/variable.h>
 
 #include "message-dialog.h"
-#include "psppire-variable.h"
 
 /* --- prototypes --- */
 static void psppire_dict_class_init    (PsppireDictClass       *class);
@@ -165,27 +164,46 @@ psppire_dict_class_init (PsppireDictClass *class)
 static void
 psppire_dict_finalize (GObject *object)
 {
-  gint v;
   PsppireDict *d = PSPPIRE_DICT (object);
-  
-  for (v = 0 ; v < psppire_dict_get_var_cnt(d) ; ++v ) 
-    g_free(d->variables[v]);
-
-  g_free(d->variables);
-  d->cache_size = 0;
 
   dict_destroy(d->dict);
 
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
+/* Pass on callbacks from src/data/dictionary, as
+   signals in the Gtk library */
+static void
+addcb (struct dictionary *d, int idx, void *pd)
+{
+  g_signal_emit(pd, signal[VARIABLE_INSERTED], 0, idx);
+}
+
+static void
+delcb (struct dictionary *d, int idx, void *pd)
+{
+  g_signal_emit(pd, signal[VARIABLES_DELETED], 0, idx, 1);
+}
+
+static void
+mutcb (struct dictionary *d, int idx, void *pd)
+{
+  g_signal_emit(pd, signal[VARIABLE_CHANGED], 0, idx);
+}
+
+static const struct dict_callbacks gui_callbacks =
+  {
+    addcb,
+    delcb,
+    mutcb
+  };
+
 static void
 psppire_dict_init (PsppireDict *psppire_dict)
 {
-  psppire_dict->dict = dict_create();
+  psppire_dict->dict = dict_create ();
 
-  psppire_dict->variables = 0; 
-  psppire_dict->cache_size = 0;
+  dict_set_callbacks (psppire_dict->dict, &gui_callbacks, psppire_dict);
 
   psppire_dict->stamp = g_random_int();
 }
@@ -193,8 +211,8 @@ psppire_dict_init (PsppireDict *psppire_dict)
 /**
  * psppire_dict_new:
  * @returns: a new #PsppireDict object
- * 
- * Creates a new #PsppireDict. 
+ *
+ * Creates a new #PsppireDict.
  */
 PsppireDict*
 psppire_dict_new (void)
@@ -206,18 +224,14 @@ psppire_dict_new (void)
 /**
  * psppire_dict_new_from_dict:
  * @returns: a new #PsppireDict object
- * 
- * Creates a new #PsppireDict. 
+ *
+ * Creates a new #PsppireDict.
  */
 PsppireDict*
 psppire_dict_new_from_dict (struct dictionary *d)
 {
   PsppireDict *new_dict = g_object_new (G_TYPE_PSPPIRE_DICT, NULL);
   new_dict->dict = d;
-  new_dict->cache_size = dict_get_var_cnt(d);
-  new_dict->variables = g_malloc0(sizeof(struct PsppireVariable *) * 
-                                 new_dict->cache_size);
-
 
   return new_dict;
 }
@@ -226,12 +240,11 @@ psppire_dict_new_from_dict (struct dictionary *d)
 /* Returns a valid name for a new variable in DICT.
    The return value is statically allocated */
 static gchar * 
-auto_generate_var_name(PsppireDict *dict)
+auto_generate_var_name (PsppireDict *dict)
 {
   gint d = 0;
   static gchar name[10];
 
-
   while (g_snprintf(name, 10, "VAR%05d",d++),
         psppire_dict_lookup_var(dict, name))
     ;
@@ -246,32 +259,10 @@ void
 psppire_dict_insert_variable(PsppireDict *d, gint idx, const gchar *name)
 {
   struct variable *var ;
-  gint i;
   g_return_if_fail(d);
   g_return_if_fail(G_IS_PSPPIRE_DICT(d));
 
 
-  /* Invalidate the cache from IDX onwards */
-  for ( i = idx ; i < d->cache_size ; ++i ) 
-    {
-      g_free(d->variables[i]);
-      d->variables[i] = 0;
-    }
-
-  /* Ensure that the cache is large enough */
-  if ( dict_get_var_cnt(d->dict) >= d->cache_size ) 
-    {
-      d->variables = g_realloc(d->variables, sizeof(struct PsppireVariable*) * 
-                              (d->cache_size + CACHE_CHUNK));
-      d->cache_size += CACHE_CHUNK;
-    }
-
-  /* Zero the new pointers */
-  for ( ; i < d->cache_size ; ++i ) 
-    {
-      d->variables[i] = 0;
-    }
-
   if ( ! name ) 
     name = auto_generate_var_name(d);
   
@@ -279,10 +270,6 @@ psppire_dict_insert_variable(PsppireDict *d, gint idx, const gchar *name)
 
   dict_reorder_var(d->dict, var, idx);
 
-  d->variables[idx] = g_malloc(sizeof (struct PsppireVariable));
-  d->variables[idx]->v = var;
-  d->variables[idx]->dict = d;
-
   g_signal_emit(d, signal[VARIABLE_INSERTED], 0, idx );  
 }
 
@@ -295,13 +282,6 @@ psppire_dict_delete_variables(PsppireDict *d, gint first, gint n)
   g_return_if_fail(d->dict);
   g_return_if_fail(G_IS_PSPPIRE_DICT(d));
 
-  /* Invalidate all pvs from FIRST onwards */
-  for ( idx = first ; idx < d->cache_size ; ++idx ) 
-    {
-      g_free(d->variables[idx]);
-      d->variables[idx] = 0;
-    }
-
   for (idx = 0 ; idx < n ; ++idx ) 
     {
       struct variable *var;
@@ -345,42 +325,27 @@ psppire_dict_set_name(PsppireDict* d, gint idx, const gchar *name)
 
 
 /* Return the IDXth variable */
-struct PsppireVariable *
+struct variable *
 psppire_dict_get_variable(PsppireDict *d, gint idx)
 {
-  struct PsppireVariable *var ;
   g_return_val_if_fail(d, NULL);
   g_return_val_if_fail(d->dict, NULL);
 
-  if ( ! d->variables) 
+  if ( dict_get_var_cnt (d->dict) <= idx )
     return NULL;
-  
-  if (idx < 0 || idx >= psppire_dict_get_var_cnt(d))
-    return NULL;
-
-  var = d->variables[idx] ; 
 
-  if (! var ) 
-    {
-      var = g_malloc(sizeof (*var));
-      var->dict = d;
-      var->v = dict_get_var(d->dict, idx);
-      d->variables[idx] = var;
-    }
-    
-  return var;
+  return dict_get_var (d->dict, idx);
 }
 
 
 /* Return the number of variables in the dictionary */
-gint 
-psppire_dict_get_var_cnt(const PsppireDict *d)
+gint
+psppire_dict_get_var_cnt (const PsppireDict *d)
 {
-  g_return_val_if_fail(d, -1);
-  g_return_val_if_fail(d->dict, -1);
-  
+  g_return_val_if_fail (d, -1);
+  g_return_val_if_fail (d->dict, -1);
 
-  return dict_get_var_cnt(d->dict);
+  return dict_get_var_cnt (d->dict);
 }
 
 
@@ -390,15 +355,15 @@ psppire_dict_get_var_cnt(const PsppireDict *d)
 struct variable *
 psppire_dict_lookup_var (const PsppireDict *d, const gchar *name)
 {
-  g_return_val_if_fail(d, NULL);
-  g_return_val_if_fail(d->dict, NULL);
+  g_return_val_if_fail (d, NULL);
+  g_return_val_if_fail (d->dict, NULL);
 
-  return dict_lookup_var(d->dict, name);
+  return dict_lookup_var (d->dict, name);
 }
 
 
 void
-psppire_dict_var_changed(PsppireDict *d, gint idx)
+psppire_dict_var_changed (PsppireDict *d, gint idx)
 {
   g_return_if_fail(d);
 
@@ -407,7 +372,7 @@ psppire_dict_var_changed(PsppireDict *d, gint idx)
 
 
 /* Clears the contents of D */
-void 
+void
 psppire_dict_clear(PsppireDict *d)
 {
   g_return_if_fail(d);
@@ -415,29 +380,21 @@ psppire_dict_clear(PsppireDict *d)
 
   {
     const gint n_vars = dict_get_var_cnt(d->dict);
-    gint i;
-  
-    dict_clear(d->dict);
 
-    /* Invalidate the entire cache */
-    for ( i = 0 ; i < d->cache_size ; ++i ) 
-      {
-       g_free(d->variables[i]);
-       d->variables[i] = 0;
-      }
+    dict_clear(d->dict);
 
-    g_signal_emit(d, signal[VARIABLES_DELETED], 0, 0, n_vars );  
+    g_signal_emit(d, signal[VARIABLES_DELETED], 0, 0, n_vars );
   }
 }
 
 
 
-/* Return true is NAME would be a valid name of a variable to add to the 
-   dictionary.  False otherwise. 
+/* Return true is NAME would be a valid name of a variable to add to the
+   dictionary.  False otherwise.
    If REPORT is true, then invalid names will be reported as such as errors
 */
 gboolean
-psppire_dict_check_name(const PsppireDict *dict, 
+psppire_dict_check_name(const PsppireDict *dict,
                     const gchar *name, gboolean report)
 {
   if ( ! var_is_valid_name(name, report ) )
@@ -445,7 +402,7 @@ psppire_dict_check_name(const PsppireDict *dict,
 
   if (psppire_dict_lookup_var(dict, name))
     {
-      if ( report ) 
+      if ( report )
        msg(ME,"Duplicate variable name.");
       return FALSE;
     }
@@ -454,62 +411,59 @@ psppire_dict_check_name(const PsppireDict *dict,
 }
 
 
-inline gint 
+inline gint
 psppire_dict_get_next_value_idx (const PsppireDict *dict)
 {
   return dict_get_next_value_idx(dict->dict);
 }
 
 
-void 
-psppire_dict_resize_variable(PsppireDict *d, const struct PsppireVariable *pv,
-                            gint old_size, gint new_size)
+void
+psppire_dict_resize_variable (PsppireDict *d, const struct variable *pv,
+                             gint old_size, gint new_size)
 {
   gint fv;
   g_return_if_fail (d);
   g_return_if_fail (d->dict);
-  
-  if ( old_size == new_size ) 
+
+  if ( old_size == new_size )
     return ;
 
-  dict_compact_values(d->dict);
+  dict_compact_values (d->dict);
 
-  fv = psppire_variable_get_fv(pv);
+  fv = var_get_case_index (pv);
 
-  g_signal_emit(d, signal[VARIABLE_RESIZED], 0, 
-               fv + old_size, 
-               new_size - old_size );  
+  g_signal_emit(d, signal[VARIABLE_RESIZED], 0,
+               fv + old_size,
+               new_size - old_size );
 }
 
 
-
-
-
 /* Tree Model Stuff */
 
-static GtkTreeModelFlags tree_model_get_flags(GtkTreeModel *model);
+static GtkTreeModelFlags tree_model_get_flags (GtkTreeModel *model);
 
-static gint tree_model_n_columns(GtkTreeModel *model);
+static gint tree_model_n_columns (GtkTreeModel *model);
 
-static GType tree_model_column_type(GtkTreeModel *model, gint index);
+static GType tree_model_column_type (GtkTreeModel *model, gint index);
 
-static gboolean tree_model_get_iter(GtkTreeModel *model, GtkTreeIter *iter, 
-                                   GtkTreePath *path);
+static gboolean tree_model_get_iter (GtkTreeModel *model, GtkTreeIter *iter, 
+                                    GtkTreePath *path);
 
-static gboolean tree_model_iter_next(GtkTreeModel *model, GtkTreeIter *iter);
+static gboolean tree_model_iter_next (GtkTreeModel *model, GtkTreeIter *iter);
 
-static GtkTreePath * tree_model_get_path(GtkTreeModel *model, 
-                                        GtkTreeIter *iter);
+static GtkTreePath * tree_model_get_path (GtkTreeModel *model, 
+                                         GtkTreeIter *iter);
 
-static void tree_model_get_value(GtkTreeModel *model, GtkTreeIter *iter,
-                                gint column, GValue *value);
+static void tree_model_get_value (GtkTreeModel *model, GtkTreeIter *iter,
+                                 gint column, GValue *value);
 
-static gboolean tree_model_nth_child(GtkTreeModel *model, GtkTreeIter *iter, 
-                                    GtkTreeIter *parent, gint n);
+static gboolean tree_model_nth_child (GtkTreeModel *model, GtkTreeIter *iter, 
+                                     GtkTreeIter *parent, gint n);
 
 
 static void
-dictionary_tree_model_init(GtkTreeModelIface *iface)
+dictionary_tree_model_init (GtkTreeModelIface *iface)
 {
   iface->get_flags = tree_model_get_flags;
   iface->get_n_columns = tree_model_n_columns;
@@ -527,40 +481,40 @@ dictionary_tree_model_init(GtkTreeModelIface *iface)
 }
 
 static GtkTreeModelFlags
-tree_model_get_flags(GtkTreeModel *model)
+tree_model_get_flags (GtkTreeModel *model)
 {
-  g_return_val_if_fail(G_IS_PSPPIRE_DICT(model), (GtkTreeModelFlags) 0);
+  g_return_val_if_fail (G_IS_PSPPIRE_DICT(model), (GtkTreeModelFlags) 0);
 
   return GTK_TREE_MODEL_LIST_ONLY;
 }
 
 
 static gint
-tree_model_n_columns(GtkTreeModel *model)
+tree_model_n_columns (GtkTreeModel *model)
 {
   return n_DICT_COLS;
 }
 
 static GType
-tree_model_column_type(GtkTreeModel *model, gint index)
+tree_model_column_type (GtkTreeModel *model, gint index)
 {
g_return_val_if_fail(G_IS_PSPPIRE_DICT(model), (GType) 0);
-
- switch(index) 
-   {
-   case DICT_TVM_COL_NAME:
-     return G_TYPE_STRING;
-     break;
-   case DICT_TVM_COL_VAR:
-     return G_TYPE_POINTER;
-     break;
-   default:
-     g_return_val_if_reached((GType)0);
-     break;
-   }
-
- g_assert_not_reached();
- return ((GType)0);
 g_return_val_if_fail (G_IS_PSPPIRE_DICT(model), (GType) 0);
+
 switch(index) 
+    {
+    case DICT_TVM_COL_NAME:
+      return G_TYPE_STRING;
+      break;
+    case DICT_TVM_COL_VAR:
+      return G_TYPE_POINTER;
+      break;
+    default:
+      g_return_val_if_reached((GType)0);
+      break;
+    }
+
 g_assert_not_reached();
 return ((GType)0);
 }
 
 static gboolean
@@ -568,28 +522,28 @@ tree_model_get_iter(GtkTreeModel *model, GtkTreeIter *iter, GtkTreePath *path)
 {
   gint *indices, depth;
   gint n;
-  struct PsppireVariable *variable;
+  struct variable *variable;
 
   PsppireDict *dict = PSPPIRE_DICT (model);
 
-  g_return_val_if_fail(path, FALSE);
+  g_return_val_if_fail (path, FALSE);
 
-  indices = gtk_tree_path_get_indices(path);
-  depth = gtk_tree_path_get_depth(path);
+  indices = gtk_tree_path_get_indices (path);
+  depth = gtk_tree_path_get_depth (path);
 
   g_return_val_if_fail(depth == 1, FALSE);
 
   n = indices[0];
 
-  if ( n < 0 || n >= psppire_dict_get_var_cnt(dict)) 
+  if ( n < 0 || n >= psppire_dict_get_var_cnt (dict)) 
     return FALSE;
 
-  variable = psppire_dict_get_variable(dict, n);
+  variable = dict_get_var (dict->dict, n);
 
-  g_assert(psppire_variable_get_index(variable) == n);
+  g_assert (var_get_dict_index (variable) == n);
 
   iter->stamp = dict->stamp;
-  iter->user_data = variable; 
+  iter->user_data = variable;
 
   return TRUE;
 }
@@ -599,7 +553,7 @@ static gboolean
 tree_model_iter_next(GtkTreeModel *model, GtkTreeIter *iter)
 {
   PsppireDict *dict = PSPPIRE_DICT (model);
-  struct PsppireVariable *variable;
+  struct variable *variable;
   gint idx;
 
   g_return_val_if_fail(iter->stamp == dict->stamp, FALSE);
@@ -607,17 +561,17 @@ tree_model_iter_next(GtkTreeModel *model, GtkTreeIter *iter)
   if ( iter == NULL || iter->user_data == NULL)
     return FALSE;
 
-  variable = (struct PsppireVariable *) iter->user_data;
+  variable = (struct variable *) iter->user_data;
+
+  idx = var_get_dict_index (variable);
 
-  idx = psppire_variable_get_index(variable);
-  
   if ( idx + 1 >= psppire_dict_get_var_cnt(dict))
     return FALSE;
 
-  variable = psppire_dict_get_variable(dict, idx + 1);
+  variable = psppire_dict_get_variable (dict, idx + 1);
+
+  g_assert (var_get_dict_index (variable) == idx + 1);
 
-  g_assert(psppire_variable_get_index(variable) == idx + 1);
-  
   iter->user_data = variable;
 
   return TRUE;
@@ -627,15 +581,15 @@ static GtkTreePath *
 tree_model_get_path(GtkTreeModel *model, GtkTreeIter *iter)
 {
   GtkTreePath *path;
-  struct PsppireVariable *variable;
+  struct variable *variable;
   PsppireDict *dict = PSPPIRE_DICT (model);
 
   g_return_val_if_fail(iter->stamp == dict->stamp, FALSE);
 
-  variable = (struct PsppireVariable *) iter->user_data;
+  variable = (struct variable *) iter->user_data;
 
   path = gtk_tree_path_new();
-  gtk_tree_path_append_index(path, psppire_variable_get_index(variable));
+  gtk_tree_path_append_index(path, var_get_dict_index (variable));
 
   return path;
 }
@@ -645,18 +599,18 @@ static void
 tree_model_get_value(GtkTreeModel *model, GtkTreeIter *iter,
                     gint column, GValue *value)
 {
-  struct PsppireVariable *variable;
+  struct variable *variable;
   PsppireDict *dict = PSPPIRE_DICT (model);
 
   g_return_if_fail(iter->stamp == dict->stamp);
 
-  variable = (struct PsppireVariable *) iter->user_data;
+  variable = (struct variable *) iter->user_data;
 
   switch(column)
     {
     case DICT_TVM_COL_NAME:
       g_value_init(value, G_TYPE_STRING);
-      g_value_set_string(value, psppire_variable_get_name(variable));
+      g_value_set_string(value, var_get_name(variable));
       break;
     case DICT_TVM_COL_VAR:
       g_value_init(value, G_TYPE_POINTER);
@@ -670,7 +624,7 @@ tree_model_get_value(GtkTreeModel *model, GtkTreeIter *iter,
 
 
 static gboolean
-tree_model_nth_child(GtkTreeModel *model, GtkTreeIter *iter, 
+tree_model_nth_child(GtkTreeModel *model, GtkTreeIter *iter,
                     GtkTreeIter *parent, gint n)
 {
   PsppireDict *dict;
@@ -678,18 +632,26 @@ tree_model_nth_child(GtkTreeModel *model, GtkTreeIter *iter,
 
   dict = PSPPIRE_DICT(model);
 
-  if ( parent ) 
+  if ( parent )
     return FALSE;
 
-  if ( n >= psppire_dict_get_var_cnt(dict) ) 
+  if ( n >= psppire_dict_get_var_cnt(dict) )
     return FALSE;
 
   iter->stamp = dict->stamp;
   iter->user_data = psppire_dict_get_variable(dict, n);
 
-  if ( !iter->user_data) 
+  if ( !iter->user_data)
     return FALSE;
-  
-  
+
+
   return TRUE;
 }
+
+
+void
+psppire_dict_rename_var (PsppireDict *dict, struct variable *v,
+                        const gchar *text)
+{
+  dict_rename_var (dict->dict, v, text);
+}
index e71ef20403daec009fe11456201c04f552211884..e7acb1e04640d421c5d939e9bce1f894e0cef6f6 100644 (file)
@@ -54,11 +54,6 @@ struct _PsppireDict
   GObject             parent;
   struct dictionary *dict;
 
-  /* Cache of variables */
-  struct PsppireVariable **variables;
-
-  gint cache_size;
-
   /* For GtkTreeModelIface */
   gint stamp;
 };
@@ -94,7 +89,7 @@ void psppire_dict_clear(PsppireDict *d);
 
 /* Return the IDXth variable */
 
-struct PsppireVariable * psppire_dict_get_variable(PsppireDict *d, gint idx);
+struct variable * psppire_dict_get_variable (PsppireDict *d, gint idx);
 
 /* Delete N variables beginning at FIRST */
 void psppire_dict_delete_variables(PsppireDict *d, gint first, gint n);
@@ -102,15 +97,18 @@ void psppire_dict_delete_variables(PsppireDict *d, gint first, gint n);
 /* Insert a new variable at posn IDX */
 void psppire_dict_insert_variable(PsppireDict *d, gint idx, const gchar *name);
 
-void psppire_dict_resize_variable(PsppireDict *d
-                                 const struct PsppireVariable *pv,
-                                 gint old_size, gint new_size);
+void psppire_dict_resize_variable(PsppireDict *, 
+                                 const struct variable *,
+                                 gint, gint );
 
 gboolean psppire_dict_check_name(const PsppireDict *dict, 
                              const gchar *name, gboolean report);
 
 gint psppire_dict_get_next_value_idx (const PsppireDict *dict);
 
+void psppire_dict_rename_var (PsppireDict *dict, struct variable *v,
+                             const gchar *text);
+
 
 G_END_DECLS
 
index daeeb23e56569427825ff1d4cd362b9129605550..85d9ec5a1bd790cad8211b590927cd2fb0e2d326 100644 (file)
@@ -32,7 +32,6 @@
 
 #include <gtksheet/gsheetmodel.h>
 
-#include "psppire-variable.h"
 #include "psppire-var-store.h"
 #include "var-sheet.h"
 #include "helper.h"
@@ -63,7 +62,7 @@ static gboolean psppire_var_store_set_string(GSheetModel *model,
 
 static gint psppire_var_store_get_row_count(const GSheetModel * model);
 
-static gchar *text_for_column(const struct PsppireVariable *pv, gint c, GError **err);
+static gchar *text_for_column(const struct variable *pv, gint c, GError **err);
 
 
 static void psppire_var_store_sheet_row_init (GSheetRowIface *iface);
@@ -151,15 +150,15 @@ psppire_var_store_item_editable(PsppireVarStore *var_store, gint row, gint colum
 {
   const struct fmt_spec *write_spec ;
 
-  struct PsppireVariable *pv = psppire_var_store_get_variable(var_store, row);
+  struct variable *pv = psppire_var_store_get_var (var_store, row);
 
   if ( !pv ) 
     return TRUE;
 
-  if ( VAR_STRING == psppire_variable_get_type(pv) && column == COL_DECIMALS ) 
+  if ( VAR_STRING == var_get_type (pv) && column == COL_DECIMALS ) 
     return FALSE;
 
-  write_spec = psppire_variable_get_write_spec(pv);
+  write_spec =var_get_write_format (pv);
 
   switch ( write_spec->type ) 
     {
@@ -186,6 +185,13 @@ psppire_var_store_item_editable(PsppireVarStore *var_store, gint row, gint colum
   return TRUE;
 }
 
+
+struct variable * 
+psppire_var_store_get_var (PsppireVarStore *store, gint row)
+{
+  return psppire_dict_get_variable (store->dict, row);
+}
+
 static gboolean
 psppire_var_store_is_editable(const GSheetModel *model, gint row, gint column)
 {
@@ -324,29 +330,17 @@ psppire_var_store_get_string(const GSheetModel *model, gint row, gint column)
 {
   PsppireVarStore *store = PSPPIRE_VAR_STORE(model);
 
-  struct PsppireVariable *pv;
+  struct variable *pv;
 
   if ( row >= psppire_dict_get_var_cnt(store->dict))
     return 0;
   
   pv = psppire_dict_get_variable (store->dict, row);
   
-  return text_for_column(pv, column, 0);
+  return text_for_column (pv, column, 0);
 }
 
 
-struct PsppireVariable *
-psppire_var_store_get_variable(PsppireVarStore *store, gint row)
-{
-  g_return_val_if_fail(store, NULL);
-  g_return_val_if_fail(store->dict, NULL);
-
-  if ( row >= psppire_dict_get_var_cnt(store->dict))
-    return 0;
-
-  return psppire_dict_get_variable (store->dict, row);
-}
-
 /* Clears that part of the variable store, if possible, which corresponds 
    to ROW, COL.
    Returns true if anything was updated, false otherwise.
@@ -354,14 +348,14 @@ psppire_var_store_get_variable(PsppireVarStore *store, gint row)
 static gboolean 
 psppire_var_store_clear(GSheetModel *model,  gint row, gint col)
 {
-  struct PsppireVariable *pv ;
+  struct variable *pv ;
 
   PsppireVarStore *var_store = PSPPIRE_VAR_STORE(model);
 
-  if ( row >= psppire_dict_get_var_cnt(var_store->dict))
+  if ( row >= psppire_dict_get_var_cnt (var_store->dict))
       return FALSE;
 
-  pv = psppire_var_store_get_variable(var_store, row);
+  pv = psppire_var_store_get_var (var_store, row);
 
   if ( !pv ) 
     return FALSE;
@@ -369,7 +363,7 @@ psppire_var_store_clear(GSheetModel *model,  gint row, gint col)
   switch (col)
     {
     case COL_LABEL:
-      psppire_variable_set_label(pv, 0);
+      var_set_label (pv, 0);
       return TRUE;
       break;
     }
@@ -385,36 +379,73 @@ static gboolean
 psppire_var_store_set_string(GSheetModel *model, 
                          const gchar *text, gint row, gint col)
 {
-  struct PsppireVariable *pv ;
+  struct variable *pv ;
 
   PsppireVarStore *var_store = PSPPIRE_VAR_STORE(model);
 
   if ( row >= psppire_dict_get_var_cnt(var_store->dict))
       return FALSE;
 
-  pv = psppire_var_store_get_variable(var_store, row);
+  pv = psppire_var_store_get_var (var_store, row);
+
   if ( !pv ) 
     return FALSE;
 
   switch (col)
     {
     case COL_NAME:
-      return psppire_variable_set_name(pv, text);
+      psppire_dict_rename_var (var_store->dict, pv, text);
+      return TRUE;
       break;
     case COL_COLUMNS:
       if ( ! text) return FALSE;
-      return psppire_variable_set_columns(pv, atoi(text));
+      var_set_display_width (pv, atoi(text));
+      return TRUE;
       break;
     case COL_WIDTH:
-      if ( ! text) return FALSE;
-      return psppire_variable_set_width(pv, atoi(text));
+      {
+       int width = atoi (text);
+       if ( ! text) return FALSE;
+       if ( var_is_alpha (pv))
+           var_set_width (pv, width);
+       else
+         {
+           struct fmt_spec fmt ;
+           fmt = *var_get_write_format (pv);
+           if ( width < fmt_min_output_width (fmt.type)
+                ||
+                width > fmt_max_output_width (fmt.type))
+             return FALSE;
+
+           fmt.w = width;
+           fmt.d = MIN (fmt_max_output_decimals (fmt.type, width), fmt.d);
+
+           var_set_both_formats (pv, &fmt);
+         }
+
+       return TRUE;
+      }
       break;
     case COL_DECIMALS:
-      if ( ! text) return FALSE;
-      return psppire_variable_set_decimals(pv, atoi(text));
+      {
+       int decimals;
+       struct fmt_spec fmt;
+       if ( ! text) return FALSE;
+       decimals = atoi (text);
+       fmt = *var_get_write_format (pv);
+       if ( decimals >
+            fmt_max_output_decimals (fmt.type,
+                                     fmt.w
+                                     ))
+         return FALSE;
+
+       fmt.d = decimals;
+       var_set_both_formats (pv, &fmt);
+       return TRUE;
+      }
       break;
     case COL_LABEL:
-      psppire_variable_set_label(pv, text);
+      var_set_label(pv, text);
       return TRUE;
       break;
     case COL_TYPE:
@@ -435,7 +466,7 @@ psppire_var_store_set_string(GSheetModel *model,
 
 
 static  gchar *
-text_for_column(const struct PsppireVariable *pv, gint c, GError **err)
+text_for_column(const struct variable *pv, gint c, GError **err)
 {
   static gchar none[] = N_("None");
 
@@ -453,12 +484,12 @@ text_for_column(const struct PsppireVariable *pv, gint c, GError **err)
   enum {VT_NUMERIC, VT_COMMA, VT_DOT, VT_SCIENTIFIC, VT_DATE, VT_DOLLAR, 
        VT_CUSTOM, VT_STRING};
 
-  const struct fmt_spec *write_spec = psppire_variable_get_write_spec(pv);
+  const struct fmt_spec *write_spec = var_get_write_format (pv);
 
   switch (c)
     {
     case COL_NAME:
-      return pspp_locale_to_utf8(psppire_variable_get_name(pv), -1, err);
+      return pspp_locale_to_utf8 ( var_get_name (pv), -1, err);
       break;
     case COL_TYPE:
       {
@@ -538,20 +569,20 @@ text_for_column(const struct PsppireVariable *pv, gint c, GError **err)
       {
        gchar *s;
        GString *gstr = g_string_sized_new(10);
-       g_string_printf(gstr, _("%d"), psppire_variable_get_columns(pv));
+       g_string_printf(gstr, _("%d"), var_get_display_width (pv));
        s = g_locale_to_utf8(gstr->str, gstr->len, 0, 0, err);
        g_string_free(gstr, TRUE);
        return s;
       }
       break;
     case COL_LABEL:
-      return pspp_locale_to_utf8(psppire_variable_get_label(pv), -1, err);
+      return pspp_locale_to_utf8 (var_get_label (pv), -1, err);
       break;
 
     case COL_MISSING:
       {
        gchar *s;
-       const struct missing_values *miss = psppire_variable_get_missing(pv);
+       const struct missing_values *miss = var_get_missing_values (pv);
        if ( mv_is_empty(miss)) 
          return g_locale_to_utf8(gettext(none), -1, 0, 0, err);
        else
@@ -611,47 +642,48 @@ text_for_column(const struct PsppireVariable *pv, gint c, GError **err)
       break;
     case COL_VALUES:
       {
-       const struct val_labs *vls = psppire_variable_get_value_labels(pv);
-       if ( ! vls || 0 == val_labs_count(vls) ) 
-         return g_locale_to_utf8(gettext(none), -1, 0, 0, err);
+       if ( ! var_has_value_labels (pv))
+         return g_locale_to_utf8 (gettext (none), -1, 0, 0, err);
        else
          {
            gchar *ss;
-           GString *gstr = g_string_sized_new(10);
+           GString *gstr = g_string_sized_new (10);
+           const struct val_labs *vls = var_get_value_labels (pv);
            struct val_labs_iterator *ip = 0;
            struct val_lab *vl = val_labs_first_sorted (vls, &ip);
 
-           g_assert(vl);
+           g_assert (vl);
 
            {
-             gchar *const vstr = value_to_text(vl->value, *write_spec);
+             gchar *const vstr = value_to_text (vl->value, *write_spec);
 
-             g_string_printf(gstr, "{%s,\"%s\"}_", vstr, vl->label);
-             g_free(vstr);
+             g_string_printf (gstr, "{%s,\"%s\"}_", vstr, vl->label);
+             g_free (vstr);
            }
 
-           val_labs_done(&ip);
-           
-           ss = pspp_locale_to_utf8(gstr->str, gstr->len, err);
-           g_string_free(gstr, TRUE);
+           val_labs_done (&ip);
+
+           ss = pspp_locale_to_utf8 (gstr->str, gstr->len, err);
+           g_string_free (gstr, TRUE);
            return ss;
          }
       }
       break;
     case COL_ALIGN:
       {
-       const gint align = psppire_variable_get_alignment(pv);
+       const gint align = var_get_alignment(pv);
 
-       g_assert(align < n_ALIGNMENTS);
+       g_assert (align < n_ALIGNMENTS);
        return g_locale_to_utf8(gettext(alignments[align]), -1, 0, 0, err);
       }
       break;
     case COL_MEASURE:
       {
-       const gint measure = psppire_variable_get_measure(pv);
+       const gint measure = var_get_measure (pv);
 
-       g_assert(measure < n_MEASURES);
-       return g_locale_to_utf8(gettext(measures[measure]), -1, 0, 0, err);
+       g_assert (measure - 1 < n_MEASURES);
+       return g_locale_to_utf8 (gettext (measures[measure - 1]),
+                                -1, 0, 0, err);
       }
       break;
     }
@@ -736,7 +768,7 @@ static gchar *
 geometry_get_button_label(const GSheetRow *geom, gint unit, gpointer data)
 {
   gchar *label = g_strdup_printf(_("%d"), unit);
-  
+
   return label;
 }
 
index 792db1f17aa4cd0c800f6aa324db51814b5d8e7a..11a224d392bb60cfc4b9a8199f175aafc077ed28 100644 (file)
@@ -77,14 +77,12 @@ struct _PsppireVarStoreClass
 GType         psppire_var_store_get_type         (void) G_GNUC_CONST;
 PsppireVarStore *psppire_var_store_new              (PsppireDict *dict);
 struct variable * psppire_var_store_get_var (PsppireVarStore *store, gint row);
-struct PsppireVariable * psppire_var_store_get_variable(PsppireVarStore *store, 
-                                                 gint row);
 
-void psppire_var_store_set_dictionary(PsppireVarStore *var_store, PsppireDict *dict);
+void psppire_var_store_set_dictionary (PsppireVarStore *var_store, PsppireDict *dict);
 
 
 /* Return the number of variables */
-gint psppire_var_store_get_var_cnt(PsppireVarStore      *var_store);
+gint psppire_var_store_get_var_cnt (PsppireVarStore      *var_store);
 
 void psppire_var_store_set_font(PsppireVarStore *store, const PangoFontDescription *fd);
 
diff --git a/src/ui/gui/psppire-variable.c b/src/ui/gui/psppire-variable.c
deleted file mode 100644 (file)
index 70c69a7..0000000
+++ /dev/null
@@ -1,393 +0,0 @@
-/* 
-    PSPPIRE --- A Graphical User Interface for PSPP
-    Copyright (C) 2004, 2006  Free Software Foundation
-    Written by John Darrington
-
-    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. */
-
-#include <config.h>
-
-#include <string.h>
-#include <stdlib.h>
-
-#include <data/missing-values.h>
-#include <data/value-labels.h>
-#include <data/format.h>
-#include <libpspp/message.h>
-
-#include <libpspp/misc.h>
-
-#include "psppire-variable.h"
-#include "psppire-dict.h"
-
-
-
-gboolean
-psppire_variable_set_name(struct PsppireVariable *pv, const gchar *text)
-{
-  g_return_val_if_fail(pv, FALSE);
-  g_return_val_if_fail(pv->dict, FALSE);
-  g_return_val_if_fail(pv->v, FALSE);
-
-  if ( !text) 
-    return FALSE;
-
-  if ( 0 == strcmp(var_get_name (pv->v), text))
-    return FALSE;
-
-  if ( ! psppire_dict_check_name(pv->dict, text, TRUE) )
-    return FALSE;
-
-  dict_rename_var(pv->dict->dict, pv->v, text);
-
-  psppire_dict_var_changed(pv->dict, var_get_dict_index (pv->v));
-
-  return TRUE;
-}
-
-
-gboolean
-psppire_variable_set_columns(struct PsppireVariable *pv, gint columns)
-{
-  g_return_val_if_fail(pv, FALSE);
-  g_return_val_if_fail(pv->dict, FALSE);
-  g_return_val_if_fail(pv->v, FALSE);
-
-  var_set_display_width (pv->v, columns);
-  
-  psppire_dict_var_changed(pv->dict, var_get_dict_index (pv->v));
-
-  return TRUE;
-}
-
-gboolean
-psppire_variable_set_label(struct PsppireVariable *pv, const gchar *label)
-{
-  g_return_val_if_fail(pv, FALSE);
-  g_return_val_if_fail(pv->dict, FALSE);
-  g_return_val_if_fail(pv->v, FALSE);
-
-  var_set_label (pv->v, label);
-
-  psppire_dict_var_changed(pv->dict, var_get_dict_index (pv->v));
-
-  return TRUE;
-}
-
-
-gboolean
-psppire_variable_set_decimals(struct PsppireVariable *pv, gint decimals)
-{
-  struct fmt_spec fmt;
-
-  g_return_val_if_fail(pv, FALSE);
-  g_return_val_if_fail(pv->dict, FALSE);
-  g_return_val_if_fail(pv->v, FALSE);
-
-  fmt = *var_get_write_format (pv->v);
-  fmt.d = decimals;
-
-  return psppire_variable_set_format(pv, &fmt);
-}
-
-
-
-gboolean
-psppire_variable_set_width(struct PsppireVariable *pv, gint width)
-{
-  struct fmt_spec fmt ;
-  g_return_val_if_fail(pv, FALSE);
-  g_return_val_if_fail(pv->dict, FALSE);
-  g_return_val_if_fail(pv->v, FALSE);
-
-  fmt = *var_get_write_format (pv->v);
-  fmt.w = width;
-
-  if (var_is_alpha (pv->v))
-    {
-      gint old_var_cnt , new_var_cnt ;
-
-      if ( var_get_width (pv->v) == 0 ) 
-       old_var_cnt = 1;
-      else
-       old_var_cnt = DIV_RND_UP(var_get_width (pv->v), MAX_SHORT_STRING);
-      
-      new_var_cnt = DIV_RND_UP(width, MAX_SHORT_STRING);
-      var_set_width (pv->v, width);
-
-      psppire_dict_resize_variable(pv->dict, pv,
-                                  old_var_cnt, new_var_cnt);
-    }
-
-  return psppire_variable_set_format(pv, &fmt);
-}
-
-
-gboolean
-psppire_variable_set_type(struct PsppireVariable *pv, int type)
-{
-  gint old_var_cnt , new_var_cnt ;
-
-  g_return_val_if_fail(pv, FALSE);
-  g_return_val_if_fail(pv->dict, FALSE);
-  g_return_val_if_fail(pv->v, FALSE);
-
-  if ( var_get_width (pv->v) ) 
-    old_var_cnt = 1;
-  else
-    old_var_cnt = DIV_RND_UP (var_get_width (pv->v), MAX_SHORT_STRING);
-
-  var_set_width (pv->v, type == VAR_NUMERIC ? 0 : 1);
-
-  if ( var_get_width (pv->v) == 0 ) 
-    new_var_cnt = 1;
-  else
-    new_var_cnt = DIV_RND_UP (var_get_width (pv->v), MAX_SHORT_STRING);
-
-  psppire_dict_resize_variable(pv->dict, pv,
-                              old_var_cnt, new_var_cnt);
-
-  psppire_dict_var_changed(pv->dict, var_get_dict_index (pv->v));
-  return TRUE;
-}
-
-
-gboolean
-psppire_variable_set_format(struct PsppireVariable *pv, struct fmt_spec *fmt)
-{
-  g_return_val_if_fail(pv, FALSE);
-  g_return_val_if_fail(pv->dict, FALSE);
-  g_return_val_if_fail(pv->v, FALSE);
-
-  msg_disable ();
-  if ( fmt_check_output(fmt) 
-       && fmt_check_type_compat (fmt, var_get_type (pv->v))
-       && fmt_check_width_compat (fmt, var_get_width (pv->v))) 
-    {
-      msg_enable ();
-      var_set_both_formats (pv->v, fmt);
-      psppire_dict_var_changed(pv->dict, var_get_dict_index (pv->v));
-      return TRUE;
-    }
-  msg_enable ();
-
-  return FALSE;
-}
-
-
-gboolean
-psppire_variable_set_value_labels(const struct PsppireVariable *pv,
-                              const struct val_labs *vls)
-{
-  g_return_val_if_fail(pv, FALSE);
-  g_return_val_if_fail(pv->dict, FALSE);
-  g_return_val_if_fail(pv->v, FALSE);
-
-  var_set_value_labels (pv->v, vls);
-
-  psppire_dict_var_changed(pv->dict, var_get_dict_index (pv->v));
-  return TRUE;
-}
-
-gboolean 
-psppire_variable_set_missing(const struct PsppireVariable *pv,
-                         const struct missing_values *miss)
-{
-  g_return_val_if_fail(pv, FALSE);
-  g_return_val_if_fail(pv->dict, FALSE);
-  g_return_val_if_fail(pv->v, FALSE);
-
-  var_set_missing_values (pv->v, miss);
-
-  psppire_dict_var_changed(pv->dict, var_get_dict_index (pv->v));
-  return TRUE;
-}
-
-gboolean
-psppire_variable_set_write_spec(const struct PsppireVariable *pv, struct fmt_spec fmt)
-{
-  g_return_val_if_fail(pv, FALSE);
-  g_return_val_if_fail(pv->v, FALSE);
-
-  var_set_write_format (pv->v, &fmt);
-
-  psppire_dict_var_changed(pv->dict, var_get_dict_index (pv->v));
-  return TRUE;
-}
-
-gboolean
-psppire_variable_set_print_spec(const struct PsppireVariable *pv, struct fmt_spec fmt)
-{
-  g_return_val_if_fail(pv, FALSE);
-  g_return_val_if_fail(pv->v, FALSE);
-
-  var_set_print_format (pv->v, &fmt);
-
-  psppire_dict_var_changed(pv->dict, var_get_dict_index (pv->v));
-  return TRUE;
-}
-
-
-
-gboolean
-psppire_variable_set_alignment(struct PsppireVariable *pv, gint align)
-{
-  g_return_val_if_fail(pv, FALSE);
-  g_return_val_if_fail(pv->dict, FALSE);
-  g_return_val_if_fail(pv->v, FALSE);
-
-  var_set_alignment (pv->v, align);
-
-  psppire_dict_var_changed(pv->dict, var_get_dict_index (pv->v));
-  return TRUE;
-}
-
-
-gboolean
-psppire_variable_set_measure(struct PsppireVariable *pv, gint measure)
-{
-  g_return_val_if_fail(pv, FALSE);
-  g_return_val_if_fail(pv->dict, FALSE);
-  g_return_val_if_fail(pv->v, FALSE);
-
-  var_set_measure (pv->v, measure + 1);
-
-  psppire_dict_var_changed(pv->dict, var_get_dict_index (pv->v));
-  return TRUE;
-}
-
-
-const struct fmt_spec *
-psppire_variable_get_write_spec(const struct PsppireVariable *pv)
-{
-  g_return_val_if_fail(pv, NULL);
-  g_return_val_if_fail(pv->v, NULL);
-
-  return var_get_write_format (pv->v);
-}
-
-
-const gchar *
-psppire_variable_get_name(const struct PsppireVariable *pv)
-{
-  g_return_val_if_fail(pv, NULL);
-  g_return_val_if_fail(pv->v, NULL);
-
-  return var_get_name (pv->v);
-}
-
-
-gint
-psppire_variable_get_columns(const struct PsppireVariable *pv)
-{
-  g_return_val_if_fail(pv, -1);
-  g_return_val_if_fail(pv->v, -1);
-
-  return var_get_display_width (pv->v);
-}
-
-
-
-const gchar *
-psppire_variable_get_label(const struct PsppireVariable *pv)
-{
-  g_return_val_if_fail(pv, NULL);
-  g_return_val_if_fail(pv->v, NULL);
-
-  return var_get_label (pv->v);
-}
-
-
-const struct missing_values *
-psppire_variable_get_missing(const struct PsppireVariable *pv)
-{
-  g_return_val_if_fail(pv, NULL);
-  g_return_val_if_fail(pv->v, NULL);
-
-  return var_get_missing_values (pv->v);
-}
-
-
-const struct val_labs *
-psppire_variable_get_value_labels(const struct PsppireVariable *pv)
-{
-  g_return_val_if_fail(pv, NULL);
-  g_return_val_if_fail(pv->v, NULL);
-
-  return var_get_value_labels (pv->v);
-}
-
-
-gint
-psppire_variable_get_alignment(const struct PsppireVariable *pv)
-{
-  g_return_val_if_fail(pv, -1);
-  g_return_val_if_fail(pv->v, -1);
-
-  return var_get_alignment (pv->v);
-}
-
-
-
-gint
-psppire_variable_get_measure(const struct PsppireVariable *pv)
-{
-  g_return_val_if_fail(pv, -1);
-  g_return_val_if_fail(pv->v, -1);
-
-  return var_get_measure (pv->v) - 1;
-}
-
-gint
-psppire_variable_get_type(const struct PsppireVariable *pv)
-{
-  g_return_val_if_fail(pv, -1);
-  g_return_val_if_fail(pv->v, -1);
-
-  return var_get_type (pv->v);
-}
-
-
-gint
-psppire_variable_get_width(const struct PsppireVariable *pv)
-{
-  g_return_val_if_fail(pv, -1);
-  g_return_val_if_fail(pv->v, -1);
-
-  return var_get_width (pv->v);
-}
-
-
-gint
-psppire_variable_get_fv(const struct PsppireVariable *pv)
-{
-  g_return_val_if_fail(pv, -1);
-  g_return_val_if_fail(pv->v, -1);
-
-  return var_get_case_index (pv->v);
-}
-
-
-
-gint
-psppire_variable_get_index(const struct PsppireVariable *pv)
-{
-  g_return_val_if_fail(pv, -1);
-  g_return_val_if_fail(pv->v, -1);
-
-  return var_get_dict_index (pv->v);
-}
-
diff --git a/src/ui/gui/psppire-variable.h b/src/ui/gui/psppire-variable.h
deleted file mode 100644 (file)
index 2b06336..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-/* 
-    PSPPIRE --- A Graphical User Interface for PSPP
-    Copyright (C) 2006  Free Software Foundation
-    Written by John Darrington
-
-    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 __PSPPIRE_VARIABLE_H__
-#define __PSPPIRE_VARIABLE_H__
-
-#include <glib-object.h>
-#include <glib.h>
-
-#include <data/variable.h>
-#include "psppire-dict.h"
-
-struct val_labs;
-
-/* Don't use any of these members.
-   Use accessor functions instead.
-*/
-struct PsppireVariable
-{
-  /* The payload */
-  struct variable *v;
-
-  /* The dictionary to which this variable belongs */
-  PsppireDict *dict;
-};
-
-
-
-gboolean psppire_variable_set_name(struct PsppireVariable *pv, const gchar *text);
-
-gboolean psppire_variable_set_columns(struct PsppireVariable *pv, gint columns);
-gboolean psppire_variable_set_label(struct PsppireVariable *pv, const gchar *label);
-gboolean psppire_variable_set_format(struct PsppireVariable *pv, struct fmt_spec *fmt);
-gboolean psppire_variable_set_decimals(struct PsppireVariable *pv, gint decimals);
-gboolean psppire_variable_set_width(struct PsppireVariable *pv, gint width);
-gboolean psppire_variable_set_alignment(struct PsppireVariable *pv, gint align);
-gboolean psppire_variable_set_measure(struct PsppireVariable *pv, gint measure);
-gboolean psppire_variable_set_value_labels(const struct PsppireVariable *pv,
-                                       const struct val_labs *vls);
-
-gboolean psppire_variable_set_missing(const struct PsppireVariable *pv,
-                                  const struct missing_values *miss);
-gboolean psppire_variable_set_print_spec(const struct PsppireVariable *pv, struct fmt_spec fmt);
-gboolean psppire_variable_set_write_spec(const struct PsppireVariable *pv, struct fmt_spec fmt);
-
-gboolean psppire_variable_set_type(struct PsppireVariable *pv, int type);
-
-
-
-const struct fmt_spec *psppire_variable_get_write_spec(const struct PsppireVariable *pv);
-const gchar * psppire_variable_get_name(const struct PsppireVariable *pv);
-
-gint psppire_variable_get_columns(const struct PsppireVariable *pv);
-
-const gchar * psppire_variable_get_label(const struct PsppireVariable *pv);
-
-
-const struct missing_values *psppire_variable_get_missing
-                                     (const struct PsppireVariable *pv);
-
-const struct val_labs * psppire_variable_get_value_labels
-                                     (const struct PsppireVariable *pv);
-
-gint psppire_variable_get_alignment(const struct PsppireVariable *pv);
-
-gint psppire_variable_get_measure(const struct PsppireVariable *pv);
-
-gint psppire_variable_get_fv(const struct PsppireVariable *pv);
-
-gint psppire_variable_get_type(const struct PsppireVariable *pv);
-
-gint psppire_variable_get_width(const struct PsppireVariable *pv);
-
-gint psppire_variable_get_index(const struct PsppireVariable *pv);
-
-
-#endif /* __PSPPIRE_VARIABLE_H__ */
index cdf30cad0de5db65e1988b07eeddf10cb7cfc726..40795a205112c57b60ca4e5b12ff380a3a67b164 100644 (file)
@@ -46,7 +46,6 @@
    8. The dialog box structure itself ought to be a GtkWindow and
       abstracted better.
 */
-   
 
 
 #include <config.h>
@@ -54,7 +53,6 @@
 #include "sort-cases-dialog.h"
 #include "psppire-dict.h"
 #include <math/sort.h>
-#include "psppire-variable.h"
 
 #include <gettext.h>
 #define _(msgid) gettext (msgid)
@@ -155,7 +153,7 @@ select_criteria(GtkTreeModel *model, GtkTreePath *path,
   GtkTreeIter new_iter;
   gint index;
   gint dir;
-  struct PsppireVariable *variable;
+  struct variable *variable;
   struct sort_cases_dialog *dialog = (struct sort_cases_dialog*) data;
 
   /* Get the variable from the dictionary */
@@ -163,7 +161,7 @@ select_criteria(GtkTreeModel *model, GtkTreePath *path,
                      DICT_TVM_COL_VAR, &variable,
                      -1);
        
-  index = psppire_variable_get_index(variable);
+  index = var_get_dict_index (variable);
 
   dir = gtk_toggle_button_get_active (dialog->ascending_button) ? 
     SRT_ASCEND:SRT_DESCEND;
@@ -263,7 +261,7 @@ criteria_render_func(GtkTreeViewColumn *column, GtkCellRenderer *renderer,
                     gpointer data)
 {
   gint var_index;
-  struct PsppireVariable *variable ;
+  struct variable *variable ;
   gint direction;
   gchar *buf;
   gchar *varname;
@@ -275,7 +273,7 @@ criteria_render_func(GtkTreeViewColumn *column, GtkCellRenderer *renderer,
 
   variable = psppire_dict_get_variable(dict, var_index);
 
-  varname = pspp_locale_to_utf8(psppire_variable_get_name(variable),
+  varname = pspp_locale_to_utf8 (var_get_name(variable),
                                -1, 0);
 
   if ( direction == SRT_ASCEND) 
@@ -464,7 +462,7 @@ convert_list_store_to_criteria(GtkListStore *list,
       valid;
       valid = gtk_tree_model_iter_next(model, &iter))
     {
-      struct PsppireVariable *variable;
+      struct variable *variable;
       gint index;
       struct sort_criterion *scn = &criteria->crits[n];
       g_assert ( n < criteria->crit_cnt);
@@ -477,8 +475,8 @@ convert_list_store_to_criteria(GtkListStore *list,
 
       variable = psppire_dict_get_variable(dict, index);
 
-      scn->fv    = psppire_variable_get_fv(variable);
-      scn->width = psppire_variable_get_width(variable);
+      scn->fv    = var_get_case_index (variable);
+      scn->width = var_get_width(variable);
     }
 }
 
index d24dd381d6eafafa9d2ddffa41cf46ff2e126429..c8440ccbd1959628be462f8036fb4e2ee6d025f1 100644 (file)
@@ -29,7 +29,6 @@
 #include "helper.h"
 #include "val-labs-dialog.h"
 #include <data/value-labels.h>
-#include "psppire-variable.h"
 
 /* This callback occurs when the text in the label entry box
    is changed */
@@ -44,7 +43,7 @@ on_label_entry_change(GtkEntry *entry, gpointer data)
   text = gtk_entry_get_text(GTK_ENTRY(dialog->value_entry));
 
   text_to_value(text, &v,
-               *psppire_variable_get_write_spec(dialog->pv));
+               *var_get_write_format (dialog->pv));
 
 
   if ( val_labs_find (dialog->labs, v) )
@@ -114,7 +113,7 @@ on_value_entry_change(GtkEntry *entry, gpointer data)
 
   union value v;
   text_to_value(text, &v,
-               *psppire_variable_get_write_spec(dialog->pv));
+               *var_get_write_format (dialog->pv));
 
 
   g_signal_handler_block(GTK_ENTRY(dialog->label_entry),
@@ -148,9 +147,10 @@ val_labs_ok(GtkWidget *w, gpointer data)
 {
   struct val_labs_dialog *dialog = data;
 
-  psppire_variable_set_value_labels(dialog->pv, dialog->labs);
+  var_set_value_labels (dialog->pv, dialog->labs);
 
   val_labs_destroy (dialog->labs);
+
   dialog->labs = 0;
 
   return FALSE;
@@ -210,12 +210,12 @@ on_change(GtkWidget *w, gpointer data)
   union value v;
 
   text_to_value(val_text, &v,
-               *psppire_variable_get_write_spec(dialog->pv));
+               *var_get_write_format (dialog->pv));
 
   val_labs_replace (dialog->labs, v,
-                   gtk_entry_get_text(GTK_ENTRY(dialog->label_entry)));
+                   gtk_entry_get_text (GTK_ENTRY(dialog->label_entry)));
 
-  gtk_widget_set_sensitive(dialog->change_button, FALSE);
+  gtk_widget_set_sensitive (dialog->change_button, FALSE);
 
   repopulate_dialog(dialog);
 
@@ -233,14 +233,14 @@ on_add(GtkWidget *w, gpointer data)
   const gchar *text = gtk_entry_get_text(GTK_ENTRY(dialog->value_entry));
 
   text_to_value(text, &v,
-               *psppire_variable_get_write_spec(dialog->pv));
+               *var_get_write_format (dialog->pv));
 
 
   if ( ! val_labs_add (dialog->labs, v,
-                      gtk_entry_get_text(GTK_ENTRY(dialog->label_entry)) ) )
+                      gtk_entry_get_text
+                      ( GTK_ENTRY (dialog->label_entry)) ) )
     return FALSE;
 
-
   gtk_widget_set_sensitive(dialog->add_button, FALSE);
 
   repopulate_dialog(dialog);
@@ -279,7 +279,7 @@ on_select_row                  (GtkTreeView *treeview,
   struct val_lab * vl  = get_selected_tuple(dialog);
 
   gchar *const text = value_to_text(vl->value,
-                                   *psppire_variable_get_write_spec(dialog->pv));
+                                   *var_get_write_format (dialog->pv));
 
   g_signal_handler_block(GTK_ENTRY(dialog->value_entry),
                         dialog->value_handler_id);
@@ -420,7 +420,7 @@ repopulate_dialog(struct val_labs_dialog *dialog)
 
       gchar *const vstr  =
        value_to_text(vl->value,
-                     *psppire_variable_get_write_spec(dialog->pv));
+                     *var_get_write_format (dialog->pv));
 
       gchar *labeltext =
        pspp_locale_to_utf8(vl->label, -1, 0);
@@ -455,13 +455,13 @@ val_labs_dialog_show(struct val_labs_dialog *dialog)
 
   g_assert(!dialog->labs);
 
-  value_labels = psppire_variable_get_value_labels (dialog->pv);
+  value_labels = var_get_value_labels (dialog->pv);
 
   if (value_labels)
     dialog->labs = val_labs_copy ( value_labels );
   else
-    dialog->labs = val_labs_create ( psppire_variable_get_width (dialog->pv));
-
+    dialog->labs = val_labs_create ( var_get_width (dialog->pv));
+  
   gtk_widget_set_sensitive(dialog->remove_button, FALSE);
   gtk_widget_set_sensitive(dialog->change_button, FALSE);
   gtk_widget_set_sensitive(dialog->add_button, FALSE);
index 85f1a6d31717bf0f48c1fcef553d02b2bde3a904..fe2c3bacf43ead5833ed7e3510835393a590fb13 100644 (file)
@@ -40,7 +40,7 @@ struct val_labs_dialog
 
 
   /* The variable to be updated */
-  struct PsppireVariable *pv;
+  struct variable *pv;
 
   /* Local copy of labels */
   struct val_labs *labs;
index 2cf12f58703f96e1ac2cfa1b8ae8d9da891d744d..2c3137adb6d1212aa5667ce82ed25ed4dbfbb737 100644 (file)
@@ -46,7 +46,6 @@
 #include "helper.h"
 #include "menu-actions.h"
 #include "psppire-dict.h"
-#include "psppire-variable.h"
 #include "var-type-dialog.h"
 #include "var-sheet.h"
 #include "customentry.h"
@@ -141,28 +140,28 @@ static void
 change_alignment(GtkComboBox *cb,
     gpointer user_data)
 {
-  struct PsppireVariable *pv = user_data;
+  struct variable *pv = user_data;
   gint active_item = gtk_combo_box_get_active(cb);
 
   if ( active_item < 0 ) return ;
 
-  psppire_variable_set_alignment(pv, active_item);
+  var_set_alignment (pv, active_item);
 }
 
 
 
 /* Callback for when the measure combo box 
    item is selected */
-static void        
+static void
 change_measure(GtkComboBox *cb,
     gpointer user_data)
 {
-  struct PsppireVariable *pv = user_data;
+  struct variable *pv = user_data;
   gint active_item = gtk_combo_box_get_active(cb);
 
   if ( active_item < 0 ) return ;
 
-  psppire_variable_set_measure(pv, active_item);
+  var_set_measure (pv, active_item + 1);
 }
 
 
@@ -215,7 +214,7 @@ var_sheet_cell_change_entry (GtkSheet * sheet, gint row, gint column,
 {
   GtkSheetCellAttr attributes;
   PsppireVarStore *var_store ;
-  struct PsppireVariable *pv ;
+  struct variable *pv ;
 
   g_return_val_if_fail(sheet != NULL, FALSE);
 
@@ -233,7 +232,7 @@ var_sheet_cell_change_entry (GtkSheet * sheet, gint row, gint column,
 
   gtk_sheet_get_attributes(sheet, row, column, &attributes);
 
-  pv = psppire_var_store_get_variable(var_store, row);
+  pv = psppire_var_store_get_var (var_store, row);
 
   switch (column)
     {
@@ -267,15 +266,15 @@ var_sheet_cell_change_entry (GtkSheet * sheet, gint row, gint column,
          GTK_COMBO_BOX_ENTRY(gtk_sheet_get_entry(sheet)->parent);
 
 
-       if ( ! list_store) list_store = create_label_list(measures);
+       if ( ! list_store) list_store = create_label_list (measures);
 
        gtk_combo_box_set_model(GTK_COMBO_BOX(cbe), 
                                GTK_TREE_MODEL(list_store));
 
        gtk_combo_box_entry_set_text_column (cbe, 0);
 
-       g_signal_connect(G_OBJECT(cbe),"changed", 
-                        G_CALLBACK(change_measure), pv);
+       g_signal_connect (G_OBJECT(cbe),"changed",
+                         G_CALLBACK (change_measure), pv);
       }
       break;
 
@@ -315,7 +314,7 @@ var_sheet_cell_change_entry (GtkSheet * sheet, gint row, gint column,
        if (!missing_val_dialog ) 
            missing_val_dialog = missing_val_dialog_create(xml);
 
-       missing_val_dialog->pv = psppire_var_store_get_variable(var_store, row);
+       missing_val_dialog->pv = psppire_var_store_get_var (var_store, row);
 
        g_signal_connect_swapped(GTK_OBJECT(customEntry),
                                 "clicked",
@@ -367,16 +366,16 @@ var_sheet_cell_change_entry (GtkSheet * sheet, gint row, gint column,
              const gint current_value  = atoi(s);
              GtkObject *adj ;
 
-             const struct fmt_spec *fmt = psppire_variable_get_write_spec(pv);
+             const struct fmt_spec *fmt = var_get_write_format (pv);
              switch (column) 
                {
                case COL_WIDTH:
-                 r_min = fmt->d + 1;
-                 r_max = (psppire_variable_get_type(pv) == VAR_STRING) ? MAX_STRING : 40;
+                 r_min = MAX (fmt->d + 1, fmt_min_output_width (fmt->type));
+                 r_max = fmt_max_output_width (fmt->type);
                  break;
                case COL_DECIMALS:
                  r_min = 0 ; 
-                 r_max = MIN(fmt->w - 1, 16);
+                 r_max = fmt_max_output_decimals (fmt->type, fmt->w);
                  break;
                case COL_COLUMNS:
                  r_min = 1;
index d4262872e044eb6b61f9c0e2e55a893a99ce10b9..0d58026df083b139b56dd4979d4a5b6588cdb9b3 100644 (file)
@@ -32,7 +32,6 @@
 
 #include "var-type-dialog.h"
 
-#include "psppire-variable.h"
 #include "helper.h"
 
 #include <data/variable.h>
@@ -130,7 +129,7 @@ static void update_width_decimals(const struct var_type_dialog *dialog);
 static void
 set_local_width_decimals(struct var_type_dialog *dialog)
 {
-  dialog->fmt_l = * psppire_variable_get_write_spec(dialog->pv);
+  dialog->fmt_l = * var_get_write_format (dialog->pv);
 
   switch (dialog->active_button) 
     {
@@ -665,7 +664,7 @@ var_type_dialog_set_state(struct var_type_dialog *dialog)
   g_assert(dialog->pv);
 
   /* Populate width and decimals */
-  write_spec = psppire_variable_get_write_spec(dialog->pv);
+  write_spec = var_get_write_format (dialog->pv);
 
   g_string_printf(str, "%d", write_spec->d);
 
@@ -820,12 +819,10 @@ on_var_type_ok_clicked(GtkWidget *w, gpointer data)
        break;
       }
 
-    if ( result == true ) 
+    if ( result == true )
       {
-       psppire_variable_set_type(dialog->pv, new_type);
-       psppire_variable_set_width(dialog->pv, new_width);
-       psppire_variable_set_write_spec(dialog->pv, spec);
-       psppire_variable_set_print_spec(dialog->pv, spec);
+       var_set_width (dialog->pv, new_width);
+       var_set_both_formats (dialog->pv, &spec);
       }
 
   }
index d259fa1a71617d56105f33b3b6b5fa4a43729217..2b2caee6f0abc707e7a3549e683260a9fc55f2dc 100644 (file)
@@ -50,13 +50,7 @@ struct var_type_dialog
   GtkWidget *window;
 
   /* Variable to be updated */
-  struct PsppireVariable *pv;
-#if 0
-  struct variable *var;
-
-  /* Function to be run when the dialog changes a variable */
-  variable_changed_func var_change_func;
-#endif
+  struct variable *pv;
 
   /* Local copy of format specifier */
   struct fmt_spec fmt_l;
@@ -104,5 +98,4 @@ void var_type_dialog_set_variable(struct var_type_dialog *dialog,
 
 void var_type_dialog_show(struct var_type_dialog *dialog);
 
-
 #endif
index 0ece812b920b6c1b00e5dc9f5caacc094acbfe21..7e1f5c99f98fc80bf367c7c20b8f668aafbfb86c 100644 (file)
@@ -130,7 +130,7 @@ main (int argc, char **argv)
             check_msg_count (the_source_stream);
         }
     }
-  
+
   terminate (!any_errors ());
 }
 \f