}
static void
-parse_category(int j)
+parse_category(int level, int j, int *n_leaves)
{
+ for (size_t k = 0; k < level; k++)
+ putchar('\t');
get_u16(); match_byte_assert(0);
get_u16(); match_byte_assert(0);
- match_u32_assert(j);
+ int leaf_idx = get_u32();
+ printf("%d ", leaf_idx);
match_u32_assert(0);
if (get_u16() == 0xffff)
match_u16_assert(0xffff);
- else
+ else if (!match_u16(0))
match_u16_assert(0x0e74);
match_byte_assert(0);
match_DspSimpleText();
+ if (match_u16(0x8018))
+ {
+ printf("18 80(%02x %02x %02x) ",
+ data[pos], data[pos + 1], data[pos + 2]);
+ pos += 3;
+ }
+ if (match_u16(0x8011))
+ {
+ printf("11 80(");
+ pos += 2;
+ for (size_t i = 0; i < 16; i++)
+ printf("%s%02x", i > 0 ? " " : "", data[pos++]);
+ printf(") ");
+ }
match_DspString();
- match_u32_assert(0);
+
+ int n_subcategories = get_u32();
+ if (n_subcategories)
+ assert (leaf_idx == 0);
+ else
+ {
+ assert (leaf_idx == *n_leaves);
+ ++*n_leaves;
+ }
+ for (int k = 0; k < n_subcategories; k++)
+ parse_category(level + 1, k, n_leaves);
}
static void
if (i == 0)
{
match_zeros_assert(5);
- match_u32_assert(1);
- get_u16(); match_u16_assert(0x0e74); match_byte_assert(0);
- match_DspSimpleText();
- match_DspString();
-
- int n_categories = get_u32();
- for (int j = 0; j < n_categories; j++)
- parse_category(j);
}
else
{
get_u16(); match_byte_assert(0);
get_u16(); match_byte_assert(0);
match_u32_assert(0);
- match_u32_assert(1);
+ }
- get_u16(); match_u16_assert(0x0e74); match_byte_assert(0);
- match_DspSimpleText();
- match_DspString();
+ if (!match_u32(0))
+ match_u32_assert(1);
- int n_categories = get_u32();
- for (int j = 0; j < n_categories; j++)
- parse_category(j);
- }
+ get_u16();
+ if (!match_u16(0xffff))
+ match_u16_assert(0x0e74);
+ match_byte_assert(0);
+ match_DspSimpleText();
+ match_DspString();
+
+ int n_leaves = 0;
+ int n_categories = get_u32();
+ for (int j = 0; j < n_categories; j++)
+ parse_category(1, j, &n_leaves);
}
+static void skip_item(const char *name);
+
static void
parse_PMModelItemInfo(void)
{
for (int i = 0; i < n_dims; i++)
parse_dimension(i);
printf("%#x: end of model\n", pos);
- exit(0);
+
+ int n_units16 = get_u32();
+ match_u16_assert(0);
+ for (int j = 0; j < n_units16; j++)
+ get_u16();
+
+ n_units16 = get_u32();
+ match_u16_assert(1);
+ for (int j = 0; j < n_units16; j++)
+ get_u16();
+
+ match_byte_assert(0);
+ int n_units32 = get_u32();
+ match_u16_assert(0);
+ for (int j = 0; j < n_units32; j++)
+ match_u32_assert(j);
+
+ skip_item("end of PMModelItemInfo");
}
static void
if (!match_u32(0) && !match_u32(0xffffff4b))
match_u32_assert(-40);
pos += 8;
- match_u32_assert(2);
+ if (!match_u32(1))
+ match_u32_assert(2);
if (!match_u32(2))
match_u32_assert(1);
}
{
int start_pos = pos;
printf("%#x: skipping %s bytes...", pos, name);
- while (data[pos + 1] != 0x80
+ while (pos < n
+ && data[pos + 1] != 0x80
&& !(data[pos] == 0xff && data[pos + 1] == 0xff
&& data[pos + 2] == 0 && data[pos + 3] == 0))
{
- assert(pos < n);
pos++;
}
printf("until %#x:", pos);
hex_dump(stdout, start_pos, pos - start_pos);
}
+static void
+parse_DspAnnotation(void)
+{
+ match_zeros_assert(10);
+ match_u32_assert(1);
+}
+
+static void
+parse_DspTextComponentHandle(void)
+{
+ match_byte_assert(0);
+ match_DspString();
+ printf("after DspTextComponentHandle: ");
+ for (int i = 0; ; i++)
+ if (!memcmp(&data[pos + 6 + i], "PVView", 6))
+ {
+ hex_dump(stdout, pos, i);
+ exit(0);
+ }
+}
+
static void
parse_flexible(void)
{
parse_PVCellStyle();
else if (!strcmp(heading, "PVTextStyle"))
exit(0);
+ else if (!strcmp(heading, "DspAnnotation"))
+ parse_DspAnnotation();
+ else if (!strcmp(heading, "DspTextComponentHandle"))
+ parse_DspTextComponentHandle();
else
{
fprintf(stderr, "don't know %s at offset 0x%x: ", heading, start);
else if (data[pos] == 0x5 && data[pos + 1] == 0x80)
match_DspString();
else if (data[pos] == 0x7 && data[pos + 1] == 0x80)
- match_NavTreeViewItem();
+ {
+ if (0)
+ match_NavTreeViewItem();
+ else
+ {
+ pos += 2;
+ skip_item("NavTreeViewItem");
+ }
+ }
else if (data[pos] == 0x3 && data[pos + 1] == 0x80)
match_DspSimpleText();
else if ((data[pos] == 0x3c || data[pos] == 0x39)
match_byte_assert(0x02);
match_byte_assert(0x0d); */
}
- else if (data[pos] == 0x15 && data[pos + 1] == 0x80)
+ else if ((data[pos] == 0x15 || data[pos] == 0x14)
+ && data[pos + 1] == 0x80)
{
+ /* 14 80 */
/* 15 80 */
pos += 2;
if (match_byte(2))
{
- printf ("15 80(%f", get_double());
+ printf ("%02x 80(%f", data[pos - 2], get_double());
printf (" \"%s\")\n", get_string1());
if (match_byte(1))
{
else
{
match_byte_assert(0);
- if (match_u32(0xc))
- match_u16_assert(1);
}
}
+ else if (data[pos] == 0x17 || data[pos] == 0x25)
+ {
+ printf("%02x %02x(%02x %02x %02x)\n",
+ data[pos], data[pos + 1],
+ data[pos + 2], data[pos + 3], data[pos + 4]);
+ pos += 5;
+ }
else if (data[pos] == 0x9 && data[pos + 1] == 0x80)
{
match_NavLog();
}
else
{
-#if 0
- fprintf (stderr, "bad record 0x%02x at offset %x: ",
- data[pos], pos);
-#endif
+ fprintf (stderr, "%#x: unknown record", pos);
hex_dump (stderr, pos, 64);
- assert(0);
+ exit(1);
}
}
else if (match_byte(0xa))
int start_pos = pos;
char *title = get_string1();
printf("%#x: title(\"%s\", ", start_pos, title);
- match_u32_assert(0);
+ if (!match_u32(2))
+ match_u32_assert(0);
char *id = get_string1();
printf("\"%s\")\n", id);
match_byte_assert(0);
- match_u32_assert(3);
+ if (!match_u32(2))
+ match_u32_assert(3);
match_u16_assert(1);
}
else //if (match_u16(2) || match_u16(3) || match_u16(4) || match_u16(5) || match_u16(6) || match_u16(7) || match_u16(8) || match_u16(9))
match_u32_assert(1);
match_byte_assert(0x63);
- for (;;)
+ while (pos < n)
{
if (data[pos] == 0)
{
match_byte_assert(0);
match_zeros_assert(7);
- while (data[pos] != 1)
+ while (pos < n)
{
if (data[pos] == 0)
{