X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=dump.c;h=73935a73374faf7df3695a23436ad8c2506385ba;hb=b07cc00facf9d44f590fa9b2ef5b2b6ab9b08911;hp=64ddcfdda85c16d6c978b89d5bfa73d3f3cb62de;hpb=1fae52d40322a80fe485e2f70eba05170cd091fd;p=pspp
diff --git a/dump.c b/dump.c
index 64ddcfdda8..73935a7337 100644
--- a/dump.c
+++ b/dump.c
@@ -10,6 +10,8 @@
static uint8_t *data;
static size_t n;
+int version;
+
static bool
all_ascii(const uint8_t *p, size_t n)
{
@@ -107,7 +109,13 @@ match_byte_assert(uint8_t b, const char *where)
#define match_byte_assert(b) match_byte_assert(b, WHERE)
static void
-dump_raw(FILE *stream, int start, int end, const char *separator)
+newline(FILE *stream, int pos)
+{
+ fprintf(stream, "\n%08x: ", pos);
+}
+
+static void
+dump_raw(FILE *stream, int start, int end)
{
for (size_t i = start; i < end; )
{
@@ -119,7 +127,8 @@ dump_raw(FILE *stream, int start, int end, const char *separator)
&& i + 4 + data[i] + data[i + 1] * 256 <= end
&& all_ascii(&data[i + 4], data[i] + data[i + 1] * 256))
{
- fprintf(stream, "%s\"", separator);
+ newline(stream, i);
+ fprintf(stream, "\"");
fwrite(&data[i + 4], 1, data[i] + data[i + 1] * 256, stream);
fputs("\" ", stream);
@@ -133,8 +142,9 @@ dump_raw(FILE *stream, int start, int end, const char *separator)
double d;
memcpy (&d, &data[i + 4], 8);
- fprintf (stream, "F40.%d(%.*f)%s", data[i], data[i], d, separator);
+ fprintf (stream, "F40.%d(%.*f)", data[i], data[i], d);
i += 12;
+ newline (stream, i);
}
else if (i + 12 <= end
&& data[i + 1] == 40
@@ -144,8 +154,9 @@ dump_raw(FILE *stream, int start, int end, const char *separator)
double d;
memcpy (&d, &data[i + 4], 8);
- fprintf (stream, "PCT40.%d(%.*f)%s", data[i], data[i], d, separator);
+ fprintf (stream, "PCT40.%d(%.*f)", data[i], data[i], d);
i += 12;
+ newline(stream, i);
}
else if (i + 4 <= end
&& (data[i] && data[i] != 88 && data[i] != 0x41)
@@ -237,27 +248,47 @@ dump_value_31(FILE *stream)
else
match_u32_assert (0);
- int outer_end = pos + get_u32();
- int inner_end = pos + get_u32();
- match_u32_assert(0);
- if (match_byte(0x31))
+ if (version == 1)
{
- /* Appears to be a template string, e.g. '^1 cells (^2) expf < 5. Min exp = ^3...'.
- Probably doesn't actually appear in output because many examples look unpolished,
- e.g. 'partial list cases value ^1 shown upper...' */
- get_string();
+ /* We only have one SPV file for this version (with many
+ tables). */
+ 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;
}
- else
- match_byte_assert(0x58);
+
+ int outer_end = pos + get_u32();
+ int inner_end = pos + get_u32();
if (pos != inner_end)
{
- fprintf(stderr, "inner end discrepancy\n");
- exit(1);
+ match_u32_assert(0);
+ if (match_byte(0x31))
+ {
+ /* Appears to be a template string, e.g. '^1 cells (^2) expf < 5. Min exp = ^3...'.
+ Probably doesn't actually appear in output because many examples look unpolished,
+ e.g. 'partial list cases value ^1 shown upper...' */
+ get_string();
+ }
+ else
+ match_byte_assert(0x58);
+ if (pos != inner_end)
+ {
+ fprintf(stderr, "inner end discrepancy\n");
+ exit(1);
+ }
}
if (match_byte(0x31))
{
/* Only one example in the corpus. */
+ match_byte(1);
match_byte(0);
match_byte(0);
match_byte(0);
@@ -265,11 +296,31 @@ dump_value_31(FILE *stream)
get_string(); /* foreground */
get_string(); /* background */
get_string(); /* font */
- match_byte_assert(12); /* size? */
+ if (!match_byte(14))
+ match_byte_assert(12); /* size? */
+ }
+ else
+ match_byte_assert(0x58);
+ if (match_byte(0x31))
+ {
+ /* Only two SPV files have anything like this, so it's hard to
+ generalize. */
+ match_u32_assert(0);
+ match_u32_assert(0);
+ match_u32_assert(0);
+ match_u32_assert(0);
+ match_byte_assert(1);
+ match_byte_assert(0);
+ if (!match_byte(8) && !match_byte(1))
+ match_byte_assert(2);
+ match_byte_assert(0);
+ match_byte_assert(8);
+ match_byte_assert(0);
+ match_byte_assert(10);
+ match_byte_assert(0);
}
else
match_byte_assert(0x58);
- match_byte_assert(0x58);
if (pos != outer_end)
{
fprintf(stderr, "outer end discrepancy\n");
@@ -284,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
@@ -355,7 +407,7 @@ format_to_string (int type)
}
static void
-dump_value__(FILE *stream, int level, bool match1)
+dump_value(FILE *stream, int level, bool match1)
{
match_byte(0);
match_byte(0);
@@ -400,7 +452,7 @@ dump_value__(FILE *stream, int level, bool match1)
char *var, *vallab;
double value;
- match_byte_assert (0x58);
+ dump_value_31 (stream);
format = get_u32 ();
value = get_double ();
var = get_string ();
@@ -466,7 +518,7 @@ dump_value__(FILE *stream, int level, bool match1)
fprintf (stream, " ");
fprintf (stream, "