+ char buf[64];
+ printf ("cell %s%d.%d ",
+ format_name (data[pos + 18], buf),
+ data[pos + 17],
+ data[pos + 16]);
+
+ int len = cell_prefix_len;
+ if (data[pos + 19] == 0)
+ {
+ assert (data[pos + 13] == 5);
+ if (data[pos + 20] == 0)
+ {
+ int count = (data[pos + 22]);
+ printf ("%d %d \"%.*s\"\n",
+ data[pos + 21], data[pos + 22],
+ count, &data[pos + 23]);
+ len = 23 + count;
+ }
+ else if (data[pos + 20] == 1
+ && data[pos + 21] == 0xff
+ && data[pos + 22] == 0xff)
+ {
+ int count = 255;
+ printf ("%d \"%.*s\"\n", count, data[pos + 23],
+ &data[pos + 24]);
+ len = 23 + count;
+ }
+ else if (data[pos + 20] == 1)
+ {
+ int count = (data[pos + 21]);
+ printf ("\"%.*s\"\n",
+ count, &data[pos + 22]);
+ len = 22 + count;
+ }
+ else
+ assert (false);
+ }
+ else if (data[pos + 19] == 128 && data[pos + 20] == 2)
+ {
+ /* pos + 13 is usually 22...53, and it's 3 more than the
+ " xx 80" separator between cells */
+ printf ("xxx%x ", data[pos + 13]);
+ double d = *(double *) &data[pos + 21];
+ len = 29;
+ const union
+ {
+ uint8_t b[8];
+ double d;
+ }
+ sysmis = {.b = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff}};
+ if (d == sysmis.d)
+ printf ("sysmis");
+ else
+ printf ("%f", d);
+
+ if (data[pos + 29] < 0xff
+ && all_utf8((char *) &data[pos + 30], data[pos + 29]))
+ {
+ printf (" \"%.*s\"", (int) data[pos + 29],
+ &data[pos + 30]);
+ len += data[pos + 29] + 1;
+ }
+ else
+ assert (false);
+
+ putchar ('\n');
+ }
+ else if (data[pos + 19] == 128 && data[pos + 20] == 1 &&
+ data[pos + 21] == 0)