Merge commit 'origin/roc'
authorJohn Darrington <john@darrington.wattle.id.au>
Thu, 23 Jul 2009 05:05:41 +0000 (07:05 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Thu, 23 Jul 2009 05:05:41 +0000 (07:05 +0200)
102 files changed:
AUTHORS
Smake
configure.ac
doc/dev/concepts.texi
doc/dev/i18n.texi
perl-module/PSPP.xs
perl-module/lib/PSPP.pm
po/en_GB.po
po/nl.po
src/data/case.c
src/data/case.h
src/data/data-in.c
src/data/data-in.h
src/data/data-out.c
src/data/data-out.h
src/data/file-handle-def.c
src/data/file-handle-def.h
src/data/gnumeric-reader.c
src/data/missing-values.c
src/data/missing-values.h
src/data/por-file-reader.c
src/data/sys-file-reader.c
src/data/sys-file-writer.c
src/data/value.c
src/data/value.h
src/data/variable.c
src/data/variable.h
src/language/command.c
src/language/data-io/data-list.c
src/language/data-io/data-parser.c
src/language/data-io/data-parser.h
src/language/data-io/data-reader.c
src/language/data-io/data-reader.h
src/language/data-io/data-writer.c
src/language/data-io/data-writer.h
src/language/data-io/file-handle.q
src/language/data-io/get-data.c
src/language/data-io/list.q
src/language/data-io/print.c
src/language/dictionary/missing-values.c
src/language/dictionary/split-file.c
src/language/dictionary/sys-file-info.c
src/language/expressions/operations.def
src/language/lexer/lexer.c
src/language/lexer/value-parser.c
src/language/stats/aggregate.c
src/language/stats/binomial.c
src/language/stats/crosstabs.q
src/language/stats/descriptives.c
src/language/stats/examine.q
src/language/stats/frequencies.q
src/language/stats/oneway.q
src/language/stats/rank.q
src/language/stats/regression.q
src/language/stats/reliability.q
src/language/stats/t-test.q
src/language/stats/wilcoxon.c
src/language/utilities/set.q
src/language/xforms/recode.c
src/libpspp/i18n.c
src/libpspp/i18n.h
src/libpspp/legacy-encoding.c
src/libpspp/legacy-encoding.h
src/libpspp/sparse-xarray.c
src/libpspp/str.c
src/libpspp/str.h
src/math/covariance-matrix.c
src/math/covariance-matrix.h
src/math/interaction.c
src/math/interaction.h
src/math/linreg.c
src/output/table.c
src/output/table.h
src/ui/gui/about.c
src/ui/gui/compute-dialog.c
src/ui/gui/dialog-common.c
src/ui/gui/dict-display.c
src/ui/gui/find-dialog.c
src/ui/gui/helper.c
src/ui/gui/helper.h
src/ui/gui/missing-val-dialog.c
src/ui/gui/missing-val-dialog.h
src/ui/gui/psppire-data-editor.c
src/ui/gui/psppire-data-store.c
src/ui/gui/psppire-data-window.c
src/ui/gui/psppire-dict.c
src/ui/gui/psppire-dictview.c
src/ui/gui/psppire-output-window.h
src/ui/gui/psppire-var-sheet.c
src/ui/gui/psppire-var-store.c
src/ui/gui/psppire.glade
src/ui/gui/text-data-import-dialog.c
src/ui/gui/val-labs-dialog.c
src/ui/gui/val-labs-dialog.h
src/ui/gui/var-display.c
src/ui/gui/var-type-dialog.c
src/ui/gui/variable-info-dialog.c
src/ui/syntax-gen.c
tests/command/get-data-gnm.sh
tests/command/npar-wilcoxon.sh
tests/data/datasheet-test.c
tests/dissect-sysfile.c

diff --git a/AUTHORS b/AUTHORS
index af7e9075f8da674b0013c55ec974b998ff9db0e8..db7a59105fbe6600eed2136d196ac4e691e710ff 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -6,9 +6,9 @@ most of the core libraries which ensure that PSPP runs with optimal
 speed are his work.
 
 * John Darrington wrote the graphical user interface, and the T-TEST,
-ONEWAY, EXAMINE, RANK and  NPAR TESTS commands, implemented support
-for long variable names, psql and gnumeric and made numerous revisions
-to other modules.   
+ONEWAY, EXAMINE, RANK and NPAR TESTS commands, implemented support for
+long variable names, PostgreSQL and Gnumeric and made numerous
+revisions to other modules.
 
 * Jason Stover contributed statistical and numerical functionality,
 including lib/gslextras and the linear regression features. Jason 
diff --git a/Smake b/Smake
index 78789d4fed818420b8567a8508ed155dc5fde5b9..2697064c98a3eacdc8ec4cfe1ef35d99111fb4ee 100644 (file)
--- a/Smake
+++ b/Smake
@@ -76,6 +76,8 @@ GNULIB_MODULES = \
        trunc \
        unilbrk/ulc-width-linebreaks \
        unistd \
+       unistr/u8-strlen \
+       unistr/u8-strncat \
        unlocked-io \
        vasprintf-posix \
        vfprintf-posix \
index 7e7a4c6077c23585c036847fc7535dd728a807db..c44fdd565187e1b9f800e51b0adb609f0b99bf90 100644 (file)
@@ -106,7 +106,7 @@ if test x"$with_libpq" != x"no" ; then
 fi
 AM_CONDITIONAL(PSQL_SUPPORT, test -n "$PG_CONFIG")
 
-dnl Checks needed for gnumeric reader
+dnl Checks needed for Gnumeric reader
 gnm_support=yes;
 PKG_CHECK_MODULES(LIBXML2, libxml-2.0,,
                           [PSPP_OPTIONAL_PREREQ([libxml2]); gnm_support=no;]);
index cc6e75226f3ce952f6e0db1dcaa95ae67f07db47..06652d62653b1ec21ccdbc387f8993ae8f762b1f 100644 (file)
@@ -654,19 +654,17 @@ Returns the name of the given format @var{type}.
 These functions provide the ability to convert data fields into
 @union{value}s and vice versa.
 
-@deftypefun bool data_in (struct substring @var{input}, enum legacy_encoding @var{legacy_encoding}, enum fmt_type @var{type}, int @var{implied_decimals}, int @var{first_column}, union value *@var{output}, int @var{width})
+@deftypefun bool data_in (struct substring @var{input}, const char *@var{encoding}, enum fmt_type @var{type}, int @var{implied_decimals}, int @var{first_column}, const struct dictionary *@var{dict}, union value *@var{output}, int @var{width})
 Parses @var{input} as a field containing data in the given format
 @var{type}.  The resulting value is stored in @var{output}, which the
 caller must have initialized with the given @var{width}.  For
 consistency, @var{width} must be 0 if
 @var{type} is a numeric format type and greater than 0 if @var{type}
 is a string format type.
-
-Ordinarily @var{legacy_encoding} should be @code{LEGACY_NATIVE},
-indicating that @var{input} is encoded in the character set
-conventionally used on the host machine.  It may be set to
-@code{LEGACY_EBCDIC} to cause @var{input} to be re-encoded from EBCDIC
-during data parsing.
+@var{encoding} should be set to indicate the character
+encoding of @var{input}.
+@var{dict} must be a pointer to the dictionary with which @var{output}
+is associated.
 
 If @var{input} is the empty string (with length 0), @var{output} is
 set to the value set on SET BLANKS (@pxref{SET BLANKS,,,pspp, PSPP
@@ -701,21 +699,15 @@ not propagated to the caller as errors.
 This function is declared in @file{data/data-in.h}.
 @end deftypefun
 
-@deftypefun void data_out (const union value *@var{input}, const struct fmt_spec *@var{format}, char *@var{output})
-@deftypefunx void data_out_legacy (const union value *@var{input}, enum legacy_encoding @var{legacy_encoding}, const struct fmt_spec *@var{format}, char *@var{output})
-Converts the data pointed to by @var{input} into a data field in
-@var{output} according to output format specifier @var{format}, which
-must be a valid output format.  Exactly @code{@var{format}->w} bytes
-are written to @var{output}.  The width of @var{input} is also
+@deftypefun char * data_out (const union value *@var{input}, const struct fmt_spec *@var{format})
+@deftypefunx char * data_out_legacy (const union value *@var{input}, const char *@var{encoding}, const struct fmt_spec *@var{format})
+Converts the data pointed to by @var{input} into a string value, which
+will be encoded in UTF-8,  according to output format specifier @var{format}.
+Format 
+must be a valid output format.   The width of @var{input} is
 inferred from @var{format} using an algorithm equivalent to
 @func{fmt_var_width}.
 
-If @func{data_out} is called, or @func{data_out_legacy} is called with
-@var{legacy_encoding} set to @code{LEGACY_NATIVE}, @var{output} will
-be encoded in the character set conventionally used on the host
-machine.  If @var{legacy_encoding} is set to @code{LEGACY_EBCDIC},
-@var{output} will be re-encoded from EBCDIC during data output.
-
 When @var{input} contains data that cannot be represented in the given
 @var{format}, @func{data_out} may output a message using @func{msg},
 @c (@pxref{msg}),
index 97077d344e3135548fa4cc91c633062f4e0440e9..3ab86c3d2ec349fb85267ac934bb7c721d9eb304 100644 (file)
@@ -53,7 +53,6 @@ Any string data stored in a @union{value} will be encoded in the
 dictionary's character set.
 
 
-
 @section System files
 @file{*.sav} files contain a field which is supposed to identify the encoding
 of the data they contain (@pxref{Machine Integer Info Record}).  
@@ -103,25 +102,20 @@ It is the caller's responsibility to free the returned string when no
 longer required.
 @end deftypefun
 
+In order to minimise the number of conversions required, and to simplify 
+design, PSPP attempts to store all internal strings in UTF8 encoding.
+Thus, when reading system and portable files (or any other data source),
+the following items are immediately converted to UTF8 encoding:
+@itemize
+@item Variable names
+@item Variable labels
+@item Value labels
+@end itemize
+Conversely, when writing system files, these are converted back to the
+encoding of that system file.
 
-For example, in order to display a string variable's value in a label widget in the psppire gui one would use code similar to
-@example
-
-struct variable *var = /* assigned from somewhere */
-struct case c = /* from somewhere else */
-
-const union value *val = case_data (&c, var);
-
-char *utf8string = recode_string (UTF8, dict_get_encoding (dict), val->s,
-      var_get_width (var));
-
-GtkWidget *entry = gtk_entry_new();
-gtk_entry_set_text (entry, utf8string);
-gtk_widget_show (entry);
-
-free (utf8string);
-
-@end example
+String data stored in union values are left in their original encoding.
+These will be converted by the data_in/data_out functions.
 
 
 
index 8179d29a3721aa27b0b0e7417085a515eb65c591..36300cc806daa17d022c71d49473108f0834b5f2 100644 (file)
 #include <data/sys-file-writer.h>
 #include <data/sys-file-reader.h>
 #include <data/value.h>
+#include <data/vardict.h>
 #include <data/value-labels.h>
 #include <data/format.h>
 #include <data/data-in.h>
+#include <data/data-out.h>
 #include <string.h>
 
 typedef struct fmt_spec input_format ;
@@ -163,6 +165,7 @@ onBoot (ver)
  const char *ver
 CODE:
  assert (0 == strcmp (ver, bare_version));
+ i18n_init ();
  msg_init (NULL, message_handler);
  settings_init (0, 0);
  fh_init ();
@@ -174,12 +177,11 @@ format_value (val, var)
 CODE:
  SV *ret;
  const struct fmt_spec *fmt = var_get_print_format (var);
+ const struct dictionary *dict = var_get_vardict (var)->dict;
  union value uv;
  char *s;
  make_value_from_scalar (&uv, val, var);
- s = malloc (fmt->w);
- memset (s, '\0', fmt->w);
- data_out (&uv, fmt, s);
+ s = data_out (&uv, dict_get_encoding (dict), fmt);
  value_destroy (&uv, var_get_width (var));
  ret = newSVpv (s, fmt->w);
  free (s);
@@ -371,6 +373,37 @@ clear_value_labels (var)
 CODE:
  var_clear_value_labels (var);
 
+SV *
+get_write_format (var)
+ struct variable *var
+CODE:
+ HV *fmthash = (HV *) sv_2mortal ((SV *) newHV());
+ const struct fmt_spec *fmt = var_get_write_format (var);
+
+ hv_store (fmthash, "fmt", 3, newSVnv (fmt->type), 0);
+ hv_store (fmthash, "decimals", 8, newSVnv (fmt->d), 0);
+ hv_store (fmthash, "width", 5, newSVnv (fmt->w), 0);
+
+ RETVAL = newRV ((SV *) fmthash);
+ OUTPUT:
+RETVAL
+
+SV *
+get_print_format (var)
+ struct variable *var
+CODE:
+ HV *fmthash = (HV *) sv_2mortal ((SV *) newHV());
+ const struct fmt_spec *fmt = var_get_print_format (var);
+
+ hv_store (fmthash, "fmt", 3, newSVnv (fmt->type), 0);
+ hv_store (fmthash, "decimals", 8, newSVnv (fmt->d), 0);
+ hv_store (fmthash, "width", 5, newSVnv (fmt->w), 0);
+
+ RETVAL = newRV ((SV *) fmthash);
+ OUTPUT:
+RETVAL
+
+
 void
 pxs_set_write_format (var, fmt)
  struct variable *var
@@ -612,6 +645,7 @@ CODE:
       {
        struct substring ss = ss_cstr (SvPV_nolen (sv));
        if ( ! data_in (ss, LEGACY_NATIVE, ifmt->type, 0, 0, 0,
+                       sfi->dict,
                        case_data_rw (c, v),
                        var_get_width (v)) )
          {
index 3cb9f3be48a5f33ecf21591977e1deacb27e09e4..e5599908b683f7b6e6bde716fbfa9f74d3460338 100644 (file)
@@ -249,7 +249,7 @@ An integer denoting the number of decimal places for the format.
 
 =item width
 
-An integer denoting the number of width of the format.
+An integer denoting the width of the format.
 
 =back
 
@@ -282,6 +282,16 @@ sub set_print_format
 
 =pod
 
+
+=head3 get_write_format ()
+
+Returns a reference to a hash containing the write format for the variable.
+
+
+=head3 get_print_format ()
+
+Returns a reference to a hash containing the print format for the variable.
+
 =head3 set_output_format (%fmt)
 
 Sets the write and print formats to C<fmt>.  This is the same as
@@ -510,7 +520,7 @@ values retrieved from a reader.
 
 =head3 PSPP::format_value ($value, $variable)
 
-Returns a scalar containing a string representing C<value> formatted accoring 
+Returns a scalar containing a string representing C<value> formatted according 
 to the print format of C<variable>.
 In the most common ussage,  C<value> should be a value of C<variable>.
 
index 54f873f44f6773d81d37270656e5d114088869a7..6d0a4a7556c090955a7906707ea9bc34db575992 100644 (file)
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PSPP 0.7.0\n"
 "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
-"POT-Creation-Date: 2009-05-16 07:00+0800\n"
+"POT-Creation-Date: 2009-07-17 15:23+0800\n"
 "PO-Revision-Date: 2008-11-05 08:17+0900\n"
 "Last-Translator: John Darrington <john@darrington.wattle.id.au>\n"
 "Language-Team: John Darrington <john@darrington.wattle.id.au>\n"
@@ -49,81 +49,56 @@ msgid ""
 "system-missing, zero, or negative.  These case(s) were ignored."
 msgstr ""
 
-#: src/data/case-tmpfile.c:57
-#, c-format
-msgid "failed to create temporary file"
-msgstr ""
-
-#: src/data/case-tmpfile.c:131
-#, c-format
-msgid "seeking in temporary file"
-msgstr ""
-
-#: src/data/case-tmpfile.c:153
-#, c-format
-msgid "reading temporary file"
-msgstr ""
-
-#: src/data/case-tmpfile.c:155
-#, c-format
-msgid "unexpected end of file reading temporary file"
-msgstr ""
-
-#: src/data/case-tmpfile.c:175
-#, c-format
-msgid "writing to temporary file"
-msgstr ""
-
-#: src/data/data-in.c:262 src/data/data-in.c:452
+#: src/data/data-in.c:263 src/data/data-in.c:453
 msgid "Field contents are not numeric."
 msgstr ""
 
-#: src/data/data-in.c:264 src/data/data-in.c:454
+#: src/data/data-in.c:265 src/data/data-in.c:455
 msgid "Number followed by garbage."
 msgstr ""
 
-#: src/data/data-in.c:275
+#: src/data/data-in.c:276
 msgid "Invalid numeric syntax."
 msgstr ""
 
-#: src/data/data-in.c:284 src/data/data-in.c:467
+#: src/data/data-in.c:285 src/data/data-in.c:468
 msgid "Too-large number set to system-missing."
 msgstr ""
 
-#: src/data/data-in.c:289 src/data/data-in.c:472
+#: src/data/data-in.c:290 src/data/data-in.c:473
 msgid "Too-small number set to zero."
 msgstr ""
 
-#: src/data/data-in.c:315
+#: src/data/data-in.c:316
 msgid "All characters in field must be digits."
 msgstr ""
 
-#: src/data/data-in.c:338
+#: src/data/data-in.c:339
 msgid "Unrecognized character in field."
 msgstr "Unrecognised character in field."
 
-#: src/data/data-in.c:362 src/data/data-in.c:636
+#: src/data/data-in.c:363 src/data/data-in.c:638
 msgid "Field must have even length."
 msgstr ""
 
-#: src/data/data-in.c:367 src/data/data-in.c:647
+#: src/data/data-in.c:368 src/data/data-in.c:649
 msgid "Field must contain only hex digits."
 msgstr ""
 
-#: src/data/data-in.c:686 src/data/data-in.c:733
+#: src/data/data-in.c:688 src/data/data-in.c:735
 msgid "Syntax error in date field."
 msgstr ""
 
-#: src/data/data-in.c:702
+#: src/data/data-in.c:704
 #, c-format
 msgid "Day (%ld) must be between 1 and 31."
 msgstr ""
 
-#: src/data/data-in.c:749
+#: src/data/data-in.c:751
 msgid "Delimiter expected between fields in date."
 msgstr ""
 
-#: src/data/data-in.c:823
+#: src/data/data-in.c:825
 msgid ""
 "Unrecognized month format.  Months may be specified as Arabic or Roman "
 "numerals or as at least 3 letters of their English names."
@@ -131,45 +106,45 @@ msgstr ""
 "Unrecognised month format.  Months may be specified as Arabic or Roman \n"
 "numerals or as at least 3 letters of their English names."
 
-#: src/data/data-in.c:850
+#: src/data/data-in.c:852
 #, c-format
 msgid "Year (%ld) must be between 1582 and 19999."
 msgstr ""
 
-#: src/data/data-in.c:862
+#: src/data/data-in.c:864
 #, c-format
 msgid "Trailing garbage \"%.*s\" following date."
 msgstr ""
 
-#: src/data/data-in.c:878
+#: src/data/data-in.c:880
 msgid "Julian day must have exactly three digits."
 msgstr ""
 
-#: src/data/data-in.c:883
+#: src/data/data-in.c:885
 #, c-format
 msgid "Julian day (%ld) must be between 1 and 366."
 msgstr ""
 
-#: src/data/data-in.c:907
+#: src/data/data-in.c:909
 #, c-format
 msgid "Quarter (%ld) must be between 1 and 4."
 msgstr ""
 
-#: src/data/data-in.c:927
+#: src/data/data-in.c:929
 #, c-format
 msgid "Week (%ld) must be between 1 and 53."
 msgstr ""
 
-#: src/data/data-in.c:940
+#: src/data/data-in.c:942
 msgid "Delimiter expected between fields in time."
 msgstr ""
 
-#: src/data/data-in.c:960
+#: src/data/data-in.c:962
 #, c-format
 msgid "Minute (%ld) must be between 0 and 59."
 msgstr ""
 
-#: src/data/data-in.c:1000
+#: src/data/data-in.c:1002
 msgid ""
 "Unrecognized weekday name.  At least the first two letters of an English "
 "weekday name must be specified."
@@ -177,32 +152,32 @@ msgstr ""
 "Unrecognised weekday name.  At least the first two letters of an English "
 "weekday name must be specified."
 
-#: src/data/data-in.c:1138
+#: src/data/data-in.c:1140
 #, c-format
 msgid "`%c' expected in date field."
 msgstr ""
 
-#: src/data/data-in.c:1179
+#: src/data/data-in.c:1181
 #, c-format
 msgid "column %d"
 msgstr ""
 
-#: src/data/data-in.c:1181
+#: src/data/data-in.c:1183
 #, c-format
 msgid "columns %d-%d"
 msgstr ""
 
-#: src/data/data-in.c:1185
+#: src/data/data-in.c:1187
 #, c-format
 msgid "%s field) "
 msgstr ""
 
-#: src/data/data-out.c:446
+#: src/data/data-out.c:449
 #, c-format
 msgid "Weekday number %f is not between 1 and 7."
 msgstr ""
 
-#: src/data/data-out.c:467
+#: src/data/data-out.c:470
 #, c-format
 msgid "Month number %f is not between 1 and 12."
 msgstr ""
@@ -219,13 +194,13 @@ msgstr ""
 msgid "scratch"
 msgstr ""
 
-#: src/data/dictionary.c:926
+#: src/data/dictionary.c:940
 msgid ""
 "At least one case in the data file had a weight value that was user-missing, "
 "system-missing, zero, or negative.  These case(s) were ignored."
 msgstr ""
 
-#: src/data/dictionary.c:1228
+#: src/data/dictionary.c:1263
 #, c-format
 msgid "Truncating document line to %d bytes."
 msgstr ""
@@ -322,33 +297,33 @@ msgstr[1] ""
 msgid "%s variables are not compatible with %s format %s."
 msgstr ""
 
-#: src/data/format.c:327 src/data/sys-file-reader.c:657
-#: src/ui/gui/psppire.glade:2034 src/ui/gui/psppire-var-store.c:575
+#: src/data/format.c:327 src/data/sys-file-reader.c:663
+#: src/ui/gui/psppire.glade:2009 src/ui/gui/psppire-var-store.c:584
 #: src/ui/gui/var-sheet-dialogs.glade:139
 msgid "String"
 msgstr ""
 
-#: src/data/format.c:327 src/data/sys-file-reader.c:657
-#: src/ui/gui/psppire.glade:2109 src/ui/gui/psppire-var-store.c:568
+#: src/data/format.c:327 src/data/sys-file-reader.c:663
+#: src/ui/gui/psppire.glade:2084 src/ui/gui/psppire-var-store.c:577
 #: src/ui/gui/var-sheet-dialogs.glade:28
 msgid "Numeric"
 msgstr ""
 
-#: src/data/format.c:328 src/data/sys-file-reader.c:1214
-#: src/data/sys-file-reader.c:1216
+#: src/data/format.c:328 src/data/sys-file-reader.c:1228
+#: src/data/sys-file-reader.c:1230
 #: src/language/dictionary/apply-dictionary.c:78
 #: src/language/dictionary/apply-dictionary.c:79
-#: src/language/xforms/recode.c:489 src/language/xforms/recode.c:490
-#: src/language/xforms/recode.c:502 src/language/xforms/recode.c:503
+#: src/language/xforms/recode.c:490 src/language/xforms/recode.c:491
+#: src/language/xforms/recode.c:503 src/language/xforms/recode.c:504
 msgid "numeric"
 msgstr ""
 
-#: src/data/format.c:328 src/data/sys-file-reader.c:1214
-#: src/data/sys-file-reader.c:1216
+#: src/data/format.c:328 src/data/sys-file-reader.c:1228
+#: src/data/sys-file-reader.c:1230
 #: src/language/dictionary/apply-dictionary.c:78
 #: src/language/dictionary/apply-dictionary.c:79
-#: src/language/xforms/recode.c:489 src/language/xforms/recode.c:490
-#: src/language/xforms/recode.c:502 src/language/xforms/recode.c:503
+#: src/language/xforms/recode.c:490 src/language/xforms/recode.c:491
+#: src/language/xforms/recode.c:503 src/language/xforms/recode.c:504
 msgid "string"
 msgstr ""
 
@@ -357,27 +332,27 @@ msgstr ""
 msgid "String variable with width %d is not compatible with format %s."
 msgstr ""
 
-#: src/data/gnumeric-reader.c:33
+#: src/data/gnumeric-reader.c:36
 msgid ""
 "Support for Gnumeric files was not compiled into this installation of PSPP"
 msgstr ""
 
-#: src/data/gnumeric-reader.c:362
+#: src/data/gnumeric-reader.c:368
 #, c-format
-msgid "Error opening \"%s\" for reading as a gnumeric file: %s."
+msgid "Error opening \"%s\" for reading as a Gnumeric file: %s."
 msgstr ""
 
-#: src/data/gnumeric-reader.c:382
+#: src/data/gnumeric-reader.c:388
 #, c-format
 msgid "Invalid cell range \"%s\""
 msgstr ""
 
-#: src/data/gnumeric-reader.c:518 src/data/psql-reader.c:182
+#: src/data/gnumeric-reader.c:520 src/data/psql-reader.c:187
 #, c-format
 msgid "Cannot create variable name from %s"
 msgstr ""
 
-#: src/data/gnumeric-reader.c:530
+#: src/data/gnumeric-reader.c:532
 #, c-format
 msgid "Selected sheet or range of spreadsheet \"%s\" is empty."
 msgstr ""
@@ -448,118 +423,118 @@ msgstr ""
 
 #. TRANSLATORS: this fragment will be interpolated into
 #. messages in fh_lock() that identify types of files.
-#: src/data/por-file-reader.c:268 src/data/por-file-writer.c:148
+#: src/data/por-file-reader.c:267 src/data/por-file-writer.c:149
 msgid "portable file"
 msgstr ""
 
-#: src/data/por-file-reader.c:276
+#: src/data/por-file-reader.c:275
 #, c-format
 msgid ""
 "An error occurred while opening \"%s\" for reading as a portable file: %s."
 msgstr ""
 
-#: src/data/por-file-reader.c:297
+#: src/data/por-file-reader.c:296
 msgid "Data record expected."
 msgstr ""
 
-#: src/data/por-file-reader.c:379
+#: src/data/por-file-reader.c:378
 msgid "Number expected."
 msgstr ""
 
-#: src/data/por-file-reader.c:407
+#: src/data/por-file-reader.c:406
 msgid "Missing numeric terminator."
 msgstr ""
 
-#: src/data/por-file-reader.c:430
+#: src/data/por-file-reader.c:429
 msgid "Invalid integer."
 msgstr ""
 
-#: src/data/por-file-reader.c:441
+#: src/data/por-file-reader.c:440
 #, c-format
 msgid "Bad string length %d."
 msgstr ""
 
-#: src/data/por-file-reader.c:502
+#: src/data/por-file-reader.c:501
 #, c-format
 msgid "%s: Not a portable file."
 msgstr ""
 
-#: src/data/por-file-reader.c:519
+#: src/data/por-file-reader.c:518
 #, c-format
 msgid "Unrecognized version code `%c'."
 msgstr "Unrecognised version code `%c'."
 
-#: src/data/por-file-reader.c:528
+#: src/data/por-file-reader.c:527
 #, c-format
 msgid "Bad date string length %zu."
 msgstr ""
 
-#: src/data/por-file-reader.c:530
+#: src/data/por-file-reader.c:529
 #, c-format
 msgid "Bad time string length %zu."
 msgstr ""
 
-#: src/data/por-file-reader.c:572
+#: src/data/por-file-reader.c:571
 #, c-format
 msgid ""
 "%s: Bad format specifier byte (%d).  Variable will be assigned a default "
 "format."
 msgstr ""
 
-#: src/data/por-file-reader.c:593
+#: src/data/por-file-reader.c:592
 #, c-format
 msgid "Numeric variable %s has invalid format specifier %s."
 msgstr ""
 
-#: src/data/por-file-reader.c:597
+#: src/data/por-file-reader.c:596
 #, c-format
 msgid "String variable %s with width %d has invalid format specifier %s."
 msgstr ""
 
-#: src/data/por-file-reader.c:621
+#: src/data/por-file-reader.c:620
 msgid "Expected variable count record."
 msgstr ""
 
-#: src/data/por-file-reader.c:625
+#: src/data/por-file-reader.c:624
 #, c-format
 msgid "Invalid number of variables %d."
 msgstr ""
 
-#: src/data/por-file-reader.c:635
+#: src/data/por-file-reader.c:633
 #, c-format
 msgid "Weight variable name (%s) truncated."
 msgstr ""
 
-#: src/data/por-file-reader.c:650
+#: src/data/por-file-reader.c:648
 msgid "Expected variable record."
 msgstr ""
 
-#: src/data/por-file-reader.c:654
+#: src/data/por-file-reader.c:652
 #, c-format
 msgid "Invalid variable width %d."
 msgstr ""
 
-#: src/data/por-file-reader.c:662
+#: src/data/por-file-reader.c:659
 #, c-format
 msgid "Invalid variable name `%s' in position %d."
 msgstr ""
 
-#: src/data/por-file-reader.c:666
+#: src/data/por-file-reader.c:663 src/data/sys-file-reader.c:521
 #, c-format
 msgid "Bad width %d for variable %s."
 msgstr ""
 
-#: src/data/por-file-reader.c:681
+#: src/data/por-file-reader.c:678
 #, c-format
 msgid "Duplicate variable name %s in position %d."
 msgstr ""
 
-#: src/data/por-file-reader.c:682
+#: src/data/por-file-reader.c:679
 #, c-format
 msgid "Duplicate variable name %s in position %d renamed to %s."
 msgstr ""
 
-#: src/data/por-file-reader.c:725
+#: src/data/por-file-reader.c:728
 #, c-format
 msgid "Weighting variable %s not present in dictionary."
 msgstr ""
@@ -575,56 +550,56 @@ msgid ""
 "Cannot assign value labels to %s and %s, which have different variable types."
 msgstr ""
 
-#: src/data/por-file-writer.c:140
+#: src/data/por-file-writer.c:141
 #, c-format
 msgid "Invalid decimal digits count %d.  Treating as %d."
 msgstr ""
 
-#: src/data/por-file-writer.c:160
+#: src/data/por-file-writer.c:161
 #, c-format
 msgid "Error opening \"%s\" for writing as a portable file: %s."
 msgstr ""
 
-#: src/data/por-file-writer.c:500
+#: src/data/por-file-writer.c:506
 #, c-format
 msgid "An I/O error occurred writing portable file \"%s\"."
 msgstr ""
 
-#: src/data/psql-reader.c:42
+#: src/data/psql-reader.c:46
 msgid ""
 "Support for reading postgres databases was not compiled into this "
 "installation of PSPP"
 msgstr ""
 
-#: src/data/psql-reader.c:237
+#: src/data/psql-reader.c:242
 msgid "Memory error whilst opening psql source"
 msgstr ""
 
-#: src/data/psql-reader.c:243
+#: src/data/psql-reader.c:248
 #, c-format
 msgid "Error opening psql source: %s."
 msgstr ""
 
-#: src/data/psql-reader.c:258
+#: src/data/psql-reader.c:263
 #, c-format
 msgid ""
 "Postgres server is version %s. Reading from versions earlier than 8.0 is not "
 "supported."
 msgstr ""
 
-#: src/data/psql-reader.c:278
+#: src/data/psql-reader.c:283
 msgid ""
 "Connection is unencrypted, but unencrypted connections have not been "
 "permitted."
 msgstr ""
 
-#: src/data/psql-reader.c:317 src/data/psql-reader.c:342
-#: src/data/psql-reader.c:352
+#: src/data/psql-reader.c:322 src/data/psql-reader.c:347
+#: src/data/psql-reader.c:357
 #, c-format
 msgid "Error from psql source: %s."
 msgstr ""
 
-#: src/data/psql-reader.c:447
+#: src/data/psql-reader.c:452
 #, c-format
 msgid "Unsupported OID %d.  SYSMIS values will be inserted."
 msgstr ""
@@ -638,11 +613,11 @@ msgstr ""
 
 #. TRANSLATORS: this fragment will be interpolated into
 #. messages in fh_lock() that identify types of files.
-#: src/data/scratch-writer.c:67 src/language/data-io/file-handle.q:181
+#: src/data/scratch-writer.c:66 src/language/data-io/file-handle.q:181
 msgid "scratch file"
 msgstr ""
 
-#: src/data/settings.c:685
+#: src/data/settings.c:686
 #, c-format
 msgid ""
 "%s: Custom currency string `%s' does not contain exactly three periods or "
@@ -655,39 +630,39 @@ msgstr ""
 
 #. TRANSLATORS: this fragment will be interpolated into
 #. messages in fh_lock() that identify types of files.
-#: src/data/sys-file-reader.c:216 src/data/sys-file-writer.c:200
+#: src/data/sys-file-reader.c:219 src/data/sys-file-writer.c:202
 msgid "system file"
 msgstr ""
 
-#: src/data/sys-file-reader.c:223
+#: src/data/sys-file-reader.c:226
 #, c-format
 msgid "Error opening \"%s\" for reading as a system file: %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:262
+#: src/data/sys-file-reader.c:265
 msgid "Misplaced type 4 record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:273
+#: src/data/sys-file-reader.c:276
 #, c-format
 msgid "Unrecognized record type %d."
 msgstr "Unrecognised record type %d."
 
-#: src/data/sys-file-reader.c:312
+#: src/data/sys-file-reader.c:315
 #, c-format
 msgid "File header claims %d variable positions but %d were read from file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:352
+#: src/data/sys-file-reader.c:355
 #, c-format
 msgid "Error closing system file \"%s\": %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:417 src/data/sys-file-reader.c:427
+#: src/data/sys-file-reader.c:420 src/data/sys-file-reader.c:430
 msgid "This is not an SPSS system file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:446
+#: src/data/sys-file-reader.c:449
 msgid ""
 "Compression bias is not the usual value of 100, or system file uses "
 "unrecognized floating-point format."
@@ -695,333 +670,339 @@ msgstr ""
 "Compression bias is not the usual value of 100, or system file uses \n"
 "unrecognised floating-point format."
 
-#: src/data/sys-file-reader.c:514
+#: src/data/sys-file-reader.c:517
 #, c-format
 msgid "Invalid variable name `%s'."
 msgstr ""
 
-#: src/data/sys-file-reader.c:518
-#, c-format
-msgid "Bad variable width %d."
-msgstr ""
-
-#: src/data/sys-file-reader.c:522
+#: src/data/sys-file-reader.c:525
 #, c-format
 msgid "Duplicate variable name `%s' within system file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:530
+#: src/data/sys-file-reader.c:533
 msgid "Variable label indicator field is not 0 or 1."
 msgstr ""
 
-#: src/data/sys-file-reader.c:538
+#: src/data/sys-file-reader.c:541
 #, c-format
 msgid "Variable %s has label of invalid length %zu."
 msgstr ""
 
-#: src/data/sys-file-reader.c:557
+#: src/data/sys-file-reader.c:560
 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3."
 msgstr ""
 
-#: src/data/sys-file-reader.c:572
+#: src/data/sys-file-reader.c:578
 msgid "String missing value indicator field is not 0, 1, 2, or 3."
 msgstr ""
 
-#: src/data/sys-file-reader.c:575
-#, c-format
-msgid ""
-"Ignoring missing values on long string variable %s, which PSPP does not yet "
-"support."
-msgstr ""
-
-#: src/data/sys-file-reader.c:604
+#: src/data/sys-file-reader.c:610
 msgid "Missing string continuation record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:638
+#: src/data/sys-file-reader.c:644
 #, c-format
 msgid "Unknown variable format %<PRIu8>."
 msgstr ""
 
-#: src/data/sys-file-reader.c:656
+#: src/data/sys-file-reader.c:662
 #, c-format
 msgid "%s variable %s has invalid %s format %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:659
+#: src/data/sys-file-reader.c:665
 msgid "print"
 msgstr ""
 
-#: src/data/sys-file-reader.c:659
+#: src/data/sys-file-reader.c:665
 msgid "write"
 msgstr ""
 
-#: src/data/sys-file-reader.c:663
+#: src/data/sys-file-reader.c:669
 msgid "Suppressing further invalid format warnings."
 msgstr ""
 
-#: src/data/sys-file-reader.c:681
+#: src/data/sys-file-reader.c:687
 msgid "Weighting variable must be numeric."
 msgstr ""
 
-#: src/data/sys-file-reader.c:695
+#: src/data/sys-file-reader.c:701
 msgid "Multiple type 6 (document) records."
 msgstr ""
 
-#: src/data/sys-file-reader.c:699
+#: src/data/sys-file-reader.c:705
 #, c-format
 msgid "Number of document lines (%d) must be greater than 0."
 msgstr ""
 
-#: src/data/sys-file-reader.c:707
+#: src/data/sys-file-reader.c:713
 msgid "Document line contains null byte."
 msgstr ""
 
-#: src/data/sys-file-reader.c:793
-msgid ""
-"Ignoring value labels for long string variables, which PSPP does not yet "
-"support."
-msgstr ""
-
-#: src/data/sys-file-reader.c:798
+#: src/data/sys-file-reader.c:803
 #, c-format
 msgid ""
 "Unrecognized record type 7, subtype %d.  Please send a copy of this file, "
 "and the syntax which created it to %s"
 msgstr ""
 
-#: src/data/sys-file-reader.c:825
+#: src/data/sys-file-reader.c:830
 #, c-format
 msgid "Bad size (%zu) or count (%zu) field on record type 7, subtype 3."
 msgstr ""
 
-#: src/data/sys-file-reader.c:845
+#: src/data/sys-file-reader.c:850
 #, c-format
 msgid ""
 "Floating-point representation indicated by system file (%d) differs from "
 "expected (%d)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:858
+#: src/data/sys-file-reader.c:863
 msgid "little-endian"
 msgstr ""
 
-#: src/data/sys-file-reader.c:858
+#: src/data/sys-file-reader.c:863
 msgid "big-endian"
 msgstr ""
 
-#: src/data/sys-file-reader.c:859
+#: src/data/sys-file-reader.c:864
 #, c-format
 msgid ""
 "Integer format indicated by system file (%s) differs from expected (%s)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:916
+#: src/data/sys-file-reader.c:921
 #, c-format
 msgid "Bad size (%zu) or count (%zu) on extension 4."
 msgstr ""
 
-#: src/data/sys-file-reader.c:920
-#, c-format
-msgid "File specifies unexpected value %g as SYSMIS."
-msgstr ""
-
-#: src/data/sys-file-reader.c:922
-#, c-format
-msgid "File specifies unexpected value %g as HIGHEST."
-msgstr ""
-
-#: src/data/sys-file-reader.c:924
+#: src/data/sys-file-reader.c:925 src/data/sys-file-reader.c:929
+#: src/data/sys-file-reader.c:933
 #, c-format
-msgid "File specifies unexpected value %g as LOWEST."
+msgid "File specifies unexpected value %g as %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:940
+#: src/data/sys-file-reader.c:950
 #, c-format
 msgid "Bad size %zu on extension 11."
 msgstr ""
 
-#: src/data/sys-file-reader.c:952
+#: src/data/sys-file-reader.c:962
 #, c-format
 msgid "Extension 11 has bad count %zu (for %zu variables)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:973
+#: src/data/sys-file-reader.c:983
 #, c-format
 msgid ""
 "Invalid variable display parameters for variable %zu (%s).  Default "
 "parameters substituted."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1017
+#: src/data/sys-file-reader.c:1027
 #, c-format
 msgid "Long variable mapping from %s to invalid variable name `%s'."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1027
+#: src/data/sys-file-reader.c:1037
 #, c-format
 msgid "Duplicate long variable name `%s' within system file."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1080
+#: src/data/sys-file-reader.c:1090
 #, c-format
 msgid "%s listed as string of invalid length %s in very length string record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1090
+#: src/data/sys-file-reader.c:1100
 #, c-format
 msgid ""
 "%s listed in very long string record with width %s, which requires only one "
 "segment."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1096
+#: src/data/sys-file-reader.c:1106
 #, c-format
 msgid "Very long string %s overflows dictionary."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1110
+#: src/data/sys-file-reader.c:1120
 #, c-format
 msgid ""
 "Very long string with width %ld has segment %d of width %d (expected %d)"
 msgstr ""
 
-#: src/data/sys-file-reader.c:1155
+#: src/data/sys-file-reader.c:1166
 #, c-format
 msgid "Invalid number of labels: %d.  Ignoring labels."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1186
+#: src/data/sys-file-reader.c:1197
 msgid ""
 "Variable index record (type 4) does not immediately follow value label "
 "record (type 3) as it should."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1193
+#: src/data/sys-file-reader.c:1204
 #, c-format
 msgid ""
 "Number of variables associated with a value label (%d) is not between 1 and "
 "the number of variables (%zu)."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1203
+#: src/data/sys-file-reader.c:1215
 #, c-format
-msgid "Value labels are not allowed on long string variables (%s)."
+msgid ""
+"Value labels may not be added to long string variables (e.g. %s) using "
+"records types 3 and 4."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1210
+#: src/data/sys-file-reader.c:1224
 #, c-format
 msgid ""
 "Variables associated with value label are not all of identical type.  "
 "Variable %s is %s, but variable %s is %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1243
+#: src/data/sys-file-reader.c:1258
 #, c-format
 msgid "Duplicate value label for %g on %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1246
+#: src/data/sys-file-reader.c:1261 src/data/sys-file-reader.c:1442
 #, c-format
 msgid "Duplicate value label for \"%.*s\" on %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1284
+#: src/data/sys-file-reader.c:1299
 #, c-format
 msgid "Error parsing attribute value %s[%d]"
 msgstr ""
 
-#: src/data/sys-file-reader.c:1298
+#: src/data/sys-file-reader.c:1313
 #, c-format
 msgid "Attribute value %s[%d] is not quoted: %s"
 msgstr ""
 
-#: src/data/sys-file-reader.c:1414
-msgid "File ends in partial case."
+#: src/data/sys-file-reader.c:1376
+#, c-format
+msgid ""
+"Variable name length in long string value label record (%d) exceeds %d-byte "
+"limit."
+msgstr ""
+
+#: src/data/sys-file-reader.c:1386
+#, c-format
+msgid "Ignoring long string value record for unknown variable %s."
+msgstr ""
+
+#: src/data/sys-file-reader.c:1393
+#, c-format
+msgid "Ignoring long string value record for numeric variable %s."
+msgstr ""
+
+#: src/data/sys-file-reader.c:1400
+#, c-format
+msgid ""
+"Ignoring long string value record for variable %s because the record's width "
+"(%d) does not match the variable's width (%d)"
 msgstr ""
 
 #: src/data/sys-file-reader.c:1422
 #, c-format
+msgid ""
+"Ignoring long string value %zu for variable %s, with width %d, that has bad "
+"value width %zu."
+msgstr ""
+
+#: src/data/sys-file-reader.c:1537
+msgid "File ends in partial case."
+msgstr ""
+
+#: src/data/sys-file-reader.c:1545
+#, c-format
 msgid "Error reading case from file %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1519 src/data/sys-file-reader.c:1555
+#: src/data/sys-file-reader.c:1642 src/data/sys-file-reader.c:1678
 msgid "Compressed data is corrupt."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1642
+#: src/data/sys-file-reader.c:1765
 #, c-format
 msgid "Variable index %d not in valid range 1...%d."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1647
+#: src/data/sys-file-reader.c:1770
 #, c-format
 msgid "Variable index %d refers to long string continuation."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1715
+#: src/data/sys-file-reader.c:1838
 #, c-format
 msgid "Suppressed %d additional related warnings."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1756
+#: src/data/sys-file-reader.c:1879
 #, c-format
 msgid "Variable map refers to unknown variable %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1864
+#: src/data/sys-file-reader.c:1987
 #, c-format
 msgid "System error: %s."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1866
+#: src/data/sys-file-reader.c:1989
 msgid "Unexpected end of file."
 msgstr ""
 
-#: src/data/sys-file-writer.c:173
+#: src/data/sys-file-writer.c:175
 #, c-format
 msgid "Unknown system file version %d. Treating as version %d."
 msgstr ""
 
-#: src/data/sys-file-writer.c:212
+#: src/data/sys-file-writer.c:214
 #, c-format
 msgid "Error opening \"%s\" for writing as a system file: %s."
 msgstr ""
 
-#: src/data/sys-file-writer.c:837
+#: src/data/sys-file-writer.c:917
 #, c-format
 msgid "An I/O error occurred writing system file \"%s\"."
 msgstr ""
 
-#: src/data/variable.c:240
+#: src/data/variable.c:242
 #, c-format
 msgid ""
 "Character `%c' (in %s) may not appear as the first character in a variable "
 "name."
 msgstr ""
 
-#: src/data/variable.c:252
+#: src/data/variable.c:254
 #, c-format
 msgid "Character `%c' (in %s) may not appear in a variable name."
 msgstr ""
 
-#: src/data/variable.c:280
+#: src/data/variable.c:282
 msgid "Variable name cannot be empty string."
 msgstr ""
 
-#: src/data/variable.c:286
+#: src/data/variable.c:288
 #, c-format
 msgid "Variable name %s exceeds %d-character limit."
 msgstr ""
 
-#: src/data/variable.c:294
+#: src/data/variable.c:296
 #, c-format
 msgid "`%s' may not be used as a variable name because it is a reserved word."
 msgstr ""
 
-#: src/language/command.c:208
+#: src/language/command.c:208 src/language/expressions/parse.c:1267
 #, c-format
-msgid "%s is unimplemented."
+msgid "%s is not yet implemented."
 msgstr ""
 
 #: src/language/command.c:214
@@ -1295,7 +1276,7 @@ msgid ""
 "name."
 msgstr ""
 
-#: src/language/data-io/combine-files.c:757
+#: src/language/data-io/combine-files.c:762
 #, c-format
 msgid "Encountered %zu sets of duplicate cases in the master file."
 msgstr ""
@@ -1376,7 +1357,7 @@ msgstr ""
 #: src/language/dictionary/split-file.c:84
 #: src/language/dictionary/sys-file-info.c:169
 #: src/language/dictionary/sys-file-info.c:393
-#: src/language/dictionary/sys-file-info.c:716
+#: src/language/dictionary/sys-file-info.c:725
 #: src/language/stats/descriptives.c:885 src/ui/gui/psppire-dictview.c:502
 msgid "Variable"
 msgstr ""
@@ -1386,8 +1367,8 @@ msgid "Record"
 msgstr ""
 
 #: src/language/data-io/data-parser.c:646 src/language/data-io/print.c:405
-#: src/ui/gui/crosstabs.glade:92 src/ui/gui/psppire-var-sheet.c:545
-#: src/ui/gui/psppire-var-store.c:791
+#: src/ui/gui/crosstabs.glade:92 src/ui/gui/psppire-var-sheet.c:534
+#: src/ui/gui/psppire-var-store.c:800
 msgid "Columns"
 msgstr ""
 
@@ -1591,19 +1572,19 @@ msgid ""
 "specified on FIXCASE, %d."
 msgstr ""
 
-#: src/language/data-io/inpt-pgm.c:129
+#: src/language/data-io/inpt-pgm.c:130
 msgid "Unexpected end-of-file within INPUT PROGRAM."
 msgstr ""
 
-#: src/language/data-io/inpt-pgm.c:142
+#: src/language/data-io/inpt-pgm.c:143
 msgid "Input program did not create any variables."
 msgstr ""
 
-#: src/language/data-io/inpt-pgm.c:286
+#: src/language/data-io/inpt-pgm.c:288
 msgid "COLUMN subcommand multiply specified."
 msgstr ""
 
-#: src/language/data-io/inpt-pgm.c:336
+#: src/language/data-io/inpt-pgm.c:338
 msgid ""
 "REREAD: Column numbers must be positive finite numbers.  Column set to 1."
 msgstr ""
@@ -1689,21 +1670,21 @@ msgstr ""
 msgid "Output calls for %d records but %zu specified on RECORDS subcommand."
 msgstr ""
 
-#: src/language/data-io/print.c:436
+#: src/language/data-io/print.c:437
 #, c-format
 msgid "Writing %d record to %s."
 msgid_plural "Writing %d records to %s."
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/language/data-io/print.c:440
+#: src/language/data-io/print.c:441
 #, c-format
 msgid "Writing %d record."
 msgid_plural "Writing %d records."
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/language/data-io/print-space.c:73 src/language/lexer/lexer.c:479
+#: src/language/data-io/print-space.c:73 src/language/lexer/lexer.c:478
 #: src/language/stats/autorecode.c:154 src/language/xforms/select-if.c:60
 msgid "expecting end of command"
 msgstr ""
@@ -1760,18 +1741,7 @@ msgstr ""
 msgid "Variable %s is %s in target file, but %s in source file."
 msgstr ""
 
-#: src/language/dictionary/apply-dictionary.c:99
-#, c-format
-msgid "Cannot add value labels from source file to long string variable %s."
-msgstr ""
-
-#: src/language/dictionary/apply-dictionary.c:113
-#, c-format
-msgid ""
-"Cannot apply missing values from source file to long string variable %s."
-msgstr ""
-
-#: src/language/dictionary/apply-dictionary.c:129
+#: src/language/dictionary/apply-dictionary.c:115
 msgid "No matching variables found between the source and target files."
 msgstr ""
 
@@ -1815,12 +1785,12 @@ msgid ""
 "a single list."
 msgstr ""
 
-#: src/language/dictionary/missing-values.c:117
+#: src/language/dictionary/missing-values.c:116
 #, c-format
-msgid "Truncating missing value to short string length (%d characters)."
+msgid "Truncating missing value to maximum acceptable length (%d bytes)."
 msgstr ""
 
-#: src/language/dictionary/missing-values.c:139
+#: src/language/dictionary/missing-values.c:138
 #, c-format
 msgid "Missing values provided are too long to assign to variable of width %d."
 msgstr ""
@@ -1937,21 +1907,21 @@ msgid "Renaming would duplicate variable name %s."
 msgstr ""
 
 #: src/language/dictionary/split-file.c:85
-#: src/language/dictionary/sys-file-info.c:487
-#: src/language/dictionary/sys-file-info.c:636
-#: src/language/stats/crosstabs.q:1167 src/language/stats/crosstabs.q:1194
-#: src/language/stats/crosstabs.q:1214 src/language/stats/crosstabs.q:1236
-#: src/language/stats/examine.q:1958 src/language/stats/frequencies.q:1059
-#: src/language/stats/frequencies.q:1184 src/language/stats/reliability.q:581
-#: src/language/stats/reliability.q:592
+#: src/language/dictionary/sys-file-info.c:486
+#: src/language/dictionary/sys-file-info.c:641
+#: src/language/stats/crosstabs.q:1231 src/language/stats/crosstabs.q:1258
+#: src/language/stats/crosstabs.q:1282 src/language/stats/crosstabs.q:1307
+#: src/language/stats/examine.q:1959 src/language/stats/frequencies.q:1048
+#: src/language/stats/frequencies.q:1173 src/language/stats/reliability.q:582
+#: src/language/stats/reliability.q:593
 msgid "Value"
 msgstr ""
 
 #: src/language/dictionary/split-file.c:86
 #: src/language/dictionary/sys-file-info.c:397
-#: src/language/dictionary/sys-file-info.c:637 src/ui/gui/crosstabs.glade:275
-#: src/ui/gui/psppire.glade:1999 src/ui/gui/psppire-var-sheet.c:542
-#: src/ui/gui/psppire-var-store.c:788
+#: src/language/dictionary/sys-file-info.c:642 src/ui/gui/crosstabs.glade:275
+#: src/ui/gui/psppire.glade:1974 src/ui/gui/psppire-var-sheet.c:531
+#: src/ui/gui/psppire-var-store.c:797
 msgid "Label"
 msgstr ""
 
@@ -1959,7 +1929,7 @@ msgstr ""
 msgid "File:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:115 src/ui/gui/psppire.glade:1938
+#: src/language/dictionary/sys-file-info.c:115 src/ui/gui/psppire.glade:1913
 #: src/ui/gui/recode.glade:841
 msgid "Label:"
 msgstr ""
@@ -2071,7 +2041,7 @@ msgstr ""
 
 #: src/language/dictionary/sys-file-info.c:171
 #: src/language/dictionary/sys-file-info.c:399
-#: src/language/dictionary/sys-file-info.c:715
+#: src/language/dictionary/sys-file-info.c:724
 msgid "Position"
 msgstr ""
 
@@ -2099,16 +2069,16 @@ msgstr ""
 msgid "Documents in the active file:"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:486
+#: src/language/dictionary/sys-file-info.c:485
 msgid "Attribute"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:544
+#: src/language/dictionary/sys-file-info.c:543
 #, c-format
 msgid "Format: %s"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:551
+#: src/language/dictionary/sys-file-info.c:550
 #, c-format
 msgid "Print Format: %s"
 msgstr ""
@@ -2118,87 +2088,72 @@ msgstr ""
 msgid "Write Format: %s"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:566
+#: src/language/dictionary/sys-file-info.c:567
 #, c-format
 msgid "Measure: %s"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:567
+#: src/language/dictionary/sys-file-info.c:568
 #: src/ui/gui/psppire-var-sheet.c:111
 msgid "Nominal"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:568
+#: src/language/dictionary/sys-file-info.c:569
 #: src/ui/gui/psppire-var-sheet.c:112
 msgid "Ordinal"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:569
+#: src/language/dictionary/sys-file-info.c:570
 #: src/ui/gui/psppire-var-sheet.c:113
 msgid "Scale"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:572
+#: src/language/dictionary/sys-file-info.c:573
 #, c-format
 msgid "Display Alignment: %s"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:573
+#: src/language/dictionary/sys-file-info.c:574
 #: src/ui/gui/psppire-var-sheet.c:104
 msgid "Left"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:574
+#: src/language/dictionary/sys-file-info.c:575
 #: src/ui/gui/psppire-var-sheet.c:106
 msgid "Center"
 msgstr "Centre"
 
-#: src/language/dictionary/sys-file-info.c:575
+#: src/language/dictionary/sys-file-info.c:576
 #: src/ui/gui/psppire-var-sheet.c:105
 msgid "Right"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:578
+#: src/language/dictionary/sys-file-info.c:579
 #, c-format
 msgid "Display Width: %d"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:590
+#: src/language/dictionary/sys-file-info.c:593
 msgid "Missing Values: "
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:693
+#: src/language/dictionary/sys-file-info.c:702
 msgid "No vectors defined."
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:714
+#: src/language/dictionary/sys-file-info.c:723
 msgid "Vector"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:717
+#: src/language/dictionary/sys-file-info.c:726
 msgid "Print Format"
 msgstr ""
 
-#: src/language/dictionary/value-labels.c:121
-#, c-format
-msgid ""
-"It is not possible to assign value labels to long string variables such as %"
-"s."
-msgstr ""
-
-#: src/language/dictionary/value-labels.c:157 src/language/lexer/lexer.c:632
-msgid "expecting string"
-msgstr ""
-
-#: src/language/dictionary/value-labels.c:166 src/language/lexer/lexer.c:659
-msgid "expecting number"
-msgstr ""
-
-#: src/language/dictionary/value-labels.c:182
+#: src/language/dictionary/value-labels.c:150
 msgid "Truncating value label to 60 characters."
 msgstr ""
 
-#: src/language/dictionary/variable-display.c:119
+#: src/language/dictionary/variable-display.c:120
 msgid "Variable display width must be a positive integer."
 msgstr ""
 
@@ -2250,11 +2205,11 @@ msgstr ""
 msgid "The weighting variable may not be scratch."
 msgstr ""
 
-#: src/language/expressions/evaluate.c:154
+#: src/language/expressions/evaluate.c:155
 msgid "expecting number or string"
 msgstr ""
 
-#: src/language/expressions/evaluate.c:168
+#: src/language/expressions/evaluate.c:169
 #, c-format
 msgid "Duplicate variable name %s."
 msgstr ""
@@ -2421,11 +2376,6 @@ msgstr ""
 msgid "%s is a PSPP extension."
 msgstr ""
 
-#: src/language/expressions/parse.c:1267
-#, c-format
-msgid "%s is not yet implemented."
-msgstr ""
-
 #: src/language/expressions/parse.c:1273
 #, c-format
 msgid "%s may not appear after TEMPORARY."
@@ -2446,107 +2396,110 @@ msgstr ""
 
 #: src/language/lexer/lexer.c:389
 #, c-format
-msgid "Bad character in input: `%c'."
+msgid "Bad character in input: `%s'."
 msgstr ""
 
-#: src/language/lexer/lexer.c:391
-#, c-format
-msgid "Bad character in input: `\\%o'."
-msgstr ""
-
-#: src/language/lexer/lexer.c:427
+#: src/language/lexer/lexer.c:426
 #, c-format
 msgid "Subcommand %s may only be specified once."
 msgstr ""
 
-#: src/language/lexer/lexer.c:435
+#: src/language/lexer/lexer.c:434
 #, c-format
 msgid "missing required subcommand %s"
 msgstr ""
 
-#: src/language/lexer/lexer.c:464
+#: src/language/lexer/lexer.c:463
 #, c-format
 msgid "Syntax error %s at %s."
 msgstr ""
 
-#: src/language/lexer/lexer.c:467
+#: src/language/lexer/lexer.c:466
 #, c-format
 msgid "Syntax error at %s."
 msgstr ""
 
-#: src/language/lexer/lexer.c:601 src/language/lexer/lexer.c:618
+#: src/language/lexer/lexer.c:600 src/language/lexer/lexer.c:617
 #, c-format
 msgid "expecting `%s'"
 msgstr ""
 
-#: src/language/lexer/lexer.c:646
+#: src/language/lexer/lexer.c:631
+msgid "expecting string"
+msgstr ""
+
+#: src/language/lexer/lexer.c:645
 msgid "expecting integer"
 msgstr ""
 
-#: src/language/lexer/lexer.c:671
+#: src/language/lexer/lexer.c:658
+msgid "expecting number"
+msgstr ""
+
+#: src/language/lexer/lexer.c:670
 msgid "expecting identifier"
 msgstr ""
 
-#: src/language/lexer/lexer.c:1065
+#: src/language/lexer/lexer.c:1064
 msgid "binary"
 msgstr ""
 
-#: src/language/lexer/lexer.c:1070
+#: src/language/lexer/lexer.c:1069
 msgid "octal"
 msgstr ""
 
-#: src/language/lexer/lexer.c:1075
+#: src/language/lexer/lexer.c:1074
 msgid "hex"
 msgstr ""
 
-#: src/language/lexer/lexer.c:1085
+#: src/language/lexer/lexer.c:1084
 #, c-format
 msgid "String of %s digits has %zu characters, which is not a multiple of %d."
 msgstr ""
 
-#: src/language/lexer/lexer.c:1114
+#: src/language/lexer/lexer.c:1113
 #, c-format
 msgid "`%c' is not a valid %s digit."
 msgstr ""
 
-#: src/language/lexer/lexer.c:1148
+#: src/language/lexer/lexer.c:1147
 msgid "Unterminated string constant."
 msgstr ""
 
-#: src/language/lexer/lexer.c:1202
+#: src/language/lexer/lexer.c:1201
 msgid "Unexpected end of file in string concatenation."
 msgstr ""
 
-#: src/language/lexer/lexer.c:1210
+#: src/language/lexer/lexer.c:1209
 msgid "String expected following `+'."
 msgstr ""
 
-#: src/language/lexer/lexer.c:1223
+#: src/language/lexer/lexer.c:1222
 #, c-format
 msgid "String exceeds 255 characters in length (%zu characters)."
 msgstr ""
 
-#: src/language/lexer/range-parser.c:60
+#: src/language/lexer/value-parser.c:60
 #, c-format
 msgid ""
 "Low end of range (%g) is below high end (%g).  The range will be treated as "
 "reversed."
 msgstr ""
 
-#: src/language/lexer/range-parser.c:68
+#: src/language/lexer/value-parser.c:68
 #, c-format
 msgid "Ends of range are equal (%g)."
 msgstr ""
 
-#: src/language/lexer/range-parser.c:76
+#: src/language/lexer/value-parser.c:76
 msgid "LO or LOWEST must be part of a range."
 msgstr ""
 
-#: src/language/lexer/range-parser.c:108
+#: src/language/lexer/value-parser.c:108
 msgid "System-missing value is not valid here."
 msgstr ""
 
-#: src/language/lexer/range-parser.c:116
+#: src/language/lexer/value-parser.c:116
 msgid "expecting number or data string"
 msgstr ""
 
@@ -2693,392 +2646,388 @@ msgstr ""
 msgid "Duplicate variable name %s among target variables."
 msgstr ""
 
-#: src/language/stats/binomial.c:142
+#: src/language/stats/binomial.c:141
 #, c-format
 msgid "Variable %s is not dichotomous"
 msgstr ""
 
-#: src/language/stats/binomial.c:207
+#: src/language/stats/binomial.c:194
 msgid "Binomial Test"
 msgstr ""
 
-#: src/language/stats/binomial.c:238
+#: src/language/stats/binomial.c:224
 msgid "Group1"
 msgstr ""
 
-#: src/language/stats/binomial.c:239
+#: src/language/stats/binomial.c:225
 msgid "Group2"
 msgstr ""
 
-#: src/language/stats/binomial.c:240 src/language/stats/chisquare.c:224
-#: src/language/stats/chisquare.c:284 src/language/stats/crosstabs.q:868
-#: src/language/stats/crosstabs.q:1074 src/language/stats/crosstabs.q:1797
-#: src/language/stats/examine.q:1214 src/language/stats/frequencies.q:1136
-#: src/language/stats/oneway.q:305 src/language/stats/oneway.q:475
-#: src/language/stats/regression.q:309 src/language/stats/reliability.q:717
-#: src/language/stats/sign.c:93 src/language/stats/wilcoxon.c:246
+#: src/language/stats/binomial.c:226 src/language/stats/chisquare.c:202
+#: src/language/stats/chisquare.c:262 src/language/stats/crosstabs.q:843
+#: src/language/stats/crosstabs.q:1170 src/language/stats/crosstabs.q:1594
+#: src/language/stats/examine.q:1216 src/language/stats/frequencies.q:1125
+#: src/language/stats/oneway.q:305 src/language/stats/oneway.q:476
+#: src/language/stats/regression.q:309 src/language/stats/reliability.q:718
+#: src/language/stats/sign.c:94 src/language/stats/wilcoxon.c:262
 #: src/ui/gui/crosstabs-dialog.c:59
 msgid "Total"
 msgstr ""
 
-#: src/language/stats/binomial.c:273 src/language/stats/chisquare.c:247
-#: src/language/stats/crosstabs.q:1192 src/language/stats/crosstabs.q:1233
+#: src/language/stats/binomial.c:259 src/language/stats/chisquare.c:225
+#: src/language/stats/crosstabs.q:1256 src/language/stats/crosstabs.q:1304
 msgid "Category"
 msgstr ""
 
-#: src/language/stats/binomial.c:274 src/language/stats/crosstabs.q:878
-#: src/language/stats/examine.q:1287 src/language/stats/frequencies.q:1407
+#: src/language/stats/binomial.c:260 src/language/stats/crosstabs.q:850
+#: src/language/stats/examine.q:1289 src/language/stats/frequencies.q:1396
 #: src/language/stats/npar-summary.c:123 src/language/stats/oneway.q:389
-#: src/language/stats/reliability.q:720 src/language/stats/sign.c:73
-#: src/language/stats/t-test.q:700 src/language/stats/t-test.q:724
-#: src/language/stats/t-test.q:863 src/language/stats/t-test.q:1425
-#: src/language/stats/wilcoxon.c:229
+#: src/language/stats/reliability.q:721 src/language/stats/sign.c:74
+#: src/language/stats/t-test.q:506 src/language/stats/t-test.q:526
+#: src/language/stats/t-test.q:626 src/language/stats/t-test.q:1105
+#: src/language/stats/wilcoxon.c:245
 msgid "N"
 msgstr ""
 
-#: src/language/stats/binomial.c:275
+#: src/language/stats/binomial.c:261
 msgid "Observed Prop."
 msgstr ""
 
-#: src/language/stats/binomial.c:276
+#: src/language/stats/binomial.c:262
 msgid "Test Prop."
 msgstr ""
 
-#: src/language/stats/binomial.c:279
+#: src/language/stats/binomial.c:265
 #, c-format
 msgid "Exact Sig. (%d-tailed)"
 msgstr ""
 
-#: src/language/stats/chisquare.c:194
+#: src/language/stats/chisquare.c:172
 #, c-format
 msgid ""
 "CHISQUARE test specified %d expected values, but %d distinct values were "
 "encountered in variable %s."
 msgstr ""
 
-#: src/language/stats/chisquare.c:208 src/language/stats/chisquare.c:248
+#: src/language/stats/chisquare.c:186 src/language/stats/chisquare.c:226
 msgid "Observed N"
 msgstr ""
 
-#: src/language/stats/chisquare.c:209 src/language/stats/chisquare.c:249
+#: src/language/stats/chisquare.c:187 src/language/stats/chisquare.c:227
 msgid "Expected N"
 msgstr ""
 
-#: src/language/stats/chisquare.c:210 src/language/stats/chisquare.c:250
+#: src/language/stats/chisquare.c:188 src/language/stats/chisquare.c:228
 #: src/language/stats/regression.q:308 src/ui/gui/crosstabs-dialog.c:61
 msgid "Residual"
 msgstr ""
 
-#: src/language/stats/chisquare.c:243 src/language/stats/sign.c:61
+#: src/language/stats/chisquare.c:221 src/language/stats/sign.c:62
 msgid "Frequencies"
 msgstr ""
 
-#: src/language/stats/chisquare.c:298 src/language/stats/sign.c:114
-#: src/language/stats/wilcoxon.c:297
+#: src/language/stats/chisquare.c:276 src/language/stats/sign.c:115
+#: src/language/stats/wilcoxon.c:313
 msgid "Test Statistics"
 msgstr ""
 
-#: src/language/stats/chisquare.c:312
+#: src/language/stats/chisquare.c:290
 msgid "Chi-Square"
 msgstr ""
 
-#: src/language/stats/chisquare.c:313 src/language/stats/crosstabs.q:1168
-#: src/language/stats/oneway.q:278 src/language/stats/oneway.q:689
-#: src/language/stats/regression.q:302 src/language/stats/t-test.q:1026
-#: src/language/stats/t-test.q:1219 src/language/stats/t-test.q:1316
+#: src/language/stats/chisquare.c:291 src/language/stats/crosstabs.q:1232
+#: src/language/stats/oneway.q:278 src/language/stats/oneway.q:691
+#: src/language/stats/regression.q:302 src/language/stats/t-test.q:753
+#: src/language/stats/t-test.q:924 src/language/stats/t-test.q:1011
 msgid "df"
 msgstr ""
 
-#: src/language/stats/chisquare.c:314
+#: src/language/stats/chisquare.c:292
 msgid "Asymp. Sig."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:278
+#: src/language/stats/crosstabs.q:325
 msgid ""
 "Missing mode REPORT not allowed in general mode.  Assuming MISSING=TABLE."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:288
-msgid "Write mode ALL not allowed in general mode.  Assuming WRITE=CELLS."
-msgstr ""
-
-#: src/language/stats/crosstabs.q:364
+#: src/language/stats/crosstabs.q:414
 msgid "Too many cross-tabulation variables or dimensions."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:374
+#: src/language/stats/crosstabs.q:424
 msgid "expecting BY"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:441
+#: src/language/stats/crosstabs.q:484
 msgid "VARIABLES must be specified before TABLES."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:479
+#: src/language/stats/crosstabs.q:522
 #, c-format
 msgid "Maximum value (%ld) less than minimum value (%ld)."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:863
+#: src/language/stats/crosstabs.q:838
 msgid "Summary."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:865 src/language/stats/examine.q:1275
-#: src/language/stats/reliability.q:708
+#: src/language/stats/crosstabs.q:840 src/language/stats/examine.q:1277
+#: src/language/stats/reliability.q:709
 msgid "Cases"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:866 src/language/stats/examine.q:1212
-#: src/language/stats/frequencies.q:1057 src/language/stats/frequencies.q:1408
-#: src/language/stats/reliability.q:711
+#: src/language/stats/crosstabs.q:841 src/language/stats/examine.q:1214
+#: src/language/stats/frequencies.q:1046 src/language/stats/frequencies.q:1397
+#: src/language/stats/reliability.q:712
 msgid "Valid"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:867 src/language/stats/examine.q:1213
-#: src/language/stats/frequencies.q:1127 src/language/stats/frequencies.q:1409
-#: src/ui/gui/psppire-var-sheet.c:544 src/ui/gui/psppire-var-store.c:790
+#: src/language/stats/crosstabs.q:842 src/language/stats/examine.q:1215
+#: src/language/stats/frequencies.q:1116 src/language/stats/frequencies.q:1398
+#: src/ui/gui/psppire-var-sheet.c:533 src/ui/gui/psppire-var-store.c:799
 msgid "Missing"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:879 src/language/stats/examine.q:1290
-#: src/language/stats/frequencies.q:1061 src/language/stats/frequencies.q:1062
-#: src/language/stats/frequencies.q:1063
+#: src/language/stats/crosstabs.q:851 src/language/stats/examine.q:1292
+#: src/language/stats/frequencies.q:1050 src/language/stats/frequencies.q:1051
+#: src/language/stats/frequencies.q:1052
 msgid "Percent"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1126
+#: src/language/stats/crosstabs.q:1131
 msgid "count"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1127
+#: src/language/stats/crosstabs.q:1132
 msgid "row %"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1128
+#: src/language/stats/crosstabs.q:1133
 msgid "column %"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1129
+#: src/language/stats/crosstabs.q:1134
 msgid "total %"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1130
+#: src/language/stats/crosstabs.q:1135
 msgid "expected"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1131
+#: src/language/stats/crosstabs.q:1136
 msgid "residual"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1132
+#: src/language/stats/crosstabs.q:1137
 msgid "std. resid."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1133
+#: src/language/stats/crosstabs.q:1138
 msgid "adj. resid."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1163
+#: src/language/stats/crosstabs.q:1227
 msgid "Chi-square tests."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1166 src/language/stats/crosstabs.q:1193
-#: src/language/stats/crosstabs.q:1213 src/language/stats/crosstabs.q:1234
-#: src/language/stats/examine.q:1752 src/ui/gui/checkbox-treeview.c:92
+#: src/language/stats/crosstabs.q:1230 src/language/stats/crosstabs.q:1257
+#: src/language/stats/crosstabs.q:1281 src/language/stats/crosstabs.q:1305
+#: src/language/stats/examine.q:1753 src/ui/gui/checkbox-treeview.c:92
 msgid "Statistic"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1170
+#: src/language/stats/crosstabs.q:1234
 msgid "Asymp. Sig. (2-sided)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1172
-msgid "Exact. Sig. (2-sided)"
+#: src/language/stats/crosstabs.q:1236
+msgid "Exact Sig. (2-sided)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1174
-msgid "Exact. Sig. (1-sided)"
+#: src/language/stats/crosstabs.q:1238
+msgid "Exact Sig. (1-sided)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1189
+#: src/language/stats/crosstabs.q:1253
 msgid "Symmetric measures."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1195 src/language/stats/crosstabs.q:1237
+#: src/language/stats/crosstabs.q:1259 src/language/stats/crosstabs.q:1308
 msgid "Asymp. Std. Error"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1196 src/language/stats/crosstabs.q:1238
+#: src/language/stats/crosstabs.q:1260 src/language/stats/crosstabs.q:1309
 msgid "Approx. T"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1197 src/language/stats/crosstabs.q:1239
+#: src/language/stats/crosstabs.q:1261 src/language/stats/crosstabs.q:1310
 msgid "Approx. Sig."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1208
+#: src/language/stats/crosstabs.q:1276
 msgid "Risk estimate."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1212
+#: src/language/stats/crosstabs.q:1280
 #, c-format
 msgid "95%% Confidence Interval"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1215 src/language/stats/t-test.q:1030
-#: src/language/stats/t-test.q:1216 src/language/stats/t-test.q:1319
+#: src/language/stats/crosstabs.q:1283 src/language/stats/t-test.q:757
+#: src/language/stats/t-test.q:921 src/language/stats/t-test.q:1014
 msgid "Lower"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1216 src/language/stats/t-test.q:1031
-#: src/language/stats/t-test.q:1217 src/language/stats/t-test.q:1320
+#: src/language/stats/crosstabs.q:1284 src/language/stats/t-test.q:758
+#: src/language/stats/t-test.q:922 src/language/stats/t-test.q:1015
 msgid "Upper"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1230
+#: src/language/stats/crosstabs.q:1301
 msgid "Directional measures."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1235 src/ui/gui/psppire.glade:2124
-#: src/ui/gui/psppire-var-sheet.c:539 src/ui/gui/psppire-var-store.c:785
+#: src/language/stats/crosstabs.q:1306 src/ui/gui/psppire.glade:2099
+#: src/ui/gui/psppire-var-sheet.c:528 src/ui/gui/psppire-var-store.c:794
 msgid "Type"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1991
+#: src/language/stats/crosstabs.q:1774
 msgid "Pearson Chi-Square"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1992
+#: src/language/stats/crosstabs.q:1775
 msgid "Likelihood Ratio"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1993
+#: src/language/stats/crosstabs.q:1776
 msgid "Fisher's Exact Test"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1994
+#: src/language/stats/crosstabs.q:1777
 msgid "Continuity Correction"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1995
+#: src/language/stats/crosstabs.q:1778
 msgid "Linear-by-Linear Association"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2032 src/language/stats/crosstabs.q:2105
-#: src/language/stats/crosstabs.q:2167
+#: src/language/stats/crosstabs.q:1813 src/language/stats/crosstabs.q:1888
+#: src/language/stats/crosstabs.q:1953
 msgid "N of Valid Cases"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2051 src/language/stats/crosstabs.q:2183
+#: src/language/stats/crosstabs.q:1832 src/language/stats/crosstabs.q:1971
 msgid "Nominal by Nominal"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2052 src/language/stats/crosstabs.q:2184
+#: src/language/stats/crosstabs.q:1833 src/language/stats/crosstabs.q:1972
 msgid "Ordinal by Ordinal"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2053
+#: src/language/stats/crosstabs.q:1834
 msgid "Interval by Interval"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2054
+#: src/language/stats/crosstabs.q:1835
 msgid "Measure of Agreement"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2059 src/ui/gui/crosstabs-dialog.c:41
+#: src/language/stats/crosstabs.q:1840 src/ui/gui/crosstabs-dialog.c:41
 msgid "Phi"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2060
+#: src/language/stats/crosstabs.q:1841
 msgid "Cramer's V"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2061
+#: src/language/stats/crosstabs.q:1842
 msgid "Contingency Coefficient"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2062
+#: src/language/stats/crosstabs.q:1843
 msgid "Kendall's tau-b"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2063
+#: src/language/stats/crosstabs.q:1844
 msgid "Kendall's tau-c"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2064 src/ui/gui/crosstabs-dialog.c:48
+#: src/language/stats/crosstabs.q:1845 src/ui/gui/crosstabs-dialog.c:48
 msgid "Gamma"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2065
+#: src/language/stats/crosstabs.q:1846
 msgid "Spearman Correlation"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2066
+#: src/language/stats/crosstabs.q:1847
 msgid "Pearson's R"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2067 src/ui/gui/crosstabs-dialog.c:50
+#: src/language/stats/crosstabs.q:1848 src/ui/gui/crosstabs-dialog.c:50
 msgid "Kappa"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2140
+#: src/language/stats/crosstabs.q:1926
 #, c-format
 msgid "Odds Ratio for %s (%g / %g)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2143
+#: src/language/stats/crosstabs.q:1929
 #, c-format
 msgid "Odds Ratio for %s (%.*s / %.*s)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2151
+#: src/language/stats/crosstabs.q:1937
 #, c-format
 msgid "For cohort %s = %g"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2154
+#: src/language/stats/crosstabs.q:1940
 #, c-format
 msgid "For cohort %s = %.*s"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2185
+#: src/language/stats/crosstabs.q:1973
 msgid "Nominal by Interval"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2190 src/ui/gui/crosstabs-dialog.c:43
+#: src/language/stats/crosstabs.q:1978 src/ui/gui/crosstabs-dialog.c:43
 msgid "Lambda"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2191
+#: src/language/stats/crosstabs.q:1979
 msgid "Goodman and Kruskal tau"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2192
+#: src/language/stats/crosstabs.q:1980
 msgid "Uncertainty Coefficient"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2193
+#: src/language/stats/crosstabs.q:1981
 msgid "Somers' d"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2194 src/ui/gui/crosstabs-dialog.c:51
+#: src/language/stats/crosstabs.q:1982 src/ui/gui/crosstabs-dialog.c:51
 msgid "Eta"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2199
+#: src/language/stats/crosstabs.q:1987
 msgid "Symmetric"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2200 src/language/stats/crosstabs.q:2201
+#: src/language/stats/crosstabs.q:1988 src/language/stats/crosstabs.q:1989
 #, c-format
 msgid "%s Dependent"
 msgstr ""
 
-#: src/language/stats/descriptives.c:102 src/language/stats/examine.q:1557
+#: src/language/stats/descriptives.c:102 src/language/stats/examine.q:1559
 #: src/language/stats/frequencies.q:123 src/language/stats/npar-summary.c:126
-#: src/language/stats/oneway.q:390 src/language/stats/t-test.q:701
-#: src/language/stats/t-test.q:725 src/language/stats/t-test.q:862
-#: src/language/stats/t-test.q:1213 src/ui/gui/descriptives-dialog.c:39
+#: src/language/stats/oneway.q:390 src/language/stats/t-test.q:507
+#: src/language/stats/t-test.q:527 src/language/stats/t-test.q:625
+#: src/language/stats/t-test.q:918 src/ui/gui/descriptives-dialog.c:39
 #: src/ui/gui/frequencies-dialog.c:40
 msgid "Mean"
 msgstr ""
@@ -3091,13 +3040,13 @@ msgstr ""
 msgid "Std Dev"
 msgstr ""
 
-#: src/language/stats/descriptives.c:105 src/language/stats/examine.q:1588
+#: src/language/stats/descriptives.c:105 src/language/stats/examine.q:1589
 #: src/language/stats/frequencies.q:128 src/ui/gui/descriptives-dialog.c:46
 #: src/ui/gui/frequencies-dialog.c:45
 msgid "Variance"
 msgstr ""
 
-#: src/language/stats/descriptives.c:106 src/language/stats/examine.q:1624
+#: src/language/stats/descriptives.c:106 src/language/stats/examine.q:1625
 #: src/language/stats/frequencies.q:129 src/ui/gui/descriptives-dialog.c:47
 #: src/ui/gui/frequencies-dialog.c:50
 msgid "Kurtosis"
@@ -3107,7 +3056,7 @@ msgstr ""
 msgid "S E Kurt"
 msgstr ""
 
-#: src/language/stats/descriptives.c:108 src/language/stats/examine.q:1619
+#: src/language/stats/descriptives.c:108 src/language/stats/examine.q:1620
 #: src/language/stats/frequencies.q:131 src/ui/gui/descriptives-dialog.c:48
 #: src/ui/gui/frequencies-dialog.c:46
 msgid "Skewness"
@@ -3117,22 +3066,22 @@ msgstr ""
 msgid "S E Skew"
 msgstr ""
 
-#: src/language/stats/descriptives.c:110 src/language/stats/examine.q:1608
+#: src/language/stats/descriptives.c:110 src/language/stats/examine.q:1609
 #: src/language/stats/frequencies.q:133 src/ui/gui/descriptives-dialog.c:43
 #: src/ui/gui/frequencies-dialog.c:48
 msgid "Range"
 msgstr ""
 
-#: src/language/stats/descriptives.c:111 src/language/stats/examine.q:1598
+#: src/language/stats/descriptives.c:111 src/language/stats/examine.q:1599
 #: src/language/stats/frequencies.q:134 src/language/stats/npar-summary.c:132
-#: src/language/stats/oneway.q:403 src/ui/gui/descriptives-dialog.c:41
+#: src/language/stats/oneway.q:404 src/ui/gui/descriptives-dialog.c:41
 #: src/ui/gui/frequencies-dialog.c:42
 msgid "Minimum"
 msgstr ""
 
-#: src/language/stats/descriptives.c:112 src/language/stats/examine.q:1603
+#: src/language/stats/descriptives.c:112 src/language/stats/examine.q:1604
 #: src/language/stats/frequencies.q:135 src/language/stats/npar-summary.c:135
-#: src/language/stats/oneway.q:404 src/ui/gui/descriptives-dialog.c:42
+#: src/language/stats/oneway.q:405 src/ui/gui/descriptives-dialog.c:42
 #: src/ui/gui/frequencies-dialog.c:43
 msgid "Maximum"
 msgstr ""
@@ -3187,131 +3136,122 @@ msgstr ""
 msgid "Valid cases = %g; cases with missing value(s) = %g."
 msgstr ""
 
-#: src/language/stats/examine.q:343 src/language/stats/examine.q:496
-#: src/language/stats/examine.q:1058
+#: src/language/stats/examine.q:346 src/language/stats/examine.q:499
+#: src/language/stats/examine.q:1060
 msgid "Not creating plot because data set is empty."
 msgstr ""
 
-#: src/language/stats/examine.q:353
+#: src/language/stats/examine.q:356
 #, c-format
 msgid "Normal Q-Q Plot of %s"
 msgstr ""
 
-#: src/language/stats/examine.q:354 src/language/stats/examine.q:359
+#: src/language/stats/examine.q:357 src/language/stats/examine.q:362
 msgid "Observed Value"
 msgstr ""
 
-#: src/language/stats/examine.q:355
+#: src/language/stats/examine.q:358
 msgid "Expected Normal"
 msgstr ""
 
-#: src/language/stats/examine.q:357
+#: src/language/stats/examine.q:360
 #, c-format
 msgid "Detrended Normal Q-Q Plot of %s"
 msgstr ""
 
-#: src/language/stats/examine.q:360
+#: src/language/stats/examine.q:363
 msgid "Dev from Normal"
 msgstr ""
 
-#: src/language/stats/examine.q:513
+#: src/language/stats/examine.q:516
 #, c-format
 msgid "Boxplot of %s vs. %s"
 msgstr ""
 
-#: src/language/stats/examine.q:517
+#: src/language/stats/examine.q:520
 #, c-format
 msgid "Boxplot of %s"
 msgstr ""
 
-#: src/language/stats/examine.q:753 src/language/stats/examine.q:766
+#: src/language/stats/examine.q:756 src/language/stats/examine.q:769
 #, c-format
 msgid "%s and %s are mutually exclusive"
 msgstr ""
 
-#: src/language/stats/examine.q:1270 src/language/stats/reliability.q:685
+#: src/language/stats/examine.q:1272 src/language/stats/reliability.q:686
 msgid "Case Processing Summary"
 msgstr ""
 
-#: src/language/stats/examine.q:1562 src/language/stats/oneway.q:398
+#: src/language/stats/examine.q:1564 src/language/stats/oneway.q:398
 #, c-format
 msgid "%g%% Confidence Interval for Mean"
 msgstr ""
 
-#: src/language/stats/examine.q:1568 src/language/stats/oneway.q:400
+#: src/language/stats/examine.q:1570 src/language/stats/oneway.q:401
 msgid "Lower Bound"
 msgstr ""
 
-#: src/language/stats/examine.q:1573 src/language/stats/oneway.q:401
+#: src/language/stats/examine.q:1575 src/language/stats/oneway.q:402
 msgid "Upper Bound"
 msgstr ""
 
-#: src/language/stats/examine.q:1578
-#, c-format
-msgid "5%% Trimmed Mean"
+#: src/language/stats/examine.q:1579
+msgid "5% Trimmed Mean"
 msgstr ""
 
-#: src/language/stats/examine.q:1583 src/language/stats/frequencies.q:125
+#: src/language/stats/examine.q:1584 src/language/stats/frequencies.q:125
 #: src/ui/gui/frequencies-dialog.c:52
 msgid "Median"
 msgstr ""
 
-#: src/language/stats/examine.q:1593 src/language/stats/npar-summary.c:129
-#: src/language/stats/oneway.q:391 src/language/stats/t-test.q:702
-#: src/language/stats/t-test.q:726 src/language/stats/t-test.q:864
-#: src/language/stats/t-test.q:1214
+#: src/language/stats/examine.q:1594 src/language/stats/npar-summary.c:129
+#: src/language/stats/oneway.q:391 src/language/stats/t-test.q:508
+#: src/language/stats/t-test.q:528 src/language/stats/t-test.q:627
+#: src/language/stats/t-test.q:919
 msgid "Std. Deviation"
 msgstr ""
 
-#: src/language/stats/examine.q:1613
+#: src/language/stats/examine.q:1614
 msgid "Interquartile Range"
 msgstr ""
 
-#: src/language/stats/examine.q:1749 src/language/stats/oneway.q:407
+#: src/language/stats/examine.q:1750 src/language/stats/oneway.q:408
 #: src/ui/gui/examine.glade:310
 msgid "Descriptives"
 msgstr ""
 
-#: src/language/stats/examine.q:1755 src/language/stats/oneway.q:392
-#: src/language/stats/oneway.q:687 src/language/stats/regression.q:203
+#: src/language/stats/examine.q:1756 src/language/stats/oneway.q:392
+#: src/language/stats/oneway.q:689 src/language/stats/regression.q:203
 msgid "Std. Error"
 msgstr ""
 
-#: src/language/stats/examine.q:1852 src/language/stats/examine.q:1857
-#: src/ui/gui/psppire-data-store.c:756 src/ui/gui/psppire-var-store.c:646
-#: src/ui/gui/psppire-var-store.c:656 src/ui/gui/psppire-var-store.c:666
-#: src/ui/gui/psppire-var-store.c:777
-#, c-format
-msgid "%d"
-msgstr ""
-
-#: src/language/stats/examine.q:1938
+#: src/language/stats/examine.q:1939
 msgid "Highest"
 msgstr ""
 
-#: src/language/stats/examine.q:1943
+#: src/language/stats/examine.q:1944
 msgid "Lowest"
 msgstr ""
 
-#: src/language/stats/examine.q:1950
+#: src/language/stats/examine.q:1951
 msgid "Extreme Values"
 msgstr ""
 
-#: src/language/stats/examine.q:1954
+#: src/language/stats/examine.q:1955
 msgid "Case Number"
 msgstr ""
 
-#: src/language/stats/examine.q:2076
+#: src/language/stats/examine.q:2077
 msgid "Tukey's Hinges"
 msgstr ""
 
-#: src/language/stats/examine.q:2116 src/language/stats/examine.q:2134
-#: src/language/stats/frequencies.q:1418 src/language/stats/npar-summary.c:142
+#: src/language/stats/examine.q:2117 src/language/stats/examine.q:2134
+#: src/language/stats/frequencies.q:1407 src/language/stats/npar-summary.c:142
 #: src/ui/gui/examine.glade:333
 msgid "Percentiles"
 msgstr ""
 
-#: src/language/stats/examine.q:2123
+#: src/language/stats/examine.q:2124
 #, c-format
 msgid "%g"
 msgstr ""
@@ -3321,68 +3261,54 @@ msgid ""
 "FLIP ignores TEMPORARY.  Temporary transformations will be made permanent."
 msgstr ""
 
-#: src/language/stats/flip.c:151
+#: src/language/stats/flip.c:147
 msgid "Could not create temporary file for FLIP."
 msgstr ""
 
-#: src/language/stats/flip.c:162
-#, c-format
-msgid "Error writing FLIP file: %s."
-msgstr ""
-
-#: src/language/stats/flip.c:262
-#, c-format
-msgid "Could not create acceptable variant for variable %s."
-msgstr ""
-
-#: src/language/stats/flip.c:278
-msgid "Cannot create more than 99999 variable names."
-msgstr ""
-
-#: src/language/stats/flip.c:394
+#: src/language/stats/flip.c:324
 #, c-format
 msgid "Error rewinding FLIP file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:401
+#: src/language/stats/flip.c:331
 msgid "Error creating FLIP source file."
 msgstr ""
 
-#: src/language/stats/flip.c:414
+#: src/language/stats/flip.c:344
 #, c-format
 msgid "Error reading FLIP file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:416
+#: src/language/stats/flip.c:346
 msgid "Unexpected end of file reading FLIP file."
 msgstr ""
 
-#: src/language/stats/flip.c:432
+#: src/language/stats/flip.c:362
 #, c-format
 msgid "Error seeking FLIP source file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:440
+#: src/language/stats/flip.c:370
 #, c-format
 msgid "Error writing FLIP source file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:451
+#: src/language/stats/flip.c:381
 #, c-format
 msgid "Error closing FLIP source file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:459
+#: src/language/stats/flip.c:389
 #, c-format
 msgid "Error rewinding FLIP source file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:487
+#: src/language/stats/flip.c:419
 #, c-format
 msgid "Error reading FLIP temporary file: %s."
 msgstr ""
 
-#: src/language/stats/flip.c:490
+#: src/language/stats/flip.c:422
 msgid "Unexpected end of file reading FLIP temporary file."
 msgstr ""
 
@@ -3402,66 +3328,66 @@ msgstr ""
 msgid "S.E. Skew"
 msgstr ""
 
-#: src/language/stats/frequencies.q:409
+#: src/language/stats/frequencies.q:405
 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:492
+#: src/language/stats/frequencies.q:488
 #, 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:757
+#: src/language/stats/frequencies.q:752
 #, c-format
 msgid "Variable %s specified multiple times on VARIABLES subcommand."
 msgstr ""
 
-#: src/language/stats/frequencies.q:820
+#: src/language/stats/frequencies.q:809
 msgid "`)' expected after GROUPED interval list."
 msgstr ""
 
-#: src/language/stats/frequencies.q:832
+#: src/language/stats/frequencies.q:821
 #, c-format
 msgid "Variables %s specified on GROUPED but not on VARIABLES."
 msgstr ""
 
-#: src/language/stats/frequencies.q:839
+#: src/language/stats/frequencies.q:828
 #, c-format
 msgid "Variables %s specified multiple times on GROUPED subcommand."
 msgstr ""
 
-#: src/language/stats/frequencies.q:1058 src/language/stats/frequencies.q:1151
-#: src/language/stats/frequencies.q:1152 src/language/stats/frequencies.q:1187
+#: src/language/stats/frequencies.q:1047 src/language/stats/frequencies.q:1140
+#: src/language/stats/frequencies.q:1141 src/language/stats/frequencies.q:1176
 msgid "Cum"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1060 src/output/charts/plot-hist.c:140
+#: src/language/stats/frequencies.q:1049 src/output/charts/plot-hist.c:140
 msgid "Frequency"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1081
+#: src/language/stats/frequencies.q:1070
 msgid "Value Label"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1185
+#: src/language/stats/frequencies.q:1174
 msgid "Freq"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1186 src/language/stats/frequencies.q:1188
+#: src/language/stats/frequencies.q:1175 src/language/stats/frequencies.q:1177
 msgid "Pct"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1381
+#: src/language/stats/frequencies.q:1370
 #, c-format
 msgid "No valid data for variable %s; statistics not displayed."
 msgstr ""
 
-#: src/language/stats/frequencies.q:1422
+#: src/language/stats/frequencies.q:1411
 msgid "50 (Median)"
 msgstr ""
 
@@ -3498,7 +3424,7 @@ msgid ""
 "exactly %d values."
 msgstr ""
 
-#: src/language/stats/npar.q:441 src/language/stats/t-test.q:501
+#: src/language/stats/npar.q:441 src/language/stats/t-test.q:379
 #, c-format
 msgid ""
 "PAIRED was specified but the number of variables preceding WITH (%zu) did "
@@ -3544,11 +3470,11 @@ msgid "Mean Square"
 msgstr ""
 
 #: src/language/stats/oneway.q:280 src/language/stats/regression.q:304
-#: src/language/stats/t-test.q:1023
+#: src/language/stats/t-test.q:750
 msgid "F"
 msgstr ""
 
-#: src/language/stats/oneway.q:281 src/language/stats/oneway.q:538
+#: src/language/stats/oneway.q:281 src/language/stats/oneway.q:539
 #: src/language/stats/regression.q:206 src/language/stats/regression.q:305
 msgid "Significance"
 msgstr ""
@@ -3565,19 +3491,19 @@ msgstr ""
 msgid "ANOVA"
 msgstr ""
 
-#: src/language/stats/oneway.q:535
+#: src/language/stats/oneway.q:536
 msgid "Levene Statistic"
 msgstr ""
 
-#: src/language/stats/oneway.q:536
+#: src/language/stats/oneway.q:537
 msgid "df1"
 msgstr ""
 
-#: src/language/stats/oneway.q:537
+#: src/language/stats/oneway.q:538
 msgid "df2"
 msgstr ""
 
-#: src/language/stats/oneway.q:540
+#: src/language/stats/oneway.q:541
 msgid "Test of Homogeneity of Variances"
 msgstr ""
 
@@ -3585,34 +3511,34 @@ msgstr ""
 msgid "Contrast Coefficients"
 msgstr ""
 
-#: src/language/stats/oneway.q:610 src/language/stats/oneway.q:685
+#: src/language/stats/oneway.q:610 src/language/stats/oneway.q:687
 msgid "Contrast"
 msgstr ""
 
-#: src/language/stats/oneway.q:683
+#: src/language/stats/oneway.q:685
 msgid "Contrast Tests"
 msgstr ""
 
-#: src/language/stats/oneway.q:686
+#: src/language/stats/oneway.q:688
 msgid "Value of Contrast"
 msgstr ""
 
-#: src/language/stats/oneway.q:688 src/language/stats/regression.q:205
-#: src/language/stats/t-test.q:1025 src/language/stats/t-test.q:1218
-#: src/language/stats/t-test.q:1315
+#: src/language/stats/oneway.q:690 src/language/stats/regression.q:205
+#: src/language/stats/t-test.q:752 src/language/stats/t-test.q:923
+#: src/language/stats/t-test.q:1010
 msgid "t"
 msgstr ""
 
-#: src/language/stats/oneway.q:690 src/language/stats/t-test.q:1027
-#: src/language/stats/t-test.q:1220 src/language/stats/t-test.q:1317
+#: src/language/stats/oneway.q:692 src/language/stats/t-test.q:754
+#: src/language/stats/t-test.q:925 src/language/stats/t-test.q:1012
 msgid "Sig. (2-tailed)"
 msgstr ""
 
-#: src/language/stats/oneway.q:734
+#: src/language/stats/oneway.q:736
 msgid "Assume equal variances"
 msgstr ""
 
-#: src/language/stats/oneway.q:738
+#: src/language/stats/oneway.q:740
 msgid "Does not assume equal"
 msgstr ""
 
@@ -3639,33 +3565,33 @@ msgstr ""
 msgid "%s into %s(%s of %s using %s BY %s)"
 msgstr ""
 
-#: src/language/stats/rank.q:729
+#: src/language/stats/rank.q:728
 #, c-format
 msgid "%s into %s(%s of %s BY %s)"
 msgstr ""
 
-#: src/language/stats/rank.q:743
+#: src/language/stats/rank.q:741
 #, c-format
 msgid "%s into %s(%s of %s using %s)"
 msgstr ""
 
-#: src/language/stats/rank.q:753
+#: src/language/stats/rank.q:750
 #, c-format
 msgid "%s into %s(%s of %s)"
 msgstr ""
 
-#: src/language/stats/rank.q:766
+#: src/language/stats/rank.q:762
 msgid ""
 "FRACTION has been specified, but NORMAL and PROPORTION rank functions have "
 "not been requested.  The FRACTION subcommand will be ignored."
 msgstr ""
 
-#: src/language/stats/rank.q:857
+#: src/language/stats/rank.q:853
 #, c-format
 msgid "Variable %s already exists."
 msgstr ""
 
-#: src/language/stats/rank.q:862
+#: src/language/stats/rank.q:858
 msgid "Too many variables in INTO clause."
 msgstr ""
 
@@ -3732,104 +3658,103 @@ msgstr ""
 msgid "Dependent variable must be numeric."
 msgstr ""
 
-#: src/language/stats/reliability.q:432
+#: src/language/stats/reliability.q:433
 msgid "Reliability Statistics"
 msgstr ""
 
-#: src/language/stats/reliability.q:475
+#: src/language/stats/reliability.q:476
 msgid "Item-Total Statistics"
 msgstr ""
 
-#: src/language/stats/reliability.q:497
+#: src/language/stats/reliability.q:498
 msgid "Scale Mean if Item Deleted"
 msgstr ""
 
-#: src/language/stats/reliability.q:500
+#: src/language/stats/reliability.q:501
 msgid "Scale Variance if Item Deleted"
 msgstr ""
 
-#: src/language/stats/reliability.q:503
+#: src/language/stats/reliability.q:504
 msgid "Corrected Item-Total Correlation"
 msgstr ""
 
-#: src/language/stats/reliability.q:506
+#: src/language/stats/reliability.q:507
 msgid "Cronbach's Alpha if Item Deleted"
 msgstr ""
 
-#: src/language/stats/reliability.q:556 src/language/stats/reliability.q:575
+#: src/language/stats/reliability.q:557 src/language/stats/reliability.q:576
 msgid "Cronbach's Alpha"
 msgstr ""
 
-#: src/language/stats/reliability.q:559
+#: src/language/stats/reliability.q:560
 msgid "N of items"
 msgstr ""
 
-#: src/language/stats/reliability.q:578
+#: src/language/stats/reliability.q:579
 msgid "Part 1"
 msgstr ""
 
-#: src/language/stats/reliability.q:584 src/language/stats/reliability.q:595
+#: src/language/stats/reliability.q:585 src/language/stats/reliability.q:596
 msgid "N of Items"
 msgstr ""
 
-#: src/language/stats/reliability.q:589
+#: src/language/stats/reliability.q:590
 msgid "Part 2"
 msgstr ""
 
-#: src/language/stats/reliability.q:600
+#: src/language/stats/reliability.q:601
 msgid "Total N of Items"
 msgstr ""
 
-#: src/language/stats/reliability.q:603
+#: src/language/stats/reliability.q:604
 msgid "Correlation Between Forms"
 msgstr ""
 
-#: src/language/stats/reliability.q:607
+#: src/language/stats/reliability.q:608
 msgid "Spearman-Brown Coefficient"
 msgstr ""
 
-#: src/language/stats/reliability.q:610
+#: src/language/stats/reliability.q:611
 msgid "Equal Length"
 msgstr ""
 
-#: src/language/stats/reliability.q:613
+#: src/language/stats/reliability.q:614
 msgid "Unequal Length"
 msgstr ""
 
-#: src/language/stats/reliability.q:617
+#: src/language/stats/reliability.q:618
 msgid "Guttman Split-Half Coefficient"
 msgstr ""
 
-#: src/language/stats/reliability.q:714
+#: src/language/stats/reliability.q:715
 msgid "Excluded"
 msgstr ""
 
 #: src/language/stats/reliability.q:723
-#, c-format
-msgid "%%"
+msgid "%"
 msgstr ""
 
-#: src/language/stats/sign.c:90
+#: src/language/stats/sign.c:91
 msgid "Negative Differences"
 msgstr ""
 
-#: src/language/stats/sign.c:91
+#: src/language/stats/sign.c:92
 msgid "Positive Differences"
 msgstr ""
 
-#: src/language/stats/sign.c:92 src/language/stats/wilcoxon.c:245
+#: src/language/stats/sign.c:93 src/language/stats/wilcoxon.c:261
 msgid "Ties"
 msgstr ""
 
-#: src/language/stats/sign.c:133
+#: src/language/stats/sign.c:134 src/language/stats/wilcoxon.c:331
 msgid "Exact Sig. (2-tailed)"
 msgstr ""
 
-#: src/language/stats/sign.c:136
+#: src/language/stats/sign.c:137 src/language/stats/wilcoxon.c:332
 msgid "Exact Sig. (1-tailed)"
 msgstr ""
 
-#: src/language/stats/sign.c:139 src/language/stats/wilcoxon.c:319
+#: src/language/stats/sign.c:140 src/language/stats/wilcoxon.c:335
 msgid "Point Probability"
 msgstr ""
 
@@ -3850,161 +3775,148 @@ msgstr ""
 msgid "Variable %s specified twice in sort criteria."
 msgstr ""
 
-#: src/language/stats/t-test.q:280
-msgid "TESTVAL, GROUPS and PAIRS subcommands are mutually exclusive."
+#: src/language/stats/t-test.q:189
+msgid "Exactly one of TESTVAL, GROUPS and PAIRS subcommands must be specified."
 msgstr ""
 
-#: src/language/stats/t-test.q:298
-msgid "VARIABLES subcommand is not appropriate with PAIRS"
+#: src/language/stats/t-test.q:210
+msgid "VARIABLES subcommand may not be used with PAIRS."
 msgstr ""
 
-#: src/language/stats/t-test.q:336
+#: src/language/stats/t-test.q:229
 msgid "One or more VARIABLES must be specified."
 msgstr ""
 
-#: src/language/stats/t-test.q:386
-#, c-format
-msgid "Long string variable %s is not valid here."
-msgstr ""
-
-#: src/language/stats/t-test.q:406 src/language/stats/t-test.q:420
+#: src/language/stats/t-test.q:323
 msgid ""
 "When applying GROUPS to a string variable, two values must be specified."
 msgstr ""
 
-#: src/language/stats/t-test.q:518
+#: src/language/stats/t-test.q:394
 msgid "At least two variables must be specified on PAIRS."
 msgstr ""
 
-#: src/language/stats/t-test.q:698
+#: src/language/stats/t-test.q:504
 msgid "One-Sample Statistics"
 msgstr ""
 
-#: src/language/stats/t-test.q:703 src/language/stats/t-test.q:727
-#: src/language/stats/t-test.q:865
+#: src/language/stats/t-test.q:509 src/language/stats/t-test.q:529
+#: src/language/stats/t-test.q:628
 msgid "SE. Mean"
 msgstr ""
 
-#: src/language/stats/t-test.q:722
+#: src/language/stats/t-test.q:523
 msgid "Group Statistics"
 msgstr ""
 
-#: src/language/stats/t-test.q:859
+#: src/language/stats/t-test.q:622
 msgid "Paired Sample Statistics"
 msgstr ""
 
-#: src/language/stats/t-test.q:885 src/language/stats/t-test.q:1243
-#: src/language/stats/t-test.q:1442
+#: src/language/stats/t-test.q:642 src/language/stats/t-test.q:945
+#: src/language/stats/t-test.q:1119
 #, c-format
 msgid "Pair %d"
 msgstr ""
 
-#: src/language/stats/t-test.q:1011
+#: src/language/stats/t-test.q:738
 msgid "Independent Samples Test"
 msgstr ""
 
-#: src/language/stats/t-test.q:1019
+#: src/language/stats/t-test.q:746
 msgid "Levene's Test for Equality of Variances"
 msgstr ""
 
-#: src/language/stats/t-test.q:1021
+#: src/language/stats/t-test.q:748
 msgid "t-test for Equality of Means"
 msgstr ""
 
-#: src/language/stats/t-test.q:1024 src/language/stats/t-test.q:1427
+#: src/language/stats/t-test.q:751 src/language/stats/t-test.q:1107
 msgid "Sig."
 msgstr ""
 
-#: src/language/stats/t-test.q:1028 src/language/stats/t-test.q:1318
+#: src/language/stats/t-test.q:755 src/language/stats/t-test.q:1013
 msgid "Mean Difference"
 msgstr ""
 
-#: src/language/stats/t-test.q:1029
+#: src/language/stats/t-test.q:756
 msgid "Std. Error Difference"
 msgstr ""
 
-#: src/language/stats/t-test.q:1034 src/language/stats/t-test.q:1210
-#: src/language/stats/t-test.q:1310
+#: src/language/stats/t-test.q:761 src/language/stats/t-test.q:915
+#: src/language/stats/t-test.q:1005
 #, c-format
 msgid "%g%% Confidence Interval of the Difference"
 msgstr ""
 
-#: src/language/stats/t-test.q:1090
+#: src/language/stats/t-test.q:815
 msgid "Equal variances assumed"
 msgstr ""
 
-#: src/language/stats/t-test.q:1142
+#: src/language/stats/t-test.q:861
 msgid "Equal variances not assumed"
 msgstr ""
 
-#: src/language/stats/t-test.q:1200
+#: src/language/stats/t-test.q:905
 msgid "Paired Samples Test"
 msgstr ""
 
-#: src/language/stats/t-test.q:1203
+#: src/language/stats/t-test.q:908
 msgid "Paired Differences"
 msgstr ""
 
-#: src/language/stats/t-test.q:1215
+#: src/language/stats/t-test.q:920
 msgid "Std. Error Mean"
 msgstr ""
 
-#: src/language/stats/t-test.q:1299
+#: src/language/stats/t-test.q:994
 msgid "One-Sample Test"
 msgstr ""
 
-#: src/language/stats/t-test.q:1304
+#: src/language/stats/t-test.q:999
 #, c-format
 msgid "Test Value = %f"
 msgstr ""
 
-#: src/language/stats/t-test.q:1422
+#: src/language/stats/t-test.q:1102
 msgid "Paired Samples Correlations"
 msgstr ""
 
-#: src/language/stats/t-test.q:1426
+#: src/language/stats/t-test.q:1106
 msgid "Correlation"
 msgstr ""
 
-#: src/language/stats/t-test.q:1445
+#: src/language/stats/t-test.q:1121
 #, c-format
 msgid "%s & %s"
 msgstr ""
 
-#: src/language/stats/wilcoxon.c:216
+#: src/language/stats/wilcoxon.c:232
 msgid "Ranks"
 msgstr ""
 
-#: src/language/stats/wilcoxon.c:230
+#: src/language/stats/wilcoxon.c:246
 msgid "Mean Rank"
 msgstr ""
 
-#: src/language/stats/wilcoxon.c:231
+#: src/language/stats/wilcoxon.c:247
 msgid "Sum of Ranks"
 msgstr ""
 
-#: src/language/stats/wilcoxon.c:243
+#: src/language/stats/wilcoxon.c:259
 msgid "Negative Ranks"
 msgstr ""
 
-#: src/language/stats/wilcoxon.c:244
+#: src/language/stats/wilcoxon.c:260
 msgid "Positive Ranks"
 msgstr ""
 
-#: src/language/stats/wilcoxon.c:310
+#: src/language/stats/wilcoxon.c:326
 msgid "Z"
 msgstr ""
 
-#: src/language/stats/wilcoxon.c:311
-msgid "Asymp. Sig (2-tailed)"
-msgstr ""
-
-#: src/language/stats/wilcoxon.c:315
-msgid "Exact Sig (2-tailed)"
-msgstr ""
-
-#: src/language/stats/wilcoxon.c:316
-msgid "Exact Sig (1-tailed)"
+#: src/language/stats/wilcoxon.c:327
+msgid "Asymp. Sig. (2-tailed)"
 msgstr ""
 
 #: src/language/syntax-file.c:88
@@ -4017,34 +3929,16 @@ msgstr ""
 msgid "Opening `%s': %s."
 msgstr ""
 
-#: src/language/syntax-file.c:106
+#: src/language/syntax-file.c:107
 #, c-format
 msgid "Reading `%s': %s."
 msgstr ""
 
-#: src/language/syntax-file.c:126
+#: src/language/syntax-file.c:127
 #, c-format
 msgid "Closing `%s': %s."
 msgstr ""
 
-#: src/language/tests/check-model.q:138
-msgid "PATH and SEARCH subcommands are mutually exclusive.  Ignoring PATH."
-msgstr ""
-
-#: src/language/tests/check-model.q:156
-msgid "At least one value must be specified on PATH."
-msgstr ""
-
-#: src/language/tests/check-model.q:167
-#, c-format
-msgid "Hash bits adjusted to %d."
-msgstr ""
-
-#: src/language/tests/check-model.q:208
-#, c-format
-msgid "error opening \"%s\" for writing"
-msgstr ""
-
 #: src/language/tests/float-format.c:124
 #, c-format
 msgid "%zu-byte string needed but %zu-byte string supplied."
@@ -4174,98 +4068,45 @@ msgid ""
 "is of type string."
 msgstr ""
 
-#: src/language/utilities/set.q:522
-msgid "BLANKS is SYSMIS."
-msgstr ""
-
-#: src/language/utilities/set.q:524
-#, c-format
-msgid "BLANKS is %g."
+#: src/language/utilities/set.q:668
+msgid "ISL (32-bit IEEE 754 single, little-endian)"
 msgstr ""
 
-#: src/language/utilities/set.q:559
-#, c-format
-msgid "%s is \"%s\"."
+#: src/language/utilities/set.q:671
+msgid "ISB (32-bit IEEE 754 single, big-endian)"
 msgstr ""
 
-#: src/language/utilities/set.q:595
-#, c-format
-msgid "DECIMAL is \"%c\"."
-msgstr ""
-
-#: src/language/utilities/set.q:601
-#, c-format
-msgid "ENDCMD is \"%c\"."
+#: src/language/utilities/set.q:674
+msgid "IDL (64-bit IEEE 754 double, little-endian)"
 msgstr ""
 
-#: src/language/utilities/set.q:609
-#, c-format
-msgid "ERRORS is \"%s\"."
+#: src/language/utilities/set.q:677
+msgid "IDB (64-bit IEEE 754 double, big-endian)"
 msgstr ""
 
-#: src/language/utilities/set.q:620
-#, c-format
-msgid "FORMAT is %s."
+#: src/language/utilities/set.q:681
+msgid "VF (32-bit VAX F, VAX-endian)"
 msgstr ""
 
-#: src/language/utilities/set.q:626
-#, c-format
-msgid "LENGTH is %d."
+#: src/language/utilities/set.q:684
+msgid "VD (64-bit VAX D, VAX-endian)"
 msgstr ""
 
-#: src/language/utilities/set.q:632
-#, c-format
-msgid "LOCALE is %s"
+#: src/language/utilities/set.q:687
+msgid "VG (64-bit VAX G, VAX-endian)"
 msgstr ""
 
-#: src/language/utilities/set.q:638
-#, c-format
-msgid "MXERRS is %d."
+#: src/language/utilities/set.q:691
+msgid "ZS (32-bit IBM Z hexadecimal short, big-endian)"
 msgstr ""
 
-#: src/language/utilities/set.q:644
-#, c-format
-msgid "MXLOOPS is %d."
+#: src/language/utilities/set.q:694
+msgid "ZL (64-bit IBM Z hexadecimal long, big-endian)"
 msgstr ""
 
-#: src/language/utilities/set.q:650
+#: src/language/utilities/set.q:793
 #, c-format
-msgid "MXWARNS is %d."
-msgstr ""
-
-#: src/language/utilities/set.q:657 src/language/utilities/set.q:708
-#, c-format
-msgid "%s is %s (%s)."
-msgstr ""
-
-#: src/language/utilities/set.q:729
-msgid "SCOMPRESSION is ON."
-msgstr ""
-
-#: src/language/utilities/set.q:731
-msgid "SCOMPRESSION is OFF."
-msgstr ""
-
-#: src/language/utilities/set.q:738
-msgid "UNDEFINED is WARN."
-msgstr ""
-
-#: src/language/utilities/set.q:740
-msgid "UNDEFINED is NOWARN."
-msgstr ""
-
-#: src/language/utilities/set.q:748
-msgid "WEIGHT is off."
-msgstr ""
-
-#: src/language/utilities/set.q:750
-#, c-format
-msgid "WEIGHT is variable %s."
-msgstr ""
-
-#: src/language/utilities/set.q:768
-#, c-format
-msgid "WIDTH is %d."
+msgid "%s is %s."
 msgstr ""
 
 #: src/language/utilities/title.c:68
@@ -4291,7 +4132,7 @@ msgid ""
 "When executing COMPUTE: %g is not a valid value as an index into vector %s."
 msgstr ""
 
-#: src/language/xforms/compute.c:354
+#: src/language/xforms/compute.c:353
 #, c-format
 msgid "There is no vector named %s."
 msgstr ""
@@ -4300,44 +4141,44 @@ msgstr ""
 msgid "Destination cannot be a string variable."
 msgstr ""
 
-#: src/language/xforms/recode.c:251
+#: 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:272
+#: src/language/xforms/recode.c:266
 msgid "CONVERT requires string input values and numeric output values."
 msgstr ""
 
-#: src/language/xforms/recode.c:329
+#: src/language/xforms/recode.c:321
 msgid "THRU is not allowed with string variables."
 msgstr ""
 
-#: src/language/xforms/recode.c:407
+#: src/language/xforms/recode.c:400
 msgid "expecting output value"
 msgstr ""
 
-#: src/language/xforms/recode.c:456
+#: src/language/xforms/recode.c:457
 #, c-format
 msgid ""
 "%zu variable(s) cannot be recoded into %zu variable(s).  Specify the same "
 "number of variables as source and target variables."
 msgstr ""
 
-#: src/language/xforms/recode.c:471
+#: src/language/xforms/recode.c:472
 #, 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:487
+#: src/language/xforms/recode.c:488
 #, c-format
 msgid "INTO is required with %s input values and %s output values."
 msgstr ""
 
-#: src/language/xforms/recode.c:500
+#: src/language/xforms/recode.c:501
 #, c-format
 msgid "Type mismatch.  Cannot store %s data in %s variable %s."
 msgstr ""
@@ -4368,6 +4209,31 @@ msgstr ""
 msgid "hash table:"
 msgstr ""
 
+#: src/libpspp/tmpfile.c:55
+#, c-format
+msgid "failed to create temporary file"
+msgstr ""
+
+#: src/libpspp/tmpfile.c:96
+#, c-format
+msgid "seeking in temporary file"
+msgstr ""
+
+#: src/libpspp/tmpfile.c:115
+#, c-format
+msgid "reading temporary file"
+msgstr ""
+
+#: src/libpspp/tmpfile.c:117
+#, c-format
+msgid "unexpected end of file reading temporary file"
+msgstr ""
+
+#: src/libpspp/tmpfile.c:136
+#, c-format
+msgid "writing to temporary file"
+msgstr ""
+
 #: src/math/percentiles.c:35
 msgid "HAverage"
 msgstr ""
@@ -4790,6 +4656,14 @@ msgid ""
 "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n"
 msgstr ""
 
+#: src/ui/gui/about.c:64
+msgid "A program for the analysis of sampled data"
+msgstr ""
+
+#: src/ui/gui/about.c:73
+msgid "translator-credits"
+msgstr "John Darrington"
+
 #: src/ui/gui/comments-dialog.c:58
 #, c-format
 msgid "Column Number: %d"
@@ -4829,7 +4703,7 @@ msgstr ""
 
 #: src/ui/gui/crosstabs-dialog.c:53 src/ui/gui/crosstabs-dialog.c:64
 #: src/ui/gui/crosstabs-dialog.c:99 src/ui/gui/crosstabs-dialog.c:107
-#: src/ui/gui/psppire-var-store.c:559 src/ui/gui/var-display.c:16
+#: src/ui/gui/psppire-var-store.c:568 src/ui/gui/var-display.c:16
 #: src/ui/gui/variable-info-dialog.c:40
 msgid "None"
 msgstr ""
@@ -4883,7 +4757,7 @@ msgstr ""
 msgid "Pivot"
 msgstr ""
 
-#: src/ui/gui/crosstabs.glade:253 src/ui/gui/psppire.glade:781
+#: src/ui/gui/crosstabs.glade:253 src/ui/gui/psppire.glade:756
 msgid "Ascending"
 msgstr ""
 
@@ -4958,7 +4832,7 @@ msgid "_Edit"
 msgstr ""
 
 #: src/ui/gui/data-editor.glade:174 src/ui/gui/data-editor.glade:843
-#: src/ui/gui/psppire-data-window.c:844 src/ui/gui/psppire-data-window.c:934
+#: src/ui/gui/psppire-data-window.c:843 src/ui/gui/psppire-data-window.c:933
 msgid "Insert Variable"
 msgstr ""
 
@@ -5155,7 +5029,7 @@ msgstr ""
 msgid "Open"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:712 src/ui/gui/psppire-data-window.c:582
+#: src/ui/gui/data-editor.glade:712 src/ui/gui/psppire-data-window.c:581
 msgid "Save"
 msgstr ""
 
@@ -5183,7 +5057,7 @@ msgstr ""
 msgid "Find"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:831 src/ui/gui/psppire-data-window.c:898
+#: src/ui/gui/data-editor.glade:831 src/ui/gui/psppire-data-window.c:897
 msgid "Insert Case"
 msgstr ""
 
@@ -5298,7 +5172,7 @@ msgstr ""
 msgid "Missing Values"
 msgstr ""
 
-#: src/ui/gui/find-dialog.c:657
+#: src/ui/gui/find-dialog.c:658
 #, c-format
 msgid "Bad regular expression: %s"
 msgstr ""
@@ -5344,7 +5218,7 @@ msgstr ""
 msgid "Standard error of the kurtosis"
 msgstr ""
 
-#: src/ui/gui/frequencies.glade:98 src/ui/gui/psppire.glade:277
+#: src/ui/gui/frequencies.glade:98 src/ui/gui/psppire.glade:252
 #: src/ui/gui/rank.glade:103
 msgid "Variable(s):"
 msgstr ""
@@ -5585,10 +5459,17 @@ msgstr ""
 msgid "Variable View"
 msgstr ""
 
-#: src/ui/gui/psppire-data-store.c:746
+#: src/ui/gui/psppire-data-store.c:761
 msgid "var"
 msgstr ""
 
+#: src/ui/gui/psppire-data-store.c:771 src/ui/gui/psppire-var-store.c:655
+#: src/ui/gui/psppire-var-store.c:665 src/ui/gui/psppire-var-store.c:675
+#: src/ui/gui/psppire-var-store.c:786
+#, c-format
+msgid "%d"
+msgstr ""
+
 #: src/ui/gui/psppire-data-window.c:213
 msgid "Transformations Pending"
 msgstr ""
@@ -5619,179 +5500,179 @@ msgstr ""
 msgid "Weight by %s"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:387 src/ui/gui/psppire-data-window.c:590
+#: src/ui/gui/psppire-data-window.c:387 src/ui/gui/psppire-data-window.c:589
 msgid "System Files (*.sav)"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:393 src/ui/gui/psppire-data-window.c:596
+#: src/ui/gui/psppire-data-window.c:393 src/ui/gui/psppire-data-window.c:595
 msgid "Portable Files (*.por) "
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:399 src/ui/gui/psppire-data-window.c:602
+#: src/ui/gui/psppire-data-window.c:399 src/ui/gui/psppire-data-window.c:601
 #: src/ui/gui/psppire-syntax-window.c:298
 #: src/ui/gui/psppire-syntax-window.c:385
 msgid "All Files"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:610
+#: src/ui/gui/psppire-data-window.c:609
 msgid "System File"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:615
+#: src/ui/gui/psppire-data-window.c:614
 msgid "Portable File"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:765
+#: src/ui/gui/psppire-data-window.c:764
 msgid "Font Selection"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:833
+#: src/ui/gui/psppire-data-window.c:832
 msgid "Sort Ascending"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:839
+#: src/ui/gui/psppire-data-window.c:838
 msgid "Sort Descending"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:847 src/ui/gui/psppire-data-window.c:901
-#: src/ui/gui/psppire-data-window.c:937 src/ui/gui/psppire-data-window.c:1302
-#: src/ui/gui/psppire-data-window.c:1320
+#: src/ui/gui/psppire-data-window.c:846 src/ui/gui/psppire-data-window.c:900
+#: src/ui/gui/psppire-data-window.c:936 src/ui/gui/psppire-data-window.c:1301
+#: src/ui/gui/psppire-data-window.c:1319
 msgid "Clear"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1179
+#: src/ui/gui/psppire-data-window.c:1178
 msgid "Open a data file"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1197
+#: src/ui/gui/psppire-data-window.c:1196
 msgid "New data file"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1212
+#: src/ui/gui/psppire-data-window.c:1211
 msgid "Import text data file"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1228 src/ui/gui/psppire-data-window.c:1245
+#: src/ui/gui/psppire-data-window.c:1227 src/ui/gui/psppire-data-window.c:1244
 msgid "Save data to file"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1244
+#: src/ui/gui/psppire-data-window.c:1243
 msgid "Save As"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1283
+#: src/ui/gui/psppire-data-window.c:1282
 msgid "Show/hide value labels"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1303
+#: src/ui/gui/psppire-data-window.c:1302
 msgid "Delete the cases at the selected position(s)"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1321
+#: src/ui/gui/psppire-data-window.c:1320
 msgid "Delete the variables at the selected position(s)"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1339
+#: src/ui/gui/psppire-data-window.c:1338
 msgid "Create a new variable at the current position"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1354
+#: src/ui/gui/psppire-data-window.c:1353
 msgid "Create a new case at the current position"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1370
+#: src/ui/gui/psppire-data-window.c:1369
 msgid "Jump to a Case in the Data Sheet"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1386
+#: src/ui/gui/psppire-data-window.c:1385
 msgid "Weight cases by variable"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1400
+#: src/ui/gui/psppire-data-window.c:1399
 msgid "Transpose the cases with the variables"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1414
+#: src/ui/gui/psppire-data-window.c:1413
 msgid "Split the active file"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1429
+#: src/ui/gui/psppire-data-window.c:1428
 msgid "Sort cases in the active file"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1443
+#: src/ui/gui/psppire-data-window.c:1442
 msgid "Select cases from the active file"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1457
+#: src/ui/gui/psppire-data-window.c:1456
 msgid "Compute new values for a variable"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1471
+#: src/ui/gui/psppire-data-window.c:1470
 msgid "Perform one way analysis of variance"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1486
+#: src/ui/gui/psppire-data-window.c:1485
 msgid "Calculate T Test for samples from independent groups"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1500
+#: src/ui/gui/psppire-data-window.c:1499
 msgid "Calculate T Test for paired samples"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1514
+#: src/ui/gui/psppire-data-window.c:1513
 msgid "Calculate T Test for sample from a single distribution"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1529
+#: src/ui/gui/psppire-data-window.c:1528
 msgid "Commentary text for the data file"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1555
+#: src/ui/gui/psppire-data-window.c:1554
 msgid "Rank Cases"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1569
+#: src/ui/gui/psppire-data-window.c:1568
 msgid "Recode values into the same variables"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1583
+#: src/ui/gui/psppire-data-window.c:1582
 msgid "Recode values into different variables"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1597
+#: src/ui/gui/psppire-data-window.c:1596
 msgid "Jump to variable"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1610
+#: src/ui/gui/psppire-data-window.c:1609
 msgid "Calculate descriptive statistics (mean, variance, ...)"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1624
+#: src/ui/gui/psppire-data-window.c:1623
 msgid "Generate frequency statistics"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1638
+#: src/ui/gui/psppire-data-window.c:1637
 msgid "Generate crosstabulations"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1653
+#: src/ui/gui/psppire-data-window.c:1652
 msgid "Examine Data by Factors"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1667
+#: src/ui/gui/psppire-data-window.c:1666
 msgid "Estimate parameters of the linear model"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1681 src/ui/gui/reliability.glade:7
+#: src/ui/gui/psppire-data-window.c:1680 src/ui/gui/reliability.glade:7
 msgid "Reliability Analysis"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1844
+#: src/ui/gui/psppire-data-window.c:1843
 msgid "Split the window vertically and horizontally"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1886
+#: src/ui/gui/psppire-data-window.c:1885
 msgid "Data Editor"
 msgstr ""
 
@@ -5811,183 +5692,178 @@ msgstr ""
 msgid "Prefer variable labels"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:10
-msgid ""
-"This is beta status software.  Please report bugs to bug-gnu-pspp@gnu.org"
-msgstr ""
-
-#: src/ui/gui/psppire.glade:72 src/ui/gui/psppire.glade:155
+#: src/ui/gui/psppire.glade:47 src/ui/gui/psppire.glade:130
 #: src/ui/gui/weight-cases-dialog.c:79
 msgid "Do not weight cases"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:83
+#: src/ui/gui/psppire.glade:58
 msgid "Weight cases by"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:108
+#: src/ui/gui/psppire.glade:83
 msgid "Frequency Variable"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:148
+#: src/ui/gui/psppire.glade:123
 msgid "Current Status: "
 msgstr ""
 
-#: src/ui/gui/psppire.glade:244
+#: src/ui/gui/psppire.glade:219
 msgid "Name Variable:"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:429
+#: src/ui/gui/psppire.glade:404
 msgid "Analyze all cases.  Do not create groups."
 msgstr "Analyse all cases.  Do not create groups."
 
-#: src/ui/gui/psppire.glade:440
+#: src/ui/gui/psppire.glade:415
 msgid "Compare groups."
 msgstr ""
 
-#: src/ui/gui/psppire.glade:454
+#: src/ui/gui/psppire.glade:429
 msgid "Organize output by groups."
 msgstr "Organise output by groups."
 
-#: src/ui/gui/psppire.glade:502
+#: src/ui/gui/psppire.glade:477
 msgid "Groups based on:"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:565
+#: src/ui/gui/psppire.glade:540
 msgid "Sort the file by grouping variables."
 msgstr ""
 
-#: src/ui/gui/psppire.glade:577
+#: src/ui/gui/psppire.glade:552
 msgid "File is already sorted."
 msgstr ""
 
-#: src/ui/gui/psppire.glade:622
+#: src/ui/gui/psppire.glade:597
 msgid "Current Status : "
 msgstr ""
 
-#: src/ui/gui/psppire.glade:630
+#: src/ui/gui/psppire.glade:605
 msgid "Analysis by groups is off"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:729
+#: src/ui/gui/psppire.glade:704
 msgid "Sort by:"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:792
+#: src/ui/gui/psppire.glade:767
 msgid "Descending"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:809
+#: src/ui/gui/psppire.glade:784
 msgid "Sort Order"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:878
+#: src/ui/gui/psppire.glade:853
 msgid "Target Variable:"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:909
+#: src/ui/gui/psppire.glade:884
 msgid "Type & Label"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:949
+#: src/ui/gui/psppire.glade:924
 msgid "="
 msgstr ""
 
-#: src/ui/gui/psppire.glade:995
+#: src/ui/gui/psppire.glade:970
 msgid "Numeric Expressions:"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:1049
+#: src/ui/gui/psppire.glade:1024
 msgid "Functions:"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:1112 src/ui/gui/psppire.glade:1516
+#: src/ui/gui/psppire.glade:1087 src/ui/gui/psppire.glade:1491
 #: src/ui/gui/recode.glade:731
 msgid "If..."
 msgstr ""
 
-#: src/ui/gui/psppire.glade:1345
+#: src/ui/gui/psppire.glade:1320
 msgid "Use filter variable"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:1398
+#: src/ui/gui/psppire.glade:1373
 msgid "Based on time or case range"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:1411
+#: src/ui/gui/psppire.glade:1386
 msgid "Range..."
 msgstr ""
 
-#: src/ui/gui/psppire.glade:1450
+#: src/ui/gui/psppire.glade:1425
 msgid "Random sample of cases"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:1464
+#: src/ui/gui/psppire.glade:1439
 msgid "Sample..."
 msgstr ""
 
-#: src/ui/gui/psppire.glade:1502
+#: src/ui/gui/psppire.glade:1477
 msgid "If condition is satisfied"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:1551
+#: src/ui/gui/psppire.glade:1526
 msgid "All Cases"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:1566
+#: src/ui/gui/psppire.glade:1541
 msgid "Select"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:1595
+#: src/ui/gui/psppire.glade:1570
 msgid "Filtered"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:1606
+#: src/ui/gui/psppire.glade:1581
 msgid "Deleted"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:1624
+#: src/ui/gui/psppire.glade:1599
 msgid "Unselected Cases Are"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:1689
+#: src/ui/gui/psppire.glade:1664
 msgid "Comments:"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:1731
+#: src/ui/gui/psppire.glade:1706
 msgid "Display comments in output"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:1746
+#: src/ui/gui/psppire.glade:1721
 msgid "Column Number: 0"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:1829
+#: src/ui/gui/psppire.glade:1804
 msgid "First case"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:1842
+#: src/ui/gui/psppire.glade:1817
 msgid "Last case"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:1855
+#: src/ui/gui/psppire.glade:1830
 msgid "Observation"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:1919
+#: src/ui/gui/psppire.glade:1894
 msgid "Use expression as label"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:2045 src/ui/gui/psppire-var-sheet.c:540
-#: src/ui/gui/psppire-var-store.c:786
+#: src/ui/gui/psppire.glade:2020 src/ui/gui/psppire-var-sheet.c:529
+#: src/ui/gui/psppire-var-store.c:795
 msgid "Width"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:2175
+#: src/ui/gui/psppire.glade:2150
 msgid "Goto Case Number:"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:2312
+#: src/ui/gui/psppire.glade:2287
 msgid "Sample Size"
 msgstr ""
 
@@ -6022,47 +5898,47 @@ msgstr ""
 msgid "Cannot load syntax file '%s'"
 msgstr ""
 
-#: src/ui/gui/psppire-var-sheet.c:538 src/ui/gui/psppire-var-store.c:784
+#: src/ui/gui/psppire-var-sheet.c:527 src/ui/gui/psppire-var-store.c:793
 msgid "Name"
 msgstr ""
 
-#: src/ui/gui/psppire-var-sheet.c:541 src/ui/gui/psppire-var-store.c:787
+#: src/ui/gui/psppire-var-sheet.c:530 src/ui/gui/psppire-var-store.c:796
 msgid "Decimals"
 msgstr ""
 
-#: src/ui/gui/psppire-var-sheet.c:543 src/ui/gui/psppire-var-store.c:789
+#: src/ui/gui/psppire-var-sheet.c:532 src/ui/gui/psppire-var-store.c:798
 msgid "Values"
 msgstr ""
 
-#: src/ui/gui/psppire-var-sheet.c:546 src/ui/gui/psppire-var-store.c:792
+#: src/ui/gui/psppire-var-sheet.c:535 src/ui/gui/psppire-var-store.c:801
 msgid "Align"
 msgstr ""
 
-#: src/ui/gui/psppire-var-sheet.c:547 src/ui/gui/psppire-var-store.c:793
+#: src/ui/gui/psppire-var-sheet.c:536 src/ui/gui/psppire-var-store.c:802
 msgid "Measure"
 msgstr ""
 
-#: src/ui/gui/psppire-var-store.c:569 src/ui/gui/var-sheet-dialogs.glade:43
+#: src/ui/gui/psppire-var-store.c:578 src/ui/gui/var-sheet-dialogs.glade:43
 msgid "Comma"
 msgstr ""
 
-#: src/ui/gui/psppire-var-store.c:570 src/ui/gui/var-sheet-dialogs.glade:59
+#: src/ui/gui/psppire-var-store.c:579 src/ui/gui/var-sheet-dialogs.glade:59
 msgid "Dot"
 msgstr ""
 
-#: src/ui/gui/psppire-var-store.c:571
+#: src/ui/gui/psppire-var-store.c:580
 msgid "Scientific"
 msgstr ""
 
-#: src/ui/gui/psppire-var-store.c:572 src/ui/gui/var-sheet-dialogs.glade:91
+#: src/ui/gui/psppire-var-store.c:581 src/ui/gui/var-sheet-dialogs.glade:91
 msgid "Date"
 msgstr ""
 
-#: src/ui/gui/psppire-var-store.c:573 src/ui/gui/var-sheet-dialogs.glade:107
+#: src/ui/gui/psppire-var-store.c:582 src/ui/gui/var-sheet-dialogs.glade:107
 msgid "Dollar"
 msgstr ""
 
-#: src/ui/gui/psppire-var-store.c:574
+#: src/ui/gui/psppire-var-store.c:583
 msgid "Custom"
 msgstr ""
 
@@ -6652,11 +6528,11 @@ msgstr ""
 msgid "Measurement Level: %s\n"
 msgstr ""
 
-#: src/ui/gui/variable-info-dialog.c:124
+#: src/ui/gui/variable-info-dialog.c:125
 msgid "Value Labels:\n"
 msgstr ""
 
-#: src/ui/gui/variable-info-dialog.c:137
+#: src/ui/gui/variable-info-dialog.c:138
 #, c-format
 msgid "%s %s\n"
 msgstr ""
index 1c3163be3dfe315a8dbd12dee5b90322bd9e9ebd..db3c9d3e6186c4b8994e8f2c0cabdd0c49ab8074 100644 (file)
--- a/po/nl.po
+++ b/po/nl.po
@@ -33,7 +33,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: nl\n"
 "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
-"POT-Creation-Date: 2009-05-16 07:00+0800\n"
+"POT-Creation-Date: 2009-07-17 15:23+0800\n"
 "PO-Revision-Date: 2009-05-15 18:24+0200\n"
 "Last-Translator:  <pspp@sjpaes.nl>\n"
 "Language-Team: Dutch\n"
@@ -80,81 +80,56 @@ msgstr ""
 "Ten minste een case in de gelezen data heeft een gewicht waarde 'user-"
 "missing, system-missing, zero, of negatief.  Deze case(s) zijn genegeerd."
 
-#: src/data/case-tmpfile.c:57
-#, c-format
-msgid "failed to create temporary file"
-msgstr "aanmaken van een tijdelijk bestand is mislukt"
-
-#: src/data/case-tmpfile.c:131
-#, c-format
-msgid "seeking in temporary file"
-msgstr "zoeken in tijdelijk bestand"
-
-#: src/data/case-tmpfile.c:153
-#, c-format
-msgid "reading temporary file"
-msgstr "lezen tijdelijk bestand"
-
-#: src/data/case-tmpfile.c:155
-#, c-format
-msgid "unexpected end of file reading temporary file"
-msgstr "onverwacht einde bestand bij het lezen van tijdelijk bestand"
-
-#: src/data/case-tmpfile.c:175
-#, c-format
-msgid "writing to temporary file"
-msgstr "schrijven naar tijdelijk bestand"
-
-#: src/data/data-in.c:262 src/data/data-in.c:452
+#: src/data/data-in.c:263 src/data/data-in.c:453
 msgid "Field contents are not numeric."
 msgstr "Veld inhoud is niet numeriek."
 
-#: src/data/data-in.c:264 src/data/data-in.c:454
+#: src/data/data-in.c:265 src/data/data-in.c:455
 msgid "Number followed by garbage."
 msgstr "Nummer gevolgd door rommel."
 
-#: src/data/data-in.c:275
+#: src/data/data-in.c:276
 msgid "Invalid numeric syntax."
 msgstr "Ongeldige numerieke syntax."
 
-#: src/data/data-in.c:284 src/data/data-in.c:467
+#: src/data/data-in.c:285 src/data/data-in.c:468
 msgid "Too-large number set to system-missing."
 msgstr "Te groot getal, is op system-missing gezet."
 
-#: src/data/data-in.c:289 src/data/data-in.c:472
+#: src/data/data-in.c:290 src/data/data-in.c:473
 msgid "Too-small number set to zero."
 msgstr "Te klein getal, is op nul gezet."
 
-#: src/data/data-in.c:315
+#: src/data/data-in.c:316
 msgid "All characters in field must be digits."
 msgstr "Alle karakters in veld moeten cijfers zijn."
 
-#: src/data/data-in.c:338
+#: src/data/data-in.c:339
 msgid "Unrecognized character in field."
 msgstr "Onherkenbaar karakter in veld."
 
-#: src/data/data-in.c:362 src/data/data-in.c:636
+#: src/data/data-in.c:363 src/data/data-in.c:638
 msgid "Field must have even length."
 msgstr "Veld moet een even lengte hebben."
 
-#: src/data/data-in.c:367 src/data/data-in.c:647
+#: src/data/data-in.c:368 src/data/data-in.c:649
 msgid "Field must contain only hex digits."
 msgstr "Veld mag alleen hex cijfers bevatten."
 
-#: src/data/data-in.c:686 src/data/data-in.c:733
+#: src/data/data-in.c:688 src/data/data-in.c:735
 msgid "Syntax error in date field."
 msgstr "Syntax fout in datum veld."
 
-#: src/data/data-in.c:702
+#: src/data/data-in.c:704
 #, c-format
 msgid "Day (%ld) must be between 1 and 31."
 msgstr "Dag (%ld) moet tussen 1 en 31 zijn."
 
-#: src/data/data-in.c:749
+#: src/data/data-in.c:751
 msgid "Delimiter expected between fields in date."
 msgstr "Veldscheider verwacht tussen velden in datum."
 
-#: src/data/data-in.c:823
+#: src/data/data-in.c:825
 msgid ""
 "Unrecognized month format.  Months may be specified as Arabic or Roman "
 "numerals or as at least 3 letters of their English names."
@@ -163,45 +138,45 @@ msgstr ""
 "of Romeins numeriek of als tenminste de eerste 3 letters van hun Engelse "
 "naam."
 
-#: src/data/data-in.c:850
+#: src/data/data-in.c:852
 #, c-format
 msgid "Year (%ld) must be between 1582 and 19999."
 msgstr "Jaar (%ld) moet tussen 1582 en 19999 zijn."
 
-#: src/data/data-in.c:862
+#: src/data/data-in.c:864
 #, c-format
 msgid "Trailing garbage \"%.*s\" following date."
 msgstr "Afsluitende rommel \"%.*s\" achter datum."
 
-#: src/data/data-in.c:878
+#: src/data/data-in.c:880
 msgid "Julian day must have exactly three digits."
 msgstr "Juliaanse datum moet bestaan uit precies 3 cijfers."
 
-#: src/data/data-in.c:883
+#: src/data/data-in.c:885
 #, c-format
 msgid "Julian day (%ld) must be between 1 and 366."
 msgstr "Juliaanse dag (%ld) moet tussen 1 en 366 zijn."
 
-#: src/data/data-in.c:907
+#: src/data/data-in.c:909
 #, c-format
 msgid "Quarter (%ld) must be between 1 and 4."
 msgstr "Kwartaal (%ld) moet tussen 1 en 4 zijn."
 
-#: src/data/data-in.c:927
+#: src/data/data-in.c:929
 #, c-format
 msgid "Week (%ld) must be between 1 and 53."
 msgstr "Week (%ld) moet tussen 1 en 53 zijn."
 
-#: src/data/data-in.c:940
+#: src/data/data-in.c:942
 msgid "Delimiter expected between fields in time."
 msgstr "Veldscheider verwacht tussen velden in tijd."
 
-#: src/data/data-in.c:960
+#: src/data/data-in.c:962
 #, c-format
 msgid "Minute (%ld) must be between 0 and 59."
 msgstr "Minuut (%ld) moet tussen 0 en 59 zijn."
 
-#: src/data/data-in.c:1000
+#: src/data/data-in.c:1002
 msgid ""
 "Unrecognized weekday name.  At least the first two letters of an English "
 "weekday name must be specified."
@@ -209,32 +184,32 @@ msgstr ""
 "Niet herkende weekdag naam.  Tenminste de eerste 2 letters van een Engelse "
 "weekdag naam moeten opgegeven worden."
 
-#: src/data/data-in.c:1138
+#: src/data/data-in.c:1140
 #, c-format
 msgid "`%c' expected in date field."
 msgstr "`%c' verwacht in datum veld."
 
-#: src/data/data-in.c:1179
+#: src/data/data-in.c:1181
 #, c-format
 msgid "column %d"
 msgstr "kolom %d"
 
-#: src/data/data-in.c:1181
+#: src/data/data-in.c:1183
 #, c-format
 msgid "columns %d-%d"
 msgstr "kolommen %d-%d"
 
-#: src/data/data-in.c:1185
+#: src/data/data-in.c:1187
 #, c-format
 msgid "%s field) "
 msgstr "%s veld) "
 
-#: src/data/data-out.c:446
+#: src/data/data-out.c:449
 #, c-format
 msgid "Weekday number %f is not between 1 and 7."
 msgstr "Weekdag nummer %f is niet tussen 1 en 7."
 
-#: src/data/data-out.c:467
+#: src/data/data-out.c:470
 #, c-format
 msgid "Month number %f is not between 1 and 12."
 msgstr "Maand nummer %f is niet tussen 1 en 12."
@@ -251,7 +226,7 @@ msgstr "systeem"
 msgid "scratch"
 msgstr ""
 
-#: src/data/dictionary.c:926
+#: src/data/dictionary.c:940
 msgid ""
 "At least one case in the data file had a weight value that was user-missing, "
 "system-missing, zero, or negative.  These case(s) were ignored."
@@ -259,7 +234,7 @@ msgstr ""
 "Op zijn minst een case in het data bestand heeft een gewicht waarde user-"
 "missing, system-missing, nul, of negatief.  Deze case(s) zijn genegeerd."
 
-#: src/data/dictionary.c:1228
+#: src/data/dictionary.c:1263
 #, c-format
 msgid "Truncating document line to %d bytes."
 msgstr "Document regel afgekapt tot %d bytes."
@@ -369,33 +344,33 @@ msgstr[1] ""
 msgid "%s variables are not compatible with %s format %s."
 msgstr "%s variabelen zijn niet compatibel met %s formaat %s."
 
-#: src/data/format.c:327 src/data/sys-file-reader.c:657
-#: src/ui/gui/psppire.glade:2034 src/ui/gui/psppire-var-store.c:575
+#: src/data/format.c:327 src/data/sys-file-reader.c:663
+#: src/ui/gui/psppire.glade:2009 src/ui/gui/psppire-var-store.c:584
 #: src/ui/gui/var-sheet-dialogs.glade:139
 msgid "String"
 msgstr ""
 
-#: src/data/format.c:327 src/data/sys-file-reader.c:657
-#: src/ui/gui/psppire.glade:2109 src/ui/gui/psppire-var-store.c:568
+#: src/data/format.c:327 src/data/sys-file-reader.c:663
+#: src/ui/gui/psppire.glade:2084 src/ui/gui/psppire-var-store.c:577
 #: src/ui/gui/var-sheet-dialogs.glade:28
 msgid "Numeric"
 msgstr "Numeriek"
 
-#: src/data/format.c:328 src/data/sys-file-reader.c:1214
-#: src/data/sys-file-reader.c:1216
+#: src/data/format.c:328 src/data/sys-file-reader.c:1228
+#: src/data/sys-file-reader.c:1230
 #: src/language/dictionary/apply-dictionary.c:78
 #: src/language/dictionary/apply-dictionary.c:79
-#: src/language/xforms/recode.c:489 src/language/xforms/recode.c:490
-#: src/language/xforms/recode.c:502 src/language/xforms/recode.c:503
+#: src/language/xforms/recode.c:490 src/language/xforms/recode.c:491
+#: src/language/xforms/recode.c:503 src/language/xforms/recode.c:504
 msgid "numeric"
 msgstr "numeriek"
 
-#: src/data/format.c:328 src/data/sys-file-reader.c:1214
-#: src/data/sys-file-reader.c:1216
+#: src/data/format.c:328 src/data/sys-file-reader.c:1228
+#: src/data/sys-file-reader.c:1230
 #: src/language/dictionary/apply-dictionary.c:78
 #: src/language/dictionary/apply-dictionary.c:79
-#: src/language/xforms/recode.c:489 src/language/xforms/recode.c:490
-#: src/language/xforms/recode.c:502 src/language/xforms/recode.c:503
+#: src/language/xforms/recode.c:490 src/language/xforms/recode.c:491
+#: src/language/xforms/recode.c:503 src/language/xforms/recode.c:504
 msgid "string"
 msgstr ""
 
@@ -404,30 +379,30 @@ msgstr ""
 msgid "String variable with width %d is not compatible with format %s."
 msgstr "String variabele met breedte %d is niet compatibel met formaat %s."
 
-#: src/data/gnumeric-reader.c:33
+#: src/data/gnumeric-reader.c:36
 msgid ""
 "Support for Gnumeric files was not compiled into this installation of PSPP"
 msgstr ""
 "Ondersteuning voor Gnumeric bestanden is niet gecompileerd in deze "
 "installatie van PSPP"
 
-#: src/data/gnumeric-reader.c:362
-#, c-format
-msgid "Error opening \"%s\" for reading as a gnumeric file: %s."
+#: src/data/gnumeric-reader.c:368
+#, fuzzy, c-format
+msgid "Error opening \"%s\" for reading as a Gnumeric file: %s."
 msgstr ""
 "Fout bij het openen van \"%s\" voor het lezen als een gnumeric bestand: %s."
 
-#: src/data/gnumeric-reader.c:382
+#: src/data/gnumeric-reader.c:388
 #, c-format
 msgid "Invalid cell range \"%s\""
 msgstr "Ongeldige cel range \"%s\""
 
-#: src/data/gnumeric-reader.c:518 src/data/psql-reader.c:182
+#: src/data/gnumeric-reader.c:520 src/data/psql-reader.c:187
 #, c-format
 msgid "Cannot create variable name from %s"
 msgstr "Kan geen variabele naam creëren van %s"
 
-#: src/data/gnumeric-reader.c:530
+#: src/data/gnumeric-reader.c:532
 #, c-format
 msgid "Selected sheet or range of spreadsheet \"%s\" is empty."
 msgstr "Geselecteerd blad of range van werkblad \"%s\" is leeg."
@@ -499,11 +474,11 @@ msgstr "onverwacht einde bestand"
 
 #. TRANSLATORS: this fragment will be interpolated into
 #. messages in fh_lock() that identify types of files.
-#: src/data/por-file-reader.c:268 src/data/por-file-writer.c:148
+#: src/data/por-file-reader.c:267 src/data/por-file-writer.c:149
 msgid "portable file"
 msgstr "overdraagbaar (portable) bestand"
 
-#: src/data/por-file-reader.c:276
+#: src/data/por-file-reader.c:275
 #, c-format
 msgid ""
 "An error occurred while opening \"%s\" for reading as a portable file: %s."
@@ -511,48 +486,48 @@ msgstr ""
 "Er is een fout opgetreden tijdens het openen van \"%s\" voor het lezen als "
 "overdraagbaar (portable) bestand: %s."
 
-#: src/data/por-file-reader.c:297
+#: src/data/por-file-reader.c:296
 msgid "Data record expected."
 msgstr "Data record verwacht."
 
-#: src/data/por-file-reader.c:379
+#: src/data/por-file-reader.c:378
 msgid "Number expected."
 msgstr "Nummer verwacht."
 
-#: src/data/por-file-reader.c:407
+#: src/data/por-file-reader.c:406
 msgid "Missing numeric terminator."
 msgstr "Ontbrekende numerieke afsluiter."
 
-#: src/data/por-file-reader.c:430
+#: src/data/por-file-reader.c:429
 msgid "Invalid integer."
 msgstr "Ongeldige integer."
 
-#: src/data/por-file-reader.c:441
+#: src/data/por-file-reader.c:440
 #, c-format
 msgid "Bad string length %d."
 msgstr "Foutieve string lengte %d."
 
-#: src/data/por-file-reader.c:502
+#: src/data/por-file-reader.c:501
 #, c-format
 msgid "%s: Not a portable file."
 msgstr "%s: Geen overdraagbaar (portable) bestand."
 
-#: src/data/por-file-reader.c:519
+#: src/data/por-file-reader.c:518
 #, c-format
 msgid "Unrecognized version code `%c'."
 msgstr "Niet herkende versie code `%c'."
 
-#: src/data/por-file-reader.c:528
+#: src/data/por-file-reader.c:527
 #, c-format
 msgid "Bad date string length %zu."
 msgstr "Foutieve datum string lengte %zu."
 
-#: src/data/por-file-reader.c:530
+#: src/data/por-file-reader.c:529
 #, c-format
 msgid "Bad time string length %zu."
 msgstr "Foutieve tijd string lengte %zu."
 
-#: src/data/por-file-reader.c:572
+#: src/data/por-file-reader.c:571
 #, c-format
 msgid ""
 "%s: Bad format specifier byte (%d).  Variable will be assigned a default "
@@ -561,61 +536,61 @@ msgstr ""
 "%s: Foutief formaat specificatie byte (%d). Variabele krijgt een default "
 "formaat."
 
-#: src/data/por-file-reader.c:593
+#: src/data/por-file-reader.c:592
 #, c-format
 msgid "Numeric variable %s has invalid format specifier %s."
 msgstr "Numerieke variabele %s heeft een ongeldige formaat specificatie %s."
 
-#: src/data/por-file-reader.c:597
+#: src/data/por-file-reader.c:596
 #, c-format
 msgid "String variable %s with width %d has invalid format specifier %s."
 msgstr ""
 "String variabele %s met breedte %d heeft ongeldige formaat specificatie %s."
 
-#: src/data/por-file-reader.c:621
+#: src/data/por-file-reader.c:620
 msgid "Expected variable count record."
 msgstr "Variabele teller record verwacht."
 
-#: src/data/por-file-reader.c:625
+#: src/data/por-file-reader.c:624
 #, c-format
 msgid "Invalid number of variables %d."
 msgstr "Ongeldig aantal variabelen %d."
 
-#: src/data/por-file-reader.c:635
+#: src/data/por-file-reader.c:633
 #, c-format
 msgid "Weight variable name (%s) truncated."
 msgstr "Weging variabele naam (%s) afgekapt."
 
-#: src/data/por-file-reader.c:650
+#: src/data/por-file-reader.c:648
 msgid "Expected variable record."
 msgstr "Variabel record verwacht."
 
-#: src/data/por-file-reader.c:654
+#: src/data/por-file-reader.c:652
 #, c-format
 msgid "Invalid variable width %d."
 msgstr "Ongeldige variabele breedte %d."
 
-#: src/data/por-file-reader.c:662
+#: src/data/por-file-reader.c:659
 #, c-format
 msgid "Invalid variable name `%s' in position %d."
 msgstr "Ongeldige variabele naam '%s' in positie %d."
 
-#: src/data/por-file-reader.c:666
+#: src/data/por-file-reader.c:663 src/data/sys-file-reader.c:521
 #, c-format
 msgid "Bad width %d for variable %s."
 msgstr "Foutieve breedte %d voor variabele %s."
 
-#: src/data/por-file-reader.c:681
+#: src/data/por-file-reader.c:678
 #, c-format
 msgid "Duplicate variable name %s in position %d."
 msgstr "Dubbele variabele naam %s in positie %d."
 
-#: src/data/por-file-reader.c:682
+#: src/data/por-file-reader.c:679
 #, c-format
 msgid "Duplicate variable name %s in position %d renamed to %s."
 msgstr "Dubbele variabele naam %s in positie %d hernoemd naar %s."
 
-#: src/data/por-file-reader.c:725
+#: src/data/por-file-reader.c:728
 #, c-format
 msgid "Weighting variable %s not present in dictionary."
 msgstr "Weging variabele %s niet aanwezig in woordenboek."
@@ -633,26 +608,26 @@ msgstr ""
 "Kan geen waarde labels toekennen aan %s en %s, die verschillende variabele "
 "types hebben."
 
-#: src/data/por-file-writer.c:140
+#: src/data/por-file-writer.c:141
 #, c-format
 msgid "Invalid decimal digits count %d.  Treating as %d."
 msgstr "Ongeldige decimaal cijfers teller %d. Behandeld als %d."
 
-#: src/data/por-file-writer.c:160
+#: src/data/por-file-writer.c:161
 #, c-format
 msgid "Error opening \"%s\" for writing as a portable file: %s."
 msgstr ""
 "Fout tijdens openen \"%s\" voor het schrijven als een overdraagbaar "
 "(portable) bestand: %s."
 
-#: src/data/por-file-writer.c:500
+#: src/data/por-file-writer.c:506
 #, c-format
 msgid "An I/O error occurred writing portable file \"%s\"."
 msgstr ""
 "Een I/O fout opgetreden tijdens het schrijven van overdraagbaar (portable) "
 "bestand \"%s\"."
 
-#: src/data/psql-reader.c:42
+#: src/data/psql-reader.c:46
 msgid ""
 "Support for reading postgres databases was not compiled into this "
 "installation of PSPP"
@@ -660,16 +635,16 @@ msgstr ""
 "Ondersteuning voor het lezen van postgres databases was niet gecompileerd in "
 "deze installatie van PSPP"
 
-#: src/data/psql-reader.c:237
+#: src/data/psql-reader.c:242
 msgid "Memory error whilst opening psql source"
 msgstr "Geheugen fout tijdens het openen van psql source"
 
-#: src/data/psql-reader.c:243
+#: src/data/psql-reader.c:248
 #, c-format
 msgid "Error opening psql source: %s."
 msgstr "Fout tijdens openen psql source: %s."
 
-#: src/data/psql-reader.c:258
+#: src/data/psql-reader.c:263
 #, c-format
 msgid ""
 "Postgres server is version %s. Reading from versions earlier than 8.0 is not "
@@ -678,7 +653,7 @@ msgstr ""
 "Postgres server is versie %s. Lezen van versies ouder dan 8.0 wordt niet "
 "ondersteund."
 
-#: src/data/psql-reader.c:278
+#: src/data/psql-reader.c:283
 msgid ""
 "Connection is unencrypted, but unencrypted connections have not been "
 "permitted."
@@ -686,13 +661,13 @@ msgstr ""
 "Connectie is niet geëncrypt, maar niet geëncrypte connecties zijn niet "
 "toegestaan."
 
-#: src/data/psql-reader.c:317 src/data/psql-reader.c:342
-#: src/data/psql-reader.c:352
+#: src/data/psql-reader.c:322 src/data/psql-reader.c:347
+#: src/data/psql-reader.c:357
 #, c-format
 msgid "Error from psql source: %s."
 msgstr "Fout van psql source: %s."
 
-#: src/data/psql-reader.c:447
+#: src/data/psql-reader.c:452
 #, c-format
 msgid "Unsupported OID %d.  SYSMIS values will be inserted."
 msgstr "Niet ondersteunde OID %d. SYSMIS waarde wordt ingevoegd."
@@ -706,11 +681,11 @@ msgstr ""
 
 #. TRANSLATORS: this fragment will be interpolated into
 #. messages in fh_lock() that identify types of files.
-#: src/data/scratch-writer.c:67 src/language/data-io/file-handle.q:181
+#: src/data/scratch-writer.c:66 src/language/data-io/file-handle.q:181
 msgid "scratch file"
 msgstr "scratch bestand"
 
-#: src/data/settings.c:685
+#: src/data/settings.c:686
 #, c-format
 msgid ""
 "%s: Custom currency string `%s' does not contain exactly three periods or "
@@ -725,141 +700,119 @@ msgstr "Variabele achtervoegsel te lang."
 
 #. TRANSLATORS: this fragment will be interpolated into
 #. messages in fh_lock() that identify types of files.
-#: src/data/sys-file-reader.c:216 src/data/sys-file-writer.c:200
+#: src/data/sys-file-reader.c:219 src/data/sys-file-writer.c:202
 msgid "system file"
 msgstr "systeem bestand"
 
-#: src/data/sys-file-reader.c:223
+#: src/data/sys-file-reader.c:226
 #, c-format
 msgid "Error opening \"%s\" for reading as a system file: %s."
 msgstr ""
 "Fout bij het openen van \"%s\" voor het lezen als een systeem file: %s."
 
-#: src/data/sys-file-reader.c:262
+#: src/data/sys-file-reader.c:265
 msgid "Misplaced type 4 record."
 msgstr "Verkeerd geplaatst type 4 record. "
 
-#: src/data/sys-file-reader.c:273
+#: src/data/sys-file-reader.c:276
 #, c-format
 msgid "Unrecognized record type %d."
 msgstr "Niet herkend record type %d."
 
-#: src/data/sys-file-reader.c:312
+#: src/data/sys-file-reader.c:315
 #, c-format
 msgid "File header claims %d variable positions but %d were read from file."
 msgstr ""
 "Bestand kop claimt %d variabele posities maar er zijn er %d gelezen van het "
 "bestand."
 
-#: src/data/sys-file-reader.c:352
+#: src/data/sys-file-reader.c:355
 #, c-format
 msgid "Error closing system file \"%s\": %s."
 msgstr "Fout bij het sluiten van system file \"%s\": %s."
 
-#: src/data/sys-file-reader.c:417 src/data/sys-file-reader.c:427
+#: src/data/sys-file-reader.c:420 src/data/sys-file-reader.c:430
 msgid "This is not an SPSS system file."
 msgstr "Dit is geen SPSS systeem bestand."
 
-#: src/data/sys-file-reader.c:446
+#: src/data/sys-file-reader.c:449
 msgid ""
 "Compression bias is not the usual value of 100, or system file uses "
 "unrecognized floating-point format."
 msgstr ""
 
-#: src/data/sys-file-reader.c:514
+#: src/data/sys-file-reader.c:517
 #, c-format
 msgid "Invalid variable name `%s'."
 msgstr "Ongeldige variabele naam '%s'."
 
-#: src/data/sys-file-reader.c:518
-#, c-format
-msgid "Bad variable width %d."
-msgstr "Foutieve variabele breedte %d."
-
-#: src/data/sys-file-reader.c:522
+#: src/data/sys-file-reader.c:525
 #, c-format
 msgid "Duplicate variable name `%s' within system file."
 msgstr "Dubbele variabele naam '%s' binnen system file."
 
-#: src/data/sys-file-reader.c:530
+#: src/data/sys-file-reader.c:533
 msgid "Variable label indicator field is not 0 or 1."
 msgstr "Variabel label indicator veld is niet 0 of 1."
 
-#: src/data/sys-file-reader.c:538
+#: src/data/sys-file-reader.c:541
 #, c-format
 msgid "Variable %s has label of invalid length %zu."
 msgstr "Variabele %s heeft label van ongeldige lengte %zu."
 
-#: src/data/sys-file-reader.c:557
+#: src/data/sys-file-reader.c:560
 msgid "Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3."
 msgstr ""
 "Numeriek ontbrekende waarde indicator veld is niet -3, -2, 0, 1, 2, of 3."
 
-#: src/data/sys-file-reader.c:572
+#: src/data/sys-file-reader.c:578
 msgid "String missing value indicator field is not 0, 1, 2, or 3."
 msgstr "String missing waarde indicator veld is niet 0, 1, 2, of 3."
 
-#: src/data/sys-file-reader.c:575
-#, c-format
-msgid ""
-"Ignoring missing values on long string variable %s, which PSPP does not yet "
-"support."
-msgstr ""
-"Negeren van missing values voor lange string variabele %s, wat PSPP nog niet "
-"ondersteunt."
-
-#: src/data/sys-file-reader.c:604
+#: src/data/sys-file-reader.c:610
 msgid "Missing string continuation record."
 msgstr "Mis string continuering record."
 
-#: src/data/sys-file-reader.c:638
+#: src/data/sys-file-reader.c:644
 #, c-format
 msgid "Unknown variable format %<PRIu8>."
 msgstr "Onbekend variabele formaat %<PRIu8>."
 
-#: src/data/sys-file-reader.c:656
+#: src/data/sys-file-reader.c:662
 #, c-format
 msgid "%s variable %s has invalid %s format %s."
 msgstr "%s variabele %s heeft ongeldig %s formaat %s."
 
-#: src/data/sys-file-reader.c:659
+#: src/data/sys-file-reader.c:665
 msgid "print"
 msgstr "afdrukken"
 
-#: src/data/sys-file-reader.c:659
+#: src/data/sys-file-reader.c:665
 msgid "write"
 msgstr "schrijf"
 
-#: src/data/sys-file-reader.c:663
+#: src/data/sys-file-reader.c:669
 msgid "Suppressing further invalid format warnings."
 msgstr "Onderdrukt verdere ongeldige formaat waarschuwingen."
 
-#: src/data/sys-file-reader.c:681
+#: src/data/sys-file-reader.c:687
 msgid "Weighting variable must be numeric."
 msgstr "Weging variabele moet numeriek zijn."
 
-#: src/data/sys-file-reader.c:695
+#: src/data/sys-file-reader.c:701
 msgid "Multiple type 6 (document) records."
 msgstr "Meerdere type 6 (document) records."
 
-#: src/data/sys-file-reader.c:699
+#: src/data/sys-file-reader.c:705
 #, c-format
 msgid "Number of document lines (%d) must be greater than 0."
 msgstr "Aantal document regels (%d) moet groter dan 0 zijn."
 
-#: src/data/sys-file-reader.c:707
+#: src/data/sys-file-reader.c:713
 msgid "Document line contains null byte."
 msgstr "Document regel bevat null byte."
 
-#: src/data/sys-file-reader.c:793
-msgid ""
-"Ignoring value labels for long string variables, which PSPP does not yet "
-"support."
-msgstr ""
-"Negeer waarde labels voor lange string variabelen, die door PSPP nog niet "
-"ondersteund worden."
-
-#: src/data/sys-file-reader.c:798
+#: src/data/sys-file-reader.c:803
 #, c-format
 msgid ""
 "Unrecognized record type 7, subtype %d.  Please send a copy of this file, "
@@ -868,13 +821,13 @@ msgstr ""
 "Niet herkend type 7, subtype %d.  Stuur s.v.p. een kopie van dit bestand en "
 "de syntax waarmee het is aangemaakt naar %s "
 
-#: src/data/sys-file-reader.c:825
+#: src/data/sys-file-reader.c:830
 #, c-format
 msgid "Bad size (%zu) or count (%zu) field on record type 7, subtype 3."
 msgstr ""
 "Foutieve lengte (%zu) of aantal (%zu) veld in record type 7, subtype 3."
 
-#: src/data/sys-file-reader.c:845
+#: src/data/sys-file-reader.c:850
 #, c-format
 msgid ""
 "Floating-point representation indicated by system file (%d) differs from "
@@ -883,15 +836,15 @@ msgstr ""
 "Drijvende komma representatie aangegeven door systeem bestand %d verschilt "
 "van verwachting (%d)."
 
-#: src/data/sys-file-reader.c:858
+#: src/data/sys-file-reader.c:863
 msgid "little-endian"
 msgstr ""
 
-#: src/data/sys-file-reader.c:858
+#: src/data/sys-file-reader.c:863
 msgid "big-endian"
 msgstr ""
 
-#: src/data/sys-file-reader.c:859
+#: src/data/sys-file-reader.c:864
 #, c-format
 msgid ""
 "Integer format indicated by system file (%s) differs from expected (%s)."
@@ -899,37 +852,28 @@ msgstr ""
 "Integer formaat aangegeven door systeem bestand (%s) verschilt van verwacht "
 "(%s). "
 
-#: src/data/sys-file-reader.c:916
+#: src/data/sys-file-reader.c:921
 #, c-format
 msgid "Bad size (%zu) or count (%zu) on extension 4."
 msgstr "Foutieve lengte (%zu) of aantal (%zu) bij extensie 4."
 
-#: src/data/sys-file-reader.c:920
-#, c-format
-msgid "File specifies unexpected value %g as SYSMIS."
+#: src/data/sys-file-reader.c:925 src/data/sys-file-reader.c:929
+#: src/data/sys-file-reader.c:933
+#, fuzzy, c-format
+msgid "File specifies unexpected value %g as %s."
 msgstr "Bestand specificeert onverwachte waarde %g als SYSMIS."
 
-#: src/data/sys-file-reader.c:922
-#, c-format
-msgid "File specifies unexpected value %g as HIGHEST."
-msgstr "Bestand specificeert onverwachte waarde %g als HIGHEST."
-
-#: src/data/sys-file-reader.c:924
-#, c-format
-msgid "File specifies unexpected value %g as LOWEST."
-msgstr "Bestand specificeert onverwachte waarde %g als LOWEST."
-
-#: src/data/sys-file-reader.c:940
+#: src/data/sys-file-reader.c:950
 #, c-format
 msgid "Bad size %zu on extension 11."
 msgstr "Foutieve lengte %zu voor extensie 11."
 
-#: src/data/sys-file-reader.c:952
+#: src/data/sys-file-reader.c:962
 #, c-format
 msgid "Extension 11 has bad count %zu (for %zu variables)."
 msgstr "Extensie 11 heeft een foutief aantal %zu (voor %zu variabelen)."
 
-#: src/data/sys-file-reader.c:973
+#: src/data/sys-file-reader.c:983
 #, c-format
 msgid ""
 "Invalid variable display parameters for variable %zu (%s).  Default "
@@ -938,22 +882,22 @@ msgstr ""
 "Ongeldige variabele toon parameters voor variabele %zu (%s).  Default "
 "parameters ingevuld."
 
-#: src/data/sys-file-reader.c:1017
+#: src/data/sys-file-reader.c:1027
 #, c-format
 msgid "Long variable mapping from %s to invalid variable name `%s'."
 msgstr "Lange variabele afbeelding van %s tot ongeldige naam '%s'. "
 
-#: src/data/sys-file-reader.c:1027
+#: src/data/sys-file-reader.c:1037
 #, c-format
 msgid "Duplicate long variable name `%s' within system file."
 msgstr "Dubbele lange variabele naam `%s' binnen systeem bestand."
 
-#: src/data/sys-file-reader.c:1080
+#: src/data/sys-file-reader.c:1090
 #, c-format
 msgid "%s listed as string of invalid length %s in very length string record."
 msgstr ""
 
-#: src/data/sys-file-reader.c:1090
+#: src/data/sys-file-reader.c:1100
 #, c-format
 msgid ""
 "%s listed in very long string record with width %s, which requires only one "
@@ -962,12 +906,12 @@ msgstr ""
 "%s vermeld in erg lang string record met breedte %s, dat slechts een segment "
 "vereist."
 
-#: src/data/sys-file-reader.c:1096
+#: src/data/sys-file-reader.c:1106
 #, c-format
 msgid "Very long string %s overflows dictionary."
 msgstr "Erg lange string %s is te groot voor woordenboek."
 
-#: src/data/sys-file-reader.c:1110
+#: src/data/sys-file-reader.c:1120
 #, c-format
 msgid ""
 "Very long string with width %ld has segment %d of width %d (expected %d)"
@@ -975,12 +919,12 @@ msgstr ""
 "Erg lange string met breedte %ld heeft segment %d van breedte %d (verwacht %"
 "d)"
 
-#: src/data/sys-file-reader.c:1155
+#: src/data/sys-file-reader.c:1166
 #, c-format
 msgid "Invalid number of labels: %d.  Ignoring labels."
 msgstr "Ongeldig aantal labels: %d. Labels worden genegeerd."
 
-#: src/data/sys-file-reader.c:1186
+#: src/data/sys-file-reader.c:1197
 msgid ""
 "Variable index record (type 4) does not immediately follow value label "
 "record (type 3) as it should."
@@ -988,7 +932,7 @@ msgstr ""
 "Variabele index record (type 4) volgt niet onmiddellijk waarde label record "
 "(type 3) zoals het moet."
 
-#: src/data/sys-file-reader.c:1193
+#: src/data/sys-file-reader.c:1204
 #, c-format
 msgid ""
 "Number of variables associated with a value label (%d) is not between 1 and "
@@ -997,12 +941,14 @@ msgstr ""
 "Aantal variabelen geassocieerd aan waarde label (%d) is niet tussen 1 en het "
 "aantal variabelen (%zu)."
 
-#: src/data/sys-file-reader.c:1203
-#, c-format
-msgid "Value labels are not allowed on long string variables (%s)."
+#: src/data/sys-file-reader.c:1215
+#, fuzzy, c-format
+msgid ""
+"Value labels may not be added to long string variables (e.g. %s) using "
+"records types 3 and 4."
 msgstr "Waarde labels zijn niet toegestaan bij lange string variabelen (%s)."
 
-#: src/data/sys-file-reader.c:1210
+#: src/data/sys-file-reader.c:1224
 #, c-format
 msgid ""
 "Variables associated with value label are not all of identical type.  "
@@ -1011,87 +957,120 @@ msgstr ""
 "Variabelen geassocieerd met waarde label zijn niet allemaal van het "
 "identieke type.  Variabele %s is %s, maar variabele %s is %s."
 
-#: src/data/sys-file-reader.c:1243
+#: src/data/sys-file-reader.c:1258
 #, c-format
 msgid "Duplicate value label for %g on %s."
 msgstr "Dubbel waarde label voor %g op %s."
 
-#: src/data/sys-file-reader.c:1246
+#: src/data/sys-file-reader.c:1261 src/data/sys-file-reader.c:1442
 #, c-format
 msgid "Duplicate value label for \"%.*s\" on %s."
 msgstr "Dubbel waarde label voor \"%.*s\" on %s."
 
-#: src/data/sys-file-reader.c:1284
+#: src/data/sys-file-reader.c:1299
 #, c-format
 msgid "Error parsing attribute value %s[%d]"
 msgstr "Fout bij het ontleden van attribuut waarde %s[%d]"
 
-#: src/data/sys-file-reader.c:1298
+#: src/data/sys-file-reader.c:1313
 #, c-format
 msgid "Attribute value %s[%d] is not quoted: %s"
 msgstr "Attribuut waarde %s[%d] is niet geciteerd: %s"
 
-#: src/data/sys-file-reader.c:1414
+#: src/data/sys-file-reader.c:1376
+#, c-format
+msgid ""
+"Variable name length in long string value label record (%d) exceeds %d-byte "
+"limit."
+msgstr ""
+
+#: src/data/sys-file-reader.c:1386
+#, fuzzy, c-format
+msgid "Ignoring long string value record for unknown variable %s."
+msgstr "Variabele afbeelding refereert aan onbekende variabele %s."
+
+#: src/data/sys-file-reader.c:1393
+#, fuzzy, c-format
+msgid "Ignoring long string value record for numeric variable %s."
+msgstr ""
+"Kan missing values uit bron bestand niet toepassen op lange string variabele "
+"%s."
+
+#: src/data/sys-file-reader.c:1400
+#, c-format
+msgid ""
+"Ignoring long string value record for variable %s because the record's width "
+"(%d) does not match the variable's width (%d)"
+msgstr ""
+
+#: src/data/sys-file-reader.c:1422
+#, c-format
+msgid ""
+"Ignoring long string value %zu for variable %s, with width %d, that has bad "
+"value width %zu."
+msgstr ""
+
+#: src/data/sys-file-reader.c:1537
 msgid "File ends in partial case."
 msgstr "Bestand eindigt in gedeeltelijke case."
 
-#: src/data/sys-file-reader.c:1422
+#: src/data/sys-file-reader.c:1545
 #, c-format
 msgid "Error reading case from file %s."
 msgstr "Fout tijdens lezen case van bestand %s."
 
-#: src/data/sys-file-reader.c:1519 src/data/sys-file-reader.c:1555
+#: src/data/sys-file-reader.c:1642 src/data/sys-file-reader.c:1678
 msgid "Compressed data is corrupt."
 msgstr "Gecomprimeerde data is corrupt."
 
-#: src/data/sys-file-reader.c:1642
+#: src/data/sys-file-reader.c:1765
 #, c-format
 msgid "Variable index %d not in valid range 1...%d."
 msgstr "Variabele index %d niet in geldige range 1...%d."
 
-#: src/data/sys-file-reader.c:1647
+#: src/data/sys-file-reader.c:1770
 #, c-format
 msgid "Variable index %d refers to long string continuation."
 msgstr "Variabele index %d verwijst naar lange string voortzetting."
 
-#: src/data/sys-file-reader.c:1715
+#: src/data/sys-file-reader.c:1838
 #, c-format
 msgid "Suppressed %d additional related warnings."
 msgstr "Onderdrukt %d extra gerelateerde waarschuwingen."
 
-#: src/data/sys-file-reader.c:1756
+#: src/data/sys-file-reader.c:1879
 #, c-format
 msgid "Variable map refers to unknown variable %s."
 msgstr "Variabele afbeelding refereert aan onbekende variabele %s."
 
-#: src/data/sys-file-reader.c:1864
+#: src/data/sys-file-reader.c:1987
 #, c-format
 msgid "System error: %s."
 msgstr "Systeem fout: %s."
 
-#: src/data/sys-file-reader.c:1866
+#: src/data/sys-file-reader.c:1989
 msgid "Unexpected end of file."
 msgstr "Onverwacht bestand einde."
 
-#: src/data/sys-file-writer.c:173
+#: src/data/sys-file-writer.c:175
 #, c-format
 msgid "Unknown system file version %d. Treating as version %d."
 msgstr "Onbekende systeem bestand versie %d. Behandeld als versie %d."
 
-#: src/data/sys-file-writer.c:212
+#: src/data/sys-file-writer.c:214
 #, c-format
 msgid "Error opening \"%s\" for writing as a system file: %s."
 msgstr ""
 "Fout bij het openen van \"%s\" voor het schrijven als een systeem bestand: %"
 "s."
 
-#: src/data/sys-file-writer.c:837
+#: src/data/sys-file-writer.c:917
 #, c-format
 msgid "An I/O error occurred writing system file \"%s\"."
 msgstr ""
 "Een I/O fout is opgetreden tijdens het schrijven van systeem bestand \"%s\"."
 
-#: src/data/variable.c:240
+#: src/data/variable.c:242
 #, c-format
 msgid ""
 "Character `%c' (in %s) may not appear as the first character in a variable "
@@ -1100,31 +1079,31 @@ msgstr ""
 "Karakter '%c' (in %s) mag niet als eerste karakter in een variabele naam "
 "voorkomen. "
 
-#: src/data/variable.c:252
+#: src/data/variable.c:254
 #, c-format
 msgid "Character `%c' (in %s) may not appear in a variable name."
 msgstr "Karakter '%c' (in %s) mag niet in een variabele naam voorkomen."
 
-#: src/data/variable.c:280
+#: src/data/variable.c:282
 msgid "Variable name cannot be empty string."
 msgstr "Variabele naam kan geen lege string zijn."
 
-#: src/data/variable.c:286
+#: src/data/variable.c:288
 #, c-format
 msgid "Variable name %s exceeds %d-character limit."
 msgstr "Variabele naam %s overschrijdt de limiet van %d-karakters."
 
-#: src/data/variable.c:294
+#: src/data/variable.c:296
 #, c-format
 msgid "`%s' may not be used as a variable name because it is a reserved word."
 msgstr ""
 "'%s' mag niet gebruikt worden als variabele naam omdat het een gereserveerd "
 "woord is."
 
-#: src/language/command.c:208
+#: src/language/command.c:208 src/language/expressions/parse.c:1267
 #, c-format
-msgid "%s is unimplemented."
-msgstr "%s is niet geïmplementeerd."
+msgid "%s is not yet implemented."
+msgstr "%s is nog niet geïmplementeerd."
 
 #: src/language/command.c:214
 #, c-format
@@ -1424,7 +1403,7 @@ msgstr ""
 "Variabele naam %s gespecificeerd op %s subopdracht dupliceert een bestaande "
 "variabele naam."
 
-#: src/language/data-io/combine-files.c:757
+#: src/language/data-io/combine-files.c:762
 #, c-format
 msgid "Encountered %zu sets of duplicate cases in the master file."
 msgstr "Ontmoet %zu sets van dubbele cases in het master bestand. "
@@ -1509,7 +1488,7 @@ msgstr "Record eindigd in data die geen onderdeel is van een veld."
 #: src/language/dictionary/split-file.c:84
 #: src/language/dictionary/sys-file-info.c:169
 #: src/language/dictionary/sys-file-info.c:393
-#: src/language/dictionary/sys-file-info.c:716
+#: src/language/dictionary/sys-file-info.c:725
 #: src/language/stats/descriptives.c:885 src/ui/gui/psppire-dictview.c:502
 msgid "Variable"
 msgstr "Variabele"
@@ -1519,8 +1498,8 @@ msgid "Record"
 msgstr ""
 
 #: src/language/data-io/data-parser.c:646 src/language/data-io/print.c:405
-#: src/ui/gui/crosstabs.glade:92 src/ui/gui/psppire-var-sheet.c:545
-#: src/ui/gui/psppire-var-store.c:791
+#: src/ui/gui/crosstabs.glade:92 src/ui/gui/psppire-var-sheet.c:534
+#: src/ui/gui/psppire-var-store.c:800
 msgid "Columns"
 msgstr "Kolommen"
 
@@ -1746,19 +1725,19 @@ msgstr ""
 "Het gespecificeerde record nummer, %ld, overschrijdt het aantal records per "
 "case zoals gespecificeerd in FIXCASE, %d."
 
-#: src/language/data-io/inpt-pgm.c:129
+#: src/language/data-io/inpt-pgm.c:130
 msgid "Unexpected end-of-file within INPUT PROGRAM."
 msgstr "Onverwacht einde-bestand binnen INPUT PROGRAM."
 
-#: src/language/data-io/inpt-pgm.c:142
+#: src/language/data-io/inpt-pgm.c:143
 msgid "Input program did not create any variables."
 msgstr "Input program heeft geen variabelen gecreëerd."
 
-#: src/language/data-io/inpt-pgm.c:286
+#: src/language/data-io/inpt-pgm.c:288
 msgid "COLUMN subcommand multiply specified."
 msgstr "COLUMN subopdracht meerdere keren gespecificeerd."
 
-#: src/language/data-io/inpt-pgm.c:336
+#: src/language/data-io/inpt-pgm.c:338
 msgid ""
 "REREAD: Column numbers must be positive finite numbers.  Column set to 1."
 msgstr ""
@@ -1857,21 +1836,21 @@ msgid "Output calls for %d records but %zu specified on RECORDS subcommand."
 msgstr ""
 "De output vraagt %d records maar %zu gespecificeerd bij RECORDS subopdracht. "
 
-#: src/language/data-io/print.c:436
+#: src/language/data-io/print.c:437
 #, c-format
 msgid "Writing %d record to %s."
 msgid_plural "Writing %d records to %s."
 msgstr[0] "Schrijven van %d record naar %s."
 msgstr[1] "Schrijven van %d records naar %s."
 
-#: src/language/data-io/print.c:440
+#: src/language/data-io/print.c:441
 #, c-format
 msgid "Writing %d record."
 msgid_plural "Writing %d records."
 msgstr[0] "Schrijven van %d record."
 msgstr[1] "Schrijven van %d records."
 
-#: src/language/data-io/print-space.c:73 src/language/lexer/lexer.c:479
+#: src/language/data-io/print-space.c:73 src/language/lexer/lexer.c:478
 #: src/language/stats/autorecode.c:154 src/language/xforms/select-if.c:60
 msgid "expecting end of command"
 msgstr "verwacht einde van opdracht "
@@ -1932,22 +1911,7 @@ msgstr "Kan niet alle variabelen DROP-en uit woordenboek."
 msgid "Variable %s is %s in target file, but %s in source file."
 msgstr "Variabele %s is %s in doel bestand, maar %s in bron bestand."
 
-#: src/language/dictionary/apply-dictionary.c:99
-#, c-format
-msgid "Cannot add value labels from source file to long string variable %s."
-msgstr ""
-"Kan geen value labels van bron bestand toevoegen aan lange string variabele %"
-"s."
-
-#: src/language/dictionary/apply-dictionary.c:113
-#, c-format
-msgid ""
-"Cannot apply missing values from source file to long string variable %s."
-msgstr ""
-"Kan missing values uit bron bestand niet toepassen op lange string variabele "
-"%s."
-
-#: src/language/dictionary/apply-dictionary.c:129
+#: src/language/dictionary/apply-dictionary.c:115
 msgid "No matching variables found between the source and target files."
 msgstr ""
 "Geen overeenkomende variabelen gevonden tussen het bron en het doel bestand."
@@ -1998,12 +1962,12 @@ msgstr ""
 "Kan numerieke variabelen (b.v. %s) en string variabelen (b.v. %s) niet mixen "
 "binnen een enkele lijst."
 
-#: src/language/dictionary/missing-values.c:117
-#, c-format
-msgid "Truncating missing value to short string length (%d characters)."
+#: src/language/dictionary/missing-values.c:116
+#, fuzzy, c-format
+msgid "Truncating missing value to maximum acceptable length (%d bytes)."
 msgstr "Afkappen missing value naar short string lengte (%d karakters)."
 
-#: src/language/dictionary/missing-values.c:139
+#: src/language/dictionary/missing-values.c:138
 #, c-format
 msgid "Missing values provided are too long to assign to variable of width %d."
 msgstr ""
@@ -2134,21 +2098,21 @@ msgid "Renaming would duplicate variable name %s."
 msgstr "Hernoemen zou variabele naam %s dupliceren."
 
 #: src/language/dictionary/split-file.c:85
-#: src/language/dictionary/sys-file-info.c:487
-#: src/language/dictionary/sys-file-info.c:636
-#: src/language/stats/crosstabs.q:1167 src/language/stats/crosstabs.q:1194
-#: src/language/stats/crosstabs.q:1214 src/language/stats/crosstabs.q:1236
-#: src/language/stats/examine.q:1958 src/language/stats/frequencies.q:1059
-#: src/language/stats/frequencies.q:1184 src/language/stats/reliability.q:581
-#: src/language/stats/reliability.q:592
+#: src/language/dictionary/sys-file-info.c:486
+#: src/language/dictionary/sys-file-info.c:641
+#: src/language/stats/crosstabs.q:1231 src/language/stats/crosstabs.q:1258
+#: src/language/stats/crosstabs.q:1282 src/language/stats/crosstabs.q:1307
+#: src/language/stats/examine.q:1959 src/language/stats/frequencies.q:1048
+#: src/language/stats/frequencies.q:1173 src/language/stats/reliability.q:582
+#: src/language/stats/reliability.q:593
 msgid "Value"
 msgstr "Waarde"
 
 #: src/language/dictionary/split-file.c:86
 #: src/language/dictionary/sys-file-info.c:397
-#: src/language/dictionary/sys-file-info.c:637 src/ui/gui/crosstabs.glade:275
-#: src/ui/gui/psppire.glade:1999 src/ui/gui/psppire-var-sheet.c:542
-#: src/ui/gui/psppire-var-store.c:788
+#: src/language/dictionary/sys-file-info.c:642 src/ui/gui/crosstabs.glade:275
+#: src/ui/gui/psppire.glade:1974 src/ui/gui/psppire-var-sheet.c:531
+#: src/ui/gui/psppire-var-store.c:797
 msgid "Label"
 msgstr ""
 
@@ -2156,7 +2120,7 @@ msgstr ""
 msgid "File:"
 msgstr "Bestand:"
 
-#: src/language/dictionary/sys-file-info.c:115 src/ui/gui/psppire.glade:1938
+#: src/language/dictionary/sys-file-info.c:115 src/ui/gui/psppire.glade:1913
 #: src/ui/gui/recode.glade:841
 msgid "Label:"
 msgstr ""
@@ -2268,7 +2232,7 @@ msgstr "Omschrijving"
 
 #: src/language/dictionary/sys-file-info.c:171
 #: src/language/dictionary/sys-file-info.c:399
-#: src/language/dictionary/sys-file-info.c:715
+#: src/language/dictionary/sys-file-info.c:724
 msgid "Position"
 msgstr "Positie"
 
@@ -2296,16 +2260,16 @@ msgstr "Het actieve bestand woordenboek bevat geen documenten."
 msgid "Documents in the active file:"
 msgstr "Documenten in het actieve bestand:"
 
-#: src/language/dictionary/sys-file-info.c:486
+#: src/language/dictionary/sys-file-info.c:485
 msgid "Attribute"
 msgstr "Attribuut"
 
-#: src/language/dictionary/sys-file-info.c:544
+#: src/language/dictionary/sys-file-info.c:543
 #, c-format
 msgid "Format: %s"
 msgstr "Formaat: %s"
 
-#: src/language/dictionary/sys-file-info.c:551
+#: src/language/dictionary/sys-file-info.c:550
 #, c-format
 msgid "Print Format: %s"
 msgstr "Print Formaat: %s"
@@ -2315,89 +2279,72 @@ msgstr "Print Formaat: %s"
 msgid "Write Format: %s"
 msgstr "Schrijf Formaat: %s"
 
-#: src/language/dictionary/sys-file-info.c:566
+#: src/language/dictionary/sys-file-info.c:567
 #, c-format
 msgid "Measure: %s"
 msgstr "Meting: %s"
 
-#: src/language/dictionary/sys-file-info.c:567
+#: src/language/dictionary/sys-file-info.c:568
 #: src/ui/gui/psppire-var-sheet.c:111
 msgid "Nominal"
 msgstr "Nominaal"
 
-#: src/language/dictionary/sys-file-info.c:568
+#: src/language/dictionary/sys-file-info.c:569
 #: src/ui/gui/psppire-var-sheet.c:112
 msgid "Ordinal"
 msgstr "Ordinaal"
 
-#: src/language/dictionary/sys-file-info.c:569
+#: src/language/dictionary/sys-file-info.c:570
 #: src/ui/gui/psppire-var-sheet.c:113
 msgid "Scale"
 msgstr "Schaal"
 
-#: src/language/dictionary/sys-file-info.c:572
+#: src/language/dictionary/sys-file-info.c:573
 #, c-format
 msgid "Display Alignment: %s"
 msgstr "Toon Groepering: %s"
 
-#: src/language/dictionary/sys-file-info.c:573
+#: src/language/dictionary/sys-file-info.c:574
 #: src/ui/gui/psppire-var-sheet.c:104
 msgid "Left"
 msgstr "Links"
 
-#: src/language/dictionary/sys-file-info.c:574
+#: src/language/dictionary/sys-file-info.c:575
 #: src/ui/gui/psppire-var-sheet.c:106
 msgid "Center"
 msgstr "Centreer"
 
-#: src/language/dictionary/sys-file-info.c:575
+#: src/language/dictionary/sys-file-info.c:576
 #: src/ui/gui/psppire-var-sheet.c:105
 msgid "Right"
 msgstr "Rechts"
 
-#: src/language/dictionary/sys-file-info.c:578
+#: src/language/dictionary/sys-file-info.c:579
 #, c-format
 msgid "Display Width: %d"
 msgstr "Toonbreedte: %d"
 
-#: src/language/dictionary/sys-file-info.c:590
+#: src/language/dictionary/sys-file-info.c:593
 msgid "Missing Values: "
 msgstr "Ontbrekende Waardes:"
 
-#: src/language/dictionary/sys-file-info.c:693
+#: src/language/dictionary/sys-file-info.c:702
 msgid "No vectors defined."
 msgstr "Geen vectoren gedefinieerd."
 
-#: src/language/dictionary/sys-file-info.c:714
+#: src/language/dictionary/sys-file-info.c:723
 msgid "Vector"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:717
+#: src/language/dictionary/sys-file-info.c:726
 msgid "Print Format"
 msgstr "Print Formaat"
 
-#: src/language/dictionary/value-labels.c:121
-#, c-format
-msgid ""
-"It is not possible to assign value labels to long string variables such as %"
-"s."
-msgstr ""
-"Het is niet mogelijk om waarde labels aan lange string variabelen als %s toe "
-"te kennen."
-
-#: src/language/dictionary/value-labels.c:157 src/language/lexer/lexer.c:632
-msgid "expecting string"
-msgstr "string verwacht"
-
-#: src/language/dictionary/value-labels.c:166 src/language/lexer/lexer.c:659
-msgid "expecting number"
-msgstr "nummer verwacht"
-
-#: src/language/dictionary/value-labels.c:182
+#: src/language/dictionary/value-labels.c:150
 msgid "Truncating value label to 60 characters."
 msgstr "Afkappen waarde label tot 60 karakters."
 
-#: src/language/dictionary/variable-display.c:119
+#: src/language/dictionary/variable-display.c:120
 msgid "Variable display width must be a positive integer."
 msgstr "Variabele toonbreedte moet een positieve integer zijn."
 
@@ -2449,11 +2396,11 @@ msgstr "De weging variabele moet numeriek zijn."
 msgid "The weighting variable may not be scratch."
 msgstr "De weging variabele mag geen scratch zijn."
 
-#: src/language/expressions/evaluate.c:154
+#: src/language/expressions/evaluate.c:155
 msgid "expecting number or string"
 msgstr "verwacht nummer of string"
 
-#: src/language/expressions/evaluate.c:168
+#: src/language/expressions/evaluate.c:169
 #, c-format
 msgid "Duplicate variable name %s."
 msgstr "Dubbele variabele naam %s."
@@ -2640,11 +2587,6 @@ msgstr "verwacht ',' of ')' bij aanroep %s functie"
 msgid "%s is a PSPP extension."
 msgstr "%s is een PSPP extensie."
 
-#: src/language/expressions/parse.c:1267
-#, c-format
-msgid "%s is not yet implemented."
-msgstr "%s is nog niet geïmplementeerd."
-
 #: src/language/expressions/parse.c:1273
 #, c-format
 msgid "%s may not appear after TEMPORARY."
@@ -2664,89 +2606,92 @@ msgid "%s does not form a valid number."
 msgstr "%s vormt geen geldig nummer."
 
 #: src/language/lexer/lexer.c:389
-#, c-format
-msgid "Bad character in input: `%c'."
+#, fuzzy, c-format
+msgid "Bad character in input: `%s'."
 msgstr "Fout karakter in input: '%c'."
 
-#: src/language/lexer/lexer.c:391
-#, c-format
-msgid "Bad character in input: `\\%o'."
-msgstr "Fout karakter in input: '\\%o'."
-
-#: src/language/lexer/lexer.c:427
+#: src/language/lexer/lexer.c:426
 #, c-format
 msgid "Subcommand %s may only be specified once."
 msgstr "Subopdracht %s mag slechts een keer gespecificeerd worden."
 
-#: src/language/lexer/lexer.c:435
+#: src/language/lexer/lexer.c:434
 #, c-format
 msgid "missing required subcommand %s"
 msgstr "mis verplichte subopdracht %s"
 
-#: src/language/lexer/lexer.c:464
+#: src/language/lexer/lexer.c:463
 #, c-format
 msgid "Syntax error %s at %s."
 msgstr "Syntax fout %s op %s."
 
-#: src/language/lexer/lexer.c:467
+#: src/language/lexer/lexer.c:466
 #, c-format
 msgid "Syntax error at %s."
 msgstr "Syntax fout op %s."
 
-#: src/language/lexer/lexer.c:601 src/language/lexer/lexer.c:618
+#: src/language/lexer/lexer.c:600 src/language/lexer/lexer.c:617
 #, c-format
 msgid "expecting `%s'"
 msgstr "verwacht '%s'"
 
-#: src/language/lexer/lexer.c:646
+#: src/language/lexer/lexer.c:631
+msgid "expecting string"
+msgstr "string verwacht"
+
+#: src/language/lexer/lexer.c:645
 msgid "expecting integer"
 msgstr "verwacht integer"
 
-#: src/language/lexer/lexer.c:671
+#: src/language/lexer/lexer.c:658
+msgid "expecting number"
+msgstr "nummer verwacht"
+
+#: src/language/lexer/lexer.c:670
 msgid "expecting identifier"
 msgstr "verwacht herkenningsteken"
 
-#: src/language/lexer/lexer.c:1065
+#: src/language/lexer/lexer.c:1064
 msgid "binary"
 msgstr "binair"
 
-#: src/language/lexer/lexer.c:1070
+#: src/language/lexer/lexer.c:1069
 msgid "octal"
 msgstr "octaal"
 
-#: src/language/lexer/lexer.c:1075
+#: src/language/lexer/lexer.c:1074
 msgid "hex"
 msgstr ""
 
-#: src/language/lexer/lexer.c:1085
+#: src/language/lexer/lexer.c:1084
 #, c-format
 msgid "String of %s digits has %zu characters, which is not a multiple of %d."
 msgstr ""
 "String van %s cijfers heeft %zu karakters, wat geen meervoud van %d is."
 
-#: src/language/lexer/lexer.c:1114
+#: src/language/lexer/lexer.c:1113
 #, c-format
 msgid "`%c' is not a valid %s digit."
 msgstr "'%c' is geen geldig %s cijfer."
 
-#: src/language/lexer/lexer.c:1148
+#: src/language/lexer/lexer.c:1147
 msgid "Unterminated string constant."
 msgstr "Geen einde aan string constante."
 
-#: src/language/lexer/lexer.c:1202
+#: src/language/lexer/lexer.c:1201
 msgid "Unexpected end of file in string concatenation."
 msgstr "Onverwacht bestandseinde in string samenvoeging."
 
-#: src/language/lexer/lexer.c:1210
+#: src/language/lexer/lexer.c:1209
 msgid "String expected following `+'."
 msgstr "String verwacht achter '+'."
 
-#: src/language/lexer/lexer.c:1223
+#: src/language/lexer/lexer.c:1222
 #, c-format
 msgid "String exceeds 255 characters in length (%zu characters)."
 msgstr "String overschrijdt de lengte van 255 karakters (%zu karakters)."
 
-#: src/language/lexer/range-parser.c:60
+#: src/language/lexer/value-parser.c:60
 #, c-format
 msgid ""
 "Low end of range (%g) is below high end (%g).  The range will be treated as "
@@ -2755,20 +2700,20 @@ msgstr ""
 "Ondergrens van range (%g) is lager dan bovengrens (%g). De range wordt "
 "behandeld als omgekeerd."
 
-#: src/language/lexer/range-parser.c:68
+#: src/language/lexer/value-parser.c:68
 #, c-format
 msgid "Ends of range are equal (%g)."
 msgstr "Eindes van range zijn gelijk (%g)."
 
-#: src/language/lexer/range-parser.c:76
+#: src/language/lexer/value-parser.c:76
 msgid "LO or LOWEST must be part of a range."
 msgstr "LO of LOWEST moet een onderdeel van een range zijn."
 
-#: src/language/lexer/range-parser.c:108
+#: src/language/lexer/value-parser.c:108
 msgid "System-missing value is not valid here."
 msgstr "System-missing waarde is hier niet geldig."
 
-#: src/language/lexer/range-parser.c:116
+#: src/language/lexer/value-parser.c:116
 msgid "expecting number or data string"
 msgstr "nummer of data string verwacht"
 
@@ -2940,63 +2885,63 @@ msgstr "Doel variabele %s dupliceert bestaande variabele %s."
 msgid "Duplicate variable name %s among target variables."
 msgstr "Dubbele variabele naam %s tussen doel variabelen."
 
-#: src/language/stats/binomial.c:142
+#: src/language/stats/binomial.c:141
 #, c-format
 msgid "Variable %s is not dichotomous"
 msgstr "Variabele %s is niet dichotomisch "
 
-#: src/language/stats/binomial.c:207
+#: src/language/stats/binomial.c:194
 msgid "Binomial Test"
 msgstr ""
 
-#: src/language/stats/binomial.c:238
+#: src/language/stats/binomial.c:224
 msgid "Group1"
 msgstr "Groep1 "
 
-#: src/language/stats/binomial.c:239
+#: src/language/stats/binomial.c:225
 msgid "Group2"
 msgstr "Groep2"
 
-#: src/language/stats/binomial.c:240 src/language/stats/chisquare.c:224
-#: src/language/stats/chisquare.c:284 src/language/stats/crosstabs.q:868
-#: src/language/stats/crosstabs.q:1074 src/language/stats/crosstabs.q:1797
-#: src/language/stats/examine.q:1214 src/language/stats/frequencies.q:1136
-#: src/language/stats/oneway.q:305 src/language/stats/oneway.q:475
-#: src/language/stats/regression.q:309 src/language/stats/reliability.q:717
-#: src/language/stats/sign.c:93 src/language/stats/wilcoxon.c:246
+#: src/language/stats/binomial.c:226 src/language/stats/chisquare.c:202
+#: src/language/stats/chisquare.c:262 src/language/stats/crosstabs.q:843
+#: src/language/stats/crosstabs.q:1170 src/language/stats/crosstabs.q:1594
+#: src/language/stats/examine.q:1216 src/language/stats/frequencies.q:1125
+#: src/language/stats/oneway.q:305 src/language/stats/oneway.q:476
+#: src/language/stats/regression.q:309 src/language/stats/reliability.q:718
+#: src/language/stats/sign.c:94 src/language/stats/wilcoxon.c:262
 #: src/ui/gui/crosstabs-dialog.c:59
 msgid "Total"
 msgstr "Totaal"
 
-#: src/language/stats/binomial.c:273 src/language/stats/chisquare.c:247
-#: src/language/stats/crosstabs.q:1192 src/language/stats/crosstabs.q:1233
+#: src/language/stats/binomial.c:259 src/language/stats/chisquare.c:225
+#: src/language/stats/crosstabs.q:1256 src/language/stats/crosstabs.q:1304
 msgid "Category"
 msgstr "Categorie"
 
-#: src/language/stats/binomial.c:274 src/language/stats/crosstabs.q:878
-#: src/language/stats/examine.q:1287 src/language/stats/frequencies.q:1407
+#: src/language/stats/binomial.c:260 src/language/stats/crosstabs.q:850
+#: src/language/stats/examine.q:1289 src/language/stats/frequencies.q:1396
 #: src/language/stats/npar-summary.c:123 src/language/stats/oneway.q:389
-#: src/language/stats/reliability.q:720 src/language/stats/sign.c:73
-#: src/language/stats/t-test.q:700 src/language/stats/t-test.q:724
-#: src/language/stats/t-test.q:863 src/language/stats/t-test.q:1425
-#: src/language/stats/wilcoxon.c:229
+#: src/language/stats/reliability.q:721 src/language/stats/sign.c:74
+#: src/language/stats/t-test.q:506 src/language/stats/t-test.q:526
+#: src/language/stats/t-test.q:626 src/language/stats/t-test.q:1105
+#: src/language/stats/wilcoxon.c:245
 msgid "N"
 msgstr ""
 
-#: src/language/stats/binomial.c:275
+#: src/language/stats/binomial.c:261
 msgid "Observed Prop."
 msgstr ""
 
-#: src/language/stats/binomial.c:276
+#: src/language/stats/binomial.c:262
 msgid "Test Prop."
 msgstr ""
 
-#: src/language/stats/binomial.c:279
+#: src/language/stats/binomial.c:265
 #, c-format
 msgid "Exact Sig. (%d-tailed)"
 msgstr ""
 
-#: src/language/stats/chisquare.c:194
+#: src/language/stats/chisquare.c:172
 #, c-format
 msgid ""
 "CHISQUARE test specified %d expected values, but %d distinct values were "
@@ -3005,332 +2950,327 @@ msgstr ""
 "CHISQUARE test specificeert %d verwachte waardes, maar %d verschillende "
 "waardes werden gevonden in variabele %s."
 
-#: src/language/stats/chisquare.c:208 src/language/stats/chisquare.c:248
+#: src/language/stats/chisquare.c:186 src/language/stats/chisquare.c:226
 msgid "Observed N"
 msgstr "Waargenomen N"
 
-#: src/language/stats/chisquare.c:209 src/language/stats/chisquare.c:249
+#: src/language/stats/chisquare.c:187 src/language/stats/chisquare.c:227
 msgid "Expected N"
 msgstr "Verwacht N"
 
-#: src/language/stats/chisquare.c:210 src/language/stats/chisquare.c:250
+#: src/language/stats/chisquare.c:188 src/language/stats/chisquare.c:228
 #: src/language/stats/regression.q:308 src/ui/gui/crosstabs-dialog.c:61
 msgid "Residual"
 msgstr "Overblijvend"
 
-#: src/language/stats/chisquare.c:243 src/language/stats/sign.c:61
+#: src/language/stats/chisquare.c:221 src/language/stats/sign.c:62
 msgid "Frequencies"
 msgstr "Frequenties"
 
-#: src/language/stats/chisquare.c:298 src/language/stats/sign.c:114
-#: src/language/stats/wilcoxon.c:297
+#: src/language/stats/chisquare.c:276 src/language/stats/sign.c:115
+#: src/language/stats/wilcoxon.c:313
 msgid "Test Statistics"
 msgstr ""
 
-#: src/language/stats/chisquare.c:312
+#: src/language/stats/chisquare.c:290
 msgid "Chi-Square"
 msgstr ""
 
-#: src/language/stats/chisquare.c:313 src/language/stats/crosstabs.q:1168
-#: src/language/stats/oneway.q:278 src/language/stats/oneway.q:689
-#: src/language/stats/regression.q:302 src/language/stats/t-test.q:1026
-#: src/language/stats/t-test.q:1219 src/language/stats/t-test.q:1316
+#: src/language/stats/chisquare.c:291 src/language/stats/crosstabs.q:1232
+#: src/language/stats/oneway.q:278 src/language/stats/oneway.q:691
+#: src/language/stats/regression.q:302 src/language/stats/t-test.q:753
+#: src/language/stats/t-test.q:924 src/language/stats/t-test.q:1011
 msgid "df"
 msgstr ""
 
-#: src/language/stats/chisquare.c:314
+#: src/language/stats/chisquare.c:292
 msgid "Asymp. Sig."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:278
+#: src/language/stats/crosstabs.q:325
 msgid ""
 "Missing mode REPORT not allowed in general mode.  Assuming MISSING=TABLE."
 msgstr ""
 "Missing modus REPORT niet toegestaan in algemene modus.  MISSING=TABLE "
 "aangenomen."
 
-#: src/language/stats/crosstabs.q:288
-msgid "Write mode ALL not allowed in general mode.  Assuming WRITE=CELLS."
-msgstr ""
-"Write modus ALL niet toegestaan in algemen modus.  WRITE=CELLS aangenomen."
-
-#: src/language/stats/crosstabs.q:364
+#: src/language/stats/crosstabs.q:414
 msgid "Too many cross-tabulation variables or dimensions."
 msgstr "Te veel cross-tabulation variabelen of dimensies."
 
-#: src/language/stats/crosstabs.q:374
+#: src/language/stats/crosstabs.q:424
 msgid "expecting BY"
 msgstr "BY verwacht"
 
-#: src/language/stats/crosstabs.q:441
+#: src/language/stats/crosstabs.q:484
 msgid "VARIABLES must be specified before TABLES."
 msgstr "VARIABLES dient voor TABLES gespecificeerd te worden."
 
-#: src/language/stats/crosstabs.q:479
+#: src/language/stats/crosstabs.q:522
 #, c-format
 msgid "Maximum value (%ld) less than minimum value (%ld)."
 msgstr "Maximum waarde (%ld) is kleiner dan minimum waarde (%ld)."
 
-#: src/language/stats/crosstabs.q:863
+#: src/language/stats/crosstabs.q:838
 msgid "Summary."
 msgstr "Overzicht."
 
-#: src/language/stats/crosstabs.q:865 src/language/stats/examine.q:1275
-#: src/language/stats/reliability.q:708
+#: src/language/stats/crosstabs.q:840 src/language/stats/examine.q:1277
+#: src/language/stats/reliability.q:709
 msgid "Cases"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:866 src/language/stats/examine.q:1212
-#: src/language/stats/frequencies.q:1057 src/language/stats/frequencies.q:1408
-#: src/language/stats/reliability.q:711
+#: src/language/stats/crosstabs.q:841 src/language/stats/examine.q:1214
+#: src/language/stats/frequencies.q:1046 src/language/stats/frequencies.q:1397
+#: src/language/stats/reliability.q:712
 msgid "Valid"
 msgstr "Geldig"
 
-#: src/language/stats/crosstabs.q:867 src/language/stats/examine.q:1213
-#: src/language/stats/frequencies.q:1127 src/language/stats/frequencies.q:1409
-#: src/ui/gui/psppire-var-sheet.c:544 src/ui/gui/psppire-var-store.c:790
+#: src/language/stats/crosstabs.q:842 src/language/stats/examine.q:1215
+#: src/language/stats/frequencies.q:1116 src/language/stats/frequencies.q:1398
+#: src/ui/gui/psppire-var-sheet.c:533 src/ui/gui/psppire-var-store.c:799
 msgid "Missing"
 msgstr "Ontbrekend"
 
-#: src/language/stats/crosstabs.q:879 src/language/stats/examine.q:1290
-#: src/language/stats/frequencies.q:1061 src/language/stats/frequencies.q:1062
-#: src/language/stats/frequencies.q:1063
+#: src/language/stats/crosstabs.q:851 src/language/stats/examine.q:1292
+#: src/language/stats/frequencies.q:1050 src/language/stats/frequencies.q:1051
+#: src/language/stats/frequencies.q:1052
 msgid "Percent"
 msgstr "Procent"
 
-#: src/language/stats/crosstabs.q:1126
+#: src/language/stats/crosstabs.q:1131
 msgid "count"
 msgstr "aantal"
 
-#: src/language/stats/crosstabs.q:1127
+#: src/language/stats/crosstabs.q:1132
 msgid "row %"
 msgstr "rij %"
 
-#: src/language/stats/crosstabs.q:1128
+#: src/language/stats/crosstabs.q:1133
 msgid "column %"
 msgstr "kolom %"
 
-#: src/language/stats/crosstabs.q:1129
+#: src/language/stats/crosstabs.q:1134
 msgid "total %"
 msgstr "totaal %"
 
-#: src/language/stats/crosstabs.q:1130
+#: src/language/stats/crosstabs.q:1135
 msgid "expected"
 msgstr "verwacht"
 
-#: src/language/stats/crosstabs.q:1131
+#: src/language/stats/crosstabs.q:1136
 msgid "residual"
 msgstr "overblijvend"
 
-#: src/language/stats/crosstabs.q:1132
+#: src/language/stats/crosstabs.q:1137
 msgid "std. resid."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1133
+#: src/language/stats/crosstabs.q:1138
 msgid "adj. resid."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1163
+#: src/language/stats/crosstabs.q:1227
 msgid "Chi-square tests."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1166 src/language/stats/crosstabs.q:1193
-#: src/language/stats/crosstabs.q:1213 src/language/stats/crosstabs.q:1234
-#: src/language/stats/examine.q:1752 src/ui/gui/checkbox-treeview.c:92
+#: src/language/stats/crosstabs.q:1230 src/language/stats/crosstabs.q:1257
+#: src/language/stats/crosstabs.q:1281 src/language/stats/crosstabs.q:1305
+#: src/language/stats/examine.q:1753 src/ui/gui/checkbox-treeview.c:92
 msgid "Statistic"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1170
+#: src/language/stats/crosstabs.q:1234
 msgid "Asymp. Sig. (2-sided)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1172
-msgid "Exact. Sig. (2-sided)"
+#: src/language/stats/crosstabs.q:1236
+msgid "Exact Sig. (2-sided)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1174
-msgid "Exact. Sig. (1-sided)"
+#: src/language/stats/crosstabs.q:1238
+msgid "Exact Sig. (1-sided)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1189
+#: src/language/stats/crosstabs.q:1253
 msgid "Symmetric measures."
 msgstr "Symmetrische metingen."
 
-#: src/language/stats/crosstabs.q:1195 src/language/stats/crosstabs.q:1237
+#: src/language/stats/crosstabs.q:1259 src/language/stats/crosstabs.q:1308
 msgid "Asymp. Std. Error"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1196 src/language/stats/crosstabs.q:1238
+#: src/language/stats/crosstabs.q:1260 src/language/stats/crosstabs.q:1309
 msgid "Approx. T"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1197 src/language/stats/crosstabs.q:1239
+#: src/language/stats/crosstabs.q:1261 src/language/stats/crosstabs.q:1310
 msgid "Approx. Sig."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1208
+#: src/language/stats/crosstabs.q:1276
 msgid "Risk estimate."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1212
+#: src/language/stats/crosstabs.q:1280
 #, c-format
 msgid "95%% Confidence Interval"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1215 src/language/stats/t-test.q:1030
-#: src/language/stats/t-test.q:1216 src/language/stats/t-test.q:1319
+#: src/language/stats/crosstabs.q:1283 src/language/stats/t-test.q:757
+#: src/language/stats/t-test.q:921 src/language/stats/t-test.q:1014
 msgid "Lower"
 msgstr "Lager"
 
-#: src/language/stats/crosstabs.q:1216 src/language/stats/t-test.q:1031
-#: src/language/stats/t-test.q:1217 src/language/stats/t-test.q:1320
+#: src/language/stats/crosstabs.q:1284 src/language/stats/t-test.q:758
+#: src/language/stats/t-test.q:922 src/language/stats/t-test.q:1015
 msgid "Upper"
 msgstr "Hoger"
 
-#: src/language/stats/crosstabs.q:1230
+#: src/language/stats/crosstabs.q:1301
 msgid "Directional measures."
 msgstr "Directioneel metingen."
 
-#: src/language/stats/crosstabs.q:1235 src/ui/gui/psppire.glade:2124
-#: src/ui/gui/psppire-var-sheet.c:539 src/ui/gui/psppire-var-store.c:785
+#: src/language/stats/crosstabs.q:1306 src/ui/gui/psppire.glade:2099
+#: src/ui/gui/psppire-var-sheet.c:528 src/ui/gui/psppire-var-store.c:794
 msgid "Type"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1991
+#: src/language/stats/crosstabs.q:1774
 msgid "Pearson Chi-Square"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1992
+#: src/language/stats/crosstabs.q:1775
 msgid "Likelihood Ratio"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1993
+#: src/language/stats/crosstabs.q:1776
 msgid "Fisher's Exact Test"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1994
+#: src/language/stats/crosstabs.q:1777
 msgid "Continuity Correction"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1995
+#: src/language/stats/crosstabs.q:1778
 msgid "Linear-by-Linear Association"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2032 src/language/stats/crosstabs.q:2105
-#: src/language/stats/crosstabs.q:2167
+#: src/language/stats/crosstabs.q:1813 src/language/stats/crosstabs.q:1888
+#: src/language/stats/crosstabs.q:1953
 msgid "N of Valid Cases"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2051 src/language/stats/crosstabs.q:2183
+#: src/language/stats/crosstabs.q:1832 src/language/stats/crosstabs.q:1971
 msgid "Nominal by Nominal"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2052 src/language/stats/crosstabs.q:2184
+#: src/language/stats/crosstabs.q:1833 src/language/stats/crosstabs.q:1972
 msgid "Ordinal by Ordinal"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2053
+#: src/language/stats/crosstabs.q:1834
 msgid "Interval by Interval"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2054
+#: src/language/stats/crosstabs.q:1835
 msgid "Measure of Agreement"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2059 src/ui/gui/crosstabs-dialog.c:41
+#: src/language/stats/crosstabs.q:1840 src/ui/gui/crosstabs-dialog.c:41
 msgid "Phi"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2060
+#: src/language/stats/crosstabs.q:1841
 msgid "Cramer's V"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2061
+#: src/language/stats/crosstabs.q:1842
 msgid "Contingency Coefficient"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2062
+#: src/language/stats/crosstabs.q:1843
 msgid "Kendall's tau-b"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2063
+#: src/language/stats/crosstabs.q:1844
 msgid "Kendall's tau-c"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2064 src/ui/gui/crosstabs-dialog.c:48
+#: src/language/stats/crosstabs.q:1845 src/ui/gui/crosstabs-dialog.c:48
 msgid "Gamma"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2065
+#: src/language/stats/crosstabs.q:1846
 msgid "Spearman Correlation"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2066
+#: src/language/stats/crosstabs.q:1847
 msgid "Pearson's R"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2067 src/ui/gui/crosstabs-dialog.c:50
+#: src/language/stats/crosstabs.q:1848 src/ui/gui/crosstabs-dialog.c:50
 msgid "Kappa"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2140
+#: src/language/stats/crosstabs.q:1926
 #, c-format
 msgid "Odds Ratio for %s (%g / %g)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2143
+#: src/language/stats/crosstabs.q:1929
 #, c-format
 msgid "Odds Ratio for %s (%.*s / %.*s)"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2151
+#: src/language/stats/crosstabs.q:1937
 #, c-format
 msgid "For cohort %s = %g"
 msgstr "Voor cohort %s = %g"
 
-#: src/language/stats/crosstabs.q:2154
+#: src/language/stats/crosstabs.q:1940
 #, c-format
 msgid "For cohort %s = %.*s"
 msgstr "Voor cohort %s = %.*s"
 
-#: src/language/stats/crosstabs.q:2185
+#: src/language/stats/crosstabs.q:1973
 msgid "Nominal by Interval"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2190 src/ui/gui/crosstabs-dialog.c:43
+#: src/language/stats/crosstabs.q:1978 src/ui/gui/crosstabs-dialog.c:43
 msgid "Lambda"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2191
+#: src/language/stats/crosstabs.q:1979
 msgid "Goodman and Kruskal tau"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2192
+#: src/language/stats/crosstabs.q:1980
 msgid "Uncertainty Coefficient"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2193
+#: src/language/stats/crosstabs.q:1981
 msgid "Somers' d"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2194 src/ui/gui/crosstabs-dialog.c:51
+#: src/language/stats/crosstabs.q:1982 src/ui/gui/crosstabs-dialog.c:51
 msgid "Eta"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2199
+#: src/language/stats/crosstabs.q:1987
 msgid "Symmetric"
 msgstr ""
 
-#: src/language/stats/crosstabs.q:2200 src/language/stats/crosstabs.q:2201
+#: src/language/stats/crosstabs.q:1988 src/language/stats/crosstabs.q:1989
 #, c-format
 msgid "%s Dependent"
 msgstr ""
 
-#: src/language/stats/descriptives.c:102 src/language/stats/examine.q:1557
+#: src/language/stats/descriptives.c:102 src/language/stats/examine.q:1559
 #: src/language/stats/frequencies.q:123 src/language/stats/npar-summary.c:126
-#: src/language/stats/oneway.q:390 src/language/stats/t-test.q:701
-#: src/language/stats/t-test.q:725 src/language/stats/t-test.q:862
-#: src/language/stats/t-test.q:1213 src/ui/gui/descriptives-dialog.c:39
+#: src/language/stats/oneway.q:390 src/language/stats/t-test.q:507
+#: src/language/stats/t-test.q:527 src/language/stats/t-test.q:625
+#: src/language/stats/t-test.q:918 src/ui/gui/descriptives-dialog.c:39
 #: src/ui/gui/frequencies-dialog.c:40
 msgid "Mean"
 msgstr "Gemiddeld"
@@ -3343,13 +3283,13 @@ msgstr ""
 msgid "Std Dev"
 msgstr ""
 
-#: src/language/stats/descriptives.c:105 src/language/stats/examine.q:1588
+#: src/language/stats/descriptives.c:105 src/language/stats/examine.q:1589
 #: src/language/stats/frequencies.q:128 src/ui/gui/descriptives-dialog.c:46
 #: src/ui/gui/frequencies-dialog.c:45
 msgid "Variance"
 msgstr ""
 
-#: src/language/stats/descriptives.c:106 src/language/stats/examine.q:1624
+#: src/language/stats/descriptives.c:106 src/language/stats/examine.q:1625
 #: src/language/stats/frequencies.q:129 src/ui/gui/descriptives-dialog.c:47
 #: src/ui/gui/frequencies-dialog.c:50
 msgid "Kurtosis"
@@ -3359,7 +3299,7 @@ msgstr ""
 msgid "S E Kurt"
 msgstr ""
 
-#: src/language/stats/descriptives.c:108 src/language/stats/examine.q:1619
+#: src/language/stats/descriptives.c:108 src/language/stats/examine.q:1620
 #: src/language/stats/frequencies.q:131 src/ui/gui/descriptives-dialog.c:48
 #: src/ui/gui/frequencies-dialog.c:46
 msgid "Skewness"
@@ -3369,22 +3309,22 @@ msgstr ""
 msgid "S E Skew"
 msgstr ""
 
-#: src/language/stats/descriptives.c:110 src/language/stats/examine.q:1608
+#: src/language/stats/descriptives.c:110 src/language/stats/examine.q:1609
 #: src/language/stats/frequencies.q:133 src/ui/gui/descriptives-dialog.c:43
 #: src/ui/gui/frequencies-dialog.c:48
 msgid "Range"
 msgstr ""
 
-#: src/language/stats/descriptives.c:111 src/language/stats/examine.q:1598
+#: src/language/stats/descriptives.c:111 src/language/stats/examine.q:1599
 #: src/language/stats/frequencies.q:134 src/language/stats/npar-summary.c:132
-#: src/language/stats/oneway.q:403 src/ui/gui/descriptives-dialog.c:41
+#: src/language/stats/oneway.q:404 src/ui/gui/descriptives-dialog.c:41
 #: src/ui/gui/frequencies-dialog.c:42
 msgid "Minimum"
 msgstr ""
 
-#: src/language/stats/descriptives.c:112 src/language/stats/examine.q:1603
+#: src/language/stats/descriptives.c:112 src/language/stats/examine.q:1604
 #: src/language/stats/frequencies.q:135 src/language/stats/npar-summary.c:135
-#: src/language/stats/oneway.q:404 src/ui/gui/descriptives-dialog.c:42
+#: src/language/stats/oneway.q:405 src/ui/gui/descriptives-dialog.c:42
 #: src/ui/gui/frequencies-dialog.c:43
 msgid "Maximum"
 msgstr ""
@@ -3441,131 +3381,122 @@ msgstr ""
 msgid "Valid cases = %g; cases with missing value(s) = %g."
 msgstr "Geldige cases = %g; cases met missing value(s) = %g."
 
-#: src/language/stats/examine.q:343 src/language/stats/examine.q:496
-#: src/language/stats/examine.q:1058
+#: src/language/stats/examine.q:346 src/language/stats/examine.q:499
+#: src/language/stats/examine.q:1060
 msgid "Not creating plot because data set is empty."
 msgstr "Er wordt geen plot aangemaakt omdat de data set leeg is."
 
-#: src/language/stats/examine.q:353
+#: src/language/stats/examine.q:356
 #, c-format
 msgid "Normal Q-Q Plot of %s"
 msgstr "Normal Q-Q Plot van %s"
 
-#: src/language/stats/examine.q:354 src/language/stats/examine.q:359
+#: src/language/stats/examine.q:357 src/language/stats/examine.q:362
 msgid "Observed Value"
 msgstr "Waargenomen Waarde"
 
-#: src/language/stats/examine.q:355
+#: src/language/stats/examine.q:358
 msgid "Expected Normal"
 msgstr ""
 
-#: src/language/stats/examine.q:357
+#: src/language/stats/examine.q:360
 #, c-format
 msgid "Detrended Normal Q-Q Plot of %s"
 msgstr "Detrended Normal Q-Q Plot van %s"
 
-#: src/language/stats/examine.q:360
+#: src/language/stats/examine.q:363
 msgid "Dev from Normal"
 msgstr ""
 
-#: src/language/stats/examine.q:513
+#: src/language/stats/examine.q:516
 #, c-format
 msgid "Boxplot of %s vs. %s"
 msgstr ""
 
-#: src/language/stats/examine.q:517
+#: src/language/stats/examine.q:520
 #, c-format
 msgid "Boxplot of %s"
 msgstr ""
 
-#: src/language/stats/examine.q:753 src/language/stats/examine.q:766
+#: src/language/stats/examine.q:756 src/language/stats/examine.q:769
 #, c-format
 msgid "%s and %s are mutually exclusive"
 msgstr "%s en %s zijn wederzijds exclusief"
 
-#: src/language/stats/examine.q:1270 src/language/stats/reliability.q:685
+#: src/language/stats/examine.q:1272 src/language/stats/reliability.q:686
 msgid "Case Processing Summary"
 msgstr "Case Bewerkings Overzicht"
 
-#: src/language/stats/examine.q:1562 src/language/stats/oneway.q:398
+#: src/language/stats/examine.q:1564 src/language/stats/oneway.q:398
 #, c-format
 msgid "%g%% Confidence Interval for Mean"
 msgstr ""
 
-#: src/language/stats/examine.q:1568 src/language/stats/oneway.q:400
+#: src/language/stats/examine.q:1570 src/language/stats/oneway.q:401
 msgid "Lower Bound"
 msgstr "Beneden Grens"
 
-#: src/language/stats/examine.q:1573 src/language/stats/oneway.q:401
+#: src/language/stats/examine.q:1575 src/language/stats/oneway.q:402
 msgid "Upper Bound"
 msgstr "Boven Grens"
 
-#: src/language/stats/examine.q:1578
-#, c-format
-msgid "5%% Trimmed Mean"
+#: src/language/stats/examine.q:1579
+msgid "5% Trimmed Mean"
 msgstr ""
 
-#: src/language/stats/examine.q:1583 src/language/stats/frequencies.q:125
+#: src/language/stats/examine.q:1584 src/language/stats/frequencies.q:125
 #: src/ui/gui/frequencies-dialog.c:52
 msgid "Median"
 msgstr ""
 
-#: src/language/stats/examine.q:1593 src/language/stats/npar-summary.c:129
-#: src/language/stats/oneway.q:391 src/language/stats/t-test.q:702
-#: src/language/stats/t-test.q:726 src/language/stats/t-test.q:864
-#: src/language/stats/t-test.q:1214
+#: src/language/stats/examine.q:1594 src/language/stats/npar-summary.c:129
+#: src/language/stats/oneway.q:391 src/language/stats/t-test.q:508
+#: src/language/stats/t-test.q:528 src/language/stats/t-test.q:627
+#: src/language/stats/t-test.q:919
 msgid "Std. Deviation"
 msgstr ""
 
-#: src/language/stats/examine.q:1613
+#: src/language/stats/examine.q:1614
 msgid "Interquartile Range"
 msgstr ""
 
-#: src/language/stats/examine.q:1749 src/language/stats/oneway.q:407
+#: src/language/stats/examine.q:1750 src/language/stats/oneway.q:408
 #: src/ui/gui/examine.glade:310
 msgid "Descriptives"
 msgstr ""
 
-#: src/language/stats/examine.q:1755 src/language/stats/oneway.q:392
-#: src/language/stats/oneway.q:687 src/language/stats/regression.q:203
+#: src/language/stats/examine.q:1756 src/language/stats/oneway.q:392
+#: src/language/stats/oneway.q:689 src/language/stats/regression.q:203
 msgid "Std. Error"
 msgstr ""
 
-#: src/language/stats/examine.q:1852 src/language/stats/examine.q:1857
-#: src/ui/gui/psppire-data-store.c:756 src/ui/gui/psppire-var-store.c:646
-#: src/ui/gui/psppire-var-store.c:656 src/ui/gui/psppire-var-store.c:666
-#: src/ui/gui/psppire-var-store.c:777
-#, c-format
-msgid "%d"
-msgstr ""
-
-#: src/language/stats/examine.q:1938
+#: src/language/stats/examine.q:1939
 msgid "Highest"
 msgstr "Hoogste"
 
-#: src/language/stats/examine.q:1943
+#: src/language/stats/examine.q:1944
 msgid "Lowest"
 msgstr "Laagste"
 
-#: src/language/stats/examine.q:1950
+#: src/language/stats/examine.q:1951
 msgid "Extreme Values"
 msgstr "Extreme Waardes"
 
-#: src/language/stats/examine.q:1954
+#: src/language/stats/examine.q:1955
 msgid "Case Number"
 msgstr "Case Nummer"
 
-#: src/language/stats/examine.q:2076
+#: src/language/stats/examine.q:2077
 msgid "Tukey's Hinges"
 msgstr ""
 
-#: src/language/stats/examine.q:2116 src/language/stats/examine.q:2134
-#: src/language/stats/frequencies.q:1418 src/language/stats/npar-summary.c:142
+#: src/language/stats/examine.q:2117 src/language/stats/examine.q:2134
+#: src/language/stats/frequencies.q:1407 src/language/stats/npar-summary.c:142
 #: src/ui/gui/examine.glade:333
 msgid "Percentiles"
 msgstr ""
 
-#: src/language/stats/examine.q:2123
+#: src/language/stats/examine.q:2124
 #, c-format
 msgid "%g"
 msgstr ""
@@ -3576,68 +3507,54 @@ msgid ""
 msgstr ""
 "FLIP negeert TEMPORARY. Tijdelijke transformaties worden permanent gemaakt."
 
-#: src/language/stats/flip.c:151
+#: src/language/stats/flip.c:147
 msgid "Could not create temporary file for FLIP."
 msgstr "Kon geen tijdelijk bestand voor FLIP aanmaken."
 
-#: src/language/stats/flip.c:162
-#, c-format
-msgid "Error writing FLIP file: %s."
-msgstr "Fout tijdens het schrijven van FLIP bestand: %s."
-
-#: src/language/stats/flip.c:262
-#, c-format
-msgid "Could not create acceptable variant for variable %s."
-msgstr "Kon geen acceptabele variant voor variabele %s creëren."
-
-#: src/language/stats/flip.c:278
-msgid "Cannot create more than 99999 variable names."
-msgstr "Kan niet meer dan 99999 variabele namen creëren."
-
-#: src/language/stats/flip.c:394
+#: src/language/stats/flip.c:324
 #, c-format
 msgid "Error rewinding FLIP file: %s."
 msgstr "Fout tijdens terugdraaien FLIP bestand: %s."
 
-#: src/language/stats/flip.c:401
+#: src/language/stats/flip.c:331
 msgid "Error creating FLIP source file."
 msgstr "Fout tijdens het creëren van FLIP bron bestand."
 
-#: src/language/stats/flip.c:414
+#: src/language/stats/flip.c:344
 #, c-format
 msgid "Error reading FLIP file: %s."
 msgstr "Fout tijdens lezen FLIP bestand: %s."
 
-#: src/language/stats/flip.c:416
+#: src/language/stats/flip.c:346
 msgid "Unexpected end of file reading FLIP file."
 msgstr "Onverwacht einde bestand tijdens lezen FLIP bestand."
 
-#: src/language/stats/flip.c:432
+#: src/language/stats/flip.c:362
 #, c-format
 msgid "Error seeking FLIP source file: %s."
 msgstr "Fout tijdens zoeken FLIP bron bestand: %s."
 
-#: src/language/stats/flip.c:440
+#: src/language/stats/flip.c:370
 #, c-format
 msgid "Error writing FLIP source file: %s."
 msgstr "Fout tijdens schrijven FLIP bron bestand: %s."
 
-#: src/language/stats/flip.c:451
+#: src/language/stats/flip.c:381
 #, c-format
 msgid "Error closing FLIP source file: %s."
 msgstr "Fout tijdens sluiten FLIP bron bestand: %s."
 
-#: src/language/stats/flip.c:459
+#: src/language/stats/flip.c:389
 #, c-format
 msgid "Error rewinding FLIP source file: %s."
 msgstr "Fout tijdens terugdraaien FLIP bron bestand: %s."
 
-#: src/language/stats/flip.c:487
+#: src/language/stats/flip.c:419
 #, c-format
 msgid "Error reading FLIP temporary file: %s."
 msgstr "Fout tijdens lezen FLIP tijdelijk bestand: %s."
 
-#: src/language/stats/flip.c:490
+#: src/language/stats/flip.c:422
 msgid "Unexpected end of file reading FLIP temporary file."
 msgstr "Onverwacht einde bestand tijdens lezen FLIP tijdelijk bestand."
 
@@ -3657,7 +3574,7 @@ msgstr ""
 msgid "S.E. Skew"
 msgstr ""
 
-#: src/language/stats/frequencies.q:409
+#: src/language/stats/frequencies.q:405
 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 "
@@ -3667,7 +3584,7 @@ msgstr ""
 "HBAR wordt aangenomen.  Argument waardes zullen gebruikt worden in opgegeven "
 "volgorde."
 
-#: src/language/stats/frequencies.q:492
+#: src/language/stats/frequencies.q:488
 #, c-format
 msgid ""
 "MAX must be greater than or equal to MIN, if both are specified.  However, "
@@ -3676,52 +3593,52 @@ msgstr ""
 "MAX moet groter of gelijk zijn aan MIN, als beiden zijn opgegeven. Maar, MIN "
 "was opgegeven als %g en MAX als %g. MIN en MAX worden genegeerd."
 
-#: src/language/stats/frequencies.q:757
+#: src/language/stats/frequencies.q:752
 #, c-format
 msgid "Variable %s specified multiple times on VARIABLES subcommand."
 msgstr "Variabele %s is meerdere keren opgegeven bij VARIABLES subopdracht."
 
-#: src/language/stats/frequencies.q:820
+#: src/language/stats/frequencies.q:809
 msgid "`)' expected after GROUPED interval list."
 msgstr "')' verwacht na GROUPED interval lijst."
 
-#: src/language/stats/frequencies.q:832
+#: src/language/stats/frequencies.q:821
 #, c-format
 msgid "Variables %s specified on GROUPED but not on VARIABLES."
 msgstr "Variabele %s gespecificeerd bij GROUPED maar niet bij VARIABLES."
 
-#: src/language/stats/frequencies.q:839
+#: src/language/stats/frequencies.q:828
 #, c-format
 msgid "Variables %s specified multiple times on GROUPED subcommand."
 msgstr "Variabele %s is meerdere keren gespecificeerd bij GROUPED subopdracht."
 
-#: src/language/stats/frequencies.q:1058 src/language/stats/frequencies.q:1151
-#: src/language/stats/frequencies.q:1152 src/language/stats/frequencies.q:1187
+#: src/language/stats/frequencies.q:1047 src/language/stats/frequencies.q:1140
+#: src/language/stats/frequencies.q:1141 src/language/stats/frequencies.q:1176
 msgid "Cum"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1060 src/output/charts/plot-hist.c:140
+#: src/language/stats/frequencies.q:1049 src/output/charts/plot-hist.c:140
 msgid "Frequency"
 msgstr "Frequenties"
 
-#: src/language/stats/frequencies.q:1081
+#: src/language/stats/frequencies.q:1070
 msgid "Value Label"
 msgstr "Waarde Label"
 
-#: src/language/stats/frequencies.q:1185
+#: src/language/stats/frequencies.q:1174
 msgid "Freq"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1186 src/language/stats/frequencies.q:1188
+#: src/language/stats/frequencies.q:1175 src/language/stats/frequencies.q:1177
 msgid "Pct"
 msgstr ""
 
-#: src/language/stats/frequencies.q:1381
+#: src/language/stats/frequencies.q:1370
 #, c-format
 msgid "No valid data for variable %s; statistics not displayed."
 msgstr "Geen geldige data voor variabele %s; statistieken worden niet getoond."
 
-#: src/language/stats/frequencies.q:1422
+#: src/language/stats/frequencies.q:1411
 msgid "50 (Median)"
 msgstr ""
 
@@ -3761,7 +3678,7 @@ msgstr ""
 "%d verwachte waardes waren opgegeven, maar de opgegeven range (%d-%d) "
 "vereist precies %d waardes."
 
-#: src/language/stats/npar.q:441 src/language/stats/t-test.q:501
+#: src/language/stats/npar.q:441 src/language/stats/t-test.q:379
 #, c-format
 msgid ""
 "PAIRED was specified but the number of variables preceding WITH (%zu) did "
@@ -3809,11 +3726,11 @@ msgid "Mean Square"
 msgstr ""
 
 #: src/language/stats/oneway.q:280 src/language/stats/regression.q:304
-#: src/language/stats/t-test.q:1023
+#: src/language/stats/t-test.q:750
 msgid "F"
 msgstr ""
 
-#: src/language/stats/oneway.q:281 src/language/stats/oneway.q:538
+#: src/language/stats/oneway.q:281 src/language/stats/oneway.q:539
 #: src/language/stats/regression.q:206 src/language/stats/regression.q:305
 msgid "Significance"
 msgstr "Significantie "
@@ -3830,19 +3747,19 @@ msgstr "Binnen Groepen"
 msgid "ANOVA"
 msgstr ""
 
-#: src/language/stats/oneway.q:535
+#: src/language/stats/oneway.q:536
 msgid "Levene Statistic"
 msgstr ""
 
-#: src/language/stats/oneway.q:536
+#: src/language/stats/oneway.q:537
 msgid "df1"
 msgstr ""
 
-#: src/language/stats/oneway.q:537
+#: src/language/stats/oneway.q:538
 msgid "df2"
 msgstr ""
 
-#: src/language/stats/oneway.q:540
+#: src/language/stats/oneway.q:541
 msgid "Test of Homogeneity of Variances"
 msgstr ""
 
@@ -3850,34 +3767,34 @@ msgstr ""
 msgid "Contrast Coefficients"
 msgstr ""
 
-#: src/language/stats/oneway.q:610 src/language/stats/oneway.q:685
+#: src/language/stats/oneway.q:610 src/language/stats/oneway.q:687
 msgid "Contrast"
 msgstr ""
 
-#: src/language/stats/oneway.q:683
+#: src/language/stats/oneway.q:685
 msgid "Contrast Tests"
 msgstr ""
 
-#: src/language/stats/oneway.q:686
+#: src/language/stats/oneway.q:688
 msgid "Value of Contrast"
 msgstr ""
 
-#: src/language/stats/oneway.q:688 src/language/stats/regression.q:205
-#: src/language/stats/t-test.q:1025 src/language/stats/t-test.q:1218
-#: src/language/stats/t-test.q:1315
+#: src/language/stats/oneway.q:690 src/language/stats/regression.q:205
+#: src/language/stats/t-test.q:752 src/language/stats/t-test.q:923
+#: src/language/stats/t-test.q:1010
 msgid "t"
 msgstr ""
 
-#: src/language/stats/oneway.q:690 src/language/stats/t-test.q:1027
-#: src/language/stats/t-test.q:1220 src/language/stats/t-test.q:1317
+#: src/language/stats/oneway.q:692 src/language/stats/t-test.q:754
+#: src/language/stats/t-test.q:925 src/language/stats/t-test.q:1012
 msgid "Sig. (2-tailed)"
 msgstr ""
 
-#: src/language/stats/oneway.q:734
+#: src/language/stats/oneway.q:736
 msgid "Assume equal variances"
 msgstr "Veronderstelt gelijke variantie"
 
-#: src/language/stats/oneway.q:738
+#: src/language/stats/oneway.q:740
 msgid "Does not assume equal"
 msgstr "Veronderstelt niet gelijk"
 
@@ -3904,22 +3821,22 @@ msgstr "Variabelen gecreëerd door RANK"
 msgid "%s into %s(%s of %s using %s BY %s)"
 msgstr "%s in %s(%s van %s gebruikt %s PER %s)"
 
-#: src/language/stats/rank.q:729
+#: src/language/stats/rank.q:728
 #, c-format
 msgid "%s into %s(%s of %s BY %s)"
 msgstr "%s in %s(%s van %s PER %s)"
 
-#: src/language/stats/rank.q:743
+#: src/language/stats/rank.q:741
 #, c-format
 msgid "%s into %s(%s of %s using %s)"
 msgstr "%s in %s(%s van %s gebruikt %s"
 
-#: src/language/stats/rank.q:753
+#: src/language/stats/rank.q:750
 #, c-format
 msgid "%s into %s(%s of %s)"
 msgstr "%s in %s(%s van %s)"
 
-#: src/language/stats/rank.q:766
+#: src/language/stats/rank.q:762
 msgid ""
 "FRACTION has been specified, but NORMAL and PROPORTION rank functions have "
 "not been requested.  The FRACTION subcommand will be ignored."
@@ -3927,12 +3844,12 @@ msgstr ""
 "FRACTION is gespecificeerd maar NORMAL en PROPORTION rangschik functies ziin "
 "niet gevraagd. De FRACTION subopdracht wordt genegeerd."
 
-#: src/language/stats/rank.q:857
+#: src/language/stats/rank.q:853
 #, c-format
 msgid "Variable %s already exists."
 msgstr "Variabele %s bestaat al."
 
-#: src/language/stats/rank.q:862
+#: src/language/stats/rank.q:858
 msgid "Too many variables in INTO clause."
 msgstr "Te veel variabelen in INTO clause."
 
@@ -3999,104 +3916,103 @@ msgstr ""
 msgid "Dependent variable must be numeric."
 msgstr "Afhankelijke variabele moet numeriek zijn."
 
-#: src/language/stats/reliability.q:432
+#: src/language/stats/reliability.q:433
 msgid "Reliability Statistics"
 msgstr ""
 
-#: src/language/stats/reliability.q:475
+#: src/language/stats/reliability.q:476
 msgid "Item-Total Statistics"
 msgstr ""
 
-#: src/language/stats/reliability.q:497
+#: src/language/stats/reliability.q:498
 msgid "Scale Mean if Item Deleted"
 msgstr ""
 
-#: src/language/stats/reliability.q:500
+#: src/language/stats/reliability.q:501
 msgid "Scale Variance if Item Deleted"
 msgstr ""
 
-#: src/language/stats/reliability.q:503
+#: src/language/stats/reliability.q:504
 msgid "Corrected Item-Total Correlation"
 msgstr ""
 
-#: src/language/stats/reliability.q:506
+#: src/language/stats/reliability.q:507
 msgid "Cronbach's Alpha if Item Deleted"
 msgstr ""
 
-#: src/language/stats/reliability.q:556 src/language/stats/reliability.q:575
+#: src/language/stats/reliability.q:557 src/language/stats/reliability.q:576
 msgid "Cronbach's Alpha"
 msgstr ""
 
-#: src/language/stats/reliability.q:559
+#: src/language/stats/reliability.q:560
 msgid "N of items"
 msgstr ""
 
-#: src/language/stats/reliability.q:578
+#: src/language/stats/reliability.q:579
 msgid "Part 1"
 msgstr "Deel 1"
 
-#: src/language/stats/reliability.q:584 src/language/stats/reliability.q:595
+#: src/language/stats/reliability.q:585 src/language/stats/reliability.q:596
 msgid "N of Items"
 msgstr ""
 
-#: src/language/stats/reliability.q:589
+#: src/language/stats/reliability.q:590
 msgid "Part 2"
 msgstr "Deel 2"
 
-#: src/language/stats/reliability.q:600
+#: src/language/stats/reliability.q:601
 msgid "Total N of Items"
 msgstr ""
 
-#: src/language/stats/reliability.q:603
+#: src/language/stats/reliability.q:604
 msgid "Correlation Between Forms"
 msgstr ""
 
-#: src/language/stats/reliability.q:607
+#: src/language/stats/reliability.q:608
 msgid "Spearman-Brown Coefficient"
 msgstr ""
 
-#: src/language/stats/reliability.q:610
+#: src/language/stats/reliability.q:611
 msgid "Equal Length"
 msgstr "Gelijke Lengte"
 
-#: src/language/stats/reliability.q:613
+#: src/language/stats/reliability.q:614
 msgid "Unequal Length"
 msgstr "Ongelijke Lengte"
 
-#: src/language/stats/reliability.q:617
+#: src/language/stats/reliability.q:618
 msgid "Guttman Split-Half Coefficient"
 msgstr ""
 
-#: src/language/stats/reliability.q:714
+#: src/language/stats/reliability.q:715
 msgid "Excluded"
 msgstr "Uitgesloten"
 
 #: src/language/stats/reliability.q:723
-#, c-format
-msgid "%%"
+msgid "%"
 msgstr ""
 
-#: src/language/stats/sign.c:90
+#: src/language/stats/sign.c:91
 msgid "Negative Differences"
 msgstr "Negatieve Verschillen"
 
-#: src/language/stats/sign.c:91
+#: src/language/stats/sign.c:92
 msgid "Positive Differences"
 msgstr "Positieve Verschillen"
 
-#: src/language/stats/sign.c:92 src/language/stats/wilcoxon.c:245
+#: src/language/stats/sign.c:93 src/language/stats/wilcoxon.c:261
 msgid "Ties"
 msgstr ""
 
-#: src/language/stats/sign.c:133
+#: src/language/stats/sign.c:134 src/language/stats/wilcoxon.c:331
 msgid "Exact Sig. (2-tailed)"
 msgstr ""
 
-#: src/language/stats/sign.c:136
+#: src/language/stats/sign.c:137 src/language/stats/wilcoxon.c:332
 msgid "Exact Sig. (1-tailed)"
 msgstr ""
 
-#: src/language/stats/sign.c:139 src/language/stats/wilcoxon.c:319
+#: src/language/stats/sign.c:140 src/language/stats/wilcoxon.c:335
 msgid "Point Probability"
 msgstr ""
 
@@ -4117,163 +4033,152 @@ msgstr "')' verwacht."
 msgid "Variable %s specified twice in sort criteria."
 msgstr "Variabele %s 2 keer opgegeven in sort criteria."
 
-#: src/language/stats/t-test.q:280
-msgid "TESTVAL, GROUPS and PAIRS subcommands are mutually exclusive."
+#: src/language/stats/t-test.q:189
+#, fuzzy
+msgid "Exactly one of TESTVAL, GROUPS and PAIRS subcommands must be specified."
 msgstr "TESTVAL, GROUPS en PAIRS subopdracht zijn wederzijds uitsluitend."
 
-#: src/language/stats/t-test.q:298
-msgid "VARIABLES subcommand is not appropriate with PAIRS"
+#: src/language/stats/t-test.q:210
+#, fuzzy
+msgid "VARIABLES subcommand may not be used with PAIRS."
 msgstr "VARIABLES subprogramma is niet het juiste met PAIRS"
 
-#: src/language/stats/t-test.q:336
+#: src/language/stats/t-test.q:229
 msgid "One or more VARIABLES must be specified."
 msgstr "Een of meer VARIABLES moeten gespecificeerd zijn."
 
-#: src/language/stats/t-test.q:386
-#, c-format
-msgid "Long string variable %s is not valid here."
-msgstr "Lange string variabele %s is niet geldig hier."
-
-#: src/language/stats/t-test.q:406 src/language/stats/t-test.q:420
+#: src/language/stats/t-test.q:323
 msgid ""
 "When applying GROUPS to a string variable, two values must be specified."
 msgstr ""
 "By het toepassen van GROUPS op een string variabele moeten twee waardes "
 "opgegeven zijn."
 
-#: src/language/stats/t-test.q:518
+#: src/language/stats/t-test.q:394
 msgid "At least two variables must be specified on PAIRS."
 msgstr "Ten minste 2 variabelen moeten opgegeven worden bij PAIRS."
 
-#: src/language/stats/t-test.q:698
+#: src/language/stats/t-test.q:504
 msgid "One-Sample Statistics"
 msgstr ""
 
-#: src/language/stats/t-test.q:703 src/language/stats/t-test.q:727
-#: src/language/stats/t-test.q:865
+#: src/language/stats/t-test.q:509 src/language/stats/t-test.q:529
+#: src/language/stats/t-test.q:628
 msgid "SE. Mean"
 msgstr ""
 
-#: src/language/stats/t-test.q:722
+#: src/language/stats/t-test.q:523
 msgid "Group Statistics"
 msgstr ""
 
-#: src/language/stats/t-test.q:859
+#: src/language/stats/t-test.q:622
 msgid "Paired Sample Statistics"
 msgstr ""
 
-#: src/language/stats/t-test.q:885 src/language/stats/t-test.q:1243
-#: src/language/stats/t-test.q:1442
+#: src/language/stats/t-test.q:642 src/language/stats/t-test.q:945
+#: src/language/stats/t-test.q:1119
 #, c-format
 msgid "Pair %d"
 msgstr ""
 
-#: src/language/stats/t-test.q:1011
+#: src/language/stats/t-test.q:738
 msgid "Independent Samples Test"
 msgstr ""
 
-#: src/language/stats/t-test.q:1019
+#: src/language/stats/t-test.q:746
 msgid "Levene's Test for Equality of Variances"
 msgstr ""
 
-#: src/language/stats/t-test.q:1021
+#: src/language/stats/t-test.q:748
 msgid "t-test for Equality of Means"
 msgstr ""
 
-#: src/language/stats/t-test.q:1024 src/language/stats/t-test.q:1427
+#: src/language/stats/t-test.q:751 src/language/stats/t-test.q:1107
 msgid "Sig."
 msgstr ""
 
-#: src/language/stats/t-test.q:1028 src/language/stats/t-test.q:1318
+#: src/language/stats/t-test.q:755 src/language/stats/t-test.q:1013
 msgid "Mean Difference"
 msgstr "Gemiddelde Verschil"
 
-#: src/language/stats/t-test.q:1029
+#: src/language/stats/t-test.q:756
 msgid "Std. Error Difference"
 msgstr ""
 
-#: src/language/stats/t-test.q:1034 src/language/stats/t-test.q:1210
-#: src/language/stats/t-test.q:1310
+#: src/language/stats/t-test.q:761 src/language/stats/t-test.q:915
+#: src/language/stats/t-test.q:1005
 #, c-format
 msgid "%g%% Confidence Interval of the Difference"
 msgstr ""
 
-#: src/language/stats/t-test.q:1090
+#: src/language/stats/t-test.q:815
 msgid "Equal variances assumed"
 msgstr ""
 
-#: src/language/stats/t-test.q:1142
+#: src/language/stats/t-test.q:861
 msgid "Equal variances not assumed"
 msgstr ""
 
-#: src/language/stats/t-test.q:1200
+#: src/language/stats/t-test.q:905
 msgid "Paired Samples Test"
 msgstr ""
 
-#: src/language/stats/t-test.q:1203
+#: src/language/stats/t-test.q:908
 msgid "Paired Differences"
 msgstr ""
 
-#: src/language/stats/t-test.q:1215
+#: src/language/stats/t-test.q:920
 msgid "Std. Error Mean"
 msgstr ""
 
-#: src/language/stats/t-test.q:1299
+#: src/language/stats/t-test.q:994
 msgid "One-Sample Test"
 msgstr ""
 
-#: src/language/stats/t-test.q:1304
+#: src/language/stats/t-test.q:999
 #, c-format
 msgid "Test Value = %f"
 msgstr ""
 
-#: src/language/stats/t-test.q:1422
+#: src/language/stats/t-test.q:1102
 msgid "Paired Samples Correlations"
 msgstr ""
 
-#: src/language/stats/t-test.q:1426
+#: src/language/stats/t-test.q:1106
 msgid "Correlation"
 msgstr "Correlatie"
 
-#: src/language/stats/t-test.q:1445
+#: src/language/stats/t-test.q:1121
 #, c-format
 msgid "%s & %s"
 msgstr ""
 
-#: src/language/stats/wilcoxon.c:216
+#: src/language/stats/wilcoxon.c:232
 msgid "Ranks"
 msgstr "Rangen"
 
-#: src/language/stats/wilcoxon.c:230
+#: src/language/stats/wilcoxon.c:246
 msgid "Mean Rank"
 msgstr "Gemiddelde Rang"
 
-#: src/language/stats/wilcoxon.c:231
+#: src/language/stats/wilcoxon.c:247
 msgid "Sum of Ranks"
 msgstr "Totaal van de Rangen"
 
-#: src/language/stats/wilcoxon.c:243
+#: src/language/stats/wilcoxon.c:259
 msgid "Negative Ranks"
 msgstr "Negatieve Rangen"
 
-#: src/language/stats/wilcoxon.c:244
+#: src/language/stats/wilcoxon.c:260
 msgid "Positive Ranks"
 msgstr "Positieve Rangen"
 
-#: src/language/stats/wilcoxon.c:310
+#: src/language/stats/wilcoxon.c:326
 msgid "Z"
 msgstr ""
 
-#: src/language/stats/wilcoxon.c:311
-msgid "Asymp. Sig (2-tailed)"
-msgstr ""
-
-#: src/language/stats/wilcoxon.c:315
-msgid "Exact Sig (2-tailed)"
-msgstr ""
-
-#: src/language/stats/wilcoxon.c:316
-msgid "Exact Sig (1-tailed)"
+#: src/language/stats/wilcoxon.c:327
+msgid "Asymp. Sig. (2-tailed)"
 msgstr ""
 
 #: src/language/syntax-file.c:88
@@ -4286,35 +4191,16 @@ msgstr "openen \"%s\" als syntax bestand"
 msgid "Opening `%s': %s."
 msgstr "Openen '%s': %s."
 
-#: src/language/syntax-file.c:106
+#: src/language/syntax-file.c:107
 #, c-format
 msgid "Reading `%s': %s."
 msgstr "Lezen '%s': %s."
 
-#: src/language/syntax-file.c:126
+#: src/language/syntax-file.c:127
 #, c-format
 msgid "Closing `%s': %s."
 msgstr "Sluiten '%s': %s."
 
-#: src/language/tests/check-model.q:138
-msgid "PATH and SEARCH subcommands are mutually exclusive.  Ignoring PATH."
-msgstr ""
-"PATH en SEARCH subopdrachten zijn wederzijds uitsluitend. PATH genegeerd. "
-
-#: src/language/tests/check-model.q:156
-msgid "At least one value must be specified on PATH."
-msgstr "Tenminste 1 waarde dient bij PATH opgegeven te zijn."
-
-#: src/language/tests/check-model.q:167
-#, c-format
-msgid "Hash bits adjusted to %d."
-msgstr "Hash bits aangepast naar %d."
-
-#: src/language/tests/check-model.q:208
-#, c-format
-msgid "error opening \"%s\" for writing"
-msgstr "fout bij openen \"%s\" voor schrijven"
-
 #: src/language/tests/float-format.c:124
 #, c-format
 msgid "%zu-byte string needed but %zu-byte string supplied."
@@ -4448,99 +4334,46 @@ msgstr ""
 "FORMAT vereist numeriek uitvoer formaat als een argument. Opgegeven formaat %"
 "s is van het type string."
 
-#: src/language/utilities/set.q:522
-msgid "BLANKS is SYSMIS."
-msgstr ""
-
-#: src/language/utilities/set.q:524
-#, c-format
-msgid "BLANKS is %g."
-msgstr ""
-
-#: src/language/utilities/set.q:559
-#, c-format
-msgid "%s is \"%s\"."
-msgstr ""
-
-#: src/language/utilities/set.q:595
-#, c-format
-msgid "DECIMAL is \"%c\"."
+#: src/language/utilities/set.q:668
+msgid "ISL (32-bit IEEE 754 single, little-endian)"
 msgstr ""
 
-#: src/language/utilities/set.q:601
-#, c-format
-msgid "ENDCMD is \"%c\"."
+#: src/language/utilities/set.q:671
+msgid "ISB (32-bit IEEE 754 single, big-endian)"
 msgstr ""
 
-#: src/language/utilities/set.q:609
-#, c-format
-msgid "ERRORS is \"%s\"."
+#: src/language/utilities/set.q:674
+msgid "IDL (64-bit IEEE 754 double, little-endian)"
 msgstr ""
 
-#: src/language/utilities/set.q:620
-#, c-format
-msgid "FORMAT is %s."
+#: src/language/utilities/set.q:677
+msgid "IDB (64-bit IEEE 754 double, big-endian)"
 msgstr ""
 
-#: src/language/utilities/set.q:626
-#, c-format
-msgid "LENGTH is %d."
+#: src/language/utilities/set.q:681
+msgid "VF (32-bit VAX F, VAX-endian)"
 msgstr ""
 
-#: src/language/utilities/set.q:632
-#, c-format
-msgid "LOCALE is %s"
+#: src/language/utilities/set.q:684
+msgid "VD (64-bit VAX D, VAX-endian)"
 msgstr ""
 
-#: src/language/utilities/set.q:638
-#, c-format
-msgid "MXERRS is %d."
+#: src/language/utilities/set.q:687
+msgid "VG (64-bit VAX G, VAX-endian)"
 msgstr ""
 
-#: src/language/utilities/set.q:644
-#, c-format
-msgid "MXLOOPS is %d."
+#: src/language/utilities/set.q:691
+msgid "ZS (32-bit IBM Z hexadecimal short, big-endian)"
 msgstr ""
 
-#: src/language/utilities/set.q:650
-#, c-format
-msgid "MXWARNS is %d."
+#: src/language/utilities/set.q:694
+msgid "ZL (64-bit IBM Z hexadecimal long, big-endian)"
 msgstr ""
 
-#: src/language/utilities/set.q:657 src/language/utilities/set.q:708
-#, c-format
-msgid "%s is %s (%s)."
-msgstr ""
-
-#: src/language/utilities/set.q:729
-msgid "SCOMPRESSION is ON."
-msgstr ""
-
-#: src/language/utilities/set.q:731
-msgid "SCOMPRESSION is OFF."
-msgstr ""
-
-#: src/language/utilities/set.q:738
-msgid "UNDEFINED is WARN."
-msgstr ""
-
-#: src/language/utilities/set.q:740
-msgid "UNDEFINED is NOWARN."
-msgstr ""
-
-#: src/language/utilities/set.q:748
-msgid "WEIGHT is off."
-msgstr "WEGING is uit."
-
-#: src/language/utilities/set.q:750
-#, c-format
-msgid "WEIGHT is variable %s."
-msgstr "WEGING is variabele %s."
-
-#: src/language/utilities/set.q:768
-#, c-format
-msgid "WIDTH is %d."
-msgstr "BREEDTE is %d."
+#: src/language/utilities/set.q:793
+#, fuzzy, c-format
+msgid "%s is %s."
+msgstr "%s van %s"
 
 #: src/language/utilities/title.c:68
 #, c-format
@@ -4569,7 +4402,7 @@ msgstr ""
 "Tijdens uitvoeren van COMPUTE: %g is geen geldige waarde als een index in "
 "vector %s."
 
-#: src/language/xforms/compute.c:354
+#: src/language/xforms/compute.c:353
 #, c-format
 msgid "There is no vector named %s."
 msgstr "Er is geen vector genaamd %s."
@@ -4578,7 +4411,7 @@ msgstr "Er is geen vector genaamd %s."
 msgid "Destination cannot be a string variable."
 msgstr "Bestemming kan geen string variabele zijn."
 
-#: src/language/xforms/recode.c:251
+#: src/language/xforms/recode.c:245
 msgid ""
 "Inconsistent target variable types.  Target variables must be all numeric or "
 "all string."
@@ -4586,19 +4419,19 @@ msgstr ""
 "Inconsistent doel variabele types.  Doel variabelen moeten allemaal numeriek "
 "of allemaal string zijn. "
 
-#: src/language/xforms/recode.c:272
+#: src/language/xforms/recode.c:266
 msgid "CONVERT requires string input values and numeric output values."
 msgstr "CONVERT vereist string invoer waardes en numerieke uitvoer waardes."
 
-#: src/language/xforms/recode.c:329
+#: src/language/xforms/recode.c:321
 msgid "THRU is not allowed with string variables."
 msgstr "THRU is niet toegestaan met string variabelen."
 
-#: src/language/xforms/recode.c:407
+#: src/language/xforms/recode.c:400
 msgid "expecting output value"
 msgstr "verwacht uitvoer waarde"
 
-#: src/language/xforms/recode.c:456
+#: src/language/xforms/recode.c:457
 #, c-format
 msgid ""
 "%zu variable(s) cannot be recoded into %zu variable(s).  Specify the same "
@@ -4607,7 +4440,7 @@ msgstr ""
 "%zu variabel(en) kunnen niet gehercodeerd worden in %zu variabel(en).  "
 "Specificeer hetzelfde aantal variabelen als bron en als doel variabelen."
 
-#: src/language/xforms/recode.c:471
+#: src/language/xforms/recode.c:472
 #, c-format
 msgid ""
 "There is no variable named %s.  (All string variables specified on INTO must "
@@ -4617,12 +4450,12 @@ msgstr ""
 "INTO dienen al te bestaan.  Gebruik de STRING opdracht om een string "
 "variabele aan te maken.)"
 
-#: src/language/xforms/recode.c:487
+#: src/language/xforms/recode.c:488
 #, c-format
 msgid "INTO is required with %s input values and %s output values."
 msgstr "INTO is vereist met %s invoer waardes en %s uitvoer waardes."
 
-#: src/language/xforms/recode.c:500
+#: src/language/xforms/recode.c:501
 #, c-format
 msgid "Type mismatch.  Cannot store %s data in %s variable %s."
 msgstr "Type fout. Kan %s data niet in %s variabele %s opslaan. "
@@ -4653,6 +4486,31 @@ msgstr "De filter variabele mag niet scratch zijn."
 msgid "hash table:"
 msgstr "hash tabel:"
 
+#: src/libpspp/tmpfile.c:55
+#, c-format
+msgid "failed to create temporary file"
+msgstr "aanmaken van een tijdelijk bestand is mislukt"
+
+#: src/libpspp/tmpfile.c:96
+#, c-format
+msgid "seeking in temporary file"
+msgstr "zoeken in tijdelijk bestand"
+
+#: src/libpspp/tmpfile.c:115
+#, c-format
+msgid "reading temporary file"
+msgstr "lezen tijdelijk bestand"
+
+#: src/libpspp/tmpfile.c:117
+#, c-format
+msgid "unexpected end of file reading temporary file"
+msgstr "onverwacht einde bestand bij het lezen van tijdelijk bestand"
+
+#: src/libpspp/tmpfile.c:136
+#, c-format
+msgid "writing to temporary file"
+msgstr "schrijven naar tijdelijk bestand"
+
 #: src/math/percentiles.c:35
 msgid "HAverage"
 msgstr ""
@@ -5090,6 +4948,14 @@ msgid ""
 "bad box: (%d+%d=%d,%d+%d=%d)-(%d+%d=%d,%d+%d=%d) in table size (%d,%d)\n"
 msgstr ""
 
+#: src/ui/gui/about.c:64
+msgid "A program for the analysis of sampled data"
+msgstr ""
+
+#: src/ui/gui/about.c:73
+msgid "translator-credits"
+msgstr ""
+
 #: src/ui/gui/comments-dialog.c:58
 #, c-format
 msgid "Column Number: %d"
@@ -5129,7 +4995,7 @@ msgstr ""
 
 #: src/ui/gui/crosstabs-dialog.c:53 src/ui/gui/crosstabs-dialog.c:64
 #: src/ui/gui/crosstabs-dialog.c:99 src/ui/gui/crosstabs-dialog.c:107
-#: src/ui/gui/psppire-var-store.c:559 src/ui/gui/var-display.c:16
+#: src/ui/gui/psppire-var-store.c:568 src/ui/gui/var-display.c:16
 #: src/ui/gui/variable-info-dialog.c:40
 msgid "None"
 msgstr "Geen"
@@ -5183,7 +5049,7 @@ msgstr "Print tabellen"
 msgid "Pivot"
 msgstr ""
 
-#: src/ui/gui/crosstabs.glade:253 src/ui/gui/psppire.glade:781
+#: src/ui/gui/crosstabs.glade:253 src/ui/gui/psppire.glade:756
 msgid "Ascending"
 msgstr "Oplopend"
 
@@ -5258,7 +5124,7 @@ msgid "_Edit"
 msgstr ""
 
 #: src/ui/gui/data-editor.glade:174 src/ui/gui/data-editor.glade:843
-#: src/ui/gui/psppire-data-window.c:844 src/ui/gui/psppire-data-window.c:934
+#: src/ui/gui/psppire-data-window.c:843 src/ui/gui/psppire-data-window.c:933
 msgid "Insert Variable"
 msgstr "Invoegen Variabele"
 
@@ -5455,7 +5321,7 @@ msgstr "_Over"
 msgid "Open"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:712 src/ui/gui/psppire-data-window.c:582
+#: src/ui/gui/data-editor.glade:712 src/ui/gui/psppire-data-window.c:581
 msgid "Save"
 msgstr "Opslaan"
 
@@ -5483,7 +5349,7 @@ msgstr "Variabelen"
 msgid "Find"
 msgstr "Vind"
 
-#: src/ui/gui/data-editor.glade:831 src/ui/gui/psppire-data-window.c:898
+#: src/ui/gui/data-editor.glade:831 src/ui/gui/psppire-data-window.c:897
 msgid "Insert Case"
 msgstr "Invoegen Case"
 
@@ -5598,7 +5464,7 @@ msgstr "Herhaal waardes"
 msgid "Missing Values"
 msgstr "Ontbrekende Waardes"
 
-#: src/ui/gui/find-dialog.c:657
+#: src/ui/gui/find-dialog.c:658
 #, c-format
 msgid "Bad regular expression: %s"
 msgstr "Foutieve regulaire expressie: %s"
@@ -5644,7 +5510,7 @@ msgstr ""
 msgid "Standard error of the kurtosis"
 msgstr ""
 
-#: src/ui/gui/frequencies.glade:98 src/ui/gui/psppire.glade:277
+#: src/ui/gui/frequencies.glade:98 src/ui/gui/psppire.glade:252
 #: src/ui/gui/rank.glade:103
 msgid "Variable(s):"
 msgstr "Variabele(n):"
@@ -5887,10 +5753,17 @@ msgstr "Data Weergave"
 msgid "Variable View"
 msgstr "Variabele Weergave"
 
-#: src/ui/gui/psppire-data-store.c:746
+#: src/ui/gui/psppire-data-store.c:761
 msgid "var"
 msgstr ""
 
+#: src/ui/gui/psppire-data-store.c:771 src/ui/gui/psppire-var-store.c:655
+#: src/ui/gui/psppire-var-store.c:665 src/ui/gui/psppire-var-store.c:675
+#: src/ui/gui/psppire-var-store.c:786
+#, c-format
+msgid "%d"
+msgstr ""
+
 #: src/ui/gui/psppire-data-window.c:213
 msgid "Transformations Pending"
 msgstr "Transformaties Uitstaand"
@@ -5921,179 +5794,179 @@ msgstr "Weging uit"
 msgid "Weight by %s"
 msgstr "Weeg op %s"
 
-#: src/ui/gui/psppire-data-window.c:387 src/ui/gui/psppire-data-window.c:590
+#: src/ui/gui/psppire-data-window.c:387 src/ui/gui/psppire-data-window.c:589
 msgid "System Files (*.sav)"
 msgstr "Systeem Bestand (*.sav)"
 
-#: src/ui/gui/psppire-data-window.c:393 src/ui/gui/psppire-data-window.c:596
+#: src/ui/gui/psppire-data-window.c:393 src/ui/gui/psppire-data-window.c:595
 msgid "Portable Files (*.por) "
 msgstr "Overdraagbaar (Portable) Bestand (*.por)"
 
-#: src/ui/gui/psppire-data-window.c:399 src/ui/gui/psppire-data-window.c:602
+#: src/ui/gui/psppire-data-window.c:399 src/ui/gui/psppire-data-window.c:601
 #: src/ui/gui/psppire-syntax-window.c:298
 #: src/ui/gui/psppire-syntax-window.c:385
 msgid "All Files"
 msgstr "Alle bestanden"
 
-#: src/ui/gui/psppire-data-window.c:610
+#: src/ui/gui/psppire-data-window.c:609
 msgid "System File"
 msgstr "Systeem Bestand"
 
-#: src/ui/gui/psppire-data-window.c:615
+#: src/ui/gui/psppire-data-window.c:614
 msgid "Portable File"
 msgstr "Overdraagbaar (Portable) Bestand"
 
-#: src/ui/gui/psppire-data-window.c:765
+#: src/ui/gui/psppire-data-window.c:764
 msgid "Font Selection"
 msgstr "Font Selectie"
 
-#: src/ui/gui/psppire-data-window.c:833
+#: src/ui/gui/psppire-data-window.c:832
 msgid "Sort Ascending"
 msgstr "Sorteer oplopend"
 
-#: src/ui/gui/psppire-data-window.c:839
+#: src/ui/gui/psppire-data-window.c:838
 msgid "Sort Descending"
 msgstr "Sorteer aflopend"
 
-#: src/ui/gui/psppire-data-window.c:847 src/ui/gui/psppire-data-window.c:901
-#: src/ui/gui/psppire-data-window.c:937 src/ui/gui/psppire-data-window.c:1302
-#: src/ui/gui/psppire-data-window.c:1320
+#: src/ui/gui/psppire-data-window.c:846 src/ui/gui/psppire-data-window.c:900
+#: src/ui/gui/psppire-data-window.c:936 src/ui/gui/psppire-data-window.c:1301
+#: src/ui/gui/psppire-data-window.c:1319
 msgid "Clear"
 msgstr "Ruimop"
 
-#: src/ui/gui/psppire-data-window.c:1179
+#: src/ui/gui/psppire-data-window.c:1178
 msgid "Open a data file"
 msgstr "Open een data bestand"
 
-#: src/ui/gui/psppire-data-window.c:1197
+#: src/ui/gui/psppire-data-window.c:1196
 msgid "New data file"
 msgstr "Nieuw data bestand"
 
-#: src/ui/gui/psppire-data-window.c:1212
+#: src/ui/gui/psppire-data-window.c:1211
 msgid "Import text data file"
 msgstr "Importeer text data bestand"
 
-#: src/ui/gui/psppire-data-window.c:1228 src/ui/gui/psppire-data-window.c:1245
+#: src/ui/gui/psppire-data-window.c:1227 src/ui/gui/psppire-data-window.c:1244
 msgid "Save data to file"
 msgstr "Data opslaan als bestand"
 
-#: src/ui/gui/psppire-data-window.c:1244
+#: src/ui/gui/psppire-data-window.c:1243
 msgid "Save As"
 msgstr "Opslaan Als"
 
-#: src/ui/gui/psppire-data-window.c:1283
+#: src/ui/gui/psppire-data-window.c:1282
 msgid "Show/hide value labels"
 msgstr "Show/verberg waarde labels"
 
-#: src/ui/gui/psppire-data-window.c:1303
+#: src/ui/gui/psppire-data-window.c:1302
 msgid "Delete the cases at the selected position(s)"
 msgstr "Verwijder de cases op de geselecteerde positie(s)"
 
-#: src/ui/gui/psppire-data-window.c:1321
+#: src/ui/gui/psppire-data-window.c:1320
 msgid "Delete the variables at the selected position(s)"
 msgstr "Verwijder de variabele op de geselecteerde positie(s)"
 
-#: src/ui/gui/psppire-data-window.c:1339
+#: src/ui/gui/psppire-data-window.c:1338
 msgid "Create a new variable at the current position"
 msgstr "Creëer een nieuwe variabele op de huidige positie"
 
-#: src/ui/gui/psppire-data-window.c:1354
+#: src/ui/gui/psppire-data-window.c:1353
 msgid "Create a new case at the current position"
 msgstr "Creëer een nieuwe case op de huidige positie"
 
-#: src/ui/gui/psppire-data-window.c:1370
+#: src/ui/gui/psppire-data-window.c:1369
 msgid "Jump to a Case in the Data Sheet"
 msgstr "Spring naar een Case in het Data Blad"
 
-#: src/ui/gui/psppire-data-window.c:1386
+#: src/ui/gui/psppire-data-window.c:1385
 msgid "Weight cases by variable"
 msgstr "Weeg cases per variabele"
 
-#: src/ui/gui/psppire-data-window.c:1400
+#: src/ui/gui/psppire-data-window.c:1399
 msgid "Transpose the cases with the variables"
 msgstr "Herschik de cases met de variabelen"
 
-#: src/ui/gui/psppire-data-window.c:1414
+#: src/ui/gui/psppire-data-window.c:1413
 msgid "Split the active file"
 msgstr "Splits het actieve bestand"
 
-#: src/ui/gui/psppire-data-window.c:1429
+#: src/ui/gui/psppire-data-window.c:1428
 msgid "Sort cases in the active file"
 msgstr "Sorteer cases in het actieve bestand"
 
-#: src/ui/gui/psppire-data-window.c:1443
+#: src/ui/gui/psppire-data-window.c:1442
 msgid "Select cases from the active file"
 msgstr "Selecteer cases van het actieve bestand"
 
-#: src/ui/gui/psppire-data-window.c:1457
+#: src/ui/gui/psppire-data-window.c:1456
 msgid "Compute new values for a variable"
 msgstr "Bereken nieuwe waardes voor een variabele"
 
-#: src/ui/gui/psppire-data-window.c:1471
+#: src/ui/gui/psppire-data-window.c:1470
 msgid "Perform one way analysis of variance"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1486
+#: src/ui/gui/psppire-data-window.c:1485
 msgid "Calculate T Test for samples from independent groups"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1500
+#: src/ui/gui/psppire-data-window.c:1499
 msgid "Calculate T Test for paired samples"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1514
+#: src/ui/gui/psppire-data-window.c:1513
 msgid "Calculate T Test for sample from a single distribution"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1529
+#: src/ui/gui/psppire-data-window.c:1528
 msgid "Commentary text for the data file"
 msgstr "Commentaar tekst voor het data bestand"
 
-#: src/ui/gui/psppire-data-window.c:1555
+#: src/ui/gui/psppire-data-window.c:1554
 msgid "Rank Cases"
 msgstr "Rangschik Cases"
 
-#: src/ui/gui/psppire-data-window.c:1569
+#: src/ui/gui/psppire-data-window.c:1568
 msgid "Recode values into the same variables"
 msgstr "Hercodeer waardes in dezelfde Variabelen"
 
-#: src/ui/gui/psppire-data-window.c:1583
+#: src/ui/gui/psppire-data-window.c:1582
 msgid "Recode values into different variables"
 msgstr "Hercodeer waardes in andere Variabelen"
 
-#: src/ui/gui/psppire-data-window.c:1597
+#: src/ui/gui/psppire-data-window.c:1596
 msgid "Jump to variable"
 msgstr "Spring naar Variabele"
 
-#: src/ui/gui/psppire-data-window.c:1610
+#: src/ui/gui/psppire-data-window.c:1609
 msgid "Calculate descriptive statistics (mean, variance, ...)"
 msgstr "Bereken descriptive statistieken (mean, variance, ...)"
 
-#: src/ui/gui/psppire-data-window.c:1624
+#: src/ui/gui/psppire-data-window.c:1623
 msgid "Generate frequency statistics"
 msgstr "Genereer frequentie statistieken"
 
-#: src/ui/gui/psppire-data-window.c:1638
+#: src/ui/gui/psppire-data-window.c:1637
 msgid "Generate crosstabulations"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1653
+#: src/ui/gui/psppire-data-window.c:1652
 msgid "Examine Data by Factors"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1667
+#: src/ui/gui/psppire-data-window.c:1666
 msgid "Estimate parameters of the linear model"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1681 src/ui/gui/reliability.glade:7
+#: src/ui/gui/psppire-data-window.c:1680 src/ui/gui/reliability.glade:7
 msgid "Reliability Analysis"
 msgstr ""
 
-#: src/ui/gui/psppire-data-window.c:1844
+#: src/ui/gui/psppire-data-window.c:1843
 msgid "Split the window vertically and horizontally"
 msgstr "Splits het venster verticaal en horizontaal"
 
-#: src/ui/gui/psppire-data-window.c:1886
+#: src/ui/gui/psppire-data-window.c:1885
 msgid "Data Editor"
 msgstr ""
 
@@ -6113,184 +5986,178 @@ msgstr "Hoeveel dingen kunnen worden geselecteerd"
 msgid "Prefer variable labels"
 msgstr "Prefereer variabele labels"
 
-#: src/ui/gui/psppire.glade:10
-msgid ""
-"This is beta status software.  Please report bugs to bug-gnu-pspp@gnu.org"
-msgstr ""
-"Dit is beta status software. Rapporteer bugs s.v.p. bij bug-gnu-pspp@gnu.org"
-
-#: src/ui/gui/psppire.glade:72 src/ui/gui/psppire.glade:155
+#: src/ui/gui/psppire.glade:47 src/ui/gui/psppire.glade:130
 #: src/ui/gui/weight-cases-dialog.c:79
 msgid "Do not weight cases"
 msgstr "Weeg cases niet"
 
-#: src/ui/gui/psppire.glade:83
+#: src/ui/gui/psppire.glade:58
 msgid "Weight cases by"
 msgstr "Weeg cases op"
 
-#: src/ui/gui/psppire.glade:108
+#: src/ui/gui/psppire.glade:83
 msgid "Frequency Variable"
 msgstr "Frequencie Variabele"
 
-#: src/ui/gui/psppire.glade:148
+#: src/ui/gui/psppire.glade:123
 msgid "Current Status: "
 msgstr "Huidige Status:"
 
-#: src/ui/gui/psppire.glade:244
+#: src/ui/gui/psppire.glade:219
 msgid "Name Variable:"
 msgstr "Naam Variabele:"
 
-#: src/ui/gui/psppire.glade:429
+#: src/ui/gui/psppire.glade:404
 msgid "Analyze all cases.  Do not create groups."
 msgstr "Analyseer alle cases.  Creëer geen groepen."
 
-#: src/ui/gui/psppire.glade:440
+#: src/ui/gui/psppire.glade:415
 msgid "Compare groups."
 msgstr "Vergelijk groepen."
 
-#: src/ui/gui/psppire.glade:454
+#: src/ui/gui/psppire.glade:429
 msgid "Organize output by groups."
 msgstr "Organiseer uitvoer per groepen."
 
-#: src/ui/gui/psppire.glade:502
+#: src/ui/gui/psppire.glade:477
 msgid "Groups based on:"
 msgstr "Groepen gebaseerd op:"
 
-#: src/ui/gui/psppire.glade:565
+#: src/ui/gui/psppire.glade:540
 msgid "Sort the file by grouping variables."
 msgstr "Sorteer bestand op groepering variabelen."
 
-#: src/ui/gui/psppire.glade:577
+#: src/ui/gui/psppire.glade:552
 msgid "File is already sorted."
 msgstr "Bestand is al gesorteerd."
 
-#: src/ui/gui/psppire.glade:622
+#: src/ui/gui/psppire.glade:597
 msgid "Current Status : "
 msgstr "Huidige Status : "
 
-#: src/ui/gui/psppire.glade:630
+#: src/ui/gui/psppire.glade:605
 msgid "Analysis by groups is off"
 msgstr "Analyseer per groep is uit"
 
-#: src/ui/gui/psppire.glade:729
+#: src/ui/gui/psppire.glade:704
 msgid "Sort by:"
 msgstr "Sorteer op:"
 
-#: src/ui/gui/psppire.glade:792
+#: src/ui/gui/psppire.glade:767
 msgid "Descending"
 msgstr "Aflopend"
 
-#: src/ui/gui/psppire.glade:809
+#: src/ui/gui/psppire.glade:784
 msgid "Sort Order"
 msgstr "Sorteer Volgorde"
 
-#: src/ui/gui/psppire.glade:878
+#: src/ui/gui/psppire.glade:853
 msgid "Target Variable:"
 msgstr "Doel Variabele:"
 
-#: src/ui/gui/psppire.glade:909
+#: src/ui/gui/psppire.glade:884
 msgid "Type & Label"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:949
+#: src/ui/gui/psppire.glade:924
 msgid "="
 msgstr ""
 
-#: src/ui/gui/psppire.glade:995
+#: src/ui/gui/psppire.glade:970
 msgid "Numeric Expressions:"
 msgstr "Numerieke Expressies:"
 
-#: src/ui/gui/psppire.glade:1049
+#: src/ui/gui/psppire.glade:1024
 msgid "Functions:"
 msgstr "Functies:"
 
-#: src/ui/gui/psppire.glade:1112 src/ui/gui/psppire.glade:1516
+#: src/ui/gui/psppire.glade:1087 src/ui/gui/psppire.glade:1491
 #: src/ui/gui/recode.glade:731
 msgid "If..."
 msgstr "Als..."
 
-#: src/ui/gui/psppire.glade:1345
+#: src/ui/gui/psppire.glade:1320
 msgid "Use filter variable"
 msgstr "Gebruik filter variabele"
 
-#: src/ui/gui/psppire.glade:1398
+#: src/ui/gui/psppire.glade:1373
 msgid "Based on time or case range"
 msgstr "Gebaseerd op tijd of case volgorde"
 
-#: src/ui/gui/psppire.glade:1411
+#: src/ui/gui/psppire.glade:1386
 msgid "Range..."
 msgstr ""
 
-#: src/ui/gui/psppire.glade:1450
+#: src/ui/gui/psppire.glade:1425
 msgid "Random sample of cases"
 msgstr "Random steekproef van cases"
 
-#: src/ui/gui/psppire.glade:1464
+#: src/ui/gui/psppire.glade:1439
 msgid "Sample..."
 msgstr "Steekproef..."
 
-#: src/ui/gui/psppire.glade:1502
+#: src/ui/gui/psppire.glade:1477
 msgid "If condition is satisfied"
 msgstr "Aan If conditie is voldaan"
 
-#: src/ui/gui/psppire.glade:1551
+#: src/ui/gui/psppire.glade:1526
 msgid "All Cases"
 msgstr "Alle Cases"
 
-#: src/ui/gui/psppire.glade:1566
+#: src/ui/gui/psppire.glade:1541
 msgid "Select"
 msgstr "Selecteer"
 
-#: src/ui/gui/psppire.glade:1595
+#: src/ui/gui/psppire.glade:1570
 msgid "Filtered"
 msgstr "Gefilterd"
 
-#: src/ui/gui/psppire.glade:1606
+#: src/ui/gui/psppire.glade:1581
 msgid "Deleted"
 msgstr "Verwijderd"
 
-#: src/ui/gui/psppire.glade:1624
+#: src/ui/gui/psppire.glade:1599
 msgid "Unselected Cases Are"
 msgstr "Niet geselecteerde Cases zijn"
 
-#: src/ui/gui/psppire.glade:1689
+#: src/ui/gui/psppire.glade:1664
 msgid "Comments:"
 msgstr "Commentaren:"
 
-#: src/ui/gui/psppire.glade:1731
+#: src/ui/gui/psppire.glade:1706
 msgid "Display comments in output"
 msgstr "Toon commentaren in uitvoer"
 
-#: src/ui/gui/psppire.glade:1746
+#: src/ui/gui/psppire.glade:1721
 msgid "Column Number: 0"
 msgstr "Kolom Nummer: 0"
 
-#: src/ui/gui/psppire.glade:1829
+#: src/ui/gui/psppire.glade:1804
 msgid "First case"
 msgstr "Eerste case"
 
-#: src/ui/gui/psppire.glade:1842
+#: src/ui/gui/psppire.glade:1817
 msgid "Last case"
 msgstr "Laatste case"
 
-#: src/ui/gui/psppire.glade:1855
+#: src/ui/gui/psppire.glade:1830
 msgid "Observation"
 msgstr "Observatie"
 
-#: src/ui/gui/psppire.glade:1919
+#: src/ui/gui/psppire.glade:1894
 msgid "Use expression as label"
 msgstr "Gebruik expressie als label"
 
-#: src/ui/gui/psppire.glade:2045 src/ui/gui/psppire-var-sheet.c:540
-#: src/ui/gui/psppire-var-store.c:786
+#: src/ui/gui/psppire.glade:2020 src/ui/gui/psppire-var-sheet.c:529
+#: src/ui/gui/psppire-var-store.c:795
 msgid "Width"
 msgstr "Breedte"
 
-#: src/ui/gui/psppire.glade:2175
+#: src/ui/gui/psppire.glade:2150
 msgid "Goto Case Number:"
 msgstr "Ga naar Case Nummer:"
 
-#: src/ui/gui/psppire.glade:2312
+#: src/ui/gui/psppire.glade:2287
 msgid "Sample Size"
 msgstr "Steekproef Grootte"
 
@@ -6325,47 +6192,47 @@ msgstr ""
 msgid "Cannot load syntax file '%s'"
 msgstr "Kan syntax bestand \"%s\" niet laden"
 
-#: src/ui/gui/psppire-var-sheet.c:538 src/ui/gui/psppire-var-store.c:784
+#: src/ui/gui/psppire-var-sheet.c:527 src/ui/gui/psppire-var-store.c:793
 msgid "Name"
 msgstr "Naam"
 
-#: src/ui/gui/psppire-var-sheet.c:541 src/ui/gui/psppire-var-store.c:787
+#: src/ui/gui/psppire-var-sheet.c:530 src/ui/gui/psppire-var-store.c:796
 msgid "Decimals"
 msgstr "Decimalen"
 
-#: src/ui/gui/psppire-var-sheet.c:543 src/ui/gui/psppire-var-store.c:789
+#: src/ui/gui/psppire-var-sheet.c:532 src/ui/gui/psppire-var-store.c:798
 msgid "Values"
 msgstr "Waardes"
 
-#: src/ui/gui/psppire-var-sheet.c:546 src/ui/gui/psppire-var-store.c:792
+#: src/ui/gui/psppire-var-sheet.c:535 src/ui/gui/psppire-var-store.c:801
 msgid "Align"
 msgstr "Uitlijnen"
 
-#: src/ui/gui/psppire-var-sheet.c:547 src/ui/gui/psppire-var-store.c:793
+#: src/ui/gui/psppire-var-sheet.c:536 src/ui/gui/psppire-var-store.c:802
 msgid "Measure"
 msgstr "Meting"
 
-#: src/ui/gui/psppire-var-store.c:569 src/ui/gui/var-sheet-dialogs.glade:43
+#: src/ui/gui/psppire-var-store.c:578 src/ui/gui/var-sheet-dialogs.glade:43
 msgid "Comma"
 msgstr "Komma"
 
-#: src/ui/gui/psppire-var-store.c:570 src/ui/gui/var-sheet-dialogs.glade:59
+#: src/ui/gui/psppire-var-store.c:579 src/ui/gui/var-sheet-dialogs.glade:59
 msgid "Dot"
 msgstr "Punt"
 
-#: src/ui/gui/psppire-var-store.c:571
+#: src/ui/gui/psppire-var-store.c:580
 msgid "Scientific"
 msgstr "Wetenschappelijk"
 
-#: src/ui/gui/psppire-var-store.c:572 src/ui/gui/var-sheet-dialogs.glade:91
+#: src/ui/gui/psppire-var-store.c:581 src/ui/gui/var-sheet-dialogs.glade:91
 msgid "Date"
 msgstr "Datum"
 
-#: src/ui/gui/psppire-var-store.c:573 src/ui/gui/var-sheet-dialogs.glade:107
+#: src/ui/gui/psppire-var-store.c:582 src/ui/gui/var-sheet-dialogs.glade:107
 msgid "Dollar"
 msgstr "Euro"
 
-#: src/ui/gui/psppire-var-store.c:574
+#: src/ui/gui/psppire-var-store.c:583
 msgid "Custom"
 msgstr "Aangepast"
 
@@ -6981,11 +6848,11 @@ msgstr "Ontbrekende Waardes: %s\n"
 msgid "Measurement Level: %s\n"
 msgstr "Meetniveau: %s\n"
 
-#: src/ui/gui/variable-info-dialog.c:124
+#: src/ui/gui/variable-info-dialog.c:125
 msgid "Value Labels:\n"
 msgstr "Waarde Labels:\n"
 
-#: src/ui/gui/variable-info-dialog.c:137
+#: src/ui/gui/variable-info-dialog.c:138
 #, c-format
 msgid "%s %s\n"
 msgstr ""
@@ -7177,5 +7044,90 @@ msgstr "Print een lijst van bekende driver classes en eindig daarna"
 msgid "Start an interactive session"
 msgstr "Start een interactieve sessie"
 
+#~ msgid "Bad variable width %d."
+#~ msgstr "Foutieve variabele breedte %d."
+
+#~ msgid "File specifies unexpected value %g as HIGHEST."
+#~ msgstr "Bestand specificeert onverwachte waarde %g als HIGHEST."
+
+#~ msgid "File specifies unexpected value %g as LOWEST."
+#~ msgstr "Bestand specificeert onverwachte waarde %g als LOWEST."
+
+#~ msgid "%s is unimplemented."
+#~ msgstr "%s is niet geïmplementeerd."
+
+#~ msgid "Bad character in input: `\\%o'."
+#~ msgstr "Fout karakter in input: '\\%o'."
+
+#~ msgid "WEIGHT is off."
+#~ msgstr "WEGING is uit."
+
+#~ msgid "WEIGHT is variable %s."
+#~ msgstr "WEGING is variabele %s."
+
+#~ msgid "WIDTH is %d."
+#~ msgstr "BREEDTE is %d."
+
+#~ msgid ""
+#~ "Ignoring missing values on long string variable %s, which PSPP does not "
+#~ "yet support."
+#~ msgstr ""
+#~ "Negeren van missing values voor lange string variabele %s, wat PSPP nog "
+#~ "niet ondersteunt."
+
+#~ msgid ""
+#~ "Ignoring value labels for long string variables, which PSPP does not yet "
+#~ "support."
+#~ msgstr ""
+#~ "Negeer waarde labels voor lange string variabelen, die door PSPP nog niet "
+#~ "ondersteund worden."
+
+#~ msgid "Cannot add value labels from source file to long string variable %s."
+#~ msgstr ""
+#~ "Kan geen value labels van bron bestand toevoegen aan lange string "
+#~ "variabele %s."
+
+#~ msgid ""
+#~ "It is not possible to assign value labels to long string variables such "
+#~ "as %s."
+#~ msgstr ""
+#~ "Het is niet mogelijk om waarde labels aan lange string variabelen als %s "
+#~ "toe te kennen."
+
+#~ msgid "Write mode ALL not allowed in general mode.  Assuming WRITE=CELLS."
+#~ msgstr ""
+#~ "Write modus ALL niet toegestaan in algemen modus.  WRITE=CELLS aangenomen."
+
+#~ msgid "Error writing FLIP file: %s."
+#~ msgstr "Fout tijdens het schrijven van FLIP bestand: %s."
+
+#~ msgid "Could not create acceptable variant for variable %s."
+#~ msgstr "Kon geen acceptabele variant voor variabele %s creëren."
+
+#~ msgid "Cannot create more than 99999 variable names."
+#~ msgstr "Kan niet meer dan 99999 variabele namen creëren."
+
+#~ msgid "Long string variable %s is not valid here."
+#~ msgstr "Lange string variabele %s is niet geldig hier."
+
+#~ msgid "PATH and SEARCH subcommands are mutually exclusive.  Ignoring PATH."
+#~ msgstr ""
+#~ "PATH en SEARCH subopdrachten zijn wederzijds uitsluitend. PATH genegeerd. "
+
+#~ msgid "At least one value must be specified on PATH."
+#~ msgstr "Tenminste 1 waarde dient bij PATH opgegeven te zijn."
+
+#~ msgid "Hash bits adjusted to %d."
+#~ msgstr "Hash bits aangepast naar %d."
+
+#~ msgid "error opening \"%s\" for writing"
+#~ msgstr "fout bij openen \"%s\" voor schrijven"
+
+#~ msgid ""
+#~ "This is beta status software.  Please report bugs to bug-gnu-pspp@gnu.org"
+#~ msgstr ""
+#~ "Dit is beta status software. Rapporteer bugs s.v.p. bij bug-gnu-pspp@gnu."
+#~ "org"
+
 #~ msgid "Diagnositic options:"
 #~ msgstr "Diagnostische opties:"
index a4a78dd0efcf9750d26c169e4db63a46e2093a25..dc4029268ebf981bc10d96ecccf7c88eb53dd71a 100644 (file)
@@ -308,7 +308,7 @@ case_num_idx (const struct ccase *c, size_t idx)
 
    Like the strings embedded in all "union value"s, the return
    value is not null-terminated. */
-const char *
+const uint8_t *
 case_str (const struct ccase *c, const struct variable *v)
 {
   size_t idx = var_get_case_index (v);
@@ -321,7 +321,7 @@ case_str (const struct ccase *c, const struct variable *v)
 
    Like the strings embedded in all "union value"s, the return
    value is not null-terminated. */
-const char *
+const uint8_t *
 case_str_idx (const struct ccase *c, size_t idx)
 {
   assert (idx < c->proto->n_widths);
@@ -336,7 +336,7 @@ case_str_idx (const struct ccase *c, size_t idx)
 
    Like the strings embedded in all "union value"s, the return
    value is not null-terminated. */
-char *
+uint8_t *
 case_str_rw (struct ccase *c, const struct variable *v)
 {
   size_t idx = var_get_case_index (v);
@@ -352,7 +352,7 @@ case_str_rw (struct ccase *c, const struct variable *v)
 
    Like the strings embedded in all "union value"s, the return
    value is not null-terminated. */
-char *
+uint8_t *
 case_str_rw_idx (struct ccase *c, size_t idx)
 {
   assert (idx < c->proto->n_widths);
index 36feb15f6b073a82533bc71161f3b8f7a00f4a76..0bfc62cdce96054fe461043ac2cb44bf39436c03 100644 (file)
@@ -94,10 +94,10 @@ union value *case_data_rw_idx (struct ccase *, size_t idx);
 double case_num (const struct ccase *, const struct variable *);
 double case_num_idx (const struct ccase *, size_t idx);
 
-const char *case_str (const struct ccase *, const struct variable *);
-const char *case_str_idx (const struct ccase *, size_t idx);
-char *case_str_rw (struct ccase *, const struct variable *);
-char *case_str_rw_idx (struct ccase *, size_t idx);
+const uint8_t *case_str (const struct ccase *, const struct variable *);
+const uint8_t *case_str_idx (const struct ccase *, size_t idx);
+uint8_t *case_str_rw (struct ccase *, const struct variable *);
+uint8_t *case_str_rw_idx (struct ccase *, size_t idx);
 
 int case_compare (const struct ccase *, const struct ccase *,
                   const struct variable *const *, size_t n_vars);
index eda6d1258f729b8d05352fb71fe1a24a0cdb1ef6..33e369f971da8751f78e29e76f23d230e6e0227d 100644 (file)
 #include "settings.h"
 #include "value.h"
 #include "format.h"
+#include "dictionary.h"
 
 #include <libpspp/assertion.h>
 #include <libpspp/legacy-encoding.h>
+#include <libpspp/i18n.h>
 #include <libpspp/compiler.h>
 #include <libpspp/integer-format.h>
 #include <libpspp/message.h>
@@ -53,7 +55,7 @@
 /* Information about parsing one data field. */
 struct data_in
   {
-    enum legacy_encoding encoding;/* Encoding of source. */
+    const char *src_enc;        /* Encoding of source. */
     struct substring input;     /* Source. */
     enum fmt_type format;       /* Input format. */
     int implied_decimals;       /* Number of implied decimal places. */
@@ -88,6 +90,9 @@ static int hexit_value (int c);
    representation in OUTPUT, which the caller must have
    initialized with the given WIDTH (0 for a numeric field,
    otherwise the string width).
+   Iff FORMAT is a string format, then DICT must be a pointer
+   to the dictionary associated with OUTPUT.  Otherwise, DICT
+   may be null.
 
    If no decimal point is included in a numeric format, then
    IMPLIED_DECIMALS decimal places are implied.  Specify 0 if no
@@ -100,9 +105,11 @@ static int hexit_value (int c);
    FIRST_COLUMN plus the length of the input because of the
    possibility of escaped quotes in strings, etc.) */
 bool
-data_in (struct substring input, enum legacy_encoding encoding,
+data_in (struct substring input, const char *encoding,
          enum fmt_type format, int implied_decimals,
-         int first_column, int last_column, union value *output, int width)
+         int first_column, int last_column,
+        const struct dictionary *dict,
+        union value *output, int width)
 {
   static data_in_parser_func *const handlers[FMT_NUMBER_OF_FORMATS] =
     {
@@ -111,25 +118,11 @@ data_in (struct substring input, enum legacy_encoding encoding,
     };
 
   struct data_in i;
-  void *copy = NULL;
+
   bool ok;
 
   assert ((width != 0) == fmt_is_string (format));
 
-  if (encoding == LEGACY_NATIVE
-      || fmt_get_category (format) & (FMT_CAT_BINARY | FMT_CAT_STRING))
-    {
-      i.input = input;
-      i.encoding = encoding;
-    }
-  else
-    {
-      ss_alloc_uninit (&i.input, ss_length (input));
-      legacy_recode (encoding, ss_data (input), LEGACY_NATIVE,
-                     ss_data (i.input), ss_length (input));
-      i.encoding = LEGACY_NATIVE;
-      copy = ss_data (i.input);
-    }
   i.format = format;
   i.implied_decimals = implied_decimals;
 
@@ -138,21 +131,39 @@ data_in (struct substring input, enum legacy_encoding encoding,
 
   i.first_column = first_column;
   i.last_column = last_column;
+  i.src_enc = encoding;
 
-  if (!ss_is_empty (i.input))
+  if (ss_is_empty (input))
     {
-      ok = handlers[i.format] (&i);
-      if (!ok)
-        default_result (&i);
+      default_result (&i);
+      return true;
+    }
+
+  if (fmt_get_category (format) & ( FMT_CAT_BINARY | FMT_CAT_HEXADECIMAL | FMT_CAT_LEGACY))
+    {
+      i.input = input;
     }
   else
     {
-      default_result (&i);
-      ok = true;
+      const char *dest_encoding;
+      char *s = NULL;
+      if ( dict == NULL)
+       {
+         assert (0 == (fmt_get_category (format) & (FMT_CAT_BINARY | FMT_CAT_STRING)));
+         dest_encoding = LEGACY_NATIVE;
+       }
+      else
+       dest_encoding = dict_get_encoding (dict);
+
+      s = recode_string (dest_encoding, i.src_enc, ss_data (input), ss_length (input));
+      ss_alloc_uninit (&i.input, strlen (s));
+      memcpy (ss_data (i.input), s, ss_length (input));
+      free (s);
     }
 
-  if (copy)
-    free (copy);
+  ok = handlers[i.format] (&i);
+  if (!ok)
+    default_result (&i);
 
   return ok;
 }
@@ -608,12 +619,13 @@ parse_A (struct data_in *i)
 {
   /* This is equivalent to buf_copy_rpad, except that we posibly
      do a character set recoding in the middle. */
-  char *dst = value_str_rw (i->output, i->width);
+  uint8_t *dst = value_str_rw (i->output, i->width);
   size_t dst_size = i->width;
   const char *src = ss_data (i->input);
   size_t src_size = ss_length (i->input);
 
-  legacy_recode (i->encoding, src, LEGACY_NATIVE, dst, MIN (src_size, dst_size));
+  memcpy (dst, src, MIN (src_size, dst_size));
+
   if (dst_size > src_size)
     memset (&dst[src_size], ' ', dst_size - src_size);
 
@@ -624,7 +636,7 @@ parse_A (struct data_in *i)
 static bool
 parse_AHEX (struct data_in *i)
 {
-  char *s = value_str_rw (i->output, i->width);
+  uint8_t *s = value_str_rw (i->output, i->width);
   size_t j;
 
   for (j = 0; ; j++)
@@ -639,10 +651,10 @@ parse_AHEX (struct data_in *i)
           return false;
         }
 
-      if (i->encoding != LEGACY_NATIVE)
+      if (0 != strcmp (i->src_enc, LEGACY_NATIVE))
         {
-          hi = legacy_to_native (i->encoding, hi);
-          lo = legacy_to_native (i->encoding, lo);
+          hi = legacy_to_native (i->src_enc, hi);
+          lo = legacy_to_native (i->src_enc, lo);
         }
       if (!c_isxdigit (hi) || !c_isxdigit (lo))
        {
index 3a8d67cc22f66b28eb0bed54126e5a3255449064..3ebd5933c43b0370e29cfd279cd3b22fcdbb0b4d 100644 (file)
 
 enum fmt_type;
 union value;
-bool data_in (struct substring input, enum legacy_encoding,
+struct dictionary;
+bool data_in (struct substring input, const char *encoding,
               enum fmt_type, int implied_decimals,
               int first_column, int last_column,
+             const struct dictionary *dict,
               union value *output, int width);
 
 #endif /* data/data-in.h */
index e7800a8ff2de3a64c58d77b1aee3688a76c90b5d..94a6130adb154bd06b61901414e4209498cbf106 100644 (file)
@@ -36,6 +36,8 @@
 #include <libpspp/message.h>
 #include <libpspp/misc.h>
 #include <libpspp/str.h>
+#include <libpspp/pool.h>
+#include <libpspp/i18n.h>
 
 #include "minmax.h"
 
@@ -83,38 +85,68 @@ static void output_binary_integer (uint64_t, int bytes, enum integer_format,
                                    char *);
 static void output_hex (const void *, size_t bytes, char *);
 \f
-/* Same as data_out, and additionally recodes the output from
-   native form into the given legacy character ENCODING. */
-void
-data_out_legacy (const union value *input, enum legacy_encoding encoding,
-                 const struct fmt_spec *format, char *output)
-{
-  static data_out_converter_func *const converters[FMT_NUMBER_OF_FORMATS] =
+
+static data_out_converter_func *const converters[FMT_NUMBER_OF_FORMATS] =
     {
 #define FMT(NAME, METHOD, IMIN, OMIN, IO, CATEGORY) output_##METHOD,
 #include "format.def"
     };
 
+/* Similar to data_out. Additionally recodes the output from
+   native form into the given legacy character ENCODING.
+   OUTPUT must be provided by the caller and must be at least
+   FORMAT->w long. No null terminator is appended to OUTPUT.
+*/
+void
+data_out_legacy (const union value *input, const char *encoding,
+                 const struct fmt_spec *format, char *output)
+{
   assert (fmt_check_output (format));
 
   converters[format->type] (input, format, output);
-  if (encoding != LEGACY_NATIVE
+  if (0 != strcmp (encoding, LEGACY_NATIVE)
       && fmt_get_category (format->type) != FMT_CAT_BINARY)
-    legacy_recode (LEGACY_NATIVE, output, encoding, output, format->w);
+    {
+      char *s  = recode_string (encoding, LEGACY_NATIVE, output, format->w );
+      memcpy (output, s, format->w);
+      free (s);
+    }
 }
 
-/* Converts the INPUT value into printable form in the exactly
-   FORMAT->W characters in OUTPUT according to format
-   specification FORMAT. No null terminator is appended to the
-   buffer.
+/* Converts the INPUT value into a UTF8 encoded string, according
+   to format specification FORMAT. 
 
    VALUE must be the correct width for FORMAT, that is, its
-   width must be fmt_var_width(FORMAT). */
-void
-data_out (const union value *input, const struct fmt_spec *format,
-          char *output)
+   width must be fmt_var_width(FORMAT).
+
+   ENCODING must be the encoding of INPUT.  Normally this can
+   be obtained by calling dict_get_encoding on the dictionary
+   with which INPUT is associated.
+
+   The return value is dynamically allocated, and must be freed
+   by the caller.  If POOL is non-null, then the return value is
+   allocated on that pool.
+*/
+char *
+data_out_pool (const union value *input, const char *encoding,
+              const struct fmt_spec *format, struct pool *pool)
+{
+  char *output = xmalloc (format->w + 1);
+  char *t ;
+  assert (fmt_check_output (format));
+
+  converters[format->type] (input, format, output);
+  output[format->w] = '\0';
+
+  t =  recode_string_pool (UTF8, encoding, output, format->w, pool);
+  free (output);
+  return t;
+}
+
+char *
+data_out (const union value *input, const char *encoding, const struct fmt_spec *format)
 {
-  return data_out_legacy (input, LEGACY_NATIVE, format, output);
+  return data_out_pool (input, encoding, format, NULL);
 }
 
 \f
index f9f70da90d37843d546752b3ad97baf041fdfc51..735679b41257b78d0918ae4c83e29c90eeb62546 100644 (file)
 struct fmt_spec;
 union value;
 
-void data_out (const union value *, const struct fmt_spec *, char *);
+char * data_out (const union value *, const char *encoding, const struct fmt_spec *);
 
-void data_out_legacy (const union value *, enum legacy_encoding,
-                      const struct fmt_spec *, char *);
+char * data_out_pool (const union value *, const char *encoding, const struct fmt_spec *, struct pool *pool);
+
+void data_out_legacy (const union value *input, const char *encoding,
+                     const struct fmt_spec *format, char *output);
 
 #endif /* data-out.h */
index 0652501faa17fa27b19989b07e471b816731360c..6ed3f8f9f95205158cbf2a33227e5dbec6a81529 100644 (file)
@@ -49,7 +49,7 @@ struct file_handle
     /* FH_REF_FILE only. */
     char *file_name;           /* File name as provided by user. */
     enum fh_mode mode;         /* File mode. */
-    enum legacy_encoding encoding;/* File encoding. */
+    const char *encoding;       /* File encoding. */
 
     /* FH_REF_FILE and FH_REF_INLINE only. */
     size_t record_width;        /* Length of fixed-format records. */
@@ -325,7 +325,7 @@ fh_get_tab_width (const struct file_handle *handle)
 }
 
 /* Returns the encoding of characters read from HANDLE. */
-enum legacy_encoding
+const char *
 fh_get_legacy_encoding (const struct file_handle *handle)
 {
   assert (handle->referent & (FH_REF_FILE | FH_REF_INLINE));
index 73e118cdf848f81e1e6405983fec02b45f0a6a9c..b4a6d6100e8ed291ed8705a659d381beb8ec26a6 100644 (file)
@@ -54,7 +54,7 @@ struct fh_properties
     enum fh_mode mode;          /* File mode. */
     size_t record_width;        /* Length of fixed-format records. */
     size_t tab_width;           /* Tab width, 0=do not expand tabs. */
-    enum legacy_encoding encoding;/* ASCII or EBCDIC? */
+    const char *encoding;       /* ASCII or EBCDIC? */
   };
 
 void fh_init (void);
@@ -89,7 +89,7 @@ enum fh_mode fh_get_mode (const struct file_handle *) ;
 /* Properties of FH_REF_FILE and FH_REF_INLINE file handles. */
 size_t fh_get_record_width (const struct file_handle *);
 size_t fh_get_tab_width (const struct file_handle *);
-enum legacy_encoding fh_get_legacy_encoding (const struct file_handle *);
+const char *fh_get_legacy_encoding (const struct file_handle *);
 
 /* Properties of FH_REF_SCRATCH file handles. */
 struct scratch_handle *fh_get_scratch_handle (const struct file_handle *);
index 1a6ddc1bad52c3e99143b19ee2927c6c1f340b67..f166ee6aba86f1a00acefb409c466e253635a574 100644 (file)
@@ -365,7 +365,7 @@ gnumeric_open_reader (struct gnumeric_read_info *gri, struct dictionary **dict)
 
   if ( NULL == gz)
     {
-      msg (ME, _("Error opening \"%s\" for reading as a gnumeric file: %s."),
+      msg (ME, _("Error opening \"%s\" for reading as a Gnumeric file: %s."),
            gri->file_name, strerror (errno));
 
       goto error;
index c1a7469158ead5204e6da7fa5a4432ad36fc3bbb..61bb9bcb13c4968a4500fc4fc98ee13e2f631c1b 100644 (file)
@@ -160,7 +160,7 @@ mv_add_value (struct missing_values *mv, const union value *v)
    Returns true if successful, false if MV has no more room for
    missing values or if S is not an acceptable missing value. */
 bool
-mv_add_str (struct missing_values *mv, const char s[])
+mv_add_str (struct missing_values *mv, const uint8_t s[])
 {
   union value v;
   bool ok;
@@ -404,7 +404,7 @@ is_num_user_missing (const struct missing_values *mv, double d)
    MV must be a set of string missing values.
    S[] must contain exactly as many characters as MV's width. */
 static bool
-is_str_user_missing (const struct missing_values *mv, const char s[])
+is_str_user_missing (const struct missing_values *mv, const uint8_t s[])
 {
   const union value *v = mv->values;
   assert (mv->width > 0);
@@ -456,7 +456,7 @@ mv_is_num_missing (const struct missing_values *mv, double d,
    MV must be a set of string missing values.
    S[] must contain exactly as many characters as MV's width. */
 bool
-mv_is_str_missing (const struct missing_values *mv, const char s[],
+mv_is_str_missing (const struct missing_values *mv, const uint8_t s[],
                    enum mv_class class)
 {
   assert (mv->width > 0);
index 5576fc6c7c47f98f23db6d997bcca1d593c750d7..4d046faec3a1be411c4b5be5b2f0e93881b0e182 100644 (file)
@@ -64,7 +64,7 @@ enum mv_class
 bool mv_is_value_missing (const struct missing_values *, const union value *,
                           enum mv_class);
 bool mv_is_num_missing (const struct missing_values *, double, enum mv_class);
-bool mv_is_str_missing (const struct missing_values *, const char[],
+bool mv_is_str_missing (const struct missing_values *, const uint8_t[],
                         enum mv_class);
 
 /* Initializing missing value sets. */
@@ -94,7 +94,7 @@ void mv_get_range (const struct missing_values *, double *low, double *high);
 
 /* Adding and modifying discrete values. */
 bool mv_add_value (struct missing_values *, const union value *);
-bool mv_add_str (struct missing_values *, const char[]);
+bool mv_add_str (struct missing_values *, const uint8_t[]);
 bool mv_add_num (struct missing_values *, double);
 void mv_pop_value (struct missing_values *, union value *);
 bool mv_replace_value (struct missing_values *, const union value *, int idx);
index 461796bf66fee167377740cb35a9f636a2b17d52..cd8b213e8d74062bffd5b6e344a1d29047b7f9a9 100644 (file)
@@ -447,6 +447,28 @@ read_string (struct pfm_reader *r, char *buf)
   *buf = '\0';
 }
 
+
+/* Reads a string into BUF, which must have room for 256
+   characters.
+   Returns the number of bytes read.
+*/
+static size_t
+read_bytes (struct pfm_reader *r, uint8_t *buf)
+{
+  int n = read_int (r);
+  if (n < 0 || n > 255)
+    error (r, _("Bad string length %d."), n);
+
+  while (n-- > 0)
+    {
+      *buf++ = r->cc;
+      advance (r);
+    }
+  return n;
+}
+
+
+
 /* Reads a string and returns a copy of it allocated from R's
    pool. */
 static char *
@@ -739,9 +761,9 @@ parse_value (struct pfm_reader *r, int width, union value *v)
   value_init (v, width);
   if (width > 0)
     {
-      char string[256];
-      read_string (r, string);
-      value_copy_str_rpad (v, width, string, ' ');
+      uint8_t buf[256];
+      size_t n_bytes = read_bytes (r, buf);
+      value_copy_buf_rpad (v, width, buf, n_bytes, ' ');
     }
   else
     v->f = read_float (r);
@@ -844,9 +866,9 @@ por_file_casereader_read (struct casereader *reader, void *r_)
         case_data_rw_idx (c, i)->f = read_float (r);
       else
         {
-          char string[256];
-          read_string (r, string);
-          buf_copy_str_rpad (case_str_rw_idx (c, i), width, string, ' ');
+          uint8_t buf[256];
+          size_t n_bytes = read_bytes (r, buf);
+          u8_buf_copy_rpad (case_str_rw_idx (c, i), width, buf, n_bytes, ' ');
         }
     }
 
index 67767a9f4a32374e4d4bc6d4b835ad76617e8a74..9978d43a4e58d993649935a9d2580ce1cf4faa2b 100644 (file)
@@ -25,6 +25,7 @@
 #include <setjmp.h>
 #include <stdlib.h>
 
+#include <libpspp/i18n.h>
 #include <libpspp/assertion.h>
 #include <libpspp/message.h>
 #include <libpspp/compiler.h>
@@ -186,6 +187,62 @@ static void read_long_string_value_labels (struct sfm_reader *,
                                           size_t size, size_t count,
                                           struct dictionary *);
 
+/* Convert all the strings in DICT from the dict encoding to UTF8 */
+static void
+recode_strings (struct dictionary *dict)
+{
+  int i;
+
+  const char *enc = dict_get_encoding (dict);
+
+  if ( NULL == enc)
+    enc = get_default_encoding ();
+
+  for (i = 0 ; i < dict_get_var_cnt (dict); ++i)
+    {
+      /* Convert the long variable name */
+      struct variable *var = dict_get_var (dict, i);
+      const char *native_name = var_get_name (var);
+      char *utf8_name = recode_string (UTF8, enc, native_name, -1);
+      if ( 0 != strcmp (utf8_name, native_name))
+       {
+         if ( NULL == dict_lookup_var (dict, utf8_name))
+           dict_rename_var (dict, var, utf8_name);
+         else
+           msg (MW,
+            _("Recoded variable name duplicates an existing `%s' within system file."), utf8_name);
+    }
+
+      free (utf8_name);
+
+      /* Convert the variable label */
+      if (var_has_label (var))
+       {
+         char *utf8_label = recode_string (UTF8, enc, var_get_label (var), -1);
+         var_set_label (var, utf8_label);
+         free (utf8_label);
+       }
+
+      if (var_has_value_labels (var))
+       {
+         const struct val_lab *vl = NULL;
+         const struct val_labs *vlabs = var_get_value_labels (var);
+
+         for (vl = val_labs_first (vlabs); vl != NULL; vl = val_labs_next (vlabs, vl))
+           {
+             const union value *val = val_lab_get_value (vl);
+             const char *label = val_lab_get_label (vl);
+             char *new_label = NULL;
+
+             new_label = recode_string (UTF8, enc, label, -1);
+
+             var_replace_value_label (var, val, new_label);
+             free (new_label);
+           }
+       }
+    }
+}
+
 /* 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
@@ -303,6 +360,8 @@ sfm_open_reader (struct file_handle *fh, struct dictionary **dict,
       r->has_long_var_names = true;
     }
 
+  recode_strings (*dict);
+
   /* Read record 999 data, which is just filler. */
   read_int (r);
 
@@ -518,7 +577,7 @@ read_variable_record (struct sfm_reader *r, struct dictionary *dict,
 
   /* Create variable. */
   if (width < 0 || width > 255)
-    sys_error (r, _("Bad variable width %d."), width);
+    sys_error (r, _("Bad width %d for variable %s."), width, name);
   var = dict_create_var (dict, name, width);
   if (var == NULL)
     sys_error (r,
@@ -582,7 +641,7 @@ read_variable_record (struct sfm_reader *r, struct dictionary *dict,
           value_set_missing (&value, mv_width);
           for (i = 0; i < missing_value_code; i++)
             {
-              char *s = value_str_rw (&value, mv_width);
+              uint8_t *s = value_str_rw (&value, mv_width);
               read_bytes (r, s, 8);
               mv_add_str (&mv, s);
             }
@@ -922,11 +981,16 @@ read_machine_float_info (struct sfm_reader *r, size_t size, size_t count)
                size, count);
 
   if (sysmis != SYSMIS)
-    sys_warn (r, _("File specifies unexpected value %g as SYSMIS."), sysmis);
+    sys_warn (r, _("File specifies unexpected value %g as %s."),
+              sysmis, "SYSMIS");
+
   if (highest != HIGHEST)
-    sys_warn (r, _("File specifies unexpected value %g as HIGHEST."), highest);
+    sys_warn (r, _("File specifies unexpected value %g as %s."),
+              highest, "HIGHEST");
+
   if (lowest != LOWEST)
-    sys_warn (r, _("File specifies unexpected value %g as LOWEST."), lowest);
+    sys_warn (r, _("File specifies unexpected value %g as %s."),
+              lowest, "LOWEST");
 }
 
 /* Read record type 7, subtype 11, which specifies how variables
@@ -1133,7 +1197,7 @@ read_value_labels (struct sfm_reader *r,
 
   struct label
     {
-      char raw_value[8];        /* Value as uninterpreted bytes. */
+      uint8_t raw_value[8];        /* Value as uninterpreted bytes. */
       union value value;        /* Value. */
       char *label;              /* Null-terminated label string. */
     };
@@ -1231,7 +1295,7 @@ read_value_labels (struct sfm_reader *r,
 
       value_init_pool (subpool, &label->value, max_width);
       if (var_is_alpha (var[0]))
-        buf_copy_rpad (value_str_rw (&label->value, max_width), max_width,
+        u8_buf_copy_rpad (value_str_rw (&label->value, max_width), max_width,
                        label->raw_value, sizeof label->raw_value, ' ');
       else
         label->value.f = float_get_double (r->float_format, label->raw_value);
@@ -1411,7 +1475,7 @@ read_long_string_value_labels (struct sfm_reader *r,
           /* Read value. */
           value_length = read_int (r);
           if (value_length == width)
-            read_string (r, value_str_rw (&value, width), width + 1);
+            read_bytes (r, value_str_rw (&value, width), width);
           else
             {
               sys_warn (r, _("Ignoring long string value %zu for variable %s, "
@@ -1468,11 +1532,11 @@ static void partial_record (struct sfm_reader *r)
 static void read_error (struct casereader *, const struct sfm_reader *);
 
 static bool read_case_number (struct sfm_reader *, double *);
-static bool read_case_string (struct sfm_reader *, char *, size_t);
+static bool read_case_string (struct sfm_reader *, uint8_t *, size_t);
 static int read_opcode (struct sfm_reader *);
 static bool read_compressed_number (struct sfm_reader *, double *);
-static bool read_compressed_string (struct sfm_reader *, char *);
-static bool read_whole_strings (struct sfm_reader *, char *, size_t);
+static bool read_compressed_string (struct sfm_reader *, uint8_t *);
+static bool read_whole_strings (struct sfm_reader *, uint8_t *, size_t);
 static bool skip_whole_strings (struct sfm_reader *, size_t);
 
 /* Reads and returns one case from READER's file.  Returns a null
@@ -1507,7 +1571,7 @@ sys_file_casereader_read (struct casereader *reader, void *r_)
         }
       else
         {
-          char *s = value_str_rw (v, sv->var_width);
+          uint8_t *s = value_str_rw (v, sv->var_width);
           if (!read_case_string (r, s + sv->offset, sv->segment_width))
             goto eof;
           if (!skip_whole_strings (r, ROUND_DOWN (sv->padding, 8)))
@@ -1569,7 +1633,7 @@ read_case_number (struct sfm_reader *r, double *d)
    Returns true if successful, false if end of file is
    reached immediately. */
 static bool
-read_case_string (struct sfm_reader *r, char *s, size_t length)
+read_case_string (struct sfm_reader *r, uint8_t *s, size_t length)
 {
   size_t whole = ROUND_DOWN (length, 8);
   size_t partial = length % 8;
@@ -1582,7 +1646,7 @@ read_case_string (struct sfm_reader *r, char *s, size_t length)
 
   if (partial)
     {
-      char bounce[8];
+      uint8_t bounce[8];
       if (!read_whole_strings (r, bounce, sizeof bounce))
         {
           if (whole)
@@ -1653,7 +1717,7 @@ read_compressed_number (struct sfm_reader *r, double *d)
    Returns true if successful, false if end of file is
    reached immediately. */
 static bool
-read_compressed_string (struct sfm_reader *r, char *dst)
+read_compressed_string (struct sfm_reader *r, uint8_t *dst)
 {
   switch (read_opcode (r))
     {
@@ -1682,7 +1746,7 @@ read_compressed_string (struct sfm_reader *r, char *dst)
    Returns true if successful, false if end of file is
    reached immediately. */
 static bool
-read_whole_strings (struct sfm_reader *r, char *s, size_t length)
+read_whole_strings (struct sfm_reader *r, uint8_t *s, size_t length)
 {
   assert (length % 8 == 0);
   if (!r->compressed)
@@ -1710,7 +1774,7 @@ read_whole_strings (struct sfm_reader *r, char *s, size_t length)
 static bool
 skip_whole_strings (struct sfm_reader *r, size_t length)
 {
-  char buffer[1024];
+  uint8_t buffer[1024];
   assert (length < sizeof buffer);
   return read_whole_strings (r, buffer, length);
 }
index 13dc2de6a60cf45d9d0d2729675f265ae1c5b185..3fed2e05445135ec2ebcc300ce23c4855d0f41df 100644 (file)
@@ -31,6 +31,7 @@
 #include <libpspp/message.h>
 #include <libpspp/misc.h>
 #include <libpspp/str.h>
+#include <libpspp/i18n.h>
 #include <libpspp/version.h>
 
 #include <data/attributes.h>
@@ -94,9 +95,9 @@ struct sfm_writer
 static const struct casewriter_class sys_file_casewriter_class;
 
 static void write_header (struct sfm_writer *, const struct dictionary *);
-static void write_variable (struct sfm_writer *, const struct variable *);
+static void write_variable (struct sfm_writer *, const struct variable *, const struct dictionary *);
 static void write_value_labels (struct sfm_writer *,
-                                struct variable *, int idx);
+                                struct variable *, int idx, const struct dictionary *);
 static void write_integer_info_record (struct sfm_writer *);
 static void write_float_info_record (struct sfm_writer *);
 
@@ -222,7 +223,7 @@ sfm_open_writer (struct file_handle *fh, struct dictionary *d,
   /* Write basic variable info. */
   short_names_assign (d);
   for (i = 0; i < dict_get_var_cnt (d); i++)
-    write_variable (w, dict_get_var (d, i));
+    write_variable (w, dict_get_var (d, i), d);
 
   /* Write out value labels. */
   idx = 0;
@@ -230,7 +231,7 @@ sfm_open_writer (struct file_handle *fh, struct dictionary *d,
     {
       struct variable *v = dict_get_var (d, i);
 
-      write_value_labels (w, v, idx);
+      write_value_labels (w, v, idx, d);
       idx += sfm_width_to_octs (var_get_width (v));
     }
 
@@ -420,7 +421,7 @@ write_variable_continuation_records (struct sfm_writer *w, int width)
 /* Write the variable record(s) for variable V to system file
    W. */
 static void
-write_variable (struct sfm_writer *w, const struct variable *v)
+write_variable (struct sfm_writer *w, const struct variable *v, const struct dictionary *dict)
 {
   int width = var_get_width (v);
   int segment_cnt = sfm_width_to_segments (width);
@@ -461,9 +462,11 @@ write_variable (struct sfm_writer *w, const struct variable *v)
   if (var_has_label (v))
     {
       const char *label = var_get_label (v);
-      size_t padded_len = ROUND_UP (MIN (strlen (label), 255), 4);
+      char *l = recode_string (dict_get_encoding (dict), UTF8, label, -1);
+      size_t padded_len = ROUND_UP (MIN (strlen (l), 255), 4);
       write_int (w, padded_len);
-      write_string (w, label, padded_len);
+      write_string (w, l, padded_len);
+      free (l);
     }
 
   /* Write the missing values, if any, range first. */
@@ -505,7 +508,7 @@ write_variable (struct sfm_writer *w, const struct variable *v)
    Value labels for long string variables are written separately,
    by write_long_string_value_labels. */
 static void
-write_value_labels (struct sfm_writer *w, struct variable *v, int idx)
+write_value_labels (struct sfm_writer *w, struct variable *v, int idx, const struct dictionary *dict)
 {
   const struct val_labs *val_labs;
   const struct val_lab **labels;
@@ -524,13 +527,14 @@ write_value_labels (struct sfm_writer *w, struct variable *v, int idx)
   for (i = 0; i < n_labels; i++)
     {
       const struct val_lab *vl = labels[i];
-      const char *label = val_lab_get_label (vl);
+      char *label = recode_string (dict_get_encoding (dict), UTF8, val_lab_get_label (vl), -1);
       uint8_t len = MIN (strlen (label), 255);
 
       write_value (w, val_lab_get_value (vl), var_get_width (v));
       write_bytes (w, &len, 1);
       write_bytes (w, label, len);
       write_zeros (w, REM_RND_UP (len + 1, 8));
+      free (label);
     }
   free (labels);
 
@@ -774,11 +778,13 @@ write_longvar_table (struct sfm_writer *w, const struct dictionary *dict)
   for (i = 0; i < dict_get_var_cnt (dict); i++)
     {
       struct variable *v = dict_get_var (dict, i);
+      char *longname = recode_string (dict_get_encoding (dict), UTF8, var_get_name (v), -1);
 
       if (i)
         ds_put_char (&map, '\t');
       ds_put_format (&map, "%s=%s",
-                     var_get_short_name (v, 0), var_get_name (v));
+                     var_get_short_name (v, 0), longname);
+      free (longname);
     }
 
   write_int (w, 7);             /* Record type. */
index ce050c01668a47652e12bf9746e14deac2e58f9d..6dbecb11abfca8137bc8fdc763ffc1c0a8568bc2 100644 (file)
@@ -22,6 +22,7 @@
 #include <libpspp/hash.h>
 #include <libpspp/pool.h>
 #include <libpspp/str.h>
+#include <gl/unistr.h>
 
 #include "minmax.h"
 #include "xalloc.h"
@@ -44,7 +45,7 @@ value_copy_rpad (union value *dst, int dst_width,
                  const union value *src, int src_width,
                  char pad)
 {
-  buf_copy_rpad (value_str_rw (dst, dst_width), dst_width,
+  u8_buf_copy_rpad (value_str_rw (dst, dst_width), dst_width,
                  value_str (src, src_width), src_width,
                  pad);
 }
@@ -62,10 +63,10 @@ value_copy_rpad (union value *dst, int dst_width,
    DST was initialized.  Passing, e.g., a smaller value in order
    to modify only a prefix of DST will not work in every case. */
 void
-value_copy_str_rpad (union value *dst, int dst_width, const char *src,
+value_copy_str_rpad (union value *dst, int dst_width, const uint8_t *src,
                      char pad)
 {
-  value_copy_buf_rpad (dst, dst_width, src, strlen (src), pad);
+  value_copy_buf_rpad (dst, dst_width, src, u8_strlen (src), pad);
 }
 
 /* Copies the SRC_LEN bytes at SRC to string value DST with width
@@ -81,9 +82,9 @@ value_copy_str_rpad (union value *dst, int dst_width, const char *src,
    to modify only a prefix of DST will not work in every case. */
 void
 value_copy_buf_rpad (union value *dst, int dst_width,
-                     const char *src, size_t src_len, char pad)
+                     const uint8_t *src, size_t src_len, char pad)
 {
-  buf_copy_rpad (value_str_rw (dst, dst_width), dst_width, src, src_len, pad);
+  u8_buf_copy_rpad (value_str_rw (dst, dst_width), dst_width, src, src_len, pad);
 }
 
 /* Sets V to the system-missing value for data of the given
@@ -145,7 +146,7 @@ value_is_resizable (const union value *value, int old_width, int new_width)
     return false;
   else
     {
-      const char *str = value_str (value, old_width);
+      const uint8_t *str = value_str (value, old_width);
       int i;
 
       for (i = new_width; i < old_width; i++)
@@ -225,7 +226,7 @@ value_resize_pool (struct pool *pool, union value *value,
     {
       if (new_width > MAX_SHORT_STRING)
         {
-          char *new_long_string = pool_alloc_unaligned (pool, new_width);
+          uint8_t *new_long_string = pool_alloc_unaligned (pool, new_width);
           memcpy (new_long_string, value_str (value, old_width), old_width);
           value->long_string = new_long_string;
         }
index 046a9a3aa638a5e69b77bbecca8f8447e30d820b..f9782e2d867d47028f134c4b406dbfd53313d68c 100644 (file)
@@ -20,6 +20,7 @@
 #include <assert.h>
 #include <stdbool.h>
 #include <stdlib.h>
+#include <stdint.h>
 #include <string.h>
 #include "xalloc.h"
 \f
@@ -45,8 +46,8 @@
 union value
   {
     double f;
-    char short_string[MAX_SHORT_STRING];
-    char *long_string;
+    uint8_t short_string[MAX_SHORT_STRING];
+    uint8_t *long_string;
   };
 
 static inline void value_init (union value *, int width);
@@ -55,24 +56,21 @@ static inline bool value_try_init (union value *, int width);
 static inline void value_destroy (union value *, int width);
 
 static inline double value_num (const union value *);
-static inline const char *value_str (const union value *, int width);
-static inline char *value_str_rw (union value *, int width);
-
-int compare_values (const void *, const void *, const void *var);
-unsigned hash_value (const void *, const void *var);
+static inline const uint8_t *value_str (const union value *, int width);
+static inline uint8_t *value_str_rw (union value *, int width);
 
 static inline void value_copy (union value *, const union value *, int width);
 void value_copy_rpad (union value *, int dst_width,
                       const union value *, int src_width,
                       char pad);
-void value_copy_str_rpad (union value *, int dst_width, const char *,
+void value_copy_str_rpad (union value *, int dst_width, const uint8_t *,
                           char pad);
 void value_copy_buf_rpad (union value *dst, int dst_width,
-                          const char *src, size_t src_len, char pad);
+                          const uint8_t *src, size_t src_len, char pad);
 void value_set_missing (union value *, int width);
 int value_compare_3way (const union value *, const union value *, int width);
 bool value_equal (const union value *, const union value *, int width);
-size_t value_hash (const union value *, int width, unsigned int basis);
+unsigned int value_hash (const union value *, int width, unsigned int basis);
 
 bool value_is_resizable (const union value *, int old_width, int new_width);
 bool value_needs_resize (int old_width, int new_width);
@@ -150,7 +148,7 @@ value_num (const union value *v)
    It is important that WIDTH be the actual value that was passed
    to value_init.  Passing, e.g., a smaller value because only
    that number of bytes will be accessed will not always work. */
-static inline const char *
+static inline const uint8_t *
 value_str (const union value *v, int width)
 {
   assert (width > 0);
@@ -164,7 +162,7 @@ value_str (const union value *v, int width)
    It is important that WIDTH be the actual value that was passed
    to value_init.  Passing, e.g., a smaller value because only
    that number of bytes will be accessed will not always work. */
-static inline char *
+static inline uint8_t *
 value_str_rw (union value *v, int width)
 {
   assert (width > 0);
index c0767d7ce245bcfdbcec0b25080228d7c9a38dbc..d1e308640d05268df79f8639848cef04c618ba23 100644 (file)
@@ -149,13 +149,13 @@ var_clone (const struct variable *old_var)
   return new_var;
 }
 
-/* Create a variable to be used for internal calculations only.
-   The variable is assigned a unique dictionary index and a case
-   index of CASE_IDX. */
+/* Create a variable of the specified WIDTH to be used for
+   internal calculations only.  The variable is assigned a unique
+   dictionary index and a case index of CASE_IDX. */
 struct variable *
-var_create_internal (int case_idx)
+var_create_internal (int case_idx, int width)
 {
-  struct variable *v = var_create ("$internal", 0);
+  struct variable *v = var_create ("$internal", width);
   struct vardict_info vdi;
   static int counter = INT_MAX / 2;
 
@@ -494,7 +494,7 @@ var_is_num_missing (const struct variable *v, double d, enum mv_class class)
    S[] must contain exactly as many characters as V's width.
    V must be a string variable. */
 bool
-var_is_str_missing (const struct variable *v, const char s[],
+var_is_str_missing (const struct variable *v, const uint8_t s[],
                     enum mv_class class)
 {
   return mv_is_str_missing (&v->miss, s, class);
@@ -590,10 +590,12 @@ var_append_value_name (const struct variable *v, const union value *value,
                       struct string *str)
 {
   const char *name = var_lookup_value_label (v, value);
+  const struct dictionary *dict = var_get_vardict (v)->dict;
   if (name == NULL)
     {
-      char *s = ds_put_uninit (str, v->print.w);
-      data_out (value, &v->print, s);
+      char *s = data_out (value, dict_get_encoding (dict), &v->print);
+      ds_put_cstr (str, s);
+      free (s);
     }
   else
     ds_put_cstr (str, name);
index 2752aeb325faaa03d86e92c3aa0a57a228552962..0b619a497ed1eefa04a1dac97ec4be20afac4b80 100644 (file)
@@ -32,7 +32,7 @@ union value;
 struct variable *var_create (const char *name, int width);
 struct variable *var_clone (const struct variable *);
 void var_destroy (struct variable *);
-struct variable *var_create_internal (int case_idx);
+struct variable *var_create_internal (int case_idx, int width);
 
 
 /* Variable names. */
@@ -69,7 +69,7 @@ bool var_has_missing_values (const struct variable *);
 bool var_is_value_missing (const struct variable *, const union value *,
                            enum mv_class);
 bool var_is_num_missing (const struct variable *, double, enum mv_class);
-bool var_is_str_missing (const struct variable *, const char[], enum mv_class);
+bool var_is_str_missing (const struct variable *, const uint8_t[], enum mv_class);
 
 /* Value labels. */
 const char *var_lookup_value_label (const struct variable *,
index 5dd2a30835f4e3d0eb053ecdd55a03918cc56fdd..c00d94b9c4b3597bcc2416ae0e29fd56018b229f 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2009 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -205,7 +205,7 @@ do_parse_command (struct lexer *lexer,
     }
   else if (command->function == NULL)
     {
-      msg (SE, _("%s is unimplemented."), command->name);
+      msg (SE, _("%s is not yet implemented."), command->name);
       result = CMD_NOT_IMPLEMENTED;
       goto finish;
     }
index de85748856e003928f67512b17f93e265cead03e..d43af347a701693224980ea18281eaf72d6c0e60 100644 (file)
@@ -86,7 +86,7 @@ cmd_data_list (struct lexer *lexer, struct dataset *ds)
   bool ok;
 
   dict = in_input_program () ? dataset_dict (ds) : dict_create ();
-  parser = data_parser_create ();
+  parser = data_parser_create (dict);
   reader = NULL;
 
   table = -1;                /* Print table if nonzero, -1=undecided. */
index 2f503423adcbcb5e4066c36736bc6e215d3fdd72..6ec3d0d50bc94e258d44306d25d1157483f73c70 100644 (file)
@@ -41,6 +41,7 @@
 /* Data parser for textual data like that read by DATA LIST. */
 struct data_parser
   {
+    const struct dictionary *dict; /*Dictionary of destination */
     enum data_parser_type type; /* Type of data to parse. */
     int skip_records;           /* Records to skip before first real data. */
     casenumber max_cases;       /* Max number of cases to read. */
@@ -79,7 +80,7 @@ static void set_any_sep (struct data_parser *parser);
 
 /* Creates and returns a new data parser. */
 struct data_parser *
-data_parser_create (void)
+data_parser_create (const struct dictionary *dict)
 {
   struct data_parser *parser = xmalloc (sizeof *parser);
 
@@ -91,6 +92,7 @@ data_parser_create (void)
   parser->fields = NULL;
   parser->field_cnt = 0;
   parser->field_allocated = 0;
+  parser->dict = dict;
 
   parser->span = true;
   parser->empty_line_has_field = false;
@@ -505,7 +507,7 @@ static bool
 parse_fixed (const struct data_parser *parser, struct dfm_reader *reader,
              struct ccase *c)
 {
-  enum legacy_encoding encoding = dfm_reader_get_legacy_encoding (reader);
+  const char *encoding = dfm_reader_get_legacy_encoding (reader);
   struct field *f;
   int row;
 
@@ -531,6 +533,7 @@ parse_fixed (const struct data_parser *parser, struct dfm_reader *reader,
                             f->format.w),
                  encoding, f->format.type, f->format.d,
                  f->first_column, f->first_column + f->format.w,
+                parser->dict,
                  case_data_rw_idx (c, f->case_idx),
                  fmt_var_width (&f->format));
 
@@ -547,7 +550,7 @@ static bool
 parse_delimited_span (const struct data_parser *parser,
                       struct dfm_reader *reader, struct ccase *c)
 {
-  enum legacy_encoding encoding = dfm_reader_get_legacy_encoding (reader);
+  const char *encoding = dfm_reader_get_legacy_encoding (reader);
   struct string tmp = DS_EMPTY_INITIALIZER;
   struct field *f;
 
@@ -574,6 +577,7 @@ parse_delimited_span (const struct data_parser *parser,
 
       data_in (s, encoding, f->format.type, 0,
                first_column, last_column,
+              parser->dict,
                case_data_rw_idx (c, f->case_idx),
                fmt_var_width (&f->format));
     }
@@ -588,7 +592,7 @@ static bool
 parse_delimited_no_span (const struct data_parser *parser,
                          struct dfm_reader *reader, struct ccase *c)
 {
-  enum legacy_encoding encoding = dfm_reader_get_legacy_encoding (reader);
+  const char *encoding = dfm_reader_get_legacy_encoding (reader);
   struct string tmp = DS_EMPTY_INITIALIZER;
   struct substring s;
   struct field *f;
@@ -614,6 +618,7 @@ parse_delimited_no_span (const struct data_parser *parser,
 
       data_in (s, encoding, f->format.type, 0,
                first_column, last_column,
+              parser->dict,
                case_data_rw_idx (c, f->case_idx),
                fmt_var_width (&f->format));
     }
@@ -656,9 +661,9 @@ dump_fixed_table (const struct data_parser *parser,
       int row = i + 1;
 
       tab_text (t, 0, row, TAB_LEFT, f->name);
-      tab_text (t, 1, row, TAT_PRINTF, "%d", f->record);
-      tab_text (t, 2, row, TAT_PRINTF, "%3d-%3d",
-                f->first_column, f->first_column + f->format.w - 1);
+      tab_text_format (t, 1, row, 0, "%d", f->record);
+      tab_text_format (t, 2, row, 0, "%3d-%3d",
+                       f->first_column, f->first_column + f->format.w - 1);
       tab_text (t, 3, row, TAB_LEFT | TAB_FIX,
                 fmt_to_string (&f->format, fmt_string));
     }
index b250e91bb53d2d7cf7b628fd6f41cb8113f7f30b..5a53a2f64ddcc3ab5c30286f438df15158014e4a 100644 (file)
@@ -38,7 +38,7 @@ enum data_parser_type
   };
 
 /* Creating and configuring any parser. */
-struct data_parser *data_parser_create (void);
+struct data_parser *data_parser_create (const struct dictionary *dict);
 void data_parser_destroy (struct data_parser *);
 
 enum data_parser_type data_parser_get_type (const struct data_parser *);
index 24ddcf13ec61cf6749c64cd63bfd4e03268cbeea..6f620a6a948341a0dfa5db150763d20f51e92284 100644 (file)
@@ -597,7 +597,7 @@ dfm_expand_tabs (struct dfm_reader *r)
 }
 
 /* Returns the legacy character encoding of data read from READER. */
-enum legacy_encoding
+const char *
 dfm_reader_get_legacy_encoding (const struct dfm_reader *reader)
 {
   return fh_get_legacy_encoding (reader->fh);
index c7fee613d01caefe81f5edf5fe10c6f0538dc84f..308701c253147d48863a01bdb159c002e5fbf52a 100644 (file)
@@ -38,8 +38,7 @@ bool dfm_reader_error (const struct dfm_reader *);
 unsigned dfm_eof (struct dfm_reader *);
 struct substring dfm_get_record (struct dfm_reader *);
 void dfm_expand_tabs (struct dfm_reader *);
-enum legacy_encoding dfm_reader_get_legacy_encoding (
-  const struct dfm_reader *);
+const char *dfm_reader_get_legacy_encoding (const struct dfm_reader *);
 int dfm_get_percent_read (const struct dfm_reader *);
 
 /* Line control. */
index b5df59d4605f2535a690aea77e0934eb46ee6a65..85b11d4c1e553054160f8b1a57a3d1cac2704a00 100644 (file)
@@ -200,7 +200,7 @@ dfm_close_writer (struct dfm_writer *w)
 }
 
 /* Returns the legacy character encoding of data written to WRITER. */
-enum legacy_encoding
+const char *
 dfm_writer_get_legacy_encoding (const struct dfm_writer *writer)
 {
   return fh_get_legacy_encoding (writer->fh);
index 2142f2155008a8c934e471a72d837e992faae044..045db3163fd3144f2653e294d5a023e1416dc0f6 100644 (file)
@@ -27,7 +27,6 @@ struct dfm_writer *dfm_open_writer (struct file_handle *);
 bool dfm_close_writer (struct dfm_writer *);
 bool dfm_write_error (const struct dfm_writer *);
 bool dfm_put_record (struct dfm_writer *, const char *rec, size_t len);
-enum legacy_encoding dfm_writer_get_legacy_encoding (
-  const struct dfm_writer *);
+const char *dfm_writer_get_legacy_encoding (const struct dfm_writer *);
 
 #endif /* data-writer.h */
index 827dbab499e9af94a7c55fee5a42764a1ca39f89..3e053ed57262eb5f6e94d404ed5686253e640a16 100644 (file)
@@ -102,7 +102,7 @@ cmd_file_handle (struct lexer *lexer, struct dataset *ds)
           properties.mode = FH_MODE_VARIABLE;
           break;
         case FH_360:
-          properties.encoding = LEGACY_EBCDIC;
+          properties.encoding = "EBCDIC-US";
           if (cmd.recform == FH_FIXED || cmd.recform == FH_F)
             properties.mode = FH_MODE_FIXED;
           else if (cmd.recform == FH_VARIABLE || cmd.recform == FH_V)
index e4ab76a9992739c78a36f6ad2a98c4f6e0b48d83..32202babdea8848f5c3a06b6431b0db3c4b007ff 100644 (file)
@@ -271,7 +271,7 @@ static int
 parse_get_txt (struct lexer *lexer, struct dataset *ds)
 {
   struct data_parser *parser = NULL;
-  struct dictionary *dict = NULL;
+  struct dictionary *dict = dict_create ();
   struct file_handle *fh = NULL;
   struct dfm_reader *reader = NULL;
 
@@ -288,7 +288,7 @@ parse_get_txt (struct lexer *lexer, struct dataset *ds)
   if (fh == NULL)
     goto error;
 
-  parser = data_parser_create ();
+  parser = data_parser_create (dict);
   has_type = false;
   data_parser_set_type (parser, DP_DELIMITED);
   data_parser_set_span (parser, false);
@@ -465,7 +465,7 @@ parse_get_txt (struct lexer *lexer, struct dataset *ds)
     }
   lex_match (lexer, '=');
 
-  dict = dict_create ();
+
   record = 1;
   type = data_parser_get_type (parser);
   do
index 28820a8504b5fdfc15c8ede3338439ab0f1b4d7a..c3f9b0881b959fac98a3cffac628662ffe143299 100644 (file)
@@ -706,18 +706,21 @@ list_case (const struct ccase *c, casenumber case_idx,
             if (fmt_is_string (print->type)
                 || dict_contains_var (dict, v))
              {
-                data_out (case_data (c, v), print,
-                          ds_put_uninit (&line_buffer, print->w));
+               char *s = data_out (case_data (c, v), dict_get_encoding (dict), print);
+               ds_put_cstr (&line_buffer, s);
+               free (s);
              }
             else
               {
+               char *s;
                 union value case_idx_value;
                 case_idx_value.f = case_idx;
-                data_out (&case_idx_value, print,
-                          ds_put_uninit (&line_buffer,print->w));
+                s = data_out (&case_idx_value, dict_get_encoding (dict), print);
+               ds_put_cstr (&line_buffer, s);
+               free (s);
               }
 
-           ds_put_char(&line_buffer, ' ');
+           ds_put_char (&line_buffer, ' ');
          }
 
        if (!n_lines_remaining (d))
@@ -740,20 +743,21 @@ list_case (const struct ccase *c, casenumber case_idx,
          {
            const struct variable *v = cmd.v_variables[column];
             const struct fmt_spec *print = var_get_print_format (v);
-           char buf[256];
+           char *s = NULL;
 
             if (fmt_is_string (print->type)
                 || dict_contains_var (dict, v))
-             data_out (case_data (c, v), print, buf);
+             s = data_out (case_data (c, v), dict_get_encoding (dict), print);
             else
               {
                 union value case_idx_value;
                 case_idx_value.f = case_idx;
-                data_out (&case_idx_value, print, buf);
+                s = data_out (&case_idx_value, dict_get_encoding (dict), print);
               }
 
             fputs ("    <TD>", x->file);
-            html_put_cell_contents (d, TAB_FIX, ss_buffer (buf, print->w));
+            html_put_cell_contents (d, TAB_FIX, ss_buffer (s, print->w));
+           free (s);
             fputs ("</TD>\n", x->file);
          }
 
index aae8b38a05f7d126f4ca473a92cf818542a1c6f9..e345477baf706f50add706bbac7e5f04b0d4057d 100644 (file)
@@ -32,6 +32,7 @@
 #include <language/lexer/lexer.h>
 #include <language/lexer/variable-parser.h>
 #include <libpspp/assertion.h>
+#include <libpspp/i18n.h>
 #include <libpspp/compiler.h>
 #include <libpspp/ll.h>
 #include <libpspp/message.h>
@@ -83,7 +84,7 @@ struct print_trns
     struct pool *pool;          /* Stores related data. */
     bool eject;                 /* Eject page before printing? */
     bool include_prefix;        /* Prefix lines with space? */
-    enum legacy_encoding encoding; /* Encoding to use for output. */
+    const char *encoding;       /* Encoding to use for output. */
     struct dfm_writer *writer; /* Output file, NULL=listing file. */
     struct ll_list specs;       /* List of struct prt_out_specs. */
     size_t record_cnt;          /* Number of records to write. */
@@ -413,8 +414,9 @@ dump_table (struct print_trns *trns, const struct file_handle *fh)
       switch (spec->type)
         {
         case PRT_LITERAL:
-          tab_text (t, 0, row, TAB_LEFT | TAB_FIX | TAT_PRINTF, "\"%.*s\"",
-                    (int) ds_length (&spec->string), ds_data (&spec->string));
+          tab_text_format (t, 0, row, TAB_LEFT | TAB_FIX, "\"%.*s\"",
+                           (int) ds_length (&spec->string),
+                           ds_data (&spec->string));
           width = ds_length (&spec->string);
           break;
         case PRT_VAR:
@@ -426,9 +428,9 @@ dump_table (struct print_trns *trns, const struct file_handle *fh)
         default:
           NOT_REACHED ();
        }
-      tab_text (t, 1, row, TAT_PRINTF, "%d", spec->record);
-      tab_text (t, 2, row, TAT_PRINTF, "%3d-%3d",
-                spec->first_column, spec->first_column + width - 1);
+      tab_text_format (t, 1, row, 0, "%d", spec->record);
+      tab_text_format (t, 2, row, 0, "%3d-%3d",
+                       spec->first_column, spec->first_column + width - 1);
       row++;
     }
 
@@ -479,12 +481,13 @@ print_trns_proc (void *trns_, struct ccase **c, casenumber case_num UNUSED)
       else
         {
           ds_put_substring (&trns->line, ds_ss (&spec->string));
-          if (trns->encoding != LEGACY_NATIVE)
+          if (0 != strcmp (trns->encoding, LEGACY_NATIVE))
             {
               size_t length = ds_length (&spec->string);
               char *data = ss_data (ds_tail (&trns->line, length));
-              legacy_recode (LEGACY_NATIVE, data,
-                             trns->encoding, data, length);
+             char *s = recode_string (trns->encoding, LEGACY_NATIVE, data, length);
+             memcpy (data, s, length);
+             free (s);
             }
         }
     }
index aa3ce698206ba652cef8a299c6f6926095329881..819b0a9021cfe5821b4060e02b9932830b2a6120 100644 (file)
@@ -101,7 +101,7 @@ cmd_missing_values (struct lexer *lexer, struct dataset *ds)
               mv_init (&mv, MV_MAX_STRING);
               while (!lex_match (lexer, ')'))
                 {
-                  char value[MV_MAX_STRING];
+                  uint8_t value[MV_MAX_STRING];
                   size_t length;
 
                   if (!lex_force_string (lexer))
index 155cfa1208c23a035a2f9058eceb3c10de6d241d..5d2b42d758eed2d1e305d05046d59cf0aa290877 100644 (file)
@@ -88,17 +88,17 @@ output_split_file_values (const struct dataset *ds, const struct ccase *c)
   for (i = 0; i < split_cnt; i++)
     {
       const struct variable *v = split[i];
-      char temp_buf[80];
+      char *s;
       const char *val_lab;
       const struct fmt_spec *print = var_get_print_format (v);
 
-      tab_text (t, 0, i + 1, TAB_LEFT | TAT_PRINTF, "%s", var_get_name (v));
+      tab_text_format (t, 0, i + 1, TAB_LEFT, "%s", var_get_name (v));
 
-      data_out (case_data (c, v), print, temp_buf);
-      temp_buf[print->w] = 0;
-
-      tab_text (t, 1, i + 1, TAT_PRINTF, "%.*s", print->w, temp_buf);
+      s = data_out (case_data (c, v), dict_get_encoding (dict), print);
+      tab_text_format (t, 1, i + 1, 0, "%.*s", print->w, s);
 
+      free (s);
+      
       val_lab = var_lookup_value_label (v, case_data (c, v));
       if (val_lab)
        tab_text (t, 2, i + 1, TAB_LEFT, val_lab);
index 8f2ab7d7a04de75ca753a4fd700326b787695da5..6a0c81acac768b50ee782a3ef979ff96db57f615 100644 (file)
@@ -120,8 +120,8 @@ cmd_sysfile_info (struct lexer *lexer, struct dataset *ds UNUSED)
     tab_text (t, 1, 1, TAB_LEFT, label);
   }
   tab_text (t, 0, 2, TAB_LEFT, _("Created:"));
-  tab_text (t, 1, 2, TAB_LEFT | TAT_PRINTF, "%s %s by %s",
-               info.creation_date, info.creation_time, info.product);
+  tab_text_format (t, 1, 2, TAB_LEFT, "%s %s by %s",
+                   info.creation_date, info.creation_time, info.product);
   tab_text (t, 0, 3, TAB_LEFT, _("Integer Format:"));
   tab_text (t, 1, 3, TAB_LEFT,
             info.integer_format == INTEGER_MSB_FIRST ? _("Big Endian.")
@@ -136,11 +136,11 @@ cmd_sysfile_info (struct lexer *lexer, struct dataset *ds UNUSED)
             : info.float_format == FLOAT_Z_LONG ? _("IBM 390 Hex Long.")
             : _("Unknown."));
   tab_text (t, 0, 5, TAB_LEFT, _("Variables:"));
-  tab_text (t, 1, 5, TAB_LEFT | TAT_PRINTF, "%zu", dict_get_var_cnt (d));
+  tab_text_format (t, 1, 5, TAB_LEFT, "%zu", dict_get_var_cnt (d));
   tab_text (t, 0, 6, TAB_LEFT, _("Cases:"));
-  tab_text (t, 1, 6, TAB_LEFT | TAT_PRINTF,
-            info.case_cnt == -1 ? _("Unknown") : "%ld",
-            (long int) info.case_cnt);
+  tab_text_format (t, 1, 6, TAB_LEFT,
+                   info.case_cnt == -1 ? _("Unknown") : "%ld",
+                   (long int) info.case_cnt);
   tab_text (t, 0, 7, TAB_LEFT, _("Type:"));
   tab_text (t, 1, 7, TAB_LEFT, _("System File."));
   tab_text (t, 0, 8, TAB_LEFT, _("Weight:"));
@@ -151,13 +151,13 @@ cmd_sysfile_info (struct lexer *lexer, struct dataset *ds UNUSED)
                ? var_get_name (weight_var) : _("Not weighted.")));
   }
   tab_text (t, 0, 9, TAB_LEFT, _("Mode:"));
-  tab_text (t, 1, 9, TAB_LEFT | TAT_PRINTF,
-               _("Compression %s."), info.compressed ? _("on") : _("off"));
+  tab_text_format (t, 1, 9, TAB_LEFT,
+                   _("Compression %s."), info.compressed ? _("on") : _("off"));
 
 
   tab_text (t, 0, 10, TAB_LEFT, _("Charset:"));
-  tab_text (t, 1, 10, TAB_LEFT | TAT_PRINTF,
-           dict_get_encoding(d) ? dict_get_encoding(d) : _("Unknown"));
+  tab_text_format (t, 1, 10, TAB_LEFT,
+                   dict_get_encoding(d) ? dict_get_encoding(d) : _("Unknown"));
 
 
   tab_dim (t, tab_natural_dimensions, NULL);
@@ -459,8 +459,7 @@ display_attributes (struct tab_table *t, const struct attrset *set, int flags,
       for (i = 0; i < n_values; i++)
         {
           if (n_values > 1)
-            tab_text (t, c, r, TAB_LEFT | TAT_PRINTF, "%s[%d]",
-                      name, i + 1);
+            tab_text_format (t, c, r, TAB_LEFT, "%s[%d]", name, i + 1);
           else
             tab_text (t, c, r, TAB_LEFT, name);
           tab_text (t, c + 1, r, TAB_LEFT, attribute_get_value (attr, i));
@@ -523,7 +522,7 @@ describe_variable (const struct variable *v, struct tab_table *t, int r,
   /* Put the name, var label, and position into the first row. */
   tab_text (t, 0, r, TAB_LEFT, var_get_name (v));
   if (flags & DF_DICT_INDEX)
-    tab_text (t, pc, r, TAT_PRINTF, "%zu", var_get_dict_index (v) + 1);
+    tab_text_format (t, pc, r, 0, "%zu", var_get_dict_index (v) + 1);
 
   if (flags & DF_VARIABLE_LABELS && var_has_label (v))
     {
@@ -540,18 +539,20 @@ describe_variable (const struct variable *v, struct tab_table *t, int r,
       if (fmt_equal (print, write))
         {
           char str[FMT_STRING_LEN_MAX + 1];
-          tab_joint_text (t, 1, r, 2, r, TAB_LEFT | TAT_PRINTF,
-                          _("Format: %s"), fmt_to_string (print, str));
+          tab_joint_text_format (t, 1, r, 2, r, TAB_LEFT,
+                                 _("Format: %s"), fmt_to_string (print, str));
           r++;
         }
       else
         {
           char str[FMT_STRING_LEN_MAX + 1];
-          tab_joint_text (t, 1, r, 2, r, TAB_LEFT | TAT_PRINTF,
-                          _("Print Format: %s"), fmt_to_string (print, str));
+          tab_joint_text_format (t, 1, r, 2, r, TAB_LEFT,
+                                 _("Print Format: %s"),
+                                 fmt_to_string (print, str));
           r++;
-          tab_joint_text (t, 1, r, 2, r, TAB_LEFT | TAT_PRINTF,
-                          _("Write Format: %s"), fmt_to_string (write, str));
+          tab_joint_text_format (t, 1, r, 2, r, TAB_LEFT,
+                                 _("Write Format: %s"),
+                                 fmt_to_string (write, str));
           r++;
         }
     }
@@ -562,20 +563,21 @@ describe_variable (const struct variable *v, struct tab_table *t, int r,
       enum measure m = var_get_measure (v);
       enum alignment a = var_get_alignment (v);
 
-      tab_joint_text (t, 1, r, 2, r, TAB_LEFT | TAT_PRINTF,
-                      _("Measure: %s"),
-                      m == MEASURE_NOMINAL ? _("Nominal")
-                      : m == MEASURE_ORDINAL ? _("Ordinal")
-                      : _("Scale"));
+      tab_joint_text_format (t, 1, r, 2, r, TAB_LEFT,
+                             _("Measure: %s"),
+                             m == MEASURE_NOMINAL ? _("Nominal")
+                             : m == MEASURE_ORDINAL ? _("Ordinal")
+                             : _("Scale"));
       r++;
-      tab_joint_text (t, 1, r, 2, r, TAB_LEFT | TAT_PRINTF,
-                      _("Display Alignment: %s"),
-                      a == ALIGN_LEFT ? _("Left")
-                      : a == ALIGN_CENTRE ? _("Center")
-                      : _("Right"));
+      tab_joint_text_format (t, 1, r, 2, r, TAB_LEFT,
+                             _("Display Alignment: %s"),
+                             a == ALIGN_LEFT ? _("Left")
+                             : a == ALIGN_CENTRE ? _("Center")
+                             : _("Right"));
       r++;
-      tab_joint_text (t, 1, r, 2, r, TAB_LEFT | TAT_PRINTF,
-                      _("Display Width: %d"), var_get_display_width (v));
+      tab_joint_text_format (t, 1, r, 2, r, TAB_LEFT,
+                             _("Display Width: %d"),
+                             var_get_display_width (v));
       r++;
     }
   
@@ -739,7 +741,7 @@ display_vectors (const struct dictionary *dict, int sorted)
           char fmt_string[FMT_STRING_LEN_MAX + 1];
           fmt_to_string (var_get_print_format (var), fmt_string);
 
-          tab_text (t, 1, row, TAB_RIGHT | TAT_PRINTF, "%zu", j + 1);
+          tab_text_format (t, 1, row, TAB_RIGHT, "%zu", j + 1);
           tab_text (t, 2, row, TAB_LEFT, var_get_name (var));
           tab_text (t, 3, row, TAB_LEFT, fmt_string);
           row++;
index 2d31bd47182dcb158d9f9c50e644fb03bb7b07bf..d283867214811ea142d83cafd39d9b69faf2a0a0 100644 (file)
@@ -573,7 +573,7 @@ string function RTRIM (string s, string c)
 function NUMBER (string s, ni_format f)
 {
   union value out;
-  data_in (ss_head (s, f->w), LEGACY_NATIVE, f->type, f->d, 0, 0, &out, 0);
+  data_in (ss_head (s, f->w), LEGACY_NATIVE, f->type, f->d, 0, 0, NULL, &out, 0);
   return out.f;
 }
 
@@ -582,11 +582,15 @@ absorb_miss string function STRING (x, no_format f)
 {
   union value v;
   struct substring dst;
+  char *s;
 
   v.f = x;
-  dst = alloc_string (e, f->w);
+
   assert (!fmt_is_string (f->type));
-  data_out (&v, f, dst.string);
+  s = data_out (&v, LEGACY_NATIVE, f);
+  dst = alloc_string (e, strlen (s));
+  strcpy (dst.string, s);
+  free (s);
   return dst;
 }
 
index 265116141eb36f0d8ffa685a326431cd79f7b7ad..8b3f2a48d00474811a09c090f8a82d1b75ed7546 100644 (file)
@@ -385,10 +385,9 @@ lex_get (struct lexer *lexer)
           else
             {
               unsigned char c = *lexer->prog++;
-              if (c_isgraph (c))
-                msg (SE, _("Bad character in input: `%c'."), c);
-              else
-                msg (SE, _("Bad character in input: `\\%o'."), c);
+              char *c_name = xasprintf (c_isgraph (c) ? "%c" : "\\%o", c);
+              msg (SE, _("Bad character in input: `%s'."), c_name);
+              free (c_name);
               continue;
             }
         }
index 2cf9cf2bb9ad71f91d6ad301c4625d6b2a7cd012..c780d86f04e95429bad3ee1004bbf2021ab89884 100644 (file)
@@ -99,8 +99,9 @@ parse_number (struct lexer *lexer, double *x, const enum fmt_type *format)
   else if (lex_token (lexer) == T_STRING && format != NULL)
     {
       union value v;
+      assert (! (fmt_get_category (*format) & ( FMT_CAT_STRING )));
       data_in (ds_ss (lex_tokstr (lexer)), LEGACY_NATIVE,
-               *format, 0, 0, 0, &v, 0);
+               *format, 0, 0, 0, NULL, &v, 0);
       lex_get (lexer);
       *x = v.f;
       if (*x == SYSMIS)
index 0d181bd45e3999ab1c45b8267e713f6cf1aeb797..08d2f5e15c7d06176f1787b5e81017c7da54ad83 100644 (file)
@@ -1105,10 +1105,10 @@ initialize_aggregate_info (struct agr_proc *agr, const struct ccase *input)
             proto = caseproto_add_width (proto, 0);
 
            if ( ! iter->subject)
-             iter->subject = var_create_internal (0);
+             iter->subject = var_create_internal (0, 0);
 
            if ( ! iter->weight)
-             iter->weight = var_create_internal (1);
+             iter->weight = var_create_internal (1, 0);
 
             subcase_init_var (&ordering, iter->subject, SC_ASCEND);
            iter->writer = sort_create_writer (&ordering, proto);
index b44c5a6f165ea38160430bfedb3012630169afc2..26e0257ca14030ca3d58a2ae10acd8f960b45d2c 100644 (file)
@@ -261,9 +261,9 @@ binomial_execute (const struct dataset *ds,
       tab_text (table,  4, 0,  TAB_CENTER, _("Observed Prop."));
       tab_text (table,  5, 0,  TAB_CENTER, _("Test Prop."));
 
-      tab_text (table,  6, 0,  TAB_CENTER | TAT_PRINTF,
-                _("Exact Sig. (%d-tailed)"),
-                bst->p == 0.5 ? 2: 1);
+      tab_text_format (table,  6, 0,  TAB_CENTER,
+                       _("Exact Sig. (%d-tailed)"),
+                       bst->p == 0.5 ? 2 : 1);
 
       tab_vline (table, TAL_2, 2, 0, tab_nr (table) -1);
       tab_submit (table);
index 70bbe5cc95b31857214fa50f21e3070466b9a80f..99fa41d9c056a039ef9d92fdc9090758539c9d15 100644 (file)
@@ -177,6 +177,7 @@ get_var_range (const struct variable *v)
 
 struct crosstabs_proc
   {
+    const struct dictionary *dict;
     enum { INTEGER, GENERAL } mode;
     enum mv_class exclude;
     bool pivot;
@@ -204,6 +205,7 @@ static void
 init_proc (struct crosstabs_proc *proc, struct dataset *ds)
 {
   const struct variable *wv = dict_get_weight (dataset_dict (ds));
+  proc->dict = dataset_dict (ds);
   proc->bad_warn = true;
   proc->variables = NULL;
   proc->n_variables = 0;
@@ -881,8 +883,8 @@ make_summary_table (struct crosstabs_proc *proc)
         {
           tab_double (summary, i * 2 + 1, 0, TAB_RIGHT, n[i],
                       &proc->weight_format);
-          tab_text (summary, i * 2 + 2, 0, TAB_RIGHT | TAT_PRINTF, "%.1f%%",
-                    n[i] / n[2] * 100.);
+          tab_text_format (summary, i * 2 + 2, 0, TAB_RIGHT, "%.1f%%",
+                           n[i] / n[2] * 100.);
         }
 
       tab_next_row (summary);
@@ -1184,14 +1186,16 @@ create_crosstab_table (struct crosstabs_proc *proc, struct pivot_table *pt)
     {
       const struct variable *var = pt->const_vars[i];
       size_t ofs;
+      char *s = NULL;
 
       ds_put_format (&title, ", %s=", var_get_name (var));
 
       /* Insert the formatted value of the variable, then trim
          leading spaces in what was just inserted. */
       ofs = ds_length (&title);
-      data_out (&pt->const_values[i], var_get_print_format (var),
-                ds_put_uninit (&title, var_get_width (var)));
+      s = data_out (&pt->const_values[i], dict_get_encoding (proc->dict), var_get_print_format (var));
+      ds_put_cstr (&title, s);
+      free (s);
       ds_remove (&title, ofs, ss_cspan (ds_substr (&title, ofs, SIZE_MAX),
                                         ss_cstr (" ")));
     }
@@ -1233,9 +1237,9 @@ create_chisq_table (struct pivot_table *pt)
   tab_text (chisq, 3, 0, TAB_RIGHT | TAT_TITLE,
             _("Asymp. Sig. (2-sided)"));
   tab_text (chisq, 4, 0, TAB_RIGHT | TAT_TITLE,
-            _("Exact. Sig. (2-sided)"));
+            _("Exact Sig. (2-sided)"));
   tab_text (chisq, 5, 0, TAB_RIGHT | TAT_TITLE,
-            _("Exact. Sig. (1-sided)"));
+            _("Exact Sig. (1-sided)"));
   tab_offset (chisq, 0, 1);
 
   return chisq;
@@ -1276,8 +1280,8 @@ create_risk_table (struct pivot_table *pt)
   tab_title (risk, _("Risk estimate."));
 
   tab_offset (risk, pt->n_vars - 2, 0);
-  tab_joint_text (risk, 2, 0, 3, 0, TAB_CENTER | TAT_TITLE | TAT_PRINTF,
-                  _("95%% Confidence Interval"));
+  tab_joint_text_format (risk, 2, 0, 3, 0, TAB_CENTER | TAT_TITLE,
+                         _("95%% Confidence Interval"));
   tab_text (risk, 0, 1, TAB_LEFT | TAT_TITLE, _("Statistic"));
   tab_text (risk, 1, 1, TAB_RIGHT | TAT_TITLE, _("Value"));
   tab_text (risk, 2, 1, TAB_RIGHT | TAT_TITLE, _("Lower"));
@@ -1519,9 +1523,8 @@ table_value_missing (struct crosstabs_proc *proc,
       return;
     }
 
-  s.string = tab_alloc (table, print->w);
-  data_out (v, print, s.string);
-  s.length = print->w;
+  s = ss_cstr (data_out_pool (v, dict_get_encoding (proc->dict), print,
+                            table->container));
   if (proc->exclude == MV_NEVER && var_is_num_missing (var, v->f, MV_USER))
     s.string[s.length++] = 'M';
   while (s.length && *s.string == ' ')
@@ -1554,16 +1557,15 @@ display_dimensions (struct crosstabs_proc *proc, struct pivot_table *pt,
    additionally suffixed with a letter `M'. */
 static void
 format_cell_entry (struct tab_table *table, int c, int r, double value,
-                   char suffix, bool mark_missing)
+                   char suffix, bool mark_missing, const struct dictionary *dict)
 {
   const struct fmt_spec f = {FMT_F, 10, 1};
   union value v;
   struct substring s;
 
-  s.length = 10;
-  s.string = tab_alloc (table, 16);
   v.f = value;
-  data_out (&v, &f, s.string);
+  s = ss_cstr (data_out_pool (&v, dict_get_encoding (dict), &f, table->container));
+
   while (*s.string == ' ')
     {
       s.length--;
@@ -1649,7 +1651,7 @@ display_crosstabulation (struct crosstabs_proc *proc, struct pivot_table *pt,
                 default:
                   NOT_REACHED ();
                 }
-              format_cell_entry (table, c, i, v, suffix, mark_missing);
+              format_cell_entry (table, c, i, v, suffix, mark_missing, proc->dict);
             }
 
           mp++;
@@ -1700,7 +1702,7 @@ display_crosstabulation (struct crosstabs_proc *proc, struct pivot_table *pt,
               NOT_REACHED ();
             }
 
-          format_cell_entry (table, pt->n_cols, 0, v, suffix, mark_missing);
+          format_cell_entry (table, pt->n_cols, 0, v, suffix, mark_missing, proc->dict);
           tab_next_row (table);
         }
     }
@@ -1750,7 +1752,7 @@ display_crosstabulation (struct crosstabs_proc *proc, struct pivot_table *pt,
               NOT_REACHED ();
             }
 
-          format_cell_entry (table, c, i, v, suffix, mark_missing);
+          format_cell_entry (table, c, i, v, suffix, mark_missing, proc->dict);
         }
       last_row = i;
     }
@@ -2060,8 +2062,8 @@ display_directional (struct crosstabs_proc *proc, struct pivot_table *pt,
                  else
                    string = var_get_name (pt->vars[1]);
 
-                 tab_text (direct, j, 0, TAB_LEFT | TAT_PRINTF,
-                           gettext (stats_names[j][k]), string);
+                 tab_text_format (direct, j, 0, TAB_LEFT,
+                                   gettext (stats_names[j][k]), string);
                }
            }
       }
index 58144ceb908fc063b062435bf66abd314d130f43..7b30a6013908c6692a5ba0b6977b3046a534f33c 100644 (file)
@@ -905,9 +905,9 @@ display (struct dsc_proc *dsc)
 
       nc = 0;
       tab_text (t, nc++, i + 1, TAB_LEFT, var_get_name (dv->v));
-      tab_text (t, nc++, i + 1, TAT_PRINTF, "%g", dv->valid);
+      tab_text_format (t, nc++, i + 1, 0, "%g", dv->valid);
       if (dsc->format == DSC_SERIAL)
-       tab_text (t, nc++, i + 1, TAT_PRINTF, "%g", dv->missing);
+       tab_text_format (t, nc++, i + 1, 0, "%g", dv->missing);
 
       for (j = 0; j < DSC_N_STATS; j++)
        if (dsc->show_stats & (1ul << j))
index a829112ef2e45366034dc93da16b0cedb4b5372c..e8333b1ceeaa5257d922b9be4700bc6aec8ef7d1 100644 (file)
@@ -1405,10 +1405,10 @@ show_summary (const struct variable **dependent_var, int n_dep_var,
                     TAB_LEFT,
                     n, wfmt);
 
-         tab_text (tbl, heading_columns + 1,
-                   heading_rows + j + v * ll_count (&fctr->result_list),
-                   TAB_RIGHT | TAT_PRINTF,
-                   "%g%%", n * 100.0 / result->metrics[v].n);
+         tab_text_format (tbl, heading_columns + 1,
+                           heading_rows + j + v * ll_count (&fctr->result_list),
+                           TAB_RIGHT,
+                           "%g%%", n * 100.0 / result->metrics[v].n);
 
          /* Total Missing */
          tab_double (tbl, heading_columns + 2,
@@ -1417,12 +1417,12 @@ show_summary (const struct variable **dependent_var, int n_dep_var,
                     result->metrics[v].n - n,
                     wfmt);
 
-         tab_text (tbl, heading_columns + 3,
-                   heading_rows + j + v * ll_count (&fctr->result_list),
-                   TAB_RIGHT | TAT_PRINTF,
-                   "%g%%",
-                   (result->metrics[v].n - n) * 100.0 / result->metrics[v].n
-                   );
+         tab_text_format (tbl, heading_columns + 3,
+                           heading_rows + j + v * ll_count (&fctr->result_list),
+                           TAB_RIGHT,
+                           "%g%%",
+                           (result->metrics[v].n - n) * 100.0 / result->metrics[v].n
+                           );
 
          /* Total Valid + Missing */
          tab_double (tbl, heading_columns + 4,
@@ -1431,12 +1431,12 @@ show_summary (const struct variable **dependent_var, int n_dep_var,
                     result->metrics[v].n,
                     wfmt);
 
-         tab_text (tbl, heading_columns + 5,
-                   heading_rows + j + v * ll_count (&fctr->result_list),
-                   TAB_RIGHT | TAT_PRINTF,
-                   "%g%%",
-                   (result->metrics[v].n) * 100.0 / result->metrics[v].n
-                   );
+         tab_text_format (tbl, heading_columns + 5,
+                           heading_rows + j + v * ll_count (&fctr->result_list),
+                           TAB_RIGHT,
+                           "%g%%",
+                           ((result->metrics[v].n) * 100.0
+                            / result->metrics[v].n));
 
          ++j;
        }
@@ -1558,11 +1558,11 @@ show_descriptives (const struct variable **dependent_var,
                    TAB_LEFT,
                    _("Mean"));
 
-         tab_text (tbl, n_cols - 4,
-                   heading_rows + row_var_start + 1 + i * DESCRIPTIVE_ROWS,
-                   TAB_LEFT | TAT_PRINTF,
-                   _("%g%% Confidence Interval for Mean"),
-                   cmd.n_cinterval[0]);
+         tab_text_format (tbl, n_cols - 4,
+                           heading_rows + row_var_start + 1 + i * DESCRIPTIVE_ROWS,
+                           TAB_LEFT,
+                           _("%g%% Confidence Interval for Mean"),
+                           cmd.n_cinterval[0]);
 
          tab_text (tbl, n_cols - 3,
                    heading_rows + row_var_start + 1 + i * DESCRIPTIVE_ROWS,
@@ -1575,9 +1575,8 @@ show_descriptives (const struct variable **dependent_var,
                    _("Upper Bound"));
 
          tab_text (tbl, n_cols - 4,
-                   heading_rows + row_var_start + 3 + i * DESCRIPTIVE_ROWS,
-                   TAB_LEFT | TAT_PRINTF,
-                   _("5%% Trimmed Mean"));
+                    heading_rows + row_var_start + 3 + i * DESCRIPTIVE_ROWS,
+                    TAB_LEFT, _("5% Trimmed Mean"));
 
          tab_text (tbl, n_cols - 4,
                    heading_rows + row_var_start + 4 + i * DESCRIPTIVE_ROWS,
@@ -1848,15 +1847,15 @@ show_extremes (const struct variable **dependent_var,
 
          for ( e = 1; e <= cmd.st_n; ++e )
            {
-             tab_text (tbl, n_cols - 3,
-                       heading_rows + row_var_start + row_result_start + e - 1,
-                       TAB_RIGHT | TAT_PRINTF,
-                       _("%d"), e);
-
-             tab_text (tbl, n_cols - 3,
-                       heading_rows + row_var_start + row_result_start + cmd.st_n + e - 1,
-                       TAB_RIGHT | TAT_PRINTF,
-                       _("%d"), e);
+             tab_text_format (tbl, n_cols - 3,
+                               heading_rows + row_var_start + row_result_start + e - 1,
+                               TAB_RIGHT,
+                               "%d", e);
+
+             tab_text_format (tbl, n_cols - 3,
+                               heading_rows + row_var_start + row_result_start + cmd.st_n + e - 1,
+                               TAB_RIGHT,
+                               "%d", e);
            }
 
 
@@ -2120,11 +2119,10 @@ show_percentiles (const struct variable **dependent_var,
 
   for (i = 0 ; i < n_percentiles; ++i )
     {
-      tab_text (tbl, n_cols - n_percentiles + i, 1,
-               TAB_CENTER | TAT_TITLE | TAT_PRINTF,
-               _("%g"),
-               subc_list_double_at (&percentile_list, i)
-               );
+      tab_text_format (tbl, n_cols - n_percentiles + i, 1,
+                       TAB_CENTER | TAT_TITLE,
+                       _("%g"),
+                       subc_list_double_at (&percentile_list, i));
 
 
     }
index 8295f51aab767f29e4e1a406f428207c7e4ce0cf..83b864c9f695c4494c5b5f2204b9d4ecd0054c46 100644 (file)
@@ -207,6 +207,8 @@ struct freq_tab
     struct hsh_table *data;    /* Undifferentiated data. */
     struct freq_mutable *valid; /* Valid freqs. */
     int n_valid;               /* Number of total freqs. */
+    const struct dictionary *dict; /* The dict from whence entries in the table
+                                     come */
 
     struct freq_mutable *missing; /* Missing freqs. */
     int n_missing;             /* Number of missing freqs. */
@@ -755,6 +757,7 @@ frq_custom_variables (struct lexer *lexer, struct dataset *ds, struct cmd_freque
        }
       vf = var_attach_aux (v, xmalloc (sizeof *vf), var_dtor_free);
       vf->tab.valid = vf->tab.missing = NULL;
+      vf->tab.dict = dataset_dict (ds);
       vf->n_groups = 0;
       vf->groups = NULL;
       vf->width = var_get_width (v);
@@ -1091,7 +1094,7 @@ dump_full (const struct variable *v, const struct variable *wv)
            tab_text (t, 0, r, TAB_LEFT, label);
        }
 
-      tab_value (t, 0 + lab, r, TAB_NONE, &f->value, &vf->print);
+      tab_value (t, 0 + lab, r, TAB_NONE, &f->value, ft->dict, &vf->print);
       tab_double (t, 1 + lab, r, TAB_NONE, f->count, wfmt);
       tab_double (t, 2 + lab, r, TAB_NONE, percent, NULL);
       tab_double (t, 3 + lab, r, TAB_NONE, valid_percent, NULL);
@@ -1109,7 +1112,7 @@ dump_full (const struct variable *v, const struct variable *wv)
            tab_text (t, 0, r, TAB_LEFT, label);
        }
 
-      tab_value (t, 0 + lab, r, TAB_NONE, &f->value, &vf->print);
+      tab_value (t, 0 + lab, r, TAB_NONE, &f->value, ft->dict, &vf->print);
       tab_double (t, 1 + lab, r, TAB_NONE, f->count, wfmt);
       tab_double (t, 2 + lab, r, TAB_NONE,
                     f->count / ft->total_cases * 100.0, NULL);
@@ -1185,7 +1188,7 @@ dump_condensed (const struct variable *v, const struct variable *wv)
       percent = f->count / ft->total_cases * 100.0;
       cum_total += f->count / ft->valid_cases * 100.0;
 
-      tab_value (t, 0, r, TAB_NONE, &f->value, &vf->print);
+      tab_value (t, 0, r, TAB_NONE, &f->value, ft->dict, &vf->print);
       tab_double (t, 1, r, TAB_NONE, f->count, wfmt);
       tab_double (t, 2, r, TAB_NONE, percent, NULL);
       tab_double (t, 3, r, TAB_NONE, cum_total, NULL);
@@ -1193,7 +1196,7 @@ dump_condensed (const struct variable *v, const struct variable *wv)
     }
   for (; f < &ft->valid[n_categories]; f++)
     {
-      tab_value (t, 0, r, TAB_NONE, &f->value, &vf->print);
+      tab_value (t, 0, r, TAB_NONE, &f->value, ft->dict, &vf->print);
       tab_double (t, 1, r, TAB_NONE, f->count, wfmt);
       tab_double (t, 2, r, TAB_NONE,
                 f->count / ft->total_cases * 100.0, NULL);
index 2c1c19e8d8d77a19b8c1827143207053b90ca069..0f6b20a1db04cdf9503e4a21cd67cb2f22ecf6bf 100644 (file)
@@ -394,8 +394,9 @@ show_descriptives (const struct dictionary *dict)
 
   tab_vline (t, TAL_0, 7, 0, 0);
   tab_hline (t, TAL_1, 6, 7, 1);
-  tab_joint_text (t, 6, 0, 7, 0, TAB_CENTER | TAT_TITLE | TAT_PRINTF,
-                 _("%g%% Confidence Interval for Mean"), confidence*100.0);
+  tab_joint_text_format (t, 6, 0, 7, 0, TAB_CENTER | TAT_TITLE,
+                         _("%g%% Confidence Interval for Mean"),
+                         confidence*100.0);
 
   tab_text (t, 6, 1, TAB_CENTER | TAT_TITLE, _("Lower Bound"));
   tab_text (t, 7, 1, TAB_CENTER | TAT_TITLE, _("Upper Bound"));
@@ -636,14 +637,13 @@ show_contrast_coeffs (short *bad_contrast)
 
       for (i = 0; i < cmd.sbc_contrast; ++i )
        {
-         tab_text (t, 1, i + 2, TAB_CENTER | TAT_PRINTF, "%d", i + 1);
+         tab_text_format (t, 1, i + 2, TAB_CENTER, "%d", i + 1);
 
          if ( bad_contrast[i] )
            tab_text (t, count + 2, i + 2, TAB_RIGHT, "?" );
          else
-           tab_text (t, count + 2, i + 2, TAB_RIGHT | TAT_PRINTF, "%g",
-                     subc_list_double_at (&cmd.dl_contrast[i], count)
-                     );
+           tab_text_format (t, count + 2, i + 2, TAB_RIGHT, "%g",
+                             subc_list_double_at (&cmd.dl_contrast[i], count));
        }
     }
 
@@ -740,12 +740,13 @@ show_contrast_tests (short *bad_contrast)
                        _("Does not assume equal"));
            }
 
-         tab_text (t,  2, (v * lines_per_variable) + i + 1,
-                   TAB_CENTER | TAT_TITLE | TAT_PRINTF, "%d", i + 1);
+         tab_text_format (t,  2, (v * lines_per_variable) + i + 1,
+                           TAB_CENTER | TAT_TITLE, "%d", i + 1);
 
 
-         tab_text (t,  2, (v * lines_per_variable) + i + 1 + cmd.sbc_contrast,
-                   TAB_CENTER | TAT_TITLE | TAT_PRINTF, "%d", i + 1);
+         tab_text_format (t,  2,
+                           (v * lines_per_variable) + i + 1 + cmd.sbc_contrast,
+                           TAB_CENTER | TAT_TITLE, "%d", i + 1);
 
 
          if ( bad_contrast[i])
index 8ae4076d60ba06d5364ed58cbea4955737fe1df0..c225370e459269cc572430f87e533f7a591662c4 100644 (file)
@@ -714,48 +714,44 @@ cmd_rank (struct lexer *lexer, struct dataset *ds)
 
                  if ( rank_specs[i].rfunc == NORMAL ||
                       rank_specs[i].rfunc == PROPORTION )
-                   tab_output_text (TAT_PRINTF,
-                                    _("%s into %s(%s of %s using %s BY %s)"),
-                                    var_get_name (src_vars[v]),
-                                    var_get_name (rank_specs[i].destvars[v]),
-                                    function_name[rank_specs[i].rfunc],
-                                    var_get_name (src_vars[v]),
-                                    fraction_name(),
-                                    ds_cstr (&varlist)
-                                    );
+                   tab_output_text_format (0,
+                                            _("%s into %s(%s of %s using %s BY %s)"),
+                                            var_get_name (src_vars[v]),
+                                            var_get_name (rank_specs[i].destvars[v]),
+                                            function_name[rank_specs[i].rfunc],
+                                            var_get_name (src_vars[v]),
+                                            fraction_name(),
+                                            ds_cstr (&varlist));
 
                  else
-                   tab_output_text (TAT_PRINTF,
-                                    _("%s into %s(%s of %s BY %s)"),
-                                    var_get_name (src_vars[v]),
-                                    var_get_name (rank_specs[i].destvars[v]),
-                                    function_name[rank_specs[i].rfunc],
-                                    var_get_name (src_vars[v]),
-                                    ds_cstr (&varlist)
-                                    );
+                   tab_output_text_format (0,
+                                            _("%s into %s(%s of %s BY %s)"),
+                                            var_get_name (src_vars[v]),
+                                            var_get_name (rank_specs[i].destvars[v]),
+                                            function_name[rank_specs[i].rfunc],
+                                            var_get_name (src_vars[v]),
+                                            ds_cstr (&varlist));
                  ds_destroy (&varlist);
                }
              else
                {
                  if ( rank_specs[i].rfunc == NORMAL ||
                       rank_specs[i].rfunc == PROPORTION )
-                   tab_output_text (TAT_PRINTF,
-                                    _("%s into %s(%s of %s using %s)"),
-                                    var_get_name (src_vars[v]),
-                                    var_get_name (rank_specs[i].destvars[v]),
-                                    function_name[rank_specs[i].rfunc],
-                                    var_get_name (src_vars[v]),
-                                    fraction_name()
-                                    );
+                   tab_output_text_format (0,
+                                            _("%s into %s(%s of %s using %s)"),
+                                            var_get_name (src_vars[v]),
+                                            var_get_name (rank_specs[i].destvars[v]),
+                                            function_name[rank_specs[i].rfunc],
+                                            var_get_name (src_vars[v]),
+                                            fraction_name());
 
                  else
-                   tab_output_text (TAT_PRINTF,
-                                    _("%s into %s(%s of %s)"),
-                                    var_get_name (src_vars[v]),
-                                    var_get_name (rank_specs[i].destvars[v]),
-                                    function_name[rank_specs[i].rfunc],
-                                    var_get_name (src_vars[v])
-                                    );
+                   tab_output_text_format (0,
+                                            _("%s into %s(%s of %s)"),
+                                            var_get_name (src_vars[v]),
+                                            var_get_name (rank_specs[i].destvars[v]),
+                                            function_name[rank_specs[i].rfunc],
+                                            var_get_name (src_vars[v]));
                }
            }
        }
index 05c08dfad145eeb6c0c9d0f38a74f2b357525741..2c259d0f904c1834c7d7e1614fe4f47084bab5ee 100644 (file)
@@ -315,9 +315,9 @@ reg_stats_anova (pspp_linreg_cache * c)
 
 
   /* Degrees of freedom */
-  tab_text (t, 3, 1, TAB_RIGHT | TAT_PRINTF, "%g", c->dfm);
-  tab_text (t, 3, 2, TAB_RIGHT | TAT_PRINTF, "%g", c->dfe);
-  tab_text (t, 3, 3, TAB_RIGHT | TAT_PRINTF, "%g", c->dft);
+  tab_text_format (t, 3, 1, TAB_RIGHT, "%g", c->dfm);
+  tab_text_format (t, 3, 2, TAB_RIGHT, "%g", c->dfe);
+  tab_text_format (t, 3, 3, TAB_RIGHT, "%g", c->dft);
 
   /* Mean Squares */
   tab_double (t, 4, 1, TAB_RIGHT, msm, NULL);
@@ -947,7 +947,7 @@ run_regression (struct casereader *input, struct cmd_regression *cmd,
              lopts.get_indep_mean_std[i] = 1;
            }
          models[k] = pspp_linreg_cache_alloc (dep_var, (const struct variable **) indep_vars,
-                                              X->m->size1, X->m->size2);
+                                              X->m->size1, n_indep);
          models[k]->depvar = dep_var;
          /*
             For large data sets, use QR decomposition.
index 166a4dfae129fd2b59f3bb31b494be5a47d31882..681669d18999fdac3c5516c9815b9079aae99dfb 100644 (file)
@@ -386,7 +386,7 @@ run_reliability (struct casereader *input, struct dataset *ds,
     tab_dim (tab, tab_natural_dimensions, NULL);
     tab_flags (tab, SOMF_NO_TITLE );
 
-    tab_text(tab, 0, 0, TAT_PRINTF, "Scale: %s", ds_cstr (&rel->scale_name));
+    tab_text_format (tab, 0, 0, 0, "Scale: %s", ds_cstr (&rel->scale_name));
 
     tab_submit(tab);
   }
@@ -720,8 +720,7 @@ case_processing_summary (casenumber n_valid, casenumber n_missing,
   tab_text (tbl, heading_columns, 0, TAB_CENTER | TAT_TITLE,
                _("N"));
 
-  tab_text (tbl, heading_columns + 1, 0, TAB_CENTER | TAT_TITLE | TAT_PRINTF,
-               _("%%"));
+  tab_text (tbl, heading_columns + 1, 0, TAB_CENTER | TAT_TITLE, _("%"));
 
   total = n_missing + n_valid;
 
index c0a6f47715acf6d6b69aba0a820f37905572f376..09a96cfc194930b3cc063c77056622c91455237b 100644 (file)
@@ -577,10 +577,10 @@ ssbox_independent_samples_populate (struct ssbox *ssb,
 
       tab_text (ssb->t, 0, i * 2 + 1, TAB_LEFT,
                 var_get_name (proc->vars[i]));
-      tab_text (ssb->t, 1, i * 2 + 1, TAB_LEFT | TAT_PRINTF,
-                "%s%s", prefix[0], val_lab[0]);
-      tab_text (ssb->t, 1, i * 2 + 1+ 1, TAB_LEFT | TAT_PRINTF,
-                "%s%s", prefix[1], val_lab[1]);
+      tab_text_format (ssb->t, 1, i * 2 + 1, TAB_LEFT,
+                       "%s%s", prefix[0], val_lab[0]);
+      tab_text_format (ssb->t, 1, i * 2 + 1+ 1, TAB_LEFT,
+                       "%s%s", prefix[1], val_lab[1]);
 
       /* Fill in the group statistics */
       for (count = 0; count < 2; count++)
@@ -639,7 +639,7 @@ ssbox_paired_populate (struct ssbox *ssb, struct t_test_proc *proc)
       struct pair *p = &proc->pairs[i];
       int j;
 
-      tab_text (ssb->t, 0, i * 2 + 1, TAB_LEFT | TAT_PRINTF, _("Pair %d"), i);
+      tab_text_format (ssb->t, 0, i * 2 + 1, TAB_LEFT, _("Pair %d"), i);
       for (j=0; j < 2; j++)
        {
          /* Titles */
@@ -757,9 +757,9 @@ trbox_independent_samples_init (struct trbox *self,
   tab_text (self->t, 9, 2, TAB_CENTER | TAT_TITLE, _("Lower"));
   tab_text (self->t, 10, 2, TAB_CENTER | TAT_TITLE, _("Upper"));
 
-  tab_joint_text (self->t, 9, 1, 10, 1, TAB_CENTER | TAT_PRINTF,
-                  _("%g%% Confidence Interval of the Difference"),
-                  proc->criteria * 100.0);
+  tab_joint_text_format (self->t, 9, 1, 10, 1, TAB_CENTER,
+                         _("%g%% Confidence Interval of the Difference"),
+                         proc->criteria * 100.0);
 }
 
 /* Populate the independent samples trbox */
@@ -911,9 +911,9 @@ trbox_paired_init (struct trbox *self, struct t_test_proc *proc)
   tab_hline (self->t, TAL_1, 5, 6, 2);
   tab_vline (self->t, TAL_GAP, 6, 0, 1);
 
-  tab_joint_text (self->t, 5, 1, 6, 1, TAB_CENTER | TAT_PRINTF,
-                  _("%g%% Confidence Interval of the Difference"),
-                  proc->criteria*100.0);
+  tab_joint_text_format (self->t, 5, 1, 6, 1, TAB_CENTER,
+                         _("%g%% Confidence Interval of the Difference"),
+                         proc->criteria*100.0);
 
   tab_text (self->t, 2, 2, TAB_CENTER | TAT_TITLE, _("Mean"));
   tab_text (self->t, 3, 2, TAB_CENTER | TAT_TITLE, _("Std. Deviation"));
@@ -942,10 +942,10 @@ trbox_paired_populate (struct trbox *trb,
       double t;
       double df = n - 1;
 
-      tab_text (trb->t, 0, i + 3, TAB_LEFT | TAT_PRINTF, _("Pair %d"), i);
-      tab_text (trb->t, 1, i + 3, TAB_LEFT | TAT_PRINTF, "%s - %s",
-               var_get_name (pair->v[0]),
-                var_get_name (pair->v[1]));
+      tab_text_format (trb->t, 0, i + 3, TAB_LEFT, _("Pair %d"), i);
+      tab_text_format (trb->t, 1, i + 3, TAB_LEFT, "%s - %s",
+                       var_get_name (pair->v[0]),
+                       var_get_name (pair->v[1]));
       tab_double (trb->t, 2, i + 3, TAB_RIGHT, pair->mean_diff, NULL);
       tab_double (trb->t, 3, i + 3, TAB_RIGHT, pair->std_dev_diff, NULL);
 
@@ -995,15 +995,15 @@ trbox_one_sample_init (struct trbox *self, struct t_test_proc *proc)
   tab_hline (self->t, TAL_1, 1, hsize - 1, 1);
   tab_vline (self->t, TAL_2, 1, 0, vsize - 1);
 
-  tab_joint_text (self->t, 1, 0, hsize - 1, 0, TAB_CENTER | TAT_PRINTF,
-                  _("Test Value = %f"), proc->testval);
+  tab_joint_text_format (self->t, 1, 0, hsize - 1, 0, TAB_CENTER,
+                         _("Test Value = %f"), proc->testval);
 
   tab_box (self->t, -1, -1, -1, TAL_1, 1, 1, hsize - 1, vsize - 1);
 
 
-  tab_joint_text (self->t, 5, 1, 6, 1, TAB_CENTER  | TAT_PRINTF,
-                  _("%g%% Confidence Interval of the Difference"),
-                  proc->criteria * 100.0);
+  tab_joint_text_format (self->t, 5, 1, 6, 1, TAB_CENTER,
+                         _("%g%% Confidence Interval of the Difference"),
+                         proc->criteria * 100.0);
 
   tab_vline (self->t, TAL_GAP, 6, 1, 1);
   tab_hline (self->t, TAL_1, 5, 6, 2);
@@ -1115,12 +1115,12 @@ pscbox (struct t_test_proc *proc)
                               sqrt (1 - pow2 (pair->correlation)));
 
       /* row headings */
-      tab_text (table, 0, i + 1, TAB_LEFT | TAT_TITLE | TAT_PRINTF,
-                _("Pair %d"), i);
-      tab_text (table, 1, i + 1, TAB_LEFT | TAT_TITLE | TAT_PRINTF,
-                _("%s & %s"),
-                var_get_name (pair->v[0]),
-                var_get_name (pair->v[1]));
+      tab_text_format (table, 0, i + 1, TAB_LEFT | TAT_TITLE,
+                       _("Pair %d"), i);
+      tab_text_format (table, 1, i + 1, TAB_LEFT | TAT_TITLE,
+                       _("%s & %s"),
+                       var_get_name (pair->v[0]),
+                       var_get_name (pair->v[1]));
 
       /* row data */
       tab_double (table, 2, i + 1, TAB_RIGHT, pair->n, &proc->weight_format);
index 37d2b191ccfe323804733d69d0d7c7a98f9260af..310206c0e7bf88961e820c05f97831f8568da5a6 100644 (file)
@@ -88,7 +88,7 @@ wilcoxon_execute (const struct dataset *ds,
 
   struct wilcoxon_state *ws = xcalloc (sizeof (*ws), t2s->n_pairs);
   const struct variable *weight = dict_get_weight (dict);
-  struct variable *weightx = var_create_internal (WEIGHT_IDX);
+  struct variable *weightx = var_create_internal (WEIGHT_IDX, 0);
   struct caseproto *proto;
 
   input =
@@ -108,8 +108,8 @@ wilcoxon_execute (const struct dataset *ds,
       struct subcase ordering;
       variable_pair *vp = &t2s->pairs[i];
 
-      ws[i].sign = var_create_internal (0);
-      ws[i].absdiff = var_create_internal (1);
+      ws[i].sign = var_create_internal (0, 0);
+      ws[i].absdiff = var_create_internal (1, 0);
 
       r = casereader_create_filter_missing (r, *vp, 2,
                                            exclude,
@@ -324,12 +324,12 @@ show_tests_box (const struct wilcoxon_state *ws,
 
 
   tab_text (table,  0, 1,  TAB_LEFT, _("Z"));
-  tab_text (table,  0, 2,  TAB_LEFT, _("Asymp. Sig (2-tailed)"));
+  tab_text (table,  0, 2,  TAB_LEFT, _("Asymp. Sig. (2-tailed)"));
 
   if ( exact )
     {
-      tab_text (table,  0, 3,  TAB_LEFT, _("Exact Sig (2-tailed)"));
-      tab_text (table,  0, 4,  TAB_LEFT, _("Exact Sig (1-tailed)"));
+      tab_text (table,  0, 3,  TAB_LEFT, _("Exact Sig. (2-tailed)"));
+      tab_text (table,  0, 4,  TAB_LEFT, _("Exact Sig. (1-tailed)"));
 
 #if 0
       tab_text (table,  0, 5,  TAB_LEFT, _("Point Probability"));
index d264a00ef95880dc4a16155eb1305f6836f77e64..fd4e1a93839e27b453abdc9298a559f3b1b8ce6d 100644 (file)
@@ -515,189 +515,183 @@ stc_custom_disk (struct lexer *lexer, struct dataset *ds, struct cmd_set *cmd UN
   return stc_custom_listing (lexer, ds, cmd, aux);
 }
 \f
-static void
+static char *
 show_blanks (const struct dataset *ds UNUSED)
 {
-  if (settings_get_blanks () == SYSMIS)
-    msg (SN, _("BLANKS is SYSMIS."));
-  else
-    msg (SN, _("BLANKS is %g."), settings_get_blanks ());
-
+  return (settings_get_blanks () == SYSMIS
+          ? xstrdup ("SYSMIS")
+          : xasprintf ("%g", settings_get_blanks ()));
 }
 
-static char *
-format_cc (struct substring in, char grouping, char *out)
+static void
+format_cc (struct string *out, struct substring in, char grouping)
 {
   while (!ss_is_empty (in))
     {
       char c = ss_get_char (&in);
       if (c == grouping || c == '\'')
-        *out++ = '\'';
+        ds_put_char (out, '\'');
       else if (c == '"')
-        *out++ = '"';
-      *out++ = c;
+        ds_put_char (out, '"');
+      ds_put_char (out, c);
     }
-  return out;
 }
 
-static void
+static char *
 show_cc (enum fmt_type type)
 {
   const struct fmt_number_style *cc = settings_get_style (type);
-  char cc_string[FMT_STYLE_AFFIX_MAX * 4 * 2 + 3 + 1];
-  char *out;
+  struct string out;
 
-  out = format_cc (cc->neg_prefix, cc->grouping, cc_string);
-  *out++ = cc->grouping;
-  out = format_cc (cc->prefix, cc->grouping, out);
-  *out++ = cc->grouping;
-  out = format_cc (cc->suffix, cc->grouping, out);
-  *out++ = cc->grouping;
-  out = format_cc (cc->neg_suffix, cc->grouping, out);
-  *out = '\0';
+  ds_init_empty (&out);
+  format_cc (&out, cc->neg_prefix, cc->grouping);
+  ds_put_char (&out, cc->grouping);
+  format_cc (&out, cc->prefix, cc->grouping);
+  ds_put_char (&out, cc->grouping);
+  format_cc (&out, cc->suffix, cc->grouping);
+  ds_put_char (&out, cc->grouping);
+  format_cc (&out, cc->neg_suffix, cc->grouping);
 
-  msg (SN, _("%s is \"%s\"."), fmt_name (type), cc_string);
+  return ds_cstr (&out);
 }
 
-static void
+static char *
 show_cca (const struct dataset *ds UNUSED)
 {
-  show_cc (FMT_CCA);
+  return show_cc (FMT_CCA);
 }
 
-static void
+static char *
 show_ccb (const struct dataset *ds UNUSED)
 {
-  show_cc (FMT_CCB);
+  return show_cc (FMT_CCB);
 }
 
-static void
+static char *
 show_ccc (const struct dataset *ds UNUSED)
 {
-  show_cc (FMT_CCC);
+  return show_cc (FMT_CCC);
 }
 
-static void
+static char *
 show_ccd (const struct dataset *ds UNUSED)
 {
-  show_cc (FMT_CCD);
+  return show_cc (FMT_CCD);
 }
 
-static void
+static char *
 show_cce (const struct dataset *ds UNUSED)
 {
-  show_cc (FMT_CCE);
+  return show_cc (FMT_CCE);
 }
 
-static void
+static char *
 show_decimals (const struct dataset *ds UNUSED)
 {
-  msg (SN, _("DECIMAL is \"%c\"."), settings_get_decimal_char (FMT_F));
+  return xasprintf ("\"%c\"", settings_get_decimal_char (FMT_F));
 }
 
-static void
+static char *
 show_endcmd (const struct dataset *ds UNUSED)
 {
-  msg (SN, _("ENDCMD is \"%c\"."), settings_get_endcmd ());
+  return xasprintf ("\"%c\"", settings_get_endcmd ());
 }
 
-static void
+static char *
 show_errors (const struct dataset *ds UNUSED)
 {
   bool terminal = settings_get_error_routing_to_terminal ();
   bool listing = settings_get_error_routing_to_listing ();
-  msg (SN, _("ERRORS is \"%s\"."),
-       terminal && listing ? "BOTH"
-       : terminal ? "TERMINAL"
-       : listing ? "LISTING"
-       : "NONE");
+  return xstrdup (terminal && listing ? "BOTH"
+                  : terminal ? "TERMINAL"
+                  : listing ? "LISTING"
+                  : "NONE");
 }
 
-static void
+static char *
 show_format (const struct dataset *ds UNUSED)
 {
   char str[FMT_STRING_LEN_MAX + 1];
-  msg (SN, _("FORMAT is %s."), fmt_to_string (settings_get_format (), str));
+  return xstrdup (fmt_to_string (settings_get_format (), str));
 }
 
-static void
+static char *
 show_length (const struct dataset *ds UNUSED)
 {
-  msg (SN, _("LENGTH is %d."), settings_get_viewlength ());
+  return xasprintf ("%d", settings_get_viewlength ());
 }
 
-static void
+static char *
 show_locale (const struct dataset *ds UNUSED)
 {
-  msg (SN, _("LOCALE is %s"), get_default_encoding ());
+  return xstrdup (get_default_encoding ());
 }
 
-static void
+static char *
 show_mxerrs (const struct dataset *ds UNUSED)
 {
-  msg (SN, _("MXERRS is %d."), settings_get_mxerrs ());
+  return xasprintf ("%d", settings_get_mxerrs ());
 }
 
-static void
+static char *
 show_mxloops (const struct dataset *ds UNUSED)
 {
-  msg (SN, _("MXLOOPS is %d."), settings_get_mxloops ());
+  return xasprintf ("%d", settings_get_mxloops ());
 }
 
-static void
+static char *
 show_mxwarns (const struct dataset *ds UNUSED)
 {
-  msg (SN, _("MXWARNS is %d."), settings_get_mxwarns ());
+  return xasprintf ("%d", settings_get_mxwarns ());
 }
 
-/* Outputs that SETTING has the given INTEGER_FORMAT value. */
-static void
-show_integer_format (const char *setting, enum integer_format integer_format)
+/* Returns a name for the given INTEGER_FORMAT value. */
+static char *
+show_integer_format (enum integer_format integer_format)
 {
-  msg (SN, _("%s is %s (%s)."),
-       setting,
-       (integer_format == INTEGER_MSB_FIRST ? "MSBFIRST"
-        : integer_format == INTEGER_LSB_FIRST ? "LSBFIRST"
-        : "VAX"),
-       integer_format == INTEGER_NATIVE ? "NATIVE" : "nonnative");
+  return xasprintf ("%s (%s)",
+                    (integer_format == INTEGER_MSB_FIRST ? "MSBFIRST"
+                     : integer_format == INTEGER_LSB_FIRST ? "LSBFIRST"
+                     : "VAX"),
+                    integer_format == INTEGER_NATIVE ? "NATIVE" : "nonnative");
 }
 
-/* Outputs that SETTING has the given FLOAT_FORMAT value. */
-static void
-show_float_format (const char *setting, enum float_format float_format)
+/* Returns a name for the given FLOAT_FORMAT value. */
+static char *
+show_float_format (enum float_format float_format)
 {
   const char *format_name = "";
 
   switch (float_format)
     {
     case FLOAT_IEEE_SINGLE_LE:
-      format_name = "ISL (32-bit IEEE 754 single, little-endian)";
+      format_name = _("ISL (32-bit IEEE 754 single, little-endian)");
       break;
     case FLOAT_IEEE_SINGLE_BE:
-      format_name = "ISB (32-bit IEEE 754 single, big-endian)";
+      format_name = _("ISB (32-bit IEEE 754 single, big-endian)");
       break;
     case FLOAT_IEEE_DOUBLE_LE:
-      format_name = "IDL (64-bit IEEE 754 double, little-endian)";
+      format_name = _("IDL (64-bit IEEE 754 double, little-endian)");
       break;
     case FLOAT_IEEE_DOUBLE_BE:
-      format_name = "IDB (64-bit IEEE 754 double, big-endian)";
+      format_name = _("IDB (64-bit IEEE 754 double, big-endian)");
       break;
 
     case FLOAT_VAX_F:
-      format_name = "VF (32-bit VAX F, VAX-endian)";
+      format_name = _("VF (32-bit VAX F, VAX-endian)");
       break;
     case FLOAT_VAX_D:
-      format_name = "VD (64-bit VAX D, VAX-endian)";
+      format_name = _("VD (64-bit VAX D, VAX-endian)");
       break;
     case FLOAT_VAX_G:
-      format_name = "VG (64-bit VAX G, VAX-endian)";
+      format_name = _("VG (64-bit VAX G, VAX-endian)");
       break;
 
     case FLOAT_Z_SHORT:
-      format_name = "ZS (32-bit IBM Z hexadecimal short, big-endian)";
+      format_name = _("ZS (32-bit IBM Z hexadecimal short, big-endian)");
       break;
     case FLOAT_Z_LONG:
-      format_name = "ZL (64-bit IBM Z hexadecimal long, big-endian)";
+      format_name = _("ZL (64-bit IBM Z hexadecimal long, big-endian)");
       break;
 
     case FLOAT_FP:
@@ -705,73 +699,64 @@ show_float_format (const char *setting, enum float_format float_format)
       NOT_REACHED ();
     }
 
-  msg (SN, _("%s is %s (%s)."),
-       setting, format_name,
-       float_format == FLOAT_NATIVE_DOUBLE ? "NATIVE" : "nonnative");
+  return xasprintf ("%s (%s)", format_name,
+                    (float_format == FLOAT_NATIVE_DOUBLE
+                     ? "NATIVE" : "nonnative"));
 }
 
-static void
+static char *
 show_rib (const struct dataset *ds UNUSED)
 {
-  show_integer_format ("RIB", settings_get_input_integer_format ());
+  return show_integer_format (settings_get_input_integer_format ());
 }
 
-static void
+static char *
 show_rrb (const struct dataset *ds UNUSED)
 {
-  show_float_format ("RRB", settings_get_input_float_format ());
+  return show_float_format (settings_get_input_float_format ());
 }
 
-static void
+static char *
 show_scompression (const struct dataset *ds UNUSED)
 {
-  if (settings_get_scompression ())
-    msg (SN, _("SCOMPRESSION is ON."));
-  else
-    msg (SN, _("SCOMPRESSION is OFF."));
+  return xstrdup (settings_get_scompression () ? "ON" : "OFF");
 }
 
-static void
+static char *
 show_undefined (const struct dataset *ds UNUSED)
 {
-  if (settings_get_undefined ())
-    msg (SN, _("UNDEFINED is WARN."));
-  else
-    msg (SN, _("UNDEFINED is NOWARN."));
+  return xstrdup (settings_get_undefined () ? "WARN" : "NOWARN");
 }
 
-static void
+static char *
 show_weight (const struct dataset *ds)
 {
   const struct variable *var = dict_get_weight (dataset_dict (ds));
-  if (var == NULL)
-    msg (SN, _("WEIGHT is off."));
-  else
-    msg (SN, _("WEIGHT is variable %s."), var_get_name (var));
+  return xstrdup (var != NULL ? var_get_name (var) : "OFF");
 }
 
-static void
+static char *
 show_wib (const struct dataset *ds UNUSED)
 {
-  show_integer_format ("WIB", settings_get_output_integer_format ());
+  return show_integer_format (settings_get_output_integer_format ());
 }
 
-static void
+static char *
 show_wrb (const struct dataset *ds UNUSED)
 {
-  show_float_format ("WRB", settings_get_output_float_format ());
+  return show_float_format (settings_get_output_float_format ());
 }
 
-static void
+static char *
 show_width (const struct dataset *ds UNUSED)
 {
-  msg (SN, _("WIDTH is %d."), settings_get_viewwidth ());
+  return xasprintf ("%d", settings_get_viewwidth ());
 }
 
 struct show_sbc
   {
     const char *name;
-    void (*function) (const struct dataset *);
+    char *(*function) (const struct dataset *);
   };
 
 const struct show_sbc show_table[] =
@@ -801,22 +786,34 @@ const struct show_sbc show_table[] =
     {"WIDTH", show_width},
   };
 
+static void
+do_show (const struct dataset *ds, const struct show_sbc *sbc)
+{
+  char *value = sbc->function (ds);
+  msg (SN, _("%s is %s."), sbc->name, value);
+  free (value);
+}
+
 static void
 show_all (const struct dataset *ds)
 {
   size_t i;
 
   for (i = 0; i < sizeof show_table / sizeof *show_table; i++)
-    show_table[i].function (ds);
+    do_show (ds, &show_table[i]);
 }
 
 static void
-show_all_cc (void)
+show_all_cc (const struct dataset *ds)
 {
   int i;
 
-  for (i = 0; i < 5; i++)
-    show_cc (i);
+  for (i = 0; i < sizeof show_table / sizeof *show_table; i++)
+    {
+      const struct show_sbc *sbc = &show_table[i];
+      if (!strncmp (sbc->name, "CC", 2))
+        do_show (ds, sbc);
+    }
 }
 
 static void
@@ -845,7 +842,7 @@ cmd_show (struct lexer *lexer, struct dataset *ds)
       if (lex_match (lexer, T_ALL))
         show_all (ds);
       else if (lex_match_id (lexer, "CC"))
-        show_all_cc ();
+        show_all_cc (ds);
       else if (lex_match_id (lexer, "WARRANTY"))
         show_warranty (ds);
       else if (lex_match_id (lexer, "COPYING"))
@@ -855,10 +852,13 @@ cmd_show (struct lexer *lexer, struct dataset *ds)
           int i;
 
           for (i = 0; i < sizeof show_table / sizeof *show_table; i++)
-            if (lex_match_id (lexer, show_table[i].name))
-              {
-                show_table[i].function (ds);
-                goto found;
+            {
+              const struct show_sbc *sbc = &show_table[i];
+              if (lex_match_id (lexer, sbc->name))
+                {
+                  do_show (ds, sbc);
+                  goto found;
+                }
               }
           lex_error (lexer, NULL);
           return CMD_FAILURE;
index 60c8f408291b4076bc8f25ab630c47e4bf90b92d..62b03ba073b9a5f6f6a1c5b282d9c26b0ce286b9 100644 (file)
@@ -83,6 +83,8 @@ struct recode_trns
   {
     struct pool *pool;
 
+
+
     /* Variable types, for convenience. */
     enum val_type src_type;     /* src_vars[*] type. */
     enum val_type dst_type;     /* dst_vars[*] type. */
@@ -90,6 +92,7 @@ struct recode_trns
     /* Variables. */
     const struct variable **src_vars;  /* Source variables. */
     const struct variable **dst_vars;  /* Destination variables. */
+    const struct dictionary *dst_dict;  /* Dictionary of dst_vars */
     char **dst_names;          /* Name of dest variables, if they're new. */
     size_t var_cnt;             /* Number of variables. */
 
@@ -540,6 +543,8 @@ create_dst_vars (struct recode_trns *trns, struct dictionary *dict)
 {
   size_t i;
 
+  trns->dst_dict = dict;
+
   for (i = 0; i < trns->var_cnt; i++)
     {
       const struct variable **var = &trns->dst_vars[i];
@@ -598,7 +603,7 @@ find_src_numeric (struct recode_trns *trns, double value, const struct variable
 /* Returns the output mapping in TRNS for an input of VALUE with
    the given WIDTH, or a null pointer if there is no mapping. */
 static const struct map_out *
-find_src_string (struct recode_trns *trns, const char *value,
+find_src_string (struct recode_trns *trns, const uint8_t *value,
                  const struct variable *src_var)
 {
   struct mapping *m;
@@ -625,7 +630,7 @@ find_src_string (struct recode_trns *trns, const char *value,
 
             msg_disable ();
             match = data_in (ss_buffer (value, width), LEGACY_NATIVE,
-                             FMT_F, 0, 0, 0, &uv, 0);
+                             FMT_F, 0, 0, 0, trns->dst_dict,  &uv, 0);
             msg_enable ();
             out->value.f = uv.f;
             break;
index 7fd7580e89d0d12fff978dbb35c6b95981758a00..e08ba2804bbf4d6b0dbe7c6cf81b820c7a239462 100644 (file)
@@ -28,6 +28,7 @@
 #include "assertion.h"
 #include "hmapx.h"
 #include "hash-functions.h"
+#include "pool.h"
 
 #include "i18n.h"
 
@@ -57,6 +58,7 @@ create_iconv (const char* tocode, const char* fromcode)
   size_t hash;
   struct hmapx_node *node;
   struct converter *converter;
+  assert (fromcode);
 
   hash = hash_string (tocode, hash_string (fromcode, 0));
   HMAPX_FOR_EACH_WITH_HASH (converter, node, hash, &map)
@@ -84,13 +86,22 @@ create_iconv (const char* tocode, const char* fromcode)
   return converter->conv;
 }
 
-/* Return a string based on TEXT converted according to HOW.
+char *
+recode_string (const char *to, const char *from,
+              const char *text, int length)
+{
+  return recode_string_pool (to, from, text, length, NULL);
+}
+
+
+/* Return a string based on TEXT which must be encoded using FROM.
+   The returned string will be encoded in TO.
    If length is not -1, then it must be the number of bytes in TEXT.
    The returned string must be freed when no longer required.
 */
 char *
-recode_string (const char *to, const char *from,
-              const char *text, int length)
+recode_string_pool (const char *to, const char *from,
+              const char *text, int length, struct pool *pool)
 {
   char *outbuf = 0;
   size_t outbufferlength;
@@ -109,7 +120,6 @@ recode_string (const char *to, const char *from,
   if ( length == -1 )
      length = strlen(text);
 
-
   if (to == NULL)
     to = default_encoding;
 
@@ -120,7 +130,7 @@ recode_string (const char *to, const char *from,
     if ( outbufferlength > length)
       break;
 
-  outbuf = xmalloc(outbufferlength);
+  outbuf = pool_malloc (pool, outbufferlength);
   op = outbuf;
 
   outbytes = outbufferlength;
@@ -157,7 +167,7 @@ recode_string (const char *to, const char *from,
          case E2BIG:
            free (outbuf);
            outbufferlength <<= 1;
-           outbuf = xmalloc (outbufferlength);
+           outbuf = pool_malloc (pool, outbufferlength);
            op = outbuf;
            outbytes = outbufferlength;
            inbytes = length;
@@ -175,7 +185,7 @@ recode_string (const char *to, const char *from,
   if (outbytes == 0 )
     {
       char *const oldaddr = outbuf;
-      outbuf = xrealloc (outbuf, outbufferlength + 1);
+      outbuf = pool_realloc (pool, outbuf, outbufferlength + 1);
 
       op += (outbuf - oldaddr) ;
     }
index 2c30a70012e18fd2c556c158f9355edb3a0a5d31..9c8f7c14014bdfca443b4d8d01012b1eb40539e9 100644 (file)
@@ -24,7 +24,12 @@ void  i18n_init (void);
 
 #define UTF8 "UTF-8"
 
-char * recode_string (const char *to, const char *from,
+struct pool;
+
+char *recode_string_pool (const char *to, const char *from,
+                         const char *text, int length, struct pool *pool);
+
+char *recode_string (const char *to, const char *from,
                      const char *text, int len);
 
 
index 45f0195f37f3fc18b035401fcd1313a85f76b259..18a621970c85da745917dcf2b179c9945862e13e 100644 (file)
 #include <config.h>
 
 #include <libpspp/legacy-encoding.h>
-
-#include "str.h"
-
-static const char ascii_to_ebcdic[256];
-static const char ebcdic_to_ascii[256];
-
-void
-legacy_recode (enum legacy_encoding from, const char *src,
-             enum legacy_encoding to, char *dst,
-             size_t size)
-{
-  if (from != to)
-    {
-      const char *table;
-      size_t i;
-
-      table = from == LEGACY_ASCII ? ascii_to_ebcdic : ebcdic_to_ascii;
-      for (i = 0; i < size; i++)
-        dst[i] = table[(unsigned char) src[i]];
-    }
-  else
-    {
-      if (src != dst)
-        memcpy (dst, src, size);
-    }
-}
+#include <libpspp/i18n.h>
+#include <stdlib.h>
 
 char
-legacy_to_native (enum legacy_encoding from, char c)
+legacy_to_native (const char *from, char c)
 {
-  legacy_recode (from, &c, LEGACY_NATIVE, &c, 1);
-  return c;
+  char x;
+  char *s = recode_string (LEGACY_NATIVE, from, &c, 1);
+  x = s[0];
+  free (s);
+  return x;
 }
 
 char
-legacy_from_native (enum legacy_encoding to, char c)
+legacy_from_native (const char *to, char c)
 {
-  legacy_recode (LEGACY_NATIVE, &c, to, &c, 1);
-  return c;
+  char x;
+  char *s = recode_string (to, LEGACY_NATIVE, &c, 1);
+  x = s[0];
+  free (s);
+  return x;
 }
-
-static const char ascii_to_ebcdic[256] =
-  {
-    0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f,
-    0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-    0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26,
-    0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
-    0x40, 0x5a, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d,
-    0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
-    0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
-    0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
-    0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
-    0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
-    0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6,
-    0xe7, 0xe8, 0xe9, 0xad, 0xe0, 0xbd, 0x9a, 0x6d,
-    0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-    0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
-    0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6,
-    0xa7, 0xa8, 0xa9, 0xc0, 0x4f, 0xd0, 0x5f, 0x07,
-    0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17,
-    0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
-    0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08,
-    0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
-    0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
-    0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
-    0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-    0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
-    0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d,
-    0x8e, 0x8f, 0x90, 0x6a, 0x9b, 0x9c, 0x9d, 0x9e,
-    0x9f, 0xa0, 0xaa, 0xab, 0xac, 0x4a, 0xae, 0xaf,
-    0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
-    0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xa1, 0xbe, 0xbf,
-    0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
-    0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed,
-    0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
-  };
-
-static const char ebcdic_to_ascii[256] =
-  {
-    0x00, 0x01, 0x02, 0x03, 0x9c, 0x09, 0x86, 0x7f,
-    0x97, 0x8d, 0x8e, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-    0x10, 0x11, 0x12, 0x13, 0x9d, 0x85, 0x08, 0x87,
-    0x18, 0x19, 0x92, 0x8f, 0x1c, 0x1d, 0x1e, 0x1f,
-    0x80, 0x81, 0x82, 0x83, 0x84, 0x0a, 0x17, 0x1b,
-    0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x05, 0x06, 0x07,
-    0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04,
-    0x98, 0x99, 0x9a, 0x9b, 0x14, 0x15, 0x9e, 0x1a,
-    0x20, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6,
-    0xa7, 0xa8, 0xd5, 0x2e, 0x3c, 0x28, 0x2b, 0x7c,
-    0x26, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
-    0xb0, 0xb1, 0x21, 0x24, 0x2a, 0x29, 0x3b, 0x7e,
-    0x2d, 0x2f, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
-    0xb8, 0xb9, 0xcb, 0x2c, 0x25, 0x5f, 0x3e, 0x3f,
-    0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1,
-    0xc2, 0x60, 0x3a, 0x23, 0x40, 0x27, 0x3d, 0x22,
-    0xc3, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-    0x68, 0x69, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9,
-    0xca, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70,
-    0x71, 0x72, 0x5e, 0xcc, 0xcd, 0xce, 0xcf, 0xd0,
-    0xd1, 0xe5, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
-    0x79, 0x7a, 0xd2, 0xd3, 0xd4, 0x5b, 0xd6, 0xd7,
-    0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
-    0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0x5d, 0xe6, 0xe7,
-    0x7b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
-    0x48, 0x49, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed,
-    0x7d, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
-    0x51, 0x52, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3,
-    0x5c, 0x9f, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
-    0x59, 0x5a, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,
-    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
-    0x38, 0x39, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
-  };
-
index 12afe42b7f22d97a190659fad70579f7ee4e9043..c6ae0ab4aa2bb25faf9f074436aa3bd9637bb137 100644 (file)
 #ifndef LIBPSPP_LEGACY_ENCODING
 #define LIBPSPP_LEGACY_ENCODING 1
 
-#include <stddef.h>
 #include <libpspp/compiler.h>
 
-/* A legacy character encoding.
-   This exists only to handle the specific legacy EBCDIC-to-ASCII
-   recoding that MODE=360 file handles perform. */
-enum legacy_encoding
-  {
-    LEGACY_ASCII,         /* ASCII or similar character set. */
-    LEGACY_EBCDIC,        /* IBM EBCDIC character set. */
-
-    /* Native character set. */
 #if 'A' == 0x41
-    LEGACY_NATIVE = LEGACY_ASCII
+#define  LEGACY_NATIVE "ASCII"
 #elif 'A' == 0xc1
-    LEGACY_NATIVE = LEGACY_EBCDIC
+#define  LEGACY_NATIVE "EBCDIC-US"
 #else
 #error Cannot detect native character set.
 #endif
-  };
 
-void legacy_recode (enum legacy_encoding, const char *src,
-                    enum legacy_encoding, char *dst, size_t);
-char legacy_to_native (enum legacy_encoding from, char) PURE_FUNCTION;
-char legacy_from_native (enum legacy_encoding to, char) PURE_FUNCTION;
+char legacy_to_native (const char *from, char) PURE_FUNCTION;
+char legacy_from_native (const char *to, char) PURE_FUNCTION;
+
 
 #endif /* libpspp/legacy-encoding.h */
index b6f69d944637fd1406a698d435720e56d3f8bd52..893fe390e567949be26ac488b4933714a3c69a2e 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <libpspp/sparse-xarray.h>
 
+#include <limits.h>
 #include <stdint.h>
 #include <stdlib.h>
 #include <string.h>
index ccd7739c647b87d989b9cbc867810d915839770c..afe32de9f2049bfcc5a80ac7a95b36b348be4cb7 100644 (file)
@@ -1441,3 +1441,25 @@ ds_relocate (struct string *st)
       free ((char *) rel);
     }
 }
+
+
+\f
+
+/* Operations on uint8_t "strings" */
+
+/* Copies buffer SRC, of SRC_SIZE bytes, to DST, of DST_SIZE bytes.
+   DST is truncated to DST_SIZE bytes or padded on the right with
+   copies of PAD as needed. */
+void
+u8_buf_copy_rpad (uint8_t *dst, size_t dst_size,
+                 const uint8_t *src, size_t src_size,
+                 char pad)
+{
+  if (src_size >= dst_size)
+    memmove (dst, src, dst_size);
+  else
+    {
+      memmove (dst, src, src_size);
+      memset (&dst[src_size], pad, dst_size - src_size);
+    }
+}
index b9be394c59c46a95f1f593e970ac83e4cdb8d7b8..a134079f90dd52f7c359d7ad4fba3049c5c85203 100644 (file)
@@ -20,6 +20,7 @@
 #include <assert.h>
 #include <stdarg.h>
 #include <stdbool.h>
+#include <stdint.h>
 #include <stdio.h>
 #include <string.h>
 
@@ -223,4 +224,10 @@ char *ds_put_uninit (struct string *st, size_t incr);
 /* calls relocate from gnulib on ST */
 void ds_relocate (struct string *st);
 
+
+void u8_buf_copy_rpad (uint8_t *dst, size_t dst_size,
+                      const uint8_t *src, size_t src_size,
+                      char pad);
+
+
 #endif /* str_h */
index 2a00a56d95d5c7a20a1a540bc714f539b7a9d58a..89660ba9c1e3f5fbc1f4168af2ef8af549a43c7d 100644 (file)
@@ -61,7 +61,9 @@ struct covariance_matrix
   struct moments1 **m1;
   struct moments **m;
   const struct variable **v_variables;
+  const struct interaction_variable **interactions;
   size_t n_variables;
+  size_t n_intr;
   int n_pass;
   int missing_handling;
   enum mv_class missing_value;
@@ -119,6 +121,7 @@ covariance_matrix_init (size_t n_variables,
   result->ca = covariance_hsh_create (&result->n_variables);
   result->m = NULL;
   result->m1 = NULL;
+  result->n_intr = 0;
   result->missing_handling = missing_handling;
   result->missing_value = missing_value;
   result->accumulate = (result->missing_handling == LISTWISE) ?
@@ -147,6 +150,14 @@ covariance_matrix_init (size_t n_variables,
 
   return result;
 }
+void
+covariance_interaction_set (struct covariance_matrix *cov, 
+                           const struct interaction_variable **intr, size_t n_intr)
+{
+  cov->interactions = intr;
+  cov->n_intr = n_intr;
+}
+
 static size_t 
 get_n_rows (size_t n_variables, const struct variable *v_variables[])
 {
@@ -177,6 +188,44 @@ covariance_matrix_create (size_t n_variables,
   return design_matrix_create (n_variables, v_variables, n_rows);
 }
 
+static size_t 
+get_n_rows_s (const struct variable *var)
+{
+  size_t result = 0;
+  if (var_is_numeric (var))
+    {
+      result++;
+    }
+  else
+    {
+      result += cat_get_n_categories (var) - 1;
+    }
+  return result;
+}
+static struct design_matrix *
+covariance_matrix_create_s (struct covariance_matrix *cov)
+{
+  struct variable **v_variables;
+  size_t n_variables;
+  size_t n_rows = 0;
+  size_t i;
+  size_t j;
+
+  n_variables = cov->n_variables + cov->n_intr;
+  v_variables = xnmalloc (n_variables, sizeof (*v_variables));
+  for (i = 0; i < cov->n_variables; i++)
+    {
+      v_variables[i] = cov->v_variables[i];
+      n_rows += get_n_rows_s (v_variables[i]);
+    }
+  for (j = 0; j < cov->n_intr; j++)
+    {
+      v_variables[i + j] = interaction_get_variable (cov->interactions[j]);
+      n_rows += get_n_rows_s (v_variables[i]);
+    }
+  return design_matrix_create (n_variables, v_variables, n_rows);
+}
+
 static void
 update_moments1 (struct covariance_matrix *cov, size_t i, double x)
 {
@@ -550,12 +599,12 @@ get_covariance_variables (const struct covariance_matrix *cov)
 }
 
 static void
-update_hash_entry (struct hsh_table *c,
-                  const struct variable *v1,
-                  const struct variable *v2,
-                  const union value *val1, const union value *val2, 
-                  const struct interaction_value *i_val1,
-                  const struct interaction_value *i_val2)
+update_hash_entry_intr (struct hsh_table *c,
+                       const struct variable *v1,
+                       const struct variable *v2,
+                       const union value *val1, const union value *val2, 
+                       const struct interaction_value *i_val1,
+                       const struct interaction_value *i_val2)
 {
   struct covariance_accumulator *ca;
   struct covariance_accumulator *new_entry;
@@ -588,6 +637,56 @@ update_hash_entry (struct hsh_table *c,
     }
 }
 
+static void
+update_hash_entry (struct hsh_table *c,
+                  const struct variable *v1,
+                  const struct variable *v2,
+                  const union value *val1, const union value *val2)
+{
+  struct covariance_accumulator *ca;
+  struct covariance_accumulator *new_entry;
+
+  ca = get_new_covariance_accumulator (v1, v2, val1, val2);
+  ca->dot_product = update_product (ca->v1, ca->v2, ca->val1, ca->val2);
+  ca->sum1 = update_sum (ca->v1, ca->val1, 1.0);
+  ca->sum2 = update_sum (ca->v2, ca->val2, 1.0);
+  ca->ssize = 1.0;
+  new_entry = hsh_insert (c, ca);
+
+  if (new_entry != NULL)
+    {
+      new_entry->dot_product += ca->dot_product;
+      new_entry->ssize += 1.0;
+      new_entry->sum1 += ca->sum1;
+      new_entry->sum2 += ca->sum2;
+      /*
+       If DOT_PRODUCT is null, CA was not already in the hash
+       hable, so we don't free it because it was just inserted.
+       If DOT_PRODUCT was not null, CA is already in the hash table.
+       Unnecessary now, it must be freed here.
+      */
+      free (ca);
+    }
+}
+
+static void
+inner_intr_loop (struct covariance_matrix *cov, const struct ccase  *ccase, const struct variable *var1,
+                const union value *val1, const struct interaction_variable **i_var, 
+                const struct interaction_value *i_val1, size_t j)
+{
+  struct variable *var2;
+  union value *val2;
+  struct interaction_value *i_val2;
+
+  var2 = interaction_get_variable (i_var[j]);
+  i_val2 = interaction_case_data (ccase, i_var[j]);
+  val2 = interaction_value_get (i_val2);
+  
+  if (!var_is_value_missing (var2, val2, cov->missing_value))
+    {
+      update_hash_entry_intr (cov->ca, var1, var2, val1, val2, i_val1, i_val2);
+    }
+}       
 /*
   Compute the covariance matrix in a single data-pass. Cases with
   missing values are dropped pairwise, in other words, only if one of
@@ -608,6 +707,8 @@ covariance_accumulate_pairwise (struct covariance_matrix *cov,
   const union value *val1;
   const union value *val2;
   const struct variable **v_variables;
+  const struct variable *var1;
+  const struct variable *var2;
   struct interaction_value *i_val1 = NULL;
   struct interaction_value *i_val2 = NULL;
 
@@ -619,39 +720,42 @@ covariance_accumulate_pairwise (struct covariance_matrix *cov,
 
   for (i = 0; i < cov->n_variables; ++i)
     {
-      if (is_interaction (v_variables[i], i_var, n_intr))
-       {
-         i_val1 = interaction_case_data (ccase, v_variables[i], i_var, n_intr);
-         val1 = interaction_value_get (i_val1);
-       }
-      else
-       {
-         val1 = case_data (ccase, v_variables[i]);
-       }
-      if (!var_is_value_missing (v_variables[i], val1, cov->missing_value))
+      var1 = v_variables[i];
+      val1 = case_data (ccase, var1);
+      if (!var_is_value_missing (var1, val1, cov->missing_value))
        {
-         cat_value_update (v_variables[i], val1);
-         if (var_is_numeric (v_variables[i]))
+         cat_value_update (var1, val1);
+         if (var_is_numeric (var1))
            cov->update_moments (cov, i, val1->f);
 
          for (j = i; j < cov->n_variables; j++)
            {
-             if (is_interaction (v_variables[j], i_var, n_intr))
-               {
-                 i_val2 = interaction_case_data (ccase, v_variables[j], i_var, n_intr);
-                 val2 = interaction_value_get (i_val2);
-               }
-             else
-               {
-                 val2 = case_data (ccase, v_variables[j]);
-               }
+             var2 = v_variables[j];
+             val2 = case_data (ccase, var2);
              if (!var_is_value_missing
-                 (v_variables[j], val2, cov->missing_value))
+                 (var2, val2, cov->missing_value))
                {
-                 update_hash_entry (cov->ca, v_variables[i], v_variables[j],
-                                    val1, val2, i_val1, i_val2);
+                 update_hash_entry (cov->ca, var1, var2, val1, val2);
                }
            }
+         for (j = 0; j < cov->n_intr; j++)
+           {
+             inner_intr_loop (cov, ccase, var1, val1, i_var, i_val1, j);
+           }
+       }
+    }
+  for (i = 0; i < cov->n_intr; i++)
+    {
+      var1 = interaction_get_variable (i_var[i]);
+      i_val1 = interaction_case_data (ccase, i_var[i]);
+      val1 = interaction_value_get (i_val1);
+      cat_value_update (var1, val1);
+      if (!var_is_value_missing (var1, val1, cov->missing_value))
+       {
+         for (j = i; j < cov->n_intr; j++)
+           {
+             inner_intr_loop (cov, ccase, var1, val1, i_var, i_val1, j);
+           }
        }
     }
 }
@@ -693,32 +797,15 @@ covariance_accumulate_listwise (struct covariance_matrix *cov,
 
   for (i = 0; i < cov->n_variables; ++i)
     {
-      if (is_interaction (v_variables[i], i_var, n_intr))
-       {
-         i_val1 = interaction_case_data (ccase, v_variables[i], i_var, n_intr);
-         val1 = interaction_value_get (i_val1);
-       }
-      else
-       {
-         val1 = case_data (ccase, v_variables[i]);
-       }
+      val1 = case_data (ccase, v_variables[i]);
       cat_value_update (v_variables[i], val1);
       if (var_is_numeric (v_variables[i]))
        cov->update_moments (cov, i, val1->f);
 
       for (j = i; j < cov->n_variables; j++)
        {
-         if (is_interaction (v_variables[j], i_var, n_intr))
-           {
-             i_val2 = interaction_case_data (ccase, v_variables[j], i_var, n_intr);
-             val2 = interaction_value_get (i_val2);
-           }
-         else
-           {
-             val2 = case_data (ccase, v_variables[j]);
-           }
          update_hash_entry (cov->ca, v_variables[i], v_variables[j],
-                            val1, val2, i_val1, i_val2);
+                            val1, val2);
        }
     }
 }
@@ -829,15 +916,18 @@ get_sum (const struct covariance_matrix *cov, size_t i)
       else
        {
          k = 0;
-         while (var_get_dict_index (cov->v_variables[k]) != var_get_dict_index (var))
+         while (cov->v_variables[k] != var && k  < cov->n_variables)
            {
              k++;
            }
-         moments1_calculate (cov->m1[k], &n, &mean, NULL, NULL, NULL);
-         return mean * n;
+         if (k < cov->n_variables)
+           {
+             moments1_calculate (cov->m1[k], &n, &mean, NULL, NULL, NULL);
+             return mean * n;
+           }
        }
     }
-
+      
   return 0.0;
 }
 static void
@@ -868,8 +958,8 @@ covariance_accumulator_to_matrix (struct covariance_matrix *cov)
   struct covariance_accumulator *entry;
   struct hsh_iterator iter;
 
-  cov->cov = covariance_matrix_create (cov->n_variables, cov->v_variables);
-  cov->ssize = covariance_matrix_create (cov->n_variables, cov->v_variables);
+  cov->cov = covariance_matrix_create_s (cov);
+  cov->ssize = covariance_matrix_create_s (cov);
   entry = hsh_first (cov->ca, &iter);
   while (entry != NULL)
     {
index 24ce791cf5f74da3bb27ae48b11c4a9591a9f2b8..c16e5cbc4dfde7d3056b05a32363769e43175251 100644 (file)
@@ -40,10 +40,9 @@ enum
 { LISTWISE,
   PAIRWISE
 };
-struct design_matrix *covariance_matrix_create (size_t,
-                                               const struct variable *[]);
+struct design_matrix *covariance_matrix_create (size_t, const struct variable *[]);
 
-void covariance_matrix_destroy (struct covariance_matrix *cov);
+void covariance_matrix_destroy (struct covariance_matrix *);
 void covariance_pass_two (struct design_matrix *, double,
                          double, double, const struct variable *,
                          const struct variable *, const union value *,
@@ -57,4 +56,6 @@ void covariance_matrix_accumulate (struct covariance_matrix *,
                                   const struct ccase *, void **, size_t);
 struct design_matrix *covariance_to_design (const struct covariance_matrix *);
 double covariance_matrix_get_element (const struct covariance_matrix *, size_t, size_t);
+void covariance_interaction_set (struct covariance_matrix *, 
+                                const struct interaction_variable **, size_t);
 #endif
index c8795ed58a00495e72995a2561b9f7ba60fd179f..7ed36f6627ed469ce1c6775efd504a191c23f338 100644 (file)
@@ -38,6 +38,7 @@
 #include <math/interaction.h>
 #include <string.h>
 #include <xalloc.h>
+#include <unistr.h>
 
 struct interaction_variable
 {
@@ -67,6 +68,7 @@ interaction_variable_create (const struct variable **vars, int n_vars)
 {
   struct interaction_variable *result = NULL;
   size_t i;
+  int width = 0;
 
   if (n_vars > 0)
     {
@@ -80,10 +82,11 @@ interaction_variable_create (const struct variable **vars, int n_vars)
          if (var_is_alpha (vars[i]))
            {
              result->n_alpha++;
+             width = 1;
            }
        }
     }
-  result->intr = var_create_internal (0);
+  result->intr = var_create_internal (0, width);
 
   return result;
 }
@@ -98,7 +101,7 @@ void interaction_variable_destroy (struct interaction_variable *iv)
   Get one of the member variables.
  */
 const struct variable *
-interaction_variable_get_member (const struct interaction_variable *iv, size_t i)
+interaction_get_member (const struct interaction_variable *iv, size_t i)
 {
   return iv->members[i];
 }
@@ -122,10 +125,10 @@ interaction_get_n_numeric (const struct interaction_variable *iv)
 }
 
 /*
-  Get the interaction varibale itself.
+  Get the interaction variable itself.
  */
 const struct variable *
-interaction_variable_get_var (const struct interaction_variable *iv)
+interaction_get_variable (const struct interaction_variable *iv)
 {
   return iv->intr;
 }
@@ -146,20 +149,19 @@ interaction_value_create (const struct interaction_variable *var, const union va
   
   if (var != NULL)
     {
-      int val_width;
-      char *val;
+      uint8_t *val;
+      int val_width = 1;
 
       result = xmalloc (sizeof (*result));
       result->intr = var;
       n_vars = interaction_get_n_vars (var);
-      val_width = n_vars * MAX_SHORT_STRING + 1;
       value_init (&result->val, val_width);
       val = value_str_rw (&result->val, val_width);
       val[0] = '\0';
       result->f = 1.0;
       for (i = 0; i < n_vars; i++)
        {
-         member = interaction_variable_get_member (var, i);
+         member = interaction_get_member (var, i);
 
          if (var_is_value_missing (member, vals[i], MV_ANY))
            {
@@ -172,7 +174,9 @@ interaction_value_create (const struct interaction_variable *var, const union va
              if (var_is_alpha (var->members[i]))
                {
                   int w = var_get_width (var->members[i]);
-                 strncat (val, value_str (vals[i], w), MAX_SHORT_STRING);
+                 value_resize (result, val_width, val_width + w);
+                 u8_strncat (val, value_str (vals[i], w), w);
+                 val = value_str_rw (&result->val, val_width);
                }
              else if (var_is_numeric (var->members[i]))
                {
@@ -239,32 +243,22 @@ interaction_value_destroy (struct interaction_value *val)
   Return a value from a variable that is an interaction. 
  */
 struct interaction_value *
-interaction_case_data (const struct ccase *ccase, const struct variable *var, 
-                      const struct interaction_variable **intr_vars, size_t n_intr)
+interaction_case_data (const struct ccase *ccase, const struct interaction_variable *iv)
 {
   size_t i;
   size_t n_vars;
-  const struct interaction_variable *iv = NULL;
-  const struct variable *intr;
   const struct variable *member;
   const union value **vals = NULL;
 
-  for (i = 0; i < n_intr; i++)
-    {
-      iv = intr_vars[i];
-      intr = interaction_variable_get_var (iv);
-      if (var_get_dict_index (intr) == var_get_dict_index (var))
-       {
-         break;
-       }
-    }
   n_vars = interaction_get_n_vars (iv);
   vals = xnmalloc (n_vars, sizeof (*vals));
+
   for (i = 0; i < n_vars; i++)
-    {
-      member = interaction_variable_get_member (iv, i);
-      vals[i] = case_data (ccase, member);
-    }
+       {
+         member = interaction_get_member (iv, i);
+         vals[i] = case_data (ccase, member);
+       }
+
   return interaction_value_create (iv, vals);
 }
 
@@ -276,7 +270,7 @@ is_interaction (const struct variable *var, const struct interaction_variable **
   
   for (i = 0; i < n_intr; i++)
     {
-      intr = interaction_variable_get_var (iv[i]);
+      intr = interaction_get_variable (iv[i]);
       if (var_get_dict_index (intr) == var_get_dict_index (var))
        {
          return true;
index 66025b6628f428d012ff879268f00367e3a26a1f..995d0684517d78a8207e040121126b1ae63f473c 100644 (file)
@@ -28,14 +28,13 @@ void interaction_value_destroy (struct interaction_value *);
 size_t interaction_variable_get_n_vars (const struct interaction_variable *);
 double interaction_value_get_nonzero_entry (const struct interaction_value *);
 const union value *interaction_value_get (const struct interaction_value *);
-const struct variable * interaction_variable_get_var (const struct interaction_variable *);
+const struct variable * interaction_get_variable (const struct interaction_variable *);
 size_t interaction_get_n_numeric (const struct interaction_variable *);
 size_t interaction_get_n_alpha (const struct interaction_variable *);
 size_t interaction_get_n_vars (const struct interaction_variable *);
-const struct variable * interaction_variable_get_member (const struct interaction_variable *, size_t);
+const struct variable * interaction_get_member (const struct interaction_variable *, size_t);
 bool is_interaction (const struct variable *, const struct interaction_variable **, size_t);
 struct interaction_value *
-interaction_case_data (const struct ccase *, const struct variable *, 
-                      const struct interaction_variable **, size_t);
+interaction_case_data (const struct ccase *, const struct interaction_variable *);
 double interaction_value_get_nonzero_entry (const struct interaction_value *);
 #endif
index 8028697c6b7f3410b12927a0fe7ae1d82c5a6b4b..c03af4672955f4dd20514291faf8cf06bebb49e5 100644 (file)
@@ -383,8 +383,8 @@ pspp_linreg (const gsl_vector * Y, const struct design_matrix *dm,
              gsl_matrix_set (design, j, i, tmp);
            }
        }
-      sw = gsl_matrix_calloc (cache->n_indeps + 1, cache->n_indeps + 1);
-      xtx = gsl_matrix_submatrix (sw, 0, 0, cache->n_indeps, cache->n_indeps);
+      sw = gsl_matrix_calloc (cache->n_coeffs + 1, cache->n_coeffs + 1);
+      xtx = gsl_matrix_submatrix (sw, 0, 0, cache->n_coeffs, cache->n_coeffs);
 
       for (i = 0; i < xtx.matrix.size1; i++)
        {
@@ -399,8 +399,8 @@ pspp_linreg (const gsl_vector * Y, const struct design_matrix *dm,
            }
        }
 
-      gsl_matrix_set (sw, cache->n_indeps, cache->n_indeps, cache->sst);
-      xty = gsl_matrix_column (sw, cache->n_indeps);
+      gsl_matrix_set (sw, cache->n_coeffs, cache->n_coeffs, cache->sst);
+      xty = gsl_matrix_column (sw, cache->n_coeffs);
       /*
          This loop starts at 1, with i=0 outside the loop, so we can get
          the model sum of squares due to the first independent variable.
@@ -410,7 +410,7 @@ pspp_linreg (const gsl_vector * Y, const struct design_matrix *dm,
       gsl_vector_set (&(xty.vector), 0, tmp);
       tmp *= tmp / gsl_vector_get (cache->ssx, 0);
       gsl_vector_set (cache->ss_indeps, 0, tmp);
-      for (i = 1; i < cache->n_indeps; i++)
+      for (i = 1; i < cache->n_coeffs; i++)
        {
          xi = gsl_matrix_column (design, i);
          gsl_blas_ddot (&(xi.vector), Y, &tmp);
@@ -641,7 +641,7 @@ double pspp_linreg_get_indep_variable_mean (pspp_linreg_cache *c, const struct v
       coef = pspp_linreg_get_coeff (c, v, NULL);
       return pspp_coeff_get_mean (coef);
     }
-  return GSL_NAN;
+  return 0.0;
 }
 
 void pspp_linreg_set_indep_variable_mean (pspp_linreg_cache *c, const struct variable *v, 
index 9e925a44df12300bb35446ae700bef29ace5083c..72edf17f08b7f6e9e0dec91ad8b56f5b9e87b88b 100644 (file)
@@ -29,6 +29,7 @@
 #include <data/data-out.h>
 #include <data/format.h>
 #include <data/value.h>
+#include <data/dictionary.h>
 #include <libpspp/assertion.h>
 #include <libpspp/compiler.h>
 #include <libpspp/misc.h>
@@ -372,18 +373,6 @@ tab_box (struct tab_table *t, int f_h, int f_v, int i_h, int i_v,
     }
 }
 
-/* Formats text TEXT and arguments ARGS as indicated in OPT in
-   TABLE's pool and returns the resultant string. */
-static struct substring
-text_format (struct tab_table *table, int opt, const char *text, va_list args)
-{
-  assert (table != NULL && text != NULL);
-
-  return ss_cstr (opt & TAT_PRINTF
-                  ? pool_vasprintf (table->container, text, args)
-                  : pool_strdup (table->container, text));
-}
-
 /* Set the title of table T to TITLE, which is formatted as if
    passed to printf(). */
 void
@@ -518,7 +507,8 @@ tab_natural_dimensions (struct tab_table *t, struct outp_driver *d,
    from V, displayed with format spec F. */
 void
 tab_value (struct tab_table *table, int c, int r, unsigned char opt,
-          const union value *v, const struct fmt_spec *f)
+          const union value *v, const struct dictionary *dict, 
+          const struct fmt_spec *f)
 {
   char *contents;
 
@@ -537,11 +527,10 @@ tab_value (struct tab_table *table, int c, int r, unsigned char opt,
     }
 #endif
 
-  contents = pool_alloc (table->container, f->w);
-  table->cc[c + r * table->cf] = ss_buffer (contents, f->w);
-  table->ct[c + r * table->cf] = opt;
+  contents = data_out_pool (v, dict_get_encoding (dict), f, table->container);
 
-  data_out (v, f, contents);
+  table->cc[c + r * table->cf] = ss_cstr (contents);
+  table->ct[c + r * table->cf] = opt;
 }
 
 /* Sets cell (C,R) in TABLE, with options OPT, to have value VAL
@@ -550,8 +539,7 @@ void
 tab_fixed (struct tab_table *table, int c, int r, unsigned char opt,
           double val, int w, int d)
 {
-  char *contents;
-  char buf[40], *cp;
+  char *s, *cp;
 
   struct fmt_spec f;
   union value double_value;
@@ -580,17 +568,15 @@ tab_fixed (struct tab_table *table, int c, int r, unsigned char opt,
 #endif
 
   double_value.f = val;
-  data_out (&double_value, &f, buf);
+  s = data_out_pool (&double_value, LEGACY_NATIVE, &f, table->container);
 
-  cp = buf;
-  while (isspace ((unsigned char) *cp) && cp < &buf[w])
+  cp = s;
+  while (isspace ((unsigned char) *cp) && cp < &s[w])
     cp++;
-  f.w = w - (cp - buf);
+  f.w = w - (cp - s);
 
-  contents = pool_alloc (table->container, f.w);
-  table->cc[c + r * table->cf] = ss_buffer (contents, f.w);
+  table->cc[c + r * table->cf] = ss_buffer (cp, f.w);
   table->ct[c + r * table->cf] = opt;
-  memcpy (contents, cp, f.w);
 }
 
 /* Sets cell (C,R) in TABLE, with options OPT, to have value VAL as
@@ -601,11 +587,8 @@ void
 tab_double (struct tab_table *table, int c, int r, unsigned char opt,
           double val, const struct fmt_spec *fmt)
 {
-  int w;
-  char *contents;
-  char buf[40], *cp;
-
-  union value double_value;
+  struct substring ss;
+  union value double_value ;
 
   assert (table != NULL);
 
@@ -634,35 +617,23 @@ tab_double (struct tab_table *table, int c, int r, unsigned char opt,
 #endif
 
   double_value.f = val;
-  data_out (&double_value, fmt, buf);
+  ss = ss_cstr (data_out_pool (&double_value, LEGACY_NATIVE, fmt, table->container));
 
-  cp = buf;
-  while (isspace ((unsigned char) *cp) && cp < &buf[fmt->w])
-    cp++;
-  w = fmt->w - (cp - buf);
+  ss_ltrim (&ss, ss_cstr (" "));
 
-  contents = pool_alloc (table->container, w);
-  table->cc[c + r * table->cf] = ss_buffer (contents, w);
+  table->cc[c + r * table->cf] = ss;
   table->ct[c + r * table->cf] = opt;
-  memcpy (contents, cp, w);
 }
 
 
-/* Sets cell (C,R) in TABLE, with options OPT, to have text value
-   TEXT. */
-void
-tab_text (struct tab_table *table, int c, int r, unsigned opt, const char *text, ...)
+static void
+do_tab_text (struct tab_table *table, int c, int r, unsigned opt, char *text)
 {
-  va_list args;
-
-  assert (table != NULL && text != NULL);
-
-  assert (c >= 0 );
-  assert (r >= 0 );
+  assert (c >= 0);
+  assert (r >= 0);
   assert (c < table->nc);
   assert (r < table->nr);
 
-
 #if DEBUGGING
   if (c + table->col_ofs < 0 || r + table->row_ofs < 0
       || c + table->col_ofs >= table->nc
@@ -677,21 +648,38 @@ tab_text (struct tab_table *table, int c, int r, unsigned opt, const char *text,
     }
 #endif
 
-  va_start (args, text);
-  table->cc[c + r * table->cf] = text_format (table, opt, text, args);
+  table->cc[c + r * table->cf] = ss_cstr (text);
   table->ct[c + r * table->cf] = opt;
-  va_end (args);
 }
 
-/* Joins cells (X1,X2)-(Y1,Y2) inclusive in TABLE, and sets them with
-   options OPT to have text value TEXT. */
+/* Sets cell (C,R) in TABLE, with options OPT, to have text value
+   TEXT. */
 void
-tab_joint_text (struct tab_table *table, int x1, int y1, int x2, int y2,
-               unsigned opt, const char *text, ...)
+tab_text (struct tab_table *table, int c, int r, unsigned opt,
+          const char *text)
 {
-  struct tab_joined_cell *j;
+  do_tab_text (table, c, r, opt, pool_strdup (table->container, text));
+}
 
-  assert (table != NULL && text != NULL);
+/* Sets cell (C,R) in TABLE, with options OPT, to have text value
+   FORMAT, which is formatted as if passed to printf. */
+void
+tab_text_format (struct tab_table *table, int c, int r, unsigned opt,
+                 const char *format, ...)
+{
+  va_list args;
+
+  va_start (args, format);
+  do_tab_text (table, c, r, opt,
+               pool_vasprintf (table->container, format, args));
+  va_end (args);
+}
+
+static void
+do_tab_joint_text (struct tab_table *table, int x1, int y1, int x2, int y2,
+                   unsigned opt, char *text)
+{
+  struct tab_joined_cell *j;
 
   assert (x1 + table->col_ofs >= 0);
   assert (y1 + table->row_ofs >= 0);
@@ -725,14 +713,7 @@ tab_joint_text (struct tab_table *table, int x1, int y1, int x2, int y2,
   j->y1 = y1 + table->row_ofs;
   j->x2 = ++x2 + table->col_ofs;
   j->y2 = ++y2 + table->row_ofs;
-
-  {
-    va_list args;
-
-    va_start (args, text);
-    j->contents = text_format (table, opt, text, args);
-    va_end (args);
-  }
+  j->contents = ss_cstr (text);
 
   opt |= TAB_JOIN;
 
@@ -759,6 +740,31 @@ tab_joint_text (struct tab_table *table, int x1, int y1, int x2, int y2,
   }
 }
 
+/* Joins cells (X1,X2)-(Y1,Y2) inclusive in TABLE, and sets them with
+   options OPT to have text value TEXT. */
+void
+tab_joint_text (struct tab_table *table, int x1, int y1, int x2, int y2,
+                unsigned opt, const char *text)
+{
+  do_tab_joint_text (table, x1, y1, x2, y2, opt,
+                     pool_strdup (table->container, text));
+}
+
+/* Joins cells (X1,X2)-(Y1,Y2) inclusive in TABLE, and sets them
+   with options OPT to have text value FORMAT, which is formatted
+   as if passed to printf. */
+void
+tab_joint_text_format (struct tab_table *table, int x1, int y1, int x2, int y2,
+                       unsigned opt, const char *format, ...)
+{
+  va_list args;
+
+  va_start (args, format);
+  do_tab_joint_text (table, x1, y1, x2, y2, opt,
+                     pool_vasprintf (table->container, format, args));
+  va_end (args);
+}
+
 /* Sets cell (C,R) in TABLE, with options OPT, to contents STRING. */
 void
 tab_raw (struct tab_table *table, int c, int r, unsigned opt,
@@ -804,30 +810,41 @@ wrap_dim (struct tab_table *t, struct outp_driver *d, void *aux UNUSED)
   t->h[0] = tab_natural_height (t, d, 0);
 }
 
-/* Outputs text BUF as a table with a single cell having cell options
+static void
+do_tab_output_text (struct tab_table *t, int options, char *text)
+{
+  do_tab_text (t, 0, 0, options, text);
+  tab_flags (t, SOMF_NO_TITLE | SOMF_NO_SPACING);
+  tab_dim (t, options & TAT_NOWRAP ? nowrap_dim : wrap_dim, NULL);
+  tab_submit (t);
+}
+
+/* Outputs TEXT as a table with a single cell having cell options
    OPTIONS, which is a combination of the TAB_* and TAT_*
-   constants. */
+   constants.  */
 void
-tab_output_text (int options, const char *buf, ...)
+tab_output_text (int options, const char *text)
 {
-  struct tab_table *t = tab_create (1, 1, 0);
-  char *tmp_buf = NULL;
-
-  if (options & TAT_PRINTF)
-    {
-      va_list args;
+  struct tab_table *table = tab_create (1, 1, 0);
+  do_tab_output_text (table, options, pool_strdup (table->container, text));
+}
 
-      va_start (args, buf);
-      buf = tmp_buf = xvasprintf (buf, args);
-      va_end (args);
-    }
+/* Outputs FORMAT as a table with a single cell having cell
+   options OPTIONS, which is a combination of the TAB_* and TAT_*
+   constants.  FORMAT is formatted as if it was passed through
+   printf. */
+void
+tab_output_text_format (int options, const char *format, ...)
+{
+  struct tab_table *table;
+  va_list args;
 
-  tab_text (t, 0, 0, options & ~TAT_PRINTF, buf);
-  tab_flags (t, SOMF_NO_TITLE | SOMF_NO_SPACING);
-  tab_dim (t, options & TAT_NOWRAP ? nowrap_dim : wrap_dim, NULL);
-  tab_submit (t);
+  table = tab_create (1, 1, 0);
 
-  free (tmp_buf);
+  va_start (args, format);
+  do_tab_output_text (table, options,
+                      pool_vasprintf (table->container, format, args));
+  va_end (args);
 }
 
 /* Set table flags to FLAGS. */
index 2777c59db6c8f4043ecce47a9a8755b2df0a7ff7..1748c24c855e71ec8c0212dac76d00662db76f67 100644 (file)
@@ -147,16 +147,17 @@ void tab_box (struct tab_table *, int f_h, int f_v, int i_h, int i_v,
 enum
   {
     TAT_NONE = 0,              /* No options. */
-    TAT_PRINTF = 0x0100,       /* Format the text string with sprintf. */
     TAT_TITLE = 0x0200 | TAB_EMPH, /* Title attributes. */
     TAT_NOWRAP = 0x0800         /* No text wrap (tab_output_text() only). */
   };
 
 /* Cells. */
 struct fmt_spec;
+struct dictionary;
 union value;
 void tab_value (struct tab_table *, int c, int r, unsigned char opt,
-               const union value *, const struct fmt_spec *);
+               const union value *, const struct dictionary *dict,
+               const struct fmt_spec *);
 
 void tab_fixed (struct tab_table *, int c, int r, unsigned char opt,
                double v, int w, int d);
@@ -164,11 +165,15 @@ void tab_fixed (struct tab_table *, int c, int r, unsigned char opt,
 void tab_double (struct tab_table *, int c, int r, unsigned char opt,
                double v, const struct fmt_spec *);
 
-void tab_text (struct tab_table *, int c, int r, unsigned opt,
-              const char *, ...)
+void tab_text (struct tab_table *, int c, int r, unsigned opt, const char *);
+void tab_text_format (struct tab_table *, int c, int r, unsigned opt,
+                      const char *, ...)
      PRINTF_FORMAT (5, 6);
+
 void tab_joint_text (struct tab_table *, int x1, int y1, int x2, int y2,
-                    unsigned opt, const char *, ...)
+                    unsigned opt, const char *);
+void tab_joint_text_format (struct tab_table *, int x1, int y1, int x2, int y2,
+                            unsigned opt, const char *, ...)
      PRINTF_FORMAT (7, 8);
 
 /* Cell low-level access. */
@@ -185,7 +190,8 @@ void tab_next_row (struct tab_table *);
 #define tab_col(TABLE) ((TABLE)->col_ofs)
 
 /* Simple output. */
-void tab_output_text (int options, const char *string, ...)
+void tab_output_text (int options, const char *string);
+void tab_output_text_format (int options, const char *, ...)
      PRINTF_FORMAT (2, 3);
 
 /* Embedding the command name in the output. */
index c217833cbea5bf140f99c36cc2aa75106a8401b5..d9bc2803321e0ad2efe5411dd728b840047b5b34 100644 (file)
 #include "about.h"
 #include "helper.h"
 
+#include <gettext.h>
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
 
 static const gchar *artists[] = { "Patrick Brunier", "Dondi Bogusky", NULL};
 
 void
 about_new (GtkMenuItem *m, GtkWindow *parent)
 {
-  GtkBuilder *xml = builder_new ("psppire.ui");
-
-  GtkWidget *about =  get_widget_assert (xml, "aboutdialog1");
+  GtkWidget *about =  gtk_about_dialog_new ();
 
   GdkPixbuf *pb =
     gdk_pixbuf_new_from_file_at_size (relocate (PKGDATADIR "/pspplogo.png"),
@@ -58,6 +60,17 @@ about_new (GtkMenuItem *m, GtkWindow *parent)
   gtk_about_dialog_set_license (GTK_ABOUT_DIALOG (about),
                                copyleft);
 
+  gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG (about),
+                                _("A program for the analysis of sampled data"));
+
+  gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG (about),
+                                 "Free Software Foundation");
+
+
+  /* TRANSLATORS: Use this string to list the people who have helped with
+     translation to your language. */
+  gtk_about_dialog_set_translator_credits (GTK_ABOUT_DIALOG (about),
+                                          _("translator-credits"));
 
   gtk_window_set_transient_for (GTK_WINDOW (about), parent);
 
index 183aa31b4da8a3e04e961a2da7e2e5fa82de034d..e779fba6d7f7c847144d1d6254ad57354bb705e2 100644 (file)
@@ -604,7 +604,6 @@ insert_source_row_into_text_view (GtkTreeIter iter,
   gint *idx;
   struct variable *var;
   GtkTreeIter dict_iter;
-  gchar *name;
   GtkTextBuffer *buffer;
 
   g_return_if_fail (GTK_IS_TEXT_VIEW (dest));
@@ -632,15 +631,10 @@ insert_source_row_into_text_view (GtkTreeIter iter,
 
   gtk_tree_path_free (path);
 
-  name = recode_string (UTF8, psppire_dict_encoding (dict),
-                       var_get_name (var),
-                       -1);
-
   buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (dest));
 
   erase_selection (buffer);
 
-  gtk_text_buffer_insert_at_cursor (buffer, name, -1);
+  gtk_text_buffer_insert_at_cursor (buffer, var_get_name (var), -1);
 
-  g_free (name);
 }
index 8d03bed16186e5664207b9fc2b8e989c63f10eae..5d52204ce566ad89cdb1807adda7be338bf846e5 100644 (file)
@@ -114,15 +114,9 @@ cell_var_name (GtkTreeViewColumn *tree_column,
               gpointer data)
 {
   PsppireDict *dict = data;
-  struct variable *var;
-  gchar *name;
-
-  var = get_selected_variable (tree_model, iter, dict);
+  const struct variable *var = get_selected_variable (tree_model, iter, dict);
 
-  name = recode_string (UTF8, psppire_dict_encoding (dict),
-                       var_get_name (var), -1);
-  g_object_set (cell, "text", name, NULL);
-  g_free (name);
+  g_object_set (cell, "text", var_get_name (var), NULL);
 }
 
 
index d6b1bcd58c3b60bc5bb17705da7c18c4121d4105..1665d7ff3f7a3c0a4bc8e1b4ebeb12b99cc8cfb9 100644 (file)
@@ -67,7 +67,6 @@ insert_source_row_into_entry (GtkTreeIter iter,
   gint *idx;
   struct variable *var;
   GtkTreeIter dict_iter;
-  gchar *name;
 
   g_return_if_fail (GTK_IS_ENTRY(dest));
 
@@ -81,10 +80,7 @@ insert_source_row_into_entry (GtkTreeIter iter,
 
   gtk_tree_path_free (path);
 
-  name = recode_string (UTF8, psppire_dict_encoding (PSPPIRE_DICT (dict)),
-                       var_get_name (var), -1);
-  gtk_entry_set_text (GTK_ENTRY (dest),  name);
-  g_free (name);
+  gtk_entry_set_text (GTK_ENTRY (dest),  var_get_name (var));
 }
 
 
@@ -123,14 +119,13 @@ is_currently_in_entry (GtkTreeModel *model, GtkTreeIter *iter,
                       PsppireSelector *selector)
 {
   gboolean result;
-  gchar *name;
   GtkTreeIter dict_iter;
   GtkTreeModel *dict;
   struct variable *var;
   gint dict_index;
   gint *indeces;
   GtkTreePath *path;
-  const gchar *text =   gtk_entry_get_text (GTK_ENTRY (selector->dest));
+  const gchar *text =  gtk_entry_get_text (GTK_ENTRY (selector->dest));
 
   get_base_model (model, iter, &dict, &dict_iter);
 
@@ -144,10 +139,7 @@ is_currently_in_entry (GtkTreeModel *model, GtkTreeIter *iter,
 
   gtk_tree_path_free (path);
 
-  name = recode_string (UTF8, psppire_dict_encoding (PSPPIRE_DICT (dict)),
-                       var_get_name (var), -1);
-  result = ( 0 == strcmp (text, name));
-  g_free (name);
+  result = ( 0 == strcmp (text, var_get_name (var) ));
 
   return result;
 }
index 86d295830bc2eb82a54fdf70be12e91d704434eb..faeb8f6490578ad703096f40cbce96cce44886a8 100644 (file)
@@ -427,6 +427,7 @@ struct comparator
 {
   const struct variable *var;
   enum string_cmp_flags flags;
+  const PsppireDict *dict;
 
   bool (*compare) (const struct comparator *,
                   const union value *);
@@ -492,20 +493,24 @@ static bool
 string_value_compare (const struct comparator *cmptr,
                      const union value *val)
 {
+  bool found;
+  char *text;
   const struct string_comparator *ssc =
     (const struct string_comparator *) cmptr;
 
   int width = var_get_width (cmptr->var);
-  const char *text = value_str (val, width);
-
+  g_return_val_if_fail (width > 0, false);
   assert ( ! (cmptr->flags & STR_CMP_LABELS));
 
-  g_return_val_if_fail (width > 0, false);
+  text = value_to_text (*val, cmptr->dict, *var_get_write_format (cmptr->var));
 
   if ( cmptr->flags & STR_CMP_SUBSTR)
-    return (NULL != g_strstr_len (text, width, ssc->pattern));
+    found =  (NULL != g_strstr_len (text, width, ssc->pattern));
   else
-    return (0 == strncmp (text, ssc->pattern, width));
+    found = (0 == strncmp (text, ssc->pattern, width));
+
+  free (text);
+  return found;
 }
 
 
@@ -526,9 +531,9 @@ regexp_value_compare (const struct comparator *cmptr,
 
   g_return_val_if_fail (width > 0, false);
 
+  text = value_to_text (*val, cmptr->dict, *var_get_write_format (cmptr->var));
   /* We must remove trailing whitespace, otherwise $ will not match where
      one would expect */
-  text = g_strndup (value_str (val, width), width);
   g_strchomp (text);
 
   retval = (0 == regexec (&rec->re, text, 0, 0, 0));
@@ -578,7 +583,7 @@ cmptr_value_destroy (struct comparator *cmptr)
 
 
 static struct comparator *
-value_comparator_create (const struct variable *var, const char *target)
+value_comparator_create (const struct variable *var, const PsppireDict *dict, const char *target)
 {
   const struct fmt_spec *fmt;
   int width ;
@@ -589,28 +594,21 @@ value_comparator_create (const struct variable *var, const char *target)
   cmptr->var = var;
   cmptr->compare  = value_compare ;
   cmptr->destroy = cmptr_value_destroy;
+  cmptr->dict = dict;
 
   width = var_get_width (var);
   fmt = var_get_write_format (var);
 
   value_init (&vc->pattern, width);
 
-  if ( ! data_in (ss_cstr (target),
-                  LEGACY_NATIVE,
-                 fmt->type,
-                 0, 0, 0,
-                 &vc->pattern, width) )
-    {
-      value_destroy (&vc->pattern, width);
-      free (vc);
-      return NULL;
-    }
+  text_to_value (target, &vc->pattern, dict, *var_get_write_format (var) );
 
   return cmptr;
 }
 
 static struct comparator *
-string_comparator_create (const struct variable *var, const char *target,
+string_comparator_create (const struct variable *var, const PsppireDict *dict, 
+                         const char *target,
                          enum string_cmp_flags flags)
 {
   struct string_comparator *ssc = xzalloc (sizeof (*ssc));
@@ -618,6 +616,7 @@ string_comparator_create (const struct variable *var, const char *target,
 
   cmptr->flags = flags;
   cmptr->var = var;
+  cmptr->dict = dict;
 
   if ( flags & STR_CMP_LABELS)
     cmptr->compare = string_label_compare;
@@ -631,7 +630,7 @@ string_comparator_create (const struct variable *var, const char *target,
 
 
 static struct comparator *
-regexp_comparator_create (const struct variable *var, const char *target,
+regexp_comparator_create (const struct variable *var, const PsppireDict *dict, const char *target,
                          enum string_cmp_flags flags)
 {
   int code;
@@ -640,6 +639,7 @@ regexp_comparator_create (const struct variable *var, const char *target,
 
   cmptr->flags = flags;
   cmptr->var = var;
+  cmptr->dict = dict;
   cmptr->compare  = (flags & STR_CMP_LABELS)
     ? regexp_label_compare : regexp_value_compare ;
 
@@ -689,16 +689,16 @@ comparator_destroy (struct comparator *cmptr)
 
 
 static struct comparator *
-comparator_factory (const struct variable *var, const char *str,
+comparator_factory (const struct variable *var, const PsppireDict *dict, const char *str,
                    enum string_cmp_flags flags)
 {
   if ( flags & STR_CMP_REGEXP )
-    return regexp_comparator_create (var, str, flags);
+    return regexp_comparator_create (var, dict, str, flags);
 
   if ( flags & (STR_CMP_SUBSTR | STR_CMP_LABELS) )
-    return string_comparator_create (var, str, flags);
+    return string_comparator_create (var, dict, str, flags);
 
-  return value_comparator_create (var, str);
+  return value_comparator_create (var, dict, str);
 }
 
 
@@ -744,7 +744,7 @@ find_value (const struct find_dialog *fd, casenumber current_row,
     casenumber i;
     const struct casenum_iterator *ip = get_iteration_params (fd);
     struct comparator *cmptr =
-      comparator_factory (var, target_string, flags);
+      comparator_factory (var, fd->dict, target_string, flags);
 
     value_init (&val, width);
     if ( ! cmptr)
index a4c07ca46d78ae74efd5317f3a7b87216578b1ee..ff750b25f7aa6ffe3b6a99e55a2d014791bcf5d8 100644 (file)
 /* Formats a value according to FORMAT
    The returned string must be freed when no longer required */
 gchar *
-value_to_text (union value v, struct fmt_spec format)
+value_to_text (union value v, const PsppireDict *dict, struct fmt_spec format)
 {
   gchar *s = 0;
 
-  s = g_new (gchar, format.w + 1);
-  data_out (&v, &format, s);
-  s[format.w]='\0';
+  s = data_out (&v, dict_get_encoding (dict->dict),  &format);
   g_strchug (s);
 
   return s;
@@ -65,6 +63,7 @@ value_to_text (union value v, struct fmt_spec format)
 
 gboolean
 text_to_value (const gchar *text, union value *v,
+              const PsppireDict *dict,
              struct fmt_spec format)
 {
   bool ok;
@@ -87,7 +86,8 @@ text_to_value (const gchar *text, union value *v,
     }
 
   msg_disable ();
-  ok = data_in (ss_cstr (text), LEGACY_NATIVE, format.type, 0, 0, 0,
+  ok = data_in (ss_cstr (text), UTF8, format.type, 0, 0, 0,
+               dict->dict,
                 v, fmt_var_width (&format));
   msg_enable ();
 
index a6287ddaf1db3260ae0baed48f2fc65bd9365d83..f6c084d48e8373d12366b24455f45267daacd89b 100644 (file)
 
 #include <gtk/gtk.h>
 
-
+#include "psppire-dict.h"
 
 void paste_syntax_in_new_window (const gchar *syntax);
 
 struct fmt_spec;
 
+
 /* Formats a value according to FORMAT
    The returned string must be freed when no longer required */
-gchar * value_to_text (union value v, struct fmt_spec format);
+gchar * value_to_text (union value v, const PsppireDict *dict, struct fmt_spec format);
 
 
 gboolean text_to_value (const gchar *text, union value *v,
+                       const PsppireDict *dict,
                       struct fmt_spec format);
 
 GObject *get_object_assert (GtkBuilder *builder, const gchar *name, GType type);
index 8efbaf975d90acad6154da39b2aab9d53af24164..16a7f6f34ba7bde4aea39394305def0327824a57 100644 (file)
@@ -100,7 +100,8 @@ missing_val_dialog_accept (GtkWidget *w, gpointer data)
              continue;
            }
 
-         if ( text_to_value (text, &v, *write_spec))
+         if ( text_to_value (text, &v, 
+                             dialog->dict, *write_spec))
            {
              nvals++;
              mv_add_value (&dialog->mvl, &v);
@@ -126,9 +127,9 @@ missing_val_dialog_accept (GtkWidget *w, gpointer data)
       const gchar *low_text = gtk_entry_get_text (GTK_ENTRY (dialog->low));
       const gchar *high_text = gtk_entry_get_text (GTK_ENTRY (dialog->high));
 
-      if ( text_to_value (low_text, &low_val, *write_spec)
+      if ( text_to_value (low_text, &low_val, dialog->dict, *write_spec)
           &&
-          text_to_value (high_text, &high_val, *write_spec) )
+          text_to_value (high_text, &high_val, dialog->dict, *write_spec) )
        {
          if ( low_val.f > high_val.f )
            {
@@ -154,6 +155,7 @@ missing_val_dialog_accept (GtkWidget *w, gpointer data)
        {
          union value discrete_val;
          if ( !text_to_value (discrete_text, &discrete_val,
+                              dialog->dict,
                              *write_spec))
            {
              err_dialog (_("Incorrect value for variable type"),
@@ -309,8 +311,9 @@ missing_val_dialog_show (struct missing_val_dialog *dialog)
       gchar *high_text;
       mv_get_range (&dialog->mvl, &low.f, &high.f);
 
-      low_text = value_to_text (low, *write_spec);
-      high_text = value_to_text (high, *write_spec);
+
+      low_text = value_to_text (low, dialog->dict, *write_spec);
+      high_text = value_to_text (high, dialog->dict,  *write_spec);
 
       gtk_entry_set_text (GTK_ENTRY (dialog->low), low_text);
       gtk_entry_set_text (GTK_ENTRY (dialog->high), high_text);
@@ -320,7 +323,7 @@ missing_val_dialog_show (struct missing_val_dialog *dialog)
       if ( mv_has_value (&dialog->mvl))
        {
          gchar *text;
-         text = value_to_text (*mv_get_value (&dialog->mvl, 0), *write_spec);
+         text = value_to_text (*mv_get_value (&dialog->mvl, 0), dialog->dict, *write_spec);
          gtk_entry_set_text (GTK_ENTRY (dialog->discrete), text);
          g_free (text);
        }
@@ -341,7 +344,7 @@ missing_val_dialog_show (struct missing_val_dialog *dialog)
            {
              gchar *text ;
 
-             text = value_to_text (*mv_get_value (&dialog->mvl, i),
+             text = value_to_text (*mv_get_value (&dialog->mvl, i), dialog->dict,
                                     *write_spec);
              gtk_entry_set_text (GTK_ENTRY (dialog->mv[i]), text);
              g_free (text);
index 7dc079d731d342244ef256759acc9cc6cc23e1c4..82acf9757f0738eea85ec186a9a51047c18ebad3 100644 (file)
@@ -32,6 +32,9 @@ struct missing_val_dialog
   /* The variable whose missing values are to be updated */
   struct variable *pv;
 
+  /* The dictionary to which that value belongs */
+  PsppireDict *dict;
+
   /* local copy */
   struct missing_values mvl;
 
index 7c3fca685eaa5e7d295455c4773584b649861ffd..38250f7ea6959a76ab18e6f1db1458ffb8ed2e0f 100644 (file)
@@ -744,15 +744,10 @@ update_data_ref_entry (const PsppireSheet *sheet,
          gchar *text = g_strdup_printf ("%d: %s", row + FIRST_CASE_NUMBER,
                                         var_get_name (var));
 
-         gchar *s = recode_string (UTF8,
-                                   psppire_dict_encoding (data_store->dict),
-                                   text, -1);
 
-         g_free (text);
-
-         gtk_entry_set_text (GTK_ENTRY (de->cell_ref_entry), s);
+         gtk_entry_set_text (GTK_ENTRY (de->cell_ref_entry), text);
 
-         g_free (s);
+         g_free (text);
        }
       else
        goto blank_entry;
@@ -1331,10 +1326,14 @@ psppire_data_editor_insert_case (PsppireDataEditor *de)
 {
   glong posn = -1;
 
-  if ( de->data_sheet[0]->state == PSPPIRE_SHEET_ROW_SELECTED )
-    posn = PSPPIRE_SHEET (de->data_sheet[0])->range.row0;
+  if ( PSPPIRE_SHEET (de->data_sheet[0])->select_status == PSPPIRE_SHEET_ROW_SELECTED )
+    {
+      posn = PSPPIRE_SHEET (de->data_sheet[0])->range.row0;
+    }
   else
-    posn = PSPPIRE_SHEET (de->data_sheet[0])->active_cell.row;
+    {
+      posn = PSPPIRE_SHEET (de->data_sheet[0])->active_cell.row;
+    }
 
   if ( posn == -1 ) posn = 0;
 
@@ -1647,20 +1646,18 @@ enum {
 
 /* Perform data_out for case CC, variable V, appending to STRING */
 static void
-data_out_g_string (GString *string, const struct variable *v,
+data_out_g_string (GString *string, const struct dictionary *dict, 
+                  const struct variable *v,
                   const struct ccase *cc)
 {
-  char *buf ;
-
   const struct fmt_spec *fs = var_get_print_format (v);
   const union value *val = case_data (cc, v);
-  buf = xzalloc (fs->w);
 
-  data_out (val, fs, buf);
+  char *s = data_out (val, dict_get_encoding (dict), fs);
 
-  g_string_append_len (string, buf, fs->w);
+  g_string_append (string, s);
 
-  g_free (buf);
+  g_free (s);
 }
 
 static GString *
@@ -1690,7 +1687,7 @@ clip_to_text (void)
       for (c = 0 ; c < var_cnt ; ++c)
        {
          const struct variable *v = dict_get_var (clip_dict, c);
-         data_out_g_string (string, v, cc);
+         data_out_g_string (string, clip_dict, v, cc);
          if ( c < val_cnt - 1 )
            g_string_append (string, "\t");
        }
@@ -1735,7 +1732,7 @@ clip_to_html (void)
        {
          const struct variable *v = dict_get_var (clip_dict, c);
          g_string_append (string, "<td>");
-         data_out_g_string (string, v, cc);
+         data_out_g_string (string, clip_dict, v, cc);
          g_string_append (string, "</td>\n");
        }
 
index b67e27c139024308fecd33da12e0db50beb09d38..9833fb496f8a0be6dd3145fc7bbb334fe46b341f 100644 (file)
@@ -583,13 +583,15 @@ psppire_data_store_get_string (PsppireDataStore *store, glong row, glong column)
   char *text;
   const struct fmt_spec *fp ;
   const struct variable *pv ;
+  const struct dictionary *dict;
   union value v;
   int width;
-  GString *s;
 
   g_return_val_if_fail (store->dict, NULL);
   g_return_val_if_fail (store->datasheet, NULL);
 
+  dict = store->dict->dict;
+
   if (column >= psppire_dict_get_var_cnt (store->dict))
     return NULL;
 
@@ -615,28 +617,13 @@ psppire_data_store_get_string (PsppireDataStore *store, glong row, glong column)
       if (label)
         {
           value_destroy (&v, width);
-         return recode_string (UTF8, psppire_dict_encoding (store->dict),
-                               label, -1);
+         return g_strdup (label);
         }
     }
 
   fp = var_get_write_format (pv);
 
-  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 (&v, fp, s->str);
-
-  text = recode_string (UTF8, psppire_dict_encoding (store->dict),
-                       s->str, fp->w);
-  g_string_free (s, TRUE);
+  text = data_out (&v, dict_get_encoding (dict), fp);
 
   g_strchomp (text);
 
@@ -677,7 +664,6 @@ gboolean
 psppire_data_store_set_string (PsppireDataStore *store,
                               const gchar *text, glong row, glong col)
 {
-  gchar *s;
   glong n_cases;
   const struct variable *pv = psppire_dict_get_variable (store->dict, col);
   if ( NULL == pv)
@@ -691,12 +677,9 @@ psppire_data_store_set_string (PsppireDataStore *store,
   if (row == n_cases)
     psppire_data_store_insert_new_case (store, row);
 
-  s = recode_string (psppire_dict_encoding (store->dict), UTF8, text, -1);
-
   psppire_data_store_data_in (store, row,
-                             var_get_case_index (pv), ss_cstr (s),
+                             var_get_case_index (pv), ss_cstr (text),
                              var_get_write_format (pv));
-  free (s);
 
   psppire_sheet_model_range_changed (PSPPIRE_SHEET_MODEL (store), row, col, row, col);
 
@@ -767,15 +750,9 @@ static const gchar null_var_name[]=N_("var");
 static gchar *
 get_row_button_label (const PsppireSheetModel *model, gint unit)
 {
-  PsppireDataStore *ds = PSPPIRE_DATA_STORE (model);
-  gchar *s = g_strdup_printf (_("%d"), unit + FIRST_CASE_NUMBER);
-
-  gchar *text =  recode_string (UTF8, psppire_dict_encoding (ds->dict),
-                               s, -1);
+  // PsppireDataStore *ds = PSPPIRE_DATA_STORE (model);
 
-  g_free (s);
-
-  return text;
+  return g_strdup_printf (_("%d"), unit + FIRST_CASE_NUMBER);
 }
 
 
@@ -795,7 +772,6 @@ get_row_sensitivity (const PsppireSheetModel *model, gint unit)
 static gchar *
 get_column_subtitle (const PsppireSheetModel *model, gint col)
 {
-  gchar *text;
   const struct variable *v ;
   PsppireDataStore *ds = PSPPIRE_DATA_STORE (model);
 
@@ -807,16 +783,12 @@ get_column_subtitle (const PsppireSheetModel *model, gint col)
   if ( ! var_has_label (v))
     return NULL;
 
-  text =  recode_string (UTF8, psppire_dict_encoding (ds->dict),
-                        var_get_label (v), -1);
-
-  return text;
+  return xstrdup (var_get_label (v));
 }
 
 static gchar *
 get_column_button_label (const PsppireSheetModel *model, gint col)
 {
-  gchar *text;
   struct variable *pv ;
   PsppireDataStore *ds = PSPPIRE_DATA_STORE (model);
 
@@ -825,10 +797,10 @@ get_column_button_label (const PsppireSheetModel *model, gint col)
 
   pv = psppire_dict_get_variable (ds->dict, col);
 
-  text = recode_string (UTF8, psppire_dict_encoding (ds->dict),
-                       var_get_name (pv), -1);
+  if (NULL == pv)
+    return NULL;
 
-  return text;
+  return xstrdup (var_get_name (pv));
 }
 
 static gboolean
@@ -972,18 +944,23 @@ psppire_data_store_data_in (PsppireDataStore *ds, casenumber casenum, gint idx,
   int width;
   bool ok;
 
+  PsppireDict *dict;
+
   g_return_val_if_fail (ds, FALSE);
   g_return_val_if_fail (ds->datasheet, FALSE);
 
   g_return_val_if_fail (idx < datasheet_get_n_columns (ds->datasheet), FALSE);
 
+  dict = ds->dict;
+
   width = fmt_var_width (fmt);
   g_return_val_if_fail (caseproto_get_width (
                           datasheet_get_proto (ds->datasheet), idx) == width,
                         FALSE);
   value_init (&value, width);
   ok = (datasheet_get_value (ds->datasheet, casenum, idx, &value)
-        && data_in (input, LEGACY_NATIVE, fmt->type, 0, 0, 0, &value, width)
+        && data_in (input, UTF8, fmt->type, 0, 0, 0,
+                   dict->dict, &value, width)
         && datasheet_put_value (ds->datasheet, casenum, idx, &value));
   value_destroy (&value, width);
 
index 1df084c1418c79339d458151ce25bb4ac4c07d82..185648bc0e9dd02c9905a8adf754090079dab2cf 100644 (file)
@@ -521,7 +521,6 @@ static void
 insert_case (GtkAction *action, gpointer data)
 {
   PsppireDataWindow *dw = PSPPIRE_DATA_WINDOW (data);
-
   psppire_data_editor_insert_case (dw->data_editor);
 }
 
index 8ff92a48fc57c01f7d255ab27001dd4cdc5c5f15..c82395f2ebdc047e1f8678b9e9d6873df2452207 100644 (file)
@@ -760,11 +760,8 @@ tree_model_get_value (GtkTreeModel *model, GtkTreeIter *iter,
     {
     case DICT_TVM_COL_NAME:
       {
-       gchar *name = recode_string (UTF8, psppire_dict_encoding (dict),
-                                    var_get_name (var), -1);
        g_value_init (value, G_TYPE_STRING);
-       g_value_set_string (value, name);
-       g_free (name);
+       g_value_set_string (value, var_get_name (var));
       }
       break;
     case DICT_TVM_COL_VAR:
@@ -859,11 +856,10 @@ psppire_dict_dump (const PsppireDict *dict)
     {
       const struct variable *v = psppire_dict_get_variable (dict, i);
       int di = var_get_dict_index (v);
-      g_print ("\"%s\" idx=%d, fv=%d, size=%d\n",
+      g_print ("\"%s\" idx=%d, fv=%d\n",
               var_get_name(v),
               di,
-              var_get_case_index(v),
-              value_cnt_from_width(var_get_width(v)));
+              var_get_case_index(v));
 
     }
 }
index f63ea0ba6fe578367d492fc2ff724487695d9034..243d907826f909a933f1fe8a73478b888da83c5c 100644 (file)
@@ -340,19 +340,12 @@ var_description_cell_data_func (GtkTreeViewColumn *col,
                                     "<span stretch=\"condensed\">%s</span>",
                                     var_get_label (var));
 
-      char *utf8 = recode_string (UTF8, psppire_dict_encoding (dict),
-                                 text, -1);
-
+      g_object_set (cell, "markup", text, NULL);
       g_free (text);
-      g_object_set (cell, "markup", utf8, NULL);
-      g_free (utf8);
     }
   else
     {
-      char *name = recode_string (UTF8, psppire_dict_encoding (dict),
-                                 var_get_name (var), -1);
-      g_object_set (cell, "text", name, NULL);
-      g_free (name);
+      g_object_set (cell, "text", var_get_name (var), NULL);
     }
 }
 
@@ -439,7 +432,7 @@ set_tooltip_for_variable (GtkTreeView  *treeview,
     return FALSE;
 
   {
-    gchar *tip ;
+    const gchar *tip ;
     GtkTreeModel *m;
     PsppireDict *dict;
 
@@ -447,15 +440,11 @@ set_tooltip_for_variable (GtkTreeView  *treeview,
     dict = PSPPIRE_DICT (m);
 
     if ( PSPPIRE_DICT_VIEW (treeview)->prefer_labels )
-      tip = recode_string (UTF8, psppire_dict_encoding (dict),
-                          var_get_name (var), -1);
+      tip = var_get_name (var);
     else
-      tip = recode_string (UTF8, psppire_dict_encoding (dict),
-                          var_get_label (var), -1);
+      tip = var_get_label (var);
 
     gtk_tooltip_set_text (tooltip, tip);
-
-    g_free (tip);
   }
 
   return TRUE;
index 621a9e24f90ef07a0182dca4e1b3b3ed4bfdf9f4..d11eca618d84c9c18c86e5dc7bd184b6f9771a75 100644 (file)
@@ -24,6 +24,7 @@
 #include <gtk/gtkaction.h>
 #include <gtk/gtktextbuffer.h>
 #include "psppire-window.h"
+#include "psppire.h"
 #include <gtk/gtk.h>
 
 extern int viewer_length;
index 3ebea2ea182a23b2e0dab2324127f434b42555d7..dfd62bb6737f1dbc78a605a6aaf62e2e7189a757 100644 (file)
@@ -384,6 +384,8 @@ var_sheet_change_active_cell (PsppireVarSheet *vs,
        vs->missing_val_dialog->pv =
          psppire_var_store_get_var (var_store, row);
 
+       vs->missing_val_dialog->dict = var_store->dict;
+
        g_signal_connect_swapped (customEntry,
                                  "clicked",
                                  G_CALLBACK (missing_val_dialog_show),
@@ -479,7 +481,8 @@ psppire_var_sheet_realize (GtkWidget *w)
   GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (vs));
 
   vs->val_labs_dialog = val_labs_dialog_create (GTK_WINDOW (toplevel),
-                                               PSPPIRE_SHEET (vs));
+                                               PSPPIRE_VAR_STORE (psppire_sheet_get_model (PSPPIRE_SHEET (vs))));
+
   vs->missing_val_dialog = missing_val_dialog_create (GTK_WINDOW (toplevel));
   vs->var_type_dialog = var_type_dialog_create (GTK_WINDOW (toplevel));
 
index aadc585548582fc79629dca6b580e271ad6c7cde..26c1ee4d34e6cd0d5b13b4f2f89c78e1d5b865c8 100644 (file)
@@ -435,7 +435,7 @@ psppire_var_store_clear (PsppireSheetModel *model,  glong row, glong col)
   switch (col)
     {
     case PSPPIRE_VAR_STORE_COL_LABEL:
-      var_set_label (pv, 0);
+      var_set_label (pv, NULL);
       return TRUE;
       break;
     }
@@ -468,13 +468,7 @@ psppire_var_store_set_string (PsppireSheetModel *model,
     case PSPPIRE_VAR_STORE_COL_NAME:
       {
        gboolean ok;
-       char *s = recode_string (psppire_dict_encoding (var_store->dict),
-                                UTF8,
-                                text, -1);
-
-       ok =  psppire_dict_rename_var (var_store->dict, pv, s);
-
-       free (s);
+       ok =  psppire_dict_rename_var (var_store->dict, pv, text);
        return ok;
       }
     case PSPPIRE_VAR_STORE_COL_COLUMNS:
@@ -540,11 +534,7 @@ psppire_var_store_set_string (PsppireSheetModel *model,
       break;
     case PSPPIRE_VAR_STORE_COL_LABEL:
       {
-       gchar *s = recode_string (psppire_dict_encoding (var_store->dict),
-                                 UTF8,
-                                 text, -1);
-       var_set_label (pv, s);
-       free (s);
+       var_set_label (pv, text);
        return TRUE;
       }
       break;
@@ -583,6 +573,7 @@ text_for_column (PsppireVarStore *vs,
       N_("Custom"),
       N_("String")
     };
+
   enum {VT_NUMERIC, VT_COMMA, VT_DOT, VT_SCIENTIFIC, VT_DATE, VT_DOLLAR,
        VT_CUSTOM, VT_STRING};
 
@@ -591,8 +582,7 @@ text_for_column (PsppireVarStore *vs,
   switch (c)
     {
     case PSPPIRE_VAR_STORE_COL_NAME:
-      return recode_string (UTF8, psppire_dict_encoding (dict),
-                           var_get_name (pv), -1);
+      return xstrdup (var_get_name (pv));
       break;
     case PSPPIRE_VAR_STORE_COL_TYPE:
       {
@@ -679,8 +669,12 @@ text_for_column (PsppireVarStore *vs,
       }
       break;
     case PSPPIRE_VAR_STORE_COL_LABEL:
-      return recode_string (UTF8, psppire_dict_encoding (dict),
-                           var_get_label (pv), -1);
+      {
+       const char *label = var_get_label (pv);
+       if (label)
+         return xstrdup (label);
+       return NULL;
+      }
       break;
 
     case PSPPIRE_VAR_STORE_COL_MISSING:
@@ -694,8 +688,6 @@ text_for_column (PsppireVarStore *vs,
          return g_locale_to_utf8 (gettext (none), -1, 0, 0, err);
        else
          {
-           gchar *ss;
-           GString *gstr = g_string_sized_new (10);
            const struct val_labs *vls = var_get_value_labels (pv);
             const struct val_lab **labels = val_labs_sorted (vls);
            const struct val_lab *vl = labels[0];
@@ -704,17 +696,10 @@ text_for_column (PsppireVarStore *vs,
            g_assert (vl);
 
            {
-             gchar *const vstr = value_to_text (vl->value, *write_spec);
+             gchar *const vstr = value_to_text (vl->value, dict, *write_spec);
 
-             g_string_printf (gstr, "{%s,\"%s\"}_",
-                               vstr, val_lab_get_label (vl));
-             g_free (vstr);
+             return g_strdup_printf ( "{%s,\"%s\"}_", vstr, val_lab_get_label (vl));
            }
-
-           ss = recode_string (UTF8, psppire_dict_encoding (dict),
-                               gstr->str, gstr->len);
-           g_string_free (gstr, TRUE);
-           return ss;
          }
       }
       break;
index a6f4bb223f35612ce9a399c647444556c85c5bda..a096752897ccecf703757980637c43c786230e9c 100644 (file)
@@ -3,31 +3,6 @@
 <!--*- mode: xml -*-->
 <glade-interface>
   <requires lib="psppire"/>
-  <widget class="GtkAboutDialog" id="aboutdialog1">
-    <property name="modal">True</property>
-    <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
-    <property name="copyright">Free Software Foundation</property>
-    <property name="comments" translatable="yes">This is beta status software.  Please report bugs to bug-gnu-pspp@gnu.org</property>
-    <property name="authors"></property>
-    <property name="logo">pspplogo.png</property>
-    <child internal-child="vbox">
-      <widget class="GtkVBox" id="dialog-vbox1">
-        <property name="visible">True</property>
-        <child>
-          <placeholder/>
-        </child>
-        <child internal-child="action_area">
-          <widget class="GtkHButtonBox" id="dialog-action_area1">
-            <property name="visible">True</property>
-          </widget>
-          <packing>
-            <property name="expand">False</property>
-            <property name="pack_type">GTK_PACK_END</property>
-          </packing>
-        </child>
-      </widget>
-    </child>
-  </widget>
   <widget class="PsppireDialog" id="weight-cases-dialog">
     <property name="title">Weight Cases</property>
     <property name="modal">True</property>
index dac8b4c1e0a5c0ad8cb22ef0887b85375eefe94b..6f33ff6d8bb8b6547a76a91bc06d35260a3a1881 100644 (file)
@@ -1543,6 +1543,7 @@ init_formats_page (struct import_assistant *ia)
   p->data_tree_view = GTK_TREE_VIEW (get_widget_assert (builder, "data"));
   p->modified_vars = NULL;
   p->modified_var_cnt = 0;
+  p->dict = NULL;
 }
 
 /* Frees IA's formats substructure. */
@@ -1748,7 +1749,9 @@ parse_field (struct import_assistant *ia,
   if (field.string != NULL)
     {
       msg_disable ();
+
       if (!data_in (field, LEGACY_NATIVE, in->type, 0, 0, 0,
+                   ia->formats.dict,
                     &val, var_get_width (var)))
         {
           char fmt_string[FMT_STRING_LEN_MAX + 1];
@@ -1768,10 +1771,7 @@ parse_field (struct import_assistant *ia,
     }
   if (outputp != NULL)
     {
-      char *output = xmalloc (out.w + 1);
-      data_out (&val, &out, output);
-      output[out.w] = '\0';
-      *outputp = output;
+      *outputp = data_out (&val, dict_get_encoding (ia->formats.dict),  &out);
     }
   value_destroy (&val, var_get_width (var));
 
index 0af805912da167444ece82f14bd079c03f054da9..4b575d9779799b7d5850d683dd57afe17ba98a66 100644 (file)
@@ -34,7 +34,7 @@ struct val_labs_dialog
 {
   GtkWidget *window;
 
-  PsppireSheet *vs;
+  PsppireVarStore *var_store;
 
   /* The variable to be updated */
   struct variable *pv;
@@ -72,6 +72,7 @@ on_label_entry_change (GtkEntry *entry, gpointer data)
   text = gtk_entry_get_text (GTK_ENTRY (dialog->value_entry));
 
   text_to_value (text, &v,
+                dialog->var_store->dict,
                *var_get_write_format (dialog->pv));
 
 
@@ -142,6 +143,7 @@ on_value_entry_change (GtkEntry *entry, gpointer data)
 
   union value v;
   text_to_value (text, &v,
+                dialog->var_store->dict,
                *var_get_write_format (dialog->pv));
 
 
@@ -268,6 +270,7 @@ on_change (GtkWidget *w, gpointer data)
   union value v;
 
   text_to_value (val_text, &v,
+                dialog->var_store->dict,
                *var_get_write_format (dialog->pv));
 
   val_labs_replace (dialog->labs, &v,
@@ -292,6 +295,7 @@ on_add (GtkWidget *w, gpointer data)
   const gchar *text = gtk_entry_get_text (GTK_ENTRY (dialog->value_entry));
 
   text_to_value (text, &v,
+                dialog->var_store->dict,
                *var_get_write_format (dialog->pv));
 
 
@@ -337,19 +341,15 @@ on_remove (GtkWidget *w, gpointer data)
 static void
 on_select_row (GtkTreeView *treeview, gpointer data)
 {
-  gchar *labeltext;
   struct val_labs_dialog *dialog = data;
 
   union value value;
-  const char *label;
+  const char *label = NULL;
 
   gchar *text;
 
-  PsppireVarStore *var_store =
-    PSPPIRE_VAR_STORE (psppire_sheet_get_model (dialog->vs));
-
   get_selected_tuple (dialog, &value, &label);
-  text = value_to_text (value, *var_get_write_format (dialog->pv));
+  text = value_to_text (value, dialog->var_store->dict, *var_get_write_format (dialog->pv));
 
   g_signal_handler_block (GTK_ENTRY (dialog->value_entry),
                         dialog->value_handler_id);
@@ -364,12 +364,8 @@ on_select_row (GtkTreeView *treeview, gpointer data)
                         dialog->change_handler_id);
 
 
-  labeltext = recode_string (UTF8, psppire_dict_encoding (var_store->dict),
-                            label, -1);
-
   gtk_entry_set_text (GTK_ENTRY (dialog->label_entry),
-                    labeltext);
-  g_free (labeltext);
+                     label);
 
   g_signal_handler_unblock (GTK_ENTRY (dialog->label_entry),
                         dialog->change_handler_id);
@@ -382,7 +378,7 @@ on_select_row (GtkTreeView *treeview, gpointer data)
 /* Create a new dialog box
    (there should  normally be only one)*/
 struct val_labs_dialog *
-val_labs_dialog_create (GtkWindow *toplevel, PsppireSheet *sheet)
+val_labs_dialog_create (GtkWindow *toplevel, PsppireVarStore *var_store)
 {
   GtkTreeViewColumn *column;
 
@@ -392,10 +388,10 @@ val_labs_dialog_create (GtkWindow *toplevel, PsppireSheet *sheet)
 
   struct val_labs_dialog *dialog = g_malloc (sizeof (*dialog));
 
+  dialog->var_store = var_store;
   dialog->window = get_widget_assert (xml,"val_labs_dialog");
   dialog->value_entry = get_widget_assert (xml,"value_entry");
   dialog->label_entry = get_widget_assert (xml,"label_entry");
-  dialog->vs = sheet;
 
   gtk_window_set_transient_for
     (GTK_WINDOW (dialog->window), toplevel);
@@ -481,9 +477,6 @@ repopulate_dialog (struct val_labs_dialog *dialog)
 
   GtkTreeIter iter;
 
-  PsppireVarStore *var_store =
-    PSPPIRE_VAR_STORE (psppire_sheet_get_model (dialog->vs));
-
   GtkListStore *list_store = gtk_list_store_new (2,
                                                 G_TYPE_STRING,
                                                 G_TYPE_DOUBLE);
@@ -508,16 +501,11 @@ repopulate_dialog (struct val_labs_dialog *dialog)
       const struct val_lab *vl = labels[i];
 
       gchar *const vstr  =
-       value_to_text (vl->value,
+       value_to_text (vl->value, dialog->var_store->dict,
                      *var_get_write_format (dialog->pv));
 
-      gchar *labeltext =
-       recode_string (UTF8,
-                      psppire_dict_encoding (var_store->dict),
-                      val_lab_get_label (vl), -1);
-
       gchar *const text = g_strdup_printf ("%s = \"%s\"",
-                                          vstr, labeltext);
+                                          vstr, val_lab_get_label (vl));
 
       gtk_list_store_append (list_store, &iter);
       gtk_list_store_set (list_store, &iter,
@@ -525,7 +513,6 @@ repopulate_dialog (struct val_labs_dialog *dialog)
                          1, vl->value.f,
                          -1);
 
-      g_free (labeltext);
       g_free (text);
       g_free (vstr);
     }
index 3a09f1ca410e0f2f6b775741d9e62dde48e4aae7..745e0a0ae5f795b2786a078d9e435ca633ad242c 100644 (file)
 
 #include <gtk/gtk.h>
 #include <data/variable.h>
-#include <gtk-contrib/psppire-sheet.h>
-
+//#include <gtk-contrib/psppire-sheet.h>
+#include "psppire-var-store.h"
 
 struct val_labs;
 
 
-struct val_labs_dialog * val_labs_dialog_create (GtkWindow *, PsppireSheet *);
+struct val_labs_dialog * val_labs_dialog_create (GtkWindow *, PsppireVarStore *);
 
 void val_labs_dialog_show (struct val_labs_dialog *);
 
index b615fe522b3f76286143daef43bca1b9b42cd49a..7081e9e2c0bde74fc4c9424f729733ba8a74c1c2 100644 (file)
@@ -45,15 +45,14 @@ missing_values_to_string (const PsppireDict *dict, const struct variable *pv, GE
          gint i;
          for (i = 0 ; i < n; ++i )
            {
-             mv[i] = value_to_text (*mv_get_value (miss, i), *fmt);
+             mv[i] = value_to_text (*mv_get_value (miss, i), dict, *fmt);
              if ( i > 0 )
                g_string_append (gstr, ", ");
              g_string_append (gstr, mv[i]);
              g_free (mv[i]);
            }
-         s = recode_string (UTF8, psppire_dict_encoding (dict),
-                            gstr->str, gstr->len);
-         g_string_free (gstr, TRUE);
+         s = gstr->str;
+         g_string_free (gstr, FALSE);
        }
       else
        {
@@ -62,8 +61,8 @@ missing_values_to_string (const PsppireDict *dict, const struct variable *pv, GE
          union value low, high;
          mv_get_range (miss, &low.f, &high.f);
 
-         l = value_to_text (low, *fmt);
-         h = value_to_text (high, *fmt);
+         l = value_to_text (low, dict, *fmt);
+         h = value_to_text (high, dict,*fmt);
 
          g_string_printf (gstr, "%s - %s", l, h);
          g_free (l);
@@ -73,15 +72,14 @@ missing_values_to_string (const PsppireDict *dict, const struct variable *pv, GE
            {
              gchar *ss = 0;
 
-             ss = value_to_text (*mv_get_value (miss, 0), *fmt);
+             ss = value_to_text (*mv_get_value (miss, 0), dict, *fmt);
 
              g_string_append (gstr, ", ");
              g_string_append (gstr, ss);
              free (ss);
            }
-         s = recode_string (UTF8, psppire_dict_encoding (dict),
-                            gstr->str, gstr->len);
-         g_string_free (gstr, TRUE);
+         s = gstr->str;
+         g_string_free (gstr, FALSE);
        }
 
       return s;
index c433bf3b2535e080e926093b2be5193c1760a252..05ba5d3c9e748c61662bc8ee48914a521938490f 100644 (file)
@@ -262,12 +262,12 @@ preview_custom (GtkWidget *w, gpointer data)
       union value v;
       v.f = 1234.56;
 
-      sample_text = value_to_text (v, dialog->fmt_l);
+      sample_text = value_to_text (v, NULL, dialog->fmt_l);
       gtk_label_set_text (GTK_LABEL (dialog->label_psample), sample_text);
       g_free (sample_text);
 
       v.f = -v.f;
-      sample_text = value_to_text (v, dialog->fmt_l);
+      sample_text = value_to_text (v, NULL, dialog->fmt_l);
       gtk_label_set_text (GTK_LABEL (dialog->label_nsample), sample_text);
       g_free (sample_text);
     }
index fa9d51011e8d2fec88b14cd2439d606a65836fd3..178a834c7a0d8357c642997c649f81f9612488b6 100644 (file)
 static const gchar none[] = N_("None");
 
 
-static gchar *
-name_to_string (const struct variable *var, PsppireDict *dict)
-{
-  const char *name = var_get_name (var);
-  g_assert (name);
-
-  return recode_string (UTF8, psppire_dict_encoding (dict),
-                       name, -1);
-}
-
-
-static gchar *
-label_to_string (const struct variable *var, PsppireDict *dict)
+static const gchar *
+label_to_string (const struct variable *var)
 {
   const char *label = var_get_label (var);
 
-  if (! label) return g_strdup (none);
+  if (NULL == label) return g_strdup (none);
 
-  return recode_string (UTF8, psppire_dict_encoding (dict),
-                       label, -1);
+  return label;
 }
 
 
@@ -82,16 +70,11 @@ populate_text (PsppireDictView *treeview, gpointer data)
                NULL);
 
   gstring = g_string_sized_new (200);
-  text = name_to_string (var, dict);
-  g_string_assign (gstring, text);
-  g_free (text);
+  g_string_assign (gstring, var_get_name (var));
   g_string_append (gstring, "\n");
 
 
-  text = label_to_string (var, dict);
-  g_string_append_printf (gstring, _("Label: %s\n"), text);
-  g_free (text);
-
+  g_string_append_printf (gstring, _("Label: %s\n"), label_to_string (var));
   {
     const struct fmt_spec *fmt = var_get_print_format (var);
     char buffer[FMT_STRING_LEN_MAX + 1];
@@ -130,14 +113,10 @@ populate_text (PsppireDictView *treeview, gpointer data)
         {
           const struct val_lab *vl = labels[i];
          gchar *const vstr  =
-           value_to_text (vl->value,  *var_get_print_format (var));
-
-         text = recode_string (UTF8, psppire_dict_encoding (dict),
-                               val_lab_get_label (vl), -1);
+           value_to_text (vl->value,  dict, *var_get_print_format (var));
 
-         g_string_append_printf (gstring, _("%s %s\n"), vstr, text);
+         g_string_append_printf (gstring, _("%s %s\n"), vstr, val_lab_get_label (vl));
 
-         g_free (text);
          g_free (vstr);
        }
       free (labels);
index bf1ee12f244caadbfc4197c0b7be466c7660a51e..22e717ac965903acdb5a8b12f95e5e3dd6492832 100644 (file)
@@ -146,20 +146,23 @@ syntax_gen_number (struct string *output,
           & (FMT_CAT_DATE | FMT_CAT_TIME | FMT_CAT_DATE_COMPONENT)))
     {
       union value v_in, v_out;
-      char buffer[FMT_MAX_NUMERIC_WIDTH];
+      char *s;
       bool ok;
 
       v_in.f = number;
-      data_out (&v_in, format, buffer);
+      s = data_out (&v_in, "FIXME",  format);
       msg_disable ();
-      ok = data_in (ss_buffer (buffer, format->w), LEGACY_NATIVE,
-                    format->type, false, 0, 0, &v_out, 0);
+      /* FIXME: UTF8 encoded strings will fail here */
+      ok = data_in (ss_cstr (s), LEGACY_NATIVE,
+                    format->type, false, 0, 0, NULL, &v_out, 0);
       msg_enable ();
       if (ok && v_out.f == number)
         {
-          syntax_gen_string (output, ss_buffer (buffer, format->w));
+          syntax_gen_string (output, ss_cstr (s));
+         free (s);
           return;
         }
+      free (s);
     }
 
   if (number == SYSMIS)
index 746f1a670911e629e2121bf8187cb06e00f7bef4..c28c8dd478c9f6dc4dd04ea8ddd5dbb2ac27a069 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-# This program tests that pspp can read gnumeric files
+# This program tests that pspp can read Gnumeric files
 
 TEMPDIR=/tmp/pspp-tst-$$
 TESTFILE=$TEMPDIR/`basename $0`.sps
index ae0d39fcba50afedfa9c7f66db21af4310387d96..4242b55b6581dcd82e551392856857c7fc3919e0 100755 (executable)
@@ -107,14 +107,14 @@ cat > $TEMPDIR/results.txt <<EOF
 #============================#==#=========#============#
 
 1.2 NPAR TESTS.  Test Statistics
-#=====================#==============#
-#                     #second - first#
-#=====================#==============#
-#Z                    #          -.18#
-#Asymp. Sig (2-tailed)#           .86#
-#Exact Sig (2-tailed) #           .89#
-#Exact Sig (1-tailed) #           .45#
-#=====================#==============#
+#======================#==============#
+#                      #second - first#
+#======================#==============#
+#Z                     #          -.18#
+#Asymp. Sig. (2-tailed)#           .86#
+#Exact Sig. (2-tailed) #           .89#
+#Exact Sig. (1-tailed) #           .45#
+#======================#==============#
 
 EOF
 if [ $? -ne 0 ] ; then no_result ; fi
index a9f4bf2fb27f43b525fb764c07fb14c706d111d6..c46c268376c77031baff7e6c06fa14a44808bd65 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <ctype.h>
 #include <stdlib.h>
+#include <stdint.h>
 #include <string.h>
 
 #include <data/casereader-provider.h>
@@ -404,7 +405,7 @@ value_from_param (union value *value, int width, unsigned int idx)
   else
     {
       unsigned int hash = hash_int (idx, 0);
-      char *string = value_str_rw (value, width);
+      uint8_t *string = value_str_rw (value, width);
       int offset;
 
       assert (width < 32);
index 897d48ffb59bf26d832c1d069f4173ed1c0ee9b5..85f3644211d3171423239c59b14ab7136f28b36a 100644 (file)
@@ -583,13 +583,18 @@ read_machine_float_info (struct sfm_reader *r, size_t size, size_t count)
 
   printf ("\tsysmis: %g\n", sysmis);
   if (sysmis != SYSMIS)
-    sys_warn (r, _("File specifies unexpected value %g as SYSMIS."), sysmis);
+    sys_warn (r, _("File specifies unexpected value %g as %s."),
+              sysmis, "SYSMIS");
+
   printf ("\thighest: %g\n", highest);
   if (highest != HIGHEST)
-    sys_warn (r, _("File specifies unexpected value %g as HIGHEST."), highest);
+    sys_warn (r, _("File specifies unexpected value %g as %s."),
+              highest, "HIGHEST");
+
   printf ("\tlowest: %g\n", lowest);
   if (lowest != LOWEST)
-    sys_warn (r, _("File specifies unexpected value %g as LOWEST."), lowest);
+    sys_warn (r, _("File specifies unexpected value %g as %s."),
+              lowest, "LOWEST");
 }
 
 /* Read record type 7, subtype 11. */