X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=dump.c;h=0a92002672de550e728b21e251850807d6ff87f9;hb=06fb48cc02983b8b0d7a3d55321ca6a5ba6f684c;hp=e758a5b71bacc6e1847fa5100e7eae88959a7c3b;hpb=1862ebd5fc64ec2692b3a93fefbcf7cc091c0511;p=pspp diff --git a/dump.c b/dump.c index e758a5b71b..0a92002672 100644 --- a/dump.c +++ b/dump.c @@ -125,7 +125,7 @@ match_byte_assert(uint8_t b, const char *where) #define match_byte_assert(b) match_byte_assert(b, WHERE) static char * -get_string(void) +get_string(const char *where) { if (data[pos + 1] == 0 && data[pos + 2] == 0 && data[pos + 3] == 0 /*&& all_ascii(&data[pos + 4], data[pos])*/) @@ -140,10 +140,11 @@ get_string(void) } else { - fprintf(stderr, "0x%x: expected string\n", pos); + fprintf(stderr, "%s: 0x%x: expected string\n", where, pos); exit(1); } } +#define get_string() get_string(WHERE) static void dump_value(int level) @@ -151,15 +152,28 @@ dump_value(int level) for (int i = 0; i <= level; i++) printf (" "); + match_byte (0); if (match_byte (3)) { get_string(); if (match_byte (0x31)) { - match_u32 (1); - printf("(footnote %d) ", get_u32()); - match_byte_assert (0); - match_byte_assert (0); + if (match_u32 (1)) + { + printf("(footnote %d) ", get_u32()); + match_byte_assert (0); + match_byte_assert (0); + } + else + { + match_u32_assert (2); + printf("(special 2)"); + match_byte_assert(0); + match_byte_assert(0); + match_u32_assert(1); + match_byte_assert(0); + match_byte_assert(0); + } int subn = get_u32 (); printf ("nested %d bytes", subn); pos += subn; @@ -169,7 +183,9 @@ dump_value(int level) get_string(); printf("string \"%s\"", get_string()); match_byte (0); - match_byte_assert (1); + match_byte (0); + match_byte (0); + match_byte (1); match_byte (0); match_byte (0); match_byte (0); @@ -203,6 +219,9 @@ dump_value(int level) if (!match_u32 (3)) match_u32_assert (2); match_byte (0); + match_byte (0); + match_byte (0); + match_byte (0); } else if (match_byte (4)) { @@ -237,13 +256,11 @@ dump_value(int level) match_byte (0); match_byte (1); } - else + else if (match_byte (0x31)) { int subn; int total_subs = 1; - match_byte (0); - match_byte_assert (0x31); match_u32_assert (0); match_u32_assert (0); subn = get_u32 (); @@ -259,6 +276,27 @@ dump_value(int level) total_subs *= n_subst; } + for (int i = 0; i < total_subs; i++) + { + putc ('\n', stdout); + dump_value (level + 1); + } + } + else + { + int total_subs = 1; + + match_byte_assert (0x58); + printf ("\"%s\" with substitutions:", get_string()); + for (;;) + { + int n_subst = get_u32(); + if (!n_subst) + break; + printf (" %d", n_subst); + total_subs *= n_subst; + } + for (int i = 0; i < total_subs; i++) { putc ('\n', stdout); @@ -384,6 +422,13 @@ dump_category(int level) match_byte (0); get_u32 (); } + else if (match_byte (1)) + { + match_byte (0); + match_u32_assert (1); + match_byte (0); + get_u32(); + } else { match_u32_assert (0);