From: Ben Pfaff Date: Sun, 28 Jun 2020 05:04:53 +0000 (+0000) Subject: more progress! X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pspp;a=commitdiff_plain;h=0ee5ac77918b105dd6a5f8469947b9f040bd2bfa more progress! --- diff --git a/dump-spo2.c b/dump-spo2.c index d59ab7ba63..58dbf0539d 100644 --- a/dump-spo2.c +++ b/dump-spo2.c @@ -581,49 +581,55 @@ match_NavTreeViewItem(void) match_byte_assert(0); if (match_byte(0)) { - match_zeros_assert(7); + match_byte_assert(0); + if (!match_byte(1)) + match_byte_assert(0); + match_zeros_assert(5); if (!match_byte(0)) match_byte_assert(1); match_zeros_assert(5); get_string1(); if (match_byte(1)) { - parse_weirdness(); - match_byte_assert(0); - pos++; - match_zeros_assert(11); - match_byte_assert(1); - match_zeros_assert(3); - get_string4(); - match_byte_assert(0); - if (match_byte(0)) + if (data[pos] == 1) { - match_zeros_assert(2); - if (match_u32(8500)) - match_u32_assert(11000); - else - { - match_u32_assert(11000); - match_u32_assert(8500); - } - pos += 32; - get_string1(); - if (!match_byte(0)) - match_byte_assert(1); - pos++; - pos++; - pos++; + parse_weirdness(); + match_byte_assert(0); pos++; - get_string4(); /* page title */ - match_byte_assert(1); + match_zeros_assert(11); match_byte_assert(1); match_zeros_assert(3); - get_string4(); /* page number */ + get_string4(); match_byte_assert(0); - pos += 2; - match_u16_assert(2); + if (match_byte(0)) + { + match_zeros_assert(2); + if (match_u32(8500)) + match_u32_assert(11000); + else + { + match_u32_assert(11000); + match_u32_assert(8500); + } + pos += 32; + get_string1(); + if (!match_byte(0)) + match_byte_assert(1); + pos++; + pos++; + pos++; + pos++; + get_string4(); /* page title */ + match_byte_assert(1); + match_byte_assert(1); + match_zeros_assert(3); + get_string4(); /* page number */ + match_byte_assert(0); + pos += 2; + match_u16_assert(2); + } + parse_flexible(); } - parse_flexible(); } else match_zeros_assert(3); @@ -753,8 +759,9 @@ parse_NavOleItem(void) static void match_NavOleItem(void) -{ /* 0e 80 */ - match_byte_assert(0x0e); +{ /* 0e 80 or 12 80*/ + if (!match_byte(0x12)) + match_byte_assert(0x0e); match_byte_assert(0x80); parse_NavOleItem(); } @@ -782,13 +789,54 @@ parse_NavNote(void) match_byte_assert(2); match_zeros_assert(8); match_u32_assert(24); - if (!match_u32(0)) + if (!match_u32(0) && !match_u32(0xffffff4b)) match_u32_assert(-40); pos += 8; match_u32_assert(2); + if (!match_u32(2)) + match_u32_assert(1); +} + +static void +parse_PTPivotController(void) +{ + match_byte_assert(2); + pos += 8; + match_u32_assert(100); + match_u32_assert(100); + match_u32_assert(100); + match_u32_assert(100); +} + +static void +parse_PVPivotView(void) +{ + match_byte_assert(5); + match_zeros_assert(4); +} + +static void +parse_NDimensional__DspCell(void) +{ + match_byte_assert(0); match_u32_assert(1); } +static void +parse_IndexedCollection(void) +{ + match_byte_assert(0); + if (match_byte(0)) + { + match_zeros_assert(12); + } + else + { + get_u32(); + match_u16_assert(1); + } +} + static void parse_flexible(void) { @@ -807,13 +855,21 @@ parse_flexible(void) else if (!strcmp(heading, "NavHead")) parse_NavHead(); else if (!strcmp(heading, "IndexedCollection")) - match_zeros_assert(14); + parse_IndexedCollection(); else if (!strcmp(heading, "NavOleItem")) parse_NavOleItem(); else if (!strcmp(heading, "NavTitle")) parse_NavTitle(); else if (!strcmp(heading, "NavNote")) parse_NavNote(); + else if (!strcmp(heading, "PTPivotController")) + parse_PTPivotController(); + else if (!strcmp(heading, "PVPivotView")) + parse_PVPivotView(); + else if (!strcmp(heading, "PMPivotModel")) + match_byte_assert(3); + else if (!strcmp(heading, "NDimensional__DspCell")) + parse_NDimensional__DspCell(); else { fprintf(stderr, "don't know %s at offset 0x%x: ", heading, start); @@ -847,17 +903,26 @@ parse_flexible(void) else if (data[pos] == 0x15 && data[pos + 1] == 0x80) { /* 15 80 */ - data += 2; - match_byte_assert(2); - printf ("15 80(%f", get_double()); - printf (" %s)\n", get_string1()); + pos += 2; + if (match_byte(2)) + { + printf ("15 80(%f", get_double()); + printf (" %s)\n", get_string1()); + } + else + match_zeros_assert(14); } else if (data[pos] == 0x9 && data[pos + 1] == 0x80) { match_NavLog(); } - else if (data[pos] == 0xe) + else if (data[pos] == 0xe || data[pos] == 0x12) match_NavOleItem(); + else if (data[pos] == 0x11 || data[pos] == 0x13) + { + pos += 2; + match_zeros_assert(14); + } else { fprintf (stderr, "bad record 0x%02x at offset %x: ", @@ -1020,6 +1085,13 @@ main(int argc, char *argv[]) parse_flexible(); parse_flexible(); parse_flexible(); + parse_flexible(); + parse_flexible(); + parse_flexible(); + parse_flexible(); + parse_flexible(); + parse_flexible(); + parse_flexible(); exit(0); puts(get_padded_string(32)); if (!match_u32(80))