X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=dump-spo2.c;fp=dump-spo2.c;h=9bef78c5668a6674a5567ca4c8d2e4cdeef36188;hb=825c6bde8038dcb024a25b89a3591fbc21b25d1d;hp=70622943e0057c8522bf5ab65b353860b727f380;hpb=8dc6ac4fc9db5dd3dd0a9fba73179c60d287214e;p=pspp diff --git a/dump-spo2.c b/dump-spo2.c index 70622943e0..9bef78c566 100644 --- a/dump-spo2.c +++ b/dump-spo2.c @@ -793,13 +793,32 @@ parse_dimension(int i) 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 @@ -996,17 +1015,38 @@ skip_item(const char *name) { 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) { @@ -1075,6 +1115,10 @@ 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); @@ -1091,7 +1135,15 @@ parse_flexible(void) 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) @@ -1447,7 +1499,7 @@ main(int argc, char *argv[]) match_u32_assert(1); match_byte_assert(0x63); - for (;;) + while (pos < n) { if (data[pos] == 0) { @@ -1610,7 +1662,7 @@ main(int argc, char *argv[]) match_byte_assert(0); match_zeros_assert(7); - while (data[pos] != 1) + while (pos < n) { if (data[pos] == 0) {