}
static void
-dump_source(int count, int n_series)
+dump_source(int end, int count, int n_series)
{
const union
{
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());
pos = 0;
match_byte_assert(0);
+ int version = data[pos];
if (!match_byte(0xaf))
match_byte_assert(0xb0);
int n_sources = data[pos++];
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;
}