X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=dump.c;h=55ad4bc64ca55316839a244f0a7bb1692d023548;hb=eb5a888913207139985fcd85886b6b9c36aa01a0;hp=cba4509cd41ebdecdff224aba3c46e5a7ba374b3;hpb=92a04dcbe26bed7d6c044f06414bc54e0dbb1ad1;p=pspp diff --git a/dump.c b/dump.c index cba4509cd4..55ad4bc64c 100644 --- a/dump.c +++ b/dump.c @@ -407,7 +407,7 @@ format_to_string (int type) } static void -dump_value(FILE *stream, int level) +dump_value(FILE *stream, int level, bool match1) { match_byte(0); match_byte(0); @@ -431,7 +431,8 @@ dump_value(FILE *stream, int level) fprintf (stream, "/>\n"); if (!match_byte (0)) match_byte_assert(1); - + if (match1) + match_byte (1); } else if (match_byte (5)) { @@ -496,6 +497,8 @@ dump_value(FILE *stream, int level) value = get_double (); fprintf (stream, "\n", DBL_DIG, value, format_to_string(format >> 16), (format >> 8) & 0xff, format & 0xff); + if (match1) + match_byte (1); } else { @@ -515,7 +518,7 @@ dump_value(FILE *stream, int level) fprintf (stream, " "); fprintf (stream, "\n", i + 1); for (int j = 0; j < y; j++) - dump_value (stream, level + 2); + dump_value (stream, level + 2, false); for (int j = 0; j <= level + 1; j++) fprintf (stream, " "); fprintf (stream, "\n"); @@ -557,8 +560,10 @@ dump_category(int level, int *indexes, int *n_indexes, int max_indexes) for (int i = 0; i <= level; i++) fprintf (stdout, " "); printf ("\n"); - dump_value (stdout, level + 1); - match_u32(1); + dump_value (stdout, level + 1, true); + match_byte(0); + match_byte(0); + match_byte(0); if (match_u32 (1)) match_byte (0); @@ -607,7 +612,7 @@ dump_dim(int indx) int n_categories; printf ("\n", indx); - dump_value (stdout, 0); + dump_value (stdout, 0, false); /* This byte is usually 0x02 but many other values have been spotted. */ pos++; @@ -665,7 +670,7 @@ dump_data(void) match_u32_assert(0); if (version == 1) match_byte(0); - dump_value(stdout, 1); + dump_value(stdout, 1, false); fprintf (stdout, " \n"); } printf ("\n"); @@ -676,20 +681,17 @@ dump_title(void) { pos = 0x27; printf ("\n"); - dump_value(stdout, 0); - match_byte(1); + dump_value(stdout, 0, true); printf ("\n"); printf ("\n"); - dump_value(stdout, 0); - match_byte(1); + dump_value(stdout, 0, true); printf ("\n"); match_byte_assert(0x31); printf ("\n"); - dump_value(stdout, 0); - match_byte(1); + dump_value(stdout, 0, true); printf ("\n"); match_byte(0); @@ -697,7 +699,7 @@ dump_title(void) if (match_byte(0x31)) { printf ("\n"); - dump_value(stdout, 0); + dump_value(stdout, 0, false); printf ("\n"); } else @@ -708,7 +710,7 @@ dump_title(void) for (int i = 0; i < n_footnotes; i++) { printf ("\n", i); - dump_value(stdout, 0); + dump_value(stdout, 0, false); if (match_byte (0x31)) { /* Custom footnote marker string. */ @@ -878,90 +880,95 @@ main(int argc, char *argv[]) exit(1); } - if (argc > 1) + if (argc != 2) { - if (!strcmp(argv[1], "title0")) - { - pos = 0x27; - if (match_byte (0x03) - || (match_byte (0x05) && match_byte (0x58))) - printf ("%s\n", get_string()); - else - printf ("\n"); - return 0; - } - else if (!strcmp(argv[1], "title")) - { - dump_title(); - exit(0); - } - else if (!strcmp(argv[1], "titleraw")) - { - const char fonts[] = "\x01\x31\x09\0\0\0SansSerif"; - start = 0x27; - n = find(fonts, sizeof fonts - 1); - } - else if (!strcmp(argv[1], "fonts")) - { - const char fonts[] = "\x01\x31\x09\0\0\0SansSerif"; - const char styles[] = "\xf0\0\0\0"; - start = find(fonts, sizeof fonts - 1); - n = find(styles, sizeof styles - 1); - } - else if (!strcmp(argv[1], "styles")) - { - const char styles[] = "\xf0\0\0\0"; - const char dimensions[] = "-,,,.\0"; - start = find(styles, sizeof styles - 1); - n = find(dimensions, sizeof dimensions - 1) + sizeof dimensions - 1; - } - else if (!strcmp(argv[1], "dimensions") || !strcmp(argv[1], "all")) - { - pos = 0; - match_byte_assert(1); - match_byte_assert(0); - - /* 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_value_31(). */ - version = get_u32(); - pos -= 4; - if (!match_u32(1)) - match_u32_assert(3); + fprintf (stderr, "usage: %s TYPE < .bin", argv[0]); + exit (1); + } - match_byte_assert(1); - if (!match_byte(0)) - match_byte_assert(1); - match_byte_assert(0); - match_byte_assert(0); - if (!match_byte(0)) - match_byte_assert(1); - pos++; - match_byte_assert(0); - match_byte_assert(0); - match_byte_assert(0); - dump_title (); - dump_fonts(); - dump_dims (); - dump_data (); - match_byte (1); - if (pos != n) - { - fprintf (stderr, "%x / %x\n", pos, n); - exit(1); - } - exit(0); - } + if (!strcmp(argv[1], "title0")) + { + pos = 0x27; + if (match_byte (0x03) + || (match_byte (0x05) && match_byte (0x58))) + printf ("%s\n", get_string()); else + printf ("\n"); + return 0; + } + else if (!strcmp(argv[1], "title")) + { + dump_title(); + exit(0); + } + else if (!strcmp(argv[1], "titleraw")) + { + const char fonts[] = "\x01\x31\x09\0\0\0SansSerif"; + start = 0x27; + n = find(fonts, sizeof fonts - 1); + } + else if (!strcmp(argv[1], "fonts")) + { + const char fonts[] = "\x01\x31\x09\0\0\0SansSerif"; + const char styles[] = "\xf0\0\0\0"; + start = find(fonts, sizeof fonts - 1); + n = find(styles, sizeof styles - 1); + } + else if (!strcmp(argv[1], "styles")) + { + const char styles[] = "\xf0\0\0\0"; + const char dimensions[] = "-,,,.\0"; + start = find(styles, sizeof styles - 1); + n = find(dimensions, sizeof dimensions - 1) + sizeof dimensions - 1; + } + else if (!strcmp(argv[1], "dimensions") || !strcmp(argv[1], "all")) + { + pos = 0; + match_byte_assert(1); + match_byte_assert(0); + + /* 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_value_31(). */ + version = get_u32(); + pos -= 4; + if (!match_u32(1)) + match_u32_assert(3); + + match_byte_assert(1); + if (!match_byte(0)) + match_byte_assert(1); + match_byte_assert(0); + match_byte_assert(0); + if (!match_byte(0)) + match_byte_assert(1); + pos++; + match_byte_assert(0); + match_byte_assert(0); + match_byte_assert(0); + dump_title (); + dump_fonts(); + dump_dims (); + dump_data (); + match_byte (1); + if (pos != n) { - fprintf (stderr, "unknown section %s\n", argv[1]); + fprintf (stderr, "%x / %x\n", pos, n); exit(1); } + exit(0); } - else - start = 0x27; + else if (!strcmp(argv[1], "raw")) + { + start = 0x27; - dump_raw(stdout, start, n); + dump_raw(stdout, start, n); + } + else + { + fprintf (stderr, "unknown section %s\n", argv[1]); + exit(1); + } return 0; }