Release 2.1.2.
[u/mdw/catacomb] / ec-gentab.awk
1 #! /usr/bin/awk -f
2 #
3 # $Id: ec-gentab.awk,v 1.1 2004/04/01 21:28:41 mdw Exp $
4
5 function banner(name, s, i)
6 {
7 s = "/*----- " name " ";
8 while (length(s) < 75) s = s "-";
9 return (s "*/");
10 }
11
12 function fix(name)
13 {
14 gsub(/[^0-9A-Za-z_]+/, "_", name);
15 return (name);
16 }
17
18 BEGIN {
19 print "/* -*-c-*-";
20 print " *";
21 print " * Table of elliptic curves [generated]";
22 print " */";
23 print "";
24 print "#include \"ectab.h\"";
25 print "";
26 print "#define N(x) (sizeof(x)/sizeof(*x))";
27 print "#define MP(x) { x, x + N(x), N(x), 0, MP_CONST, 0 }";
28 print "#define NOMP { 0, 0, 0, 0, 0 }";
29 print "";
30 print banner("Curve data");
31 print "";
32
33 d_i = 0;
34 name = "";
35 }
36
37 function putmp(x, d)
38 {
39 if (!(x in data)) {
40 print "curve " name ": missing " x >"/dev/stderr";
41 exit 1;
42 }
43 d = data[x];
44 if (!(d in cache)) {
45 n = "c_" fix(name) "_" x;
46 print "static mpw " n "[] = {";
47 system("./mpdump " d);
48 print "};";
49 print "";
50 cache[d] = n;
51 }
52 mp[x] = cache[d];
53 }
54
55 function flush()
56 {
57 if (name == "") return;
58 print "/* --- Curve " name " --- */";
59 delete mp;
60 print "";
61 putmp("p");
62 if (type == "binnorm") putmp("beta");
63 putmp("a");
64 putmp("b");
65 putmp("r");
66 putmp("h");
67 putmp("gx");
68 putmp("gy");
69 print "static ecdata c_" fix(name) " = {";
70 print " FTAG_" toupper(type) ",";
71 print " MP(" mp["p"] "),"
72 if (type == "binnorm")
73 print " MP(" mp["beta"] "),";
74 else
75 print " NOMP,";
76 print " MP(" mp["a"] "),"
77 print " MP(" mp["b"] "),"
78 print " MP(" mp["r"] "),"
79 print " MP(" mp["h"] "),"
80 print " MP(" mp["gx"] "),"
81 print " MP(" mp["gy"] ")"
82 print "};";
83 print "";
84 dname[d_i++] = name;
85 d[name] = name;
86 r[name] = "c_" fix(name);
87 name = "";
88 }
89
90 /^[ \t]*(#|$)/ { next; }
91
92 $1 == "alias" { flush(); dname[d_i++] = $2; d[$2] = $3; next; }
93
94 $1 == "curve" { flush(); delete data; name = $2; type = $3; next; }
95
96 { data[$1] = $2; next; }
97
98 END {
99 flush();
100 print banner("Main table");
101 print "";
102 print "const ecentry ectab[] = {";
103 for (i = 0; i < d_i; i++) {
104 name = dname[i];
105 rname = d[name];
106 if (!rname in r) {
107 print "curve " rname " not found (alias from " name ")" >"/dev/stderr";
108 exit 1;
109 }
110 print " { \"" name "\", &" r[rname] " },";
111 }
112 print " { 0, 0 }";
113 print "};"
114 print "";
115 print banner("That's all, folks");
116 }