Start describing legacy detail members.
[pspp] / spv-file-format.texi
index cb2cae75b42a893f51167a8ffae83aa93c839845..223b2ef90fef85544c5fca6093913d78a4fac271 100644 (file)
@@ -59,7 +59,7 @@ The structure of a chart plus its data.  Charts do not have a
 @itemx @var{prefix}_pmml.scf
 Not yet investigated.  The corpus contains only one example of each.
 
 @itemx @var{prefix}_pmml.scf
 Not yet investigated.  The corpus contains only one example of each.
 
-@itemx @var{prefix}_stats.xml
+@item @var{prefix}_stats.xml
 Not yet investigated.  The corpus contains few examples.
 @end table
 
 Not yet investigated.  The corpus contains few examples.
 @end table
 
@@ -174,7 +174,7 @@ describes what it labels, often by naming the statistical procedure
 that was executed, e.g.@: ``Frequencies'' or ``T-Test''.  Labels are
 often very generic, especially within a @code{container}, e.g.@:
 ``Title'' or ``Warnings'' or ``Notes''.  Label text is localized
 that was executed, e.g.@: ``Frequencies'' or ``T-Test''.  Labels are
 often very generic, especially within a @code{container}, e.g.@:
 ``Title'' or ``Warnings'' or ``Notes''.  Label text is localized
-according to the output language, e.g. in Italian a frequency table
+according to the output language, e.g.@: in Italian a frequency table
 procedure is labeled ``Frequenze''.
 
 The corpus contains one example of an empty label, one that contains
 procedure is labeled ``Frequenze''.
 
 The corpus contains one example of an empty label, one that contains
@@ -376,10 +376,10 @@ table-id := int
 
 @code{header} includes @code{version}, a version number that affects
 the interpretation of some of the other data in the member.  We will
 
 @code{header} includes @code{version}, a version number that affects
 the interpretation of some of the other data in the member.  We will
-refer to ``version 1'' and ``version 3'' members later on.  It also
-@code{table-id} is a binary version of @code{tableId} attribute in the
-structure member that refers to the detail member.  For example, if
-@code{tableId} is @code{-4154297861994971133}, then @code{table-id}
+refer to ``version 1'' and ``version 3'' members later on.
+@code{table-id} is a binary version of the @code{tableId} attribute in
+the structure member that refers to the detail member.  For example,
+if @code{tableId} is @code{-4154297861994971133}, then @code{table-id}
 would be 0xdca00003.  The meaning of the other variable parts of the
 header is not known.
 
 would be 0xdca00003.  The meaning of the other variable parts of the
 header is not known.
 
@@ -629,27 +629,10 @@ raw-value :=
   | 04 value-mod int32[format] string[vallab] string[varname]
     (01 | 02 | 03) string[s]
   | 05 value-mod string[varname] string[varlabel] (01 | 02 | 03)
   | 04 value-mod int32[format] string[vallab] string[varname]
     (01 | 02 | 03) string[s]
   | 05 value-mod string[varname] string[varlabel] (01 | 02 | 03)
-  | value-mod string[format] int32[n-substs] substitution*[n-substs]
-substitution :=
+  | value-mod string[format] int32[n-args] arg*[n-args]
+arg :=
     i0 value
     i0 value
-  | int32[x] value*[x + 1]      /* @r{x > 0} */
-value-mod :=
-    31 i0 (i0 | i1 string[subscript]) value-mod-i0-v1 /* @r{version 1} */
-  | 31 i0 (i0 | i1 string[subscript]) value-mod-i0-v3 /* @r{version 3} */
-  | 31 i1 int32[footnote-number] template
-  | 31 i2 (00 | 01 | 02) 00 (i1 | i2 | i3) template
-  | 31 i3 00 00 01 00 i2 template
-  | 58
-value-mod-i0-v1 := 00 (i1 | i2) 00 00 int32 00 00
-value-mod-i0-v3 := count(template-string
-                         (58 | 31 style)
-                         (58
-                          | 31 i0 i0 i0 i0 01 00 (01 | 02 | 08)
-                            00 08 00 0a 00))
-
-style := 01? 00? 00? 00? 01 string[fgcolor] string[bgcolor] string[font] byte
-template := 00 00 count(template-string (58 | 31 style) 58)
-template-string := count((i0 (58 | 31 string))?)
+  | int32[x] i0 value*[x + 1]      /* @r{x > 0} */
 @end example
 
 A @code{value} boils down to a number or a string.  There are several
 @end example
 
 A @code{value} boils down to a number or a string.  There are several
@@ -716,4 +699,163 @@ Variable @code{varname}, which is rarely observed as empty in the
 corpus, with variable label @code{varlabel}, which is often empty.
 
 The meaning of the final byte is unknown.
 corpus, with variable label @code{varlabel}, which is often empty.
 
 The meaning of the final byte is unknown.
+
+@item 31
+@itemx 58
+(These bytes begin a @code{value-mod}.)  A format string, analogous to
+@code{printf}, followed by one or more arguments, each of which has
+one or more values.  The format string uses the following syntax:
+
+@table @code
+@item \%
+@item \:
+@item \[
+@item \]
+Each of these expands to the character following @samp{\\}.  This is
+useful to escape characters that have special meaning in format
+strings.  These are effective inside and outside the @code{[@dots{}]}
+syntax forms described below.
+
+@item \n
+Expands to a new-line, inside or outside the @code{[@dots{}]} forms
+described below.
+
+@item ^@var{i}
+Expands to a formatted version of argument @var{i}, which must have
+only a single value.  For example, @code{^1} would expand to the first
+argument's @code{value}.
+
+@item [:@var{a}:]@var{i}
+Expands @var{a} for each of the @code{value}s in @var{i}.  @var{a}
+should contain one or more @code{^@var{j}} conversions, which are
+drawn from the values for argument @var{i} in order.  Some examples
+from the corpus:
+
+@table @code
+@item [:^1:]1
+All of the values for the first argument, concatenated.
+
+@item [:^1\n:]1
+Expands to the values for the first argument, each followed by
+a new-line.
+
+@item [:^1 = ^2:]2
+Expands to @code{@var{x} = @var{y}} where @var{x} is the second
+argument's first value and @var{y} is its second value.  (This would
+be used only if the argument has two values.  With additional values,
+the second and third values would be directly concatenated, which
+would look funny.)
+@end table
+
+@item [@var{a}:@var{b}:]@var{i}
+This extends the previous form so that the first values are expanded
+using @var{a} and later values are expanded using @var{b}.  For an
+unknown reason, within @var{a} the @code{^@var{j}} conversions are
+instead written as @code{%@var{j}}.  Some examples from the corpus:
+
+@table @code
+@item [%1:*^1:]1
+Expands to all of the values for the first argument, separated by
+@samp{*}.
+
+@item [%1 = %2:, ^1 = ^2:]1
+Given appropriate values for the first argument, expands to @code{X =
+1, Y = 2, Z = 3}.
+
+@item [%1:, ^1:]1
+Given appropriate values, expands to @code{1, 2, 3}.
+@end table
+@end table
+
+The format string is localized to the user's locale.
+@end table
+
+@example
+value-mod :=
+    31 i0 (i0 | i1 string[subscript]) value-mod-i0-v1 /* @r{version 1} */
+  | 31 i0 (i0 | i1 string[subscript]) value-mod-i0-v3 /* @r{version 3} */
+  | 31 i1 int32[footnote-number] format
+  | 31 i2 (00 | 01 | 02) 00 (i1 | i2 | i3) format
+  | 31 i3 00 00 01 00 i2 format
+  | 58
+value-mod-i0-v1 := 00 (i1 | i2) 00 00 int32 00 00
+value-mod-i0-v3 := count(format-string
+                         (58 | 31 style)
+                         (58
+                          | 31 i0 i0 i0 i0 01 00 (01 | 02 | 08)
+                            00 08 00 0a 00))
+
+style := 01? 00? 00? 00? 01 string[fgcolor] string[bgcolor] string[font] byte
+format := 00 00 count(format-string (58 | 31 style) 58)
+format-string := count((i0 (58 | 31 string))?)
+@end example
+
+A @code{value-mod} can specify special modifications to a @code{value}:
+
+@itemize @bullet
+@item
+The @code{footnote-number}, if present, specifies a footnote that the
+@code{value} references.  The footnote's marker is shown appended to
+the main text of the @code{value}, as a superscript.
+
+@item
+The @code{subscript}, if present, specifies a string to append to the
+main text of the @code{value}, as a subscript.  The subscript text is
+normally a brief indicator, e.g.@: @samp{a} or @samp{a,b}, with its
+meaning indicated by the table caption.  In this usage, subscripts are
+similar to footnotes; one apparent difference is that a @code{value}
+can only reference one footnote but a subscript can list more than one
+letter.
+
+@item
+The @code{format}, if present, is a format string for substitutions
+using the syntax explained previously.  It appears to be an
+English-language version of the localized format string in the
+@code{value} in which the @code{format} is nested.
+
+@item
+The @code{style}, if present, changes the style for this individual
+@code{value}.
 @end itemize
 @end itemize
+
+@node SPV Legacy Detail Member Binary Format
+@subsection SPV Legacy Detail Member Binary Format
+
+A legacy detail member's binary file has a much simpler format than
+the light member binary format.
+
+@example
+legacy-member := 00 byte[version] int16[n-sources] int32[file-size]
+                 metadata*[n-sources] data*[n-sources]
+@end example
+
+@code{version} is a version number that affects the interpretation of
+some of the other data in the member.  Versions 0xaf and 0xb0 are
+known.  We will refer to ``version 0xaf'' and ``version 0xb0'' members
+later on.
+
+A legacy member consists of @code{n-sources} data sources, each of
+which has @code{metadata} and @code{data}.
+
+@code{file-size} is the size of the file, in bytes.
+
+@example
+metadata := int32[per-series] int32[n-series] int32[offset] source-name
+source-name := byte*[32]        /* @r{version 0xaf} */
+source-name := byte*[64] int32  /* @r{version 0xb0} */
+@end example
+
+A data source consists of @code{n-series} series of data, with
+@code{per-series} data items per series.  Depending on the version,
+@code{source-name} is a 32- or 64-byte string padded on the right with
+zero bytes.  The names that appear in the corpus are very generic,
+usually @code{tableData} or @code{source0}.  The @code{offset} is the
+offset, in bytes, from the beginning of the file to the start of this
+data source's @code{data}.
+
+The meaning of the number in version 0xb0 @code{source-name} is
+unknown.
+
+@example
+
+@end example