Minor improvements.
authorBen Pfaff <blp@cs.stanford.edu>
Tue, 30 May 2017 02:41:54 +0000 (19:41 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Tue, 30 May 2017 02:41:54 +0000 (19:41 -0700)
dump.c
spv-file-format.texi

diff --git a/dump.c b/dump.c
index 991dd366b4515bae2da7fdb4bc243100bf99473a..3e30ce10f2e7b99857a4560ce55490dfc41bb2f4 100644 (file)
--- a/dump.c
+++ b/dump.c
@@ -195,6 +195,15 @@ match_byte_assert(uint8_t b, const char *where)
 }
 #define match_byte_assert(b) match_byte_assert(b, WHERE)
 
 }
 #define match_byte_assert(b) match_byte_assert(b, WHERE)
 
+static bool
+get_bool(void)
+{
+  if (match_byte(0))
+    return false;
+  match_byte_assert(1);
+  return true;
+}
+
 static void
 newline(FILE *stream, int pos)
 {
 static void
 newline(FILE *stream, int pos)
 {
@@ -357,26 +366,27 @@ hex_dump(int ofs, int n)
 static char *
 dump_counted_string(void)
 {
 static char *
 dump_counted_string(void)
 {
-  char *s = NULL;
   int inner_end = get_end();
   int inner_end = get_end();
+  if (pos == inner_end)
+    return NULL;
+
+  if (match_u32(5))
+    {
+      match_u32_assert(0);
+      match_byte_assert(0x58);
+    }
+  else
+    match_u32_assert(0);
+
+  char *s = NULL;
+  if (match_byte(0x31))
+    s = get_string();
+  else
+    match_byte_assert(0x58);
   if (pos != inner_end)
     {
   if (pos != inner_end)
     {
-      if (match_u32(5))
-        {
-          match_u32_assert(0);
-          match_byte_assert(0x58);
-        }
-      else
-        match_u32_assert(0);
-      if (match_byte(0x31))
-        s = get_string();
-      else
-        match_byte_assert(0x58);
-      if (pos != inner_end)
-        {
-          fprintf(stderr, "inner end discrepancy\n");
-          exit(1);
-        }
+      fprintf(stderr, "inner end discrepancy\n");
+      exit(1);
     }
   return s;
 }
     }
   return s;
 }
@@ -384,8 +394,18 @@ dump_counted_string(void)
 static void
 dump_style(FILE *stream)
 {
 static void
 dump_style(FILE *stream)
 {
-  for (int i = 0; i < 4; i++)
-    printf (" %d", get_byte());
+  if (match_byte(0x58))
+    return;
+
+  match_byte_assert(0x31);
+  if (get_bool())
+    printf (" bold=\"yes\"");
+  if (get_bool())
+    printf (" italic=\"yes\"");
+  if (get_bool())
+    printf (" underline=\"yes\"");
+  if (!get_bool())
+    printf (" show=\"no\"");
   char *fg = get_string();     /* foreground */
   char *bg = get_string();     /* background */
   char *font = get_string();     /* font */
   char *fg = get_string();     /* foreground */
   char *bg = get_string();     /* background */
   char *font = get_string();     /* font */
@@ -394,6 +414,35 @@ dump_style(FILE *stream)
           fg, bg, font, size);
 }
 
           fg, bg, font, size);
 }
 
+static void
+dump_style2(FILE *stream)
+{
+  if (match_byte(0x58))
+    return;
+
+  match_byte_assert(0x31);
+  uint32_t halign = get_u32();
+  printf (" halign=\"%s\"",
+          halign == 0 ? "center"
+          : halign == 2 ? "left"
+          : halign == 4 ? "right"
+          : halign == 6 ? "decimal"
+          : halign == 0xffffffad ? "mixed"
+          : "<error>");
+  int valign = get_u32();
+  printf (" valign=\"%s\"",
+          valign == 0 ? "center"
+          : valign == 1 ? "top"
+          : valign == 3 ? "bottom"
+          : "<error>");
+  printf (" offset=\"%gpt\"", get_double());
+  int l = get_u16();
+  int r = get_u16();
+  int t = get_u16();
+  int b = get_u16();
+  printf (" margins=\"%d %d %d %d\"", l, r, t, b);
+}
+
 static char *
 dump_nested_string(FILE *stream)
 {
 static char *
 dump_nested_string(FILE *stream)
 {
@@ -405,10 +454,7 @@ dump_nested_string(FILE *stream)
   s = dump_counted_string();
   if (s)
     fprintf(stream, " \"%s\"", s);
   s = dump_counted_string();
   if (s)
     fprintf(stream, " \"%s\"", s);
-  if (match_byte(0x31))
-    dump_style(stream);
-  else
-    match_byte_assert(0x58);
+  dump_style(stream);
   match_byte_assert(0x58);
   if (pos != outer_end)
     {
   match_byte_assert(0x58);
   if (pos != outer_end)
     {
@@ -466,35 +512,8 @@ dump_value_modifier(FILE *stream)
           if (template)
             fprintf(stream, " template=\"%s\"", template);
 
           if (template)
             fprintf(stream, " template=\"%s\"", template);
 
-          if (match_byte(0x31))
-            dump_style(stream);
-          else
-            match_byte_assert(0x58);
-          if (match_byte(0x31))
-            {
-              uint32_t halign = get_u32();
-              printf (" halign=\"%s\"",
-                      halign == 0 ? "center"
-                      : halign == 2 ? "left"
-                      : halign == 4 ? "right"
-                      : halign == 6 ? "decimal"
-                      : halign == 0xffffffad ? "mixed"
-                      : "<error>");
-              int valign = get_u32();
-              printf (" valign=\"%s\"",
-                      valign == 0 ? "center"
-                      : valign == 1 ? "top"
-                      : valign == 3 ? "bottom"
-                      : "<error>");
-              printf (" %g", get_double());
-              int l = get_u16();
-              int r = get_u16();
-              int t = get_u16();
-              int b = get_u16();
-              printf (" margins=\"%d %d %d %d\"", l, r, t, b);
-            }
-          else
-            match_byte_assert(0x58);
+          dump_style(stream);
+          dump_style2(stream);
           if (pos != outer_end)
             {
               fprintf(stderr, "outer end discrepancy\n");
           if (pos != outer_end)
             {
               fprintf(stderr, "outer end discrepancy\n");
index 09e620e9ae31edba4eeb2066ab6dc8bcaddc7687..6e7480ba12aca0f32cadcd6a016f3ea35ce35061 100644 (file)
@@ -1261,24 +1261,22 @@ A ValueMod can specify special modifications to a Value.
 ValueMod @result{}
     31 i0 (i0 @math{|} i1 string[@t{subscript}])
     v1(00 (i1 @math{|} i2) 00 00 int 00 00)
 ValueMod @result{}
     31 i0 (i0 @math{|} i1 string[@t{subscript}])
     v1(00 (i1 @math{|} i2) 00 00 int 00 00)
-    v3(count(FormatString Style ValueModUnknown))
+    v3(count(FormatString
+             (31 Style | 58)
+             (31 Style2 | 58)))
   @math{|} 31 int[@t{n-refs}] int16*[@t{n-refs}] Format
   @math{|} 58
 
   @math{|} 31 int[@t{n-refs}] int16*[@t{n-refs}] Format
   @math{|} 58
 
+Format @result{} 00 00 count(FormatString Style 58)
+FormatString @result{} count((count((i0 58)?) (58 @math{|} 31 string))?)
+
 Style @result{}
 Style @result{}
-    58
-  @math{|} 31
-    bool[@t{bold}] bool[@t{italic}] bool[@t{underline}] bool
+    bool[@t{bold}] bool[@t{italic}] bool[@t{underline}] bool[@t{show}]
     string[@t{fgcolor}] string[@t{bgcolor}]
     string[@t{typeface}] byte[@t{size}]
 
     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 int[@t{halign}] int[@t{valign}] double[@t{offset}]
+Style2 @result{}
+    int[@t{halign}] int[@t{valign}] double[@t{offset}]
     int16[@t{left-margin}] int16[@t{right-margin}]
     int16[@t{top-margin}] int16[@t{bottom-margin}]
 @end format
     int16[@t{left-margin}] int16[@t{right-margin}]
     int16[@t{top-margin}] int16[@t{bottom-margin}]
 @end format
@@ -1300,8 +1298,11 @@ syntax explained previously.  It appears to be an English-language
 version of the localized format string in the Value in which the
 Format is nested.
 
 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.
-The @code{size} is a font size in units of 1/96 inch.
+Style and Style2, if present, change the style for this individual
+Value.  @code{bold}, @code{italic}, and @code{underline} control the
+particular style.  @code{fgcolor} and @code{bgcolor} are strings, such
+as @code{#ffffff}.  The @code{size} is a font size in units of 1/96
+inch.
 
 @code{halign} is 0 for center, 2 for left, 4 for right, 6 for decimal,
 0xffffffad for mixed.  For decimal alignment, @code{offset} is the
 
 @code{halign} is 0 for center, 2 for left, 4 for right, 6 for decimal,
 0xffffffad for mixed.  For decimal alignment, @code{offset} is the