spo: learned things
authorBen Pfaff <blp@cs.stanford.edu>
Tue, 31 Dec 2019 20:17:50 +0000 (20:17 +0000)
committerBen Pfaff <blp@cs.stanford.edu>
Tue, 31 Dec 2019 20:17:50 +0000 (20:17 +0000)
dump-float.c
dump-spo.c
spo-notes

index 9e2d4bef319a4a3aa11c1475ab9ee29cb00e12a2..4257ca17cd063bb2f1904b2fefccc5c11c6c86fb 100644 (file)
@@ -9,7 +9,7 @@ main (void)
       uint8_t b[8];
       double d;
     }
-  x = { .b = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xdd, 0x40 } };
+  x = { .b = { 0xfa, 0x3c, 0x00, 0x00, 0x3b, 0x5a, 0x01, 0x00 } };
   printf ("%f\n", x.d);
   return 0;
 }
index f2d33a1449c3475250df54c3c02819aab338e149..ac53ece628894626236a24d2c2d9a91537d33b12 100644 (file)
@@ -265,16 +265,21 @@ get_end(void)
 static void __attribute__((unused))
 hex_dump(FILE *stream, int ofs, int n)
 {
+  int n_ascii = 0;
   for (int i = 0; i < n; i++)
     {
       int c = data[ofs + i];
+      n_ascii += is_ascii(c);
       fprintf(stream, " %02x", c);
     }
-  putc(' ', stream);
-  for (int i = 0; i < n; i++)
+  if (n_ascii >= 3)
     {
-      int c = data[ofs + i];
-      putc(c >= 32 && c < 127 ? c : '.', stream);
+      putc(' ', stream);
+      for (int i = 0; i < n; i++)
+        {
+          int c = data[ofs + i];
+          putc(c >= 32 && c < 127 ? c : '.', stream);
+        }
     }
   putc('\n', stream);
 }
@@ -1258,6 +1263,52 @@ dump_fonts(void)
     }
 }
 
+static const char *
+format_name (int format, char *buf)
+{
+  switch (format)
+    {
+    case 1: return "A";
+    case 2: return "AHEX";
+    case 3: return "COMMA";
+    case 4: return "DOLLAR";
+    case 5: return "F";
+    case 6: return "IB";
+    case 7: return "PIBHEX";
+    case 8: return "P";
+    case 9: return "PIB";
+    case 10: return "PK";
+    case 11: return "RB";
+    case 12: return "RBHEX";
+    case 15: return "Z";
+    case 16: return "N";
+    case 17: return "E";
+    case 20: return "DATE";
+    case 21: return "TIME";
+    case 22: return "DATETIME";
+    case 23: return "ADATE";
+    case 24: return "JDATE";
+    case 25: return "DTIME";
+    case 26: return "WKDAY";
+    case 27: return "MONTH";
+    case 28: return "MOYR";
+    case 29: return "QYR";
+    case 30: return "WKYR";
+    case 31: return "PCT";
+    case 32: return "DOT";
+    case 33: return "CCA";
+    case 34: return "CCB";
+    case 35: return "CCC";
+    case 36: return "CCD";
+    case 37: return "CCE";
+    case 38: return "EDATE";
+    case 39: return "SDATE";
+    case 40: return "MTIME";
+    case 41: return "YMDHMS";
+    default: sprintf(buf, "(%d)", format); return buf;
+    }
+}
+
 int
 main(int argc, char *argv[])
 {
@@ -1336,31 +1387,34 @@ main(int argc, char *argv[])
   for (pos = 2; pos + 50 < n; pos++)
     {
       static const int cell_prefix[] = {
-        0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, -1, 0x80, 0x01, -1, -1,
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+        0x00, 0x03,
+        0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -1,
+        0x80, 0x01, -1, -1, -1, -1,
       };
       size_t cell_prefix_len = sizeof cell_prefix / sizeof *cell_prefix;
       if (match_bytes(pos, cell_prefix, cell_prefix_len))
         {
           if (prev_end != pos)
             {
-              printf ("%04x ", prev_end);
+              //printf ("%04x ", prev_end);
               hex_dump (stdout, prev_end, pos - prev_end);
             }
 
-          printf ("cell %04x %d %d %d %d %d %d ", pos,
-                  data[pos + 13], data[pos + 16], data[pos + 17],
-                  data[pos + 18], data[pos + 19], data[pos + 20]);
+          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 %d \"%.*s\"\n",
-                          data[pos + 20], data[pos + 21], data[pos + 22],
+                  printf ("%d %d \"%.*s\"\n",
+                          data[pos + 21], data[pos + 22],
                           count, &data[pos + 23]);
                   len = 23 + count;
                 }
@@ -1369,14 +1423,14 @@ main(int argc, char *argv[])
                        && data[pos + 22] == 0xff)
                 {
                   int count = 255;
-                  printf ("/ \"%.*s\"\n", count, &data[pos + 24]);
+                  printf ("%d \"%.*s\"\n", count, data[pos + 23],
+                          &data[pos + 24]);
                   len = 23 + count;
                 }
-              else if (data[pos + 20] == 1 )
+              else if (data[pos + 20] == 1)
                 {
                   int count = (data[pos + 21]);
-                  printf ("/ %d %d %d \"%.*s\"\n",
-                          data[pos + 20], data[pos + 21], data[pos + 22],
+                  printf ("\"%.*s\"\n",
                           count, &data[pos + 22]);
                   len = 22 + count;
                 }
@@ -1385,7 +1439,11 @@ main(int argc, char *argv[])
             }
           else if (data[pos + 19] == 128)
             {
-              double d = *(double *) &data[pos + cell_prefix_len - 8];
+              /* pos + 13 is usually 22...53 but also 5 or 69 */
+              /* pos + 20 is 2 most of the time, occasionally 1 */
+              printf ("%d %d ", data[pos + 13], data[pos + 20]);
+              double d = *(double *) &data[pos + 21];
+              len = 29;
               const union
                 {
                   uint8_t b[8];
@@ -1412,7 +1470,7 @@ main(int argc, char *argv[])
         {
           if (prev_end != pos)
             {
-              printf ("%04x ", prev_end);
+              //printf ("%04x ", prev_end);
               hex_dump (stdout, prev_end, pos - prev_end);
             }
 
@@ -1422,6 +1480,87 @@ main(int argc, char *argv[])
           continue;
         }
 
+      static const int record_prefix[] = {
+        0xff, 0xff, 0x00, 0x00,
+      };
+      size_t record_prefix_len = sizeof record_prefix / sizeof *record_prefix;
+      if (match_bytes(pos, record_prefix, record_prefix_len))
+        {
+          if (prev_end != pos)
+            {
+              //printf ("%04x ", prev_end);
+              hex_dump (stdout, prev_end, pos - prev_end);
+            }
+
+          putchar ('\n');
+
+          //printf ("%d ", pos % 4);
+          int len = record_prefix_len;
+          int slen = data[pos + 4] + (data[pos + 5] << 8);
+          if (slen > 2 && slen < 256 && all_utf8((char *) &data[pos + 6], slen))
+            {
+              printf ("%.*s ", slen, &data[pos + 6]);
+              len = slen + 6;
+            }
+          else
+            printf ("notitle ");
+
+          pos += len - 1;
+          prev_end = pos + 1;
+          continue;
+        }
+
+      static const int number_prefix[] = {
+        0x80, 0x02
+      };
+      size_t number_prefix_len = sizeof number_prefix / sizeof *number_prefix;
+      if (match_bytes(pos, number_prefix, number_prefix_len))
+        {
+          if (prev_end != pos)
+            {
+              //printf ("%04x ", prev_end);
+              hex_dump (stdout, prev_end, pos - prev_end);
+            }
+          prev_end = pos;
+
+          double d = *(double *) &data[pos + number_prefix_len];
+          printf ("float%f ", d);
+          pos += 10 - 9;
+          prev_end = pos + 1;
+          continue;
+        }
+
+      static const int string_prefix[] = {
+        0x80, 0x01, 0x02, 0x28, 0x05, 0x00, 0x01
+      };
+      size_t string_prefix_len = sizeof string_prefix / sizeof *string_prefix;
+      if (match_bytes(pos, string_prefix, string_prefix_len) && data[pos + string_prefix_len] != 255)
+        {
+          if (prev_end != pos)
+            {
+              //printf ("%04x ", prev_end);
+              hex_dump (stdout, prev_end, pos - prev_end);
+            }
+          prev_end = pos;
+
+          printf ("\nstring %.*s\n", (int) data[pos + 7], &data[pos + 8]);
+        }
+      if (match_bytes(pos, string_prefix, string_prefix_len) && data[pos + string_prefix_len] == 255)
+        {
+          if (prev_end != pos)
+            {
+              //printf ("%04x ", prev_end);
+              hex_dump (stdout, prev_end, pos - prev_end);
+            }
+          prev_end = pos;
+
+          int len = data[pos + 8] + (data[pos + 9] << 8);
+          printf ("\nlongstring %.*s\n", len, &data[pos + 10]);
+        }
+
+      
+
+#if 0
       static const int heading_prefix[] = {
         -1, 0x00, 0x00, 0x00, 0x50, 0x80, 0x00, 0x52, 0x80, 0x00, -1, 0x00,
         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00,
@@ -1433,7 +1572,7 @@ main(int argc, char *argv[])
         {
           if (prev_end != pos)
             {
-              printf ("%04x ", prev_end);
+              //printf ("%04x ", prev_end);
               hex_dump (stdout, prev_end, pos - prev_end);
             }
 
@@ -1457,7 +1596,7 @@ main(int argc, char *argv[])
         {
           if (prev_end != pos)
             {
-              printf ("%04x", prev_end);
+              //printf ("%04x", prev_end);
               hex_dump (stdout, prev_end, pos - prev_end);
             }
 
@@ -1485,7 +1624,7 @@ main(int argc, char *argv[])
         {
           if (prev_end != pos)
             {
-              printf ("%04x", prev_end);
+              //printf ("%04x", prev_end);
               hex_dump (stdout, prev_end, pos - prev_end);
             }
 
@@ -1494,6 +1633,7 @@ main(int argc, char *argv[])
           prev_end = pos + 1;
           continue;
         }
+#endif
 
       static const int dim_prefix[] = {
         0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, -1,
@@ -1505,7 +1645,7 @@ main(int argc, char *argv[])
         {
           if (prev_end != pos)
             {
-              printf ("%04x", prev_end);
+              //printf ("%04x", prev_end);
               hex_dump (stdout, prev_end, pos - prev_end);
             }
 
@@ -1525,7 +1665,7 @@ main(int argc, char *argv[])
         {
           if (prev_end != pos)
             {
-              printf ("%04x", prev_end);
+              //printf ("%04x", prev_end);
               hex_dump (stdout, prev_end, pos - prev_end);
             }
 
@@ -1571,10 +1711,11 @@ main(int argc, char *argv[])
       unsigned real_start = start - length_bytes;
       if (prev_end != real_start)
         {
-          printf ("%04x ", prev_end);
+          //printf ("%04x ", prev_end);
           hex_dump (stdout, prev_end, real_start - prev_end);
         }
-      printf ("%04x \"%.*s\"\n", real_start,
+      //printf ("%04x ", real_start);
+      printf ("\"%.*s\"\n", 
               (int) end - start, (char *) &data[start]);
       prev_end = end;
       pos = end - 1;
index 32ceb72430af74cb1a48e0474c0e8d5681eae9f2..b8099132f93d82235f1335a79a0a921974691310 100644 (file)
--- a/spo-notes
+++ b/spo-notes
@@ -7,6 +7,58 @@ The Nav* strings only appear once per file, as:
 ffff 0000 xxyy string
 Sometimes there is zero spacing between these.
 
+File begins with:
+       (00 | 0[1234] i0)
+       "SPSS Output Document"
+       (i0? | i1 63) ffff 0000
+       "NavHead"     # or any other "Nav*"
+       02 int32[x] int32[y] i24 int32[z] int32[w] int32[v]
+       (i0 | i1 | i2 | i3 | i4)
+       (i0| i1 | i2 | i3)
+       ffff 0000
+       "DspSimpleText"
+       00 (i0 (i0 | i1) 00)? ffff 0000
+       ("IndexedCollection" | "DspString")
+and then with the IndexedCollection case:
+       00*14 ffff 0000
+and the DspString case:
+       01 02 28 (00|05) 00 (00|01)
+       often followed by a string
+
+The start of the file might be a version number
+
+x and y are either 0 or 2-3 byte values, e.g. 0x670b or 0x3b989.
+z is a 2-3 byte negative value, e.g. 0xffff8997
+w is a 2-byte value or 0
+v is a 2-byte negative value or 0
+
+
+
+rtf:
+
+       "Factor Analysis"
+       01 01
+       table 1
+       00 00 00 f9 00 00 00
+       "\rtf..."
+       00 18 00 00 00 00 00 00 00 de ff ff ff 18 00 00 00 00 00 00 00 28 00 00 00 28 00 00 00 18 04 00 00 ae 73 01 00 00 00 00 00 00 34 21 00 00 f8 2a 00 00 01 00 07 00 01 00 f6 04 00 00 f6 04 00 00 f6 04 00 00 f6 04 00 00 00 00 f0 00 00 00 00 00 01 00
+       "(Continued)"
+
+
+rtf2:
+
+       "Factor Analysis"
+       01 01
+       table 1
+       00 00 00 da 00 00 00
+       "\rtf..."
+       00 ffff 0000
+
+rtf3:
+
+       ...
+       00 1f 80 02 00 00 00 00 00 00 00 00 18 00 00 00 00 00 00 00 06 02 00 00 28 fd ff ff 02 00 00 00 01 00 00
+
    1456  01 00 00 00 00 00 00 00 03 80 00 00 00 00 00 00-00 00 00 00 05 80 01 02 28 05 00 01    03 4c 6f 67-               07 80 00 02 00 00........................(....Log......
       3  01 00 00 00 01 00 00 00 03 80 00 00 00 00 00 00-00 00 00 00 05 80 01 02 28 05 00 01    03 4c 6f 67-               07 80 00 02 00 00........................(....Log......
      13     00 00 00 00 00 00 00 03 80 00 00 00 00 00 00 00-00 00 00 05 80 01 02 28 05 00 00 00 08 53 50 53-53 20 4c 6f 67 07.......................(.....SPSS Log.
@@ -14,292 +66,98 @@ Sometimes there is zero spacing between these.
      13  01 00 00 00 00 00 00 00 03 80 00 00 00 00 00 00-00 00 00 00 05 80 01 02 28 05 00 01    08 53 50 53-53 20 4c 6f 67 07........................(....SPSS Log.
 notea.spo/Contents
 
-00000000  02 00 00 00 00 
-                        14 53 50  53 53 20 4f 75 74 70 75  |......SPSS Outpu|
-00000010  74 20 44 6f 63 75 6d 65  6e 74 
-                                        00 00 00 00 ff ff  |t Document......|
-00000020  00 00 
-               07 00 4e 61 76 48  65 61 64 02 
-                                              00 00 00 00  |....NavHead.....|
-00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000040  00 00 00 00 01 00 00 00  
-                                  00 00 00 00 ff ff 00 00  |................|
-00000050  0d 00 44 73 70 53 69 6d  70 6c 65 54 65 78 74 
-                                                       00  |..DspSimpleText.|
-00000060  00 00 00 00 00 
-                        00 00 00  00 ff ff 00 00 
-                                                 09 00 44  |...............D|
-00000070  73 70 53 74 72 69 6e 67  
-                                  01 02 28 05 00 01 
-                                                    0b 46  |spString..(....F|
-00000090  4e 61 76 54 72 65 65 56  69 65 77 49 74 65 6d 
-                                                       00  |NavTreeViewItem.|
-000000a0  00 00 00 00 02 00 01 00  00 00 00 00 00 00 00 00  |................|
-000000b0  01 00 00 00 00 00 
-                           0b 46  72 65 71 75 65 6e 63 69  |.......Frequenci|
-000000c0  65 73 
-               00 00 00 18 00 00  00 d8 ff ff ff de ff ff  |es..............|
-000000d0  ff 18 00 00 00 d8 ff ff  ff 28 00 00 00 28 00 00  |.........(...(..|
-000000e0  00 18 04 00 00 46 1e 00  00 00 00 35 e8 00 34 21  |.....F.....5..4!|
-000000f0  00 00 f8 2a 00 00 01 00  0f 00 01 00 f6 04 00 00  |...*............|
-00000100  f6 04 00 00 f6 04 00 00  f6 04 00 00 00 00 f0 00  |................|
-00000110  00 00 69 32 01 00 
-                           0b 28  43 6f 6e 74 69 6e 75 65  |..i2...(Continue|
-00000120  64 29 
-               00 
-                  b4 00 00 00 7b  5c 72 74 66 31 5c 61 6e  |d).....{\rtf1\an|
-00000130  73 69 5c 61 6e 73 69 63  70 67 31 32 35 32 5c 64  |si\ansicpg1252\d|
-00000140  65 66 66 30 5c 64 65 66  6c 61 6e 67 31 30 33 33  |eff0\deflang1033|
-00000150  7b 5c 66 6f 6e 74 74 62  6c 7b 5c 66 30 5c 66 73  |{\fonttbl{\f0\fs|
-00000160  77 69 73 73 5c 66 70 72  71 32 5c 66 63 68 61 72  |wiss\fprq2\fchar|
-00000170  73 65 74 30 20 41 72 69  61 6c 3b 7d 7d 0d 0a 7b  |set0 Arial;}}..{|
-00000180  5c 63 6f 6c 6f 72 74 62  6c 20 3b 5c 72 65 64 30  |\colortbl ;\red0|
-00000190  5c 67 72 65 65 6e 30 5c  62 6c 75 65 30 3b 7d 0d  |\green0\blue0;}.|
-000001a0  0a 5c 76 69 65 77 6b 69  6e 64 34 5c 75 63 31 5c  |.\viewkind4\uc1\|
-000001b0  70 61 72 64 5c 71 63 5c  63 66 31 5c 66 30 5c 66  |pard\qc\cf1\f0\f|
-000001c0  73 32 30 20 26 5b 50 61  67 65 54 69 74 6c 65 5d  |s20 &[PageTitle]|
-000001d0  0d 0a 5c 70 61 72 20 7d  0d 0a 
-                                        
-                                        00 00
-                                              
-                                              b4 00 00 00  |..\par }........|
-000001e0  7b 5c 72 74 66 31 5c 61  6e 73 69 5c 61 6e 73 69  |{\rtf1\ansi\ansi|
-000001f0  63 70 67 31 32 35 32 5c  64 65 66 66 30 5c 64 65  |cpg1252\deff0\de|
-00000200  66 6c 61 6e 67 31 30 33  33 7b 5c 66 6f 6e 74 74  |flang1033{\fontt|
-00000210  62 6c 7b 5c 66 30 5c 66  73 77 69 73 73 5c 66 70  |bl{\f0\fswiss\fp|
-00000220  72 71 32 5c 66 63 68 61  72 73 65 74 30 20 41 72  |rq2\fcharset0 Ar|
-00000230  69 61 6c 3b 7d 7d 0d 0a  7b 5c 63 6f 6c 6f 72 74  |ial;}}..{\colort|
-00000240  62 6c 20 3b 5c 72 65 64  30 5c 67 72 65 65 6e 30  |bl ;\red0\green0|
-00000250  5c 62 6c 75 65 30 3b 7d  0d 0a 5c 76 69 65 77 6b  |\blue0;}..\viewk|
-00000260  69 6e 64 34 5c 75 63 31  5c 70 61 72 64 5c 71 72  |ind4\uc1\pard\qr|
-00000270  5c 63 66 31 5c 66 30 5c  66 73 32 30 20 50 61 67  |\cf1\f0\fs20 Pag|
-00000280  65 20 26 5b 50 61 67 65  5d 0d 0a 5c 70 61 72 20  |e &[Page]..\par |
-00000290  7d 0d 0a 
-                  
-                  00 00 14 00 ff  ff 00 00 
-                                           
-                                           07 00 4e 61 76  |}............Nav|
-000002a0  52 6f 6f 74 
-                     
-                     02 00 00 00  00 00 00 00 00 00 00 00  |Root............|
-000002b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-000002c0  00 00 00 00 00 03 80 00  00 00 00 00 00 00 00 00  |................|
-000002d0  00 05 80 01 02 28 00 00  01 
-                                     
-                                     06 4f 75 74 70 75 74  |.....(....Output|
-000002e0  07 80 00 00 00 00 00 0a  00 01 00 00 00 00 00 00  |................|
-000002f0  00 00 00 01 00 00 00 
-                              00  00 00 00 ff ff 00 00 
-                                                       06  |................|
-00000300  00 4e 61 76 4c 6f 67 
-                              02  00 00 00 00 00 00 00 00  |.NavLog.........|
-00000310  18 00 00 00 d8 ff ff ff  b3 02 00 00 45 f9 ff ff  |............E...|
-00000320  01 00 00 00 00 00 00 00  03 80 00 00 00 00 00 00  |................|
-00000330  00 00 00 00 05 80 01 02  28 05 00 01 
-                                              
-                                              03 4c 6f 67  |........(....Log|
-00000340  07 80 00 02 00 00 00 
-                              0f  00 01 00 ff ff 00 00 
-                                                       0a  |................|
-00000350  00 4e 61 76 4f 6c 65 49  74 65 6d 
-                                           
-                                           00 01 00 00 01  |.NavOleItem.....|
-00000360  00 00 00 01 00 00 00 00  00 01 00 00 00 00 00 00  |................|
-00000370  00 00 00 00 01 00 00 00  00 00 00 01 01 f3 ff ff  |................|
-00000380  ff 00 00 00 00 00 00 00  00 00 00 00 00 90 01 00  |................|
-00000390  00 00 00 00 00 00 00 00  
-                                  
-                                  31 43 6f 75 72 69 65 72  |........1Courier|
-000003a0  20 4e 65 77 00 72 00 20  00 4e 00 65 00 77 00 00  | New.r. .N.e.w..|
-000003b0  00 00 00 00 00 00 00 00  00 50 00 00 00 00 00 00  |.........P......|
-000003c0  00 00 00 00 00 01 00 00  00 
-                                     df 14 00 00 7b 5c 72  |.............{\r|
-000003d0  74 66 31 5c 61 6e 73 69  5c 61 6e 73 69 63 70 67  |tf1\ansi\ansicpg|
-000003e0  31 32 35 32 5c 64 65 66  66 30 5c 64 65 66 6c 61  |1252\deff0\defla|
-000003f0  6e 67 31 30 33 33 7b 5c  66 6f 6e 74 74 62 6c 7b  |ng1033{\fonttbl{|
-00000400  5c 66 30 5c 66 6d 6f 64  65 72 6e 5c 66 70 72 71  |\f0\fmodern\fprq|
-00000410  31 5c 66 63 68 61 72 73  65 74 30 20 43 6f 75 72  |1\fcharset0 Cour|
-...
-000018a0  20 0d 0a 5c 70 61 72 20  7d 0d 0a 
-                                           
-                                           00 00 0e 80 02  | ..\par }.......|
-000018b0  00 00 00 00 00 00 00 00  18 00 00 00 23 f9 ff ff  |............#...|
-000018c0  b3 02 00 00 53 f1 ff ff  01 00 00 00 00 00 00 00  |....S...........|
-000018d0  03 80 00 00 00 00 00 00  00 00 00 00 05 80 01 02  |................|
-000018e0  28 05 00 01 
-                     
-                     03 4c 6f 67
-                                  
-                                  07 80 00 02 00 00 00 15  |(....Log........|
-000018f0  00 01 00 13 80 00 01 00  00 02 00 00 00 01 00 00  |................|
-00001900  00 00 00 01 00 00 00 00  00 00 00 00 00 00 01 00  |................|
-00001910  00 00 00 00 00 01 01 0a  00 00 00 00 00 00 00 00  |................|
-00001920  00 00 00 00 00 00 00 90  01 00 00 00 00 00 00 00  |................|
-00001930  00 00 
-               
-               31 43 6f 75 72 69  65 72 20 4e 65 77 00 72  |..1Courier New.r|
-00001940  00 20 00 4e 00 65 00 77  00 00 00 00 00 00 00 00  |. .N.e.w........|
-00001950  00 00 00 50 00 00 00 00  00 00 00 00 00 00 00 01  |...P............|
-00001960  00 00 00 
-                  
-                  69 2b 00 00 7b  5c 72 74 66 31 5c 61 6e  |...i+..{\rtf1\an|
-00001970  73 69 5c 61 6e 73 69 63  70 67 31 32 35 32 5c 64  |si\ansicpg1252\d|
-00001980  65 66 66 30 5c 64 65 66  6c 61 6e 67 31 30 33 33  |eff0\deflang1033|
-00001990  7b 5c 66 6f 6e 74 74 62  6c 7b 5c 66 30 5c 66 6d  |{\fonttbl{\f0\fm|
-000019a0  6f 64 65 72 6e 5c 66 70  72 71 31 5c 66 63 68 61  |odern\fprq1\fcha|
-000019b0  72 73 65 74 30 20 43 6f  75 72 69 65 72 20 4e 65  |rset0 Courier Ne|
-...
-000044c0  63 75 74 65 2e 0d 0a 5c  70 61 72 20 7d 0d 0a 
-                                                       
-                                                       00  |cute...\par }...|
-000044d0  00 0e 80 02 00 00 00 00  00 00 00 00 18 00 00 00  |................|
-000044e0  31 f1 ff ff b3 02 00 00  ee f0 ff ff 01 00 00 00  |1...............|
-000044f0  00 00 00 00 03 80 00 00  00 00 00 00 00 00 00 00  |................|
-00004500  05 80 01 02 28 05 00 01  
-                                  
-                                  03 4c 6f 67 07 80 00 02  |....(....Log....|
-00004510  00 00 00 1a 00 01 00 00  00 00 00 00 00 00 00 01  |................|
-00004520  00 00 00 00 00 00 01 01  0a 00 00 00 00 00 00 00  |................|
-00004530  00 00 00 00 00 00 00 00  90 01 00 00 00 00 00 00  |................|
-00004540  00 00 00 
-                  
-                  31 43 6f 75 72  69 65 72 20 4e 65 77 00  |...1Courier New.|
-00004550  72 00 20 00 4e 00 65 00  77 00 00 00 00 00 00 00  |r. .N.e.w.......|
-00004560  00 00 00 00 50 00 00 00  00 00 00 00 00 00 00 00  |....P...........|
-00004570  01 00 00 00 
-                     
-                     3c 01 00 00  7b 5c 72 74 66 31 5c 61  |....<...{\rtf1\a|
-...
-000046b0  7d 0d 0a 
-                  
-                  00 00 02 00 ff  ff 00 00 
-                                           
-                                           08 00 4e 61 76  |}............Nav|
-000046c0  54 69 74 6c 65 
-                        
-                        02 00 00  00 00 00 00 00 00 18 00  |Title...........|
-000046d0  00 00 cc f0 ff ff 00 04  00 00 b5 f0 ff ff 02 00  |................|
-000046e0  00 00 01 00 00 00 03 80  00 00 00 00 00 00 00 00  |................|
-000046f0  00 00 05 80 01 02 28 00  00 01 
-                                        
-                                        05 54 69 74 6c 65  |......(....Title|
-00004700  07 80 00 08 00 00 00 1f  00 01 00 00 00 00 00 00  |................|
-00004710  00 00 00 01 00 00 00 00  00 
-                                     
-                                     0b 46 72 65 71 75 65  |..........Freque|
-00004720  6e 63 69 65 73 
-                        
-                        01 01 ed  ff ff ff 00 00 00 00 00  |ncies...........|
-00004730  00 00 00 00 00 00 00 bc  02 00 00 00 00 00 00 00  |................|
-00004740  00 00 
-               
-               22 41 72 69 61 6c  00 61 00 6c 00 00 00 00  |.."Arial.a.l....|
-00004750  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00004760  00 00 00 50 00 
-                        
-                        00 00 00  00 00 00 00 00 00 00 01  |...P............|
-00004770  00 00 00 
-                  
-                  b2 00 00 00 7b  5c 72 74 66 31 5c 61 6e  |.......{\rtf1\an|
-00004780  73 69 5c 61 6e 73 69 63  70 67 31 32 35 32 5c 64  |si\ansicpg1252\d|
-00004790  65 66 66 30 5c 64 65 66  6c 61 6e 67 31 30 33 33  |eff0\deflang1033|
-000047a0  7b 5c 66 6f 6e 74 74 62  6c 7b 5c 66 30 5c 66 73  |{\fonttbl{\f0\fs|
-000047b0  77 69 73 73 5c 66 70 72  71 32 5c 66 63 68 61 72  |wiss\fprq2\fchar|
-000047c0  73 65 74 30 20 41 72 69  61 6c 3b 7d 7d 0d 0a 7b  |set0 Arial;}}..{|
-000047d0  5c 63 6f 6c 6f 72 74 62  6c 20 3b 5c 72 65 64 30  |\colortbl ;\red0|
-000047e0  5c 67 72 65 65 6e 30 5c  62 6c 75 65 30 3b 7d 0d  |\green0\blue0;}.|
-000047f0  0a 5c 76 69 65 77 6b 69  6e 64 34 5c 75 63 31 5c  |.\viewkind4\uc1\|
-00004800  70 61 72 64 5c 63 66 31  5c 62 5c 66 30 5c 66 73  |pard\cf1\b\f0\fs|
-00004810  32 38 20 46 72 65 71 75  65 6e 63 69 65 73 0d 0a  |28 Frequencies..|
-00004820  5c 70 61 72 20 7d 0d 0a  
-                                  
-                                  00 00 ff ff 00 00 
-                                                    
-                                                    07 00  |\par }..........|
-00004830  4e 61 76 4e 6f 74 65 
-                              
-                              02  00 00 00 00 00 00 00 00  |NavNote.........|
-00004840  18 00 00 00 d8 ff ff ff  00 02 00 00 59 fe ff ff  |............Y...|
-00004850  02 00 00 00 01 00 00 00  03 80 00 00 00 00 00 00  |................|
-00004860  00 00 00 00 05 80 01 02  28 05 00 01 
-                                              
-                                              05 4e 6f 74  |........(....Not|
-00004870  65 73 
-               
-               07 80 00 07 00 00  00 24 00 01 00 00 00 01  |es.......$......|
-00004880  00 00 00 00 00 01 00 00  00 00 00 
-                                           
-                                           0b 46 72 65 71  |............Freq|
-00004890  75 65 6e 63 69 65 73 
-                              01  ff ff 00 00 
-                                              11 00 50 54  |uencies.......PT|
-000048a0  50 69 76 6f 74 43 6f 6e  74 72 6f 6c 6c 65 72 
-                                                       
-                                                       02  |PivotController.|
-000048b0  29 20 69 31 38 28 66 38  64 00 00 00 64 00 00 00  |) i18(f8d...d...|
-000048c0  64 00 00 00 64 00 00 00  ff ff 00 00 
-                                              0b 00 50 56  |d...d.........PV|
-000048d0  50 69 76 6f 74 56 69 65  77 
-                                     04 00 00 00 00 ff ff  |PivotView.......|
-000048e0  00 00 
-               0c 00 50 4d 50 69  76 6f 74 4d 6f 64 65 6c  |....PMPivotModel|
-000048f0  03 ff ff 00 00 
-                        15 00 4e  44 69 6d 65 6e 73 69 6f  |.......NDimensio|
-00004900  6e 61 6c 5f 5f 44 73 70  43 65 6c 6c 
-                                              00 01 00 00  |nal__DspCell....|
-00004910  00 ff ff 00 00 
-                        11 00 49  6e 64 65 78 65 64 43 6f  |.......IndexedCo|
-00004920  6c 6c 65 63 74 69 6f 6e  
-                                  00 0d 00 00 00 01 00 ff  |llection........|
-00004930  ff 00 00 
-                  07 00 44 73 70  43 65 6c 6c 
-                                              00 03 80 00  |.....DspCell....|
-00004940  00 00 00 00 00 00 00 00  00 05 80 01 02 28 05 00  |.............(..|
-00004950  01 
-            
-            12 32 38 20 53 65 70  20 30 37 20 31 33 3a 32  |..28 Sep 07 13:2|
-00004960  38 3a 34 32 32 
-                        
-                        80 00 03  80 00 00 00 00 00 00 00  |8:422...........|
-00004970  00 00 00 05 80 01 02 28  05 00 01 01 20 00 00 32  |.......(.... ..2|
-00004980  80 00 03 80 00 00 00 00  00 00 00 00 00 00 05 80  |................|
-00004990  01 02 28 05 00 01 
-                           
-                           06 3c  6e 6f 6e 65 3e 
-                                                 32 80 00  |..(....<none>2..|
-000049a0  03 80 00 00 00 00 00 00  00 00 00 00 05 80 01 02  |................|
-000049b0  28 05 00 
-                  01 06 3c 6e 6f  6e 65 3e 
-                                           32 80 00 03 80  |(....<none>2....|
-000049c0  00 00 00 00 00 00 00 00  00 00 05 80 01 02 28 05  |..............(.|
-000049d0  00 01 
-               06 3c 6e 6f 6e 65  3e 
-                                     32 80 00 03 80 00 00  |...<none>2......|
-000049e0  00 00 00 00 00 00 00 00  ff ff 00 00 
-                                              09 00 44 73  |..............Ds|
-000049f0  70 4e 75 6d 62 65 72 
-                              01  00 28 05 80 02 00 00 00  |pNumber..(......|
-00004a00  00 00 80 52 40 02 37 34  32 80 00 03 80 00 00 00  |...R@.742.......|
-00004a10  00 00 00 00 00 00 00 05  80 01 02 28 05 00 01 33  |...........(...3|
-00004a20  55 73 65 72 2d 64 65 66  69 6e 65 64 20 6d 69 73  |User-defined mis|
-
-----------------------------------------------------------------------
-
-Output1.spo:
-
-1f33  28 80 00 03 80 00 00 00 00 00 00 00 00 00 00 3d 80 F40.0(01 00 28) 05 80 02 30000.0
-@
-1f52 "30000"
-
-2103  28 80 00 03 80 00 00 00 00 00 00 00 00 00 00 3d 80 F40.1(01 01 28) 05 80 02 66.7
-2122 "66.7"
-
-each cell has the form (where [01] is the number of decimals):
-28 80 00 03 80 00 00 00 00 00 00 00 00 00 00 3d 80 01 0[01] 28 05 80 02 then a double then the string
-each column(?) is preceded by 
-11 80 00 0[345] 00 00 00 01 00
-
-starting around 1c85
-
-16#2134 == 8500
-16#2af8 == 11000
+
+
+PVPrintManager:
+
+       "PVPrintManager"
+       02 byte[x] 00 i2 (i0|i3) i1 00*7
+       sometimes 0000 ffff
+where x is between 0a and 2e
+
+
+
+regress, notea
+--------------
+
+ffff 0000 "NavPivot"
+       02 fa 3c 00 00 3b 5a 01 00
+       18 00 00 00 b4 35 ff ff 7f
+       02 00 00 13 28 ff ff
+       02 00 00 00
+       01 00 00 00
+
+       notea:
+       02 00 00 00 00 00 00 00 00
+       18 00 00 00 93 f0 ff ff dc
+       03 00 00 cd ef ff ff
+       02 00 00 00
+       01 00 00
+       missing terminator!
+
+ffff 0000 "DspSimpleText"
+       00*10
+
+ffff 0000 "DspString"
+       01 02 28 05 00 01 "Text Output"
+
+ffff 0000 "NavOleItem"
+       00 01 00 00
+       07 00 00 00
+       01 00 00 00 00 00
+       01 00 00 00 00 00 00 00 00 00 00
+       01 00 00 00 00 00
+       "Regression"
+       01
+
+       notea:
+       00 01 00 00
+       01 00 00 00
+       01 00 00 00 00 00
+       01 00 00 00 00 00 00 00 00 00 00
+       01 00 00 00 00 00
+       00 01 01 f3 ff
+
+ffff 0000 "PTPivotController"
+       02 67 02 00 00 a1 0d 00 00
+       64 00 00 00
+       64 00 00 00
+       64 00 00 00
+       64 00 00 00
+
+       notea:
+       02 29 20 69 31 38 28 66 38
+       64 00 00 00
+       64 00 00 00
+       64 00 00 00
+       64 00 00 00
+
+ffff 0000 "PVPivotView"
+       04 00 00 00 00
+
+ffff 0000 "PMPivotModel"
+       03
+
+ffff 0000 "NDimensional__DspCell"
+       00 03 00 00 00
+
+ffff 0000 "IndexedCollection"
+       00
+       05 00 00 00
+       01 00 13 80
+       00
+       0b 00 00 00
+       01 00 13 80
+       00
+       02 00 00 00
+       01 00
+
+ffff 0000 "DspCell"
+       00 03 80 00 00 00 00 00 00 00 00 00 00
+
+ffff 0000 "DspNumber"
+
+NavTitle  02 00 00 00 00 00 00 00 00 18 00 00 00 03 .. .. .. 00 04 00 00 .. .. ff ff 02 00 00 00 01 00 00
+
+80 01 02 28 05 00 01 ff
+80 01 02 28 05 00 01