Fix a few more (strings can be longer than 255 bytes!).
authorBen Pfaff <blp@cs.stanford.edu>
Sun, 2 Nov 2014 05:21:04 +0000 (22:21 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Sun, 2 Nov 2014 05:21:04 +0000 (22:21 -0700)
dump.c
notes

diff --git a/dump.c b/dump.c
index 3ff45737c66d2bc10a9841f1ec7418f2691d2622..14a84720429b9e1a8b54b61440924d6be0b26dbb 100644 (file)
--- a/dump.c
+++ b/dump.c
@@ -127,15 +127,16 @@ match_byte_assert(uint8_t b, const char *where)
 static char *
 get_string(const char *where)
 {
-  if (data[pos + 1] == 0 && data[pos + 2] == 0 && data[pos + 3] == 0
+  if (1
+      /*data[pos + 1] == 0 && data[pos + 2] == 0 && data[pos + 3] == 0*/
       /*&& all_ascii(&data[pos + 4], data[pos])*/)
     {
-      int len = data[pos];
+      int len = data[pos] + data[pos + 1] * 256;
       char *s = malloc(len + 1);
 
       memcpy(s, &data[pos + 4], len);
       s[len] = 0;
-      pos += 4 + data[pos];
+      pos += 4 + len;
       return s;
     }
   else
@@ -808,8 +809,128 @@ dump_data(void)
           printf ("value \"%s\" format %d(%d.%d) var \"%s\" vallab \"%s\"",
                   value, format >> 16, (format >> 8) & 0xff, format & 0xff, var, vallab);
         }
+      else if (match_byte (5))
+        {
+          match_byte_assert (0x58);
+          printf ("variable \"%s\"", get_string());
+          get_string();
+          if (!match_byte(1) && !match_byte(2))
+            match_byte_assert(3);
+          match_byte (0);
+          match_byte (0);
+          match_byte (0);
+          match_byte (0);
+        }
+      else if (match_byte(0x31))
+        {
+          if (match_u32 (1))
+            {
+              printf("(footnote %d) ", get_u32());
+              match_byte_assert (0);
+              match_byte_assert (0);
+              int subn = get_u32 ();
+              printf ("nested %d bytes", subn);
+              pos += subn;
+            }
+          else
+            {
+              match_u32_assert (0);
+              match_u32_assert (0);
+              int subn = get_u32 ();
+              printf ("nested %d bytes", subn);
+              pos += subn;
+            }
+          char *base = get_string();
+          int x = get_u32();
+          printf ("\"%s\"; %d variables:\n", base, x);
+          if (match_u32(0))
+            {
+              for (int i = 0; i < x; i++)
+                {
+                  dump_value (0);
+                  putchar('\n');
+                }
+            }
+          else
+            {
+              for (int i = 0; i < x; i++)
+                {
+                  int y = get_u32();
+                  match_u32_assert(0);
+                  for (int j = 0; j <= 0; j++)
+                    printf ("    ");
+                  printf("variable %d has %d values:\n", i, y);
+                  for (int j = 0; j < y; j++)
+                    {
+                      if (match_byte(3))
+                        {
+                          char *a = get_string();
+                          match_byte_assert(0x58);
+                          char *b = get_string();
+                          char *c = get_string();
+                          for (int k = 0; k <= 1; k++)
+                            printf ("    ");
+                          printf ("\"%s\", \"%s\", \"%s\"", a, b, c);
+                          match_byte(0);
+                          match_byte(0);
+                          match_byte(0);
+                          match_byte(0);
+                          match_byte(0);
+                        }
+                      else
+                        dump_value (0);
+                      putchar('\n');
+                    }
+                }
+            }
+        }
       else
-        dump_value(0);
+        {
+          match_byte_assert (0x58);
+          char *base = get_string();
+          int x = get_u32();
+          printf ("\"%s\" with %d variables:\n", base, x);
+          if (match_u32(0))
+            {
+              for (int i = 0; i < x; i++)
+                {
+                  dump_value (1);
+                  putchar('\n');
+                }
+            }
+          else
+            {
+              for (int i = 0; i < x; i++)
+                {
+                  int y = get_u32();
+                  match_u32_assert(0);
+                  for (int j = 0; j <= 0; j++)
+                    printf ("    ");
+                  printf("variable %d has %d values:\n", i, y);
+                  for (int j = 0; j < y; j++)
+                    {
+                      if (match_byte(3))
+                        {
+                          char *a = get_string();
+                          match_byte_assert(0x58);
+                          char *b = get_string();
+                          char *c = get_string();
+                          for (int k = 0; k <= 1; k++)
+                            printf ("    ");
+                          printf ("\"%s\", \"%s\", \"%s\"", a, b, c);
+                          match_byte(0);
+                          match_byte(0);
+                          match_byte(0);
+                          match_byte(0);
+                          match_byte(0);
+                        }
+                      else
+                        dump_value (1);
+                      putchar('\n');
+                    }
+                }
+            }
+        }
       putchar('\n');
     }
 }
@@ -906,17 +1027,17 @@ main(int argc, char *argv[])
     {
       if (i + 5 <= n
           && data[i]
-          && !data[i + 1]
+          //&& !data[i + 1]
           && !data[i + 2]
           && !data[i + 3]
-          && i + 4 + data[i] <= n
-          && all_ascii(&data[i + 4], data[i]))
+          && i + 4 + data[i] + data[i + 1] * 256 <= n
+          && all_ascii(&data[i + 4], data[i] + data[i + 1] * 256))
         {
           fputs("\n\"", stdout);
-          fwrite(&data[i + 4], 1, data[i], stdout);
+          fwrite(&data[i + 4], 1, data[i] + data[i + 1] * 256, stdout);
           fputs("\" ", stdout);
 
-          i += 4 + data[i];
+          i += 4 + data[i] + data[i + 1] * 256;
         }
       else if (i + 12 <= n
                && data[i + 1] == 40
diff --git a/notes b/notes
index 6d716e9b70c40474a0330c6a8bb4218a502c56fc..b244a47f5b509765f209adf2b07949042d98f932 100644 (file)
--- a/notes
+++ b/notes
@@ -1492,7 +1492,16 @@ i2 i0 01 31 i2 00 00 i1 00 00 i6 00 00 00 00 58 58 F40.0(62)
 i3 i0 01 58 F40.0(15)
 i4 i0 01 58 F40.0(15)
 
+web/76e9b53e9f775fb690a88919ccdbb03c/00000000743_lightWarningData.bin (Warnings):
 
+i1
+
+i0 i0 00 31 i0 i0 i72: (i66: ("" 31 "Fewer than two groups for depvar ^1 in split [:^1=^2,:]2.") 58 58) "There are fewer than two groups for dependent variable ^1 in split file [%1 = %2:, ^1 = ^2:]2. No statistics are computed." i2 00 00 00 00
+    05 58 "soi_tot" 00 00 00 00 02 i2 00 00 00 00 05 58 "erotica_virgin"
+00 00 00 00 i2 00 02 58 F40.1(1.0)
+
+"erotica_virgin" 
+"EROTICA VIRGIN" 02 
 
 
 Data: tdump21 (germano/Crosstabs.pdf)