Successfully interpret data in most files whose data begin with 0 1 1 0 1.
[pspp] / dump.c
diff --git a/dump.c b/dump.c
index 28c0ca3bbc08c9068c08f1aaf6cace5320598cb8..7dd86feb89b0a88061ea0e7f3b8106c7736e691c 100644 (file)
--- a/dump.c
+++ b/dump.c
@@ -271,7 +271,20 @@ dump_value(int level)
       unsigned int format;
       double value;
 
-      match_byte_assert (0x58);
+      if (match_byte (0x31))
+        {
+          if (match_u32 (1))
+            {
+              printf("(footnote %d) ", get_u32());
+              match_byte_assert (0);
+              match_byte_assert (0);
+              int subn = get_u32 ();
+              printf ("nested %d bytes", subn);
+              pos += subn;
+            }
+        }
+      else
+        match_byte_assert (0x58);
       format = get_u32 ();
       value = get_double ();
       printf ("value %g format %d(%d.%d)", value, format >> 16, (format >> 8) & 0xff, format & 0xff);
@@ -641,6 +654,103 @@ dump_dims(void)
     }
 }
 
+static void
+dump_data(void)
+{
+  if (!match_u32 (0) || !match_u32 (1) || !match_u32(1) || !match_u32(0) || !match_u32(1))
+    {
+      printf ("skipping data\n");
+      return;
+    }
+#if 0
+  fprintf (stderr,"data intro:");
+  for (int i = 0; i < 5; i++)
+    fprintf (stderr," %d", get_u32());
+  fprintf(stderr,"\n");
+#endif
+  int x = get_u32();
+  printf ("%d data values, starting at %08x\n", x, pos);
+  for (int i = 0; i < x; i++)
+    {
+      printf("%08x, index %d:\n", pos, get_u32());
+      match_u32_assert(0);
+      if (match_byte (1))
+        {
+          unsigned int format;
+          double value;
+
+          if (match_byte (0x31))
+            {
+              if (match_u32 (1))
+                {
+                  printf("(footnote %d) ", get_u32());
+                  match_byte_assert (0);
+                  match_byte_assert (0);
+                  int subn = get_u32 ();
+                  printf ("nested %d bytes", subn);
+                  pos += subn;
+                }
+            }
+          else
+            match_byte_assert (0x58);
+          format = get_u32 ();
+          value = get_double ();
+          printf ("    value %g format %d(%d.%d)", value, format >> 16, (format >> 8) & 0xff, format & 0xff);
+        }
+      else if (match_byte (3))
+        {
+          get_string();
+          if (match_byte (0x31))
+            {
+              if (match_u32 (1))
+                {
+                  printf("(footnote %d) ", get_u32());
+                  match_byte_assert (0);
+                  match_byte_assert (0);
+                  int subn = get_u32 ();
+                  printf ("nested %d bytes", subn);
+                  pos += subn;
+                }
+              else if (match_u32 (2))
+                {
+                  printf("(special 2)");
+                  match_byte_assert(0);
+                  match_byte_assert(0);
+                  match_u32_assert(1);
+                  match_byte_assert(0);
+                  match_byte_assert(0);
+                  int subn = get_u32 ();
+                  printf ("nested %d bytes", subn);
+                  pos += subn;
+                }
+              else
+                {
+                  match_u32_assert(3);
+                  printf("(special 3)");
+                  match_byte_assert(0);
+                  match_byte_assert(0);
+                  match_byte_assert(1);
+                  match_byte_assert(0);
+                  int subn = get_u32 ();
+                  printf ("nested %d bytes, ", subn);
+                  pos += subn;
+                  subn = get_u32 ();
+                  printf ("nested %d bytes, ", subn);
+                  pos += subn;
+                }
+            }
+          else
+            match_byte_assert (0x58);
+          get_string();
+          printf("string \"%s\"", get_string());
+          match_byte (0);
+        }
+      else
+        dump_value(0);
+      putchar('\n');
+    }
+}
+
 int
 main(int argc, char *argv[])
 {
@@ -717,7 +827,8 @@ main(int argc, char *argv[])
 
           pos = start;
           dump_dims ();
-          return 0;
+          dump_data ();
+          start = pos;
         }
       else
         {