X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=dump.c;h=12ee73ebdf4d02d143776cb252eca089ac215a7e;hb=371cb01fb5467917de7e90fd49872f15a8e1490e;hp=c737c01d1dd4f8252967d8e8b66785f992cf9a70;hpb=b84bc4577a96fdafefda66b414fa0eae35e81331;p=pspp diff --git a/dump.c b/dump.c index c737c01d1d..12ee73ebdf 100644 --- a/dump.c +++ b/dump.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include "u8-mbtouc.h" @@ -63,6 +64,15 @@ get_u32(void) return x; } +static unsigned long long int +get_u64(void) +{ + uint64_t x; + memcpy(&x, &data[pos], 8); + pos += 8; + return x; +} + static unsigned int get_be32(void) { @@ -120,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) { @@ -310,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 * @@ -986,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); @@ -1010,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]) @@ -1019,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); @@ -1066,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); @@ -1107,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 @@ -1129,7 +1199,13 @@ dump_fonts(void) printf("%s\n", get_string()); match_u32_assert(0); - get_u32(); + + time_t date = get_u32(); + struct tm tm = *localtime(&date); + char s[128]; + strftime(s, sizeof s, "%a, %d %b %Y %H:%M:%S %z", &tm); + printf("%s\n", s); + match_u32_assert(0); } } @@ -1142,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); @@ -1285,19 +1361,20 @@ 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. - - This is the tableId, e.g. -4154297861994971133 would be 0xdca00003. - We don't have enough context to validate it. */ - pos += 4; - - /* Offset 35. */ - pos += 4; + /* Offset 31. */ + printf("%lld", get_u64()); dump_title (); dump_fonts();