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
}
#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)
{
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
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
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[])
{
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);
match_byte_assert(1);
match_byte_assert(0);
+ exit (0);
+
parse_heading("PMPivotItemTree");
match_byte_assert(0);
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;