From: Ben Pfaff Date: Sat, 27 Jun 2020 06:41:07 +0000 (+0000) Subject: Parse first table in all of 'as-number' (but not 'as-date'). X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pspp;a=commitdiff_plain;h=d30e5471341fc071b9636162dad5ddb97ae2b96f Parse first table in all of 'as-number' (but not 'as-date'). --- diff --git a/dump-spo2.c b/dump-spo2.c index da9e731917..f416bf6962 100644 --- a/dump-spo2.c +++ b/dump-spo2.c @@ -249,13 +249,27 @@ all_utf8(const char *p_, size_t len) return true; } +static char * +get_string2(void) +{ + int len = data[pos] + data[pos + 1] * 256; + char *s = xmemdup0(&data[pos + 2], len); + pos += 2 + len; + return s; +} + static char * get_string1(void) { int len = data[pos++]; - char *s = xmemdup0(&data[pos], len); - pos += len; - return s; + if (len == 0xff) + return get_string2(); + else + { + char *s = xmemdup0(&data[pos], len); + pos += len; + return s; + } } static void @@ -272,15 +286,6 @@ match_string1_assert(const char *exp, const char *where) } #define match_string1_assert(x) match_string1_assert(x, WHERE) -static char * -get_string2(void) -{ - int len = data[pos] + data[pos + 1] * 256; - char *s = xmemdup0(&data[pos + 2], len); - pos += 2 + len; - return s; -} - static void match_string2_assert(const char *exp, const char *where) { @@ -554,11 +559,12 @@ static void parse_DspNumber(void) { match_byte_assert(1); + printf("DspNumber("); parse_format(); match_byte_assert(0x80); match_byte(2); printf (" %f", get_double()); - printf (" \"%s\"\n", get_string1()); + printf (" \"%s\")\n", get_string1()); } static void @@ -569,19 +575,22 @@ match_DspNumber(void) parse_DspNumber(); } +static void parse_flexible(void); + +static void +parse_DspCell(void) +{ + match_byte_assert(0); + match_DspSimpleText(); + parse_flexible(); /* DspString or DspNumber. */ +} + static void match_DspCell(void) { /* 27 80 */ match_byte_assert(0x27); match_byte_assert(0x80); - match_byte_assert(0); - match_DspSimpleText(); - if (data[pos] == 5) - match_DspString(); - else if (data[pos] == 0x2a) - match_DspNumber(); - else - assert(0); + parse_DspCell(); } static void @@ -615,6 +624,33 @@ match_PMPivotItemTree(void) match_PMModelItemInfo(); } +static void +parse_flexible(void) +{ + if (data[pos] == 0xff && data[pos + 1] == 0xff) + { + match_u16_assert(0xffff); + match_u16_assert(0); + char *heading = get_string2(); + if (!strcmp(heading, "DspCell")) + parse_DspCell(); + else if (!strcmp(heading, "DspNumber")) + parse_DspNumber(); + else if (!strcmp(heading, "DspString")) + parse_DspString(); + else + assert(0); + } + else if (data[pos] == 0x2a && data[pos + 1] == 0x80) + match_DspNumber(); + else if (data[pos] == 0x27 && data[pos + 1] == 0x80) + match_DspCell(); + else if (data[pos] == 0x5 && data[pos + 1] == 0x80) + match_DspString(); + else + assert(0); +} + int main(int argc, char *argv[]) { @@ -801,35 +837,19 @@ main(int argc, char *argv[]) match_byte_assert(1); match_byte_assert(0); - parse_heading("DspCell"); - match_byte_assert(0); - match_DspSimpleText(); - - parse_heading("DspNumber"); - parse_DspNumber(); - - match_DspCell(); - match_DspCell(); - match_DspCell(); - match_DspCell(); - match_DspCell(); - match_DspCell(); - match_DspCell(); - while (data[pos] == 0) - pos++; - - match_DspCell(); - match_DspCell(); - while (data[pos] == 0) - pos++; - match_DspCell(); - match_DspCell(); - match_DspCell(); + while (data[pos] != 1) + { + if (data[pos] == 0) + pos++; + else + parse_flexible(); + } match_byte_assert(1); match_byte_assert(0); puts(get_string1()); - match_u32_assert(0); + if (!match_u32(0)) + match_u32_assert(2); puts(get_string1()); match_byte_assert(0); @@ -840,6 +860,8 @@ main(int argc, char *argv[]) match_byte_assert(1); match_byte_assert(0); + exit (0); + parse_heading("PMPivotItemTree"); match_byte_assert(0); @@ -910,6 +932,11 @@ main(int argc, char *argv[]) pos++; parse_heading("PVViewDimension"); + int i; + for (i = 0; data[pos + i] != 0xff || data[pos + i + 1] != 0xff; i++) + ; + hex_dump(stdout, pos, i); + printf ("%#x: end of successful parse\n", pos); return 0;