From 324edb7f2fc042792ae418618d6b6d04d16a54a3 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Thu, 13 Nov 2014 09:02:27 -0800 Subject: [PATCH] Read all the heavy tables accurately, even across 2 (apparent) versions. --- dump2.c | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/dump2.c b/dump2.c index 4fd7531ab5..af01b408cd 100644 --- 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; } -- 2.30.2