Yet another evil awk script (not perl, I'm not in LibreSSL mode at the moment)
authormiod <miod@openbsd.org>
Thu, 22 May 2014 19:39:37 +0000 (19:39 +0000)
committermiod <miod@openbsd.org>
Thu, 22 May 2014 19:39:37 +0000 (19:39 +0000)
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.

sys/arch/sgi/hpc/Makefile [new file with mode: 0644]
sys/arch/sgi/hpc/makemap.awk [new file with mode: 0644]

diff --git a/sys/arch/sgi/hpc/Makefile b/sys/arch/sgi/hpc/Makefile
new file mode 100644 (file)
index 0000000..90df0c5
--- /dev/null
@@ -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 (file)
index 0000000..3c5a7eb
--- /dev/null
@@ -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
+}