Parse first table in all of 'as-number' (but not 'as-date').
authorBen Pfaff <blp@cs.stanford.edu>
Sat, 27 Jun 2020 06:41:07 +0000 (06:41 +0000)
committerBen Pfaff <blp@cs.stanford.edu>
Sat, 27 Jun 2020 06:41:07 +0000 (06:41 +0000)
dump-spo2.c

index da9e73191703c859d47aeee0cde8cb21ebcce12e..f416bf696210382b4abb676d5f27893b58309265 100644 (file)
@@ -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;