From 8af10bb39253b97589c5f4b455b708c8fb9e233b Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Tue, 5 Jan 2016 22:59:21 -0800 Subject: [PATCH] Figure out a few more details of one of the chunks in the fonts. --- dump.c | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 130 insertions(+), 8 deletions(-) diff --git a/dump.c b/dump.c index c247c4af66..04f38e0a75 100644 --- a/dump.c +++ b/dump.c @@ -218,11 +218,18 @@ get_string(const char *where) } #define get_string() get_string(WHERE) +static int +get_end(void) +{ + int len = get_u32(); + return pos + len; +} + static char * dump_counted_string(void) { char *s = NULL; - int inner_end = pos + get_u32(); + int inner_end = get_end(); if (pos != inner_end) { match_u32_assert(0); @@ -246,7 +253,7 @@ dump_nested_string(void) match_byte_assert (0); match_byte_assert (0); - int outer_end = pos + get_u32(); + int outer_end = get_end(); s = dump_counted_string(); match_byte_assert(0x58); match_byte_assert(0x58); @@ -294,8 +301,8 @@ dump_optional_value(FILE *stream) return; } - int outer_end = pos + get_u32(); - + int outer_end = get_end(); + /* This counted-string appears to be a template string, e.g. "Design\: [:^1:]1 Within Subjects Design\: [:^1:]2". */ dump_counted_string(); @@ -785,6 +792,24 @@ dump_title(void) } } +static void __attribute__((unused)) +hex_dump(int ofs, int n) +{ + for (int i = 0; i < n; i++) + { + int c = data[ofs + i]; +#if 0 + if (i && !(i % 16)) + fprintf(stderr, "-"); + else + fprintf(stderr, " "); +#endif + fprintf(stderr, "%02x ", c); + //fprintf(stderr, "%c", c >= 32 && c < 127 ? c : '.'); + } + fprintf(stderr, "\n"); +} + static void dump_fonts(void) { @@ -871,8 +896,8 @@ dump_fonts(void) int count = get_u32(); pos += 4 * count; - const char *encoding = get_string(); - printf ("%s\n", encoding); + const char *locale = get_string(); + printf ("%s\n", locale); if (!match_u32(0)) match_u32_assert(UINT32_MAX); @@ -916,8 +941,105 @@ dump_fonts(void) } else match_u32_assert(0); - int skip = get_u32(); - pos += skip; + + /* The last chunk is an outer envelope that contains two inner envelopes. + The second inner envelope has some interesting data like the encoding and + the locale. */ + if (version == 3) + { + int outer_end = get_end(); + + /* Skip first inner envelope. */ + int inner_len = get_u32(); + hex_dump(pos, inner_len); + pos += inner_len; + + assert(get_end() == outer_end); + + match_byte_assert(1); + match_byte_assert(0); + if (!match_byte(3)) + match_byte_assert(4); + match_byte_assert(0); + match_byte_assert(0); + match_byte_assert(0); + + printf("%s\n", get_string()); + printf("%s\n", get_string()); + printf("%s\n", get_string()); + printf("%s\n", get_string()); + printf("%s\n", get_string()); + + if (!match_byte(0)) + match_byte_assert(1); + match_byte_assert(0); + if (!match_byte(0)) + match_byte_assert(1); + if (!match_byte(0)) + match_byte_assert(1); + + if (!match_byte(0x97) && !match_byte(0x98) && !match_byte(0x99)) + match_byte_assert(0x9a); + match_byte_assert(7); + match_byte_assert(0); + match_byte_assert(0); + + if (match_byte('.')) + { + if (!match_byte(',') && !match_byte('\'')) + match_byte_assert(' '); + } + else + { + match_byte_assert(','); + if (!match_byte('.') && !match_byte(' ')) + match_byte_assert(0); + } + + pos += 8; + match_byte_assert(1); + + if (outer_end - pos > 6) + { + uint8_t *endp = memmem(&data[pos], outer_end - pos, "\5\0\0\0\4", 5); + assert(endp); + + int end = endp - data; + if (pos != end) + { + printf("%s\n", get_string()); + printf("%s\n", get_string()); + + if (pos != end) + { + match_u32_assert(0); + get_u32(); + match_u32_assert(0); + } + } + //fprintf(stderr, "%d\n", end - pos); + //hex_dump(pos, end - pos); + assert(pos == end); + } + + if (match_u32(5)) + { + for (int i = 0; i < 5; i++) + printf("%s\n", 'A' + i, get_string(), 'A' + i); + } + else + match_u32_assert(0); + + match_byte_assert(0x2e); + if (!match_byte(0)) + match_byte_assert(1); + + assert(pos == outer_end); + + pos = outer_end; + } + else + pos = get_end(); } int -- 2.30.2