Refine nested parsing.
authorBen Pfaff <blp@cs.stanford.edu>
Fri, 7 Nov 2014 19:00:49 +0000 (11:00 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Fri, 7 Nov 2014 19:00:49 +0000 (11:00 -0800)
dump.c

diff --git a/dump.c b/dump.c
index f1971871c55f9e020377e49cf2c475ccfc20f046..55efec4b7340d807b332319553ba150e547fe278 100644 (file)
--- a/dump.c
+++ b/dump.c
@@ -208,15 +208,27 @@ get_string(const char *where)
 #define get_string() get_string(WHERE)
 
 static void
-dump_nested(void)
+dump_empty_nested(void)
 {
-  int subn = get_u32 ();
-#if 0
-  fprintf (stderr, "nested %d bytes: ", subn);
-  dump_raw(stderr, pos, pos + subn, "");
-  putc('\n', stderr);
-#endif
-  pos += subn;
+  int outer_end = pos + get_u32();
+  int inner_end = pos + get_u32();
+  if (pos != inner_end)
+    {
+      match_u32_assert(0);
+      match_byte_assert(0x58);
+      if (pos != inner_end)
+        {
+          fprintf(stderr, "inner end discrepancy\n");
+          exit(1);
+        }
+    }
+  match_byte_assert(0x58);
+  match_byte_assert(0x58);
+  if (pos != outer_end)
+    {
+      fprintf(stderr, "outer end discrepancy\n");
+      exit(1);
+    }
 }
 
 static void
@@ -230,14 +242,68 @@ dump_value_31(void)
             get_string();
           else
             match_u32_assert (0);
-          dump_nested();
+
+          int outer_end = pos + get_u32();
+          int inner_end = pos + get_u32();
+          match_u32_assert(0);
+          if (match_byte(0x31))
+            get_string();
+          else
+            match_byte_assert(0x58);
+          if (pos != inner_end)
+            {
+              fprintf(stderr, "inner end discrepancy\n");
+              exit(1);
+            }
+
+          if (match_byte(0x31))
+            {
+              match_byte(0);
+              match_byte(0);
+              match_byte(0);
+              match_byte_assert(1);
+              get_string();     /* foreground */
+              get_string();     /* background */
+              get_string();     /* font */
+              match_byte_assert(12); /* size? */
+            }
+          else
+            match_byte_assert(0x58);
+          match_byte_assert(0x58);
+          if (pos != outer_end)
+            {
+              fprintf(stderr, "outer end discrepancy\n");
+              exit(1);
+            }
         }
       else if (match_u32 (1))
         {
           printf("(footnote %d) ", get_u32());
           match_byte_assert (0);
           match_byte_assert (0);
-          dump_nested();
+
+          int outer_end = pos + get_u32();
+          int inner_end = pos + get_u32();
+          if (pos != inner_end)
+            {
+              match_u32_assert(0);
+              if (match_byte(0x31))
+                get_string();
+              else
+                match_byte_assert(0x58);
+              if (pos != inner_end)
+                {
+                  fprintf(stderr, "inner end discrepancy\n");
+                  exit(1);
+                }
+            }
+          match_byte_assert(0x58);
+          match_byte_assert(0x58);
+          if (pos != outer_end)
+            {
+              fprintf(stderr, "outer end discrepancy\n");
+              exit(1);
+            }
         }
       else if (match_u32 (2))
         {
@@ -248,7 +314,7 @@ dump_value_31(void)
             match_u32_assert(1);
           match_byte_assert(0);
           match_byte_assert(0);
-          dump_nested();
+          dump_empty_nested();
         }
       else
         {
@@ -258,8 +324,10 @@ dump_value_31(void)
           match_byte_assert(0);
           match_byte_assert(1);
           match_byte_assert(0);
-          dump_nested();
-          dump_nested();
+          match_u32_assert(2);
+          match_byte_assert(0);
+          match_byte_assert(0);
+          dump_empty_nested();
         }
     }
   else