Figure out more format details.
[pspp] / spv-file-format.texi
index dff235859b6f9b711dd3362abaf26c3e9a8d3a63..50a94141b924452dc0ee9bd255d6c4d2acdc6d35 100644 (file)
@@ -572,7 +572,7 @@ concatenated together, terminated by a byte 01:
 LightMember @result{}
     Header Title
     Caption Footnotes
 LightMember @result{}
     Header Title
     Caption Footnotes
-    Fonts Formats Borders PrintSettings TableSettings
+    Fonts Borders PrintSettings TableSettings Formats
     Dimensions Data
     01
 @end format
     Dimensions Data
     01
 @end format
@@ -583,7 +583,7 @@ The following sections go into more detail.
 @menu
 * SPV Light Member Header::
 * SPV Light Member Title::
 @menu
 * SPV Light Member Header::
 * SPV Light Member Title::
-* PSV Light Member Caption::
+* SPV Light Member Caption::
 * SPV Light Member Footnotes::
 * SPV Light Member Fonts::
 * SPV Light Member Borders::
 * SPV Light Member Footnotes::
 * SPV Light Member Fonts::
 * SPV Light Member Borders::
@@ -609,7 +609,7 @@ Header @result{}
     (i1 @math{|} i3)[@t{version}]
     01 bool*4 int
     int[@t{min-column-width}] int[@t{max-column-width}]
     (i1 @math{|} i3)[@t{version}]
     01 bool*4 int
     int[@t{min-column-width}] int[@t{max-column-width}]
-    int[@t{min-row-height}] int[@t{max-row-height}]
+    int[@t{min-row-width}] int[@t{max-row-width}]
     int64[@t{table-id}]
 @end format
 @end cartouche
     int64[@t{table-id}]
 @end format
 @end cartouche
@@ -624,6 +624,13 @@ the structure member that refers to the detail member.  For example,
 if @code{tableId} is @code{-4122591256483201023}, then @code{table-id}
 would be 0xc6c99d183b300001.
 
 if @code{tableId} is @code{-4122591256483201023}, then @code{table-id}
 would be 0xc6c99d183b300001.
 
+@code{min-column-width} is the minimum width that a column will be
+assigned automatically.  @code{max-column-width} is the maximum width
+that a column will be assigned to accommodate a long column label.
+@code{min-row-width} and @code{max-row-width} are a similar range for
+the width of row labels.  All of these measurements are in 1/96 inch
+units.
+
 The meaning of the other variable parts of the header is not known.
 
 @node SPV Light Member Title
 The meaning of the other variable parts of the header is not known.
 
 @node SPV Light Member Title
@@ -648,7 +655,7 @@ appropriate for presentation, and localized to the user's language,
 well formatted.  For example, for a frequency table, @code{title1} and
 @code{title2} name the variable and @code{c} is simply ``Frequencies''.
 
 well formatted.  For example, for a frequency table, @code{title1} and
 @code{title2} name the variable and @code{c} is simply ``Frequencies''.
 
-@node PSV Light Member Caption
+@node SPV Light Member Caption
 @subsection Caption
 
 @cartouche
 @subsection Caption
 
 @cartouche
@@ -727,6 +734,9 @@ background color, respectively.  In the corpus, these are always
 should be the same color.  When @code{alternate} is 01, @code{altfg}
 and @code{altbg} specify the colors for the alternate rows.
 
 should be the same color.  When @code{alternate} is 01, @code{altfg}
 and @code{altbg} specify the colors for the alternate rows.
 
+@code{left-margin}, @code{right-margin}, @code{top-margin}, and
+@code{bottom-margin} are measured in multiples of 1/96 inch.
+
 @node SPV Light Member Borders
 @subsection Borders
 
 @node SPV Light Member Borders
 @subsection Borders
 
@@ -753,8 +763,8 @@ endianness.
 @code{show-grid-lines} is 1 to draw grid lines, otherwise 0.
 
 Each Border describes one kind of border.  @code{n-borders} seems to
 @code{show-grid-lines} is 1 to draw grid lines, otherwise 0.
 
 Each Border describes one kind of border.  @code{n-borders} seems to
-always be 19.  Each @code{border-type} appears once in order, and they
-correspond to the following borders:
+always be 19.  Each @code{border-type} appears once (although in an
+unpredictable order) and correspond to the following borders:
 
 @table @asis
 @item 0
 
 @table @asis
 @item 0
@@ -803,7 +813,7 @@ opaque color, therefore opaque black is 0xff000000.
 @format
 PrintSettings @result{}
     b1[@t{endian}]
 @format
 PrintSettings @result{}
     b1[@t{endian}]
-    bool[@t{layers}]
+    bool[@t{all-layers}]
     bool[@t{paginate-layers}]
     bool[@t{fit-width}]
     bool[@t{fit-length}]
     bool[@t{paginate-layers}]
     bool[@t{fit-width}]
     bool[@t{fit-length}]
@@ -817,11 +827,12 @@ PrintSettings @result{}
 The PrintSettings reflect settings for printing.  The fixed value of
 @code{endian} can be used to validate the endianness.
 
 The PrintSettings reflect settings for printing.  The fixed value of
 @code{endian} can be used to validate the endianness.
 
-@code{layers} is 1 to print all layers, 0 to print only the visible
-layers.
+@code{all-layers} is 1 to print all layers, 0 to print only the
+visible layers.
 
 @code{paginate-layers} is 1 to print each layer at the start of a new
 
 @code{paginate-layers} is 1 to print each layer at the start of a new
-page, 0 otherwise.
+page, 0 otherwise.  (This setting is honored only @code{all-layers} is
+1, since otherwise only one layer is printed.)
 
 @code{fit-width} and @code{fit-length} control whether the table is
 shrunk to fit within a page's width or length, respectively.
 
 @code{fit-width} and @code{fit-length} control whether the table is
 shrunk to fit within a page's width or length, respectively.
@@ -850,7 +861,7 @@ TableSettings @result{}
     v3(
       byte
       be32[@t{n}] byte*[@t{n}]
     v3(
       byte
       be32[@t{n}] byte*[@t{n}]
-      bestring
+      bestring[@t{notes}]
       bestring[@t{table-look}]
       00...
     )
       bestring[@t{table-look}]
       00...
     )
@@ -875,6 +886,10 @@ shown as numbers starting from 1.
 When @code{footnote-marker-position} is 1, footnote markers are shown
 as superscripts, otherwise as subscripts.
 
 When @code{footnote-marker-position} is 1, footnote markers are shown
 as superscripts, otherwise as subscripts.
 
+@code{notes} is a text string that contains user-specified notes.  It
+is displayed when the user hovers the cursor over the table, like
+``alt text'' on a webpage.  It is not printed.  It is usually empty.
+
 @code{table-look} is the name of a SPSS ``TableLook'' table style,
 such as ``Default'' or ``Academic''; it is often empty.
 
 @code{table-look} is the name of a SPSS ``TableLook'' table style,
 such as ``Default'' or ``Academic''; it is often empty.
 
@@ -886,38 +901,47 @@ TableSettings ends with an arbitrary number of null bytes.
 @cartouche
 @format
 Formats @result{}
 @cartouche
 @format
 Formats @result{}
-    int[@t{n4}] int*[@t{n4}]
+    int[@t{nwidths}] int*[@t{nwidths}]
     string[@t{encoding}]
     string[@t{encoding}]
-    (i0 @math{|} i-1) (00 @math{|} 01) 00 (00 @math{|} 01)
-    int
+    int (00 @math{|} 01) 00 (00 @math{|} 01)
+    int[@t{epoch}]
     byte[@t{decimal}] byte[@t{grouping}]
     byte[@t{decimal}] byte[@t{grouping}]
-    int[@t{n-ccs}] string*[@t{n-ccs}]
+    CustomCurrency
     v1(i0)
     v3(count(count(X5) count(X6)))
 
     v1(i0)
     v3(count(count(X5) count(X6)))
 
+CustomCurrency @result{} int[@t{n-ccs}] string*[@t{n-ccs}]
+
 X5 @result{} byte*33 int[@t{n}] int*[@t{n}]
 X6 @result{}
     01 00 (03 @math{|} 04) 00 00 00
     string[@t{command}] string[@t{subcommand}]
     string[@t{language}] string[@t{charset}] string[@t{locale}]
 X5 @result{} byte*33 int[@t{n}] int*[@t{n}]
 X6 @result{}
     01 00 (03 @math{|} 04) 00 00 00
     string[@t{command}] string[@t{subcommand}]
     string[@t{language}] string[@t{charset}] string[@t{locale}]
-    (00 @math{|} 01) 00 (00 @math{|} 01) (00 @math{|} 01)
-    int
+    (00 @math{|} 01) 00 bool bool
+    int[@t{epoch}]
     byte[@t{decimal}] byte[@t{grouping}]
     byte[@t{decimal}] byte[@t{grouping}]
-    byte*8 01
-    (string[@t{dataset}] string[@t{data file}] i0 int i0)?
-    int[@t{n-ccs}] string*[@t{n-ccs}]
-    2e (00 @math{|} 01) (i2000000 i0)?
+    double[@t{small}] 01
+    (string[@t{dataset}] string[@t{datafile}] i0 int[@t{date}] i0)?
+    CustomCurrency
+    byte[@t{missing}] bool (i2000000 i0)?
 @end format
 @end cartouche
 
 @end format
 @end cartouche
 
-Observed values of @code{n4} vary from 0 to 17.  Out of 7,060 examples
-in the corpus, it is nonzero only 36 times.
+If @code{nwidths} is nonzero, then the accompanying integers are
+column widths as manually adjusted by the user.  (Row heights are
+computed automatically based on the widths.)
 
 @code{encoding} is a character encoding, usually a Windows code page
 such as @code{en_US.windows-1252} or @code{it_IT.windows-1252}.  The
 rest of the character strings in the member use this encoding.  The
 encoding string is itself encoded in US-ASCII.
 
 
 @code{encoding} is a character encoding, usually a Windows code page
 such as @code{en_US.windows-1252} or @code{it_IT.windows-1252}.  The
 rest of the character strings in the member use this encoding.  The
 encoding string is itself encoded in US-ASCII.
 
+@code{epoch} is the year that starts the epoch.  A 2-digit year is
+interpreted as belonging to the 100 years beginning at the epoch.  The
+default epoch year is 69 years prior to the current year; thus, in
+2017 this field by default contains 1948.  In the corpus, @code{epoch}
+ranges from 1943 to 1948, plus some contain -1.
+
 @code{decimal} is the decimal point character.  The observed values
 are @samp{.} and @samp{,}.
 
 @code{decimal} is the decimal point character.  The observed values
 are @samp{.} and @samp{,}.
 
@@ -926,6 +950,22 @@ are @samp{.} and @samp{,}.
 @samp{'} (apostrophe), @samp{ } (space), and zero (presumably
 indicating that digits should not be grouped).
 
 @samp{'} (apostrophe), @samp{ } (space), and zero (presumably
 indicating that digits should not be grouped).
 
+@code{dataset} is the name of the dataset analyzed to produce the
+output, e.g.@: @code{DataSet1}, and @code{datafile} the name of the
+file it was read from, e.g.@: @file{C:\Users\foo\bar.sav}.  The latter
+is sometimes the empty string.
+
+@code{date} is a date, as seconds since the epoch, i.e.@: since
+January 1, 1970.  Pivot tables within an SPV files often have dates a
+few minutes apart, so this is probably a creation date for the tables
+rather than for the file.
+
+Sometimes @code{dataset}, @code{datafile}, and @code{date} are present
+and other times they are absent.  The reader can distinguish by
+assuming that they are present and then checking whether the
+presumptive @code{dataset} contains a null byte (a valid string never
+will).
+
 @code{n-ccs} is observed as either 0 or 5.  When it is 5, the
 following strings are CCA through CCE format strings.  @xref{Custom
 Currency Formats,,, pspp, PSPP}.  Most commonly these are all
 @code{n-ccs} is observed as either 0 or 5.  When it is 5, the
 following strings are CCA through CCE format strings.  @xref{Custom
 Currency Formats,,, pspp, PSPP}.  Most commonly these are all
@@ -1224,7 +1264,7 @@ ValueMod @result{}
     v3(count(FormatString Style ValueModUnknown))
   @math{|} 31 int[@t{n-refs}] int16*[@t{n-refs}] Format
   @math{|} 58
     v3(count(FormatString Style ValueModUnknown))
   @math{|} 31 int[@t{n-refs}] int16*[@t{n-refs}] Format
   @math{|} 58
-Style @result{} 58 @math{|} 31 01? 00? 00? 00? 01 string[@t{fgcolor}] string[@t{bgcolor}] string[@t{typeface}] byte
+Style @result{} 58 @math{|} 31 01? 00? 00? 00? 01 string[@t{fgcolor}] string[@t{bgcolor}] string[@t{typeface}] byte[@t{size}]
 Format @result{} 00 00 count(FormatString Style 58)
 FormatString @result{} count((i0 (58 @math{|} 31 string))?)
 ValueModUnknown @result{} 58 @math{|} 31 i0 i0 i0 i0 01 00 (01 @math{|} 02 @math{|} 08) 00 08 00 0a 00)
 Format @result{} 00 00 count(FormatString Style 58)
 FormatString @result{} count((i0 (58 @math{|} 31 string))?)
 ValueModUnknown @result{} 58 @math{|} 31 i0 i0 i0 i0 01 00 (01 @math{|} 02 @math{|} 08) 00 08 00 0a 00)
@@ -1248,6 +1288,7 @@ version of the localized format string in the Value in which the
 Format is nested.
 
 The Style, if present, changes the style for this individual Value.
 Format is nested.
 
 The Style, if present, changes the style for this individual Value.
+The @code{size} is a font size in units of 1/96 inch.
 
 @node SPV Legacy Detail Member Binary Format
 @section Legacy Detail Member Binary Format
 
 @node SPV Legacy Detail Member Binary Format
 @section Legacy Detail Member Binary Format