Finish description of legacy ("heavy") binary format.
[pspp] / dump2.c
diff --git a/dump2.c b/dump2.c
index d7f8ad3d68abbcff43539cae1f56ef4515aa2e06..15670ecf4bb7c8de1ba8986290fa0fde8f53046f 100644 (file)
--- a/dump2.c
+++ b/dump2.c
@@ -206,7 +206,7 @@ dump_raw(FILE *stream, int start, int end, const char *separator)
 }
 
 static void
-dump_source(int end, int count, int n_series)
+dump_source(int end, int count, int n_series, const char *name)
 {
   const union
     {
@@ -235,14 +235,19 @@ dump_source(int end, int count, int n_series)
   if (pos >= end)
     return;
 
-  printf ("\n    %08x: (%d sysmis)", pos, n_sysmis);
-  printf (" %d", get_u32());
-  printf (", \"%s\"\n", get_string());
+  match_u32_assert(1);
+  char *name2 = get_string();
+  assert(!strcmp(name, name2));
 
   printf ("\n    %08x:", pos);
   int n_more_series = get_u32();
+  if (n_series != n_more_series)
+    printf("different series counts: %d %d\n", n_series, n_more_series);
+  assert(n_more_series <= n_series);
   printf (" %d series to come\n", n_more_series);
 
+  int max1 = -1;
+  int ofs = pos;
   for (int i = 0; i < n_more_series; i++)
     {
       printf ("%08x:", pos);
@@ -252,21 +257,45 @@ dump_source(int end, int count, int n_series)
         {
           int x = get_u32();
           int y = get_u32();
-          printf (" (%d,%d)", x, y);
+          printf (" (%d, %d)", x, y);
+          if (y > max1)
+            max1 = y;
         }
       printf ("\n");
     }
 
   printf ("\n%08x:", pos);
   int n_strings = get_u32();
+  assert(n_strings == max1 + 1);
   printf (" %d strings\n", n_strings);
+
+  char **strings = malloc(n_strings * sizeof *strings);
   for (int i = 0; i < n_strings; i++)
     {
-      int x = get_u32();
+      int frequency = get_u32();
       char *s = get_string();
-      printf ("%d: \"%s\" (%d)\n", i, s, x);
+      printf ("%d: \"%s\" (%d)\n", i, s, frequency);
+      strings[i] = s;
     }
   printf ("\n");
+
+  assert (pos == end);
+  pos = ofs;
+  printf("Strings:\n");
+  for (int i = 0; i < n_more_series; i++)
+    {
+      printf ("  \"%s\"\n", get_string());
+      int n_pairs = get_u32();
+      for (int j = 0; j < n_pairs; j++)
+        {
+          int x = get_u32();
+          //assert (x == j);
+          int y = get_u32();
+          printf ("    %d: \"%s\"\n", x, strings[y]);
+        }
+      printf ("\n");
+    }
+  pos = end;
 }
 
 int
@@ -312,6 +341,7 @@ main(int argc, char **argv)
   struct source
     {
       int offset, count, n_series;
+      char *name;
     }
   sources[n_sources];
   for (int i = 0; i < n_sources; i++)
@@ -326,6 +356,7 @@ main(int argc, char **argv)
       sources[i].offset = offset;
       sources[i].count = count;
       sources[i].n_series = n_series;
+      sources[i].name = name;
     }
 
   for (int i = 0; i < n_sources; i++)
@@ -335,7 +366,7 @@ main(int argc, char **argv)
           fprintf (stderr, "pos=0x%x expected=0x%x reading source %d\n", pos, sources[i].offset, i);
           exit(1);
         }
-      dump_source(i + 1 >= n_sources ? n : sources[i + 1].offset, sources[i].count, sources[i].n_series);
+      dump_source(i + 1 >= n_sources ? n : sources[i + 1].offset, sources[i].count, sources[i].n_series, sources[i].name);
     }
   assert(pos == n);