X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pspp;a=blobdiff_plain;f=dump.c;h=3e30ce10f2e7b99857a4560ce55490dfc41bb2f4;hp=991dd366b4515bae2da7fdb4bc243100bf99473a;hb=c10bff4da438d2785409636677223cec18347647;hpb=9f2d5103848c48c3c49b5c0d11f1b2506ab5487e diff --git a/dump.c b/dump.c index 991dd366b4..3e30ce10f2 100644 --- a/dump.c +++ b/dump.c @@ -195,6 +195,15 @@ match_byte_assert(uint8_t b, const char *where) } #define match_byte_assert(b) match_byte_assert(b, WHERE) +static bool +get_bool(void) +{ + if (match_byte(0)) + return false; + match_byte_assert(1); + return true; +} + static void newline(FILE *stream, int pos) { @@ -357,26 +366,27 @@ hex_dump(int ofs, int n) static char * dump_counted_string(void) { - char *s = NULL; int inner_end = get_end(); + if (pos == inner_end) + return NULL; + + if (match_u32(5)) + { + match_u32_assert(0); + match_byte_assert(0x58); + } + else + match_u32_assert(0); + + char *s = NULL; + if (match_byte(0x31)) + s = get_string(); + else + match_byte_assert(0x58); if (pos != inner_end) { - if (match_u32(5)) - { - match_u32_assert(0); - match_byte_assert(0x58); - } - else - match_u32_assert(0); - if (match_byte(0x31)) - s = get_string(); - else - match_byte_assert(0x58); - if (pos != inner_end) - { - fprintf(stderr, "inner end discrepancy\n"); - exit(1); - } + fprintf(stderr, "inner end discrepancy\n"); + exit(1); } return s; } @@ -384,8 +394,18 @@ dump_counted_string(void) static void dump_style(FILE *stream) { - for (int i = 0; i < 4; i++) - printf (" %d", get_byte()); + if (match_byte(0x58)) + return; + + match_byte_assert(0x31); + if (get_bool()) + printf (" bold=\"yes\""); + if (get_bool()) + printf (" italic=\"yes\""); + if (get_bool()) + printf (" underline=\"yes\""); + if (!get_bool()) + printf (" show=\"no\""); char *fg = get_string(); /* foreground */ char *bg = get_string(); /* background */ char *font = get_string(); /* font */ @@ -394,6 +414,35 @@ dump_style(FILE *stream) fg, bg, font, size); } +static void +dump_style2(FILE *stream) +{ + if (match_byte(0x58)) + return; + + match_byte_assert(0x31); + 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 (" offset=\"%gpt\"", 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); +} + static char * dump_nested_string(FILE *stream) { @@ -405,10 +454,7 @@ dump_nested_string(FILE *stream) s = dump_counted_string(); if (s) fprintf(stream, " \"%s\"", s); - if (match_byte(0x31)) - dump_style(stream); - else - match_byte_assert(0x58); + dump_style(stream); match_byte_assert(0x58); if (pos != outer_end) { @@ -466,35 +512,8 @@ dump_value_modifier(FILE *stream) if (template) fprintf(stream, " template=\"%s\"", template); - if (match_byte(0x31)) - dump_style(stream); - else - match_byte_assert(0x58); - if (match_byte(0x31)) - { - 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); + dump_style(stream); + dump_style2(stream); if (pos != outer_end) { fprintf(stderr, "outer end discrepancy\n");