return x;
}
+static unsigned int
+get_u16(void)
+{
+ uint16_t x;
+ memcpy(&x, &data[pos], 2);
+ pos += 2;
+ return x;
+}
+
static double
get_double(void)
{
return pos + len;
}
+static void __attribute__((unused))
+hex_dump(int ofs, int n)
+{
+ for (int i = 0; i < n; i++)
+ {
+ int c = data[ofs + i];
+#if 1
+ if (i && !(i % 16))
+ fprintf(stderr, "-");
+ else
+ fprintf(stderr, " ");
+#endif
+ fprintf(stderr, "%02x", c);
+ //fprintf(stderr, "%c", c >= 32 && c < 127 ? c : '.');
+ }
+ fprintf(stderr, "\n");
+}
+
static char *
dump_counted_string(void)
{
int inner_end = get_end();
if (pos != inner_end)
{
- match_u32_assert(0);
+ if (match_u32(5))
+ {
+ match_u32_assert(0);
+ match_byte_assert(0x58);
+ }
+ else
+ match_u32_assert(0);
if (match_byte(0x31))
s = get_string();
else
return s;
}
-static void __attribute__((unused))
-hex_dump(int ofs, int n)
-{
- for (int i = 0; i < n; i++)
- {
- int c = data[ofs + i];
-#if 1
- if (i && !(i % 16))
- fprintf(stderr, "-");
- else
- fprintf(stderr, " ");
-#endif
- fprintf(stderr, "%02x", c);
- //fprintf(stderr, "%c", c >= 32 && c < 127 ? c : '.');
- }
- fprintf(stderr, "\n");
-}
-
static void
dump_style(FILE *stream)
{
}
fprintf(stream, "/>\n");
}
- else if (match_u32 (1))
- {
- fprintf(stream, "<footnote-ref index=%d", get_u32());
- dump_nested_string(stream);
- fprintf(stream, "/>\n");
- }
- else if (match_u32 (2))
- {
- fprintf(stream, "<special2 %d %d", data[pos], data[pos + 2]);
- if (!match_byte(0) && !match_byte(1))
- match_byte_assert(2);
- match_byte_assert(0);
- if (!match_u32 (2) && !match_u32(1))
- match_u32_assert(3);
- dump_nested_string(stream);
- fprintf(stream, "/>\n");
- }
else
{
- fprintf(stream, "<special3");
- match_u32_assert(3);
- match_byte_assert(0);
+ int count = get_u32();
+ fprintf(stream, "<footnote-ref indexes=\"");
+ for (int i = 0; i < count; i++)
+ {
+ if (i)
+ putc(' ', stream);
+ fprintf(stream, "%d", get_u16());
+ }
+ putc('"', stream);
match_byte_assert(0);
- match_byte_assert(1);
match_byte_assert(0);
- match_u32_assert(2);
- dump_nested_string(stream); /* Our corpus doesn't contain any examples with strings though. */
+ dump_nested_string(stream);
fprintf(stream, "/>\n");
}
}
}
static void
-dump_category(FILE *stream, int level, int *indexes, int *n_indexes, int max_indexes)
+dump_category(FILE *stream, int level, int **indexes, int *allocated_indexes,
+ int *n_indexes)
{
for (int i = 0; i <= level; i++)
fprintf (stream, " ");
fprintf(stderr, "index not -1 but subcategories\n");
exit(1);
}
- if (*n_indexes >= max_indexes)
+ if (*n_indexes >= *allocated_indexes)
{
- fprintf(stderr, "too many categories (increase max_indexes)\n");
- exit(1);
+ *allocated_indexes = *allocated_indexes ? 2 * *allocated_indexes : 16;
+ *indexes = realloc(*indexes, *allocated_indexes * sizeof **indexes);
}
- indexes[(*n_indexes)++] = indx;
+ (*indexes)[(*n_indexes)++] = indx;
}
int expected_unindexed = indx == -1;
fprintf (stream, "<category-index>%d</category-index>\n", indx);
}
for (int i = 0; i < n_categories; i++)
- dump_category (stream, level + 1, indexes, n_indexes, max_indexes);
+ dump_category (stream, level + 1, indexes, allocated_indexes, n_indexes);
for (int i = 0; i <= level; i++)
fprintf (stream, " ");
printf ("</category>\n");
match_u32_assert(indx);
n_categories = get_u32();
- int indexes[2048];
+ int *indexes = NULL;
int n_indexes = 0;
+ int allocated_indexes = 0;
for (int i = 0; i < n_categories; i++)
- dump_category (stdout, 0, indexes, &n_indexes, sizeof indexes / sizeof *indexes);
+ dump_category (stdout, 0, &indexes, &allocated_indexes, &n_indexes);
check_permutation(indexes, n_indexes, "categories");
fprintf (stdout, "</dimension>\n");
match_byte(1);
printf ("</title-c>\n");
- match_byte(0);
- match_byte_assert(0x58);
+ if (match_byte(0x31))
+ {
+ printf ("<user-caption>\n");
+ dump_value(stdout, 0);
+ printf ("</user-caption>\n");
+ }
+ else
+ match_byte_assert(0x58);
if (match_byte(0x31))
{
printf ("<caption>\n");
match_byte_assert(0);
/* OK, this seems really unlikely to be totally correct, but it matches my corpus... */
- if (!match_u32(0) && !match_u32(2))
+ if (!match_u32(0) && !match_u32(2) && !match_u32(4))
{
if (i == 7)
match_u32_assert(0xfaad);
match_u32_assert(3);
printf (" fgcolor=\"%s\"", get_string());
printf (" bgcolor=\"%s\"", get_string());
+ if (!match_byte(0))
+ match_byte_assert(1);
match_u32_assert(0);
- match_u32_assert(0);
- match_byte_assert(0);
+ char *othercolor = get_string();
+ if (othercolor[0])
+ printf(" othercolor=\"%s\"", othercolor);
if (version > 1)
{
if (i != 3)
{
- if (!match_u32(8))
- match_u32_assert(5);
- if (!match_u32(10) && !match_u32(11) && !match_u32(5))
- match_u32_assert(9);
- if (!match_u32(0) && !match_u32(1))
- match_u32_assert(2);
+ pos += 12;
}
else
{
match_u32_assert(240);
pos += 240;
- match_u32_assert(18);
- pos += 18;
+ int skip = get_u32();
+ assert(skip == 18 || skip == 25);
+ pos += skip;
int x3 = get_u32();
if (version == 3)
const char *locale = get_string();
printf ("<locale>%s</locale>\n", locale);
- if (!match_u32(0))
- match_u32_assert(UINT32_MAX);
+ get_u32(); /* Seen: 0, UINT32_MAX, 2, 3, 4, 5, 6, 8, 9, 21, 24. */
if (!match_byte(0))
match_byte_assert(1);
match_byte_assert(0);
if (version > 1)
{
if (!match_byte(0x97) && !match_byte(0x98)
- && !match_byte(0x99) && !match_byte(0x9a))
- match_byte_assert(0x9b);
+ && !match_byte(0x99) && !match_byte(0x9a) && !match_byte(0x9b))
+ match_byte_assert(0x9c);
match_byte_assert(7);
match_byte_assert(0);
match_byte_assert(0);
}
else
- match_u32_assert(UINT32_MAX);
+ {
+ printf("%x\n", get_u32());
+ }
int decimal = data[pos];
int grouping = data[pos + 1];
else
{
match_byte_assert(',');
- if (!match_byte('.') && !match_byte(' '))
+ if (!match_byte('.') && !match_byte(' ') && !match_byte(','))
match_byte_assert(0);
}
printf("<format decimal=\"%c\" grouping=\"", decimal);
match_byte_assert(1);
if (!match_byte(0x97) && !match_byte(0x98)
- && !match_byte(0x99) && !match_byte(0x9a))
- match_byte_assert(0x9b);
+ && !match_byte(0x99) && !match_byte(0x9a) && !match_byte(0x9b))
+ match_byte_assert(0x9c);
match_byte_assert(7);
match_byte_assert(0);
match_byte_assert(0);
else
{
match_byte_assert(',');
- if (!match_byte('.') && !match_byte(' '))
+ if (!match_byte('.') && !match_byte(' ') && !match_byte(','))
match_byte_assert(0);
}
if (pos < outer_end)
{
- match_u32_assert(2000000);
+ printf("<seed>%d</seed>\n", get_u32());
match_u32_assert(0);
}
assert(pos == outer_end);
pos = outer_end;
}
else
- match_u32_assert(0);
+ {
+ pos = get_end();
+ }
}
int
/* Offset 8. */
match_byte_assert(0);
- match_byte_assert(0);
+ if (!match_byte(0))
+ match_byte_assert(1);
if (!match_byte(0))
match_byte_assert(1);
/* Offset 27. */
pos++;
pos++;
- match_byte_assert(0);
- match_byte_assert(0);
+ pos++;
+ pos++;
/* Offset 31.