X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=dump.c;h=a52cafddf0d414cb06ddd8464c9795949b91e2d9;hb=ebc66e3005143a6feb347e99e2d6e7e900623bf0;hp=04f38e0a751bf41747130472385c1febe6c8c96f;hpb=8af10bb39253b97589c5f4b455b708c8fb9e233b;p=pspp diff --git a/dump.c b/dump.c index 04f38e0a75..a52cafddf0 100644 --- a/dump.c +++ b/dump.c @@ -246,8 +246,44 @@ dump_counted_string(void) return s; } +static void __attribute__((unused)) +hex_dump(int ofs, int n) +{ + for (int i = 0; i < n; i++) + { + int c = data[ofs + i]; +#if 1 + 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_style(FILE *stream) +{ + match_byte(1); + match_byte(0); + match_byte(0); + match_byte(0); + match_byte_assert(1); + 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\"", + fg, bg, font, size); +} + static char * -dump_nested_string(void) +dump_nested_string(FILE *stream) { char *s = NULL; @@ -255,7 +291,12 @@ dump_nested_string(void) match_byte_assert (0); int outer_end = get_end(); s = dump_counted_string(); - match_byte_assert(0x58); + if (s) + fprintf(stream, " \"%s\"", s); + if (match_byte(0x31)) + dump_style(stream); + else + match_byte_assert(0x58); match_byte_assert(0x58); if (pos != outer_end) { @@ -267,20 +308,23 @@ dump_nested_string(void) } static void -dump_optional_value(FILE *stream) +dump_value_modifier(FILE *stream) { if (match_byte (0x31)) { if (match_u32 (0)) { + fprintf(stream, "\n"); return; } @@ -305,22 +350,12 @@ dump_optional_value(FILE *stream) /* This counted-string appears to be a template string, e.g. "Design\: [:^1:]1 Within Subjects Design\: [:^1:]2". */ - dump_counted_string(); + char *template = dump_counted_string(); + if (template) + fprintf(stream, " template=\"%s\"", template); if (match_byte(0x31)) - { - /* Only one example in the corpus. */ - match_byte(1); - match_byte(0); - match_byte(0); - match_byte(0); - match_byte_assert(1); - get_string(); /* foreground */ - get_string(); /* background */ - get_string(); /* font */ - if (!match_byte(14)) - match_byte_assert(12); /* size? */ - } + dump_style(stream); else match_byte_assert(0x58); if (match_byte(0x31)) @@ -348,32 +383,36 @@ dump_optional_value(FILE *stream) fprintf(stderr, "outer end discrepancy\n"); exit(1); } + fprintf(stream, "/>\n"); } else if (match_u32 (1)) { - fprintf(stream, "(footnote %d) ", get_u32()); - dump_nested_string(); + fprintf(stream, "\n"); } else if (match_u32 (2)) { - fprintf(stream, "(special 2)"); - if (!match_byte(0)) + fprintf(stream, "\n"); } else { + fprintf(stream, "\n"); } } else @@ -444,7 +483,7 @@ dump_value(FILE *stream, int level) unsigned int format; double value; - dump_optional_value(stream); + dump_value_modifier(stream); format = get_u32 (); value = get_double (); fprintf (stream, "\n", @@ -456,7 +495,7 @@ dump_value(FILE *stream, int level) char *var, *vallab; double value; - dump_optional_value (stream); + dump_value_modifier (stream); format = get_u32 (); value = get_double (); var = get_string (); @@ -466,7 +505,7 @@ dump_value(FILE *stream, int level) if (var[0]) fprintf (stream, " variable=\"%s\"", var); if (vallab[0]) - fprintf (stream, " label=\"%s\"/>\n", vallab); + fprintf (stream, " label=\"%s\"", vallab); fprintf (stream, "/>\n"); if (!match_byte (1) && !match_byte(2)) match_byte_assert (3); @@ -474,7 +513,7 @@ dump_value(FILE *stream, int level) else if (match_byte (3)) { char *text = get_string(); - dump_optional_value(stream); + dump_value_modifier(stream); char *identifier = get_string(); char *text_eng = get_string(); fprintf (stream, "= 32 && c < 127 ? c : '.'); - } - fprintf(stderr, "\n"); -} - static void dump_fonts(void) { @@ -854,8 +875,8 @@ dump_fonts(void) match_u32_assert(5); if (!match_u32(10) && !match_u32(11) && !match_u32(5)) match_u32_assert(9); - if (!match_u32(0)) - match_u32_assert(1); + if (!match_u32(0) && !match_u32(1)) + match_u32_assert(2); } else { @@ -879,19 +900,15 @@ dump_fonts(void) match_u32_assert(18); pos += 18; - if (match_u32(117)) - pos += 117; - else if (match_u32(142)) - pos += 142; - else if (match_u32(143)) - pos += 143; - else if (match_u32(150)) - pos += 150; - else + int x3 = get_u32(); + if (version == 3) { - match_u32_assert(16); - pos += 16; + assert(x3 >= 117); + int len = data[pos + 0x34]; + if (len) + printf("%.*s\n", len, &data[pos + 0x35]); } + pos += x3; int count = get_u32(); pos += 4 * count; @@ -908,8 +925,9 @@ dump_fonts(void) match_byte_assert(1); if (version > 1) { - if (!match_byte(0x97) && !match_byte(0x98) && !match_byte(0x99)) - match_byte_assert(0x9a); + if (!match_byte(0x97) && !match_byte(0x98) + && !match_byte(0x99) && !match_byte(0x9a)) + match_byte_assert(0x9b); match_byte_assert(7); match_byte_assert(0); match_byte_assert(0); @@ -949,17 +967,16 @@ 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); match_byte_assert(0); - if (!match_byte(3)) - match_byte_assert(4); + if (!match_byte(3) && !match_byte(4)) + match_byte_assert(5); match_byte_assert(0); match_byte_assert(0); match_byte_assert(0); @@ -978,8 +995,9 @@ dump_fonts(void) if (!match_byte(0)) match_byte_assert(1); - if (!match_byte(0x97) && !match_byte(0x98) && !match_byte(0x99)) - match_byte_assert(0x9a); + if (!match_byte(0x97) && !match_byte(0x98) + && !match_byte(0x99) && !match_byte(0x9a)) + match_byte_assert(0x9b); match_byte_assert(7); match_byte_assert(0); match_byte_assert(0); @@ -1001,25 +1019,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)) @@ -1034,12 +1053,17 @@ dump_fonts(void) if (!match_byte(0)) match_byte_assert(1); + if (pos < outer_end) + { + match_u32_assert(2000000); + match_u32_assert(0); + } assert(pos == outer_end); pos = outer_end; } else - pos = get_end(); + match_u32_assert(0); } int @@ -1121,7 +1145,7 @@ main(int argc, char *argv[]) /* This might be a version number of some kind, because value 1 seems to only appear in an SPV file that also required its own weird - special cases in dump_optional_value(). */ + special cases in dump_value_modifier(). */ version = get_u32(); pos -= 4; if (!match_u32(1))