X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/986527ae4af14be68551d0b49a1145bb3e89f259..3688eb757240b2332f67ec827be8caf6f6abe924:/bin-gentab.awk diff --git a/bin-gentab.awk b/bin-gentab.awk new file mode 100755 index 0000000..fb8630e --- /dev/null +++ b/bin-gentab.awk @@ -0,0 +1,102 @@ +#! /usr/bin/awk -f +# +# $Id: p-gentab.awk 2187 2004-09-04 07:50:08Z mdw $ + +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 binary groups [generated]"; + print " */"; + print ""; + print "#include \"bintab.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("Binary group data"); + print ""; + + d_i = 0; + name = ""; +} + +function putmp(x, d) +{ + if (!(x in data)) { + print "group " name ": missing " x >"/dev/stderr"; + exit 1; + } + d = data[x]; + if (!(d in cache)) { + n = "p_" 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 "/* --- Group " name " --- */"; + delete mp; + print ""; + putmp("p"); + putmp("q"); + putmp("g"); + print "static bindata bin_" fix(name) " = {"; + print " MP(" mp["p"] ")," + print " MP(" mp["q"] ")," + print " MP(" mp["g"] ")" + print "};"; + print ""; + dname[d_i++] = name; + d[name] = name; + r[name] = "bin_" fix(name); + name = ""; +} + +/^[ \t]*(#|$)/ { next; } + +$1 == "alias" { flush(); dname[d_i++] = $2; d[$2] = $3; next; } + +$1 == "group" { flush(); delete data; name = $2; next; } + +{ data[$1] = $2; next; } + +END { + flush(); + print banner("Main table"); + print ""; + print "const binentry bintab[] = {"; + for (i = 0; i < d_i; i++) { + name = dname[i]; + rname = d[name]; + if (!rname in r) { + print "group " 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"); +}