X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=dump.c;h=976764dfe7f98a6a5764b341bc211ffba3e48bb9;hb=26c90f23c4f881cbffa1e9bd321072ea4495ca91;hp=df633fa660e10d44d5e24d0e55dc3bd2a19830f2;hpb=e5246fad25f28d268777cba4bf9ce3dd1e08eb56;p=pspp
diff --git a/dump.c b/dump.c
index df633fa660..976764dfe7 100644
--- a/dump.c
+++ b/dump.c
@@ -252,10 +252,15 @@ dump_value_31(FILE *stream)
{
/* We only have one SPV file for this version (with many
tables). */
- match_u32_assert(0x200);
- match_u32_assert(0x1000000);
- match_u32_assert(0);
- match_byte_assert(0);
+ match_byte(0);
+ if (!match_u32(1))
+ match_u32_assert(2);
+ match_byte(0);
+ match_byte(0);
+ if (!match_u32(0) && !match_u32(1) && !match_u32(2) && !match_u32(3) && !match_u32(4) && !match_u32(5) && !match_u32(6) && !match_u32(7) && !match_u32(8) && !match_u32(9))
+ match_u32_assert(10);
+ match_byte(0);
+ match_byte(0);
return;
}
@@ -330,10 +335,11 @@ dump_value_31(FILE *stream)
else if (match_u32 (2))
{
fprintf(stream, "(special 2)");
+ if (!match_byte(0))
+ match_byte_assert(2);
match_byte_assert(0);
- match_byte_assert(0);
- if (!match_u32 (2))
- match_u32_assert(1);
+ if (!match_u32 (2) && !match_u32(1))
+ match_u32_assert(3);
dump_nested_string(); /* Our corpus doesn't contain any examples with strings though. */
}
else
@@ -620,7 +626,8 @@ dump_dim(int indx)
if (!match_byte(0))
match_byte_assert(1);
match_byte_assert(1);
- match_u32_assert(indx);
+ if (!match_u32(UINT32_MAX))
+ match_u32_assert(indx);
n_categories = get_u32();
int indexes[2048];
@@ -661,6 +668,8 @@ dump_data(void)
{
printf (" \n", get_u32());
match_u32_assert(0);
+ if (version == 1)
+ match_byte(0);
dump_value(stdout, 1, false);
fprintf (stdout, " \n");
}
@@ -822,7 +831,7 @@ dump_fonts(void)
match_u32_assert(UINT32_MAX);
if (match_byte('.'))
{
- if (!match_byte(','))
+ if (!match_byte(',') && !match_byte('\''))
match_byte_assert(' ');
}
else
@@ -871,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;
}