chiark / gitweb /
ec-bin (ec_binproj): Make curve setup faster.
[catacomb] / bin-gentab.awk
1 #! /usr/bin/awk -f
2 #
3 # $Id: p-gentab.awk 2187 2004-09-04 07:50:08Z mdw $
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 binary groups [generated]";
22   print " */";
23   print "";
24   print "#include \"bintab.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("Binary group 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 "group " name ": missing " x >"/dev/stderr";
41     exit 1;
42   }
43   d = data[x];
44   if (!(d in cache)) {
45     n = "p_" 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 "/* --- Group " name " --- */";
59   delete mp;
60   print "";
61   putmp("p");
62   putmp("q");
63   putmp("g");
64   print "static bindata bin_" fix(name) " = {";
65   print "  MP(" mp["p"] "),"
66   print "  MP(" mp["q"] "),"
67   print "  MP(" mp["g"] ")"
68   print "};";
69   print "";
70   dname[d_i++] = name;
71   d[name] = name;
72   r[name] = "bin_" fix(name);
73   name = "";
74 }
75
76 /^[ \t]*(#|$)/ { next; }
77
78 $1 == "alias" { flush(); dname[d_i++] = $2; d[$2] = $3; next; }
79
80 $1 == "group" { flush(); delete data; name = $2; next; }
81
82 { data[$1] = $2; next; }
83
84 END {
85   flush();
86   print banner("Main table");
87   print "";
88   print "const binentry bintab[] = {";
89   for (i = 0; i < d_i; i++) {
90     name = dname[i];
91     rname = d[name];
92     if (!rname in r) {
93       print "group " rname " not found (alias from " name ")" >"/dev/stderr";
94       exit 1;
95     }
96     print "  { \"" name "\", &" r[rname] " },";
97   }
98   print "  { 0, 0 }";
99   print "};"
100   print "";
101   print banner("That's all, folks");
102 }