X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=dump.c;h=6cc9e52abe4e5a9767b5d008841ba462a14893cc;hb=d98a8409e3d4163c398b78a7edaa9ff286933805;hp=61ee61ac0c72639825ca6e258a4386606b40020e;hpb=91e1d822895e84a15e17b15762c6d33629f83342;p=pspp diff --git a/dump.c b/dump.c index 61ee61ac0c..6cc9e52abe 100644 --- a/dump.c +++ b/dump.c @@ -48,6 +48,12 @@ size_t pos; #define STR(x) XSTR(x) #define WHERE __FILE__":" STR(__LINE__) +static uint8_t +get_byte(void) +{ + return data[pos++]; +} + static unsigned int get_u32(void) { @@ -57,6 +63,15 @@ get_u32(void) return x; } +static unsigned int +get_be32(void) +{ + uint32_t x; + x = (data[pos] << 24) | (data[pos + 1] << 16) | (data[pos + 2] << 8) | data[pos + 3]; + pos += 4; + return x; +} + static unsigned int get_u16(void) { @@ -75,6 +90,15 @@ get_double(void) return x; } +static double __attribute__((unused)) +get_float(void) +{ + float x; + memcpy(&x, &data[pos], 4); + pos += 4; + return x; +} + static bool match_u32(uint32_t x) { @@ -96,6 +120,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_be32(uint32_t x) +{ + if (get_be32() == x) + return true; + pos -= 4; + return false; +} + +static void +match_be32_assert(uint32_t x, const char *where) +{ + unsigned int y = get_be32(); + if (x != y) + { + fprintf(stderr, "%s: 0x%x: expected be%u, got be%u\n", where, pos - 4, x, y); + exit(1); + } +} +#define match_be32_assert(x) match_be32_assert(x, WHERE) + static bool match_byte(uint8_t b) { @@ -227,6 +272,29 @@ get_string(const char *where) } #define get_string() get_string(WHERE) +static char * +get_string_be(const char *where) +{ + if (1 + /*data[pos + 1] == 0 && data[pos + 2] == 0 && data[pos + 3] == 0*/ + /*&& all_ascii(&data[pos + 4], data[pos])*/) + { + int len = data[pos + 2] * 256 + data[pos + 3]; + char *s = malloc(len + 1); + + memcpy(s, &data[pos + 4], len); + s[len] = 0; + pos += 4 + len; + return s; + } + else + { + fprintf(stderr, "%s: 0x%x: expected string\n", where, pos); + exit(1); + } +} +#define get_string_be() get_string_be(WHERE) + static int get_end(void) { @@ -247,7 +315,11 @@ hex_dump(int ofs, int n) fprintf(stderr, " "); #endif fprintf(stderr, "%02x", c); - //fprintf(stderr, "%c", c >= 32 && c < 127 ? c : '.'); + } + for (int i = 0; i < n; i++) + { + int c = data[ofs + i]; + fprintf(stderr, "%c", c >= 32 && c < 127 ? c : '.'); } fprintf(stderr, "\n"); } @@ -851,28 +923,28 @@ dump_fonts(void) match_byte_assert(i); match_byte_assert(0x31); printf(" font=\"%s\"", get_string()); - match_byte_assert(0); - match_byte_assert(0); - if (!match_byte(0x40) && !match_byte(0x20) && !match_byte(0x80) && !match_byte(0x10) && !match_byte(0x70)) - match_byte_assert(0x50); - match_byte_assert(0x41); - if (!match_u32(0) && !match_u32(1)) - match_u32_assert(2); - match_byte_assert(0); - /* OK, this seems really unlikely to be totally correct, but it matches my corpus... */ - if (!match_u32(0) && !match_u32(2) && !match_u32(4)) - { - if (i == 7) - match_u32_assert(0xfaad); - else - match_u32_assert(0); - } + printf(" size=\"%gpt\"", get_float()); + + int style = get_u32(); + if (style & 1) + printf(" bold=\"true\""); + if (style & 2) + printf(" italic=\"true\""); + + bool underline = data[pos++]; + if (underline) + printf(" underline=\"true\""); + + int halign = get_u32(); + printf("\nhalign=%d\n", halign); + + int valign = get_u32(); + printf("\nvalign=%d\n", valign); - if (!match_u32(0) && !match_u32(1) && !match_u32(2)) - match_u32_assert(3); printf (" fgcolor=\"%s\"", get_string()); printf (" bgcolor=\"%s\"", get_string()); + if (!match_byte(0)) match_byte_assert(1); match_u32_assert(0); @@ -882,42 +954,70 @@ dump_fonts(void) if (version > 1) { - if (i != 3) - { - pos += 12; - } - else - { - get_u32(); - if (!match_u32(-1) && !match_u32(8)) - match_u32_assert(24); - if (!match_u32(-1) && !match_u32(2)) - match_u32_assert(3); - } - - /* Who knows? Ranges from -1 to 8 with no obvious pattern. */ - get_u32(); + printf("\nfonts:"); + for (int i = 0; i < 4; i++) + printf(" %2d", get_u32()); + printf("\n"); } printf ("/>\n"); } - match_u32_assert(240); - pos += 240; + int x1 = get_u32(); + int x1_end = pos + x1; + printf("\n"); + match_be32_assert(1); + int n_borders = get_be32(); + for (int i = 0; i < n_borders; i++) + { + int type = get_be32(); + int stroke = get_be32(); + int color = get_be32(); + printf(" \n", + type, + (stroke == 0 ? "none" + : stroke == 1 ? "solid" + : stroke == 2 ? "dashed" + : stroke == 3 ? "thick" + : stroke == 4 ? "thin" + : stroke == 5 ? "double" + : ""), + color); + } + bool grid = get_byte(); + pos += 3; + printf(" \n", grid ? "yes" : "no"); + printf("\n"); + assert(pos == x1_end); int skip = get_u32(); assert(skip == 18 || skip == 25); pos += skip; int x3 = get_u32(); + int x3_end = pos + x3; if (version == 3) { - assert(x3 >= 117); - int len = data[pos + 0x34]; - if (len) - printf("%.*s\n", len, &data[pos + 0x35]); + match_be32_assert(1); + get_be32(); + printf("\n"); } - pos += x3; + pos = x3_end; int count = get_u32(); pos += 4 * count;