Support subgroups of binary fields.
[u/mdw/catacomb] / bin-gentab.awk
diff --git a/bin-gentab.awk b/bin-gentab.awk
new file mode 100755 (executable)
index 0000000..fb8630e
--- /dev/null
@@ -0,0 +1,102 @@
+#! /usr/bin/awk -f
+#
+# $Id: p-gentab.awk 2187 2004-09-04 07:50:08Z mdw $
+
+function banner(name,  s, i)
+{
+  s = "/*----- " name " ";
+  while (length(s) < 75) s = s "-";
+  return (s "*/");
+}
+
+function fix(name)
+{
+  gsub(/[^0-9A-Za-z_]+/, "_", name);
+  return (name);
+}
+
+BEGIN {
+  print "/* -*-c-*-";
+  print " *";
+  print " * Table of binary groups [generated]";
+  print " */";
+  print "";
+  print "#include \"bintab.h\"";
+  print "";
+  print "#define N(x) (sizeof(x)/sizeof(*x))";
+  print "#define MP(x) { x, x + N(x), N(x), 0, MP_CONST, 0 }";
+  print "#define NOMP { 0, 0, 0, 0, 0 }";
+  print "";
+  print banner("Binary group data");
+  print "";
+
+  d_i = 0;
+  name = "";
+}
+
+function putmp(x,  d)
+{
+  if (!(x in data)) {
+    print "group " name ": missing " x >"/dev/stderr";
+    exit 1;
+  }
+  d = data[x];
+  if (!(d in cache)) {
+    n = "p_" fix(name) "_" x;
+    print "static mpw " n "[] = {";
+    system("./mpdump " d);
+    print "};";
+    print "";
+    cache[d] = n;
+  }
+  mp[x] = cache[d];
+}
+
+function flush()
+{
+  if (name == "") return;
+  print "/* --- Group " name " --- */";
+  delete mp;
+  print "";
+  putmp("p");
+  putmp("q");
+  putmp("g");
+  print "static bindata bin_" fix(name) " = {";
+  print "  MP(" mp["p"] "),"
+  print "  MP(" mp["q"] "),"
+  print "  MP(" mp["g"] ")"
+  print "};";
+  print "";
+  dname[d_i++] = name;
+  d[name] = name;
+  r[name] = "bin_" fix(name);
+  name = "";
+}
+
+/^[ \t]*(#|$)/ { next; }
+
+$1 == "alias" { flush(); dname[d_i++] = $2; d[$2] = $3; next; }
+
+$1 == "group" { flush(); delete data; name = $2; next; }
+
+{ data[$1] = $2; next; }
+
+END {
+  flush();
+  print banner("Main table");
+  print "";
+  print "const binentry bintab[] = {";
+  for (i = 0; i < d_i; i++) {
+    name = dname[i];
+    rname = d[name];
+    if (!rname in r) {
+      print "group " rname " not found (alias from " name ")" >"/dev/stderr";
+      exit 1;
+    }
+    print "  { \"" name "\", &" r[rname] " },";
+  }
+  print "  { 0, 0 }";
+  print "};"
+  print "";
+  print banner("That's all, folks");
+}