[BACK]Return to makemap.awk CVS log [TXT][DIR] Up to [local] / sys / dev / usb

Annotation of sys/dev/usb/makemap.awk, Revision 1.1.1.1

1.1       nbrk        1: #! /usr/bin/awk -f
                      2: #      $OpenBSD: makemap.awk,v 1.7 2007/06/17 07:53:11 mbalmer Exp $
                      3: #
                      4: # Copyright (c) 2005, Miodrag Vallat
                      5: #
                      6: # Redistribution and use in source and binary forms, with or without
                      7: # modification, are permitted provided that the following conditions
                      8: # are met:
                      9: # 1. Redistributions of source code must retain the above copyright
                     10: #    notice, this list of conditions and the following disclaimer.
                     11: # 2. Redistributions in binary form must reproduce the above copyright
                     12: #    notice, this list of conditions and the following disclaimer in the
                     13: #    documentation and/or other materials provided with the distribution.
                     14: #
                     15: # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     16: # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
                     17: # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
                     18: # DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
                     19: # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
                     20: # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
                     21: # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     22: # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
                     23: # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
                     24: # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     25: # POSSIBILITY OF SUCH DAMAGE.
                     26: #
                     27: #
                     28: # This script attempts to convert, with minimal hacks and losses, the
                     29: # regular PS/2 keyboard (pckbd) layout tables into USB keyboard (ukbd)
                     30: # layout tables.
                     31: #
                     32:
                     33: BEGIN {
                     34:        rcsid = "$OpenBSD: makemap.awk,v 1.7 2007/06/17 07:53:11 mbalmer Exp $"
                     35:        ifdepth = 0
                     36:        ignore = 0
                     37:        declk = 0
                     38:        haskeys = 0
                     39:        kbfr = 0
                     40:
                     41:        # PS/2 id -> UKBD conversion table, or "sanity lossage 102"
                     42:        # (101 is for GSC keyboards!)
                     43:        for (i = 0; i < 256; i++)
                     44:                conv[i] = -1
                     45:
                     46:        conv[1] = 41
                     47:        conv[2] = 30
                     48:        conv[3] = 31
                     49:        conv[4] = 32
                     50:        conv[5] = 33
                     51:        conv[6] = 34
                     52:        conv[7] = 35
                     53:        conv[8] = 36
                     54:        conv[9] = 37
                     55:        conv[10] = 38
                     56:        conv[11] = 39
                     57:        conv[12] = 45
                     58:        conv[13] = 46
                     59:        conv[14] = 42
                     60:        conv[15] = 43
                     61:        conv[16] = 20
                     62:        conv[17] = 26
                     63:        conv[18] = 8
                     64:        conv[19] = 21
                     65:        conv[20] = 23
                     66:        conv[21] = 28
                     67:        conv[22] = 24
                     68:        conv[23] = 12
                     69:        conv[24] = 18
                     70:        conv[25] = 19
                     71:        conv[26] = 47
                     72:        conv[27] = 48
                     73:        conv[28] = 40
                     74:        conv[29] = 224
                     75:        conv[30] = 4
                     76:        conv[31] = 22
                     77:        conv[32] = 7
                     78:        conv[33] = 9
                     79:        conv[34] = 10
                     80:        conv[35] = 11
                     81:        conv[36] = 13
                     82:        conv[37] = 14
                     83:        conv[38] = 15
                     84:        conv[39] = 51
                     85:        conv[40] = 52
                     86:        conv[41] = 53
                     87:        conv[42] = 225
                     88:        conv[43] = 50
                     89:        conv[44] = 29
                     90:        conv[45] = 27
                     91:        conv[46] = 6
                     92:        conv[47] = 25
                     93:        conv[48] = 5
                     94:        conv[49] = 17
                     95:        conv[50] = 16
                     96:        conv[51] = 54
                     97:        conv[52] = 55
                     98:        conv[53] = 56
                     99:        conv[54] = 229
                    100:        conv[55] = 85
                    101:        conv[56] = 226
                    102:        conv[57] = 44
                    103:        conv[58] = 57
                    104:        conv[59] = 58
                    105:        conv[60] = 59
                    106:        conv[61] = 60
                    107:        conv[62] = 61
                    108:        conv[63] = 62
                    109:        conv[64] = 63
                    110:        conv[65] = 64
                    111:        conv[66] = 65
                    112:        conv[67] = 66
                    113:        conv[68] = 67
                    114:        conv[69] = 83
                    115:        conv[70] = 71
                    116:        conv[71] = 95
                    117:        conv[72] = 96
                    118:        conv[73] = 97
                    119:        conv[74] = 86
                    120:        conv[75] = 92
                    121:        conv[76] = 93
                    122:        conv[77] = 94
                    123:        conv[78] = 87
                    124:        conv[79] = 89
                    125:        conv[80] = 90M
                    126:        conv[81] = 91
                    127:        conv[82] = 98
                    128:        conv[83] = 99
                    129:        conv[86] = 100
                    130:        conv[87] = 68
                    131:        conv[88] = 69
                    132:        conv[112] = 135
                    133:        conv[115] = 136
                    134:        conv[121] = 137
                    135:        conv[123] = 138
                    136:        conv[125] = 139
                    137:        conv[127] = 72
                    138:        conv[156] = 88
                    139:        conv[157] = 228
                    140:        conv[170] = 70
                    141:        conv[181] = 84
                    142:        conv[184] = 230
                    143:        # 198 is #if 0 in the PS/2 map...
                    144:        conv[199] = 74
                    145:        conv[200] = 82
                    146:        conv[201] = 75
                    147:        conv[203] = 80
                    148:        conv[205] = 79
                    149:        conv[207] = 77
                    150:        conv[208] = 81
                    151:        conv[209] = 78
                    152:        conv[210] = 73
                    153:        conv[211] = 99
                    154:        conv[219] = 227
                    155:        conv[220] = 231
                    156:        conv[221] = 101
                    157: }
                    158: NR == 1 {
                    159:        VERSION = $0
                    160:        gsub("\\$", "", VERSION)
                    161:        gsub("\\$", "", rcsid)
                    162:
                    163:        printf("/*\t\$OpenBSD\$\t*/\n\n")
                    164:        printf("/*\n")
                    165:        printf(" * THIS FILE IS AUTOMAGICALLY GENERATED.  DO NOT EDIT.\n")
                    166:        printf(" *\n")
                    167:        printf(" * generated by:\n")
                    168:        printf(" *\t%s\n", rcsid)
                    169:        printf(" * generated from:\n")
                    170:        printf(" */\n")
                    171:        print VERSION
                    172:
                    173:        next
                    174: }
                    175:
                    176: #
                    177: # A very limited #if ... #endif parser. We only want to correctly detect
                    178: # ``#if 0'' constructs, so as not to process their contents. This is necessary
                    179: # since our output is out-of-order from our input.
                    180: #
                    181: # Note that this does NOT handle ``#ifdef notyet'' correctly - please only use
                    182: # ``#if 0'' constructs in the input.
                    183: #
                    184:
                    185: /^#if/ {
                    186:        ignores[ifdepth] = ignore
                    187:        if ($2 == "0")
                    188:                ignore = 1
                    189:        else
                    190:                ignore = 0
                    191:        ifdepth++
                    192:        if (ignore)
                    193:                next
                    194: }
                    195: /^#endif/ {
                    196:        oldignore = ignore
                    197:        ifdepth--
                    198:        ignore = ignores[ifdepth]
                    199:        ignores[ifdepth] = 0
                    200:        if (oldignore)
                    201:                next
                    202: }
                    203:
                    204: $1 == "#include" {
                    205:        if (ignore)
                    206:                next
                    207:        if ($2 == "<dev/pckbc/wskbdmap_mfii.h>")
                    208:                next
                    209:        printf("#include %s\n", $2)
                    210:        next
                    211: }
                    212: $1 == "#define" || $1 == "#undef" {
                    213:        if (ignore)
                    214:                next
                    215:        print $0
                    216:        next
                    217: }
                    218:
                    219: # Don't bother converting the DEC LK layout.
                    220: /declk\[/ {
                    221:        declk = 1
                    222:        next
                    223: }
                    224: /declk/ {
                    225:        next
                    226: }
                    227:
                    228: /pckbd/ {
                    229:        gsub("pckbd", "ukbd", $0)
                    230:        mapname = $4
                    231: }
                    232:
                    233: /KC/ {
                    234:        if (ignore)
                    235:                next
                    236:
                    237:        if (declk)
                    238:                next
                    239:
                    240:        haskeys = 1
                    241:
                    242:        sidx = substr($1, 4, length($1) - 5)
                    243:        orig = int(sidx)
                    244:        id = conv[orig]
                    245:
                    246:        # 183 is another Print Screen...
                    247:        if (orig == 183)
                    248:                next
                    249:
                    250:        if (id == -1) {
                    251:                printf("/* initially KC(%d),", orig)
                    252:                for (f = 2; f <= NF; f++) {
                    253:                        if ($f != "/*" && $f != "*/")
                    254:                                printf("\t%s", $f)
                    255:                }
                    256:                printf("\t*/\n")
                    257:        } else {
                    258:                lines[id] = sprintf("    KC(%d),\t", id)
                    259:                #
                    260:                # This makes sure that the non-comment part of the output
                    261:                # ends up with a trailing comma. This is necessary since
                    262:                # the last line of an input block might not have a trailing
                    263:                # comma, but might not be the last line of an output block
                    264:                # due to sorting.
                    265:                #
                    266:                comma = 0
                    267:                for (f = 2; f <= NF; f++) {
                    268:                        l = length($f)
                    269:                        if ($f == "/*")
                    270:                                comma++
                    271:                        if (comma == 0 && substr($f, l) != ",") {
                    272:                                lines[id] = sprintf("%s%s,", lines[id], $f)
                    273:                                l++
                    274:                        } else {
                    275:                                lines[id] = sprintf("%s%s", lines[id], $f)
                    276:                        }
                    277:                        if (comma == 0 && f != NF) {
                    278:                                if (l < 2 * 8)
                    279:                                        lines[id] = lines[id] "\t"
                    280:                                if (l < 8)
                    281:                                        lines[id] = lines[id] "\t"
                    282:                        }
                    283:                        if ($f == "*/")
                    284:                                comma--
                    285:                }
                    286:        }
                    287:
                    288:        next
                    289: }
                    290: /};/ {
                    291:        if (ignore)
                    292:                next
                    293:
                    294:        if (declk) {
                    295:                declk = 0
                    296:                next
                    297:        }
                    298:
                    299:        if (haskeys) {
                    300:                # Duplicate 42 (backspace) as 76 and 50 (backslash bar) as 49
                    301:                if (!lines[76]) {
                    302:                        lines[76] = lines[42]
                    303:                        sub("42", "76", lines[76])
                    304:                }
                    305:                if (!lines[49]) {
                    306:                        lines[49] = lines[50]
                    307:                        sub("50", "49", lines[49])
                    308:                }
                    309:
                    310:                for (i = 0; i < 256; i++)
                    311:                        if (lines[i]) {
                    312:                                print lines[i]
                    313:                                lines[i] = ""
                    314:                        }
                    315:
                    316:                haskeys = 0
                    317:
                    318:                #
                    319:                # Apple black USB keyboards use a slightly different
                    320:                # layout. We define them here.
                    321:                #
                    322:                if (mapname == "ukbd_keydesc_fr[]") {
                    323:                        print $0
                    324:                        print "\nstatic const keysym_t ukbd_keydesc_fr_apple[] = {"
                    325:                        print "    KC(5),\tKS_b,\t\tKS_B,\t\tKS_ssharp,"
                    326:                        print "    KC(8),\tKS_e,\t\tKS_E,\t\tKS_ecircumflex,\tKS_Ecircumflex,"
                    327:                        print "    KC(11),\tKS_h,\t\tKS_H,\t\tKS_Igrave,\tKS_Icircumflex,"
                    328:                        print "    KC(12),\tKS_i,\t\tKS_I,\t\tKS_icircumflex,\tKS_idiaeresis,"
                    329:                        print "    KC(13),\tKS_j,\t\tKS_J,\t\tKS_Idiaeresis,\tKS_Iacute,"
                    330:                        print "    KC(14),\tKS_k,\t\tKS_K,\t\tKS_Egrave,\tKS_Ediaeresis,"
                    331:                        print "    KC(15),\tKS_l,\t\tKS_L,\t\tKS_voidSymbol,\tKS_bar,"
                    332:                        print "    KC(16),\tKS_comma,\tKS_question,\tKS_voidSymbol,\tKS_questiondown,"
                    333:                        print "    KC(17),\tKS_n,\t\tKS_N,\t\tKS_asciitilde,"
                    334:                        print "    KC(20),\tKS_a,\t\tKS_A,\t\tKS_ae,\t\tKS_AE,"
                    335:                        print "    KC(21),\tKS_r,\t\tKS_R,\t\tKS_registered,\tKS_comma,"
                    336:                        print "    KC(22),\tKS_s,\t\tKS_S,\t\tKS_Ograve,"
                    337:                        print "    KC(26),\tKS_z,\t\tKS_Z,\t\tKS_Acircumflex,\tKS_Aring,"
                    338:                        print "    KC(28),\tKS_y,\t\tKS_Y,\t\tKS_Uacute,"
                    339:                        print "    KC(31),\tKS_eacute,\tKS_2,\t\tKS_ediaeresis,"
                    340:                        print "    KC(32),\tKS_quotedbl,\tKS_3,"
                    341:                        print "    KC(33),\tKS_apostrophe,\tKS_4,"
                    342:                        print "    KC(34),\tKS_parenleft,\tKS_5,\t\tKS_braceleft,\tKS_bracketleft,"
                    343:                        print "    KC(35),\tKS_section,\tKS_6,"
                    344:                        print "    KC(36),\tKS_egrave,\tKS_7,\t\tKS_guillemotleft,"
                    345:                        print "\t\t\t\t\t\tKS_guillemotright,"
                    346:                        print "    KC(37),\tKS_exclam,\tKS_8,"
                    347:                        print "    KC(38),\tKS_ccedilla,\tKS_9,\t\tKS_Ccedilla,\tKS_Aacute,"
                    348:                        print "    KC(37),\tKS_exclam,\tKS_8,\t\tKS_exclamdown,\tKS_Ucircumflex,"
                    349:                        print "    KC(39),\tKS_agrave,\tKS_0,\t\tKS_oslash,\tKS_Ooblique,"
                    350:                        print "    KC(45),\tKS_parenright,\tKS_degree,\tKS_braceright,\tKS_bracketright,"
                    351:                        print "    KC(46),\tKS_minus,\tKS_underscore,"
                    352:                        print "    KC(47),\tKS_dead_circumflex, KS_dead_diaeresis,"
                    353:                        print "\t\t\t\t\t\tKS_ocircumflex,\tKS_Ocircumflex,"
                    354:                        print "    KC(48),\tKS_dollar,\tKS_asterisk,\tKS_cent,\tKS_yen,"
                    355:                        print "    KC(50),\tKS_grave,\tKS_sterling,\tKS_at,\t\tKS_numbersign,"
                    356:                        print "    KC(51),\tKS_m,\t\tKS_M,\t\tKS_mu,\t\tKS_Oacute,"
                    357:                        print "    KC(52),\tKS_ugrave,\tKS_percent,\tKS_Ugrave,"
                    358:                        print "    KC(53),\tKS_at,\t\tKS_numbersign,"
                    359:                        print "    KC(55),\tKS_colon,\tKS_slash,\tKS_voidSymbol,\tKS_backslash,"
                    360:                        print "    KC(56),\tKS_equal,\tKS_plus,"
                    361:                        print "    KC(103),\tKS_KP_Equal,"
                    362:                        print "    KC(231),\tKS_Mode_switch,\tKS_Multi_key,"
                    363:                } else
                    364:                if (mapname == "ukbd_keydesc_pt[]") {
                    365:                        print $0
                    366:                        print "\nstatic const keysym_t ukbd_keydesc_pt_apple[] = {"
                    367:                        print "/*  pos\t\tnormal\t\tshifted */"
                    368:                        print "    KC(46),\tKS_plus,\tKS_asterisk,"
                    369:                        print "    KC(47),\tKS_masculine,\tKS_ordfeminine,"
                    370:                        print "    KC(50),\tKS_backslash,\tKS_bar,"
                    371:                        print "    KC(52),\tKS_dead_tilde,\tKS_dead_circumflex"
                    372:                }
                    373:        }
                    374: }
                    375: /KB_FR/ {
                    376:        print $0
                    377:        if (kbfr++ == 0) {
                    378:                print "\tKBD_MAP(KB_FR | KB_APPLE,\tKB_FR,\tukbd_keydesc_fr_apple),"
                    379:        } else {
                    380:                print "\tKBD_MAP(KB_FR | KB_APPLE | KB_SWAPCTRLCAPS,\tKB_FR | KB_APPLE,"
                    381:                print "\t\tukbd_keydesc_swapctrlcaps),"
                    382:        }
                    383:        next
                    384: }
                    385: /KB_PT/ {
                    386:        print $0
                    387:        print "\tKBD_MAP(KB_PT | KB_APPLE,\tKB_PT,\tukbd_keydesc_pt_apple),"
                    388:        next
                    389: }
                    390: {
                    391:        if (ignore)
                    392:                next
                    393:        if (declk)
                    394:                next
                    395:        print $0
                    396: }

CVSweb