X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=dump.c;h=991dd366b4515bae2da7fdb4bc243100bf99473a;hb=9f2d5103848c48c3c49b5c0d11f1b2506ab5487e;hp=212421cb8045f5d330129c1882745abe1ae4388c;hpb=860ae7593728a465b1f0d5e443df7e624df9cf30;p=pspp diff --git a/dump.c b/dump.c index 212421cb80..991dd366b4 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 * @@ -364,18 +384,13 @@ dump_counted_string(void) static void dump_style(FILE *stream) { - match_byte(1); - match_byte(0); - match_byte(0); - match_byte(0); - match_byte_assert(1); + for (int i = 0; i < 4; i++) + printf (" %d", get_byte()); char *fg = get_string(); /* foreground */ char *bg = get_string(); /* background */ char *font = get_string(); /* font */ - int size = data[pos]; - if (!match_byte(14)) - match_byte_assert(12); /* size? */ - fprintf(stream, " fgcolor=\"%s\" bgcolor=\"%s\" font=\"%s\" size=\"%d\"", + int size = get_byte() * (72. / 96.); + fprintf(stream, " fgcolor=\"%s\" bgcolor=\"%s\" font=\"%s\" size=\"%dpt\"", fg, bg, font, size); } @@ -457,21 +472,26 @@ dump_value_modifier(FILE *stream) match_byte_assert(0x58); if (match_byte(0x31)) { - /* Only two SPV files have anything like this, so it's hard to - generalize. */ - match_u32_assert(0); - match_u32_assert(0); - match_u32_assert(0); - match_u32_assert(0); - match_byte_assert(1); - match_byte_assert(0); - if (!match_byte(8) && !match_byte(1)) - match_byte_assert(2); - match_byte_assert(0); - match_byte_assert(8); - match_byte_assert(0); - match_byte_assert(10); - match_byte_assert(0); + uint32_t halign = get_u32(); + printf (" halign=\"%s\"", + halign == 0 ? "center" + : halign == 2 ? "left" + : halign == 4 ? "right" + : halign == 6 ? "decimal" + : halign == 0xffffffad ? "mixed" + : ""); + int valign = get_u32(); + printf (" valign=\"%s\"", + valign == 0 ? "center" + : valign == 1 ? "top" + : valign == 3 ? "bottom" + : ""); + printf (" %g", get_double()); + int l = get_u16(); + int r = get_u16(); + int t = get_u16(); + int b = get_u16(); + printf (" margins=\"%d %d %d %d\"", l, r, t, b); } else match_byte_assert(0x58); @@ -947,27 +967,34 @@ dump_fonts(void) printf(" underline=\"true\""); int halign = get_u32(); - printf("\nhalign=%d\n", halign); + printf(" halign=%d", halign); int valign = get_u32(); - printf("\nvalign=%d\n", valign); + printf(" valign=%d", valign); printf (" fgcolor=\"%s\"", get_string()); printf (" bgcolor=\"%s\"", get_string()); if (!match_byte(0)) match_byte_assert(1); - match_u32_assert(0); - char *othercolor = get_string(); - if (othercolor[0]) - printf(" othercolor=\"%s\"", othercolor); + + char *alt_fgcolor = get_string(); + if (alt_fgcolor[0]) + printf (" altfg=\"%s\"", alt_fgcolor); + char *alt_bgcolor = get_string(); + if (alt_bgcolor[0]) + printf (" altbg=\"%s\"", alt_bgcolor); if (version > 1) { - printf("\nfonts:"); + printf(" margins=\""); for (int i = 0; i < 4; i++) - printf(" %2d", get_u32()); - printf("\n"); + { + if (i) + putchar(' '); + printf("%d", get_u32()); + } + putchar('"'); } printf ("/>\n"); @@ -996,7 +1023,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,8 +1047,14 @@ dump_fonts(void) if (!get_byte()) printf(" footnoteposition=\"subscript\""); get_byte(); - pos += get_be32(); - get_string_be(); + int nbytes = get_be32(); + printf("\n"); + hex_dump(pos, nbytes); + printf("\n"); + pos += nbytes; + char *notes = get_string_be(); + if (notes[0]) + printf(" notes=\"%s\"", notes); char *look = get_string_be(); if (look[0]) printf(" look=\"%s\"", look); @@ -1029,8 +1062,19 @@ dump_fonts(void) } pos = x3_end; + /* Manual column widths, if present. */ int count = get_u32(); - pos += 4 * count; + if (count > 0) + { + 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 +1120,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 +1189,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 +1230,7 @@ dump_fonts(void) else match_u32_assert(0); - match_byte_assert(0x2e); + match_byte_assert('.'); if (!match_byte(0)) match_byte_assert(1); @@ -1263,48 +1335,19 @@ main(int argc, char *argv[]) match_u32_assert(3); match_byte_assert(1); - if (!match_byte(0)) - match_byte_assert(1); - - /* Offset 8. */ - match_byte_assert(0); - if (!match_byte(0)) - match_byte_assert(1); - if (!match_byte(0)) - match_byte_assert(1); - - /* Offset 11. */ - pos++; - match_byte_assert(0); - match_byte_assert(0); - match_byte_assert(0); - - /* Offset 15. */ - pos++; - if (!match_byte(0)) - match_byte_assert(1); - match_byte_assert(0); - match_byte_assert(0); - - /* Offset 19. */ - pos++; - if (!match_byte(0)) - match_byte_assert(1); - match_byte_assert(0); - match_byte_assert(0); - - /* Offset 23. */ - pos++; - if (!match_byte(0)) - match_byte_assert(1); - match_byte_assert(0); - match_byte_assert(0); - - /* Offset 27. */ - pos++; - pos++; - pos++; - pos++; + for (int i = 0; i < 4; i++) + if (!match_byte(0)) + match_byte_assert(1); + get_u32(); + + int min_col_width = get_u32(); + int max_col_width = get_u32(); + int min_row_width = get_u32(); + int max_row_width = get_u32(); + printf("\n", + min_col_width, max_col_width, + min_row_width, max_row_width); /* Offset 31. */ printf("%lld", get_u64());