Refine knowledge of data intro.
authorBen Pfaff <blp@cs.stanford.edu>
Fri, 7 Nov 2014 16:46:17 +0000 (08:46 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Fri, 7 Nov 2014 16:46:17 +0000 (08:46 -0800)
dump.c

diff --git a/dump.c b/dump.c
index ee9794a5012fa4150bd406887827b250bbc18879..3be7d5a9d6e94391b9adffb1d3cd062bdc4cac91 100644 (file)
--- a/dump.c
+++ b/dump.c
@@ -375,23 +375,37 @@ dump_dims(void)
     }
 }
 
+static int
+compare_int(const void *a_, const void *b_)
+{
+  const int *a = a_;
+  const int *b = b_;
+  return *a < *b ? -1 : *a > *b;
+}
+
 static void
 dump_data(void)
 {
-#if 1
-  int a[16];
-  for (int i = 0; i < 3 + n_dims; i++)
-    a[i] = get_u32();
-  printf ("data intro:");
-  for (int i = 0; i < 3 + n_dims; i++)
-    printf(" %d", a[i]);
-  printf("\n");
-#else
-  fprintf (stderr,"data intro (%d dims):", n_dims);
-  for (int i = 0; i < 3+n_dims; i++)
-    fprintf (stderr," %d", get_u32());
-  fprintf(stderr,"\n");
-#endif
+  /* The first three numbers add to the number of dimensions. */
+  int t = get_u32();
+  t += get_u32();
+  match_u32_assert(n_dims - t);
+
+  /* The next n_dims numbers are a permutation of the dimension numbers. */
+  int a[n_dims], b[n_dims];
+  for (int i = 0; i < n_dims; i++)
+    a[i] = b[i] = get_u32();
+  qsort(b, n_dims, sizeof *b, compare_int);
+  for (int i = 0; i < n_dims; i++)
+    if (b[i] != i)
+      {
+        fprintf(stderr, "bad dimension permutation:");
+        for (int i = 0; i < n_dims; i++)
+          fprintf(stderr, " %d", a[i]);
+        putc('\n', stderr);
+        exit(1);
+      }
+
   int x = get_u32();
   printf ("%d data values, starting at %08x\n", x, pos);
   for (int i = 0; i < x; i++)