From: Ben Pfaff Date: Sun, 2 Nov 2014 05:21:04 +0000 (-0700) Subject: Fix a few more (strings can be longer than 255 bytes!). X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7847d3e48d6aaee32952b0955500f1f6102cf192;p=pspp Fix a few more (strings can be longer than 255 bytes!). --- diff --git a/dump.c b/dump.c index 3ff45737c6..14a8472042 100644 --- a/dump.c +++ b/dump.c @@ -127,15 +127,16 @@ match_byte_assert(uint8_t b, const char *where) static char * get_string(const char *where) { - if (data[pos + 1] == 0 && data[pos + 2] == 0 && data[pos + 3] == 0 + if (1 + /*data[pos + 1] == 0 && data[pos + 2] == 0 && data[pos + 3] == 0*/ /*&& all_ascii(&data[pos + 4], data[pos])*/) { - int len = data[pos]; + int len = data[pos] + data[pos + 1] * 256; char *s = malloc(len + 1); memcpy(s, &data[pos + 4], len); s[len] = 0; - pos += 4 + data[pos]; + pos += 4 + len; return s; } else @@ -808,8 +809,128 @@ dump_data(void) printf ("value \"%s\" format %d(%d.%d) var \"%s\" vallab \"%s\"", value, format >> 16, (format >> 8) & 0xff, format & 0xff, var, vallab); } + else if (match_byte (5)) + { + match_byte_assert (0x58); + printf ("variable \"%s\"", get_string()); + get_string(); + if (!match_byte(1) && !match_byte(2)) + match_byte_assert(3); + match_byte (0); + match_byte (0); + match_byte (0); + match_byte (0); + } + else if (match_byte(0x31)) + { + if (match_u32 (1)) + { + printf("(footnote %d) ", get_u32()); + match_byte_assert (0); + match_byte_assert (0); + int subn = get_u32 (); + printf ("nested %d bytes", subn); + pos += subn; + } + else + { + match_u32_assert (0); + match_u32_assert (0); + int subn = get_u32 (); + printf ("nested %d bytes", subn); + pos += subn; + } + char *base = get_string(); + int x = get_u32(); + printf ("\"%s\"; %d variables:\n", base, x); + if (match_u32(0)) + { + for (int i = 0; i < x; i++) + { + dump_value (0); + putchar('\n'); + } + } + else + { + for (int i = 0; i < x; i++) + { + int y = get_u32(); + match_u32_assert(0); + for (int j = 0; j <= 0; j++) + printf (" "); + printf("variable %d has %d values:\n", i, y); + for (int j = 0; j < y; j++) + { + if (match_byte(3)) + { + char *a = get_string(); + match_byte_assert(0x58); + char *b = get_string(); + char *c = get_string(); + for (int k = 0; k <= 1; k++) + printf (" "); + printf ("\"%s\", \"%s\", \"%s\"", a, b, c); + match_byte(0); + match_byte(0); + match_byte(0); + match_byte(0); + match_byte(0); + } + else + dump_value (0); + putchar('\n'); + } + } + } + } else - dump_value(0); + { + match_byte_assert (0x58); + char *base = get_string(); + int x = get_u32(); + printf ("\"%s\" with %d variables:\n", base, x); + if (match_u32(0)) + { + for (int i = 0; i < x; i++) + { + dump_value (1); + putchar('\n'); + } + } + else + { + for (int i = 0; i < x; i++) + { + int y = get_u32(); + match_u32_assert(0); + for (int j = 0; j <= 0; j++) + printf (" "); + printf("variable %d has %d values:\n", i, y); + for (int j = 0; j < y; j++) + { + if (match_byte(3)) + { + char *a = get_string(); + match_byte_assert(0x58); + char *b = get_string(); + char *c = get_string(); + for (int k = 0; k <= 1; k++) + printf (" "); + printf ("\"%s\", \"%s\", \"%s\"", a, b, c); + match_byte(0); + match_byte(0); + match_byte(0); + match_byte(0); + match_byte(0); + } + else + dump_value (1); + putchar('\n'); + } + } + } + } putchar('\n'); } } @@ -906,17 +1027,17 @@ main(int argc, char *argv[]) { if (i + 5 <= n && data[i] - && !data[i + 1] + //&& !data[i + 1] && !data[i + 2] && !data[i + 3] - && i + 4 + data[i] <= n - && all_ascii(&data[i + 4], data[i])) + && i + 4 + data[i] + data[i + 1] * 256 <= n + && all_ascii(&data[i + 4], data[i] + data[i + 1] * 256)) { fputs("\n\"", stdout); - fwrite(&data[i + 4], 1, data[i], stdout); + fwrite(&data[i + 4], 1, data[i] + data[i + 1] * 256, stdout); fputs("\" ", stdout); - i += 4 + data[i]; + i += 4 + data[i] + data[i + 1] * 256; } else if (i + 12 <= n && data[i + 1] == 40 diff --git a/notes b/notes index 6d716e9b70..b244a47f5b 100644 --- a/notes +++ b/notes @@ -1492,7 +1492,16 @@ i2 i0 01 31 i2 00 00 i1 00 00 i6 00 00 00 00 58 58 F40.0(62) i3 i0 01 58 F40.0(15) i4 i0 01 58 F40.0(15) +web/76e9b53e9f775fb690a88919ccdbb03c/00000000743_lightWarningData.bin (Warnings): +i1 + +i0 i0 00 31 i0 i0 i72: (i66: ("" 31 "Fewer than two groups for depvar ^1 in split [:^1=^2,:]2.") 58 58) "There are fewer than two groups for dependent variable ^1 in split file [%1 = %2:, ^1 = ^2:]2. No statistics are computed." i2 00 00 00 00 + 05 58 "soi_tot" 00 00 00 00 02 i2 00 00 00 00 05 58 "erotica_virgin" +00 00 00 00 i2 00 02 58 F40.1(1.0) + +"erotica_virgin" +"EROTICA VIRGIN" 02 Data: tdump21 (germano/Crosstabs.pdf)