New function and example program computes Fibonacci numbers fairly fast.
[u/mdw/catacomb] / bin-gentab.awk
CommitLineData
3688eb75 1#! /usr/bin/awk -f
2#
3# $Id: p-gentab.awk 2187 2004-09-04 07:50:08Z mdw $
4
5function banner(name, s, i)
6{
7 s = "/*----- " name " ";
8 while (length(s) < 75) s = s "-";
9 return (s "*/");
10}
11
12function fix(name)
13{
14 gsub(/[^0-9A-Za-z_]+/, "_", name);
15 return (name);
16}
17
18BEGIN {
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
37function 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
55function 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
84END {
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}