#! /bin/sh awk ' BEGIN { val[""] = 0; delete val[""]; lcform[""] = 0; delete lcform[""]; ucform[""] = 0; delete ucform[""]; casemap[""] = 0; delete casemap[""]; } /^#/ { next; } NF==2 { val[$1] = $2; next; } NF==4 { if ($2 !~ "^00") { printf("Casemapping outside low 64k: %s\n",$1) > "/dev/stderr"; exit 1 } val[$1] = $2; lcform[$1] = $3; ucform[$1] = $4; casemap[$1] = 0; numval[$1] = ("0x" $2) + 0; next; } { printf("Unrecognizable line %s\n",$0) > "/dev/stderr"; exit 1 } END { for (n in casemap) { if (! (lcform[n] in casemap)) { printf("Botched casemapping for %s\n",n) > "/dev/stderr"; exit 1 } if (! (ucform[n] in casemap)) { printf("Botched casemapping for %s\n",n) > "/dev/stderr"; exit 1 } } printf("// This file is mechanically generated\n") > "lx-keysyms.h"; for (n in val) { printf("#define LX_KEYSYM_%s 0x%s\n",n,val[n]) > "lx-keysyms.h"; } printf("// This file is mechanically generated\n") > "keysym-tables.c"; printf("#include \"lx.h\"\n") > "keysym-tables.c"; for (n in casemap) { havemap[("0x" val[n])+0] = n; } printf("LX_KEYSYM lx__cmap[][3] = {\n") > "keysym-tables.c"; mapcount = 0; for (i=0;i<65536;i++) { if (i in havemap) { n = havemap[i]; printf("{%d,%d,%d},\n",numval[n],numval[lcform[n]],numval[ucform[n]]) > "keysym-tables.c"; mapcount ++; } } printf("};\n") > "keysym-tables.c"; printf("int lx__n_casemap = %d;\n",mapcount) > "keysym-tables.c"; }' < keysyms