484fbb43f1eca08fc089bd0f5ec171215f279403
[pspp] / doc / dev / system-file-format.texi
1 @node System File Format
2 @appendix System File Format
3
4 A system file encapsulates a set of cases and dictionary information
5 that describes how they may be interpreted.  This chapter describes
6 the format of a system file.
7
8 System files use four data types: 8-bit characters, 32-bit integers,
9 64-bit integers, 
10 and 64-bit floating points, called here @code{char}, @code{int32},
11 @code{int64}, and
12 @code{flt64}, respectively.  Data is not necessarily aligned on a word
13 or double-word boundary: the long variable name record (@pxref{Long
14 Variable Names Record}) and very long string records (@pxref{Very Long
15 String Record}) have arbitrary byte length and can therefore cause all
16 data coming after them in the file to be misaligned.
17
18 Integer data in system files may be big-endian or little-endian.  A
19 reader may detect the endianness of a system file by examining
20 @code{layout_code} in the file header record
21 (@pxref{layout_code,,@code{layout_code}}).
22
23 Floating-point data in system files may nominally be in IEEE 754, IBM,
24 or VAX formats.  A reader may detect the floating-point format in use
25 by examining @code{bias} in the file header record
26 (@pxref{bias,,@code{bias}}).
27
28 PSPP detects big-endian and little-endian integer formats in system
29 files and translates as necessary.  PSPP also detects the
30 floating-point format in use, as well as the endianness of IEEE 754
31 floating-point numbers, and translates as needed.  However, only IEEE
32 754 numbers with the same endianness as integer data in the same file
33 have actually been observed in system files, and it is likely that
34 other formats are obsolete or were never used.
35
36 System files use a few floating point values for special purposes:
37
38 @table @asis
39 @item SYSMIS
40 The system-missing value is represented by the largest possible
41 negative number in the floating point format (@code{-DBL_MAX}).
42
43 @item HIGHEST
44 HIGHEST is used as the high end of a missing value range with an
45 unbounded maximum.  It is represented by the largest possible positive
46 number (@code{DBL_MAX}).
47
48 @item LOWEST
49 LOWEST is used as the low end of a missing value range with an
50 unbounded minimum.  It was originally represented by the
51 second-largest negative number (in IEEE 754 format,
52 @code{0xffeffffffffffffe}).  System files written by SPSS 21 and later
53 instead use the largest negative number (@code{-DBL_MAX}), the same
54 value as SYSMIS.  This does not lead to ambiguity because LOWEST
55 appears in system files only in missing value ranges, which never
56 contain SYSMIS.
57 @end table
58
59 System files may use most character encodings based on an 8-bit unit.
60 UTF-16 and UTF-32, based on wider units, appear to be unacceptable.
61 @code{rec_type} in the file header record is sufficient to distinguish
62 between ASCII and EBCDIC based encodings.  The best way to determine
63 the specific encoding in use is to consult the character encoding
64 record (@pxref{Character Encoding Record}), if present, and failing
65 that the @code{character_code} in the machine integer info record
66 (@pxref{Machine Integer Info Record}).  The same encoding should be
67 used for the dictionary and the data in the file, although it is
68 possible to artificially synthesize files that use different encodings
69 (@pxref{Character Encoding Record}).
70
71 @menu
72 * System File Record Structure::
73 * File Header Record::
74 * Variable Record::
75 * Value Labels Records::
76 * Document Record::
77 * Machine Integer Info Record::
78 * Machine Floating-Point Info Record::
79 * Multiple Response Sets Records::
80 * Extra Product Info Record::
81 * Variable Display Parameter Record::
82 * Long Variable Names Record::
83 * Very Long String Record::
84 * Character Encoding Record::
85 * Long String Value Labels Record::
86 * Long String Missing Values Record::
87 * Data File and Variable Attributes Records::
88 * Extended Number of Cases Record::
89 * Other Informational Records::
90 * Dictionary Termination Record::
91 * Data Record::
92 @end menu
93
94 @node System File Record Structure
95 @section System File Record Structure
96
97 System files are divided into records with the following format:
98
99 @example
100 int32               type;
101 char                data[];
102 @end example
103
104 This header does not identify the length of the @code{data} or any
105 information about what it contains, so the system file reader must
106 understand the format of @code{data} based on @code{type}.  However,
107 records with type 7, called @dfn{extension records}, have a stricter
108 format:
109
110 @example
111 int32               type;
112 int32               subtype;
113 int32               size;
114 int32               count;
115 char                data[size * count];
116 @end example
117
118 @table @code
119 @item int32 rec_type;
120 Record type.  Always set to 7.
121
122 @item int32 subtype;
123 Record subtype.  This value identifies a particular kind of extension
124 record.
125
126 @item int32 size;
127 The size of each piece of data that follows the header, in bytes.
128 Known extension records use 1, 4, or 8, for @code{char}, @code{int32},
129 and @code{flt64} format data, respectively.
130
131 @item int32 count;
132 The number of pieces of data that follow the header.
133
134 @item char data[size * count];
135 Data, whose format and interpretation depend on the subtype.
136 @end table
137
138 An extension record contains exactly @code{size * count} bytes of
139 data, which allows a reader that does not understand an extension
140 record to skip it.  Extension records provide only nonessential
141 information, so this allows for files written by newer software to
142 preserve backward compatibility with older or less capable readers.
143
144 Records in a system file must appear in the following order:
145
146 @itemize @bullet
147 @item
148 File header record.
149
150 @item
151 Variable records.
152
153 @item
154 All pairs of value labels records and value label variables records,
155 if present.
156
157 @item
158 Document record, if present.
159
160 @item
161 Extension (type 7) records, in ascending numerical order of their
162 subtypes.
163
164 System files written by SPSS include at most one of each kind of
165 extension record.  This is generally true of system files written by
166 other software as well, with known exceptions noted below in the
167 individual sections about each type of record.
168
169 @item
170 Dictionary termination record.
171
172 @item
173 Data record.
174 @end itemize
175
176 We advise authors of programs that read system files to tolerate
177 format variations.  Various kinds of misformatting and corruption have
178 been observed in system files written by SPSS and other software
179 alike.  In particular, because extension records provide nonessential
180 information, it is generally better to ignore an extension record
181 entirely than to refuse to read a system file.
182
183 The following sections describe the known kinds of records.
184
185 @node File Header Record
186 @section File Header Record
187
188 A system file begins with the file header, with the following format:
189
190 @example
191 char                rec_type[4];
192 char                prod_name[60];
193 int32               layout_code;
194 int32               nominal_case_size;
195 int32               compression;
196 int32               weight_index;
197 int32               ncases;
198 flt64               bias;
199 char                creation_date[9];
200 char                creation_time[8];
201 char                file_label[64];
202 char                padding[3];
203 @end example
204
205 @table @code
206 @item char rec_type[4];
207 Record type code, either @samp{$FL2} for system files with
208 uncompressed data or data compressed with simple bytecode compression,
209 or @samp{$FL3} for system files with ZLIB compressed data.
210
211 This is truly a character field that uses the character encoding as
212 other strings.  Thus, in a file with an ASCII-based character encoding
213 this field contains @code{24 46 4c 32} or @code{24 46 4c 33}, and in a
214 file with an EBCDIC-based encoding this field contains @code{5b c6 d3
215 f2}.  (No EBCDIC-based ZLIB-compressed files have been observed.)
216
217 @item char prod_name[60];
218 Product identification string.  This always begins with the characters
219 @samp{@@(#) SPSS DATA FILE}.  PSPP uses the remaining characters to
220 give its version and the operating system name; for example, @samp{GNU
221 pspp 0.1.4 - sparc-sun-solaris2.5.2}.  The string is truncated if it
222 would be longer than 60 characters; otherwise it is padded on the right
223 with spaces.
224
225 The product name field allow readers to behave differently based on
226 quirks in the way that particular software writes system files.
227 @xref{Value Labels Records}, for the detail of the quirk that the PSPP
228 system file reader tolerates in files written by ReadStat, which has
229 @code{https://github.com/WizardMac/ReadStat} in @code{prod_name}.
230
231 @anchor{layout_code}
232 @item int32 layout_code;
233 Normally set to 2, although a few system files have been spotted in
234 the wild with a value of 3 here.  PSPP use this value to determine the
235 file's integer endianness (@pxref{System File Format}).
236
237 @item int32 nominal_case_size;
238 Number of data elements per case.  This is the number of variables,
239 except that long string variables add extra data elements (one for every
240 8 characters after the first 8).  However, string variables do not
241 contribute to this value beyond the first 255 bytes.   Further, some
242 software always writes -1 or 0 in this field.  In general, it is
243 unsafe for systems reading system files to rely upon this value.
244
245 @item int32 compression;
246 Set to 0 if the data in the file is not compressed, 1 if the data is
247 compressed with simple bytecode compression, 2 if the data is ZLIB
248 compressed.  This field has value 2 if and only if @code{rec_type} is
249 @samp{$FL3}.
250
251 @item int32 weight_index;
252 If one of the variables in the data set is used as a weighting
253 variable, set to the dictionary index of that variable, plus 1
254 (@pxref{Dictionary Index}).  Otherwise, set to 0.
255
256 @item int32 ncases;
257 Set to the number of cases in the file if it is known, or -1 otherwise.
258
259 In the general case it is not possible to determine the number of cases
260 that will be output to a system file at the time that the header is
261 written.  The way that this is dealt with is by writing the entire
262 system file, including the header, then seeking back to the beginning of
263 the file and writing just the @code{ncases} field.  For files in which
264 this is not valid, the seek operation fails.  In this case,
265 @code{ncases} remains -1.
266
267 @anchor{bias}
268 @item flt64 bias;
269 Compression bias, ordinarily set to 100.  Only integers between
270 @code{1 - bias} and @code{251 - bias} can be compressed.
271
272 By assuming that its value is 100, PSPP uses @code{bias} to determine
273 the file's floating-point format and endianness (@pxref{System File
274 Format}).  If the compression bias is not 100, PSPP cannot auto-detect
275 the floating-point format and assumes that it is IEEE 754 format with
276 the same endianness as the system file's integers, which is correct
277 for all known system files.
278
279 @item char creation_date[9];
280 Date of creation of the system file, in @samp{dd mmm yy}
281 format, with the month as standard English abbreviations, using an
282 initial capital letter and following with lowercase.  If the date is not
283 available then this field is arbitrarily set to @samp{01 Jan 70}.
284
285 @item char creation_time[8];
286 Time of creation of the system file, in @samp{hh:mm:ss}
287 format and using 24-hour time.  If the time is not available then this
288 field is arbitrarily set to @samp{00:00:00}.
289
290 @item char file_label[64];
291 File label declared by the user, if any (@pxref{FILE LABEL,,,pspp,
292 PSPP Users Guide}).  Padded on the right with spaces.
293
294 A product that identifies itself as @code{VOXCO INTERVIEWER 4.3} uses
295 CR-only line ends in this field, rather than the more usual LF-only or
296 CR LF line ends.
297
298 @item char padding[3];
299 Ignored padding bytes to make the structure a multiple of 32 bits in
300 length.  Set to zeros.
301 @end table
302
303 @node Variable Record
304 @section Variable Record
305
306 There must be one variable record for each numeric variable and each
307 string variable with width 8 bytes or less.  String variables wider
308 than 8 bytes have one variable record for each 8 bytes, rounding up.
309 The first variable record for a long string specifies the variable's
310 correct dictionary information.  Subsequent variable records for a
311 long string are filled with dummy information: a type of -1, no
312 variable label or missing values, print and write formats that are
313 ignored, and an empty string as name.  A few system files have been
314 encountered that include a variable label on dummy variable records,
315 so readers should take care to parse dummy variable records in the
316 same way as other variable records.
317
318 @anchor{Dictionary Index}
319 The @dfn{dictionary index} of a variable is its offset in the set of
320 variable records, including dummy variable records for long string
321 variables.  The first variable record has a dictionary index of 0, the
322 second has a dictionary index of 1, and so on.
323
324 The system file format does not directly support string variables
325 wider than 255 bytes.  Such very long string variables are represented
326 by a number of narrower string variables.  @xref{Very Long String
327 Record}, for details.
328
329 A system file should contain at least one variable and thus at least
330 one variable record, but system files have been observed in the wild
331 without any variables (thus, no data either).
332
333 @example
334 int32               rec_type;
335 int32               type;
336 int32               has_var_label;
337 int32               n_missing_values;
338 int32               print;
339 int32               write;
340 char                name[8];
341
342 /* @r{Present only if @code{has_var_label} is 1.} */
343 int32               label_len;
344 char                label[];
345
346 /* @r{Present only if @code{n_missing_values} is nonzero}. */
347 flt64               missing_values[];
348 @end example
349
350 @table @code
351 @item int32 rec_type;
352 Record type code.  Always set to 2.
353
354 @item int32 type;
355 Variable type code.  Set to 0 for a numeric variable.  For a short
356 string variable or the first part of a long string variable, this is set
357 to the width of the string.  For the second and subsequent parts of a
358 long string variable, set to -1, and the remaining fields in the
359 structure are ignored.
360
361 @item int32 has_var_label;
362 If this variable has a variable label, set to 1; otherwise, set to 0.
363
364 @item int32 n_missing_values;
365 If the variable has no missing values, set to 0.  If the variable has
366 one, two, or three discrete missing values, set to 1, 2, or 3,
367 respectively.  If the variable has a range for missing variables, set to
368 -2; if the variable has a range for missing variables plus a single
369 discrete value, set to -3.
370
371 A long string variable always has the value 0 here.  A separate record
372 indicates missing values for long string variables (@pxref{Long String
373 Missing Values Record}).
374
375 @item int32 print;
376 Print format for this variable.  See below.
377
378 @item int32 write;
379 Write format for this variable.  See below.
380
381 @item char name[8];
382 Variable name.  The variable name must begin with a capital letter or
383 the at-sign (@samp{@@}).  Subsequent characters may also be digits, octothorpes
384 (@samp{#}), dollar signs (@samp{$}), underscores (@samp{_}), or full
385 stops (@samp{.}).  The variable name is padded on the right with spaces.
386
387 The @samp{name} fields should be unique within a system file.  System
388 files written by SPSS that contain very long string variables with
389 similar names sometimes contain duplicate names that are later
390 eliminated by resolving the very long string names (@pxref{Very Long
391 String Record}).  PSPP handles duplicates by assigning them new,
392 unique names.
393
394 @item int32 label_len;
395 This field is present only if @code{has_var_label} is set to 1.  It is
396 set to the length, in characters, of the variable label.  The
397 documented maximum length varies from 120 to 255 based on SPSS
398 version, but some files have been seen with longer labels.  PSPP
399 accepts labels of any length.
400
401 @item char label[];
402 This field is present only if @code{has_var_label} is set to 1.  It has
403 length @code{label_len}, rounded up to the nearest multiple of 32 bits.
404 The first @code{label_len} characters are the variable's variable label.
405
406 @item flt64 missing_values[];
407 This field is present only if @code{n_missing_values} is nonzero.  It
408 has the same number of 8-byte elements as the absolute value of
409 @code{n_missing_values}.  Each element is interpreted as a number for
410 numeric variables (with HIGHEST and LOWEST indicated as described in
411 the chapter introduction).  For string variables of width less than 8
412 bytes, elements are right-padded with spaces; for string variables
413 wider than 8 bytes, only the first 8 bytes of each missing value are
414 specified, with the remainder implicitly all spaces.
415
416 For discrete missing values, each element represents one missing
417 value.  When a range is present, the first element denotes the minimum
418 value in the range, and the second element denotes the maximum value
419 in the range.  When a range plus a value are present, the third
420 element denotes the additional discrete missing value.
421 @end table
422
423 @anchor{System File Output Formats}
424 The @code{print} and @code{write} members of sysfile_variable are output
425 formats coded into @code{int32} types.  The least-significant byte
426 of the @code{int32} represents the number of decimal places, and the
427 next two bytes in order of increasing significance represent field width
428 and format type, respectively.  The most-significant byte is not
429 used and should be set to zero.
430
431 Format types are defined as follows:
432
433 @quotation
434 @multitable {Value} {@code{DATETIME}}
435 @headitem Value
436 @tab Meaning
437 @item 0
438 @tab Not used.
439 @item 1
440 @tab @code{A}
441 @item 2
442 @tab @code{AHEX}
443 @item 3
444 @tab @code{COMMA}
445 @item 4
446 @tab @code{DOLLAR}
447 @item 5
448 @tab @code{F}
449 @item 6
450 @tab @code{IB}
451 @item 7
452 @tab @code{PIBHEX}
453 @item 8
454 @tab @code{P}
455 @item 9
456 @tab @code{PIB}
457 @item 10
458 @tab @code{PK}
459 @item 11
460 @tab @code{RB}
461 @item 12
462 @tab @code{RBHEX}
463 @item 13
464 @tab Not used.
465 @item 14
466 @tab Not used.
467 @item 15
468 @tab @code{Z}
469 @item 16
470 @tab @code{N}
471 @item 17
472 @tab @code{E}
473 @item 18
474 @tab Not used.
475 @item 19
476 @tab Not used.
477 @item 20
478 @tab @code{DATE}
479 @item 21
480 @tab @code{TIME}
481 @item 22
482 @tab @code{DATETIME}
483 @item 23
484 @tab @code{ADATE}
485 @item 24
486 @tab @code{JDATE}
487 @item 25
488 @tab @code{DTIME}
489 @item 26
490 @tab @code{WKDAY}
491 @item 27
492 @tab @code{MONTH}
493 @item 28
494 @tab @code{MOYR}
495 @item 29
496 @tab @code{QYR}
497 @item 30
498 @tab @code{WKYR}
499 @item 31
500 @tab @code{PCT}
501 @item 32
502 @tab @code{DOT}
503 @item 33
504 @tab @code{CCA}
505 @item 34
506 @tab @code{CCB}
507 @item 35
508 @tab @code{CCC}
509 @item 36
510 @tab @code{CCD}
511 @item 37
512 @tab @code{CCE}
513 @item 38
514 @tab @code{EDATE}
515 @item 39
516 @tab @code{SDATE}
517 @end multitable
518 @end quotation
519
520 A few system files have been observed in the wild with invalid
521 @code{write} fields, in particular with value 0.  Readers should
522 probably treat invalid @code{print} or @code{write} fields as some
523 default format.
524
525 @node Value Labels Records
526 @section Value Labels Records
527
528 The value label records documented in this section are used for
529 numeric and short string variables only.  Long string variables may
530 have value labels, but their value labels are recorded using a
531 different record type (@pxref{Long String Value Labels Record}).
532
533 ReadStat (@pxref{File Header Record}) writes value labels that label a
534 single value more than once.  In more detail, it emits value labels
535 whose values are longer than string variables' widths, that are
536 identical in the actual width of the variable, e.g.@: labels for
537 values @code{ABC123} and @code{ABC456} for a string variable with
538 width 3.  For files written by this software, PSPP ignores such
539 labels.
540
541 The value label record has the following format:
542
543 @example
544 int32               rec_type;
545 int32               label_count;
546
547 /* @r{Repeated @code{label_cnt} times}. */
548 char                value[8];
549 char                label_len;
550 char                label[];
551 @end example
552
553 @table @code
554 @item int32 rec_type;
555 Record type.  Always set to 3.
556
557 @item int32 label_count;
558 Number of value labels present in this record.
559 @end table
560
561 The remaining fields are repeated @code{count} times.  Each
562 repetition specifies one value label.
563
564 @table @code
565 @item char value[8];
566 A numeric value or a short string value padded as necessary to 8 bytes
567 in length.  Its type and width cannot be determined until the
568 following value label variables record (see below) is read.
569
570 @item char label_len;
571 The label's length, in bytes.  The documented maximum length varies
572 from 60 to 120 based on SPSS version.  PSPP supports value labels up
573 to 255 bytes long.
574
575 @item char label[];
576 @code{label_len} bytes of the actual label, followed by up to 7 bytes
577 of padding to bring @code{label} and @code{label_len} together to a
578 multiple of 8 bytes in length.
579 @end table
580
581 The value label record is always immediately followed by a value label
582 variables record with the following format:
583
584 @example
585 int32               rec_type;
586 int32               var_count;
587 int32               vars[];
588 @end example
589
590 @table @code
591 @item int32 rec_type;
592 Record type.  Always set to 4.
593
594 @item int32 var_count;
595 Number of variables that the associated value labels from the value
596 label record are to be applied.
597
598 @item int32 vars[];
599 A list of dictionary indexes of variables to which to apply the value
600 labels (@pxref{Dictionary Index}).  There are @code{var_count}
601 elements.
602
603 String variables wider than 8 bytes may not be specified in this list.
604 @end table
605
606 @node Document Record
607 @section Document Record
608
609 The document record, if present, has the following format:
610
611 @example
612 int32               rec_type;
613 int32               n_lines;
614 char                lines[][80];
615 @end example
616
617 @table @code
618 @item int32 rec_type;
619 Record type.  Always set to 6.
620
621 @item int32 n_lines;
622 Number of lines of documents present.  This should be greater than
623 zero, but ReadStats writes system files with zero @code{n_lines}.
624
625 @item char lines[][80];
626 Document lines.  The number of elements is defined by @code{n_lines}.
627 Lines shorter than 80 characters are padded on the right with spaces.
628 @end table
629
630 @node Machine Integer Info Record
631 @section Machine Integer Info Record
632
633 The integer info record, if present, has the following format:
634
635 @example
636 /* @r{Header.} */
637 int32               rec_type;
638 int32               subtype;
639 int32               size;
640 int32               count;
641
642 /* @r{Data.} */
643 int32               version_major;
644 int32               version_minor;
645 int32               version_revision;
646 int32               machine_code;
647 int32               floating_point_rep;
648 int32               compression_code;
649 int32               endianness;
650 int32               character_code;
651 @end example
652
653 @table @code
654 @item int32 rec_type;
655 Record type.  Always set to 7.
656
657 @item int32 subtype;
658 Record subtype.  Always set to 3.
659
660 @item int32 size;
661 Size of each piece of data in the data part, in bytes.  Always set to 4.
662
663 @item int32 count;
664 Number of pieces of data in the data part.  Always set to 8.
665
666 @item int32 version_major;
667 PSPP major version number.  In version @var{x}.@var{y}.@var{z}, this
668 is @var{x}.
669
670 @item int32 version_minor;
671 PSPP minor version number.  In version @var{x}.@var{y}.@var{z}, this
672 is @var{y}.
673
674 @item int32 version_revision;
675 PSPP version revision number.  In version @var{x}.@var{y}.@var{z},
676 this is @var{z}.
677
678 @item int32 machine_code;
679 Machine code.  PSPP always set this field to value to -1, but other
680 values may appear.
681
682 @item int32 floating_point_rep;
683 Floating point representation code.  For IEEE 754 systems this is 1.
684 IBM 370 sets this to 2, and DEC VAX E to 3.
685
686 @item int32 compression_code;
687 Compression code.  Always set to 1, regardless of whether or how the
688 file is compressed.
689
690 @item int32 endianness;
691 Machine endianness.  1 indicates big-endian, 2 indicates little-endian.
692
693 @item int32 character_code;
694 @anchor{character-code} Character code.  The following values have
695 been actually observed in system files:
696
697 @table @asis
698 @item 1
699 EBCDIC.
700
701 @item 2
702 7-bit ASCII.
703
704 @item 1250
705 The @code{windows-1250} code page for Central European and Eastern
706 European languages.
707
708 @item 1252
709 The @code{windows-1252} code page for Western European languages.
710
711 @item 28591
712 ISO 8859-1.
713
714 @item 65001
715 UTF-8.
716 @end table
717
718 The following additional values are known to be defined:
719
720 @table @asis
721 @item 3
722 8-bit ``ASCII''.
723
724 @item 4
725 DEC Kanji.
726 @end table
727
728 Other Windows code page numbers are known to be generally valid.
729
730 Old versions of SPSS for Unix and Windows always wrote value 2 in this
731 field, regardless of the encoding in use.  Newer versions also write
732 the character encoding as a string (see @ref{Character Encoding
733 Record}).
734 @end table
735
736 @node Machine Floating-Point Info Record
737 @section Machine Floating-Point Info Record
738
739 The floating-point info record, if present, has the following format:
740
741 @example
742 /* @r{Header.} */
743 int32               rec_type;
744 int32               subtype;
745 int32               size;
746 int32               count;
747
748 /* @r{Data.} */
749 flt64               sysmis;
750 flt64               highest;
751 flt64               lowest;
752 @end example
753
754 @table @code
755 @item int32 rec_type;
756 Record type.  Always set to 7.
757
758 @item int32 subtype;
759 Record subtype.  Always set to 4.
760
761 @item int32 size;
762 Size of each piece of data in the data part, in bytes.  Always set to 8.
763
764 @item int32 count;
765 Number of pieces of data in the data part.  Always set to 3.
766
767 @item flt64 sysmis;
768 @itemx flt64 highest;
769 @itemx flt64 lowest;
770 The system missing value, the value used for HIGHEST in missing
771 values, and the value used for LOWEST in missing values, respectively.
772 @xref{System File Format}, for more information.
773
774 The SPSSWriter library in PHP, which identifies itself as @code{FOM
775 SPSS 1.0.0} in the file header record @code{prod_name} field, writes
776 unexpected values to these fields, but it uses the same values
777 consistently throughout the rest of the file.
778 @end table
779
780 @node Multiple Response Sets Records
781 @section Multiple Response Sets Records
782
783 The system file format has two different types of records that
784 represent multiple response sets (@pxref{MRSETS,,,pspp, PSPP Users
785 Guide}).  The first type of record describes multiple response sets
786 that can be understood by SPSS before version 14.  The second type of
787 record, with a closely related format, is used for multiple dichotomy
788 sets that use the CATEGORYLABELS=COUNTEDVALUES feature added in
789 version 14.
790
791 @example
792 /* @r{Header.} */
793 int32               rec_type;
794 int32               subtype;
795 int32               size;
796 int32               count;
797
798 /* @r{Exactly @code{count} bytes of data.} */
799 char                mrsets[];
800 @end example
801
802 @table @code
803 @item int32 rec_type;
804 Record type.  Always set to 7.
805
806 @item int32 subtype;
807 Record subtype.  Set to 7 for records that describe multiple response
808 sets understood by SPSS before version 14, or to 19 for records that
809 describe dichotomy sets that use the CATEGORYLABELS=COUNTEDVALUES
810 feature added in version 14.
811
812 @item int32 size;
813 The size of each element in the @code{mrsets} member. Always set to 1.
814
815 @item int32 count;
816 The total number of bytes in @code{mrsets}.
817
818 @item char mrsets[];
819 Zero or more line feeds (byte 0x0a), followed by a series of multiple
820 response sets, each of which consists of the following:
821
822 @itemize @bullet
823 @item
824 The set's name (an identifier that begins with @samp{$}), in mixed
825 upper and lower case.
826
827 @item
828 An equals sign (@samp{=}).
829
830 @item
831 @samp{C} for a multiple category set, @samp{D} for a multiple
832 dichotomy set with CATEGORYLABELS=VARLABELS, or @samp{E} for a
833 multiple dichotomy set with CATEGORYLABELS=COUNTEDVALUES.
834
835 @item
836 For a multiple dichotomy set with CATEGORYLABELS=COUNTEDVALUES, a
837 space, followed by a number expressed as decimal digits, followed by a
838 space.  If LABELSOURCE=VARLABEL was specified on MRSETS, then the
839 number is 11; otherwise it is 1.@footnote{This part of the format may
840 not be fully understood, because only a single example of each
841 possibility has been examined.}
842
843 @item
844 For either kind of multiple dichotomy set, the counted value, as a
845 positive integer count specified as decimal digits, followed by a
846 space, followed by as many string bytes as specified in the count.  If
847 the set contains numeric variables, the string consists of the counted
848 integer value expressed as decimal digits.  If the set contains string
849 variables, the string contains the counted string value.  Either way,
850 the string may be padded on the right with spaces (older versions of
851 SPSS seem to always pad to a width of 8 bytes; newer versions don't).
852
853 @item
854 A space.
855
856 @item
857 The multiple response set's label, using the same format as for the
858 counted value for multiple dichotomy sets.  A string of length 0 means
859 that the set does not have a label.  A string of length 0 is also
860 written if LABELSOURCE=VARLABEL was specified.
861
862 @item
863 A space.
864
865 @item
866 The short names of the variables in the set, converted to lowercase,
867 each separated from the previous by a single space.
868
869 Even though a multiple response set must have at least two variables,
870 some system files contain multiple response sets with no variables or
871 one variable.  The source and meaning of these multiple response sets is
872 unknown.  (Perhaps they arise from creating a multiple response set
873 then deleting all the variables that it contains?)
874
875 @item
876 One line feed (byte 0x0a).  Sometimes multiple, even hundreds, of line
877 feeds are present.
878 @end itemize
879 @end table
880
881 Example: Given appropriate variable definitions, consider the
882 following MRSETS command:
883
884 @example
885 MRSETS /MCGROUP NAME=$a LABEL='my mcgroup' VARIABLES=a b c
886        /MDGROUP NAME=$b VARIABLES=g e f d VALUE=55
887        /MDGROUP NAME=$c LABEL='mdgroup #2' VARIABLES=h i j VALUE='Yes'
888        /MDGROUP NAME=$d LABEL='third mdgroup' CATEGORYLABELS=COUNTEDVALUES
889         VARIABLES=k l m VALUE=34
890        /MDGROUP NAME=$e CATEGORYLABELS=COUNTEDVALUES LABELSOURCE=VARLABEL
891         VARIABLES=n o p VALUE='choice'.
892 @end example
893
894 The above would generate the following multiple response set record of
895 subtype 7:
896
897 @example
898 $a=C 10 my mcgroup a b c
899 $b=D2 55 0  g e f d
900 $c=D3 Yes 10 mdgroup #2 h i j
901 @end example
902
903 It would also generate the following multiple response set record with
904 subtype 19:
905
906 @example
907 $d=E 1 2 34 13 third mdgroup k l m
908 $e=E 11 6 choice 0  n o p
909 @end example
910
911 @node Extra Product Info Record
912 @section Extra Product Info Record
913
914 This optional record appears to contain a text string that describes
915 the program that wrote the file and the source of the data.  (This is
916 redundant with the file label and product info found in the file
917 header record.)
918
919 @example
920 /* @r{Header.} */
921 int32               rec_type;
922 int32               subtype;
923 int32               size;
924 int32               count;
925
926 /* @r{Exactly @code{count} bytes of data.} */
927 char                info[];
928 @end example
929
930 @table @code
931 @item int32 rec_type;
932 Record type.  Always set to 7.
933
934 @item int32 subtype;
935 Record subtype.  Always set to 10.
936
937 @item int32 size;
938 The size of each element in the @code{info} member. Always set to 1.
939
940 @item int32 count;
941 The total number of bytes in @code{info}.
942
943 @item char info[];
944 A text string.  A product that identifies itself as @code{VOXCO
945 INTERVIEWER 4.3} uses CR-only line ends in this field, rather than the
946 more usual LF-only or CR LF line ends.
947 @end table
948
949 @node Variable Display Parameter Record
950 @section Variable Display Parameter Record
951
952 The variable display parameter record, if present, has the following
953 format:
954
955 @example
956 /* @r{Header.} */
957 int32               rec_type;
958 int32               subtype;
959 int32               size;
960 int32               count;
961
962 /* @r{Repeated @code{count} times}. */
963 int32               measure;
964 int32               width;           /* @r{Not always present.} */
965 int32               alignment;
966 @end example
967
968 @table @code
969 @item int32 rec_type;
970 Record type.  Always set to 7.
971
972 @item int32 subtype;
973 Record subtype.  Always set to 11.
974
975 @item int32 size;
976 The size of @code{int32}.  Always set to 4.
977
978 @item int32 count;
979 The number of sets of variable display parameters (ordinarily the
980 number of variables in the dictionary), times 2 or 3.
981 @end table
982
983 The remaining members are repeated @code{count} times, in the same
984 order as the variable records.  No element corresponds to variable
985 records that continue long string variables.  The meanings of these
986 members are as follows:
987
988 @table @code
989 @item int32 measure;
990 The measurement type of the variable:
991 @table @asis
992 @item 1
993 Nominal Scale
994 @item 2
995 Ordinal Scale
996 @item 3
997 Continuous Scale
998 @end table
999
1000 SPSS sometimes writes a @code{measure} of 0.  PSPP interprets this as
1001 nominal scale.
1002
1003 @item int32 width;
1004 The width of the display column for the variable in characters.
1005
1006 This field is present if @var{count} is 3 times the number of
1007 variables in the dictionary.  It is omitted if @var{count} is 2 times
1008 the number of variables.
1009
1010 @item int32 alignment;
1011 The alignment of the variable for display purposes:
1012
1013 @table @asis
1014 @item 0
1015 Left aligned
1016 @item 1
1017 Right aligned
1018 @item 2
1019 Centre aligned
1020 @end table
1021 @end table
1022
1023 @node Long Variable Names Record
1024 @section Long Variable Names Record
1025
1026 If present, the long variable names record has the following format:
1027
1028 @example
1029 /* @r{Header.} */
1030 int32               rec_type;
1031 int32               subtype;
1032 int32               size;
1033 int32               count;
1034
1035 /* @r{Exactly @code{count} bytes of data.} */
1036 char                var_name_pairs[];
1037 @end example
1038
1039 @table @code
1040 @item int32 rec_type;
1041 Record type.  Always set to 7.
1042
1043 @item int32 subtype;
1044 Record subtype.  Always set to 13.
1045
1046 @item int32 size;
1047 The size of each element in the @code{var_name_pairs} member. Always set to 1.
1048
1049 @item int32 count;
1050 The total number of bytes in @code{var_name_pairs}.
1051
1052 @item char var_name_pairs[];
1053 A list of @var{key}--@var{value} tuples, where @var{key} is the name
1054 of a variable, and @var{value} is its long variable name.
1055 The @var{key} field is at most 8 bytes long and must match the
1056 name of a variable which appears in the variable record (@pxref{Variable
1057 Record}).
1058 The @var{value} field is at most 64 bytes long.
1059 The @var{key} and @var{value} fields are separated by a @samp{=} byte.
1060 Each tuple is separated by a byte whose value is 09.  There is no
1061 trailing separator following the last tuple.
1062 The total length is @code{count} bytes.
1063 @end table
1064
1065 @node Very Long String Record
1066 @section Very Long String Record
1067
1068 Old versions of SPSS limited string variables to a width of 255 bytes.
1069 For backward compatibility with these older versions, the system file
1070 format represents a string longer than 255 bytes, called a @dfn{very
1071 long string}, as a collection of strings no longer than 255 bytes
1072 each.  The strings concatenated to make a very long string are called
1073 its @dfn{segments}; for consistency, variables other than very long
1074 strings are considered to have a single segment.
1075
1076 A very long string with a width of @var{w} has @var{n} =
1077 (@var{w} + 251) / 252 segments, that is, one segment for every
1078 252 bytes of width, rounding up.  It would be logical, then, for each
1079 of the segments except the last to have a width of 252 and the last
1080 segment to have the remainder, but this is not the case.  In fact,
1081 each segment except the last has a width of 255 bytes.  The last
1082 segment has width @var{w} - (@var{n} - 1) * 252; some versions
1083 of SPSS make it slightly wider, but not wide enough to make the last
1084 segment require another 8 bytes of data.
1085
1086 Data is packed tightly into segments of a very long string, 255 bytes
1087 per segment.  Because 255 bytes of segment data are allocated for
1088 every 252 bytes of the very long string's width (approximately), some
1089 unused space is left over at the end of the allocated segments.  Data
1090 in unused space is ignored.
1091
1092 Example: Consider a very long string of width 20,000.  Such a very
1093 long string has 20,000 / 252 = 80 (rounding up) segments.  The first
1094 79 segments have width 255; the last segment has width 20,000 - 79 *
1095 252 = 92 or slightly wider (up to 96 bytes, the next multiple of 8).
1096 The very long string's data is actually stored in the 19,890 bytes in
1097 the first 78 segments, plus the first 110 bytes of the 79th segment
1098 (19,890 + 110 = 20,000).  The remaining 145 bytes of the 79th segment
1099 and all 92 bytes of the 80th segment are unused.
1100
1101 The very long string record explains how to stitch together segments
1102 to obtain very long string data.  For each of the very long string
1103 variables in the dictionary, it specifies the name of its first
1104 segment's variable and the very long string variable's actual width.
1105 The remaining segments immediately follow the named variable in the
1106 system file's dictionary.
1107
1108 The very long string record, which is present only if the system file
1109 contains very long string variables, has the following format:
1110
1111 @example
1112 /* @r{Header.} */
1113 int32               rec_type;
1114 int32               subtype;
1115 int32               size;
1116 int32               count;
1117
1118 /* @r{Exactly @code{count} bytes of data.} */
1119 char                string_lengths[];
1120 @end example
1121
1122 @table @code
1123 @item int32 rec_type;
1124 Record type.  Always set to 7.
1125
1126 @item int32 subtype;
1127 Record subtype.  Always set to 14.
1128
1129 @item int32 size;
1130 The size of each element in the @code{string_lengths} member. Always set to 1.
1131
1132 @item int32 count;
1133 The total number of bytes in @code{string_lengths}.
1134
1135 @item char string_lengths[];
1136 A list of @var{key}--@var{value} tuples, where @var{key} is the name
1137 of a variable, and @var{value} is its length.
1138 The @var{key} field is at most 8 bytes long and must match the
1139 name of a variable which appears in the variable record (@pxref{Variable
1140 Record}).
1141 The @var{value} field is exactly 5 bytes long. It is a zero-padded,
1142 ASCII-encoded string that is the length of the variable.
1143 The @var{key} and @var{value} fields are separated by a @samp{=} byte.
1144 Tuples are delimited by a two-byte sequence @{00, 09@}.
1145 After the last tuple, there may be a single byte 00, or @{00, 09@}.
1146 The total length is @code{count} bytes.
1147 @end table
1148
1149 @node Character Encoding Record
1150 @section Character Encoding Record
1151
1152 This record, if present, indicates the character encoding for string data,
1153 long variable names, variable labels, value labels and other strings in the
1154 file.
1155
1156 @example
1157 /* @r{Header.} */
1158 int32               rec_type;
1159 int32               subtype;
1160 int32               size;
1161 int32               count;
1162
1163 /* @r{Exactly @code{count} bytes of data.} */
1164 char                encoding[];
1165 @end example
1166
1167 @table @code
1168 @item int32 rec_type;
1169 Record type.  Always set to 7.
1170
1171 @item int32 subtype;
1172 Record subtype.  Always set to 20.
1173
1174 @item int32 size;
1175 The size of each element in the @code{encoding} member. Always set to 1.
1176
1177 @item int32 count;
1178 The total number of bytes in @code{encoding}.
1179
1180 @item char encoding[];
1181 The name of the character encoding.  Normally this will be an official
1182 IANA character set name or alias.
1183 See @url{http://www.iana.org/assignments/character-sets}.
1184 Character set names are not case-sensitive, but SPSS appears to write
1185 them in all-uppercase.
1186 @end table
1187
1188 This record is not present in files generated by older software.  See
1189 also the @code{character_code} field in the machine integer info
1190 record (@pxref{character-code}).
1191
1192 When the character encoding record and the machine integer info record
1193 are both present, all system files observed in practice indicate the
1194 same character encoding, e.g.@: 1252 as @code{character_code} and
1195 @code{windows-1252} as @code{encoding}, 65001 and @code{UTF-8}, etc.
1196
1197 If, for testing purposes, a file is crafted with different
1198 @code{character_code} and @code{encoding}, it seems that
1199 @code{character_code} controls the encoding for all strings in the
1200 system file before the dictionary termination record, including
1201 strings in data (e.g.@: string missing values), and @code{encoding}
1202 controls the encoding for strings following the dictionary termination
1203 record.
1204
1205 @node Long String Value Labels Record
1206 @section Long String Value Labels Record
1207
1208 This record, if present, specifies value labels for long string
1209 variables.
1210
1211 @example
1212 /* @r{Header.} */
1213 int32               rec_type;
1214 int32               subtype;
1215 int32               size;
1216 int32               count;
1217
1218 /* @r{Repeated up to exactly @code{count} bytes.} */
1219 int32               var_name_len;
1220 char                var_name[];
1221 int32               var_width;
1222 int32               n_labels;
1223 long_string_label   labels[];
1224 @end example
1225
1226 @table @code
1227 @item int32 rec_type;
1228 Record type.  Always set to 7.
1229
1230 @item int32 subtype;
1231 Record subtype.  Always set to 21.
1232
1233 @item int32 size;
1234 Always set to 1.
1235
1236 @item int32 count;
1237 The number of bytes following the header until the next header.
1238
1239 @item int32 var_name_len;
1240 @itemx char var_name[];
1241 The number of bytes in the name of the variable that has long string
1242 value labels, plus the variable name itself, which consists of exactly
1243 @code{var_name_len} bytes.  The variable name is not padded to any
1244 particular boundary, nor is it null-terminated.
1245
1246 @item int32 var_width;
1247 The width of the variable, in bytes, which will be between 9 and
1248 32767.
1249
1250 @item int32 n_labels;
1251 @itemx long_string_label labels[];
1252 The long string labels themselves.  The @code{labels} array contains
1253 exactly @code{n_labels} elements, each of which has the following
1254 substructure:
1255
1256 @example
1257 int32               value_len;
1258 char                value[];
1259 int32               label_len;
1260 char                label[];
1261 @end example
1262
1263 @table @code
1264 @item int32 value_len;
1265 @itemx char value[];
1266 The string value being labeled.  @code{value_len} is the number of
1267 bytes in @code{value}; it is equal to @code{var_width}.  The
1268 @code{value} array is not padded or null-terminated.
1269
1270 @item int32 label_len;
1271 @itemx char label[];
1272 The label for the string value.  @code{label_len}, which must be
1273 between 0 and 120, is the number of bytes in @code{label}.  The
1274 @code{label} array is not padded or null-terminated.
1275 @end table
1276 @end table
1277
1278 @node Long String Missing Values Record
1279 @section Long String Missing Values Record
1280
1281 This record, if present, specifies missing values for long string
1282 variables.
1283
1284 @example
1285 /* @r{Header.} */
1286 int32               rec_type;
1287 int32               subtype;
1288 int32               size;
1289 int32               count;
1290
1291 /* @r{Repeated up to exactly @code{count} bytes.} */
1292 int32               var_name_len;
1293 char                var_name[];
1294 char                n_missing_values;
1295 long_string_missing_value   values[];
1296 @end example
1297
1298 @table @code
1299 @item int32 rec_type;
1300 Record type.  Always set to 7.
1301
1302 @item int32 subtype;
1303 Record subtype.  Always set to 22.
1304
1305 @item int32 size;
1306 Always set to 1.
1307
1308 @item int32 count;
1309 The number of bytes following the header until the next header.
1310
1311 @item int32 var_name_len;
1312 @itemx char var_name[];
1313 The number of bytes in the name of the long string variable that has
1314 missing values, plus the variable name itself, which consists of
1315 exactly @code{var_name_len} bytes.  The variable name is not padded to
1316 any particular boundary, nor is it null-terminated.
1317
1318 @item char n_missing_values;
1319 The number of missing values, either 1, 2, or 3.  (This is, unusually,
1320 a single byte instead of a 32-bit number.)
1321
1322 @item long_string_missing_value values[];
1323 The missing values themselves.  This array contains exactly
1324 @code{n_missing_values} elements, each of which has the following
1325 substructure:
1326
1327 @example
1328 int32               value_len;
1329 char                value[];
1330 @end example
1331
1332 @table @code
1333 @item int32 value_len;
1334 The length of the missing value string, in bytes.  This value should
1335 be 8, because long string variables are at least 8 bytes wide (by
1336 definition), only the first 8 bytes of a long string variable's
1337 missing values are allowed to be non-spaces, and any spaces within the
1338 first 8 bytes are included in the missing value here.
1339
1340 @item char value[];
1341 The missing value string, exactly @code{value_len} bytes, without
1342 any padding or null terminator.
1343 @end table
1344 @end table
1345
1346 @node Data File and Variable Attributes Records
1347 @section Data File and Variable Attributes Records
1348
1349 The data file and variable attributes records represent custom
1350 attributes for the system file or for individual variables in the
1351 system file, as defined on the DATAFILE ATTRIBUTE (@pxref{DATAFILE
1352 ATTRIBUTE,,,pspp, PSPP Users Guide}) and VARIABLE ATTRIBUTE commands
1353 (@pxref{VARIABLE ATTRIBUTE,,,pspp, PSPP Users Guide}), respectively.
1354
1355 @example
1356 /* @r{Header.} */
1357 int32               rec_type;
1358 int32               subtype;
1359 int32               size;
1360 int32               count;
1361
1362 /* @r{Exactly @code{count} bytes of data.} */
1363 char                attributes[];
1364 @end example
1365
1366 @table @code
1367 @item int32 rec_type;
1368 Record type.  Always set to 7.
1369
1370 @item int32 subtype;
1371 Record subtype.  Always set to 17 for a data file attribute record or
1372 to 18 for a variable attributes record.
1373
1374 @item int32 size;
1375 The size of each element in the @code{attributes} member. Always set to 1.
1376
1377 @item int32 count;
1378 The total number of bytes in @code{attributes}.
1379
1380 @item char attributes[];
1381 The attributes, in a text-based format.
1382
1383 In record subtype 17, this field contains a single attribute set.  An
1384 attribute set is a sequence of one or more attributes concatenated
1385 together.  Each attribute consists of a name, which has the same
1386 syntax as a variable name, followed by, inside parentheses, a sequence
1387 of one or more values.  Each value consists of a string enclosed in
1388 single quotes (@code{'}) followed by a line feed (byte 0x0a).  A value
1389 may contain single quote characters, which are not themselves escaped
1390 or quoted or required to be present in pairs.  There is no apparent
1391 way to embed a line feed in a value.  There is no distinction between
1392 an attribute with a single value and an attribute array with one
1393 element.
1394
1395 In record subtype 18, this field contains a sequence of one or more
1396 variable attribute sets.  If more than one variable attribute set is
1397 present, each one after the first is delimited from the previous by
1398 @code{/}.  Each variable attribute set consists of a long
1399 variable name,
1400 followed by @code{:}, followed by an attribute set with the same
1401 syntax as on record subtype 17.
1402
1403 System files written by @code{Stata 14.1/-savespss- 1.77 by
1404 S.Radyakin} may include multiple records with subtype 18, one per
1405 variable that has variable attributes.
1406
1407 The total length is @code{count} bytes.
1408 @end table
1409
1410 @subheading Example
1411
1412 A system file produced with the following VARIABLE ATTRIBUTE commands
1413 in effect:
1414
1415 @example
1416 VARIABLE ATTRIBUTE VARIABLES=dummy ATTRIBUTE=fred[1]('23') fred[2]('34').
1417 VARIABLE ATTRIBUTE VARIABLES=dummy ATTRIBUTE=bert('123').
1418 @end example
1419
1420 @noindent
1421 will contain a variable attribute record with the following contents:
1422
1423 @example
1424 0000  07 00 00 00 12 00 00 00  01 00 00 00 22 00 00 00  |............"...|
1425 0010  64 75 6d 6d 79 3a 66 72  65 64 28 27 32 33 27 0a  |dummy:fred('23'.|
1426 0020  27 33 34 27 0a 29 62 65  72 74 28 27 31 32 33 27  |'34'.)bert('123'|
1427 0030  0a 29                                             |.)              |
1428 @end example
1429
1430 @menu
1431 * Variable Roles::
1432 @end menu
1433
1434 @node Variable Roles
1435 @subsection Variable Roles
1436
1437 A variable's role is represented as an attribute named @code{$@@Role}.
1438 This attribute has a single element whose values and their meanings
1439 are:
1440
1441 @table @code
1442 @item 0
1443 Input.  This, the default, is the most common role.
1444 @item 1
1445 Output.
1446 @item 2
1447 Both.
1448 @item 3
1449 None.
1450 @item 4
1451 Partition.
1452 @item 5
1453 Split.
1454 @end table
1455
1456 @node Extended Number of Cases Record
1457 @section Extended Number of Cases Record
1458
1459 The file header record expresses the number of cases in the system
1460 file as an int32 (@pxref{File Header Record}).  This record allows the
1461 number of cases in the system file to be expressed as a 64-bit number.
1462
1463 @example
1464 int32               rec_type;
1465 int32               subtype;
1466 int32               size;
1467 int32               count;
1468 int64               unknown;
1469 int64               ncases64;
1470 @end example
1471
1472 @table @code
1473 @item int32 rec_type;
1474 Record type.  Always set to 7.
1475
1476 @item int32 subtype;
1477 Record subtype.  Always set to 16.
1478
1479 @item int32 size;
1480 Size of each element.  Always set to 8.
1481
1482 @item int32 count;
1483 Number of pieces of data in the data part.  Alway set to 2.
1484
1485 @item int64 unknown;
1486 Meaning unknown.  Always set to 1.
1487
1488 @item int64 ncases64;
1489 Number of cases in the file as a 64-bit integer.  Presumably this
1490 could be -1 to indicate that the number of cases is unknown, for the
1491 same reason as @code{ncases} in the file header record, but this has
1492 not been observed in the wild.
1493 @end table
1494
1495 @node Other Informational Records
1496 @section Other Informational Records
1497
1498 This chapter documents many specific types of extension records are
1499 documented here, but others are known to exist.  PSPP ignores unknown
1500 extension records when reading system files.
1501
1502 The following extension record subtypes have also been observed, with
1503 the following believed meanings:
1504
1505 @table @asis
1506 @item 5
1507 A set of grouped variables (according to Aapi H@"am@"al@"ainen).
1508
1509 @item 6
1510 Date info, probably related to USE (according to Aapi H@"am@"al@"ainen).
1511
1512 @item 12
1513 A UUID in the format described in RFC 4122.  Only two examples
1514 observed, both written by SPSS 13, and in each case the UUID contained
1515 both upper and lower case.
1516
1517 @item 24
1518 XML that describes how data in the file should be displayed on-screen.
1519 @end table
1520
1521 @node Dictionary Termination Record
1522 @section Dictionary Termination Record
1523
1524 The dictionary termination record separates all other records from the
1525 data records.
1526
1527 @example
1528 int32               rec_type;
1529 int32               filler;
1530 @end example
1531
1532 @table @code
1533 @item int32 rec_type;
1534 Record type.  Always set to 999.
1535
1536 @item int32 filler;
1537 Ignored padding.  Should be set to 0.
1538 @end table
1539
1540 @node Data Record
1541 @section Data Record
1542
1543 The data record must follow all other records in the system file.
1544 Every system file must have a data record that specifies data for at
1545 least one case.  The format of the data record varies depending on the
1546 value of @code{compression} in the file header record:
1547
1548 @table @asis
1549 @item 0: no compression
1550 Data is arranged as a series of 8-byte elements.
1551 Each element corresponds to
1552 the variable declared in the respective variable record (@pxref{Variable
1553 Record}).  Numeric values are given in @code{flt64} format; string
1554 values are literal characters string, padded on the right when
1555 necessary to fill out 8-byte units.
1556
1557 @item 1: bytecode compression
1558 The first 8 bytes
1559 of the data record is divided into a series of 1-byte command
1560 codes.  These codes have meanings as described below:
1561
1562 @table @asis
1563 @item 0
1564 Ignored.  If the program writing the system file accumulates compressed
1565 data in blocks of fixed length, 0 bytes can be used to pad out extra
1566 bytes remaining at the end of a fixed-size block.
1567
1568 @item 1 through 251
1569 A number with
1570 value @var{code} - @var{bias}, where
1571 @var{code} is the value of the compression code and @var{bias} is the
1572 variable @code{bias} from the file header.  For example,
1573 code 105 with bias 100.0 (the normal value) indicates a numeric variable
1574 of value 5.
1575 One file has been seen written by SPSS 14 that contained such a code
1576 in a @emph{string} field with the value 0 (after the bias is
1577 subtracted) as a way of encoding null bytes.
1578
1579 @item 252
1580 End of file.  This code may or may not appear at the end of the data
1581 stream.  PSPP always outputs this code but its use is not required.
1582
1583 @item 253
1584 A numeric or string value that is not
1585 compressible.  The value is stored in the 8 bytes following the
1586 current block of command bytes.  If this value appears twice in a block
1587 of command bytes, then it indicates the second group of 8 bytes following the
1588 command bytes, and so on.
1589
1590 @item 254
1591 An 8-byte string value that is all spaces.
1592
1593 @item 255
1594 The system-missing value.
1595 @end table
1596
1597 The end of the 8-byte group of bytecodes is followed by any 8-byte
1598 blocks of non-compressible values indicated by code 253.  After that
1599 follows another 8-byte group of bytecodes, then those bytecodes'
1600 non-compressible values.  The pattern repeats to the end of the file
1601 or a code with value 252.
1602
1603 @item 2: ZLIB compression
1604 The data record consists of the following, in order:
1605
1606 @itemize @bullet
1607 @item
1608 ZLIB data header, 24 bytes long.
1609
1610 @item
1611 One or more variable-length blocks of ZLIB compressed data.
1612
1613 @item
1614 ZLIB data trailer, with a 24-byte fixed header plus an additional 24
1615 bytes for each preceding ZLIB compressed data block.
1616 @end itemize
1617
1618 The ZLIB data header has the following format:
1619
1620 @example
1621 int64               zheader_ofs;
1622 int64               ztrailer_ofs;
1623 int64               ztrailer_len;
1624 @end example
1625
1626 @table @code
1627 @item int64 zheader_ofs;
1628 The offset, in bytes, of the beginning of this structure within the
1629 system file.
1630
1631 @item int64 ztrailer_ofs;
1632 The offset, in bytes, of the first byte of the ZLIB data trailer.
1633
1634 @item int64 ztrailer_len;
1635 The number of bytes in the ZLIB data trailer.  This and the previous
1636 field sum to the size of the system file in bytes.
1637 @end table
1638
1639 The data header is followed by @code{(ztrailer_ofs - 24) / 24} ZLIB
1640 compressed data blocks.  Each ZLIB compressed data block begins with a
1641 ZLIB header as specified in RFC@tie{}1950, e.g.@: hex bytes @code{78
1642 01} (the only header yet observed in practice).  Each block
1643 decompresses to a fixed number of bytes (in practice only
1644 @code{0x3ff000}-byte blocks have been observed), except that the last
1645 block of data may be shorter.  The last ZLIB compressed data block
1646 gends just before offset @code{ztrailer_ofs}.
1647
1648 The result of ZLIB decompression is bytecode compressed data as
1649 described above for compression format 1.
1650
1651 The ZLIB data trailer begins with the following 24-byte fixed header:
1652
1653 @example
1654 int64               bias;
1655 int64               zero;
1656 int32               block_size;
1657 int32               n_blocks;
1658 @end example
1659
1660 @table @code
1661 @item int64 int_bias;
1662 The compression bias as a negative integer, e.g.@: if @code{bias} in
1663 the file header record is 100.0, then @code{int_bias} is @minus{}100
1664 (this is the only value yet observed in practice).
1665
1666 @item int64 zero;
1667 Always observed to be zero.
1668
1669 @item int32 block_size;
1670 The number of bytes in each ZLIB compressed data block, except
1671 possibly the last, following decompression.  Only @code{0x3ff000} has
1672 been observed so far.
1673
1674 @item int32 n_blocks;
1675 The number of ZLIB compressed data blocks, always exactly
1676 @code{(ztrailer_ofs - 24) / 24}.
1677 @end table
1678
1679 The fixed header is followed by @code{n_blocks} 24-byte ZLIB data
1680 block descriptors, each of which describes the compressed data block
1681 corresponding to its offset.  Each block descriptor has the following
1682 format:
1683
1684 @example
1685 int64               uncompressed_ofs;
1686 int64               compressed_ofs;
1687 int32               uncompressed_size;
1688 int32               compressed_size;
1689 @end example
1690
1691 @table @code
1692 @item int64 uncompressed_ofs;
1693 The offset, in bytes, that this block of data would have in a similar
1694 system file that uses compression format 1.  This is
1695 @code{zheader_ofs} in the first block descriptor, and in each
1696 succeeding block descriptor it is the sum of the previous desciptor's
1697 @code{uncompressed_ofs} and @code{uncompressed_size}.
1698
1699 @item int64 compressed_ofs;
1700 The offset, in bytes, of the actual beginning of this compressed data
1701 block.  This is @code{zheader_ofs + 24} in the first block descriptor,
1702 and in each succeeding block descriptor it is the sum of the previous
1703 descriptor's @code{compressed_ofs} and @code{compressed_size}.  The
1704 final block descriptor's @code{compressed_ofs} and
1705 @code{compressed_size} sum to @code{ztrailer_ofs}.
1706
1707 @item int32 uncompressed_size;
1708 The number of bytes in this data block, after decompression.  This is
1709 @code{block_size} in every data block except the last, which may be
1710 smaller.
1711
1712 @item int32 compressed_size;
1713 The number of bytes in this data block, as stored compressed in this
1714 system file.
1715 @end table
1716 @end table
1717
1718 @setfilename ignored