Factor out substitution logic. Regularize.
authorBen Pfaff <blp@cs.stanford.edu>
Fri, 7 Nov 2014 06:47:24 +0000 (22:47 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Fri, 7 Nov 2014 06:47:24 +0000 (22:47 -0800)
dump.c

diff --git a/dump.c b/dump.c
index 64b6ca74fc7cb064912235b794b00517aafc1515..44a1158af4cb869857a6ab325c4eac2f4ab8cedd 100644 (file)
--- a/dump.c
+++ b/dump.c
@@ -426,36 +426,47 @@ dump_dims(void)
 }
 
 static void
-dump_data_value(void)
+dump_substs(void (*dump)(int level), int level)
 {
+  dump_value_31();
+
+  char *base = get_string();
+  int x = get_u32();
+  printf ("\"%s\" with %d variables:\n", base, x);
+  for (int i = 0; i < x; i++)
+    {
+      int y = get_u32();
+      if (!y)
+        y = 1;
+      else
+        match_u32_assert(0);
+      for (int j = 0; j <= level; j++)
+        printf ("    ");
+      printf("variable %d has %d values:\n", i, y);
+      for (int j = 0; j < y; j++)
+        {
+          dump (level+1);
+          putchar('\n');
+        }
+    }
+}
+
+static void
+dump_data_value(int level)
+{
+  for (int i = 0; i <= level; i++)
+    printf ("    ");
+
   match_byte(0);
   match_byte(0);
   match_byte(0);
   match_byte(0);
-  if (data[pos] == 2 || data[pos] == 4 || data[pos] == 3 || data[pos] == 1)
+  if (data[pos] == 1 || data[pos] == 2 || data[pos] == 3 || data[pos] == 4)
     dump_value__(0, false);
   else if (data[pos] == 5)
     dump_value (0);
   else
-    {
-      dump_value_31();
-      char *base = get_string();
-      int x = get_u32();
-      printf ("\"%s\"; %d variables:\n", base, x);
-      for (int i = 0; i < x; i++)
-        {
-          int y = get_u32();
-          if (!y)
-            y = 1;
-          else
-            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++)
-            dump_data_value();
-        }
-    }
+    dump_substs (dump_data_value, level + 1);
 }
 
 static void
@@ -481,7 +492,7 @@ dump_data(void)
     {
       printf("%08x, index %d:\n", pos, get_u32());
       match_u32_assert(0);
-      dump_data_value();
+      dump_data_value(0);
       putchar('\n');
     }
 }
@@ -496,34 +507,12 @@ dump_title_value(int level)
   match_byte (0);
   match_byte (0);
   match_byte (0);
-  if (data[pos] == 3 || data[pos] == 2 || data[pos] == 4 || data[pos] == 1)
+  if (data[pos] == 1 || data[pos] == 2 || data[pos] == 3 || data[pos] == 4)
     dump_value(level);
   else if (data[pos] == 5)
     dump_value__(level, true);
   else
-    {
-      dump_value_31();
-
-      char *base = get_string();
-      int x = get_u32();
-      printf ("\"%s\" with %d variables:\n", base, x);
-      for (int i = 0; i < x; i++)
-        {
-          int y = get_u32();
-          if (!y)
-            y = 1;
-          else
-            match_u32_assert(0);
-          for (int j = 0; j <= level; j++)
-            printf ("    ");
-          printf("variable %d has %d values:\n", i, y);
-          for (int j = 0; j < y; j++)
-            {
-              dump_title_value (level+1);
-              putchar('\n');
-            }
-        }
-    }
+    dump_substs(dump_title_value, level + 1);
 }
 
 static void
@@ -538,31 +527,10 @@ dump_footnote_value(int level)
   match_byte (0);
   if (data[pos] == 2 || data[pos] == 4)
     dump_value(level);
-  else if (data[pos] == 5 || data[pos] == 3 || data[pos] == 1)
+  else if (data[pos] == 1 || data[pos] == 3 || data[pos] == 5)
     dump_value__(level, false);
   else
-    {
-      dump_value_31();
-      char *base = get_string();
-      int x = get_u32();
-      printf ("\"%s\"; %d variables:\n", base, x);
-      for (int i = 0; i < x; i++)
-        {
-          int y = get_u32();
-          if (!y)
-            y = 1;
-          else
-            match_u32_assert(0);
-          for (int j = 0; j <= level; j++)
-            printf ("    ");
-          printf("variable %d has %d values:\n", i, y);
-          for (int j = 0; j < y; j++)
-            {
-              dump_footnote_value (level+1);
-              putchar('\n');
-            }
-        }
-    }
+    dump_substs(dump_footnote_value, level + 1);
 }
 
 static void