Document some elements.
[pspp] / dump.c
diff --git a/dump.c b/dump.c
index aeb26086b0d1e3de00f956700181efb37610e801..73935a73374faf7df3695a23436ad8c2506385ba 100644 (file)
--- a/dump.c
+++ b/dump.c
@@ -252,10 +252,15 @@ dump_value_31(FILE *stream)
             {
               /* We only have one SPV file for this version (with many
                  tables). */
-              match_u32_assert(0x200);
-              match_u32_assert(0x1000000);
-              match_u32_assert(0);
-              match_byte_assert(0);
+              match_byte(0);
+              if (!match_u32(1))
+                match_u32_assert(2);
+              match_byte(0);
+              match_byte(0);
+              if (!match_u32(0) && !match_u32(1) && !match_u32(2) && !match_u32(3) && !match_u32(4) && !match_u32(5) && !match_u32(6) && !match_u32(7) && !match_u32(8) && !match_u32(9))
+                match_u32_assert(10);
+              match_byte(0);
+              match_byte(0);
               return;
             }
 
@@ -298,15 +303,16 @@ dump_value_31(FILE *stream)
             match_byte_assert(0x58);
           if (match_byte(0x31))
             {
-              /* All the examples in the corpus, all from one SPV file, are
-                 exactly like this. */
+              /* Only two SPV files have anything like this, so it's hard to
+                 generalize. */
               match_u32_assert(0);
               match_u32_assert(0);
               match_u32_assert(0);
               match_u32_assert(0);
               match_byte_assert(1);
               match_byte_assert(0);
-              match_byte_assert(8);
+              if (!match_byte(8) && !match_byte(1))
+                match_byte_assert(2);
               match_byte_assert(0);
               match_byte_assert(8);
               match_byte_assert(0);
@@ -329,10 +335,11 @@ dump_value_31(FILE *stream)
       else if (match_u32 (2))
         {
           fprintf(stream, "(special 2)");
+          if (!match_byte(0))
+            match_byte_assert(2);
           match_byte_assert(0);
-          match_byte_assert(0);
-          if (!match_u32 (2))
-            match_u32_assert(1);
+          if (!match_u32 (2) && !match_u32(1))
+            match_u32_assert(3);
           dump_nested_string(); /* Our corpus doesn't contain any examples with strings though. */
         }
       else
@@ -445,7 +452,7 @@ dump_value(FILE *stream, int level, bool match1)
       char *var, *vallab;
       double value;
 
-      match_byte_assert (0x58);
+      dump_value_31 (stream);
       format = get_u32 ();
       value = get_double ();
       var = get_string ();
@@ -607,7 +614,7 @@ dump_dim(int indx)
   printf ("<dimension index=\"%d\">\n", indx);
   dump_value (stdout, 0, false);
 
-  /* This byte is usually 0x02 but 0x00 and 0x75 (!) have also been spotted. */
+  /* This byte is usually 0x02 but many other values have been spotted. */
   pos++;
 
   if (!match_byte(0) && !match_byte(1))
@@ -619,7 +626,8 @@ dump_dim(int indx)
   if (!match_byte(0))
     match_byte_assert(1);
   match_byte_assert(1);
-  match_u32_assert(indx);
+  if (!match_u32(UINT32_MAX))
+    match_u32_assert(indx);
   n_categories = get_u32();
 
   int indexes[2048];
@@ -660,6 +668,8 @@ dump_data(void)
     {
       printf ("    <datum index=\"%d\">\n", get_u32());
       match_u32_assert(0);
+      if (version == 1)
+        match_byte(0);
       dump_value(stdout, 1, false);
       fprintf (stdout, "    </datum>\n");
     }