From 6a45803579c7f58e62668306240784beec7a611a Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Wed, 6 Jan 2016 20:40:17 -0800 Subject: [PATCH] Some more details of styles. --- dump.c | 42 +++++++++++++++++++++--------------------- spv-file-format.texi | 18 ++++++++++++++++-- 2 files changed, 37 insertions(+), 23 deletions(-) diff --git a/dump.c b/dump.c index 04f38e0a75..4d7d7f468e 100644 --- a/dump.c +++ b/dump.c @@ -798,13 +798,13 @@ hex_dump(int ofs, int n) for (int i = 0; i < n; i++) { int c = data[ofs + i]; -#if 0 +#if 1 if (i && !(i % 16)) fprintf(stderr, "-"); else fprintf(stderr, " "); #endif - fprintf(stderr, "%02x ", c); + fprintf(stderr, "%02x", c); //fprintf(stderr, "%c", c >= 32 && c < 127 ? c : '.'); } fprintf(stderr, "\n"); @@ -949,11 +949,10 @@ dump_fonts(void) { int outer_end = get_end(); - /* Skip first inner envelope. */ - int inner_len = get_u32(); - hex_dump(pos, inner_len); - pos += inner_len; + /* First inner envelope: byte*33 int[n] int*[n]. */ + pos = get_end(); + /* Second inner envelope. */ assert(get_end() == outer_end); match_byte_assert(1); @@ -1001,25 +1000,26 @@ dump_fonts(void) 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) + /* There might be a pair of strings representing a dataset and + datafile name, or there might be a set of custom currency strings. + The custom currency strings start with a pair of integers, so we + can distinguish these from a string by checking for a null byte; a + small 32-bit integer will always contain a null and a text string + never will. */ + int save_pos = pos; + int len = get_u32(); + bool has_dataset = !memchr(&data[pos], '\0', len); + pos = save_pos; + + if (has_dataset) { printf("%s\n", get_string()); printf("%s\n", get_string()); - if (pos != end) - { - match_u32_assert(0); - get_u32(); - match_u32_assert(0); - } + 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)) @@ -1039,7 +1039,7 @@ dump_fonts(void) pos = outer_end; } else - pos = get_end(); + match_u32_assert(0); } int diff --git a/spv-file-format.texi b/spv-file-format.texi index f9d698706e..38effad71f 100644 --- a/spv-file-format.texi +++ b/spv-file-format.texi @@ -400,8 +400,22 @@ styles := 00 font*8 (i0 | i-1) (00 | 01) 00 (00 | 01) int byte[decimal] byte[grouping] - int[x5] string*[x5] /* @r{custom currency} */ - int[x6] byte*[x6] + int[n-ccs] string*[n-ccs] /* @r{custom currency} */ + styles2 + +styles2 := i0 /* @r{version 1} */ +styles2 := count(count(x5) count(x6)) /* @r{version 3} */ +x5 := byte*33 int[n] int*n +x6 := 01 00 (03 | 04) 00 00 00 + string[command] string[subcommand] + string[language] string[charset] string[locale] + (00 | 01) 00 (00 | 01) (00 | 01) + int + byte[decimal] byte[grouping] + byte*8 01 + (string[dataset] string[datafile] i0 int i0)? + int[n-ccs] string*[n-ccs] + 2e (00 | 01) @end example In every example in the corpus, @code{x1} is 240. The meaning of the -- 2.30.2