--- /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 elliptic curves [generated]";
+ print " */";
+ print "";
+ print "#include \"ectab.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("Curve data");
+ print "";
+
+ d_i = 0;
+ name = "";
+}
+
+function putmp(x, d)
+{
+ if (!(x in data)) {
+ print "curve " name ": missing " x >"/dev/stderr";
+ exit 1;
+ }
+ d = data[x];
+ if (!(d in cache)) {
+ n = "c_" 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 "/* --- Curve " name " --- */";
+ delete mp;
+ print "";
+ putmp("p");
+ if (type == "binnorm") putmp("beta");
+ putmp("a");
+ putmp("b");
+ putmp("r");
+ putmp("h");
+ putmp("gx");
+ putmp("gy");
+ print "static ecdata c_" fix(name) " = {";
+ print " FTAG_" toupper(type) ",";
+ print " MP(" mp["p"] "),"
+ if (type == "binnorm")
+ print " MP(" mp["beta"] "),";
+ else
+ print " NOMP,";
+ print " MP(" mp["a"] "),"
+ print " MP(" mp["b"] "),"
+ print " MP(" mp["r"] "),"
+ print " MP(" mp["h"] "),"
+ print " MP(" mp["gx"] "),"
+ print " MP(" mp["gy"] ")"
+ print "};";
+ print "";
+ dname[d_i++] = name;
+ d[name] = name;
+ r[name] = "c_" fix(name);
+ name = "";
+}
+
+/^[ \t]*(#|$)/ { next; }
+
+$1 == "alias" { flush(); dname[d_i++] = $2; d[$2] = $3; next; }
+
+$1 == "curve" { flush(); delete data; name = $2; type = $3; next; }
+
+{ data[$1] = $2; next; }
+
+END {
+ flush();
+ print banner("Main table");
+ print "";
+ print "const ecentry ectab[] = {";
+ for (i = 0; i < d_i; i++) {
+ name = dname[i];
+ rname = d[name];
+ if (!rname in r) {
+ print "curve " 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");
+}