diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2014-05-22 19:39:38 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2014-05-22 19:39:38 +0000 |
commit | 8670797d8a3587ab44c8763b751f259614e372ba (patch) | |
tree | 12a438e9a353bd20ed1010ef03ee850c51918ff1 /sys/arch/sgi | |
parent | 845ca7a30f033bd656834dd85af5fe0ceef5aec0 (diff) |
Yet another evil awk script (not perl, I'm not in LibreSSL mode at the moment)
to convert the PS/2 keyboard layouts to SGI serial keyboard layouts.
Only the subset of layouts known to have existed (as listed in IRIX's
<sys/kbd.h> header) get converted, and specific flavours (iopener, dec LK)
are ignored as well. `nodead' flavours, when existing, are preserved.
Diffstat (limited to 'sys/arch/sgi')
-rw-r--r-- | sys/arch/sgi/hpc/Makefile | 12 | ||||
-rw-r--r-- | sys/arch/sgi/hpc/makemap.awk | 335 |
2 files changed, 347 insertions, 0 deletions
diff --git a/sys/arch/sgi/hpc/Makefile b/sys/arch/sgi/hpc/Makefile new file mode 100644 index 00000000000..90df0c5adeb --- /dev/null +++ b/sys/arch/sgi/hpc/Makefile @@ -0,0 +1,12 @@ +# $OpenBSD: Makefile,v 1.1 2014/05/22 19:39:37 miod Exp $ + +AWK= awk + +PROG= makemap.awk +MAP= ../../../dev/pckbc/wskbdmap_mfii.c + +all: wskbdmap_sgi.c + +wskbdmap_sgi.c: ${MAP} ${PROG} + /bin/rm -f $@ + ${AWK} -f ${PROG} ${MAP} > $@ diff --git a/sys/arch/sgi/hpc/makemap.awk b/sys/arch/sgi/hpc/makemap.awk new file mode 100644 index 00000000000..3c5a7ebb2bf --- /dev/null +++ b/sys/arch/sgi/hpc/makemap.awk @@ -0,0 +1,335 @@ +#! /usr/bin/awk -f +# $OpenBSD: makemap.awk,v 1.1 2014/05/22 19:39:37 miod Exp $ +# +# Copyright (c) 2005, 2014, Miodrag Vallat +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# +# This script attempts to convert, with minimal hacks and losses, the +# regular PS/2 keyboard (pckbd) layout tables into SGI serial keyboard (zskbd) +# layout tables. +# + +BEGIN { + rcsid = "$OpenBSD: makemap.awk,v 1.1 2014/05/22 19:39:37 miod Exp $" + ifdepth = 0 + ignore = 0 + haskeys = 0 + summary = 0 + + # PS/2 -> SGI conversion table + for (i = 0; i < 256; i++) + conv[i] = -1 + + conv[1] = 6 + conv[2] = 7 + conv[3] = 13 + conv[4] = 14 + conv[5] = 21 + conv[6] = 22 + conv[7] = 29 + conv[8] = 30 + conv[9] = 37 + conv[10] = 38 + conv[11] = 45 + conv[12] = 46 + conv[13] = 53 + conv[14] = 60 + conv[15] = 8 + conv[16] = 9 + conv[17] = 15 + conv[18] = 16 + conv[19] = 23 + conv[20] = 24 + conv[21] = 31 + conv[22] = 32 + conv[23] = 39 + conv[24] = 40 + conv[25] = 47 + conv[26] = 48 + conv[27] = 55 + conv[28] = 50 + conv[29] = 2 + conv[30] = 10 + conv[31] = 11 + conv[32] = 17 + conv[33] = 18 + conv[34] = 25 + conv[35] = 26 + conv[36] = 33 + conv[37] = 34 + conv[38] = 41 + conv[39] = 42 + conv[40] = 49 + conv[41] = 54 + conv[42] = 5 + conv[43] = 56 + conv[44] = 19 + conv[45] = 20 + conv[46] = 27 + conv[47] = 28 + conv[48] = 35 + conv[49] = 36 + conv[50] = 43 + conv[51] = 44 + conv[52] = 51 + conv[53] = 52 + conv[54] = 4 + conv[55] = 108 + conv[56] = 83 + conv[57] = 82 + conv[58] = 3 + conv[59] = 86 + conv[60] = 87 + conv[61] = 88 + conv[62] = 89 + conv[63] = 90 + conv[64] = 91 + conv[65] = 92 + conv[66] = 93 + conv[67] = 94 + conv[68] = 95 + conv[69] = 106 + conv[70] = 99 + conv[71] = 66 + conv[72] = 67 + conv[73] = 74 + conv[74] = 75 + conv[75] = 62 + conv[76] = 68 + conv[77] = 69 + conv[78] = 109 + conv[79] = 57 + conv[80] = 63 + conv[81] = 64 + conv[82] = 58 + conv[83] = 65 + conv[86] = 111 + conv[87] = 96 + conv[88] = 97 + conv[127] = 100 + conv[156] = 81 + conv[157] = 85 + conv[170] = 98 + conv[181] = 107 + conv[183] = 98 + conv[184] = 84 + conv[199] = 102 + conv[200] = 80 + conv[201] = 103 + conv[203] = 72 + conv[205] = 79 + conv[207] = 104 + conv[208] = 73 + conv[209] = 105 + conv[210] = 101 + conv[211] = 61 +} +NR == 1 { + VERSION = $0 + gsub("\\$", "", VERSION) + gsub("\\$", "", rcsid) + + printf("/*\t\$OpenBSD\$\t*/\n\n") + printf("/*\n") + printf(" * THIS FILE IS AUTOMAGICALLY GENERATED. DO NOT EDIT.\n") + printf(" *\n") + printf(" * generated by:\n") + printf(" *\t%s\n", rcsid) + printf(" * generated from:\n") + printf(" */\n") + print VERSION + + next +} + +# +# A very limited #if ... #endif parser. We only want to correctly detect +# ``#if 0'' constructs, so as not to process their contents. This is necessary +# since our output is out-of-order from our input. +# +# Note that this does NOT handle ``#ifdef notyet'' correctly - please only use +# ``#if 0'' constructs in the input. +# + +/^#if/ { + ignores[ifdepth] = ignore + if ($2 == "0") + ignore = 1 + #else + # ignore = 0 + ifdepth++ + if (ignore) + next +} +/^#endif/ { + oldignore = ignore + ifdepth-- + ignore = ignores[ifdepth] + ignores[ifdepth] = 0 + if (oldignore) + next +} + +$1 == "#include" { + if (ignore) + next + if ($2 == "<dev/pckbc/wskbdmap_mfii.h>") + next + printf("#include %s\n", $2) + next +} +$1 == "#define" || $1 == "#undef" { + if (ignore) + next + print $0 + next +} + +/pckbd/ { + gsub("pckbd", "zskbd", $0) +} +/zskbd_keydesctab/ { + gsub("zskbd", "wssgi", $0) +} + +/zskbd_keydesc_/ { + mapname = substr($0, index($0, "zskbd_keydesc_") + length("zskbd_keydesc_")) + sub("\\[\\].*", "", mapname) + sub("\\).*", "", mapname) + shortname = mapname + sub("_nodead", "", shortname) # _nodead ok if main layout ok + if (shortname != "be" && + shortname != "de" && + shortname != "dk" && + shortname != "es" && + shortname != "fi" && # missing from PS/2 source... + shortname != "fr" && + shortname != "gr" && # missing from PS/2 source... + shortname != "it" && + shortname != "nl" && + shortname != "no" && + shortname != "pt" && + shortname != "sf" && + shortname != "sg" && + shortname != "sv" && + shortname != "uk" && + shortname != "us") { + nolayout = 1 + } +} + +/zskbd_keydesc_.*\[\]/ { + if (nolayout) + printf("/* %s not applicable */\n", mapname) +} + +/KC/ { + if (ignore) + next + + if (nolayout) + next + + haskeys = 1 + + sidx = substr($1, 4, length($1) - 5) + orig = int(sidx) + id = conv[orig] + + if (id == -1) { + # printf("/* initially KC(%d),", orig) + # for (f = 2; f <= NF; f++) { + # if ($f != "/*" && $f != "*/") + # printf("\t%s", $f) + # } + # printf("\t*/\n") + } else { + lines[id] = sprintf(" KC(%d),\t", id) + # + # This makes sure that the non-comment part of the output + # ends up with a trailing comma. This is necessary since + # the last line of an input block might not have a trailing + # comma, but might not be the last line of an output block + # due to sorting. + # + comma = 0 + for (f = 2; f <= NF; f++) { + l = length($f) + if ($f == "/*") + comma++ + if (comma == 0 && substr($f, l) != ",") { + lines[id] = sprintf("%s%s,", lines[id], $f) + l++ + } else { + lines[id] = sprintf("%s%s", lines[id], $f) + } + if (comma == 0 && f != NF) { + if (l < 2 * 8) + lines[id] = lines[id] "\t" + if (l < 8) + lines[id] = lines[id] "\t" + } + if ($f == "*/") + comma-- + } + } + + next +} +/};/ { + if (ignore) + next + + if (nolayout) { + nolayout = 0 + next + } + + if (haskeys) { + for (i = 0; i < 256; i++) + if (lines[i]) { + print lines[i] + lines[i] = "" + } + + haskeys = 0 + } +} +/KBD_MAP/ { + summary = 1 +} +# hack to eat two line KBD_MAP() - we want to ignore all of them, and +# the second line will get rejected because ``nolayout'' will be set. +/KBD_MAP[^)]*,$/ { next } + +{ + if (ignore) + next + if (nolayout) { + if (summary) + nolayout = 0 + next + } + print $0 +} |