Read all the heavy tables accurately, even across 2 (apparent) versions.
authorBen Pfaff <blp@cs.stanford.edu>
Thu, 13 Nov 2014 17:02:27 +0000 (09:02 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Thu, 13 Nov 2014 17:02:27 +0000 (09:02 -0800)
dump2.c

diff --git a/dump2.c b/dump2.c
index 4fd7531ab530df5860a01cb27195008f47aef06d..af01b408cdc5f77c1ae6021458d1001e1e6473cd 100644 (file)
--- a/dump2.c
+++ b/dump2.c
@@ -190,7 +190,7 @@ dump_raw(FILE *stream, int start, int end, const char *separator)
 }
 
 static void
-dump_source(int count, int n_series)
+dump_source(int end, int count, int n_series)
 {
   const union
     {
@@ -216,10 +216,10 @@ dump_source(int count, int n_series)
       printf ("\n");
     }
 
-  if (!n_sysmis)
+  if (pos >= end)
     return;
 
-  printf ("\n    %08x:", pos);
+  printf ("\n    %08x: (%d sysmis)", pos, n_sysmis);
   printf (" %d", get_u32());
   printf (", \"%s\"\n", get_string());
 
@@ -284,6 +284,7 @@ main(int argc, char **argv)
 
   pos = 0;
   match_byte_assert(0);
+  int version = data[pos];
   if (!match_byte(0xaf))
     match_byte_assert(0xb0);
   int n_sources = data[pos++];
@@ -291,19 +292,36 @@ main(int argc, char **argv)
 
   match_u32_assert(s.st_size);
   printf ("%d sources\n", n_sources);
+
+  struct source
+    {
+      int offset, count, n_series;
+    }
+  sources[n_sources];
   for (int i = 0; i < n_sources; i++)
     {
-      pos = 8 + 80 * i;
       int count = get_u32();
       int n_series = get_u32();
       int offset = get_u32();
-      char *name = get_fixed_string(64);
-      int dunno = get_u32();
+      char *name = get_fixed_string(version == 0xb0 ? 64 : 28);
+      int dunno = version == 0xb0 ? get_u32() : 0;
       printf ("source %d: %d series, %d observations per series, offset %08x, \"%s\", %x\n",
               i, n_series, count, offset, name, dunno);
-      pos = offset;
-      dump_source(count, n_series);
+      sources[i].offset = offset;
+      sources[i].count = count;
+      sources[i].n_series = n_series;
+    }
+
+  for (int i = 0; i < n_sources; i++)
+    {
+      if (pos != sources[i].offset)
+        {
+          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);
     }
+  assert(pos == n);
 
   return 0;
 }