From: Ben Pfaff Date: Sat, 4 Jul 2020 03:45:25 +0000 (+0000) Subject: frequencies-only also works X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pspp;a=commitdiff_plain;h=75a05a0a68046957d9801db0bfc02b0108736e36 frequencies-only also works --- diff --git a/dump-spo2.c b/dump-spo2.c index 2ed8b7fc24..a7100e6068 100644 --- a/dump-spo2.c +++ b/dump-spo2.c @@ -703,11 +703,14 @@ match_NavLog(void) } 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); @@ -716,7 +719,17 @@ parse_category(int j) match_byte_assert(0); match_DspSimpleText(); 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 @@ -727,13 +740,6 @@ parse_dimension(int i) { 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 { @@ -757,15 +763,19 @@ parse_dimension(int i) 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(); + get_u16(); + if (!match_u16(0xffff)) + 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); - } + 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 @@ -1081,13 +1091,15 @@ parse_flexible(void) 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)) { @@ -1107,10 +1119,15 @@ parse_flexible(void) else { match_byte_assert(0); - if (match_u32(0xc)) - match_u16_assert(1); } } + else if (data[pos] == 0x17) + { + 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(); @@ -1197,12 +1214,9 @@ parse_flexible(void) } 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)) @@ -1268,11 +1282,13 @@ parse_flexible(void) 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))