--- /dev/null
+#! /usr/bin/awk -f
+
+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 prime groups [generated]";
+ print " */";
+ print "";
+ print "#include \"ptab.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("Prime 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 pdata p_" 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] = "p_" 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 pentry ptab[] = {";
+ 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");
+}