chiark / gitweb /
Rearrange the file tree.
[catacomb] / math / p-gentab.awk
1 #! /usr/bin/awk -f
2
3 function banner(name, s, i)
4 {
5   s = "/*----- " name " ";
6   while (length(s) < 75) s = s "-";
7   return (s "*/");
8 }
9
10 function fix(name)
11 {
12   gsub(/[^0-9A-Za-z_]+/, "_", name);
13   return (name);
14 }
15
16 BEGIN {
17   print "/* -*-c-*-";
18   print " *";
19   print " * Table of prime groups [generated]";
20   print " */";
21   print "";
22   print "#include \"ptab.h\"";
23   print "";
24   print "#define N(x) (sizeof(x)/sizeof(*x))";
25   print "#define MP(x) { x, x + N(x), N(x), 0, MP_CONST, 0 }";
26   print "#define NOMP { 0, 0, 0, 0, 0 }";
27   print "";
28   print banner("Prime data");
29   print "";
30
31   d_i = 0;
32   name = "";
33 }
34
35 function putmp(x,  d)
36 {
37   if (!(x in data)) {
38     print "group " name ": missing " x >"/dev/stderr";
39     exit 1;
40   }
41   d = data[x];
42   if (!(d in cache)) {
43     n = "p_" fix(name) "_" x;
44     print "static mpw " n "[] = {";
45     system("./mpdump " d);
46     print "};";
47     print "";
48     cache[d] = n;
49   }
50   mp[x] = cache[d];
51 }
52
53 function flush()
54 {
55   if (name == "") return;
56   print "/* --- Group " name " --- */";
57   delete mp;
58   print "";
59   putmp("p");
60   putmp("q");
61   putmp("g");
62   print "static pdata p_" fix(name) " = {";
63   print "  MP(" mp["p"] "),"
64   print "  MP(" mp["q"] "),"
65   print "  MP(" mp["g"] ")"
66   print "};";
67   print "";
68   dname[d_i++] = name;
69   d[name] = name;
70   r[name] = "p_" fix(name);
71   name = "";
72 }
73
74 /^[ \t]*(#|$)/ { next; }
75
76 $1 == "alias" { flush(); dname[d_i++] = $2; d[$2] = $3; next; }
77
78 $1 == "group" { flush(); delete data; name = $2; next; }
79
80 { data[$1] = $2; next; }
81
82 END {
83   flush();
84   print banner("Main table");
85   print "";
86   print "const pentry ptab[] = {";
87   for (i = 0; i < d_i; i++) {
88     name = dname[i];
89     rname = d[name];
90     if (!rname in r) {
91       print "group " rname " not found (alias from " name ")" >"/dev/stderr";
92       exit 1;
93     }
94     print "  { \"" name "\", &" r[rname] " },";
95   }
96   print "  { 0, 0 }";
97   print "};"
98   print "";
99   print banner("That's all, folks");
100 }