+])
+ AT_CHECK_UNQUOTED([dd if=foo.sav bs=1 count=4; echo], [0], [$magic
+], [ignore])
+done
+AT_CLEANUP
+
+AT_SETUP([write and read long string value labels and missing values])
+AT_KEYWORDS([SAVE GET system file])
+for variant in 'UNCOMPRESSED $FL2' 'ZCOMPRESSED $FL3'; do
+ set $variant
+ compression=$1 magic=$2
+ cat >sysfile.sps <<EOF
+DATA LIST LIST NOTABLE/s1 s2 s3 (a9).
+BEGIN DATA
+a b c
+END DATA.
+
+VALUE LABELS
+ /s1 'abc' 'First value label'
+ 'abcdefgh' 'Second value label'
+ 'abcdefghi' 'Third value label'
+ /s2 '0' 'Fourth value label'
+ '01234567' 'Fifth value label'
+ '012345678' 'Sixth value label'.
+
+MISSING VALUES
+ s1 ('0')
+ /s2 ('12' '123')
+ /s3 ('1234' '12345' '12345678').
+
+SAVE/$compression /OUTFILE='foo.sav'.
+GET /FILE='foo.sav'.
+DISPLAY DICTIONARY.
+EOF
+ AT_CHECK([pspp -o pspp.csv sysfile.sps])
+ AT_CHECK([cat pspp.csv], [0], [dnl
+Variable,Description,Position
+s1,"Format: A9
+Missing Values: ""0 ""
+
+Value,Label
+abc ,First value label
+abcdefgh ,Second value label
+abcdefghi,Third value label",1
+s2,"Format: A9
+Missing Values: ""12 ""; ""123 ""
+
+Value,Label
+0 ,Fourth value label
+01234567 ,Fifth value label
+012345678,Sixth value label",2
+s3,"Format: A9
+Missing Values: ""1234 ""; ""12345 ""; ""12345678""",3
+])
+ AT_CHECK_UNQUOTED([dd if=foo.sav bs=1 count=4; echo], [0], [$magic
+], [ignore])
+done
+AT_CLEANUP
+
+AT_SETUP([write and read compressed files])
+AT_KEYWORDS([SAVE GET system file])
+AT_DATA([sysfile.sps], [dnl
+DATA LIST LIST NOTABLE /x * y (a200).
+BEGIN DATA.
+1.2 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+. yyyyyyyyyyyyyyy
+0 ddddddddddddddddddddddddddddddd
+101 z
+END DATA.
+
+SAVE OUTFILE='com.sav' /COMPRESS .
+
+GET FILE='com.sav'.
+
+LIST.
+])
+AT_CHECK([pspp -o pspp.csv sysfile.sps])
+dnl Make sure file really was compressd, allowing big- or little-endian format.
+AT_CHECK([dd if=com.sav bs=1 skip=72 count=4 2> /dev/null > com.sav.subset])
+od com.sav.subset
+AT_CHECK(
+ [(printf '\000\000\000\001' | cmp -l com.sav.subset -) ||
+ (printf '\001\000\000\000' | cmp -l com.sav.subset -)], [0],
+ [ignore])
+AT_CLEANUP
+
+AT_SETUP([overwriting system file])
+AT_DATA([output.sav], [abcdef
+])
+cp output.sav output.sav.backup
+AT_DATA([sysfile.sps], [dnl
+DATA LIST NOTABLE/x 1.
+BEGIN DATA.
+5
+END DATA.
+SAVE OUTFILE='output.sav'.
+])
+AT_CHECK([pspp -O format=csv sysfile.sps])
+AT_CHECK([cmp output.sav output.sav.backup], [1], [ignore])
+AT_CLEANUP
+
+AT_SETUP([overwriting system file atomically])
+AT_DATA([output.sav], [abcdef
+])
+cp output.sav output.sav.backup
+AT_DATA([sysfile.sps],
+[[DATA LIST NOTABLE/x 1.
+BEGIN DATA.
+5
+END DATA.
+XSAVE OUTFILE='output.sav'.
+HOST COMMAND=['kill -TERM $PPID'].
+]])
+AT_CHECK([pspp -O format=csv sysfile.sps], [143], [], [ignore])
+AT_CHECK([cmp output.sav output.sav.backup])
+AT_CHECK(
+ [for file in *.tmp*; do if test -e $file; then echo $file; exit 1; fi; done])
+AT_CLEANUP
+
+
+AT_SETUP([write to same system file being read])
+AT_DATA([save.sps], [dnl
+DATA LIST NOTABLE/x 1.
+BEGIN DATA.
+3
+END DATA.
+SAVE OUTFILE='data.sav'.
+])
+AT_CHECK([pspp -O format=csv save.sps])
+AT_CHECK([test -s data.sav])
+AT_CHECK(
+ [for file in *.tmp*; do if test -e $file; then echo $file; exit 1; fi; done])
+AT_DATA([save2.sps], [dnl
+GET FILE='data.sav'.
+COMPUTE y = x * 3.
+SAVE OUTFILE='data.sav'.
+])
+AT_CHECK([pspp -O format=csv save2.sps])
+AT_CHECK(
+ [for file in *.tmp*; do if test -e $file; then echo $file; exit 1; fi; done])
+AT_DATA([save3.sps], [dnl
+GET FILE='data.sav'.
+LIST.
+])
+AT_CHECK([pspp -O format=csv save3.sps], [0], [dnl
+Table: Data List
+x,y
+3,9.00
+])
+AT_CLEANUP
+
+AT_SETUP([nonempty case_map doesn't crash])
+AT_KEYWORDS([SAVE system file])
+AT_DATA([save.sps], [dnl
+INPUT PROGRAM.
+ COMPUTE #I = 1.
+ COMPUTE X = #I + 1.
+ END CASE.
+ END FILE.
+END INPUT PROGRAM.
+
+SAVE OUTFILE='tiny.sav'.
+])
+AT_CHECK([pspp -O format=csv save.sps])
+AT_DATA([get.sps], [dnl
+GET FILE='tiny.sav'.
+LIST.
+])
+AT_CHECK([pspp -O format=csv get.sps], [0], [dnl
+Table: Data List
+X
+2.00