pspp-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Pspp-cvs] pspp ./ChangeLog ./Makefile.am lib/gsl-extras/b...


From: John Darrington
Subject: [Pspp-cvs] pspp ./ChangeLog ./Makefile.am lib/gsl-extras/b...
Date: Sun, 07 May 2006 02:18:32 +0000

CVSROOT:        /sources/pspp
Module name:    pspp
Branch:         
Changes by:     John Darrington <address@hidden>        06/05/07 02:18:32

Modified files:
        .              : ChangeLog Makefile.am 
        lib/gsl-extras : betadistinv.c binomial.c geometric.c 
                         hypergeometric.c negbinom.c poisson.c 
        po             : LINGUAS pspp.pot 
        src            : automake.mk 
        src/data       : ChangeLog data-in.c data-out.c dictionary.c 
                         sys-file-reader.c sys-file-writer.c variable.c 
                         variable.h 
        src/language/expressions: ChangeLog evaluate.c 
        src/libpspp    : ChangeLog array.c array.h 
        src/ui/gui     : ChangeLog psppire-data-store.c 
Removed files:
        po             : en_GB.po 

Log message:
        Reworked very long string support for better encapsulation.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/ChangeLog.diff?tr1=1.57&tr2=1.58&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/Makefile.am.diff?tr1=1.12&tr2=1.13&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/lib/gsl-extras/betadistinv.c.diff?tr1=1.4&tr2=1.5&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/lib/gsl-extras/binomial.c.diff?tr1=1.3&tr2=1.4&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/lib/gsl-extras/geometric.c.diff?tr1=1.3&tr2=1.4&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/lib/gsl-extras/hypergeometric.c.diff?tr1=1.3&tr2=1.4&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/lib/gsl-extras/negbinom.c.diff?tr1=1.3&tr2=1.4&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/lib/gsl-extras/poisson.c.diff?tr1=1.3&tr2=1.4&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/po/LINGUAS.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/po/pspp.pot.diff?tr1=1.83&tr2=1.84&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/src/automake.mk.diff?tr1=1.5&tr2=1.6&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/src/data/ChangeLog.diff?tr1=1.41&tr2=1.42&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/src/data/data-in.c.diff?tr1=1.8&tr2=1.9&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/src/data/data-out.c.diff?tr1=1.4&tr2=1.5&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/src/data/dictionary.c.diff?tr1=1.11&tr2=1.12&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/src/data/sys-file-reader.c.diff?tr1=1.15&tr2=1.16&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/src/data/sys-file-writer.c.diff?tr1=1.9&tr2=1.10&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/src/data/variable.c.diff?tr1=1.7&tr2=1.8&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/src/data/variable.h.diff?tr1=1.9&tr2=1.10&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/src/language/expressions/ChangeLog.diff?tr1=1.3&tr2=1.4&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/src/language/expressions/evaluate.c.diff?tr1=1.3&tr2=1.4&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/src/libpspp/ChangeLog.diff?tr1=1.18&tr2=1.19&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/src/libpspp/array.c.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/src/libpspp/array.h.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/src/ui/gui/ChangeLog.diff?tr1=1.9&tr2=1.10&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/pspp/pspp/src/ui/gui/psppire-data-store.c.diff?tr1=1.4&tr2=1.5&r1=text&r2=text

Patches:
Index: pspp/ChangeLog
diff -u pspp/ChangeLog:1.57 pspp/ChangeLog:1.58
--- pspp/ChangeLog:1.57 Tue May  2 03:51:42 2006
+++ pspp/ChangeLog      Sun May  7 02:18:31 2006
@@ -1,3 +1,8 @@
+Sun May  7 09:27:40 WST 2006 John Darrington <address@hidden>
+
+       * po/en_GB.po : Removed.  Now that messages talking about coloUrs have 
+       been removed, it does nothing.
+
 Tue May  2 10:43:30 WST 2006 John Darrington <address@hidden>
 
        * Bumped the minor version number from 0.4.1 to 0.4.2 to reflect 
Index: pspp/Makefile.am
diff -u pspp/Makefile.am:1.12 pspp/Makefile.am:1.13
--- pspp/Makefile.am:1.12       Mon Mar 13 09:03:47 2006
+++ pspp/Makefile.am    Sun May  7 02:18:31 2006
@@ -6,8 +6,7 @@
 DISTCLEANFILES = 
 
 
-AM_CPPFLAGS=-I$(top_srcdir) -I$(top_srcdir)/src -I$(top_srcdir)/lib    \
--I$(top_srcdir)/intl -I$(top_srcdir)/gl -I$(top_builddir)/gl
+AM_CPPFLAGS=-I$(top_srcdir)/intl -I$(top_srcdir)/gl -I$(top_builddir)/gl
 
 AM_CFLAGS=
 
Index: pspp/lib/gsl-extras/betadistinv.c
diff -u pspp/lib/gsl-extras/betadistinv.c:1.4 
pspp/lib/gsl-extras/betadistinv.c:1.5
--- pspp/lib/gsl-extras/betadistinv.c:1.4       Fri Apr 29 01:02:12 2005
+++ pspp/lib/gsl-extras/betadistinv.c   Sun May  7 02:18:31 2006
@@ -33,7 +33,6 @@
  * August 1968, pages 1264-1273.
  */
 
-#include <config.h>
 #include <math.h>
 #include <gsl/gsl_math.h>
 #include <gsl/gsl_errno.h>
Index: pspp/lib/gsl-extras/binomial.c
diff -u pspp/lib/gsl-extras/binomial.c:1.3 pspp/lib/gsl-extras/binomial.c:1.4
--- pspp/lib/gsl-extras/binomial.c:1.3  Fri Apr 29 01:02:12 2005
+++ pspp/lib/gsl-extras/binomial.c      Sun May  7 02:18:31 2006
@@ -33,7 +33,6 @@
  * Applications," volume 1. Wiley, 1968. Exercise 45, page 173,
  * chapter 6.
  */
-#include <config.h>
 #include <math.h>
 #include <gsl/gsl_math.h>
 #include <gsl/gsl_errno.h>
Index: pspp/lib/gsl-extras/geometric.c
diff -u pspp/lib/gsl-extras/geometric.c:1.3 pspp/lib/gsl-extras/geometric.c:1.4
--- pspp/lib/gsl-extras/geometric.c:1.3 Fri Apr 29 01:02:12 2005
+++ pspp/lib/gsl-extras/geometric.c     Sun May  7 02:18:31 2006
@@ -23,7 +23,6 @@
  * the probability of n or fewer failuers before success k.
  */
 
-#include <config.h>
 #include <math.h>
 #include <gsl/gsl_math.h>
 #include <gsl/gsl_errno.h>
Index: pspp/lib/gsl-extras/hypergeometric.c
diff -u pspp/lib/gsl-extras/hypergeometric.c:1.3 
pspp/lib/gsl-extras/hypergeometric.c:1.4
--- pspp/lib/gsl-extras/hypergeometric.c:1.3    Fri Apr 29 01:02:12 2005
+++ pspp/lib/gsl-extras/hypergeometric.c        Sun May  7 02:18:31 2006
@@ -40,7 +40,6 @@
  * W. Feller. An Introduction to Probability Theory and Its Applications,
  * third edition. 1968. Chapter 2, section 6. 
  */
-#include <config.h>
 #include <math.h>
 #include <gsl/gsl_math.h>
 #include <gsl/gsl_errno.h>
Index: pspp/lib/gsl-extras/negbinom.c
diff -u pspp/lib/gsl-extras/negbinom.c:1.3 pspp/lib/gsl-extras/negbinom.c:1.4
--- pspp/lib/gsl-extras/negbinom.c:1.3  Fri Apr 29 01:02:12 2005
+++ pspp/lib/gsl-extras/negbinom.c      Sun May  7 02:18:31 2006
@@ -19,7 +19,6 @@
  */
 
 
-#include <config.h>
 #include <math.h>
 #include <gsl/gsl_math.h>
 #include <gsl/gsl_errno.h>
Index: pspp/lib/gsl-extras/poisson.c
diff -u pspp/lib/gsl-extras/poisson.c:1.3 pspp/lib/gsl-extras/poisson.c:1.4
--- pspp/lib/gsl-extras/poisson.c:1.3   Fri Apr 29 01:02:12 2005
+++ pspp/lib/gsl-extras/poisson.c       Sun May  7 02:18:31 2006
@@ -32,7 +32,6 @@
  * Applications," volume 1. Wiley, 1968. Exercise 46, page 173,
  * chapter 6.
  */
-#include <config.h>
 #include <math.h>
 #include <gsl/gsl_math.h>
 #include <gsl/gsl_errno.h>
Index: pspp/po/LINGUAS
diff -u pspp/po/LINGUAS:1.2 pspp/po/LINGUAS:1.3
--- pspp/po/LINGUAS:1.2 Tue Jan 27 00:08:55 2004
+++ pspp/po/LINGUAS     Sun May  7 02:18:31 2006
@@ -1,2 +1 @@
 # Available languages
-en_GB
Index: pspp/po/pspp.pot
diff -u pspp/po/pspp.pot:1.83 pspp/po/pspp.pot:1.84
--- pspp/po/pspp.pot:1.83       Sat May  6 17:46:52 2006
+++ pspp/po/pspp.pot    Sun May  7 02:18:31 2006
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2006-05-04 21:55-0700\n"
+"POT-Creation-Date: 2006-05-07 09:52+0800\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <address@hidden>\n"
 "Language-Team: LANGUAGE <address@hidden>\n"
@@ -115,11 +115,11 @@
 msgid "Unrecognized character in field."
 msgstr ""
 
-#: src/data/data-in.c:339 src/data/data-in.c:589
+#: src/data/data-in.c:339 src/data/data-in.c:587
 msgid "Field must have even length."
 msgstr ""
 
-#: src/data/data-in.c:349 src/data/data-in.c:599
+#: src/data/data-in.c:349 src/data/data-in.c:597
 msgid "Field must contain only hex digits."
 msgstr ""
 
@@ -146,104 +146,104 @@
 msgid "Error in syntax of zoned decimal number."
 msgstr ""
 
-#: src/data/data-in.c:639
+#: src/data/data-in.c:637
 msgid "Unexpected end of field."
 msgstr ""
 
-#: src/data/data-in.c:665
+#: src/data/data-in.c:663
 msgid "Digit expected in field."
 msgstr ""
 
-#: src/data/data-in.c:690
+#: src/data/data-in.c:688
 #, c-format
 msgid "Day (%ld) must be between 1 and 31."
 msgstr ""
 
-#: src/data/data-in.c:715
+#: src/data/data-in.c:713
 msgid "Delimiter expected between fields in date."
 msgstr ""
 
-#: src/data/data-in.c:748
+#: src/data/data-in.c:746
 #, c-format
 msgid "Parse error at `%c' expecting %s."
 msgstr ""
 
-#: src/data/data-in.c:762
+#: src/data/data-in.c:760
 #, c-format
 msgid "Unknown %s `%.*s'."
 msgstr ""
 
-#: src/data/data-in.c:812
+#: src/data/data-in.c:810
 #, c-format
 msgid "Month (%ld) must be between 1 and 12."
 msgstr ""
 
-#: src/data/data-in.c:816
+#: src/data/data-in.c:814
 msgid "month"
 msgstr ""
 
-#: src/data/data-in.c:830
+#: src/data/data-in.c:828
 #, c-format
 msgid "Year (%ld) must be between 1582 and 19999."
 msgstr ""
 
-#: src/data/data-in.c:841
+#: src/data/data-in.c:839
 #, c-format
 msgid "Trailing garbage \"%s\" following date."
 msgstr ""
 
-#: src/data/data-in.c:856
+#: src/data/data-in.c:854
 #, c-format
 msgid "Julian day (%d) must be between 1 and 366."
 msgstr ""
 
-#: src/data/data-in.c:868
+#: src/data/data-in.c:866
 #, c-format
 msgid "Year (%d) must be between 1582 and 19999."
 msgstr ""
 
-#: src/data/data-in.c:884
+#: src/data/data-in.c:882
 #, c-format
 msgid "Quarter (%ld) must be between 1 and 4."
 msgstr ""
 
-#: src/data/data-in.c:894
+#: src/data/data-in.c:892
 msgid "`Q' expected between quarter and year."
 msgstr ""
 
-#: src/data/data-in.c:910
+#: src/data/data-in.c:908
 #, c-format
 msgid "Week (%ld) must be between 1 and 53."
 msgstr ""
 
-#: src/data/data-in.c:922
+#: src/data/data-in.c:920
 msgid "`WK' expected between week and year."
 msgstr ""
 
-#: src/data/data-in.c:945
+#: src/data/data-in.c:943
 msgid "Delimiter expected between fields in time."
 msgstr ""
 
-#: src/data/data-in.c:957
+#: src/data/data-in.c:955
 #, c-format
 msgid "Hour (%ld) must be positive."
 msgstr ""
 
-#: src/data/data-in.c:969
+#: src/data/data-in.c:967
 #, c-format
 msgid "Minute (%ld) must be between 0 and 59."
 msgstr ""
 
-#: src/data/data-in.c:1016
+#: src/data/data-in.c:1014
 #, c-format
 msgid "Hour (%ld) must be between 0 and 23."
 msgstr ""
 
-#: src/data/data-in.c:1044
+#: src/data/data-in.c:1042
 msgid "weekday"
 msgstr ""
 
-#: src/data/data-in.c:1375
+#: src/data/data-in.c:1373
 #, c-format
 msgid "Field too long (%d characters).  Truncated after character %d."
 msgstr ""
@@ -388,31 +388,31 @@
 msgstr ""
 
 #: src/data/format.c:197 src/data/por-file-reader.c:481
-#: src/data/sys-file-reader.c:1197 src/data/sys-file-reader.c:1206
+#: src/data/sys-file-reader.c:1255 src/data/sys-file-reader.c:1264
 #: src/ui/gui/psppire-var-store.c:435
 msgid "String"
 msgstr ""
 
 #: src/data/format.c:197 src/data/por-file-reader.c:481
-#: src/data/sys-file-reader.c:1197 src/data/sys-file-reader.c:1206
+#: src/data/sys-file-reader.c:1255 src/data/sys-file-reader.c:1264
 #: src/ui/gui/psppire-var-store.c:428
 msgid "Numeric"
 msgstr ""
 
-#: src/data/format.c:198 src/data/sys-file-reader.c:1199
-#: src/data/sys-file-reader.c:1344 src/data/sys-file-reader.c:1345
+#: src/data/format.c:198 src/data/sys-file-reader.c:1257
+#: src/data/sys-file-reader.c:1402 src/data/sys-file-reader.c:1403
 #: src/data/variable.c:41 src/language/dictionary/apply-dictionary.c:76
 #: src/language/dictionary/apply-dictionary.c:77
-#: src/language/xforms/recode.c:469 src/language/xforms/recode.c:470
+#: src/language/xforms/recode.c:476 src/language/xforms/recode.c:477
 msgid "numeric"
 msgstr ""
 
-#: src/data/format.c:198 src/data/sys-file-reader.c:1199
-#: src/data/sys-file-reader.c:1344 src/data/sys-file-reader.c:1345
+#: src/data/format.c:198 src/data/sys-file-reader.c:1257
+#: src/data/sys-file-reader.c:1402 src/data/sys-file-reader.c:1403
 #: src/data/variable.c:41 src/data/variable.c:49
 #: src/language/dictionary/apply-dictionary.c:76
 #: src/language/dictionary/apply-dictionary.c:77
-#: src/language/xforms/recode.c:469 src/language/xforms/recode.c:470
+#: src/language/xforms/recode.c:476 src/language/xforms/recode.c:477
 msgid "string"
 msgstr ""
 
@@ -478,12 +478,12 @@
 msgid "Bad time string length %d."
 msgstr ""
 
-#: src/data/por-file-reader.c:473 src/data/sys-file-reader.c:1189
+#: src/data/por-file-reader.c:473 src/data/sys-file-reader.c:1247
 #, c-format
 msgid "%s: Bad format specifier byte (%d)."
 msgstr ""
 
-#: src/data/por-file-reader.c:480 src/data/sys-file-reader.c:1205
+#: src/data/por-file-reader.c:480 src/data/sys-file-reader.c:1263
 #, c-format
 msgid "%s variable %s has invalid format specifier %s."
 msgstr ""
@@ -564,27 +564,6 @@
 msgid "An I/O error occurred writing portable file \"%s\"."
 msgstr ""
 
-#: src/data/procedure.c:587 src/language/data-io/data-list.c:766
-#: src/language/data-io/data-list.c:881 src/language/data-io/print.c:802
-#: src/language/dictionary/sys-file-info.c:143
-#: src/language/dictionary/sys-file-info.c:377
-#: src/language/stats/descriptives.c:888
-msgid "Variable"
-msgstr ""
-
-#: src/data/procedure.c:588 src/language/dictionary/sys-file-info.c:522
-#: src/language/stats/crosstabs.q:1111 src/language/stats/crosstabs.q:1138
-#: src/language/stats/crosstabs.q:1158 src/language/stats/crosstabs.q:1180
-#: src/language/stats/examine.q:1143 src/language/stats/frequencies.q:1146
-#: src/language/stats/frequencies.q:1267
-msgid "Value"
-msgstr ""
-
-#: src/data/procedure.c:589 src/language/dictionary/sys-file-info.c:384
-#: src/language/dictionary/sys-file-info.c:523 src/ui/gui/var-sheet.c:71
-msgid "Label"
-msgstr ""
-
 #: src/data/scratch-reader.c:59
 #, c-format
 msgid ""
@@ -597,140 +576,140 @@
 msgid "Could not access definition for terminal `%s'."
 msgstr ""
 
-#: src/data/sys-file-reader.c:132
+#: src/data/sys-file-reader.c:137
 msgid "corrupt system file: "
 msgstr ""
 
-#: src/data/sys-file-reader.c:156
+#: src/data/sys-file-reader.c:161
 #, c-format
 msgid "%s: Closing system file: %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:317
+#: src/data/sys-file-reader.c:378
 #, c-format
 msgid ""
 "An error occurred while opening \"%s\" for reading as a system file: %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:334
+#: src/data/sys-file-reader.c:395
 #, c-format
 msgid ""
 "%s: Index of weighting variable (%d) is not between 0 and number of elements "
 "per case (%d)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:343
+#: src/data/sys-file-reader.c:404
 #, c-format
 msgid ""
 "%s: Weighting variable may not be a continuation of a long string variable."
 msgstr ""
 
-#: src/data/sys-file-reader.c:346
+#: src/data/sys-file-reader.c:407
 #, c-format
 msgid "%s: Weighting variable may not be a string variable."
 msgstr ""
 
-#: src/data/sys-file-reader.c:372
+#: src/data/sys-file-reader.c:433
 #, c-format
 msgid ""
 "%s: Orphaned variable index record (type 4).  Type 4 records must always "
 "immediately follow type 3 records."
 msgstr ""
 
-#: src/data/sys-file-reader.c:431
+#: src/data/sys-file-reader.c:492
 #, c-format
 msgid "%s: Invalid subrecord length. Record: 7; Subrecord: 11"
 msgstr ""
 
-#: src/data/sys-file-reader.c:492
+#: src/data/sys-file-reader.c:555
 #, c-format
 msgid "%s: Trailing garbage in long variable name map."
 msgstr ""
 
-#: src/data/sys-file-reader.c:499
+#: src/data/sys-file-reader.c:562
 #, c-format
 msgid "%s: Long variable mapping to invalid variable name `%s'."
 msgstr ""
 
-#: src/data/sys-file-reader.c:509
+#: src/data/sys-file-reader.c:572
 #, c-format
 msgid "%s: Long variable mapping for nonexistent variable %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:518
+#: src/data/sys-file-reader.c:581
 #, c-format
 msgid "%s: Duplicate long variable name `%s' within system file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:609
+#: src/data/sys-file-reader.c:672
 #, c-format
 msgid "%s: No variable called %s but it is listed in length table."
 msgstr ""
 
-#: src/data/sys-file-reader.c:661
+#: src/data/sys-file-reader.c:730
 #, c-format
 msgid "%s: Unrecognized record type 7, subtype %d encountered in system file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:687
+#: src/data/sys-file-reader.c:756
 #, c-format
 msgid "%s: Unrecognized record type %d."
 msgstr ""
 
-#: src/data/sys-file-reader.c:725
+#: src/data/sys-file-reader.c:793
 #, c-format
 msgid ""
 "%s: Bad size (%d) or count (%d) field on record type 7, subtype 3.\tExpected "
 "size %d, count 8."
 msgstr ""
 
-#: src/data/sys-file-reader.c:736
+#: src/data/sys-file-reader.c:804
 #, c-format
 msgid ""
 "%s: Floating-point representation in system file is not IEEE-754.  PSPP "
 "cannot convert between floating-point formats."
 msgstr ""
 
-#: src/data/sys-file-reader.c:752
+#: src/data/sys-file-reader.c:820
 #, c-format
 msgid ""
 "%s: File-indicated endianness (%s) does not match endianness intuited from "
 "file header (%s)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:755 src/data/sys-file-reader.c:756
+#: src/data/sys-file-reader.c:823 src/data/sys-file-reader.c:824
 msgid "big-endian"
 msgstr ""
 
-#: src/data/sys-file-reader.c:755 src/data/sys-file-reader.c:756
+#: src/data/sys-file-reader.c:823 src/data/sys-file-reader.c:824
 msgid "little-endian"
 msgstr ""
 
-#: src/data/sys-file-reader.c:757
+#: src/data/sys-file-reader.c:825
 msgid "unknown"
 msgstr ""
 
-#: src/data/sys-file-reader.c:761
+#: src/data/sys-file-reader.c:829
 #, c-format
 msgid "%s: File-indicated character representation code (%s) is not ASCII."
 msgstr ""
 
-#: src/data/sys-file-reader.c:765
+#: src/data/sys-file-reader.c:833
 msgid "DEC Kanji"
 msgstr ""
 
-#: src/data/sys-file-reader.c:765 src/language/dictionary/sys-file-info.c:123
+#: src/data/sys-file-reader.c:833 src/language/dictionary/sys-file-info.c:123
 msgid "Unknown"
 msgstr ""
 
-#: src/data/sys-file-reader.c:781
+#: src/data/sys-file-reader.c:849
 #, c-format
 msgid ""
 "%s: Bad size (%d) or count (%d) field on record type 7, subtype 4.\tExpected "
 "size %d, count 8."
 msgstr ""
 
-#: src/data/sys-file-reader.c:796
+#: src/data/sys-file-reader.c:864
 #, c-format
 msgid ""
 "%s: File-indicated value is different from internal value for at least one "
@@ -738,213 +717,213 @@
 "%g; LOWEST: %g, %g."
 msgstr ""
 
-#: src/data/sys-file-reader.c:823
+#: src/data/sys-file-reader.c:891
 #, c-format
 msgid ""
 "%s: Bad magic.  Proper system files begin with the four characters `$FL2'. "
 "This file will not be read."
 msgstr ""
 
-#: src/data/sys-file-reader.c:865
+#: src/data/sys-file-reader.c:933
 #, c-format
 msgid ""
 "%s: File layout code has unexpected value %d.  Value should be 2, in big-"
 "endian or little-endian format."
 msgstr ""
 
-#: src/data/sys-file-reader.c:894
+#: src/data/sys-file-reader.c:962
 #, c-format
 msgid "%s: Number of cases in file (%ld) is not between -1 and %d."
 msgstr ""
 
-#: src/data/sys-file-reader.c:899
+#: src/data/sys-file-reader.c:967
 #, c-format
 msgid "%s: Compression bias (%g) is not the usual value of 100."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1018
+#: src/data/sys-file-reader.c:1078
 #, c-format
 msgid ""
 "%s: position %d: String variable does not have proper number of continuation "
 "records."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1029
+#: src/data/sys-file-reader.c:1088
 #, c-format
 msgid "%s: position %d: Superfluous long string continuation record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1035
+#: src/data/sys-file-reader.c:1094
 #, c-format
 msgid "%s: position %d: Bad variable type code %d."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1038
+#: src/data/sys-file-reader.c:1097
 #, c-format
 msgid "%s: position %d: Variable label indicator field is not 0 or 1."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1042
+#: src/data/sys-file-reader.c:1101
 #, c-format
 msgid ""
 "%s: position %d: Missing value indicator field is not -3, -2, 0, 1, 2, or 3."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1047
+#: src/data/sys-file-reader.c:1106
 #, c-format
 msgid "%s: position %d: Variable name begins with invalid character."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1066
+#: src/data/sys-file-reader.c:1125
 #, c-format
 msgid "%s: Invalid variable name `%s' within system file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1072
+#: src/data/sys-file-reader.c:1131
 #, c-format
 msgid "%s: Duplicate variable name `%s' within system file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1096
+#: src/data/sys-file-reader.c:1155
 #, c-format
 msgid "%s: Variable %s indicates variable label of invalid length %d."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1117
+#: src/data/sys-file-reader.c:1176
 #, c-format
 msgid "%s: Long string variable %s may not have missing values."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1138
+#: src/data/sys-file-reader.c:1197
 #, c-format
 msgid ""
 "%s: String variable %s may not have missing values specified as a range."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1165
+#: src/data/sys-file-reader.c:1223
 #, c-format
 msgid "%s: Long string continuation records omitted at end of dictionary."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1170
+#: src/data/sys-file-reader.c:1228
 #, c-format
 msgid ""
 "%s: System file header indicates %d variable positions but %d were read from "
 "file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1195
+#: src/data/sys-file-reader.c:1253
 #, c-format
 msgid "%s: %s variable %s has %s format specifier %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1248
+#: src/data/sys-file-reader.c:1306
 #, c-format
 msgid "%s: Invalid number of labels: %d.  Ignoring labels."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1290
+#: src/data/sys-file-reader.c:1348
 #, c-format
 msgid ""
 "%s: Variable index record (type 4) does not immediately follow value label "
 "record (type 3) as it should."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1301
+#: src/data/sys-file-reader.c:1359
 #, c-format
 msgid ""
 "%s: Number of variables associated with a value label (%d) is not between 1 "
 "and the number of variables (%d)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1317
+#: src/data/sys-file-reader.c:1375
 #, c-format
 msgid ""
 "%s: Variable index associated with value label (%d) is not between 1 and the "
 "number of values (%d)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1324
+#: src/data/sys-file-reader.c:1382
 #, c-format
 msgid ""
 "%s: Variable index associated with value label (%d) refers to a continuation "
 "of a string variable, not to an actual variable."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1329
+#: src/data/sys-file-reader.c:1387
 #, c-format
 msgid "%s: Value labels are not allowed on long string variables (%s)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1340
+#: src/data/sys-file-reader.c:1398
 #, c-format
 msgid ""
 "%s: Variables associated with value label are not all of identical type.  "
 "Variable %s has %s type, but variable %s has %s type."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1381
+#: src/data/sys-file-reader.c:1439
 #, c-format
 msgid "%s: File contains duplicate label for value %g for variable %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1385
+#: src/data/sys-file-reader.c:1443
 #, c-format
 msgid "%s: File contains duplicate label for value `%.*s' for variable %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1427 src/data/sys-file-reader.c:1711
+#: src/data/sys-file-reader.c:1485 src/data/sys-file-reader.c:1807
 #, c-format
 msgid "%s: Reading system file: %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1430 src/data/sys-file-reader.c:1549
-#: src/data/sys-file-reader.c:1590
+#: src/data/sys-file-reader.c:1488 src/data/sys-file-reader.c:1607
+#: src/data/sys-file-reader.c:1648
 #, c-format
 msgid "%s: Unexpected end of file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1447
+#: src/data/sys-file-reader.c:1505
 #, c-format
 msgid "%s: Seeking system file: %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1462
+#: src/data/sys-file-reader.c:1520
 #, c-format
 msgid "%s: System file contains multiple type 6 (document) records."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1468
+#: src/data/sys-file-reader.c:1526
 #, c-format
 msgid "%s: Number of document lines (%ld) must be greater than 0."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1502
+#: src/data/sys-file-reader.c:1560
 #, c-format
 msgid "%s: Error reading file: %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1541
+#: src/data/sys-file-reader.c:1599
 #, c-format
 msgid "%s: Compressed data is corrupted.  Data ends in partial case."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1717
+#: src/data/sys-file-reader.c:1813
 #, c-format
 msgid "%s: Partial record at end of system file."
 msgstr ""
 
-#: src/data/sys-file-writer.c:175
+#: src/data/sys-file-writer.c:176
 #, c-format
 msgid "Unknown system file version %d. Treating as version %d."
 msgstr ""
 
-#: src/data/sys-file-writer.c:326
+#: src/data/sys-file-writer.c:328
 #, c-format
 msgid "Error opening \"%s\" for writing as a system file: %s."
 msgstr ""
 
-#: src/data/sys-file-writer.c:1046
+#: src/data/sys-file-writer.c:1040
 #, c-format
 msgid "An I/O error occurred writing system file \"%s\"."
 msgstr ""
@@ -995,10 +974,6 @@
 msgid "scratch"
 msgstr ""
 
-#: src/data/variable.c:387
-msgid "Expected a space in very long string"
-msgstr ""
-
 #: src/language/command.c:171
 #, c-format
 msgid "%s may be used only in testing mode."
@@ -1082,8 +1057,7 @@
 #: src/language/command.c:792 src/language/data-io/matrix-data.c:535
 #: src/language/data-io/print.c:340 src/language/data-io/print.c:1042
 #: src/language/dictionary/vector.c:199 src/language/lexer/lexer.c:453
-#: src/language/stats/autorecode.c:146 src/language/xforms/select-if.c:61
-#: src/language/xforms/select-if.c:141
+#: src/language/stats/autorecode.c:153 src/language/xforms/select-if.c:61
 msgid "expecting end of command"
 msgstr ""
 
@@ -1226,6 +1200,14 @@
 "names given."
 msgstr ""
 
+#: src/language/data-io/data-list.c:766 src/language/data-io/data-list.c:881
+#: src/language/data-io/print.c:802 src/language/dictionary/split-file.c:83
+#: src/language/dictionary/sys-file-info.c:143
+#: src/language/dictionary/sys-file-info.c:377
+#: src/language/stats/descriptives.c:893
+msgid "Variable"
+msgstr ""
+
 #: src/language/data-io/data-list.c:767 src/language/data-io/print.c:803
 msgid "Record"
 msgstr ""
@@ -1364,21 +1346,21 @@
 msgid "Handle for %s not allowed here."
 msgstr ""
 
-#: src/language/data-io/get.c:112
+#: src/language/data-io/get.c:113
 msgid "expecting COMM or TAPE"
 msgstr ""
 
-#: src/language/data-io/get.c:354 src/language/data-io/get.c:368
-#: src/language/data-io/get.c:393
+#: src/language/data-io/get.c:355 src/language/data-io/get.c:369
+#: src/language/data-io/get.c:394
 #, c-format
 msgid "expecting %s or %s"
 msgstr ""
 
-#: src/language/data-io/get.c:600 src/language/data-io/print.c:184
+#: src/language/data-io/get.c:601 src/language/data-io/print.c:184
 msgid "expecting a valid subcommand"
 msgstr ""
 
-#: src/language/data-io/get.c:633
+#: src/language/data-io/get.c:634
 #, c-format
 msgid ""
 "Cannot rename %s as %s because there already exists a variable named %s.  To "
@@ -1386,75 +1368,75 @@
 "as \"/RENAME (A=B)(B=C)(C=A)\", or equivalently, \"/RENAME (A B C=B C A)\"."
 msgstr ""
 
-#: src/language/data-io/get.c:658
+#: src/language/data-io/get.c:659
 msgid "`=' expected after variable list."
 msgstr ""
 
-#: src/language/data-io/get.c:665
+#: src/language/data-io/get.c:666
 #, 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:678
+#: src/language/data-io/get.c:679
 #, c-format
 msgid "Requested renaming duplicates variable name %s."
 msgstr ""
 
-#: src/language/data-io/get.c:708
+#: src/language/data-io/get.c:709
 msgid "Cannot DROP all variables from dictionary."
 msgstr ""
 
-#: src/language/data-io/get.c:885
+#: src/language/data-io/get.c:886
 msgid "The active file may not be specified more than once."
 msgstr ""
 
-#: src/language/data-io/get.c:893
+#: src/language/data-io/get.c:894
 msgid "Cannot specify the active file since no active file has been defined."
 msgstr ""
 
-#: src/language/data-io/get.c:900
+#: src/language/data-io/get.c:901
 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:936
+#: src/language/data-io/get.c:937
 msgid "Multiple IN subcommands for a single FILE or TABLE."
 msgstr ""
 
-#: src/language/data-io/get.c:956
+#: src/language/data-io/get.c:957
 msgid "BY may appear at most once."
 msgstr ""
 
-#: src/language/data-io/get.c:976
+#: src/language/data-io/get.c:977
 #, c-format
 msgid "File %s lacks BY variable %s."
 msgstr ""
 
-#: src/language/data-io/get.c:990
+#: src/language/data-io/get.c:991
 msgid "FIRST may appear at most once."
 msgstr ""
 
-#: src/language/data-io/get.c:1004
+#: src/language/data-io/get.c:1005
 msgid "LAST may appear at most once."
 msgstr ""
 
-#: src/language/data-io/get.c:1045
+#: src/language/data-io/get.c:1046
 msgid "BY is required when TABLE is specified."
 msgstr ""
 
-#: src/language/data-io/get.c:1050
+#: src/language/data-io/get.c:1051
 msgid "BY is required when IN is specified."
 msgstr ""
 
-#: src/language/data-io/get.c:1078
+#: src/language/data-io/get.c:1079
 #, c-format
 msgid "IN variable name %s duplicates an existing variable name."
 msgstr ""
 
-#: src/language/data-io/get.c:1534
+#: src/language/data-io/get.c:1532
 #, c-format
 msgid ""
 "Variable %s in file %s (%s) has different type or width from the same "
@@ -1478,39 +1460,39 @@
 "REREAD: Column numbers must be positive finite numbers.  Column set to 1."
 msgstr ""
 
-#: src/language/data-io/list.q:151 src/language/stats/descriptives.c:358
+#: src/language/data-io/list.q:152 src/language/stats/descriptives.c:360
 msgid "No variables specified."
 msgstr ""
 
-#: src/language/data-io/list.q:159
+#: src/language/data-io/list.q:160
 #, c-format
 msgid ""
 "The first case (%ld) specified precedes the last case (%ld) specified.  The "
 "values will be swapped."
 msgstr ""
 
-#: src/language/data-io/list.q:167
+#: src/language/data-io/list.q:168
 #, c-format
 msgid ""
 "The first case (%ld) to list is less than 1.  The value is being reset to 1."
 msgstr ""
 
-#: src/language/data-io/list.q:173
+#: src/language/data-io/list.q:174
 #, c-format
 msgid ""
 "The last case (%ld) to list is less than 1.  The value is being reset to 1."
 msgstr ""
 
-#: src/language/data-io/list.q:179
+#: src/language/data-io/list.q:180
 #, c-format
 msgid "The step value %ld is less than 1.  The value is being reset to 1."
 msgstr ""
 
-#: src/language/data-io/list.q:205
+#: src/language/data-io/list.q:206
 msgid "`/FORMAT WEIGHT' specified, but weighting is not on."
 msgstr ""
 
-#: src/language/data-io/list.q:432
+#: src/language/data-io/list.q:434
 msgid "Line"
 msgstr ""
 
@@ -1793,7 +1775,7 @@
 msgstr ""
 
 #: src/language/dictionary/missing-values.c:56
-#: src/language/stats/aggregate.c:438
+#: src/language/stats/aggregate.c:445
 msgid "expecting `('"
 msgstr ""
 
@@ -1932,6 +1914,21 @@
 msgid "Renaming would duplicate variable name %s."
 msgstr ""
 
+#: src/language/dictionary/split-file.c:84
+#: src/language/dictionary/sys-file-info.c:522
+#: src/language/stats/crosstabs.q:1113 src/language/stats/crosstabs.q:1140
+#: src/language/stats/crosstabs.q:1160 src/language/stats/crosstabs.q:1182
+#: src/language/stats/examine.q:1149 src/language/stats/frequencies.q:1149
+#: src/language/stats/frequencies.q:1270
+msgid "Value"
+msgstr ""
+
+#: src/language/dictionary/split-file.c:85
+#: src/language/dictionary/sys-file-info.c:384
+#: src/language/dictionary/sys-file-info.c:523 src/ui/gui/var-sheet.c:71
+msgid "Label"
+msgstr ""
+
 #: src/language/dictionary/sys-file-info.c:104
 msgid "File:"
 msgstr ""
@@ -2215,7 +2212,7 @@
 msgid "Unknown identifier %s."
 msgstr ""
 
-#: src/language/expressions/parse.c:845 src/language/stats/aggregate.c:494
+#: src/language/expressions/parse.c:845 src/language/stats/aggregate.c:501
 msgid "expecting `)'"
 msgstr ""
 
@@ -2535,582 +2532,582 @@
 msgid "Reading `%s': %s."
 msgstr ""
 
-#: src/language/stats/aggregate.c:204
+#: src/language/stats/aggregate.c:211
 msgid "while expecting COLUMNWISE"
 msgstr ""
 
-#: src/language/stats/aggregate.c:233
+#: src/language/stats/aggregate.c:240
 msgid "expecting BREAK"
 msgstr ""
 
-#: src/language/stats/aggregate.c:238
+#: src/language/stats/aggregate.c:245
 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:407
+#: src/language/stats/aggregate.c:414
 msgid "expecting aggregation function"
 msgstr ""
 
-#: src/language/stats/aggregate.c:423
+#: src/language/stats/aggregate.c:430
 #, c-format
 msgid "Unknown aggregation function %s."
 msgstr ""
 
-#: src/language/stats/aggregate.c:475
+#: src/language/stats/aggregate.c:482
 #, c-format
 msgid "Missing argument %d to %s."
 msgstr ""
 
-#: src/language/stats/aggregate.c:484
+#: src/language/stats/aggregate.c:491
 #, c-format
 msgid "Arguments to %s must be of same type as source variables."
 msgstr ""
 
-#: src/language/stats/aggregate.c:506
+#: src/language/stats/aggregate.c:513
 #, c-format
 msgid ""
 "Number of source variables (%u) does not match number of target variables (%"
 "u)."
 msgstr ""
 
-#: src/language/stats/aggregate.c:522
+#: src/language/stats/aggregate.c:529
 #, 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:589
+#: src/language/stats/aggregate.c:596
 #, 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:128
+#: 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:156
+#: src/language/stats/autorecode.c:163
 #, c-format
 msgid "Target variable %s duplicates existing variable %s."
 msgstr ""
 
-#: src/language/stats/autorecode.c:163
+#: src/language/stats/autorecode.c:170
 #, c-format
 msgid "Duplicate variable name %s among target variables."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:267
+#: src/language/stats/crosstabs.q:268
 msgid ""
 "Missing mode REPORT not allowed in general mode.  Assuming MISSING=TABLE."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:277
+#: src/language/stats/crosstabs.q:278
 msgid "Write mode ALL not allowed in general mode.  Assuming WRITE=CELLS."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:333
+#: src/language/stats/crosstabs.q:334
 msgid "Too many crosstabulation variables or dimensions."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:343
+#: src/language/stats/crosstabs.q:344
 msgid "expecting BY"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:410
+#: src/language/stats/crosstabs.q:411
 msgid "VARIABLES must be specified before TABLES."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:447
+#: src/language/stats/crosstabs.q:448
 #, c-format
 msgid "Maximum value (%ld) less than minimum value (%ld)."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:812
+#: src/language/stats/crosstabs.q:814
 msgid "Summary."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:814 src/language/stats/examine.q:928
+#: src/language/stats/crosstabs.q:816 src/language/stats/examine.q:934
 msgid "Cases"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:815 src/language/stats/examine.q:862
-#: src/language/stats/frequencies.q:1144 src/language/stats/frequencies.q:1517
+#: src/language/stats/crosstabs.q:817 src/language/stats/examine.q:868
+#: src/language/stats/frequencies.q:1147 src/language/stats/frequencies.q:1520
 msgid "Valid"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:816 src/language/stats/examine.q:863
-#: src/language/stats/frequencies.q:1212 src/language/stats/frequencies.q:1518
+#: src/language/stats/crosstabs.q:818 src/language/stats/examine.q:869
+#: src/language/stats/frequencies.q:1215 src/language/stats/frequencies.q:1521
 #: src/ui/gui/var-sheet.c:73
 msgid "Missing"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:817 src/language/stats/crosstabs.q:1020
-#: src/language/stats/crosstabs.q:1740 src/language/stats/examine.q:864
-#: src/language/stats/frequencies.q:1221 src/language/stats/oneway.q:315
-#: src/language/stats/oneway.q:479 src/language/stats/regression.q:312
+#: src/language/stats/crosstabs.q:819 src/language/stats/crosstabs.q:1022
+#: src/language/stats/crosstabs.q:1742 src/language/stats/examine.q:870
+#: src/language/stats/frequencies.q:1224 src/language/stats/oneway.q:317
+#: src/language/stats/oneway.q:481 src/language/stats/regression.q:314
 msgid "Total"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:827 src/language/stats/examine.q:940
-#: src/language/stats/frequencies.q:1516 src/language/stats/oneway.q:401
-#: src/language/stats/t-test.q:685 src/language/stats/t-test.q:708
-#: src/language/stats/t-test.q:833 src/language/stats/t-test.q:1368
+#: src/language/stats/crosstabs.q:829 src/language/stats/examine.q:946
+#: src/language/stats/frequencies.q:1519 src/language/stats/oneway.q:403
+#: src/language/stats/t-test.q:687 src/language/stats/t-test.q:710
+#: src/language/stats/t-test.q:835 src/language/stats/t-test.q:1370
 msgid "N"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:828 src/language/stats/examine.q:943
-#: src/language/stats/frequencies.q:1148 src/language/stats/frequencies.q:1149
-#: src/language/stats/frequencies.q:1150
+#: src/language/stats/crosstabs.q:830 src/language/stats/examine.q:949
+#: src/language/stats/frequencies.q:1151 src/language/stats/frequencies.q:1152
+#: src/language/stats/frequencies.q:1153
 msgid "Percent"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1070
+#: src/language/stats/crosstabs.q:1072
 msgid "count"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1071
+#: src/language/stats/crosstabs.q:1073
 msgid "row %"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1072
+#: src/language/stats/crosstabs.q:1074
 msgid "column %"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1073
+#: src/language/stats/crosstabs.q:1075
 msgid "total %"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1074
+#: src/language/stats/crosstabs.q:1076
 msgid "expected"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1075
+#: src/language/stats/crosstabs.q:1077
 msgid "residual"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1076
+#: src/language/stats/crosstabs.q:1078
 msgid "std. resid."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1077
+#: src/language/stats/crosstabs.q:1079
 msgid "adj. resid."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1107
+#: src/language/stats/crosstabs.q:1109
 msgid "Chi-square tests."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1110 src/language/stats/crosstabs.q:1137
-#: src/language/stats/crosstabs.q:1157 src/language/stats/crosstabs.q:1178
-#: src/language/stats/examine.q:1374
+#: src/language/stats/crosstabs.q:1112 src/language/stats/crosstabs.q:1139
+#: src/language/stats/crosstabs.q:1159 src/language/stats/crosstabs.q:1180
+#: src/language/stats/examine.q:1380
 msgid "Statistic"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1112 src/language/stats/oneway.q:288
-#: src/language/stats/oneway.q:691 src/language/stats/regression.q:305
-#: src/language/stats/t-test.q:983 src/language/stats/t-test.q:1175
-#: src/language/stats/t-test.q:1267
+#: src/language/stats/crosstabs.q:1114 src/language/stats/oneway.q:290
+#: src/language/stats/oneway.q:693 src/language/stats/regression.q:307
+#: src/language/stats/t-test.q:985 src/language/stats/t-test.q:1177
+#: src/language/stats/t-test.q:1269
 msgid "df"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1114
+#: src/language/stats/crosstabs.q:1116
 msgid "Asymp. Sig. (2-sided)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1116
+#: src/language/stats/crosstabs.q:1118
 msgid "Exact. Sig. (2-sided)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1118
+#: src/language/stats/crosstabs.q:1120
 msgid "Exact. Sig. (1-sided)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1133
+#: src/language/stats/crosstabs.q:1135
 msgid "Symmetric measures."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1136 src/language/stats/crosstabs.q:1177
+#: src/language/stats/crosstabs.q:1138 src/language/stats/crosstabs.q:1179
 msgid "Category"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1139 src/language/stats/crosstabs.q:1181
+#: src/language/stats/crosstabs.q:1141 src/language/stats/crosstabs.q:1183
 msgid "Asymp. Std. Error"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1140 src/language/stats/crosstabs.q:1182
+#: src/language/stats/crosstabs.q:1142 src/language/stats/crosstabs.q:1184
 msgid "Approx. T"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1141 src/language/stats/crosstabs.q:1183
+#: src/language/stats/crosstabs.q:1143 src/language/stats/crosstabs.q:1185
 msgid "Approx. Sig."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1152
+#: src/language/stats/crosstabs.q:1154
 msgid "Risk estimate."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1156
+#: src/language/stats/crosstabs.q:1158
 #, c-format
 msgid "95%% Confidence Interval"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1159 src/language/stats/t-test.q:987
-#: src/language/stats/t-test.q:1172 src/language/stats/t-test.q:1270
+#: src/language/stats/crosstabs.q:1161 src/language/stats/t-test.q:989
+#: src/language/stats/t-test.q:1174 src/language/stats/t-test.q:1272
 msgid "Lower"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1160 src/language/stats/t-test.q:988
-#: src/language/stats/t-test.q:1173 src/language/stats/t-test.q:1271
+#: src/language/stats/crosstabs.q:1162 src/language/stats/t-test.q:990
+#: src/language/stats/t-test.q:1175 src/language/stats/t-test.q:1273
 msgid "Upper"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1174
+#: src/language/stats/crosstabs.q:1176
 msgid "Directional measures."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1179 src/ui/gui/var-sheet.c:68
+#: src/language/stats/crosstabs.q:1181 src/ui/gui/var-sheet.c:68
 msgid "Type"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1935
+#: src/language/stats/crosstabs.q:1937
 msgid "Pearson Chi-Square"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1936
+#: src/language/stats/crosstabs.q:1938
 msgid "Likelihood Ratio"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1937
+#: src/language/stats/crosstabs.q:1939
 msgid "Fisher's Exact Test"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1938
+#: src/language/stats/crosstabs.q:1940
 msgid "Continuity Correction"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1939
+#: src/language/stats/crosstabs.q:1941
 msgid "Linear-by-Linear Association"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1976 src/language/stats/crosstabs.q:2046
-#: src/language/stats/crosstabs.q:2105
+#: src/language/stats/crosstabs.q:1978 src/language/stats/crosstabs.q:2048
+#: src/language/stats/crosstabs.q:2107
 msgid "N of Valid Cases"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1992 src/language/stats/crosstabs.q:2121
+#: src/language/stats/crosstabs.q:1994 src/language/stats/crosstabs.q:2123
 msgid "Nominal by Nominal"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1993 src/language/stats/crosstabs.q:2122
+#: src/language/stats/crosstabs.q:1995 src/language/stats/crosstabs.q:2124
 msgid "Ordinal by Ordinal"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1994
+#: src/language/stats/crosstabs.q:1996
 msgid "Interval by Interval"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1995
+#: src/language/stats/crosstabs.q:1997
 msgid "Measure of Agreement"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2000
+#: src/language/stats/crosstabs.q:2002
 msgid "Phi"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2001
+#: src/language/stats/crosstabs.q:2003
 msgid "Cramer's V"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2002
+#: src/language/stats/crosstabs.q:2004
 msgid "Contingency Coefficient"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2003
+#: src/language/stats/crosstabs.q:2005
 msgid "Kendall's tau-b"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2004
+#: src/language/stats/crosstabs.q:2006
 msgid "Kendall's tau-c"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2005
+#: src/language/stats/crosstabs.q:2007
 msgid "Gamma"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2006
+#: src/language/stats/crosstabs.q:2008
 msgid "Spearman Correlation"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2007
+#: src/language/stats/crosstabs.q:2009
 msgid "Pearson's R"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2008
+#: src/language/stats/crosstabs.q:2010
 msgid "Kappa"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2078
+#: src/language/stats/crosstabs.q:2080
 #, c-format
 msgid "Odds Ratio for %s (%g / %g)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2081
+#: src/language/stats/crosstabs.q:2083
 #, c-format
 msgid "Odds Ratio for %s (%.*s / %.*s)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2089
+#: src/language/stats/crosstabs.q:2091
 #, c-format
 msgid "For cohort %s = %g"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2092
+#: src/language/stats/crosstabs.q:2094
 #, c-format
 msgid "For cohort %s = %.*s"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2123
+#: src/language/stats/crosstabs.q:2125
 msgid "Nominal by Interval"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2128
+#: src/language/stats/crosstabs.q:2130
 msgid "Lambda"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2129
+#: src/language/stats/crosstabs.q:2131
 msgid "Goodman and Kruskal tau"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2130
+#: src/language/stats/crosstabs.q:2132
 msgid "Uncertainty Coefficient"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2131
+#: src/language/stats/crosstabs.q:2133
 msgid "Somers' d"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2132
+#: src/language/stats/crosstabs.q:2134
 msgid "Eta"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2137
+#: src/language/stats/crosstabs.q:2139
 msgid "Symmetric"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2138 src/language/stats/crosstabs.q:2139
+#: src/language/stats/crosstabs.q:2140 src/language/stats/crosstabs.q:2141
 #, c-format
 msgid "%s Dependent"
 msgstr ""
 
-#: src/language/stats/descriptives.c:105 src/language/stats/examine.q:1479
-#: src/language/stats/frequencies.q:120 src/language/stats/oneway.q:402
-#: src/language/stats/t-test.q:686 src/language/stats/t-test.q:709
-#: src/language/stats/t-test.q:832 src/language/stats/t-test.q:1169
+#: src/language/stats/descriptives.c:106 src/language/stats/examine.q:1485
+#: src/language/stats/frequencies.q:121 src/language/stats/oneway.q:404
+#: src/language/stats/t-test.q:688 src/language/stats/t-test.q:711
+#: src/language/stats/t-test.q:834 src/language/stats/t-test.q:1171
 msgid "Mean"
 msgstr ""
 
-#: src/language/stats/descriptives.c:106
+#: src/language/stats/descriptives.c:107
 msgid "S E Mean"
 msgstr ""
 
-#: src/language/stats/descriptives.c:107 src/language/stats/frequencies.q:124
+#: src/language/stats/descriptives.c:108 src/language/stats/frequencies.q:125
 msgid "Std Dev"
 msgstr ""
 
-#: src/language/stats/descriptives.c:108 src/language/stats/examine.q:1559
-#: src/language/stats/frequencies.q:125
+#: src/language/stats/descriptives.c:109 src/language/stats/examine.q:1565
+#: src/language/stats/frequencies.q:126
 msgid "Variance"
 msgstr ""
 
-#: src/language/stats/descriptives.c:109 src/language/stats/examine.q:1666
-#: src/language/stats/frequencies.q:126
+#: src/language/stats/descriptives.c:110 src/language/stats/examine.q:1672
+#: src/language/stats/frequencies.q:127
 msgid "Kurtosis"
 msgstr ""
 
-#: src/language/stats/descriptives.c:110
+#: src/language/stats/descriptives.c:111
 msgid "S E Kurt"
 msgstr ""
 
-#: src/language/stats/descriptives.c:111 src/language/stats/examine.q:1646
-#: src/language/stats/frequencies.q:128
+#: src/language/stats/descriptives.c:112 src/language/stats/examine.q:1652
+#: src/language/stats/frequencies.q:129
 msgid "Skewness"
 msgstr ""
 
-#: src/language/stats/descriptives.c:112
+#: src/language/stats/descriptives.c:113
 msgid "S E Skew"
 msgstr ""
 
-#: src/language/stats/descriptives.c:113 src/language/stats/examine.q:1607
-#: src/language/stats/frequencies.q:130
+#: src/language/stats/descriptives.c:114 src/language/stats/examine.q:1613
+#: src/language/stats/frequencies.q:131
 msgid "Range"
 msgstr ""
 
-#: src/language/stats/descriptives.c:114 src/language/stats/examine.q:1584
-#: src/language/stats/frequencies.q:131 src/language/stats/oneway.q:414
+#: src/language/stats/descriptives.c:115 src/language/stats/examine.q:1590
+#: src/language/stats/frequencies.q:132 src/language/stats/oneway.q:416
 msgid "Minimum"
 msgstr ""
 
-#: src/language/stats/descriptives.c:115 src/language/stats/examine.q:1595
-#: src/language/stats/frequencies.q:132 src/language/stats/oneway.q:415
+#: src/language/stats/descriptives.c:116 src/language/stats/examine.q:1601
+#: src/language/stats/frequencies.q:133 src/language/stats/oneway.q:417
 msgid "Maximum"
 msgstr ""
 
-#: src/language/stats/descriptives.c:116 src/language/stats/frequencies.q:133
+#: src/language/stats/descriptives.c:117 src/language/stats/frequencies.q:134
 msgid "Sum"
 msgstr ""
 
-#: src/language/stats/descriptives.c:340
+#: src/language/stats/descriptives.c:342
 #, c-format
 msgid "Z-score variable name %s would be a duplicate variable name."
 msgstr ""
 
-#: src/language/stats/descriptives.c:442
+#: src/language/stats/descriptives.c:444
 msgid "expecting statistic name: reverting to default"
 msgstr ""
 
-#: src/language/stats/descriptives.c:514
+#: src/language/stats/descriptives.c:516
 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:545
+#: src/language/stats/descriptives.c:547
 msgid "Mapping of variables to corresponding Z-scores."
 msgstr ""
 
-#: src/language/stats/descriptives.c:550
+#: src/language/stats/descriptives.c:552
 msgid "Source"
 msgstr ""
 
-#: src/language/stats/descriptives.c:551
+#: src/language/stats/descriptives.c:553
 msgid "Target"
 msgstr ""
 
-#: src/language/stats/descriptives.c:669 src/language/stats/descriptives.c:675
+#: src/language/stats/descriptives.c:671 src/language/stats/descriptives.c:677
 msgid "Z-score of "
 msgstr ""
 
-#: src/language/stats/descriptives.c:891
+#: src/language/stats/descriptives.c:896
 msgid "Valid N"
 msgstr ""
 
-#: src/language/stats/descriptives.c:892
+#: src/language/stats/descriptives.c:897
 msgid "Missing N"
 msgstr ""
 
-#: src/language/stats/descriptives.c:919
+#: src/language/stats/descriptives.c:924
 #, c-format
 msgid "Valid cases = %g; cases with missing value(s) = %g."
 msgstr ""
 
-#: src/language/stats/examine.q:483 src/language/stats/examine.q:495
+#: src/language/stats/examine.q:485 src/language/stats/examine.q:497
 #, c-format
 msgid "%s and %s are mutually exclusive"
 msgstr ""
 
-#: src/language/stats/examine.q:922
+#: src/language/stats/examine.q:928
 msgid "Case Processing Summary"
 msgstr ""
 
-#: src/language/stats/examine.q:1128
+#: src/language/stats/examine.q:1134
 msgid "Extreme Values"
 msgstr ""
 
-#: src/language/stats/examine.q:1144
+#: src/language/stats/examine.q:1150
 msgid "Case Number"
 msgstr ""
 
-#: src/language/stats/examine.q:1229
+#: src/language/stats/examine.q:1235
 msgid "Highest"
 msgstr ""
 
-#: src/language/stats/examine.q:1234
+#: src/language/stats/examine.q:1240
 msgid "Lowest"
 msgstr ""
 
-#: src/language/stats/examine.q:1375 src/language/stats/oneway.q:404
-#: src/language/stats/oneway.q:689 src/language/stats/regression.q:209
+#: src/language/stats/examine.q:1381 src/language/stats/oneway.q:406
+#: src/language/stats/oneway.q:691 src/language/stats/regression.q:211
 msgid "Std. Error"
 msgstr ""
 
-#: src/language/stats/examine.q:1377 src/language/stats/oneway.q:418
+#: src/language/stats/examine.q:1383 src/language/stats/oneway.q:420
 msgid "Descriptives"
 msgstr ""
 
-#: src/language/stats/examine.q:1497 src/language/stats/oneway.q:409
+#: src/language/stats/examine.q:1503 src/language/stats/oneway.q:411
 #, c-format
 msgid "%g%% Confidence Interval for Mean"
 msgstr ""
 
-#: src/language/stats/examine.q:1503 src/language/stats/oneway.q:411
+#: src/language/stats/examine.q:1509 src/language/stats/oneway.q:413
 msgid "Lower Bound"
 msgstr ""
 
-#: src/language/stats/examine.q:1514 src/language/stats/oneway.q:412
+#: src/language/stats/examine.q:1520 src/language/stats/oneway.q:414
 msgid "Upper Bound"
 msgstr ""
 
-#: src/language/stats/examine.q:1526
+#: src/language/stats/examine.q:1532
 #, c-format
 msgid "5%% Trimmed Mean"
 msgstr ""
 
-#: src/language/stats/examine.q:1537 src/language/stats/frequencies.q:122
+#: src/language/stats/examine.q:1543 src/language/stats/frequencies.q:123
 msgid "Median"
 msgstr ""
 
-#: src/language/stats/examine.q:1571 src/language/stats/oneway.q:403
-#: src/language/stats/t-test.q:687 src/language/stats/t-test.q:710
-#: src/language/stats/t-test.q:834 src/language/stats/t-test.q:1170
+#: src/language/stats/examine.q:1577 src/language/stats/oneway.q:405
+#: src/language/stats/t-test.q:689 src/language/stats/t-test.q:712
+#: src/language/stats/t-test.q:836 src/language/stats/t-test.q:1172
 msgid "Std. Deviation"
 msgstr ""
 
-#: src/language/stats/examine.q:1619
+#: src/language/stats/examine.q:1625
 msgid "Interquartile Range"
 msgstr ""
 
-#: src/language/stats/examine.q:1771
+#: src/language/stats/examine.q:1777
 #, c-format
 msgid "Boxplot of %s vs. %s"
 msgstr ""
 
-#: src/language/stats/examine.q:1796
+#: src/language/stats/examine.q:1802
 msgid "Boxplot"
 msgstr ""
 
-#: src/language/stats/examine.q:1838
+#: src/language/stats/examine.q:1844
 #, c-format
 msgid "Normal Q-Q Plot of %s"
 msgstr ""
 
-#: src/language/stats/examine.q:1839 src/language/stats/examine.q:1845
+#: src/language/stats/examine.q:1845 src/language/stats/examine.q:1851
 msgid "Observed Value"
 msgstr ""
 
-#: src/language/stats/examine.q:1840
+#: src/language/stats/examine.q:1846
 msgid "Expected Normal"
 msgstr ""
 
-#: src/language/stats/examine.q:1843
+#: src/language/stats/examine.q:1849
 #, c-format
 msgid "Detrended Normal Q-Q Plot of %s"
 msgstr ""
 
-#: src/language/stats/examine.q:1846
+#: src/language/stats/examine.q:1852
 msgid "Dev from Normal"
 msgstr ""
 
-#: src/language/stats/examine.q:1965 src/language/stats/examine.q:1987
-#: src/language/stats/frequencies.q:1528
+#: src/language/stats/examine.q:1971 src/language/stats/examine.q:1993
+#: src/language/stats/frequencies.q:1531
 msgid "Percentiles"
 msgstr ""
 
-#: src/language/stats/examine.q:2112
+#: src/language/stats/examine.q:2118
 msgid "Tukey's Hinges"
 msgstr ""
 
@@ -3175,87 +3172,87 @@
 msgid "Unexpected end of file reading FLIP temporary file."
 msgstr ""
 
-#: src/language/stats/frequencies.q:121
+#: src/language/stats/frequencies.q:122
 msgid "S.E. Mean"
 msgstr ""
 
-#: src/language/stats/frequencies.q:123
+#: src/language/stats/frequencies.q:124
 msgid "Mode"
 msgstr ""
 
-#: src/language/stats/frequencies.q:127
+#: src/language/stats/frequencies.q:128
 msgid "S.E. Kurt"
 msgstr ""
 
-#: src/language/stats/frequencies.q:129
+#: src/language/stats/frequencies.q:130
 msgid "S.E. Skew"
 msgstr ""
 
-#: src/language/stats/frequencies.q:405
+#: src/language/stats/frequencies.q:406
 msgid ""
 "At most one of BARCHART, HISTOGRAM, or HBAR should be given.  HBAR will be "
 "assumed.  Argument values will be given precedence increasing along the "
 "order given."
 msgstr ""
 
-#: src/language/stats/frequencies.q:488
+#: src/language/stats/frequencies.q:489
 #, c-format
 msgid ""
 "MAX must be greater than or equal to MIN, if both are specified.  However, "
 "MIN was specified as %g and MAX as %g.  MIN and MAX will be ignored."
 msgstr ""
 
-#: src/language/stats/frequencies.q:811
+#: src/language/stats/frequencies.q:814
 msgid ""
 "Upper limit of integer mode value range must be greater than lower limit."
 msgstr ""
 
-#: src/language/stats/frequencies.q:824
+#: src/language/stats/frequencies.q:827
 #, c-format
 msgid "Variable %s specified multiple times on VARIABLES subcommand."
 msgstr ""
 
-#: src/language/stats/frequencies.q:830
+#: src/language/stats/frequencies.q:833
 #, c-format
 msgid "Integer mode specified, but %s is not a numeric variable."
 msgstr ""
 
-#: src/language/stats/frequencies.q:896
+#: src/language/stats/frequencies.q:899
 msgid "`)' expected after GROUPED interval list."
 msgstr ""
 
-#: src/language/stats/frequencies.q:908
+#: src/language/stats/frequencies.q:911
 #, c-format
 msgid "Variables %s specified on GROUPED but not on VARIABLES."
 msgstr ""
 
-#: src/language/stats/frequencies.q:915
+#: src/language/stats/frequencies.q:918
 #, c-format
 msgid "Variables %s specified multiple times on GROUPED subcommand."
 msgstr ""
 
-#: src/language/stats/frequencies.q:1145 src/language/stats/frequencies.q:1237
-#: src/language/stats/frequencies.q:1238 src/language/stats/frequencies.q:1270
+#: src/language/stats/frequencies.q:1148 src/language/stats/frequencies.q:1240
+#: src/language/stats/frequencies.q:1241 src/language/stats/frequencies.q:1273
 msgid "Cum"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1147 src/output/charts/plot-hist.c:129
+#: src/language/stats/frequencies.q:1150 src/output/charts/plot-hist.c:129
 msgid "Frequency"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1167
+#: src/language/stats/frequencies.q:1170
 msgid "Value Label"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1268
+#: src/language/stats/frequencies.q:1271
 msgid "Freq"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1269 src/language/stats/frequencies.q:1271
+#: src/language/stats/frequencies.q:1272 src/language/stats/frequencies.q:1274
 msgid "Pct"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1490
+#: src/language/stats/frequencies.q:1493
 #, c-format
 msgid "No valid data for variable %s; statistics not displayed."
 msgstr ""
@@ -3268,98 +3265,98 @@
 msgid "TABLES subcommand may not appear more than once."
 msgstr ""
 
-#: src/language/stats/oneway.q:178
+#: src/language/stats/oneway.q:180
 msgid "Number of contrast coefficients must equal the number of groups"
 msgstr ""
 
-#: src/language/stats/oneway.q:187
+#: src/language/stats/oneway.q:189
 #, c-format
 msgid "Coefficients for contrast %d do not total zero"
 msgstr ""
 
-#: src/language/stats/oneway.q:252
+#: src/language/stats/oneway.q:254
 #, c-format
 msgid "`%s' is not a variable name"
 msgstr ""
 
-#: src/language/stats/oneway.q:287 src/language/stats/regression.q:304
+#: src/language/stats/oneway.q:289 src/language/stats/regression.q:306
 msgid "Sum of Squares"
 msgstr ""
 
-#: src/language/stats/oneway.q:289 src/language/stats/regression.q:306
+#: src/language/stats/oneway.q:291 src/language/stats/regression.q:308
 msgid "Mean Square"
 msgstr ""
 
-#: src/language/stats/oneway.q:290 src/language/stats/regression.q:307
-#: src/language/stats/t-test.q:980
+#: src/language/stats/oneway.q:292 src/language/stats/regression.q:309
+#: src/language/stats/t-test.q:982
 msgid "F"
 msgstr ""
 
-#: src/language/stats/oneway.q:291 src/language/stats/oneway.q:545
-#: src/language/stats/regression.q:212 src/language/stats/regression.q:308
+#: src/language/stats/oneway.q:293 src/language/stats/oneway.q:547
+#: src/language/stats/regression.q:214 src/language/stats/regression.q:310
 msgid "Significance"
 msgstr ""
 
-#: src/language/stats/oneway.q:313
+#: src/language/stats/oneway.q:315
 msgid "Between Groups"
 msgstr ""
 
-#: src/language/stats/oneway.q:314
+#: src/language/stats/oneway.q:316
 msgid "Within Groups"
 msgstr ""
 
-#: src/language/stats/oneway.q:361 src/language/stats/regression.q:334
+#: src/language/stats/oneway.q:363 src/language/stats/regression.q:336
 msgid "ANOVA"
 msgstr ""
 
-#: src/language/stats/oneway.q:542
+#: src/language/stats/oneway.q:544
 msgid "Levene Statistic"
 msgstr ""
 
-#: src/language/stats/oneway.q:543
+#: src/language/stats/oneway.q:545
 msgid "df1"
 msgstr ""
 
-#: src/language/stats/oneway.q:544
+#: src/language/stats/oneway.q:546
 msgid "df2"
 msgstr ""
 
-#: src/language/stats/oneway.q:548
+#: src/language/stats/oneway.q:550
 msgid "Test of Homogeneity of Variances"
 msgstr ""
 
-#: src/language/stats/oneway.q:618
+#: src/language/stats/oneway.q:620
 msgid "Contrast Coefficients"
 msgstr ""
 
-#: src/language/stats/oneway.q:620 src/language/stats/oneway.q:687
+#: src/language/stats/oneway.q:622 src/language/stats/oneway.q:689
 msgid "Contrast"
 msgstr ""
 
-#: src/language/stats/oneway.q:685
+#: src/language/stats/oneway.q:687
 msgid "Contrast Tests"
 msgstr ""
 
-#: src/language/stats/oneway.q:688
+#: src/language/stats/oneway.q:690
 msgid "Value of Contrast"
 msgstr ""
 
-#: src/language/stats/oneway.q:690 src/language/stats/regression.q:211
-#: src/language/stats/t-test.q:982 src/language/stats/t-test.q:1174
-#: src/language/stats/t-test.q:1266
+#: src/language/stats/oneway.q:692 src/language/stats/regression.q:213
+#: src/language/stats/t-test.q:984 src/language/stats/t-test.q:1176
+#: src/language/stats/t-test.q:1268
 msgid "t"
 msgstr ""
 
-#: src/language/stats/oneway.q:692 src/language/stats/t-test.q:984
-#: src/language/stats/t-test.q:1176 src/language/stats/t-test.q:1268
+#: src/language/stats/oneway.q:694 src/language/stats/t-test.q:986
+#: src/language/stats/t-test.q:1178 src/language/stats/t-test.q:1270
 msgid "Sig. (2-tailed)"
 msgstr ""
 
-#: src/language/stats/oneway.q:736
+#: src/language/stats/oneway.q:738
 msgid "Assume equal variances"
 msgstr ""
 
-#: src/language/stats/oneway.q:740
+#: src/language/stats/oneway.q:742
 msgid "Does not assume equal"
 msgstr ""
 
@@ -3372,63 +3369,63 @@
 msgid "Too many variables in INTO clause."
 msgstr ""
 
-#: src/language/stats/regression.q:163
+#: src/language/stats/regression.q:165
 msgid "R"
 msgstr ""
 
-#: src/language/stats/regression.q:164
+#: src/language/stats/regression.q:166
 msgid "R Square"
 msgstr ""
 
-#: src/language/stats/regression.q:165
+#: src/language/stats/regression.q:167
 msgid "Adjusted R Square"
 msgstr ""
 
-#: src/language/stats/regression.q:166
+#: src/language/stats/regression.q:168
 msgid "Std. Error of the Estimate"
 msgstr ""
 
-#: src/language/stats/regression.q:171
+#: src/language/stats/regression.q:173
 msgid "Model Summary"
 msgstr ""
 
-#: src/language/stats/regression.q:208
+#: src/language/stats/regression.q:210
 msgid "B"
 msgstr ""
 
-#: src/language/stats/regression.q:210
+#: src/language/stats/regression.q:212
 msgid "Beta"
 msgstr ""
 
-#: src/language/stats/regression.q:213
+#: src/language/stats/regression.q:215
 msgid "(Constant)"
 msgstr ""
 
-#: src/language/stats/regression.q:273
+#: src/language/stats/regression.q:275
 msgid "Coefficients"
 msgstr ""
 
-#: src/language/stats/regression.q:310
+#: src/language/stats/regression.q:312
 msgid "Regression"
 msgstr ""
 
-#: src/language/stats/regression.q:311
+#: src/language/stats/regression.q:313
 msgid "Residual"
 msgstr ""
 
-#: src/language/stats/regression.q:389
+#: src/language/stats/regression.q:391
 msgid "Model"
 msgstr ""
 
-#: src/language/stats/regression.q:390
+#: src/language/stats/regression.q:392
 msgid "Covariances"
 msgstr ""
 
-#: src/language/stats/regression.q:405
+#: src/language/stats/regression.q:407
 msgid "Coefficient Correlations"
 msgstr ""
 
-#: src/language/stats/regression.q:1108
+#: src/language/stats/regression.q:1114
 msgid "Dependent variable must be numeric."
 msgstr ""
 
@@ -3444,130 +3441,130 @@
 msgid "`)' expected."
 msgstr ""
 
-#: src/language/stats/t-test.q:275
+#: src/language/stats/t-test.q:277
 msgid "TESTVAL, GROUPS and PAIRS subcommands are mutually exclusive."
 msgstr ""
 
-#: src/language/stats/t-test.q:293
+#: src/language/stats/t-test.q:295
 msgid "VARIABLES subcommand is not appropriate with PAIRS"
 msgstr ""
 
-#: src/language/stats/t-test.q:331
+#: src/language/stats/t-test.q:333
 msgid "One or more VARIABLES must be specified."
 msgstr ""
 
-#: src/language/stats/t-test.q:382
+#: src/language/stats/t-test.q:384
 #, c-format
 msgid "Long string variable %s is not valid here."
 msgstr ""
 
-#: src/language/stats/t-test.q:402 src/language/stats/t-test.q:417
+#: src/language/stats/t-test.q:404 src/language/stats/t-test.q:419
 msgid ""
 "When applying GROUPS to a string variable, two values must be specified."
 msgstr ""
 
-#: src/language/stats/t-test.q:489
+#: src/language/stats/t-test.q:491
 #, c-format
 msgid ""
 "PAIRED was specified but the number of variables preceding WITH (%d) did not "
 "match the number following (%d)."
 msgstr ""
 
-#: src/language/stats/t-test.q:506
+#: src/language/stats/t-test.q:508
 msgid "At least two variables must be specified on PAIRS."
 msgstr ""
 
-#: src/language/stats/t-test.q:683
+#: src/language/stats/t-test.q:685
 msgid "One-Sample Statistics"
 msgstr ""
 
-#: src/language/stats/t-test.q:688 src/language/stats/t-test.q:711
-#: src/language/stats/t-test.q:835
+#: src/language/stats/t-test.q:690 src/language/stats/t-test.q:713
+#: src/language/stats/t-test.q:837
 msgid "SE. Mean"
 msgstr ""
 
-#: src/language/stats/t-test.q:706
+#: src/language/stats/t-test.q:708
 msgid "Group Statistics"
 msgstr ""
 
-#: src/language/stats/t-test.q:829
+#: src/language/stats/t-test.q:831
 msgid "Paired Sample Statistics"
 msgstr ""
 
-#: src/language/stats/t-test.q:851 src/language/stats/t-test.q:1195
-#: src/language/stats/t-test.q:1385
+#: src/language/stats/t-test.q:853 src/language/stats/t-test.q:1197
+#: src/language/stats/t-test.q:1387
 #, c-format
 msgid "Pair %d"
 msgstr ""
 
-#: src/language/stats/t-test.q:968
+#: src/language/stats/t-test.q:970
 msgid "Independent Samples Test"
 msgstr ""
 
-#: src/language/stats/t-test.q:976
+#: src/language/stats/t-test.q:978
 msgid "Levene's Test for Equality of Variances"
 msgstr ""
 
-#: src/language/stats/t-test.q:978
+#: src/language/stats/t-test.q:980
 msgid "t-test for Equality of Means"
 msgstr ""
 
-#: src/language/stats/t-test.q:981 src/language/stats/t-test.q:1370
+#: src/language/stats/t-test.q:983 src/language/stats/t-test.q:1372
 msgid "Sig."
 msgstr ""
 
-#: src/language/stats/t-test.q:985 src/language/stats/t-test.q:1269
+#: src/language/stats/t-test.q:987 src/language/stats/t-test.q:1271
 msgid "Mean Difference"
 msgstr ""
 
-#: src/language/stats/t-test.q:986
+#: src/language/stats/t-test.q:988
 msgid "Std. Error Difference"
 msgstr ""
 
-#: src/language/stats/t-test.q:991 src/language/stats/t-test.q:1166
-#: src/language/stats/t-test.q:1261
+#: src/language/stats/t-test.q:993 src/language/stats/t-test.q:1168
+#: src/language/stats/t-test.q:1263
 #, c-format
 msgid "%g%% Confidence Interval of the Difference"
 msgstr ""
 
-#: src/language/stats/t-test.q:1046
+#: src/language/stats/t-test.q:1048
 msgid "Equal variances assumed"
 msgstr ""
 
-#: src/language/stats/t-test.q:1098
+#: src/language/stats/t-test.q:1100
 msgid "Equal variances not assumed"
 msgstr ""
 
-#: src/language/stats/t-test.q:1156
+#: src/language/stats/t-test.q:1158
 msgid "Paired Samples Test"
 msgstr ""
 
-#: src/language/stats/t-test.q:1159
+#: src/language/stats/t-test.q:1161
 msgid "Paired Differences"
 msgstr ""
 
-#: src/language/stats/t-test.q:1171
+#: src/language/stats/t-test.q:1173
 msgid "Std. Error Mean"
 msgstr ""
 
-#: src/language/stats/t-test.q:1250
+#: src/language/stats/t-test.q:1252
 msgid "One-Sample Test"
 msgstr ""
 
-#: src/language/stats/t-test.q:1255
+#: src/language/stats/t-test.q:1257
 #, c-format
 msgid "Test Value = %f"
 msgstr ""
 
-#: src/language/stats/t-test.q:1365
+#: src/language/stats/t-test.q:1367
 msgid "Paired Samples Correlations"
 msgstr ""
 
-#: src/language/stats/t-test.q:1369
+#: src/language/stats/t-test.q:1371
 msgid "Correlation"
 msgstr ""
 
-#: src/language/stats/t-test.q:1388
+#: src/language/stats/t-test.q:1390
 #, c-format
 msgid "%s & %s"
 msgstr ""
@@ -3758,40 +3755,40 @@
 msgid "Destination cannot be a string variable."
 msgstr ""
 
-#: src/language/xforms/recode.c:238
+#: src/language/xforms/recode.c:245
 msgid ""
 "Inconsistent target variable types.  Target variables must be all numeric or "
 "all string."
 msgstr ""
 
-#: src/language/xforms/recode.c:258
+#: src/language/xforms/recode.c:265
 msgid "CONVERT requires string input values and numeric output values."
 msgstr ""
 
-#: src/language/xforms/recode.c:376
+#: src/language/xforms/recode.c:383
 msgid "expecting output value"
 msgstr ""
 
-#: src/language/xforms/recode.c:423
+#: src/language/xforms/recode.c:430
 #, 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:439
+#: src/language/xforms/recode.c:446
 #, 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:454
+#: src/language/xforms/recode.c:461
 #, c-format
 msgid "INTO is required with %s input values and %s output values."
 msgstr ""
 
-#: src/language/xforms/recode.c:467
+#: src/language/xforms/recode.c:474
 #, c-format
 msgid "Type mismatch.  Cannot store %s data in %s variable %s."
 msgstr ""
@@ -3805,16 +3802,16 @@
 msgid "Cannot sample %d observations from a population of %d."
 msgstr ""
 
-#: src/language/xforms/select-if.c:109
-msgid "The filter variable must be numeric."
+#: src/language/xforms/select-if.c:100
+msgid "Syntax error expecting OFF or BY.  Turning off case filtering."
 msgstr ""
 
 #: src/language/xforms/select-if.c:115
-msgid "The filter variable may not be scratch."
+msgid "The filter variable must be numeric."
 msgstr ""
 
-#: src/language/xforms/select-if.c:147
-msgid "Only last instance of this command is in effect."
+#: src/language/xforms/select-if.c:121
+msgid "The filter variable may not be scratch."
 msgstr ""
 
 #: src/libpspp/hash.c:582
@@ -3842,7 +3839,7 @@
 msgid "Empirical with averaging"
 msgstr ""
 
-#: src/math/sort.c:437
+#: src/math/sort.c:435
 #, c-format
 msgid ""
 "Out of memory.  Could not allocate room for minimum of %d cases of %d bytes "
@@ -4290,7 +4287,7 @@
 msgid "Incorrect range specification"
 msgstr ""
 
-#: src/ui/gui/psppire-data-store.c:651
+#: src/ui/gui/psppire-data-store.c:656
 msgid "var"
 msgstr ""
 
Index: pspp/src/automake.mk
diff -u pspp/src/automake.mk:1.5 pspp/src/automake.mk:1.6
--- pspp/src/automake.mk:1.5    Fri May  5 04:53:12 2006
+++ pspp/src/automake.mk        Sun May  7 02:18:32 2006
@@ -13,4 +13,4 @@
 include $(top_srcdir)/src/ui/gui/automake.mk
 endif
 
-AM_CPPFLAGS += -DPKGDATADIR=\"$(pkgdatadir)\"
+AM_CPPFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/lib 
-DPKGDATADIR=\"$(pkgdatadir)\"
Index: pspp/src/data/ChangeLog
diff -u pspp/src/data/ChangeLog:1.41 pspp/src/data/ChangeLog:1.42
--- pspp/src/data/ChangeLog:1.41        Sun May  7 02:04:12 2006
+++ pspp/src/data/ChangeLog     Sun May  7 02:18:32 2006
@@ -1,3 +1,9 @@
+Sun May  7 10:04:06 WST 2006 John Darrington <address@hidden>
+
+       * data-in.c data-out.c dictionary.c sys-file-reader.c
+       sys-file-writer.c variable.c variable.h:  Reworked very long string
+       support for better encapsulation.
+
 Sat May  6 19:02:00 2006  Ben Pfaff  <address@hidden>
 
        * value-labels.c (val_labs_can_set_width): New function.
Index: pspp/src/data/data-in.c
diff -u pspp/src/data/data-in.c:1.8 pspp/src/data/data-in.c:1.9
--- pspp/src/data/data-in.c:1.8 Tue May  2 03:51:43 2006
+++ pspp/src/data/data-in.c     Sun May  7 02:18:32 2006
@@ -572,9 +572,7 @@
 static inline bool
 parse_A (struct data_in *i)
 {
-  const int bytes = width_to_bytes(i->format.w);
-
-  copy_mangle (i->v->s, bytes, i->s, i->e - i->s);
+  buf_copy_rpad (i->v->s, i->format.w, i->s, i->e - i->s);
   
   return true;
 }
Index: pspp/src/data/data-out.c
diff -u pspp/src/data/data-out.c:1.4 pspp/src/data/data-out.c:1.5
--- pspp/src/data/data-out.c:1.4        Tue May  2 03:51:43 2006
+++ pspp/src/data/data-out.c    Sun May  7 02:18:32 2006
@@ -395,7 +395,7 @@
 static int
 convert_A (char *dst, const struct fmt_spec *fp, const char *string)
 {
-  copy_demangle(dst, fp->w, string, fp->w);
+  memcpy(dst, string, fp->w);
   return 1;
 }
 
Index: pspp/src/data/dictionary.c
diff -u pspp/src/data/dictionary.c:1.11 pspp/src/data/dictionary.c:1.12
--- pspp/src/data/dictionary.c:1.11     Sat May  6 22:37:30 2006
+++ pspp/src/data/dictionary.c  Sun May  7 02:18:32 2006
@@ -281,7 +281,7 @@
   v->type = width == 0 ? NUMERIC : ALPHA;
   v->width = width;
   v->fv = d->next_value_idx;
-  v->nv = width_to_bytes(width) / MAX_SHORT_STRING ;
+  v->nv = width == 0 ? 1 : DIV_RND_UP (width, MAX_SHORT_STRING);
   v->leave = dict_class_from_id (v->name) == DC_SCRATCH;
   v->index = d->var_cnt;
   mv_init (&v->miss, width);
Index: pspp/src/data/sys-file-reader.c
diff -u pspp/src/data/sys-file-reader.c:1.15 
pspp/src/data/sys-file-reader.c:1.16
--- pspp/src/data/sys-file-reader.c:1.15        Thu May  4 05:51:12 2006
+++ pspp/src/data/sys-file-reader.c     Sun May  7 02:18:32 2006
@@ -23,6 +23,7 @@
 #include <errno.h>
 #include <float.h>
 #include <c-ctype.h>
+#include <minmax.h>
 
 #include <libpspp/alloc.h>
 #include <libpspp/message.h>
@@ -31,6 +32,7 @@
 #include <libpspp/misc.h>
 #include <libpspp/str.h>
 #include <libpspp/hash.h>
+#include <libpspp/array.h>
 
 #include "sys-file-reader.h"
 #include "sfm-private.h"
@@ -53,16 +55,18 @@
   FILE *file;                  /* File stream. */
 
   int reverse_endian;          /* 1=file has endianness opposite us. */
-  int fix_specials;           /* 1=SYSMIS/HIGHEST/LOWEST differs from us. */
+  int fix_specials;             /* 1=SYSMIS/HIGHEST/LOWEST differs from us. */
   int value_cnt;               /* Number of `union values's per case. */
   long case_cnt;               /* Number of cases, -1 if unknown. */
   int compressed;              /* 1=compressed, 0=not compressed. */
-  double bias;         /* Compression bias, usually 100.0. */
+  double bias;                 /* Compression bias, usually 100.0. */
   int weight_idx;              /* 0-based index of weighting variable, or -1. 
*/
   bool ok;                    /* False after an I/O error or corrupt data. */
+  bool has_vls;         /* True if the file has one or more Very Long Strings*/
 
   /* Variables. */
-  struct sfm_var *vars;       /* Variables. */
+  struct hsh_table *var_hash;
+  struct variable *const *svars;
 
   /* File's special constants. */
   flt64 sysmis;
@@ -82,6 +86,7 @@
 /* A variable in a system file. */
 struct sfm_var 
 {
+  char name[SHORT_NAME_LEN + 1];  /* name */
   int width;                  /* 0=numeric, otherwise string width. */
   int fv;                     /* Index into case. */
 };
@@ -161,7 +166,7 @@
   if (r->fh != NULL)
     fh_close (r->fh, "system file", "rs");
 
-  free (r->vars);
+  hsh_destroy(r->var_hash);
   free (r->buf);
   free (r);
 }
@@ -266,6 +271,60 @@
 }
 
 
+
+/* A hsh_compare_func that orders variables A and B by their
+   names. */
+static int
+compare_var_shortnames (const void *a_, const void *b_, void *foo UNUSED) 
+{
+  int i;
+  const struct variable *a = a_;
+  const struct variable *b = b_;
+
+  char buf1[SHORT_NAME_LEN + 1];
+  char buf2[SHORT_NAME_LEN + 1];
+
+  memset(buf1, 0, SHORT_NAME_LEN + 1);
+  memset(buf2, 0, SHORT_NAME_LEN + 1);
+
+  for (i = 0 ; i <= SHORT_NAME_LEN ; ++i ) 
+    {
+      buf1[i] = a->short_name[i];
+      if ( '\0' == buf1[i]) 
+       break;
+    }
+
+  for (i = 0 ; i <= SHORT_NAME_LEN ; ++i ) 
+    {
+      buf2[i] = b->short_name[i];
+      if ( '\0' == buf2[i]) 
+       break;
+    }
+
+  return strncmp(buf1, buf2, SHORT_NAME_LEN);
+}
+
+/* A hsh_hash_func that hashes variable V based on its name. */
+static unsigned
+hash_var_shortname (const void *v_, void *foo UNUSED) 
+{
+  int i;
+  const struct variable *v = v_;
+  char buf[SHORT_NAME_LEN + 1];
+
+  memset(buf, 0, SHORT_NAME_LEN + 1); 
+  for (i = 0 ; i <= SHORT_NAME_LEN ; ++i ) 
+    {
+      buf[i] = v->short_name[i];
+      if ( '\0' == buf[i]) 
+       break;
+    }
+
+  return hsh_hash_bytes(buf, strlen(buf));
+}
+
+
+
 /* Opens the system file designated by file handle FH for
    reading.  Reads the system file's dictionary into *DICT.
    If INFO is non-null, then it receives additional info about the
@@ -301,8 +360,10 @@
   r->bias = 100.0;
   r->weight_idx = -1;
   r->ok = true;
+  r->has_vls = false;
+  r->svars = 0;
 
-  r->vars = NULL;
+  r->var_hash = hsh_create(4, compare_var_shortnames, hash_var_shortname, 0, 
0);
 
   r->sysmis = -FLT64_MAX;
   r->highest = FLT64_MAX;
@@ -463,6 +524,8 @@
                  char *short_name, *save_ptr;
                   int idx;
 
+                 r->has_vls = true;
+
                   /* Read data. */
                   subrec14data = xmalloc (bytes + 1);
                  if (!buf_read (r, subrec14data, bytes, 0)) 
@@ -612,7 +675,7 @@
                                  goto error;
 
                                }
-                             
+
                              l = length;
                              if ( v->width > EFFECTIVE_LONG_STRING_LENGTH ) 
                                l -= EFFECTIVE_LONG_STRING_LENGTH;
@@ -630,12 +693,17 @@
                                  else
                                    l -= v_next->width;
 
+                                 hsh_delete(r->var_hash, v_next);
+
                                  dict_delete_var(*dict, v_next);
                                }
-                             
+
+                             assert ( length > MAX_LONG_STRING );
+
                              v->width = length;
                              v->print.w = v->width;
                              v->write.w = v->width;
+                             v->nv = DIV_RND_UP (length, MAX_SHORT_STRING);
                            }
                          eq_seen = false;
                          memset(name, 0, SHORT_NAME_LEN+1); 
@@ -654,6 +722,7 @@
                        }
                    }
                  free(buffer);
+                 dict_compact_values(*dict);
                }
                break;
 
@@ -692,7 +761,6 @@
  success:
   /* Come here on successful completion. */
 
-
   free (var_by_idx);
   hsh_destroy(short_to_long);
   free (subrec14data);
@@ -969,13 +1037,6 @@
 
   *var_by_idx = 0;
 
-  /* Pre-allocate variables. */
-  if (r->value_cnt != -1) 
-    {
-      *var_by_idx = xnmalloc (r->value_cnt, sizeof **var_by_idx);
-      r->vars = xnmalloc (r->value_cnt, sizeof *r->vars);
-    }
-
 
   /* Read in the entry for each variable and use the info to
      initialize the dictionary. */
@@ -1007,7 +1068,6 @@
        }
 
       *var_by_idx = xnrealloc (*var_by_idx, i + 1, sizeof **var_by_idx);
-      r->vars = xnrealloc (r->vars, i + 1, sizeof *r->vars);
 
       /* If there was a long string previously, make sure that the
         continuations are present; otherwise make sure there aren't
@@ -1020,7 +1080,6 @@
                    fh_get_file_name (r->fh), i));
 
 
-         r->vars[i].width = -1;
          (*var_by_idx)[i] = NULL;
          long_string_count--;
          continue;
@@ -1155,9 +1214,8 @@
          || !parse_format_spec (r, sv.write, &vv->write, vv))
        goto error;
 
-      r->vars[i].width = vv->width;
-      r->vars[i].fv = vv->fv;
-
+      if ( vv->width != -1)
+       hsh_insert(r->var_hash, vv);
     }
 
   /* Some consistency checks. */
@@ -1611,6 +1669,20 @@
   return 0;
 }
 
+
+static int
+compare_var_index(const void *_v1, const void *_v2, void *aux UNUSED)
+{
+  const struct variable *const *v1 = _v1;
+  const struct variable *const *v2 = _v2;
+
+  if ( (*v1)->index < (*v2)->index) 
+    return -1;
+
+  return ( (*v1)->index > (*v2)->index) ;
+}
+
+
 /* Reads one case from READER's file into C.  Returns nonzero
    only if successful. */
 int
@@ -1618,8 +1690,15 @@
 {
   if (!r->ok)
     return 0;
-  
-  if (!r->compressed && sizeof (flt64) == sizeof (double)) 
+
+  if ( ! r->svars ) 
+    {
+      r->svars = (struct variable *const *) hsh_data(r->var_hash);
+      sort(r->svars, hsh_count(r->var_hash), 
+          sizeof(*r->svars), compare_var_index, 0);
+    }
+
+  if (!r->compressed && sizeof (flt64) == sizeof (double) && ! r->has_vls) 
     {
       /* Fast path: external and internal representations are the
          same, except possibly for endianness or SYSMIS.  Read
@@ -1634,9 +1713,12 @@
         {
           int i;
           
-          for (i = 0; i < r->value_cnt; i++) 
-            if (r->vars[i].width == 0)
-              bswap_flt64 (&case_data_rw (c, r->vars[i].fv)->f);
+          for (i = 0; i < hsh_count(r->var_hash); i++) 
+           {
+             struct variable *v = r->svars[i];
+             if (v->width == 0)
+               bswap_flt64 (&case_data_rw (c, v->fv)->f);
+           }
         }
 
       /* Fix up SYSMIS values if needed.
@@ -1645,10 +1727,12 @@
       if (r->sysmis != SYSMIS) 
         {
           int i;
-          
-          for (i = 0; i < r->value_cnt; i++) 
-            if (r->vars[i].width == 0 && case_num (c, i) == r->sysmis)
-              case_data_rw (c, r->vars[i].fv)->f = SYSMIS;
+          for (i = 0; i < hsh_count(r->var_hash); i++) 
+           {
+             struct variable *v = r->svars[i];
+             if (v->width == 0 && case_num (c, i) == r->sysmis)
+               case_data_rw (c, v->fv)->f = SYSMIS;
+           }
         }
     }
   else 
@@ -1664,6 +1748,8 @@
       bounce_size = sizeof *bounce * r->value_cnt;
       bounce = bounce_cur = local_alloc (bounce_size);
 
+      memset(bounce, 0, bounce_size);
+
       if (!r->compressed)
         read_ok = fread_ok (r, bounce, bounce_size);
       else
@@ -1674,21 +1760,31 @@
           return 0;
         }
 
-      for (i = 0; i < r->value_cnt; i++)
+      for (i = 0; i < hsh_count(r->var_hash); i++)
         {
-          struct sfm_var *v = &r->vars[i];
+         struct variable *tv = r->svars[i];
 
-          if (v->width == 0)
+          if (tv->width == 0)
             {
               flt64 f = *bounce_cur++;
               if (r->reverse_endian)
                 bswap_flt64 (&f);
-              case_data_rw (c, v->fv)->f = f == r->sysmis ? SYSMIS : f;
+              case_data_rw (c, tv->fv)->f = f == r->sysmis ? SYSMIS : f;
             }
-          else if (v->width != -1)
+          else if (tv->width != -1)
             {
-              memcpy (case_data_rw (c, v->fv)->s, bounce_cur, v->width);
-              bounce_cur += DIV_RND_UP (v->width, sizeof (flt64));
+             flt64 *bc_start = bounce_cur;
+             int ofs = 0;
+              while (ofs < tv->width )
+                {
+                  const int chunk = MIN (MAX_LONG_STRING, tv->width - ofs);
+                  memcpy (case_data_rw (c, tv->fv)->s + ofs, bounce_cur, 
chunk);
+
+                  bounce_cur += DIV_RND_UP (chunk, sizeof (flt64));
+
+                  ofs += chunk;
+                }
+             bounce_cur = bc_start + width_to_bytes(tv->width) / sizeof(flt64);
             }
         }
 
Index: pspp/src/data/sys-file-writer.c
diff -u pspp/src/data/sys-file-writer.c:1.9 pspp/src/data/sys-file-writer.c:1.10
--- pspp/src/data/sys-file-writer.c:1.9 Sat May  6 22:37:30 2006
+++ pspp/src/data/sys-file-writer.c     Sun May  7 02:18:32 2006
@@ -42,6 +42,7 @@
 #include "value-labels.h"
 #include "variable.h"
 #include <libpspp/version.h>
+#include <minmax.h>
 
 #include "gettext.h"
 #define _(msgid) gettext (msgid)
@@ -61,6 +62,7 @@
     int compress;              /* 1=compressed, 0=not compressed. */
     int case_cnt;              /* Number of cases written so far. */
     size_t flt64_cnt;           /* Number of flt64 elements in case. */
+    bool has_vls;               /* Does the dict have very long strings? */
 
     /* Compression buffering. */
     flt64 *buf;                        /* Buffered data. */
@@ -197,6 +199,7 @@
   w->compress = opts.compress;
   w->case_cnt = 0;
   w->flt64_cnt = 0;
+  w->has_vls = false;
 
   w->buf = w->end = w->ptr = NULL;
   w->x = w->y = NULL;
@@ -211,8 +214,8 @@
       sv->width = dv->width;
       /* spss compatibility nonsense */
       if ( dv->width > MAX_LONG_STRING ) 
-       sv->width = (dv->width / MAX_LONG_STRING) * (MAX_LONG_STRING + 1)
-         + (dv->width % MAX_LONG_STRING) ;
+         w->has_vls = true;
+
       sv->fv = dv->fv;
       sv->flt64_cnt = var_flt64_cnt (dv);
     }
@@ -870,7 +873,7 @@
   w->case_cnt++;
 
   if (!w->needs_translation && !w->compress
-      && sizeof (flt64) == sizeof (union value)) 
+      && sizeof (flt64) == sizeof (union value) && ! w->has_vls )
     {
       /* Fast path: external and internal representations are the
          same and the dictionary is properly ordered.  Write
@@ -898,14 +901,23 @@
          memset(bounce_cur, ' ', v->flt64_cnt * sizeof (flt64));
 
           if (v->width == 0) 
-            *bounce_cur = case_num (c, v->fv);
-          else 
            {
-             buf_copy_rpad((char*)bounce_cur, v->flt64_cnt * sizeof (flt64),
-                           case_data(c, v->fv)->s, 
-                           v->width);
+             *bounce_cur = case_num (c, v->fv);
+             bounce_cur += v->flt64_cnt;
            }
-          bounce_cur += v->flt64_cnt;
+          else 
+           { int ofs = 0;
+           while (ofs < v->width)
+             {
+               int chunk = MIN (MAX_LONG_STRING, v->width - ofs);
+               int nv = DIV_RND_UP (chunk, sizeof (flt64));
+               buf_copy_rpad ((char *) bounce_cur, nv * sizeof (flt64),
+                              case_data (c, v->fv)->s + ofs, chunk);
+               bounce_cur += nv;
+               ofs += chunk;
+             }
+           }
+
         }
 
       if (!w->compress)
Index: pspp/src/data/variable.c
diff -u pspp/src/data/variable.c:1.7 pspp/src/data/variable.c:1.8
--- pspp/src/data/variable.c:1.7        Tue May  2 22:44:55 2006
+++ pspp/src/data/variable.c    Sun May  7 02:18:32 2006
@@ -351,82 +351,6 @@
     }
 }
 
-
-/* Copies buffer SRC, of SRC_SIZE bytes, to DST, of DST_SIZE bytes.
-   Each 256th byte, which is expected to be a ' ', is deleted.
-   DST is then truncated to DST_SIZE bytes or padded on the right with
-   spaces as needed. */
-void
-copy_demangle (char *dst, size_t dst_size,
-           const char *src, size_t src_size)
-{
-  int src_bytes_left = src_size;
-  int dst_bytes_left = dst_size;
-  const char *s = src;
-  char *d = dst;
-
-
-  while( src_bytes_left > 0 ) 
-    {
-      const size_t s_chunk = min(MAX_LONG_STRING, src_bytes_left);
-      const size_t d_chunk = min(MAX_LONG_STRING, dst_bytes_left);
-
-      assert ( d < dst + dst_size);
-
-      buf_copy_rpad (d, d_chunk,
-                    s, s_chunk);
-
-      d += d_chunk;
-      s += s_chunk;
-      src_bytes_left -= s_chunk;
-      dst_bytes_left -= d_chunk;
-
-      if ( src_bytes_left > 0 && ! (++s - src) % (MAX_LONG_STRING+1) )
-       {
-         if ( *s != ' ') 
-           msg(MW, _("Expected a space in very long string"));
-         src_bytes_left--;
-       }
-    }
-}
-
-/* Copies buffer SRC, of SRC_SIZE bytes, to DST, of DST_SIZE bytes.
-   DST is rounded up to the nearest 8 byte boundary.
-   A space is inserted at each 256th byte.
-   DST is then truncated to DST_SIZE bytes or padded on the right with
-   spaces as needed. */
-void
-copy_mangle (char *dst, size_t dst_size,
-           const char *src, size_t src_size)
-{
-  int src_bytes_left = src_size;
-  int dst_bytes_left = dst_size;
-  const char *s = src;
-  char *d = dst;
-
-  memset(dst, ' ', dst_size);
-
-  while( src_bytes_left > 0 ) 
-    {
-      const size_t s_chunk = min(MAX_LONG_STRING, src_bytes_left);
-      const size_t d_chunk = min(MAX_LONG_STRING, dst_bytes_left);
-
-      buf_copy_rpad (d, d_chunk, s, s_chunk);
-
-      d += d_chunk;
-      s += s_chunk;
-      src_bytes_left -= s_chunk;
-      dst_bytes_left -= d_chunk;
-
-      if ( dst_bytes_left > 0 && 0 == ( d + 1 - dst ) % (MAX_LONG_STRING + 1) )
-       {
-         memset(d, ' ', 1);
-         d++;
-         dst_bytes_left--;
-       }
-    }
-}
-
 /* Return the number of bytes used when writing case_data for a variable 
    of WIDTH */
 int
@@ -458,3 +382,4 @@
   return bytes;
 }
 
+
Index: pspp/src/data/variable.h
diff -u pspp/src/data/variable.h:1.9 pspp/src/data/variable.h:1.10
--- pspp/src/data/variable.h:1.9        Sat May  6 20:27:23 2006
+++ pspp/src/data/variable.h    Sun May  7 02:18:32 2006
@@ -179,15 +179,6 @@
 const char * var_to_string(const struct variable *var);
 
 
-/* Two complementary functions for dealing with 
-   Very Long String variables */
-
-void copy_demangle (char *dst, size_t dst_size,
-                   const char *src, size_t src_size);
-
-void copy_mangle (char *dst, size_t dst_size,
-                 const char *src, size_t src_size);
-
 int width_to_bytes(int width);
 
 
Index: pspp/src/language/expressions/ChangeLog
diff -u pspp/src/language/expressions/ChangeLog:1.3 
pspp/src/language/expressions/ChangeLog:1.4
--- pspp/src/language/expressions/ChangeLog:1.3 Mon May  1 22:14:53 2006
+++ pspp/src/language/expressions/ChangeLog     Sun May  7 02:18:32 2006
@@ -1,3 +1,8 @@
+Sun May  7 10:05:42 WST 2006 John Darrington <address@hidden>
+
+       * evaluate.c: Removed call to copy_mangle, and replaced with the
+       original buf_copy_rpad.
+
 Mon May  1 15:11:48 2006  Ben Pfaff  <address@hidden>
 
        Prohibit LAG following TEMPORARY.  This both matches SPSS behavior
Index: pspp/src/language/expressions/evaluate.c
diff -u pspp/src/language/expressions/evaluate.c:1.3 
pspp/src/language/expressions/evaluate.c:1.4
--- pspp/src/language/expressions/evaluate.c:1.3        Tue May  2 03:51:43 2006
+++ pspp/src/language/expressions/evaluate.c    Sun May  7 02:18:32 2006
@@ -94,7 +94,7 @@
   assert ((dst == NULL) == (dst_size == 0));
   expr_evaluate (e, c, case_idx, &s);
   
-  copy_mangle (dst, dst_size, s.string, s.length);
+  buf_copy_rpad (dst, dst_size, s.string, s.length);
 }
 
 #include <language/lexer/lexer.h>
Index: pspp/src/libpspp/ChangeLog
diff -u pspp/src/libpspp/ChangeLog:1.18 pspp/src/libpspp/ChangeLog:1.19
--- pspp/src/libpspp/ChangeLog:1.18     Thu May  4 10:09:32 2006
+++ pspp/src/libpspp/ChangeLog  Sun May  7 02:18:32 2006
@@ -1,3 +1,7 @@
+Sun May  7 10:06:29 WST 2006 John Darrington <address@hidden>
+
+       * array.c array.h: Constness of sort.
+
 Thu May  4 18:01:37 WST 2006 John Darrington <address@hidden>
 
        * message.c message.h: Added functions to create and copy a msg.
Index: pspp/src/libpspp/array.c
diff -u pspp/src/libpspp/array.c:1.1 pspp/src/libpspp/array.c:1.2
--- pspp/src/libpspp/array.c:1.1        Sat Mar  4 01:11:57 2006
+++ pspp/src/libpspp/array.c    Sun May  7 02:18:32 2006
@@ -595,7 +595,7 @@
       stack size is needed (actually O(1) in this case)!  */
 
 void
-sort (void *array, size_t count, size_t size,
+sort (const void *array, size_t count, size_t size,
       algo_compare_func *compare, void *aux)
 {
   char *const first = array;
Index: pspp/src/libpspp/array.h
diff -u pspp/src/libpspp/array.h:1.1 pspp/src/libpspp/array.h:1.2
--- pspp/src/libpspp/array.h:1.1        Sat Mar  4 01:11:57 2006
+++ pspp/src/libpspp/array.h    Sun May  7 02:18:32 2006
@@ -45,7 +45,7 @@
 /* Sorts ARRAY, which contains COUNT elements of SIZE bytes each,
    using COMPARE for comparisons.  AUX is passed to each
    comparison as auxiliary data. */
-void sort (void *array, size_t count, size_t size,
+void sort (const void *array, size_t count, size_t size,
            algo_compare_func *compare, void *aux);
 
 /* Tests whether ARRAY, which contains COUNT elements of SIZE
Index: pspp/src/ui/gui/ChangeLog
diff -u pspp/src/ui/gui/ChangeLog:1.9 pspp/src/ui/gui/ChangeLog:1.10
--- pspp/src/ui/gui/ChangeLog:1.9       Thu May  4 10:09:32 2006
+++ pspp/src/ui/gui/ChangeLog   Sun May  7 02:18:32 2006
@@ -1,3 +1,7 @@
+Sun May  7 10:07:28 WST 2006 John Darrington <address@hidden>
+
+       * psppire-data-store.c: Fixed buglet initialising string members.
+
 Thu May  4 18:04:04 WST 2006 John Darrington <address@hidden>
 
        * message-dialog.c message-dialog.h: Added simple queuing to messages
Index: pspp/src/ui/gui/psppire-data-store.c
diff -u pspp/src/ui/gui/psppire-data-store.c:1.4 
pspp/src/ui/gui/psppire-data-store.c:1.5
--- pspp/src/ui/gui/psppire-data-store.c:1.4    Thu May  4 10:09:32 2006
+++ pspp/src/ui/gui/psppire-data-store.c        Sun May  7 02:18:32 2006
@@ -364,13 +364,18 @@
 
   fp = psppire_variable_get_write_spec(pv);
 
-  s = g_string_sized_new (fp->w);
+  s = g_string_sized_new (fp->w + 1);
+  g_string_set_size(s, fp->w);
+  
+  memset(s->str, 0, fp->w);
+
+  g_assert(fp->w == s->len);
     
   /* Converts binary value V into printable form in the exactly
      FP->W character in buffer S according to format specification
      FP.  No null terminator is appended to the buffer.  */
   data_out (s->str, fp, v);
-
+  
   return g_string_free(s, FALSE);
 #if 0
   {




reply via email to

[Prev in Thread] Current Thread [Next in Thread]