X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=dump.c;h=12ee73ebdf4d02d143776cb252eca089ac215a7e;hb=371cb01fb5467917de7e90fd49872f15a8e1490e;hp=212421cb8045f5d330129c1882745abe1ae4388c;hpb=860ae7593728a465b1f0d5e443df7e624df9cf30;p=pspp diff --git a/dump.c b/dump.c index 212421cb80..12ee73ebdf 100644 --- a/dump.c +++ b/dump.c @@ -130,6 +130,27 @@ match_u32_assert(uint32_t x, const char *where) } #define match_u32_assert(x) match_u32_assert(x, WHERE) +static bool __attribute__((unused)) +match_u64(uint64_t x) +{ + if (get_u64() == x) + return true; + pos -= 8; + return false; +} + +static void __attribute__((unused)) +match_u64_assert(uint64_t x, const char *where) +{ + unsigned long long int y = get_u64(); + if (x != y) + { + fprintf(stderr, "%s: 0x%x: expected u64:%llu, got u64:%llu\n", where, pos - 8, x, y); + exit(1); + } +} +#define match_u64_assert(x) match_u64_assert(x, WHERE) + static bool __attribute__((unused)) match_be32(uint32_t x) { @@ -320,18 +341,17 @@ hex_dump(int ofs, int n) int c = data[ofs + i]; #if 1 if (i && !(i % 16)) - fprintf(stderr, "-"); + printf("-"); else - fprintf(stderr, " "); + printf(" "); #endif - fprintf(stderr, "%02x", c); + printf("%02x", c); } for (int i = 0; i < n; i++) { int c = data[ofs + i]; - fprintf(stderr, "%c", c >= 32 && c < 127 ? c : '.'); + printf("%c", c >= 32 && c < 127 ? c : '.'); } - fprintf(stderr, "\n"); } static char * @@ -996,7 +1016,7 @@ dump_fonts(void) } bool grid = get_byte(); pos += 3; - printf(" \n", grid ? "yes" : "no"); + printf(" \n", grid ? "yes" : "no"); printf("\n"); assert(pos == x1_end); @@ -1020,7 +1040,11 @@ dump_fonts(void) if (!get_byte()) printf(" footnoteposition=\"subscript\""); get_byte(); - pos += get_be32(); + int nbytes = get_be32(); + printf("\n"); + hex_dump(pos, nbytes); + printf("\n"); + pos += nbytes; get_string_be(); char *look = get_string_be(); if (look[0]) @@ -1029,8 +1053,16 @@ dump_fonts(void) } pos = x3_end; + /* Manual column widths, if present. */ int count = get_u32(); - pos += 4 * count; + printf(""); + for (int i = 0; i < count; i++) + { + if (i) + putchar(' '); + printf("%d", get_u32()); + } + printf("\n"); const char *locale = get_string(); printf ("%s\n", locale); @@ -1076,7 +1108,35 @@ dump_fonts(void) int outer_end = get_end(); /* First inner envelope: byte*33 int[n] int*[n]. */ - pos = get_end(); + int inner_len = get_u32(); + int inner_end = pos + inner_len; + int array_start = pos + 33; + match_byte_assert(0); + pos++; /* 0, 1, 10 seen. */ + match_byte_assert(0); + pos++; /* 0...11 seen. */ + if (!match_byte(0) && !match_byte(1) && !match_byte(2)) + match_byte_assert(3); + if (!match_byte(0) && !match_byte(2)) + match_byte_assert(3); + if (!match_u64(0)) + match_u64_assert(UINT64_MAX); + match_u32_assert(0); + match_u32_assert(0); + match_u32_assert(0); + match_u32_assert(0); + match_byte_assert(0); + if (!match_byte(0)) + match_byte_assert(1); + match_byte_assert(1); + pos = array_start; +#if 1 + printf("widths:"); + while (pos < inner_end) + printf(" %d", get_u32()); + printf("\n"); +#endif + pos = inner_end;; /* Second inner envelope. */ assert(get_end() == outer_end); @@ -1117,9 +1177,9 @@ dump_fonts(void) match_byte_assert(0); } - pos += 8; - match_byte_assert(1); + printf ("small: %g\n", get_double()); + match_byte_assert(1); if (outer_end - pos > 6) { /* There might be a pair of strings representing a dataset and @@ -1158,7 +1218,7 @@ dump_fonts(void) else match_u32_assert(0); - match_byte_assert(0x2e); + match_byte_assert('.'); if (!match_byte(0)) match_byte_assert(1); @@ -1301,10 +1361,17 @@ main(int argc, char *argv[]) match_byte_assert(0); /* Offset 27. */ +#if 1 pos++; pos++; pos++; pos++; +#else + printf("\nheader:"); + for (int i = 0; i < 4; i++) + printf(" %02x", data[pos++]); + printf("\n"); +#endif /* Offset 31. */ printf("%lld", get_u64());