#define STR(x) XSTR(x)
#define WHERE __FILE__":" STR(__LINE__)
+bool ok = true;
+
static unsigned int
get_u32(void)
{
static char *
get_fixed_string(int len, const char *where)
{
- if (pos + len > n || !memchr(&data[pos], 0, len) || !all_utf8(&data[pos]))
+ size_t i;
+ for (i = 0; ; i++)
+ {
+ if (!data[pos + i])
+ break;
+ if (i >= len)
+ {
+ fprintf(stderr, "%s: 0x%x: unterminated fixed-width string\n", where, pos);
+ exit(1);
+ }
+ }
+ if (!all_utf8(&data[pos]))
{
fprintf(stderr, "%s: 0x%x: bad fixed-width string\n", where, pos);
exit(1);
}
+ while (++i < len)
+ {
+ if (data[pos + i])
+ {
+ fprintf(stderr, "%s: 0x%x: text in middle of fixed-width string\n", where, pos);
+ //exit(1);
+ break;
+ }
+ }
char *s = (char *) &data[pos];
pos += len;
return s;
static char *
get_string(const char *where)
{
- if (1
+ if (pos + 4 <= n
/*data[pos + 1] == 0 && data[pos + 2] == 0 && data[pos + 3] == 0*/
/*&& all_ascii(&data[pos + 4], data[pos])*/)
{
for (size_t i = start; i < end; )
{
if (i + 5 <= n
- && data[i] > 0
+ && data[i] > 1
//&& !data[i + 1]
&& !data[i + 2]
&& !data[i + 3]
int n_sysmis = 0;
for (int i = 0; i < n_series; i++)
{
- printf (" series %d: \"%s\", %d values:\n ",
- i, get_fixed_string(288), count);
+ printf (" %08x: series %d: \"%s\", %d values:\n ",
+ pos, i, get_fixed_string(288), count);
for (int i = 0; i < count; i++)
{
double d = get_double();
}
printf ("\n");
}
+}
- if (pos >= end)
- return;
-
- match_u32_assert(1);
- char *name2 = get_string();
- assert(!strcmp(name, name2));
+static void
+dump_strings(void)
- 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);
+{
+ if (pos >= n)
+ return;
+ int start = pos;
+ int offset = pos;
+ int n_maps = get_u32();
int max1 = -1;
- int ofs = pos;
- for (int i = 0; i < n_more_series; i++)
+ for (int k = 0; k < n_maps; k++)
{
- printf ("%08x:", pos);
- printf (" \"%s\"", get_string());
- int n_pairs = get_u32();
- for (int j = 0; j < n_pairs; j++)
+ char *source_name = get_string();
+ printf ("%08x: %s\n", offset, source_name);
+
+ int n_series = get_u32();
+ for (int i = 0; i < n_series; i++)
{
- int x = get_u32();
- int y = get_u32();
- printf (" (%d, %d)", x, y);
- if (y > max1)
- max1 = y;
+ printf ("%08x:", pos);
+ printf (" \"%s\"", get_string());
+ int n_pairs = get_u32();
+ for (int j = 0; j < n_pairs; j++)
+ {
+ int x = get_u32();
+ int y = get_u32();
+ printf (" (%d, %d)", x, y);
+ if (y > max1)
+ max1 = y;
+ }
+ printf ("\n");
}
- printf ("\n");
}
-
printf ("\n%08x:", pos);
int n_strings = get_u32();
- assert(n_strings == max1 + 1);
+ if (n_strings != max1 + 1)
+ {
+ fprintf (stderr, "n_strings=%d max1+1=%d (-s %#x -n %u)\n", n_strings, max1 + 1, start, n - start);
+ dump_raw (stderr, start, n, "\n");
+ 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++)
+ char **strings = malloc((max1 + 1) * sizeof *strings);
+ for (int i = 0; i <= max1; i++)
{
int frequency = get_u32();
char *s = get_string();
}
printf ("\n");
- assert (pos == end);
+ assert (pos == n);
+#if 0
pos = ofs;
printf("Strings:\n");
for (int i = 0; i < n_more_series; i++)
}
printf ("\n");
}
- pos = end;
+#endif
}
int
if (pos != sources[i].offset)
{
fprintf (stderr, "pos=0x%x expected=0x%x reading source %d\n", pos, sources[i].offset, i);
- exit(1);
+ //exit(1);
}
+ printf ("source %d:\n", i);
+ pos = sources[i].offset;
dump_source(i + 1 >= n_sources ? n : sources[i + 1].offset, sources[i].count, sources[i].n_series, sources[i].name);
}
+ dump_strings();
+#if 0
+ if (pos != n)
+ {
+ fprintf (stderr, "consumed %zu bytes, file has %zu bytes\n", pos, n);
+ ok = false;
+ }
assert(pos == n);
-
- return 0;
+#endif
+
+ return ok ? EXIT_SUCCESS : EXIT_FAILURE;
}