Document datum format.
[pspp] / dump.c
diff --git a/dump.c b/dump.c
index e9a068699e005fba3778c5597181c93d0f8a6d4a..0445597e635aa6673304d1fa734df0cc29371edc 100644 (file)
--- a/dump.c
+++ b/dump.c
@@ -579,10 +579,15 @@ dump_category(FILE *stream, int level, int *indexes, int *n_indexes, int max_ind
   int merge = data[pos];
   if (!match_byte(0))
     match_byte_assert (1);
+
   match_byte_assert (0);
+
   int unindexed = data[pos];
   if (!match_byte(0))
     match_byte_assert (1);
+
+  int x = get_u32 ();
+  pos -= 4;
   if (!match_u32 (0))
     match_u32_assert (2);
 
@@ -604,6 +609,11 @@ dump_category(FILE *stream, int level, int *indexes, int *n_indexes, int max_ind
           fprintf(stderr, "index not -1 but merged\n");
           exit(1);
         }
+      if (x != 2)
+        {
+          fprintf(stderr, "index not -1 but x != 2\n");
+          exit(1);
+        }
       if (n_categories != 0)
         {
           fprintf(stderr, "index not -1 but subcategories\n");
@@ -638,7 +648,7 @@ dump_category(FILE *stream, int level, int *indexes, int *n_indexes, int max_ind
   printf ("</category>\n");
 }
 
-static void
+static int
 dump_dim(int indx)
 {
   int n_categories;
@@ -669,36 +679,60 @@ dump_dim(int indx)
   check_permutation(indexes, n_indexes, "categories");
 
   fprintf (stdout, "</dimension>\n");
+  return n_indexes;
 }
 
 int n_dims;
+static int dim_n_cats[64];
+#define MAX_DIMS (sizeof dim_n_cats / sizeof *dim_n_cats)
+
 static void
 dump_dims(void)
 {
   n_dims = get_u32();
+  assert(n_dims < MAX_DIMS);
   for (int i = 0; i < n_dims; i++)
-    dump_dim (i);
+    dim_n_cats[i] = dump_dim (i);
 }
 
 static void
 dump_data(void)
 {
   /* The first three numbers add to the number of dimensions. */
-  int t = get_u32();
-  t += get_u32();
-  match_u32_assert(n_dims - t);
+  int l = get_u32();
+  int r = get_u32();
+  int c = n_dims - l - r;
+  match_u32_assert(c);
 
   /* The next n_dims numbers are a permutation of the dimension numbers. */
   int a[n_dims];
   for (int i = 0; i < n_dims; i++)
-    a[i] = get_u32();
+    {
+      int dim = get_u32();
+      a[i] = dim;
+
+      const char *name = i < l ? "layer" : i < l + r ? "row" : "column";
+      printf ("<%s dimension=\"%d\"/>\n", name, dim);
+    }
   check_permutation(a, n_dims, "dimensions");
 
   int x = get_u32();
   printf ("<data>\n");
   for (int i = 0; i < x; i++)
     {
-      printf ("    <datum index=\"%d\">\n", get_u32());
+      unsigned int indx = get_u32();
+      printf ("    <datum index=\"%d\" coords=", indx);
+
+      int coords[MAX_DIMS];
+      for (int i = n_dims; i-- > 0; )
+        {
+          coords[i] = indx % dim_n_cats[i];
+          indx /= dim_n_cats[i];
+        }
+      for (int i = 0; i < n_dims; i++)
+        printf("%c%d", i ? ',' : '"', coords[i]);
+
+      printf ("\">\n");
       match_u32_assert(0);
       if (version == 1)
         match_byte(0);