[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     ! 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