Description of light members appears to be complete.
[pspp] / spv-file-format.texi
index cb2cae75b42a893f51167a8ffae83aa93c839845..c1d5d0712393cc301562180c60ac43dfbc6ff6a7 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
 
@@ -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,121 @@ 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