sys-file-reader: Add tests.
authorBen Pfaff <blp@cs.stanford.edu>
Fri, 4 Feb 2011 04:41:40 +0000 (20:41 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Fri, 4 Feb 2011 04:41:40 +0000 (20:41 -0800)
Smake
configure.ac
doc/dev/system-file-format.texi
tests/atlocal.in
tests/automake.mk
tests/data/sack.c [new file with mode: 0644]
tests/data/sys-file-reader.at [new file with mode: 0644]

diff --git a/Smake b/Smake
index 014208b25b5241390e8c2a775659bceacfaab0fb..763e996979d8c9705a680ac7e5a05733260a2fd2 100644 (file)
--- a/Smake
+++ b/Smake
@@ -15,6 +15,7 @@ GNULIB_MODULES = \
        count-one-bits \
        crc \
        crypto/md4 \
+       crypto/md5 \
        dirname \
        environ \
        fatal-signal \
index fa1f26ca99b70f867f4c7452356a71814149db5a..7bdd87f073756d61c3bb6d2192de2a6057a77482 100644 (file)
@@ -303,6 +303,10 @@ gl_INIT
 
 AC_C_INLINE
 
+AC_CHECK_SIZEOF([size_t])
+SIZEOF_SIZE_T=$ac_cv_sizeof_size_t
+AC_SUBST([SIZEOF_SIZE_T])
+
 AC_C_BIGENDIAN
 
 AC_CHECK_FUNCS([__setfpucw fork execl execlp isinf isnan finite getpid feholdexcept fpsetmask popen round])
index 972b1331b4fb0f0be54ff7b2118f8bb204a71293..1c3e4349c79380edf70b7d1ced83cafecf6f148e 100644 (file)
@@ -774,8 +774,8 @@ Ordinal Scale
 Continuous Scale
 @end table
 
-SPSS 14 sometimes writes a @code{measure} of 0.  PSPP interprets this
-as nominal scale.
+SPSS 14 sometimes writes a @code{measure} of 0 for string variables.
+PSPP interprets this as nominal scale.
 
 @item int32 width;
 The width of the display column for the variable in characters.
index e64a08e4e2fb2275122183c7d57578e9017ae004..9b54a705b4755cbda91b9f46ddce34b1e589a62b 100644 (file)
@@ -6,6 +6,7 @@ GNM_SUPPORT='@GNM_SUPPORT@'
 PERL='@PERL@'
 WITH_PERL_MODULE='@WITH_PERL_MODULE@'
 host='@host@'
+SIZEOF_SIZE_T='@SIZEOF_SIZE_T@'
 
 PSQL_SUPPORT='@PSQL_SUPPORT@'
 if test "$PSQL_SUPPORT" = yes; then
index e17efd15df1e4fd90376681e9feea6b5116910be..0ea5de5cf58f97f8f135cb491d03644f6f54a34b 100644 (file)
@@ -2,6 +2,7 @@
 
 check_PROGRAMS += \
        tests/data/datasheet-test \
+       tests/data/sack \
        tests/data/inexactify \
        tests/language/lexer/command-name-test \
        tests/libpspp/abt-test \
@@ -29,6 +30,11 @@ tests_data_datasheet_test_SOURCES = \
 tests_data_datasheet_test_LDADD = src/libpspp-core.la $(LIBINTL) 
 tests_data_datasheet_test_CFLAGS = $(AM_CFLAGS)
 
+tests_data_sack_SOURCES = \
+       tests/data/sack.c
+tests_data_sack_LDADD = src/libpspp-core.la $(LIBINTL) 
+tests_data_sack_CFLAGS = $(AM_CFLAGS)
+
 tests_libpspp_ll_test_SOURCES = \
        src/libpspp/ll.c \
        tests/libpspp/ll-test.c
@@ -236,6 +242,7 @@ TESTSUITE_AT = \
        tests/data/datasheet-test.at \
        tests/data/format-guesser.at \
        tests/data/por-file.at \
+       tests/data/sys-file-reader.at \
        tests/data/sys-file.at \
        tests/language/command.at \
        tests/language/control/do-if.at \
diff --git a/tests/data/sack.c b/tests/data/sack.c
new file mode 100644 (file)
index 0000000..ace153c
--- /dev/null
@@ -0,0 +1,499 @@
+/* PSPP - a program for statistical analysis.
+   Copyright (C) 2011 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
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <float.h>
+#include <getopt.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "libpspp/assertion.h"
+#include "libpspp/compiler.h"
+#include "libpspp/float-format.h"
+#include "libpspp/integer-format.h"
+
+#include "gl/error.h"
+#include "gl/md5.h"
+#include "gl/intprops.h"
+#include "gl/progname.h"
+#include "gl/xalloc.h"
+
+struct buffer
+  {
+    uint8_t *data;
+    size_t size;
+    size_t allocated;
+  };
+
+static void buffer_put (struct buffer *, const void *, size_t);
+static void *buffer_put_uninit (struct buffer *, size_t);
+
+enum token_type
+  {
+    T_EOF,
+    T_INTEGER,
+    T_FLOAT,
+    T_STRING,
+    T_SEMICOLON,
+    T_ASTERISK,
+    T_LPAREN,
+    T_RPAREN,
+    T_I8,
+    T_S,
+    T_COUNT
+  };
+
+static enum token_type token;
+static unsigned long int tok_integer;
+static double tok_float;
+static char *tok_string;
+static size_t tok_strlen, tok_allocated;
+
+/* --be, --le: Integer and floating-point formats. */
+static enum float_format float_format = FLOAT_IEEE_DOUBLE_BE;
+static enum integer_format integer_format = INTEGER_MSB_FIRST;
+
+/* Input file and current position. */
+static FILE *input;
+static const char *input_file_name;
+static int line_number;
+
+static void PRINTF_FORMAT (1, 2)
+fatal (const char *message, ...)
+{
+  va_list args;
+
+  fprintf (stderr, "%s:%d: ", input_file_name, line_number);
+  va_start (args, message);
+  vfprintf (stderr, message, args);
+  va_end (args);
+  putc ('\n', stderr);
+
+  exit (EXIT_FAILURE);
+}
+
+static void
+add_char (int c)
+{
+  if (tok_strlen >= tok_allocated)
+    tok_string = x2realloc (tok_string, &tok_allocated);
+
+  tok_string[tok_strlen++] = c;
+}
+
+static void
+get_token (void)
+{
+  int c;
+
+  do
+    {
+      c = getc (input);
+      if (c == '#')
+        {
+          while ((c = getc (input)) != '\n' && c != EOF)
+            continue;
+        }
+      if (c == '\n')
+        line_number++;
+    }
+  while (isspace (c) || c == '<' || c == '>');
+
+  tok_strlen = 0;
+  if (c == EOF)
+    {
+      if (token == T_EOF)
+        fatal ("unexpected end of input");
+      token = T_EOF;
+    }
+  else if (isdigit (c) || c == '-')
+    {
+      char *tail;
+
+      do
+        {
+          add_char (c);
+          c = getc (input);
+        }
+      while (isdigit (c) || isalpha (c) || c == '.');
+      add_char ('\0');
+      ungetc (c, input);
+
+      errno = 0;
+      if (strchr (tok_string, '.') == NULL)
+        {
+          token = T_INTEGER;
+          tok_integer = strtoul (tok_string, &tail, 0);
+        }
+      else
+        {
+          token = T_FLOAT;
+          tok_float = strtod (tok_string, &tail);
+        }
+      if (errno || *tail)
+        fatal ("invalid numeric syntax");
+    }
+  else if (c == '"')
+    {
+      token = T_STRING;
+      while ((c = getc (input)) != '"')
+        {
+          if (c == '\n')
+            fatal ("new-line inside string");
+          add_char (c);
+        }
+    }
+  else if (c == ';')
+    token = T_SEMICOLON;
+  else if (c == '*')
+    token = T_ASTERISK;
+  else if (c == '(')
+    token = T_LPAREN;
+  else if (c == ')')
+    token = T_RPAREN;
+  else if (isalpha (c))
+    {
+      do
+        {
+          add_char (c);
+          c = getc (input);
+        }
+      while (isdigit (c) || isalpha (c) || c == '.');
+      add_char ('\0');
+      ungetc (c, input);
+
+      if (!strcmp (tok_string, "i8"))
+        token = T_I8;
+      else if (tok_string[0] == 's')
+        {
+          token = T_S;
+          tok_integer = atoi (tok_string + 1);
+        }
+      else if (!strcmp (tok_string, "SYSMIS"))
+        {
+          token = T_FLOAT;
+          tok_float = -DBL_MAX;
+        }
+      else if (!strcmp (tok_string, "LOWEST"))
+        {
+          token = T_FLOAT;
+          tok_float = float_get_lowest ();
+        }
+      else if (!strcmp (tok_string, "HIGHEST"))
+        {
+          token = T_FLOAT;
+          tok_float = DBL_MAX;
+        }
+      else if (!strcmp (tok_string, "ENDIAN"))
+        {
+          token = T_INTEGER;
+          tok_integer = integer_format == INTEGER_MSB_FIRST ? 1 : 2;
+        }
+      else if (!strcmp (tok_string, "COUNT"))
+        token = T_COUNT;
+      else
+        fatal ("invalid token `%s'", tok_string);
+    }
+  else
+    fatal ("invalid input byte `%c'", c);
+}
+
+static void
+buffer_put (struct buffer *buffer, const void *data, size_t n)
+{
+  memcpy (buffer_put_uninit (buffer, n), data, n);
+}
+
+static void *
+buffer_put_uninit (struct buffer *buffer, size_t n)
+{
+  buffer->size += n;
+  if (buffer->size > buffer->allocated)
+    {
+      buffer->allocated = buffer->size * 2;
+      buffer->data = xrealloc (buffer->data, buffer->allocated);
+    }
+  return &buffer->data[buffer->size - n];
+}
+
+static void
+usage (void)
+{
+  printf ("\
+%s, SAv Construction Kit\n\
+usage: %s [OPTIONS] INPUT\n\
+\nOptions:\n\
+  --be     big-endian output format (default)\n\
+  --le     little-endian output format\n\
+  --help   print this help message and exit\n\
+\n\
+The input is a sequence of data items, each followed by a semicolon.\n\
+Each data item is converted to the output format and written on\n\
+stdout.  A data item is one of the following\n\
+\n\
+  - An integer in decimal, in hexadecimal prefixed by 0x, or in octal\n\
+    prefixed by 0.  Output as a 32-bit binary integer.\n\
+\n\
+  - A floating-point number.  Output in 64-bit IEEE 754 format.\n\
+\n\
+  - A string enclosed in double quotes.  Output literally.  There is\n\
+    no syntax for \"escapes\".  Strings may not contain new-lines.\n\
+\n\
+  - A literal of the form s<number> followed by a quoted string as\n\
+    above.  Output as the string's contents followed by enough spaces\n\
+    to fill up <number> bytes.  For example, s8 \"foo\" is output as\n\
+    the \"foo\" followed by 5 spaces.\n\
+\n\
+  - The literal \"i8\" followed by an integer.  Output as a single\n\
+    byte with the specified value.\n\
+\n\
+  - One of the literals SYSMIS, LOWEST, or HIGHEST.  Output as a\n\
+    64-bit IEEE 754 float of the appropriate PSPP value.\n\
+\n\
+  - The literal ENDIAN.  Output as a 32-bit binary integer, either\n\
+    with value 1 if --be is in effect or 2 if --le is in effect.\n\
+\n\
+  - A pair of parentheses enclosing a sequence of data items, each\n\
+    followed by a semicolon (the last semicolon is optional).\n\
+    Output as the enclosed data items in sequence.\n\
+\n\
+  - The literal COUNT followed by a sequence of parenthesized data\n\
+    items, as above.  Output as a 32-bit binary integer whose value\n\
+    is the number of bytes enclosed within the parentheses, followed\n\
+    by the enclosed data items themselves.\n\
+\n\
+optionally followed by an asterisk and a positive integer, which\n\
+specifies a repeat count for the data item.\n\
+\n\
+The md5sum of the data written to stdout is written to stderr as\n\
+16 hexadecimal digits followed by a new-line.\n",
+          program_name, program_name);
+  exit (EXIT_SUCCESS);
+}
+
+static const char *
+parse_options (int argc, char **argv)
+{
+  for (;;)
+    {
+      enum {
+        OPT_BE = UCHAR_MAX + 1,
+        OPT_LE,
+        OPT_HELP
+      };
+      static const struct option options[] =
+        {
+          {"be", no_argument, NULL, OPT_BE},
+          {"le", no_argument, NULL, OPT_LE},
+          {"help", no_argument, NULL, OPT_HELP},
+          {NULL, 0, NULL, 0},
+        };
+
+      int c = getopt_long (argc, argv, "", options, NULL);
+      if (c == -1)
+        break;
+
+      switch (c)
+        {
+        case OPT_BE:
+          float_format = FLOAT_IEEE_DOUBLE_BE;
+          integer_format = INTEGER_MSB_FIRST;
+          break;
+
+        case OPT_LE:
+          float_format = FLOAT_IEEE_DOUBLE_LE;
+          integer_format = INTEGER_LSB_FIRST;
+          break;
+
+        case OPT_HELP:
+          usage ();
+
+        case 0:
+          break;
+
+        case '?':
+          exit (EXIT_FAILURE);
+          break;
+
+        default:
+          NOT_REACHED ();
+        }
+
+    }
+
+  if (optind + 1 != argc)
+    error (1, 0, "exactly one non-option argument required; "
+           "use --help for help");
+  return argv[optind];
+}
+
+static void
+parse_data_item (struct buffer *output)
+{
+  size_t old_size = output->size;
+
+  if (token == T_INTEGER)
+    {
+      integer_put (tok_integer, integer_format,
+                   buffer_put_uninit (output, 4), 4);
+      get_token ();
+    }
+  else if (token == T_FLOAT)
+    {
+      float_convert (FLOAT_NATIVE_DOUBLE, &tok_float,
+                     float_format, buffer_put_uninit (output, 8));
+      get_token ();
+    }
+  else if (token == T_I8)
+    {
+      uint8_t byte;
+
+      get_token ();
+      do
+        {
+          if (token != T_INTEGER)
+            fatal ("integer expected after `i8'");
+          byte = tok_integer;
+          buffer_put (output, &byte, 1);
+          get_token ();
+        }
+      while (token == T_INTEGER);
+    }
+  else if (token == T_STRING)
+    {
+      buffer_put (output, tok_string, tok_strlen);
+      get_token ();
+    }
+  else if (token == T_S)
+    {
+      int n;
+
+      n = tok_integer;
+      get_token ();
+
+      if (token != T_STRING)
+        fatal ("string expected");
+      if (tok_strlen > n)
+        fatal ("%zu-byte string is longer than pad length %d",
+               tok_strlen, n);
+
+      buffer_put (output, tok_string, tok_strlen);
+      memset (buffer_put_uninit (output, n - tok_strlen), ' ',
+              n - tok_strlen);
+      get_token ();
+    }
+  else if (token == T_LPAREN)
+    {
+      get_token ();
+
+      while (token != T_RPAREN)
+        parse_data_item (output);
+
+      get_token ();
+    }
+  else if (token == T_COUNT)
+    {
+      buffer_put_uninit (output, 4);
+
+      get_token ();
+      if (token != T_LPAREN)
+        fatal ("`(' expected after COUNT");
+      get_token ();
+
+      while (token != T_RPAREN)
+        parse_data_item (output);
+      get_token ();
+
+      integer_put (output->size - old_size - 4, integer_format,
+                   output->data + old_size, 4);
+    }
+  else
+    fatal ("syntax error");
+
+  if (token == T_ASTERISK)
+    {
+      size_t n = output->size - old_size;
+      char *p;
+
+      get_token ();
+
+      if (token != T_INTEGER || tok_integer < 1)
+        fatal ("positive integer expected after `*'");
+      p = buffer_put_uninit (output, (tok_integer - 1) * n);
+      while (--tok_integer > 0)
+        {
+          memcpy (p, output->data + old_size, n);
+          p += n;
+        }
+
+      get_token ();
+    }
+
+  if (token == T_SEMICOLON)
+    get_token ();
+  else if (token != T_RPAREN)
+    fatal ("`;' expected");
+}
+
+int
+main (int argc, char **argv)
+{
+  struct buffer output;
+  uint8_t digest[16];
+  int i;
+
+  set_program_name (argv[0]);
+  input_file_name = parse_options (argc, argv);
+
+  if (!strcmp (input_file_name, "-"))
+    input = stdin;
+  else
+    {
+      input = fopen (input_file_name, "r");
+      if (input == NULL)
+        error (1, errno, "%s: open failed", input_file_name);
+    }
+
+  if (isatty (STDOUT_FILENO))
+    error (1, 0, "not writing binary data to a terminal; redirect to a file");
+
+  output.data = NULL;
+  output.size = 0;
+  output.allocated = 0;
+
+  line_number = 1;
+  get_token ();
+  while (token != T_EOF)
+    parse_data_item (&output);
+
+  if (input != stdin)
+    fclose (input);
+
+  fwrite (output.data, output.size, 1, stdout);
+
+  md5_buffer ((const char *) output.data, output.size, digest);
+  for (i = 0; i < sizeof digest; i++)
+    fprintf (stderr, "%02x", digest[i]);
+  putc ('\n', stderr);
+
+  return 0;
+}
diff --git a/tests/data/sys-file-reader.at b/tests/data/sys-file-reader.at
new file mode 100644 (file)
index 0000000..cb9abd3
--- /dev/null
@@ -0,0 +1,3315 @@
+AT_BANNER([system file reader - positive])
+
+AT_SETUP([variable labels and missing values])
+AT_KEYWORDS([sack synthetic system file positive])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; dnl Layout code
+22; dnl Nominal case size
+0; dnl Not compressed
+0; dnl Not weighted 
+1; dnl 1 case.
+100.0; dnl Bias.
+"01 Jan 11"; "20:53:52"; s64 "PSPP synthetic test file";
+i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Numeric variable, variable label.
+2; 0; 1; 0; 0x050800 *2; s8 "NUM2";
+26; "Numeric variable 2's label"; i8 0 *2;
+
+dnl Numeric variable, one missing value.
+2; 0; 0; 1; 0x050800 *2; s8 "NUM3";
+1.0;
+
+dnl Numeric variable, variable label and missing value.
+2; 0; 1; 1; 0x050800 *2; s8 "NUM4";
+30; "Another numeric variable label"; i8 0 * 2;
+1.0;
+
+dnl Numeric variable, two missing values.
+2; 0; 0; 2; 0x050800 *2; s8 "NUM5"; 1.0; 2.0;
+
+dnl Numeric variable, three missing values.
+2; 0; 0; 3; 0x050800 *2; s8 "NUM6"; 1.0; 2.0; 3.0;
+
+dnl Numeric variable, range of missing values.
+2; 0; 0; -2; 0x050800 *2; s8 "NUM7"; 1.0; 3.0;
+
+dnl Numeric variables, range of missing values plus discrete value.
+2; 0; 0; -3; 0x050800 *2; s8 "NUM8"; 1.0; 3.0; 5.0;
+2; 0; 0; -3; 0x050800 *2; s8 "NUM9"; 1.0; HIGHEST; -5.0;
+2; 0; 0; -3; 0x050800 *2; s8 "NUM10"; LOWEST; 1.0; 5.0;
+
+dnl String variable, no label or missing values.
+2; 4; 0; 0; 0x010400 *2; s8 "STR1";
+
+dnl String variable, variable label.
+2; 4; 1; 0; 0x010400 *2; s8 "STR2";
+25; "String variable 2's label"; i8 0 * 3;
+
+dnl String variable, one missing value.
+2; 4; 0; 1; 0x010400 *2; s8 "STR3"; s8 "MISS";
+
+dnl String variable, variable label and missing value.
+2; 4; 1; 1; 0x010400 *2; s8 "STR4";
+29; "Another string variable label"; i8 0 * 3;
+s8 "OTHR";
+
+dnl String variable, two missing values.
+2; 4; 0; 2; 0x010400 *2; s8 "STR5"; s8 "MISS"; s8 "OTHR";
+
+dnl String variable, three missing values.
+2; 4; 0; 3; 0x010400 *2; s8 "STR6"; s8 "MISS"; s8 "OTHR"; s8 "MORE";
+
+dnl Long string variable, one missing value.
+2; 11; 0; 1; 0x010b00 *2; s8 "STR7"; "first8by";
+2; -1; 0; 0; 0; 0; s8 "";
+
+dnl Long string variable, value label.
+2; 25; 1; 0; 0x011900 *2; s8 "STR8"; 14; "25-byte string"; i8 0 * 2;
+( 2; -1; 0; 0; 0; 0; s8 ""; ) * 2;
+dnl Variable label fields on continuation records have been spotted in system
+dnl files created by "SPSS Power Macintosh Release 6.1".
+2; -1; 1; 0; 0; 0; s8 ""; 20; "dummy variable label";
+
+dnl Machine integer info record.
+7; 3; 4; 8; 1; 2; 3; -1; 1; 1; ENDIAN; 1252;
+
+dnl Machine floating-point info record.
+7; 4; 8; 3; SYSMIS; HIGHEST; LOWEST;
+
+dnl Character encoding record.
+7; 20; 1; 12; "windows-1252";
+
+dnl Dictionary termination record.
+999; 0;
+
+dnl Data.
+1.0; 2.0; 3.0; 4.0; 5.0; 6.0; 7.0; 8.0; 9.0; 10.0;
+s8 "abcd"; s8 "efgh"; s8 "ijkl"; s8 "mnop"; s8 "qrst"; s8 "uvwx";
+s16 "yzABCDEFGHI"; s32 "JKLMNOPQRSTUVWXYZ01234567";
+])
+for variant in \
+       "be e07ee28eaf7bceca017e83e9fd46be3c" \
+       "le c357aa20227c856b8a80d1b840722da1"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+DISPLAY DICTIONARY.
+LIST.
+])
+  AT_CHECK([pspp -o pspp.csv sys-file.sps])
+  AT_CHECK([grep -v Measure pspp.csv | grep -v Display], [0], [dnl
+Variable,Description,,Position
+num1,Format: F8.0,,1
+num2,Numeric variable 2's label,,2
+,Format: F8.0,,
+num3,Format: F8.0,,3
+,Missing Values: 1,,
+num4,Another numeric variable label,,4
+,Format: F8.0,,
+,Missing Values: 1,,
+num5,Format: F8.0,,5
+,Missing Values: 1; 2,,
+num6,Format: F8.0,,6
+,Missing Values: 1; 2; 3,,
+num7,Format: F8.0,,7
+,Missing Values: 1 THRU 3,,
+num8,Format: F8.0,,8
+,Missing Values: 1 THRU 3; 5,,
+num9,Format: F8.0,,9
+,Missing Values: 1 THRU HIGHEST; -5,,
+num10,Format: F8.0,,10
+,Missing Values: LOWEST THRU 1; 5,,
+str1,Format: A4,,11
+str2,String variable 2's label,,12
+,Format: A4,,
+str3,Format: A4,,13
+,"Missing Values: ""MISS""",,
+str4,Another string variable label,,14
+,Format: A4,,
+,"Missing Values: ""OTHR""",,
+str5,Format: A4,,15
+,"Missing Values: ""MISS""; ""OTHR""",,
+str6,Format: A4,,16
+,"Missing Values: ""MISS""; ""OTHR""; ""MORE""",,
+str7,Format: A11,,17
+,"Missing Values: ""first8by""",,
+str8,25-byte string,,18
+,Format: A25,,
+
+Table: Data List
+num1,num2,num3,num4,num5,num6,num7,num8,num9,num10,str1,str2,str3,str4,str5,str6,str7,str8
+1,2,3,4,5,6,7,8,9,10,abcd,efgh,ijkl,mnop,qrst,uvwx,yzABCDEFGHI,JKLMNOPQRSTUVWXYZ01234567
+])
+done
+AT_CLEANUP
+
+AT_SETUP([unspecified number of variable positions])
+AT_KEYWORDS([sack synthetic system file positive])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; dnl Layout code
+-1; dnl Nominal case size (unspecified)
+0; dnl Not compressed
+0; dnl Not weighted 
+1; dnl 1 case.
+100.0; dnl Bias.
+"01 Jan 11"; "20:53:52"; s64 "PSPP synthetic test file";
+i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Numeric variable, variable label.
+2; 0; 1; 0; 0x050800 *2; s8 "NUM2";
+26; "Numeric variable 2's label"; i8 0 *2;
+
+dnl Dictionary termination record.
+999; 0;
+
+dnl Data.
+1.0; 2.0; 
+])
+for variant in \
+       "be 413e7bc80a47fcd7e4c8020e8e120060" \
+       "le d7db9120b1ff28c83aa6fe9fc405d903"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+DISPLAY DICTIONARY.
+LIST.
+])
+  AT_CHECK([pspp -o pspp.csv sys-file.sps])
+  AT_CHECK([grep -v Measure pspp.csv | grep -v Display], [0], [dnl
+Variable,Description,,Position
+num1,Format: F8.0,,1
+num2,Numeric variable 2's label,,2
+,Format: F8.0,,
+
+Table: Data List
+num1,num2
+1,2
+])
+done
+AT_CLEANUP
+
+AT_SETUP([wrong number of variable positions but version 13])
+AT_KEYWORDS([sack synthetic system file positive])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; dnl Layout code
+-1; dnl Nominal case size (unspecified)
+0; dnl Not compressed
+0; dnl Not weighted 
+1; dnl 1 case.
+100.0; dnl Bias.
+"01 Jan 11"; "20:53:52"; s64 "PSPP synthetic test file";
+i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Numeric variable, variable label.
+2; 0; 1; 0; 0x050800 *2; s8 "NUM2";
+26; "Numeric variable 2's label"; i8 0 *2;
+
+dnl Machine integer info record (SPSS 13).
+7; 3; 4; 8; 13; 2; 3; -1; 1; 1; ENDIAN; 1252;
+
+dnl Dictionary termination record.
+999; 0;
+
+dnl Data.
+1.0; 2.0; 
+])
+for variant in \
+       "be 3d17aae7d99538dc73c5cb42692b1038" \
+       "le 8ad1000df598617d5258f323c882d749"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+DISPLAY DICTIONARY.
+LIST.
+])
+  AT_CHECK([pspp -o pspp.csv sys-file.sps])
+  AT_CHECK([grep -v Measure pspp.csv | grep -v Display], [0], [dnl
+Variable,Description,,Position
+num1,Format: F8.0,,1
+num2,Numeric variable 2's label,,2
+,Format: F8.0,,
+
+Table: Data List
+num1,num2
+1,2
+])
+done
+AT_CLEANUP
+
+AT_SETUP([value labels])
+AT_KEYWORDS([sack synthetic system file positive])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; dnl Layout code
+22; dnl Nominal case size
+0; dnl Not compressed
+0; dnl Not weighted 
+1; dnl 1 case.
+100.0; dnl Bias.
+"01 Jan 11"; "20:53:52"; s64 "PSPP synthetic test file";
+i8 0 *3;
+
+dnl Numeric variables.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+2; 0; 0; 0; 0x050800 *2; s8 "NUM2";
+2; 0; 0; 0; 0x050800 *2; s8 "NUM3";
+2; 0; 0; 0; 0x050800 *2; s8 "NUM4";
+2; 0; 0; 0; 0x050800 *2; s8 "NUM5";
+
+dnl String variables.
+2; 1; 0; 0; 0x010100 *2; s8 "STR1"; dnl index 6
+2; 2; 0; 0; 0x010200 *2; s8 "STR2"; dnl index 7
+2; 3; 0; 0; 0x010300 *2; s8 "STR3"; dnl index 8
+2; 4; 0; 0; 0x010400 *2; s8 "STR4"; dnl index 9
+2; 4; 0; 0; 0x010400 *2; s8 "STR5"; dnl index 10
+2; 6; 0; 0; 0x010600 *2; s8 "STR6"; dnl index 11
+2; 7; 0; 0; 0x010700 *2; s8 "STR7"; dnl index 12
+2; 8; 0; 0; 0x010800 *2; s8 "STR8"; dnl index 13
+2; 9; 0; 0; 0x010900 *2; s8 "STR9"; dnl index 14
+2; -1; 0; 0; 0; 0; s8 "";
+2; 12; 0; 0; 0x010c00 *2; s8 "STR12"; dnl index 16
+2; -1; 0; 0; 0; 0; s8 "";
+2; 16; 0; 0; 0x011000 *2; s8 "STR16"; dnl index 18
+2; -1; 0; 0; 0; 0; s8 "";
+2; 17; 0; 0; 0x011100 *2; s8 "STR17"; dnl index 20
+( 2; -1; 0; 0; 0; 0; s8 ""; ) * 2;
+
+dnl One value label for NUM1.
+3; 1; 1.0; i8 3; s7 "one"; 4; 1; 1;
+
+dnl Two value labels for NUM2, as a single pair of type 3 and type 4 records.
+3; 2; 1.0; i8 3; s7 "one"; 2.0; i8 3; s7 "two"; 4; 1; 2;
+
+dnl Two value labels for NUM3, as two pairs of type 3 and type 4 records.
+3; 1; 3.0; i8 5; s7 "three"; 4; 1; 3;
+3; 1; 4.0; i8 4; s7 "four"; 4; 1; 3;
+
+dnl Two common value labels for NUM4 and NUM5, plus two different ones for each.
+3; 1; 5.0; i8 4; s7 "five"; 4; 1; 4;
+3; 1; 6.0; i8 3; s7 "six"; 4; 1; 5;
+3; 2; 7.0; i8 5; s7 "seven"; 8.0; i8 5; s7 "eight"; 4; 2; 4; 5;
+3; 1; 9.0; i8 4; s7 "nine"; 4; 1; 4;
+3; 1; 10.0; i8 3; s7 "ten"; 4; 1; 5;
+
+dnl One value label for STR1.
+3; 1; s8 "a"; i8 19; s23 "value label for `a'"; 4; 1; 6;
+
+dnl Two value labels for STR2, as a single pair of type 3 and type 4 records.
+3; 2;
+s8 "bc"; i8 20; s23 "value label for `bc'";
+s8 "de"; i8 20; s23 "value label for `de'";
+4; 1; 7;
+
+dnl Two value labels for STR3, as two pairs of type 3 and type 4 records.
+3; 1; s8 "fgh"; i8 21; s23 "value label for `fgh'"; 4; 1; 8;
+3; 1; s8 "ijk"; i8 21; s23 "value label for `ijk'"; 4; 1; 8;
+
+dnl Two common value labels for STR4 and STR5, plus two different ones for each.
+3; 1; s8 "lmno"; i8 22; s23 "value label for `lmno'"; 4; 1; 9;
+3; 1; s8 "pqrs"; i8 22; s23 "value label for `pqrs'"; 4; 1; 10;
+3; 2;
+s8 "tuvw"; i8 22; s23 "value label for `tuvw'";
+s8 "xyzA"; i8 22; s23 "value label for `xyzA'";
+4; 2; 9; 10;
+3; 1; s8 "BCDE"; i8 22; s23 "value label for `BCDE'"; 4; 1; 9;
+3; 1; s8 "FGHI"; i8 22; s23 "value label for `FGHI'"; 4; 1; 10;
+
+dnl One value label for STR6, STR7, STR8.
+3; 1; s8 "JKLMNO"; i8 24; s31 "value label for `JKLMNO'"; 4; 1; 11;
+3; 1; s8 "JKLMNOP"; i8 25; s31 "value label for `JKLMNOP'"; 4; 1; 12;
+3; 1; s8 "JKLMNOPQ"; i8 26; s31 "value label for `JKLMNOPQ'"; 4; 1; 13;
+
+7; 21; 1; COUNT (
+dnl One value label for STR9,
+COUNT("STR9"); 9; 1; COUNT("RSTUVWXYZ"); COUNT("value label for `RSTUVWXYZ'");
+
+dnl Two value labels for STR12.
+COUNT("STR12"); 12; 2;
+COUNT("0123456789ab"); COUNT("value label for `0123456789ab'");
+COUNT("cdefghijklmn"); COUNT("value label for `cdefghijklmn'");
+
+dnl Three value labels for STR16.
+COUNT("STR16"); 16; 3;
+COUNT("opqrstuvwxyzABCD"); COUNT("value label for `opqrstuvwxyzABCD'");
+COUNT("EFGHIJKLMNOPQRST"); COUNT("value label for `EFGHIJKLMNOPQRST'");
+COUNT("UVWXYZ0123456789"); COUNT("value label for `UVWXYZ0123456789'");
+
+dnl One value label for STR17.
+COUNT("STR17"); 17; 1;
+COUNT("abcdefghijklmnopq"); COUNT("value label for `abcdefghijklmnopq'");
+);
+
+dnl Dictionary termination record.
+999; 0;
+])
+for variant in \
+       "be 1de55cc9fb523c8f9b014cdc5387c12b" \
+       "le 76a6974012df7351b591c5964c41e582"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+DISPLAY DICTIONARY.
+])
+  AT_CHECK([pspp -o pspp.csv sys-file.sps])
+  AT_CHECK([grep -v Measure pspp.csv | grep -v Display], [0], [dnl
+Variable,Description,,Position
+num1,Format: F8.0,,1
+,1,one,
+num2,Format: F8.0,,2
+,1,one,
+,2,two,
+num3,Format: F8.0,,3
+,3,three,
+,4,four,
+num4,Format: F8.0,,4
+,5,five,
+,7,seven,
+,8,eight,
+,9,nine,
+num5,Format: F8.0,,5
+,6,six,
+,7,seven,
+,8,eight,
+,10,ten,
+str1,Format: A1,,6
+,a,value label for `a',
+str2,Format: A2,,7
+,bc,value label for `bc',
+,de,value label for `de',
+str3,Format: A3,,8
+,fgh,value label for `fgh',
+,ijk,value label for `ijk',
+str4,Format: A4,,9
+,BCDE,value label for `BCDE',
+,lmno,value label for `lmno',
+,tuvw,value label for `tuvw',
+,xyzA,value label for `xyzA',
+str5,Format: A4,,10
+,FGHI,value label for `FGHI',
+,pqrs,value label for `pqrs',
+,tuvw,value label for `tuvw',
+,xyzA,value label for `xyzA',
+str6,Format: A6,,11
+,JKLMNO,value label for `JKLMNO',
+str7,Format: A7,,12
+,JKLMNOP,value label for `JKLMNOP',
+str8,Format: A8,,13
+,JKLMNOPQ,value label for `JKLMNOPQ',
+str9,Format: A9,,14
+,RSTUVWXYZ,value label for `RSTUVWXYZ',
+str12,Format: A12,,15
+,0123456789ab,value label for `0123456789ab',
+,cdefghijklmn,value label for `cdefghijklmn',
+str16,Format: A16,,16
+,EFGHIJKLMNOPQRST,value label for `EFGHIJKLMNOPQRST',
+,UVWXYZ0123456789,value label for `UVWXYZ0123456789',
+,opqrstuvwxyzABCD,value label for `opqrstuvwxyzABCD',
+str17,Format: A17,,17
+,abcdefghijklmnopq,value label for `abcdefghijklmnopq',
+])
+done
+AT_CLEANUP
+
+AT_SETUP([documents])
+AT_KEYWORDS([sack synthetic system file positive])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; dnl Layout code
+1; dnl Nominal case size
+0; dnl Not compressed
+0; dnl Not weighted 
+1; dnl 1 case.
+100.0; dnl Bias.
+"01 Jan 11"; "20:53:52"; s64 "PSPP synthetic test file";
+i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Document record.
+6; 4;
+s80 "First line of documents";
+s80 "Second line of documents";
+s80 "";
+s80 "Last line of documents";
+
+dnl Dictionary termination record.
+999; 0;
+
+dnl Data.
+1.0;
+])
+for variant in \
+       "be 8738124d7932cc8ff803142fbf38710b" \
+       "le f3ca2123ec9e8bda91c6b865ba39f506"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+DISPLAY DOCUMENTS.
+LIST.
+])
+  AT_CHECK([pspp -o pspp.csv sys-file.sps])
+  AT_CHECK([cat pspp.csv], [0], [dnl
+Documents in the active file:
+
+First line of documents
+
+Second line of documents
+
+
+
+Last line of documents
+
+Table: Data List
+num1
+1
+])
+done
+AT_CLEANUP
+
+AT_SETUP([multiple response sets])
+AT_KEYWORDS([sack synthetic system file positive])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; dnl Layout code
+16; dnl Nominal case size
+0; dnl Not compressed
+0; dnl Not weighted 
+0; dnl No cases.
+100.0; dnl Bias.
+"01 Jan 11"; "20:53:52"; s64 "PSPP synthetic test file";
+i8 0 *3;
+
+dnl $a
+2; 0; 0; 0; 0x050800 *2; s8 "A";
+2; 0; 0; 0; 0x050800 *2; s8 "B";
+2; 0; 0; 0; 0x050800 *2; s8 "C";
+
+dnl $b
+2; 0; 0; 0; 0x050800 *2; s8 "D";
+2; 0; 0; 0; 0x050800 *2; s8 "E";
+2; 0; 0; 0; 0x050800 *2; s8 "F";
+2; 0; 0; 0; 0x050800 *2; s8 "G";
+
+dnl $c
+2; 3; 0; 0; 0x010300 *2; s8 "H";
+2; 3; 0; 0; 0x010300 *2; s8 "I";
+2; 3; 0; 0; 0x010300 *2; s8 "J";
+
+dnl $d
+2; 0; 0; 0; 0x050800 *2; s8 "K";
+2; 0; 0; 0; 0x050800 *2; s8 "L";
+2; 0; 0; 0; 0x050800 *2; s8 "M";
+
+dnl $e
+2; 6; 0; 0; 0x010600 *2; s8 "N";
+2; 6; 0; 0; 0x010600 *2; s8 "O";
+2; 6; 0; 0; 0x010600 *2; s8 "P";
+
+7; 7; 1;
+COUNT(
+  "$a=C 10 my mcgroup a b c"; i8 10;
+  "$b=D2 55 0  g e f d"; i8 10;
+  "$c=D3 Yes 10 mdgroup #2 h i j"; i8 10);
+
+7; 19; 1;
+COUNT(
+  "$d=E 1 2 34 13 third mdgroup k l m"; i8 10;
+  "$e=E 11 6 choice 0  n o p"; i8 10);
+
+dnl Dictionary termination record.
+999; 0;
+])
+for variant in \
+       "be 0caa3446d7a3f6985e79fd1fcc999b10" \
+       "le 9dbeba699e4149ed836f55bad7346d67"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+MRSETS /DISPLAY NAME=ALL.
+])
+  AT_CHECK([pspp -o pspp.csv sys-file.sps])
+  AT_CHECK([cat pspp.csv], [0], [dnl
+Table: Multiple Response Sets
+Name,Variables,Details
+$a,"a
+b
+c
+","Multiple category set
+Label: my mcgroup
+"
+$b,"g
+e
+f
+d
+","Multiple dichotomy set
+Counted value: 55
+Category label source: Variable labels
+"
+$c,"h
+i
+j
+","Multiple dichotomy set
+Label: mdgroup #2
+Label source: Provided by user
+Counted value: `Yes'
+Category label source: Variable labels
+"
+$d,"k
+l
+m
+","Multiple dichotomy set
+Label: third mdgroup
+Label source: Provided by user
+Counted value: 34
+Category label source: Value labels of counted value
+"
+$e,"n
+o
+p
+","Multiple dichotomy set
+Label source: First variable label among variables
+Counted value: `choice'
+Category label source: Value labels of counted value
+"
+])
+done
+AT_CLEANUP
+
+AT_SETUP([variable display parameters, without width])
+AT_KEYWORDS([sack synthetic system file positive])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; dnl Layout code
+19; dnl Nominal case size
+0; dnl Not compressed
+0; dnl Not weighted 
+0; dnl No cases.
+100.0; dnl Bias.
+"01 Jan 11"; "20:53:52"; s64 "PSPP synthetic test file";
+i8 0 *3;
+
+dnl Numeric variables.
+2; 0; 0; 0; 0x050800 *2; s8 "A";
+2; 0; 0; 0; 0x050800 *2; s8 "B";
+2; 0; 0; 0; 0x050800 *2; s8 "C";
+2; 0; 0; 0; 0x050800 *2; s8 "D";
+
+dnl Short string variables.
+2; 3; 0; 0; 0x010300 *2; s8 "H";
+2; 3; 0; 0; 0x010300 *2; s8 "I";
+2; 3; 0; 0; 0x010300 *2; s8 "J";
+2; 3; 0; 0; 0x010300 *2; s8 "K";
+
+dnl Long string variables.
+2; 9; 0; 0; 0x010900 *2; s8 "L";
+2; -1; 0; 0; 0; 0; s8 "";
+2; 10; 0; 0; 0x010a00 *2; s8 "M";
+2; -1; 0; 0; 0; 0; s8 "";
+2; 17; 0; 0; 0x011100 *2; s8 "N";
+( 2; -1; 0; 0; 0; 0; s8 "" ) * 2;
+2; 25; 0; 0; 0x011900 *2; s8 "O";
+( 2; -1; 0; 0; 0; 0; s8 "" ) * 3;
+
+dnl Variable display parameters
+7; 11; 4; 24;
+1; 0;
+2; 0;
+3; 0;
+1; 1;
+2; 1;
+3; 1;
+1; 2;
+2; 2;
+3; 2;
+0; 0;
+0; 1;
+0; 2;
+
+dnl Dictionary termination record.
+999; 0;
+])
+for variant in \
+       "be c130d9345080579b8862b360924edbfa" \
+       "le 6fde96f5a7c7386bff6cca049cd84d6a"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+DISPLAY DICTIONARY.
+])
+  AT_CHECK([pspp -o pspp.csv sys-file.sps])
+  AT_CHECK([cat pspp.csv], [0], [dnl
+Variable,Description,,Position
+a,Format: F8.0,,1
+,Measure: Nominal,,
+,Display Alignment: Left,,
+,Display Width: 8,,
+b,Format: F8.0,,2
+,Measure: Ordinal,,
+,Display Alignment: Left,,
+,Display Width: 8,,
+c,Format: F8.0,,3
+,Measure: Scale,,
+,Display Alignment: Left,,
+,Display Width: 8,,
+d,Format: F8.0,,4
+,Measure: Nominal,,
+,Display Alignment: Right,,
+,Display Width: 8,,
+h,Format: A3,,5
+,Measure: Ordinal,,
+,Display Alignment: Right,,
+,Display Width: 3,,
+i,Format: A3,,6
+,Measure: Scale,,
+,Display Alignment: Right,,
+,Display Width: 3,,
+j,Format: A3,,7
+,Measure: Nominal,,
+,Display Alignment: Center,,
+,Display Width: 3,,
+k,Format: A3,,8
+,Measure: Ordinal,,
+,Display Alignment: Center,,
+,Display Width: 3,,
+l,Format: A9,,9
+,Measure: Scale,,
+,Display Alignment: Center,,
+,Display Width: 9,,
+m,Format: A10,,10
+,Measure: Nominal,,
+,Display Alignment: Left,,
+,Display Width: 10,,
+n,Format: A17,,11
+,Measure: Nominal,,
+,Display Alignment: Right,,
+,Display Width: 17,,
+o,Format: A25,,12
+,Measure: Nominal,,
+,Display Alignment: Center,,
+,Display Width: 25,,
+])
+done
+AT_CLEANUP
+
+AT_SETUP([variable display parameters, with width])
+AT_KEYWORDS([sack synthetic system file positive])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; dnl Layout code
+19; dnl Nominal case size
+0; dnl Not compressed
+0; dnl Not weighted 
+0; dnl No cases.
+100.0; dnl Bias.
+"01 Jan 11"; "20:53:52"; s64 "PSPP synthetic test file";
+i8 0 *3;
+
+dnl Numeric variables.
+2; 0; 0; 0; 0x050800 *2; s8 "A";
+2; 0; 0; 0; 0x050800 *2; s8 "B";
+2; 0; 0; 0; 0x050800 *2; s8 "C";
+2; 0; 0; 0; 0x050800 *2; s8 "D";
+
+dnl Short string variables.
+2; 3; 0; 0; 0x010300 *2; s8 "H";
+2; 3; 0; 0; 0x010300 *2; s8 "I";
+2; 3; 0; 0; 0x010300 *2; s8 "J";
+2; 3; 0; 0; 0x010300 *2; s8 "K";
+
+dnl Long string variables.
+2; 9; 0; 0; 0x010900 *2; s8 "L";
+2; -1; 0; 0; 0; 0; s8 "";
+2; 10; 0; 0; 0x010a00 *2; s8 "M";
+2; -1; 0; 0; 0; 0; s8 "";
+2; 17; 0; 0; 0x011100 *2; s8 "N";
+( 2; -1; 0; 0; 0; 0; s8 "" ) * 2;
+2; 25; 0; 0; 0x011900 *2; s8 "O";
+( 2; -1; 0; 0; 0; 0; s8 "" ) * 3;
+
+dnl Variable display parameters
+7; 11; 4; 36;
+1; 1; 0;
+2; 2; 0;
+3; 3; 0;
+1; 4; 1;
+2; 5; 1;
+3; 6; 1;
+1; 7; 2;
+2; 8; 2;
+3; 9; 2;
+0; 10; 0;
+0; 11; 1;
+0; 12; 2;
+
+dnl Dictionary termination record.
+999; 0;
+])
+for variant in \
+       "be 3ace75689a0b7faa9360936bbfe26055" \
+       "le 6e93f35d19a9882eb53ffb1b067ef7cd"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+DISPLAY DICTIONARY.
+])
+  AT_CHECK([pspp -o pspp.csv sys-file.sps])
+  AT_CHECK([cat pspp.csv], [0], [dnl
+Variable,Description,,Position
+a,Format: F8.0,,1
+,Measure: Nominal,,
+,Display Alignment: Left,,
+,Display Width: 1,,
+b,Format: F8.0,,2
+,Measure: Ordinal,,
+,Display Alignment: Left,,
+,Display Width: 2,,
+c,Format: F8.0,,3
+,Measure: Scale,,
+,Display Alignment: Left,,
+,Display Width: 3,,
+d,Format: F8.0,,4
+,Measure: Nominal,,
+,Display Alignment: Right,,
+,Display Width: 4,,
+h,Format: A3,,5
+,Measure: Ordinal,,
+,Display Alignment: Right,,
+,Display Width: 5,,
+i,Format: A3,,6
+,Measure: Scale,,
+,Display Alignment: Right,,
+,Display Width: 6,,
+j,Format: A3,,7
+,Measure: Nominal,,
+,Display Alignment: Center,,
+,Display Width: 7,,
+k,Format: A3,,8
+,Measure: Ordinal,,
+,Display Alignment: Center,,
+,Display Width: 8,,
+l,Format: A9,,9
+,Measure: Scale,,
+,Display Alignment: Center,,
+,Display Width: 9,,
+m,Format: A10,,10
+,Measure: Nominal,,
+,Display Alignment: Left,,
+,Display Width: 10,,
+n,Format: A17,,11
+,Measure: Nominal,,
+,Display Alignment: Right,,
+,Display Width: 11,,
+o,Format: A25,,12
+,Measure: Nominal,,
+,Display Alignment: Center,,
+,Display Width: 12,,
+])
+done
+AT_CLEANUP
+
+AT_SETUP([long variable names])
+AT_KEYWORDS([sack synthetic system file positive])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; dnl Layout code
+4; dnl Nominal case size
+0; dnl Not compressed
+0; dnl Not weighted 
+0; dnl No cases.
+100.0; dnl Bias.
+"01 Jan 11"; "20:53:52"; s64 "PSPP synthetic test file";
+i8 0 *3;
+
+dnl Numeric variables.
+2; 0; 0; 0; 0x050800 *2; s8 "LONGVARI";
+2; 0; 0; 0; 0x050800 *2; s8 "LONGVA_A";
+2; 0; 0; 0; 0x050800 *2; s8 "LONGVA_B";
+2; 0; 0; 0; 0x050800 *2; s8 "LONGVA_C";
+
+dnl Long variable names.
+7; 13; 1; COUNT (
+"LONGVARI=LongVariableName1"; i8 9;
+"LONGVA_A=LongVariableName2"; i8 9;
+"LONGVA_B=LongVariableName3"; i8 9;
+"LONGVA_C=LongVariableName4";
+);
+
+dnl Dictionary termination record.
+999; 0;
+])
+for variant in \
+       "be eb7a8b4055a5d880a185a566048876b3" \
+       "le dd4ecd7541320b9b51746717ef20973f"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+DISPLAY DICTIONARY.
+])
+  AT_CHECK([pspp -o pspp.csv sys-file.sps])
+  AT_CHECK([grep -v Measure pspp.csv | grep -v Display], [0], [dnl
+Variable,Description,,Position
+LongVariableName1,Format: F8.0,,1
+LongVariableName2,Format: F8.0,,2
+LongVariableName3,Format: F8.0,,3
+LongVariableName4,Format: F8.0,,4
+])
+done
+AT_CLEANUP
+
+AT_SETUP([very long strings])
+AT_KEYWORDS([sack synthetic system file positive])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; dnl Layout code
+109; dnl Nominal case size
+0; dnl Not compressed
+0; dnl Not weighted 
+1; dnl No cases.
+100.0; dnl Bias.
+"01 Jan 11"; "20:53:52"; s64 "PSPP synthetic test file";
+i8 0 *3;
+
+dnl 256-byte string.
+2; 255; 0; 0; 0x01FF00 *2; s8 "STR256";
+(2; -1; 0; 0; 0; 0; s8 "") * 31;
+2; 4; 0; 0; 0x010400 *2; s8 "STR256_1";
+
+dnl 600-byte string.
+2; 255; 0; 0; 0x01FF00 *2; s8 "STR600";
+(2; -1; 0; 0; 0; 0; s8 "") * 31;
+2; 255; 0; 0; 0x01FF00 *2; s8 "STR600_1";
+(2; -1; 0; 0; 0; 0; s8 "") * 31;
+2; 96; 0; 0; 0x016000 *2; s8 "STR600_2";
+(2; -1; 0; 0; 0; 0; s8 "") * 11;
+
+dnl Very long string record.
+7; 14; 1; COUNT (
+"STR256=00256"; i8 0; i8 9;
+"STR600=00600"; i8 0; i8 9;
+);
+
+dnl Dictionary termination record.
+999; 0;
+
+dnl Data.
+"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#" * 4;
+"abcdefgh";
+"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#" * 9;
+"abcdefghijklmnopqrstuvwxyzABCDEF";
+])
+for variant in \
+       "be 40a4327805d8b59891084317248f5d4a" \
+       "le ced2584a43037b893b7feb068e2cb9d6"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+DISPLAY DICTIONARY.
+LIST.
+])
+  AT_CHECK([pspp -o pspp.csv sys-file.sps])
+  AT_CHECK([grep -v Measure pspp.csv | grep -v Display], [0], [dnl
+Variable,Description,,Position
+str256,Format: A256,,1
+str600,Format: A600,,2
+
+Table: Data List
+str256,str600
+abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@a,abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#abcdefghijklmnopqrstuvwxyz
+])
+done
+AT_CLEANUP
+
+AT_SETUP([data file and variable attributes])
+AT_KEYWORDS([sack synthetic system file positive])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; dnl Layout code
+2; dnl Nominal case size
+0; dnl Not compressed
+0; dnl Not weighted 
+0; dnl 1 case.
+100.0; dnl Bias.
+"01 Jan 11"; "20:53:52"; s64 "PSPP synthetic test file";
+i8 0 *3;
+
+dnl Variables.
+2; 0; 0; 0; 0x050800 *2; s8 "FIRSTVAR";
+2; 0; 0; 0; 0x050800 *2; s8 "SECONDVA";
+
+dnl Long variable names.
+7; 13; 1; COUNT (
+"FIRSTVAR=FirstVariable"; i8 9;
+"SECONDVA=SecondVariable"; i8 9;
+);
+
+dnl Data file attributes record.
+7; 17; 1; COUNT (
+"Attr1('Value1'"; i8 10; "''QuotedValue''"; i8 10; ")";
+"SecondAttr('123'"; i8 10; "'456'"; i8 10; ")";
+);
+
+dnl Variable attributes record.
+7; 18; 1; COUNT (
+"FirstVariable:";
+  "fred('23'"; i8 10; "'34'"; i8 10; ")";
+  "bert('123'"; i8 10; ")";
+"/SecondVariable:";
+  "xyzzy('quux'"; i8 10; ")";
+);
+
+dnl Dictionary termination record.
+999; 0;
+])
+for variant in \
+       "be 955802de462daf810c0ecc81ee2320a1" \
+       "le 7fc6439aedfa00615bb1fe94d6701305"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+DISPLAY ATTRIBUTES.
+])
+  AT_CHECK([pspp -o pspp.csv sys-file.sps])
+  AT_CHECK([cat pspp.csv], [0],
+[[Variable,Description,
+FirstVariable,Custom attributes:,
+,bert,123
+,fred[1],23
+,fred[2],34
+SecondVariable,Custom attributes:,
+,xyzzy,quux
+
+Table: Custom data file attributes.
+Attribute,Value
+SecondAttr[1],123
+SecondAttr[2],456
+Attr1[1],Value1
+Attr1[2],'QuotedValue'
+]])
+done
+AT_CLEANUP
+
+AT_SETUP([compressed data])
+AT_KEYWORDS([sack synthetic system file positive])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; dnl Layout code
+6; dnl Nominal case size
+1; dnl Not compressed
+0; dnl Not weighted 
+-1; dnl Unspecified number of cases.
+100.0; dnl Bias.
+"01 Jan 11"; "20:53:52"; s64 "PSPP synthetic test file";
+i8 0 *3;
+
+dnl Numeric variables.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+2; 0; 0; 0; 0x050800 *2; s8 "NUM2";
+
+dnl String variable.
+2; 4; 0; 0; 0x010400 *2; s8 "STR4";
+2; 8; 0; 0; 0x010800 *2; s8 "STR8";
+2; 15; 0; 0; 0x010f00 *2; s8 "STR15";
+2; -1; 0; 0; 0; 0; s8 "";
+
+dnl Dictionary termination record.
+999; 0;
+
+dnl Compressed data.
+i8 1 100 254 253 254 253; i8 255 251; "abcdefgh"; s8 "0123";
+i8 253 253 253 254; i8 101 102 253 253; s8 "jklm"; s8 "nopqrstu";
+s8 "vwxyzABC"; s8 "DEFG"; s8 "HIJKLMNO";
+i8 254 253 252 0 0 0 0 0; s8 "PQRSTUVW";
+
+])
+for variant in \
+       "be c0670e436b068f45710b98f6f7d01dc5" \
+       "le 2e43a7f8861df4e714a192dfb3c8b2f4"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+DISPLAY DICTIONARY.
+LIST.
+])
+  AT_CHECK([pspp -o pspp.csv sys-file.sps])
+  AT_CHECK([grep -v Measure pspp.csv | grep -v Display], [0], [dnl
+Variable,Description,,Position
+num1,Format: F8.0,,1
+num2,Format: F8.0,,2
+str4,Format: A4,,3
+str8,Format: A8,,4
+str15,Format: A15,,5
+
+Table: Data List
+num1,num2,str4,str8,str15
+-99,0,,abcdefgh,0123   @&t@
+.,151,jklm,nopqrstu,vwxyzABC       @&t@
+1,2,DEFG,HIJKLMNO,PQRSTUV
+])
+done
+AT_CLEANUP
+
+AT_SETUP([compressed data, zero bias])
+AT_KEYWORDS([sack synthetic system file positive])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; dnl Layout code
+6; dnl Nominal case size
+1; dnl Not compressed
+0; dnl Not weighted 
+-1; dnl Unspecified number of cases.
+0.0; dnl Bias.
+"01 Jan 11"; "20:53:52"; s64 "PSPP synthetic test file";
+i8 0 *3;
+
+dnl Numeric variables.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+2; 0; 0; 0; 0x050800 *2; s8 "NUM2";
+
+dnl String variable.
+2; 4; 0; 0; 0x010400 *2; s8 "STR4";
+2; 8; 0; 0; 0x010800 *2; s8 "STR8";
+2; 15; 0; 0; 0x010f00 *2; s8 "STR15";
+2; -1; 0; 0; 0; 0; s8 "";
+
+dnl Dictionary termination record.
+999; 0;
+
+dnl Compressed data.
+i8 1 100 254 253 254 253; i8 255 251; "abcdefgh"; s8 "0123";
+i8 253 253 253 254; i8 101 102 253 253; s8 "jklm"; s8 "nopqrstu";
+s8 "vwxyzABC"; s8 "DEFG"; s8 "HIJKLMNO";
+i8 254 253 252 0 0 0 0 0; s8 "PQRSTUVW";
+
+])
+for variant in \
+       "be 2f0d25704ee497ae833213a3e4ff5e8b" \
+       "le 49f68a9e1ba02a2f7e9166686a0db9d9"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+DISPLAY DICTIONARY.
+LIST.
+])
+  AT_CHECK([pspp -o pspp.csv sys-file.sps], [0])
+  AT_CHECK([grep -v Measure pspp.csv | grep -v Display], [0], [dnl
+Variable,Description,,Position
+num1,Format: F8.0,,1
+num2,Format: F8.0,,2
+str4,Format: A4,,3
+str8,Format: A8,,4
+str15,Format: A15,,5
+
+Table: Data List
+num1,num2,str4,str8,str15
+1,100,,abcdefgh,0123   @&t@
+.,251,jklm,nopqrstu,vwxyzABC       @&t@
+101,102,DEFG,HIJKLMNO,PQRSTUV
+])
+done
+AT_CLEANUP
+
+AT_SETUP([compressed data, other bias])
+AT_KEYWORDS([sack synthetic system file positive])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; dnl Layout code
+6; dnl Nominal case size
+1; dnl Not compressed
+0; dnl Not weighted 
+-1; dnl Unspecified number of cases.
+50.0; dnl Bias.
+"01 Jan 11"; "20:53:52"; s64 "PSPP synthetic test file";
+i8 0 *3;
+
+dnl Numeric variables.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+2; 0; 0; 0; 0x050800 *2; s8 "NUM2";
+
+dnl String variable.
+2; 4; 0; 0; 0x010400 *2; s8 "STR4";
+2; 8; 0; 0; 0x010800 *2; s8 "STR8";
+2; 15; 0; 0; 0x010f00 *2; s8 "STR15";
+2; -1; 0; 0; 0; 0; s8 "";
+
+dnl Dictionary termination record.
+999; 0;
+
+dnl Compressed data.
+i8 1 100 254 253 254 253; i8 255 251; "abcdefgh"; s8 "0123";
+i8 253 253 253 254; i8 101 102 253 253; s8 "jklm"; s8 "nopqrstu";
+s8 "vwxyzABC"; s8 "DEFG"; s8 "HIJKLMNO";
+i8 254 253 252 0 0 0 0 0; s8 "PQRSTUVW";
+
+])
+for variant in \
+       "be 668b85e3dee0797883e9933a096b8c18" \
+       "le 5e7a9c4e88cd2dbc2322943da663868e"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+DISPLAY DICTIONARY.
+LIST.
+])
+  AT_CHECK([pspp -o pspp.csv sys-file.sps], [0], 
+    [warning: `sys-file.sav' near offset 0x5c: Compression bias is not the usual value of 100, or system file uses unrecognized floating-point format.
+])
+  AT_CHECK([grep -v Measure pspp.csv | grep -v Display], [0], [dnl
+"warning: `sys-file.sav' near offset 0x5c: Compression bias is not the usual value of 100, or system file uses unrecognized floating-point format."
+
+Variable,Description,,Position
+num1,Format: F8.0,,1
+num2,Format: F8.0,,2
+str4,Format: A4,,3
+str8,Format: A8,,4
+str15,Format: A15,,5
+
+Table: Data List
+num1,num2,str4,str8,str15
+-49,50,,abcdefgh,0123   @&t@
+.,201,jklm,nopqrstu,vwxyzABC       @&t@
+51,52,DEFG,HIJKLMNO,PQRSTUV
+])
+done
+AT_CLEANUP
+\f
+AT_BANNER([system file reader - negative])
+
+AT_SETUP([misplaced type 4 record])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Type 4 record.
+>>4<<;
+])
+for variant in \
+       "be 6e0bb549fff1fd1af333d51b8a6e0f43" \
+       "le 7b62734edcee2a1689c463f2866d11b8"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], 
+   [error: `sys-file.sav' near offset 0xd4: Misplaced type 4 record.
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([bad record type])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Type 8 record (not a valid type).
+>>8<<;
+])
+for variant in \
+       "be dc8f078c23046ee7db74ec1003178a11" \
+       "le dc7f111642f0629f4370630fd092eee3"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], 
+   [error: `sys-file.sav' near offset 0xd4: Unrecognized record type 8.
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([wrong number of variable positions])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; >>2<<; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl End of dictionary.
+999; 0;
+])
+for variant in \
+       "be c57e91aa426f61813c3ad91ea3a56dda" \
+       "le 5d1a6c114b135b219473c8ad5bb44bda"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], 
+   [warning: `sys-file.sav' near offset 0xd8: File header claims 2 variable positions but 1 were read from file.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([variable name may not begin with `#'])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable.
+2; 0; 0; 0; 0x050800 *2; s8 >>"$UM1"<<;
+
+dnl End of dictionary.
+999; 0;
+])
+for variant in \
+       "be decb7ac6defa1ab3cc7a386d1843c1ae" \
+       "le 5279b6275633bac55d167faebccfdb14"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], 
+   [error: `sys-file.sav' near offset 0xd0: Variable name begins with invalid character `$'.
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([variable name may not be reserved word])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable.
+2; 0; 0; 0; 0x050800 *2; s8 >>"TO"<<;
+
+dnl End of dictionary.
+999; 0;
+])
+for variant in \
+       "be 57e6ad709668bbf538e2efee4af49916" \
+       "le 523f14b611efa380bbadf7a16ea43fed"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], 
+   [error: `sys-file.sav' near offset 0xd0: Invalid variable name `TO'.
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([variable width must be between 0 and 255])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl String variable with invalid width 256.
+2; 256; 0; 0; 0x050800 *2; s8 "VAR1";
+
+dnl End of dictionary.
+999; 0;
+])
+for variant in \
+       "be 170bb18589ba264a0ed2d57b41fe77e1" \
+       "le 9528b4b5936ef5630bbd3bdd60a123c3"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], 
+   [error: `sys-file.sav' near offset 0xd0: Bad width 256 for variable VAR1.
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([duplicate variable name])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 2; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variables.
+2; 0; 0; 0; 0x050800 *2; s8 "VAR1";
+2; 0; 0; 0; 0x050800 *2; s8 "VAR1";
+
+dnl End of dictionary.
+999; 0;
+])
+for variant in \
+       "be d8f5fd768ab1d641f9330a4840c71343" \
+       "le f01e123d384cdaa7c2f7fc4791325ebf"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], 
+   [error: `sys-file.sav' near offset 0xf0: Duplicate variable name `VAR1'.
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([variable label indicator not 0 or 1])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 2; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable.
+2; 0; >>2<<; 0; 0x050800 *2; s8 "VAR1";
+
+dnl End of dictionary.
+999; 0;
+])
+for variant in \
+       "be 3c5ff8d8f146457a385ca92d3d23ca8a" \
+       "le 37e9f956d321ae57b0bf7fe2384e892b"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], 
+   [error: `sys-file.sav' near offset 0xd0: Variable label indicator field is not 0 or 1.
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([invalid numeric missing value indicator])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 2; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable.
+2; 0; 0; >>-1<<; 0x050800 *2; s8 "VAR1";
+
+dnl End of dictionary.
+999; 0;
+])
+for variant in \
+       "be d1d0d4aedf9f053452c4b1e658ade5e2" \
+       "le df697575499fe12921185a3d23a5d61d"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], 
+   ["error: `sys-file.sav' near offset 0xd0: Numeric missing value indicator field is not -3, -2, 0, 1, 2, or 3."
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([invalid string missing value indicator])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 2; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl String variable.
+2; 8; 0; >>4<<; 0x010800 *2; s8 "VAR1";
+
+dnl End of dictionary.
+999; 0;
+])
+for variant in \
+       "be f833033be7b102fae19159989f62faa6" \
+       "le 9704ba828bb7a36ef0262838f6b7936b"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], 
+   ["error: `sys-file.sav' near offset 0xd0: String missing value indicator field is not 0, 1, 2, or 3."
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([missing string continuation record])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 2; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl String variable.
+2; 10; 0; 0; 0x010a00 *2; s8 "VAR1";
+>>2; 0; 0; 0; 0x050800 *2; s8 "VAR2";<<
+
+dnl End of dictionary.
+999; 0;
+])
+for variant in \
+       "be c8f9ad2b2acd2918055e2b78c1e0b4b8" \
+       "le 1afab4d6aee90a6fe8d2dbf229e06409"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], 
+   [error: `sys-file.sav' near offset 0xd8: Missing string continuation record.
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([unknown variable format])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable.
+2; 0; 0; 0; >>0xff0800<< *2; s8 "VAR1";
+
+dnl End of dictionary.
+999; 0;
+])
+for variant in \
+       "be fcf94b3ff11b7e2ff50c226b609cff1e" \
+       "le 88fc97cc80d5a170e53a7cc89e204b0d"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], 
+   [error: `sys-file.sav' near offset 0xd0: Unknown variable format 255.
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([invalid numeric variable format])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 3; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, string formats.
+2; 0; 0; 0; >>0x010800<<; >>0x021000<<; s8 "VAR1";
+
+dnl String variable, numeric formats.
+2; 4; 0; 0; >>0x050800<<; >>0x110a01<<; s8 "STR1";
+
+dnl String variable, wrong width formats.
+2; 4; 0; 0; >>0x010800<<; >>0x020400<<; s8 "STR2";
+
+dnl End of dictionary.
+999; 0;
+])
+for variant in \
+       "be 0c36a39ec9118eb4a83f10a9483b5a37" \
+       "le 1d498d60eeb2c88e0479f113fb3ffe4b"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], 
+   [warning: `sys-file.sav' near offset 0xd0: Numeric variable VAR1 has invalid print format A8.
+
+warning: `sys-file.sav' near offset 0xd0: Numeric variable VAR1 has invalid write format AHEX16.
+
+warning: `sys-file.sav' near offset 0xf0: String variable STR1 has invalid print format F8.0.
+
+warning: `sys-file.sav' near offset 0xf0: String variable STR1 has invalid write format E10.1.
+
+warning: `sys-file.sav' near offset 0x110: String variable STR2 has invalid print format A8.
+
+warning: `sys-file.sav' near offset 0x110: String variable STR2 has invalid write format AHEX4.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([weighting variable must be numeric])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 2; 1; >>2<<; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl String variable.
+2; 4; 0; 0; 0x010400 *2; s8 "STR1";
+
+dnl End of dictionary.
+999; 0;
+])
+for variant in \
+       "be 82d30105e46c4896c24f9dcec26c4749" \
+       "le 32e235119be70050eb78bf4186a5a046"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], 
+   [error: `sys-file.sav' near offset 0xf4: Weighting variable must be numeric (not string variable `STR1').
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([bad weighting variable index])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 2; 1; >>3<<; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl String variable.
+2; 4; 0; 0; 0x010400 *2; s8 "STR1";
+
+dnl End of dictionary.
+999; 0;
+])
+for variant in \
+       "be cd9af924ff20bc75834aa2c696254c97" \
+       "le cbe0f2f514f5e95f27644d0b4314bc78"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], 
+   [error: `sys-file.sav' near offset 0xf4: Variable index 3 not in valid range 1...2.
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([variable index is long string contination])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 2; 1; >>3<<; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Long string variable.
+2; 9; 0; 0; 0x010900 *2; s8 "STR1";
+(2; -1; 0; 0; 0; 0; s8 "");
+
+dnl End of dictionary.
+999; 0;
+])
+for variant in \
+       "be 0c395354df56ea5ff374aafcc535d633" \
+       "le d977f684ea9d4648ed40f8c6dddde9f7"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], 
+   [error: `sys-file.sav' near offset 0x114: Variable index 3 refers to long string continuation.
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([multiple documents records])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 2; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Two document records.
+(6; 1; s80 "One line of documents") >>* 2<<;
+
+dnl Dictionary termination record.
+999; 0;
+
+dnl Data.
+1.0;
+])
+for variant in \
+       "be 18aa3348a216ed494efe28285b348fa8" \
+       "le 19b21522bcef1dcc60af328f923f307e"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], [dnl
+error: `sys-file.sav' near offset 0x12c: Multiple type 6 (document) records.
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+
+AT_SETUP([empty document record])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 2; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Empty document record.
+6; >>0<<;
+
+dnl Dictionary termination record.
+999; 0;
+
+dnl Data.
+1.0;
+])
+for variant in \
+       "be d8ef29c1b97f9ed226cbd938c9c49b6e" \
+       "le f6a560c5b62e2c472429d85294f36e61"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], [dnl
+error: `sys-file.sav' near offset 0xd8: Number of document lines (0) must be greater than 0.
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([document contains null byte])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 2; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Document record.
+6; 1; >>i8 0<<; s79 "One line of documents";
+
+dnl Dictionary termination record.
+999; 0;
+
+dnl Data.
+1.0;
+])
+for variant in \
+       "be 24b5f451ae2559785c1a38358c511e39" \
+       "le b7e9802506307c28343293144bd6d4f4"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], [dnl
+error: `sys-file.sav' near offset 0x128: Document line contains null byte.
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([extension record too large])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 2; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Too-large extension record.
+7; 3; >>0xfffff000 * 2<<;
+])
+for variant in \
+       "be 5a6679dc41ac349b0b73fc430937c05c" \
+       "le d4769c7f650cfbf160e0386d0d33be04"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], [dnl
+error: `sys-file.sav' near offset 0xe0: Record type 7 subtype 3 too large.
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([unknown extension record])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Unknown extension record type.
+7; 30; 1; 1; i8 0;
+
+dnl End of dictionary.
+999; 0;
+])
+for variant in \
+       "be ac8395e27677408189bcb8655e56cc0e" \
+       "le e308bfcd51f1e3c28d7379c29271f9d6"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+"warning: `sys-file.sav' near offset 0xe0: Unrecognized record type 7, subtype 30.  Please send a copy of this file, and the syntax which created it to bug-gnu-pspp@gnu.org."
+])
+done
+AT_CLEANUP
+
+AT_SETUP([bad machine integer info size])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 2; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Machine integer info record.
+7; 3; 4; >>9<<; 1; 2; 3; -1; 1; 1; ENDIAN; 1252;
+])
+for variant in \
+       "be 21ec84826886b0a266d1360f8279d769" \
+       "le 15dcba7b2b89b7d8a21ebcc872f515af"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], [dnl
+"error: `sys-file.sav' near offset 0x100: Bad size (4) or count (9) field on record type 7, subtype 3."
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([bad machine integer info float format])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 2; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Machine integer info record.
+7; 3; 4; 8; 1; 2; 3; -1; >>2<<; 1; ENDIAN; 1252;
+])
+for variant in \
+       "be d510ed28278649eee997fb6881a4c04f" \
+       "le fbf1eca561a4e243b7ae844ed1677035"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], [dnl
+error: `sys-file.sav' near offset 0x100: Floating-point representation indicated by system file (2) differs from expected (1).
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([bad machine integer info endianness])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Machine integer info record.
+7; 3; 4; 8; 1; 2; 3; -1; 1; 1; >>3<<; 1252;
+
+dnl End of dictionary.
+999; 0;
+])
+for variant in \
+       "be 855123d16d5e1560b91d60753dad79ad 1" \
+       "le d6626b4fa2e46a91f26c2fc609b2f1e0 2"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+DISPLAY DICTIONARY.
+])
+  AT_CHECK_UNQUOTED([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: \`sys-file.sav' near offset 0x100: Integer format indicated by system file (3) differs from expected ($[3]).
+
+Variable,Description,,Position
+num1,Format: F8.0,,1
+,Measure: Scale,,
+,Display Alignment: Right,,
+,Display Width: 8,,
+])
+done
+AT_CLEANUP
+
+
+AT_SETUP([bad machine floating-point info size])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 2; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Machine floating-point info record.
+7; 4; 8; >>4<<; SYSMIS; HIGHEST; LOWEST; 0.0;
+])
+for variant in \
+       "be 29c9a173638fbb8bb1efe1176c4d670f" \
+       "le 5cb49eb1084e5b9cd573a54705ff86a7"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], [dnl
+error: `sys-file.sav' near offset 0xf8: Bad size (8) or count (4) on extension 4.
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([wrong special floating point values])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Machine floating-point info record.
+7; 4; 8; 3; >>0.0<<; >>1.0<<; >>2.0<<;
+
+dnl End of dictionary.
+999; 0;
+])
+for variant in \
+       "be 1e7452d9bb0a2397bf6084a25437514e" \
+       "le f59f9a83f723cde1611869ff6d91d325"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0xf8: File specifies unexpected value 0 as SYSMIS.
+
+warning: `sys-file.sav' near offset 0xf8: File specifies unexpected value 1 as HIGHEST.
+
+warning: `sys-file.sav' near offset 0xf8: File specifies unexpected value 2 as LOWEST.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([bad mrsets name])
+AT_KEYWORDS([sack synthetic system file negative multiple response])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Multiple response sets.
+7; 7; 1; COUNT("a=C");
+7; 19; 1; COUNT("xyz=D");
+
+999; 0;
+])
+for variant in \
+       "be 15a9bf44d0cd6186a60629b77079c5a5" \
+       "le 161c99aca5e7a3684df096137e72ce5b"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0xe3: `a' does not begin with `$' at offset 2 in MRSETS record.
+
+warning: `sys-file.sav' near offset 0xf8: `xyz' does not begin with `$' at offset 4 in MRSETS record.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([missing space after C in mrsets])
+AT_KEYWORDS([sack synthetic system file negative multiple response])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Multiple response sets.
+7; 7; 1; COUNT("$a=Cx");
+
+999; 0;
+])
+for variant in \
+       "be c5e5656ba3d74c3a967850f29ad89970" \
+       "le 29f110509c3d6893a7d21ae2d66aad9d"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0xe5: Missing space following `C' at offset 4 in MRSETS record.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([missing space after E in mrsets])
+AT_KEYWORDS([sack synthetic system file negative multiple response])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Multiple response sets.
+7; 7; 1; COUNT("$a=Ex");
+
+999; 0;
+])
+for variant in \
+       "be a9e1dc63e2524882a5e3d2949a2da9d4" \
+       "le ac709ca1928f65f47a8c8efdd9454b50"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0xe5: Missing space following `E' at offset 4 in MRSETS record.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([unexpected label source in mrsets])
+AT_KEYWORDS([sack synthetic system file negative multiple response])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Multiple response sets.
+7; 7; 1; COUNT("$a=E 2");
+
+999; 0;
+])
+for variant in \
+       "be 8c710e85a0a1609d0d03dec80aaf5f94" \
+       "le 4682440b82f22d4bd2ac56afb7fa3152"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0xe6: Unexpected label source value `2' following `E' at offset 7 in MRSETS record.
+
+warning: `sys-file.sav' near offset 0xe6: Expecting digit at offset 7 in MRSETS record.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([bad type character in mrsets])
+AT_KEYWORDS([sack synthetic system file negative multiple response])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Multiple response sets.
+7; 7; 1; COUNT("$a=");
+
+999; 0;
+])
+for variant in \
+       "be fc5e5200d8f56b9a5a713e4a95313a3b" \
+       "le 578a61e8a06b20216612f566c2050879"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+"warning: `sys-file.sav' near offset 0xe3: Missing `C', `D', or `E' at offset 3 in MRSETS record."
+])
+done
+AT_CLEANUP
+
+AT_SETUP([bad counted string length in mrsets])
+AT_KEYWORDS([sack synthetic system file negative multiple response])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Multiple response sets.
+7; 7; 1; COUNT("$a=Dx");
+
+999; 0;
+])
+for variant in \
+       "be 23d0e2f65c7c5f93bbedcc0f2b260c69" \
+       "le c3860c1d80e08842264948056e72c0db"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0xe5: Expecting digit at offset 4 in MRSETS record.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([missing space in counted string in mrsets])
+AT_KEYWORDS([sack synthetic system file negative multiple response])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Multiple response sets.
+7; 7; 1; COUNT("$a=D1x");
+
+999; 0;
+])
+for variant in \
+       "be c9ce001723763e0698878b7e43a887e8" \
+       "le e258a1e4491d5a1d1e7d2272ef631a22"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0xe6: Expecting space at offset 5 in MRSETS record.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([counted string too long in mrsets])
+AT_KEYWORDS([sack synthetic system file negative multiple response])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Multiple response sets.
+7; 7; 1; COUNT("$a=D4 abc");
+
+999; 0;
+])
+for variant in \
+       "be 196d1266fa0e8e315769dcbe3130e3df" \
+       "le 23df1ba7b77a26da8ce1c2cfbcaadce0"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0xe9: 4-byte string starting at offset 6 exceeds record length 9.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([missing space after counted string in mrsets])
+AT_KEYWORDS([sack synthetic system file negative multiple response])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Multiple response sets.
+7; 7; 1; COUNT("$a=D3 abcx");
+
+999; 0;
+])
+for variant in \
+       "be 86314bb0bbdfad48c10af8b8d8106d6e" \
+       "le 2b8d05ff501ca78e51f7110ce88a2364"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0xea: Expecting space at offset 9 following 3-byte string.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([missing newline after variable name in mrsets])
+AT_KEYWORDS([sack synthetic system file negative multiple response])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Multiple response sets.
+7; 7; 1; COUNT("$a=C 0  NUM1");
+
+999; 0;
+])
+for variant in \
+       "be cea939cf3e6a5f88cb45e8fa871c5e13" \
+       "le 52135afec082f50f37eafacadbb2cd65"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0xec: Missing new-line parsing variable names at offset 14 in MRSETS record.
+
+warning: `sys-file.sav' near offset 0xec: MRSET $a has only 1 variables.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([duplicate variable name in mrsets])
+AT_KEYWORDS([sack synthetic system file negative multiple response])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Multiple response sets.
+7; 7; 1; COUNT("$a=C 0  NUM1 NUM1"; i8 10);
+
+999; 0;
+])
+for variant in \
+       "be 4b1b5fa2dc22cf0afdd35422290b0a29" \
+       "le e4304b57976440a036f25f8dd8ac1404"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0xf2: Duplicate variable name NUM1 at offset 18 in MRSETS record.
+
+warning: `sys-file.sav' near offset 0xf2: MRSET $a has only 1 variables.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([mixed variable types in mrsets])
+AT_KEYWORDS([sack synthetic system file negative multiple response])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 2; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Variables.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+2; 8; 0; 0; 0x010800 *2; s8 "STR1";
+
+dnl Multiple response sets.
+7; 7; 1; COUNT("$a=C 0  NUM1 STR1"; i8 10);
+
+999; 0;
+])
+for variant in \
+       "be 0f130e967e4097823f85b8711eb20727" \
+       "le 4dc987b4303fd115f1cae9be3963acc9"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0x112: MRSET $a contains both string and numeric variables.
+
+warning: `sys-file.sav' near offset 0x112: MRSET $a has only 1 variables.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([missing newline after variable name in mrsets])
+AT_KEYWORDS([sack synthetic system file negative multiple response])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Multiple response sets.
+7; 7; 1; COUNT("$a=C 0  NUM1"; i8 10);
+
+999; 0;
+])
+for variant in \
+       "be 3a891e0a467afb3d622629c70f329ada" \
+       "le 432998ec08370510411af4f5207c015e"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0xed: MRSET $a has only 1 variables.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([only one variable in mrset])
+AT_KEYWORDS([sack synthetic system file negative multiple response])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Multiple response sets.
+7; 7; 1; COUNT("$a=C 0  NUM1"; i8 10);
+
+999; 0;
+])
+for variant in \
+       "be 3a891e0a467afb3d622629c70f329ada" \
+       "le 432998ec08370510411af4f5207c015e"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0xed: MRSET $a has only 1 variables.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([wrong display parameter size])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Display parameters record.
+7; 11; >>8<<; 2; 1.0; 1.0;
+
+dnl End of dictionary.
+999; 0;
+])
+for variant in \
+       "be 7c0f1ae47ae11e37d435c4abaceca226" \
+       "le c29d05a1f8f15ed2201f31f8b787aaa0"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0xe0: Bad size 8 on extension 11.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([wrong display parameter count])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Display parameters record.
+7; 11; 4; >>4<<; 1; 1; 2; 2;
+
+dnl End of dictionary.
+999; 0;
+])
+for variant in \
+       "be 372b57e73c69b05047b60bf6c596e2a1" \
+       "le 2a550d8c5ceae4de7ced77df66e49d0f"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0xe0: Extension 11 has bad count 4 (for 1 variables).
+])
+done
+AT_CLEANUP
+
+AT_SETUP([wrong display measurement level])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Display parameters record.
+7; 11; 4; 2; >>4<<; 0;
+
+dnl End of dictionary.
+999; 0;
+])
+for variant in \
+       "be d43e7616b03743339f37292dec6c2204" \
+       "le 821533c29a070cefdd8f07f4e1741d2a"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0xe8: Invalid variable display parameters for variable 0 (NUM1).  Default parameters substituted.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([wrong display alignment])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable, no label or missing values.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Display parameters record.
+7; 11; 4; 2; 1; >>-1<<;
+
+dnl End of dictionary.
+999; 0;
+])
+for variant in \
+       "be c54bc48b5767e2ec3a9ef31df790cb7c" \
+       "le a4d8b14af64221abe83adb417d110e10"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0xe8: Invalid variable display parameters for variable 0 (NUM1).  Default parameters substituted.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([bad variable name in variable/value pair])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variables.
+2; 0; 0; 0; 0x050800 *2; s8 "LONGVARI";
+
+dnl Long variable names.
+7; 13; 1; COUNT (>>"xyzzy"<<);
+
+dnl Dictionary termination record.
+999; 0;
+])
+for variant in \
+       "be b67b6e3c1900e5a9cc691055008f0447" \
+       "le 26cc52e601f830f9087a0ea2bd9527df"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0xe5: Dictionary record refers to unknown variable xyzzy.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([duplicate long variable name])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 4; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variables.
+2; 0; 0; 0; 0x050800 *2; s8 "LONGVARI";
+2; 0; 0; 0; 0x050800 *2; s8 "LONGVA_A";
+2; 0; 0; 0; 0x050800 *2; s8 "LONGVA_B";
+2; 0; 0; 0; 0x050800 *2; s8 "LONGVA_C";
+
+dnl Long variable names.
+7; 13; 1; COUNT (
+"LONGVARI=_Invalid"; i8 9;
+"LONGVA_A=LongVariableName"; i8 9;
+"LONGVA_B=LONGVARIABLENAME"; i8 9;
+);
+
+dnl Dictionary termination record.
+999; 0;
+])
+for variant in \
+       "be 9b4b4daa00084d984efb8f889bcb727c" \
+       "le c1b1470d5cd615106e9ae507c9948d8e"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0x186: Long variable mapping from LONGVARI to invalid variable name `_Invalid'.
+
+warning: `sys-file.sav' near offset 0x186: Duplicate long variable name `LONGVARIABLENAME'.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([bad very long string length])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Very long string map.
+7; 14; 1; COUNT (
+"NUM1=00000"; i8 0; i8 9;
+"NUM1=00255"; i8 0; i8 9;
+"NUM1=00256"; i8 0; i8 9;
+);
+
+dnl Dictionary termination record.
+999; 0;
+])
+for variant in \
+       "be 1309d8d9fb24bcf08952dce9b0f39a94" \
+       "le 94a39de88f8034001b3e467c4cc04d0f"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], [dnl
+warning: `sys-file.sav' near offset 0x104: NUM1 listed as string of invalid length 00000 in very long string record.
+
+"warning: `sys-file.sav' near offset 0x104: NUM1 listed in very long string record with width 00255, which requires only one segment."
+
+error: `sys-file.sav' near offset 0x104: Very long string NUM1 overflows dictionary.
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([bad very long string segment width])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Variables.
+2; 255; 0; 0; 0x01ff00 *2; s8 "STR1";
+(2; -1; 0; 0; 0; 0; s8 "") * 31;
+2; >>9<<; 0; 0; 0x010900 *2; s8 "STR1_A";
+>>2; -1; 0; 0; 0; 0; s8 "";<<
+
+dnl Very long string map.
+7; 14; 1; COUNT (
+"STR1=00256"; i8 0; i8 9;
+);
+
+dnl Dictionary termination record.
+999; 0;
+])
+for variant in \
+       "be 1d09a44a46859e6eda28e053dd4b7a8b" \
+       "le 63b9ac0b3953f3e0d5ee248ebe257794"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], [dnl
+error: `sys-file.sav' near offset 0x50c: Very long string with width 256 has segment 1 of width 9 (expected 4).
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([too many value labels])
+dnl Skip the test if multiplying a small number by INT32_MAX would not
+dnl cause an overflow in size_t.
+AT_SKIP_IF([test $SIZEOF_SIZE_T -gt 4])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+3; >>0x7fffffff<<;
+])
+for variant in \
+       "be 975b2668dde395ddf619977958b37412" \
+       "le 0c14aa278cfc2a4b801f91c14321f03b"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], [dnl
+error: `sys-file.sav' near offset 0xd8: Invalid number of labels 2147483647.
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([missing type 4 record])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Value label with missing type 4 record.
+3; 1; 1.0; i8 3; s7 "one";
+
+dnl End of dictionary.
+>>999; 0<<;
+])
+for variant in \
+       "be 5e1286ac92e3f25ff98492bc5019d608" \
+       "le b33c12f776bbcaa43aa3bfdd4799e0c0"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], [dnl
+error: `sys-file.sav' near offset 0xec: Variable index record (type 4) does not immediately follow value label record (type 3) as it should.
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([value label with no associated variables])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variable.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Value label with no variables.
+3; 1; 1.0; i8 3; s7 "one"; 4; >>0<<;
+])
+for variant in \
+       "be b0dcec30a936cbcad21c4f3d6fe10fcf" \
+       "le 3b9fdfce5c8c248048232fd6eac018e3"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], [dnl
+error: `sys-file.sav' near offset 0xf0: Number of variables associated with a value label (0) is not between 1 and the number of variables (1).
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([type 4 record names long string variable])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 2; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Long string variable.
+2; 9; 0; 0; 0x010900 *2; s8 "STR1";
+2; -1; 0; 0; 0; 0; s8 "";
+
+dnl Value label that names long string variable.
+3; 1; s8 "xyzzy"; i8 3; s7 "one"; 4; 1; >>1<<;
+])
+for variant in \
+       "be 14053a4f09de4c7c4c55281534dd66f4" \
+       "le 8a61cc994c659fd66307d2f0fd64ce20"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], [dnl
+error: `sys-file.sav' near offset 0x114: Value labels may not be added to long string variables (e.g. STR1) using records types 3 and 4.
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([variables for value label must all be same type])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 2; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Variables.
+2; 6; 0; 0; 0x010600 *2; s8 "STR1";
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Value label that names numeric and string variables.
+3; 1; s8 "xyzzy"; i8 3; s7 "one"; 4; 2; >>1; 2<<;
+])
+for variant in \
+       "be 7577c456726a88f52bbef63a8b47bf1a" \
+       "le 3ba5c6af9ad0ae5cc88f9f63e726e414"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], [dnl
+"error: `sys-file.sav' near offset 0x118: Variables associated with value label are not all of identical type.  Variable STR1 is string, but variable NUM1 is numeric."
+
+sys-file.sps:1: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([duplicate value labels type])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 2; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Variables.
+2; 6; 0; 0; 0x010600 *2; s8 "STR1";
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+
+dnl Duplicate value labels.
+3; 1; s8 "xyzzy"; i8 3; s7 "one"; 4; 2; >>1; 1<<;
+3; 1; 1.0; i8 3; s7 "one"; 4; 2; >>2; 2<<;
+
+dnl End of dictionary.
+999; 0;
+])
+for variant in \
+       "be ef0f5b2ebddb5a3bfcda16c93a2508f4" \
+       "le c00e27abd9a6c06bf29a108d7220435a"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0x118: Duplicate value label for `xyzzy ' on STR1.
+
+warning: `sys-file.sav' near offset 0x140: Duplicate value label for 1 on NUM1.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([missing attribute value])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Variables.
+2; 0; 0; 0; 0x050800 *2; s8 "FIRSTVAR";
+
+dnl Data file attributes record.
+7; 17; 1; COUNT (
+"Attr1("
+);
+
+dnl Variable attributes record.
+7; 18; 1; COUNT (
+"FIRSTVAR:";
+  "fred('23'"; i8 10
+);
+
+dnl Dictionary termination record.
+999; 0;
+])
+for variant in \
+       "be 0fc71f5e3cdb6b7f2dd73d011d4885c2" \
+       "le e519b44715400156a2bfe648eb5cff34"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0xe6: Error parsing attribute value Attr1[[1]].
+
+warning: `sys-file.sav' near offset 0x109: Error parsing attribute value fred[[2]].
+])
+done
+AT_CLEANUP
+
+AT_SETUP([unquoted attribute value])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 1; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Variables.
+2; 0; 0; 0; 0x050800 *2; s8 "FIRSTVAR";
+
+dnl Data file attributes record.
+7; 17; 1; COUNT (
+"Attr1(value"; i8 10;
+")"
+);
+
+dnl Variable attributes record.
+7; 18; 1; COUNT (
+"FIRSTVAR:";
+  "fred(23"; i8 10; ")"
+);
+
+dnl Dictionary termination record.
+999; 0;
+])
+for variant in \
+       "be 33dba37c2247e63c04bb74a7b472293d" \
+       "le 041025a9d9d9e21a7fabd90ba7341934"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [dnl
+GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0xed: Attribute value Attr1[[1]] is not quoted: value.
+
+warning: `sys-file.sav' near offset 0x10f: Attribute value fred[[1]] is not quoted: 23.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([bad variable name in long string value label])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 3; 1; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Variables.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+2; 14; 0; 0; 0x010e00 *2; s8 "STR14";
+2; -1; 0; 0; 0; 0; s8 "";
+
+7; 21; 1; COUNT (
+dnl No variable named STR9.
+COUNT(>>"STR9"<<); 9;
+1; COUNT("RSTUVWXYZ"); COUNT("value label for `RSTUVWXYZ'");
+
+dnl NUM1 is numeric.
+COUNT(>>"NUM1"<<); 0;
+1; COUNT("xyz"); COUNT("value label for 1.0");
+
+dnl Wrong width for STR14.
+COUNT("STR14"); >>9<<;
+1; COUNT("RSTUVWXYZ"); COUNT("value label for `RSTUVWXYZ'");
+
+dnl Wrong width for value.
+COUNT("STR14"); 14;
+1; COUNT(>>"RSTUVWXYZ"<<); COUNT("value label for `RSTUVWXYZ'");
+
+dnl Duplicate value label.
+COUNT("STR14"); 14; 2;
+COUNT("abcdefghijklmn"); COUNT("value label for `abcdefghijklmn'");
+>>COUNT("abcdefghijklmn"); COUNT("another value label for `abcdefghijklmn'")<<;
+);
+
+dnl Dictionary termination record.
+999; 0;
+])
+for variant in \
+       "be cf2e883dadb00e2c6404c09ea0a4e388" \
+       "le 89c340faf0a7e4a8c834f9687684c091"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [0], [dnl
+warning: `sys-file.sav' near offset 0x130: Ignoring long string value record for unknown variable STR9.
+
+warning: `sys-file.sav' near offset 0x16c: Ignoring long string value record for numeric variable NUM1.
+
+warning: `sys-file.sav' near offset 0x19b: Ignoring long string value record for variable STR14 because the record's width (9) does not match the variable's width (14).
+
+"warning: `sys-file.sav' near offset 0x1dc: Ignoring long string value 0 for variable STR14, with width 14, that has bad value width 9."
+
+warning: `sys-file.sav' near offset 0x289: Duplicate value label for `abcdefghijklmn' on STR14.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([fewer data records than indicated by file header])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 2; 0; 0; >>5<<; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variables.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+2; 0; 0; 0; 0x050800 *2; s8 "NUM2";
+
+dnl Data.
+999; 0;
+1.0; 2.0;
+3.0; 4.0;
+5.0; 6.0;
+7.0; 8.0;
+dnl Missing record here.
+])
+for variant in \
+       "be 6ee097c3934055d0c4564641636f4b5a" \
+       "le ae03fe1b888091d6938b5a436d44ac60"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+LIST.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], 
+   [error: Error reading case from file `sys-file.sav'.
+
+Table: Data List
+num1,num2
+1,2
+3,4
+5,6
+7,8
+
+sys-file.sps:2: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([partial data record between variables])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 2; 0; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variables.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+2; 0; 0; 0; 0x050800 *2; s8 "NUM2";
+
+dnl Data.
+999; 0;
+1.0; 2.0;
+3.0;
+])
+for variant in \
+       "be 4bcc085d7d8f0f09c6a4ba8064ffe61c" \
+       "le 7387fc5edd2740aff92c30ca688d6d9b"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+LIST.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], 
+   [error: `sys-file.sav' near offset 0x110: File ends in partial case.
+
+Table: Data List
+num1,num2
+1,2
+
+sys-file.sps:2: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([partial data record within long string])
+AT_KEYWORDS([sack synthetic system file negative])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; 2; 0; 0; -1; 100.0; "01 Jan 11"; "20:53:52"; s64 ""; i8 0 *3;
+
+dnl Numeric variables.
+2; 14; 0; 0; 0x010e00 *2; s8 "STR14";
+2; -1; 0; 0; 0; 0; s8 "";
+
+dnl Data.
+999; 0;
+s14 "one data item";
+s8 "partial";
+])
+for variant in \
+       "be 4a9e84f9e679afb7bb71acd0bb7eab89" \
+       "le 30752606f14ee2deec2854e8e6de4b3b"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+LIST.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], 
+   [error: `sys-file.sav' near offset 0x10e: Unexpected end of file.
+
+Table: Data List
+str14
+one data item @&t@
+
+sys-file.sps:2: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+
+AT_SETUP([partial compressed data record])
+AT_KEYWORDS([sack synthetic system file positive])
+AT_DATA([sys-file.sack], [dnl
+dnl File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; dnl Layout code
+6; dnl Nominal case size
+1; dnl Compressed
+0; dnl Not weighted 
+-1; dnl Unspecified number of cases.
+100.0; dnl Bias.
+"01 Jan 11"; "20:53:52"; s64 "PSPP synthetic test file";
+i8 0 *3;
+
+dnl Numeric variables.
+2; 0; 0; 0; 0x050800 *2; s8 "NUM1";
+2; 0; 0; 0; 0x050800 *2; s8 "NUM2";
+
+dnl String variable.
+2; 4; 0; 0; 0x010400 *2; s8 "STR4";
+2; 8; 0; 0; 0x010800 *2; s8 "STR8";
+2; 15; 0; 0; 0x010f00 *2; s8 "STR15";
+2; -1; 0; 0; 0; 0; s8 "";
+
+dnl Dictionary termination record.
+999; 0;
+
+dnl Compressed data.
+i8 1 100 254 253 254 253; i8 255 251; "abcdefgh"; s8 "0123";
+])
+for variant in \
+       "be ef01b16e2e397d979a3a7d20725ebe6d" \
+       "le 51f7a61e9bc68992469d16c55d6ecd88"
+do
+  set $variant
+  AT_CHECK_UNQUOTED([sack --$[1] sys-file.sack > sys-file.sav], [0], [], [$[2]
+])
+  AT_DATA([sys-file.sps], [GET FILE='sys-file.sav'.
+LIST.
+])
+  AT_CHECK([pspp -O format=csv sys-file.sps], [1], 
+   [error: `sys-file.sav' near offset 0x190: File ends in partial case.
+
+Table: Data List
+num1,num2,str4,str8,str15
+-99,0,,abcdefgh,0123   @&t@
+
+sys-file.sps:2: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
+])
+done
+AT_CLEANUP
+