1262685Sdelphij# $Id: MKkeyname.awk,v 1.48 2013/08/24 17:37:22 tom Exp $ 250276Speter############################################################################## 3262685Sdelphij# Copyright (c) 1999-2012,2013 Free Software Foundation, Inc. # 450276Speter# # 550276Speter# Permission is hereby granted, free of charge, to any person obtaining a # 650276Speter# copy of this software and associated documentation files (the "Software"), # 750276Speter# to deal in the Software without restriction, including without limitation # 850276Speter# the rights to use, copy, modify, merge, publish, distribute, distribute # 950276Speter# with modifications, sublicense, and/or sell copies of the Software, and to # 1050276Speter# permit persons to whom the Software is furnished to do so, subject to the # 1150276Speter# following conditions: # 1250276Speter# # 1350276Speter# The above copyright notice and this permission notice shall be included in # 1450276Speter# all copies or substantial portions of the Software. # 1550276Speter# # 1650276Speter# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # 1750276Speter# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # 1850276Speter# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # 1950276Speter# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # 2050276Speter# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # 2150276Speter# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # 2250276Speter# DEALINGS IN THE SOFTWARE. # 2350276Speter# # 2450276Speter# Except as contained in this notice, the name(s) of the above copyright # 2550276Speter# holders shall not be used in advertising or otherwise to promote the sale, # 2650276Speter# use or other dealings in this Software without prior written # 2750276Speter# authorization. # 2850276Speter############################################################################## 2950276SpeterBEGIN { 3050276Speter print "/* generated by MKkeyname.awk */" 3150276Speter print "" 3297049Speter print "#include <curses.priv.h>" 3350276Speter print "#include <tic.h>" 3450276Speter print "" 35174993Srafan first = 1; 3650276Speter} 3750276Speter 3850276Speter/^[^#]/ { 39174993Srafan if (bigstrings) { 40174993Srafan if (first) { 41174993Srafan print "struct kn { short offset; int code; };" 42174993Srafan print "static const struct kn _nc_key_names[] = {" 43174993Srafan } 44174993Srafan printf "\t{ %d, %s },\n", offset, $1 45174993Srafan offset += length($1) + 1 46174993Srafan names = names"\n\t\""$1"\\0\"" 47174993Srafan } else { 48174993Srafan if (first) { 49174993Srafan print "struct kn { const char *name; int code; };" 50174993Srafan print "static const struct kn _nc_key_names[] = {" 51174993Srafan } 52174993Srafan printf "\t{ \"%s\", %s },\n", $1, $1; 53174993Srafan } 54174993Srafan first = 0; 5550276Speter } 5650276Speter 5750276SpeterEND { 58174993Srafan if (bigstrings) { 59174993Srafan printf "\t{ -1, 0 }};\n" 60174993Srafan print "" 61174993Srafan print "static const char key_names[] = "names";" 62174993Srafan } else { 63174993Srafan printf "\t{ 0, 0 }};\n" 64174993Srafan } 6550276Speter print "" 66166124Srafan print "#define SIZEOF_TABLE 256" 67174993Srafan print "#define MyTable _nc_globals.keyname_table" 68262685Sdelphij print "#define MyInit _nc_globals.init_keyname" 69166124Srafan print "" 70262629Sdelphij print "NCURSES_EXPORT(NCURSES_CONST char *)" 71262629Sdelphij print "safe_keyname (SCREEN *sp, int c)" 7250276Speter print "{" 73166124Srafan print " int i;" 74166124Srafan print " char name[20];" 75166124Srafan print " char *p;" 76166124Srafan print " NCURSES_CONST char *result = 0;" 7750276Speter print "" 78166124Srafan print " if (c == -1) {" 79166124Srafan print " result = \"-1\";" 80166124Srafan print " } else {" 81174993Srafan if (bigstrings) { 82174993Srafan print " for (i = 0; _nc_key_names[i].offset != -1; i++) {" 83174993Srafan print " if (_nc_key_names[i].code == c) {" 84174993Srafan print " result = (NCURSES_CONST char *)key_names + _nc_key_names[i].offset;" 85174993Srafan print " break;" 86174993Srafan print " }" 87174993Srafan print " }" 88174993Srafan } else { 89174993Srafan print " for (i = 0; _nc_key_names[i].name != 0; i++) {" 90174993Srafan print " if (_nc_key_names[i].code == c) {" 91174993Srafan print " result = (NCURSES_CONST char *)_nc_key_names[i].name;" 92174993Srafan print " break;" 93174993Srafan print " }" 94174993Srafan print " }" 95174993Srafan } 9698503Speter print "" 97166124Srafan print " if (result == 0 && (c >= 0 && c < SIZEOF_TABLE)) {" 98174993Srafan print " if (MyTable == 0)" 99174993Srafan print " MyTable = typeCalloc(char *, SIZEOF_TABLE);" 100262685Sdelphij print "" 101174993Srafan print " if (MyTable != 0) {" 102262685Sdelphij print " int m_prefix = (sp == 0 || sp->_use_meta);" 103262685Sdelphij print "" 104262685Sdelphij print " /* if sense of meta() changed, discard cached data */" 105262685Sdelphij print " if (MyInit != (m_prefix + 1)) {" 106262685Sdelphij print " MyInit = m_prefix + 1;" 107262685Sdelphij print " for (i = 0; i < SIZEOF_TABLE; ++i) {" 108262685Sdelphij print " if (MyTable[i]) {" 109262685Sdelphij print " FreeAndNull(MyTable[i]);" 110262685Sdelphij print " }" 111262685Sdelphij print " }" 112262685Sdelphij print " }" 113262685Sdelphij print "" 114262685Sdelphij print " /* create and cache result as needed */" 115174993Srafan print " if (MyTable[c] == 0) {" 116166124Srafan print " int cc = c;" 117166124Srafan print " p = name;" 118262685Sdelphij print "#define P_LIMIT (sizeof(name) - (size_t) (p - name))" 119262685Sdelphij print " if (cc >= 128 && m_prefix) {" 120262685Sdelphij print " _nc_STRCPY(p, \"M-\", P_LIMIT);" 121166124Srafan print " p += 2;" 122166124Srafan print " cc -= 128;" 123166124Srafan print " }" 124166124Srafan print " if (cc < 32)" 125262685Sdelphij print " _nc_SPRINTF(p, _nc_SLIMIT(P_LIMIT) \"^%c\", cc + '@');" 126166124Srafan print " else if (cc == 127)" 127262685Sdelphij print " _nc_STRCPY(p, \"^?\", P_LIMIT);" 128166124Srafan print " else" 129262685Sdelphij print " _nc_SPRINTF(p, _nc_SLIMIT(P_LIMIT) \"%c\", cc);" 130174993Srafan print " MyTable[c] = strdup(name);" 131166124Srafan print " }" 132174993Srafan print " result = MyTable[c];" 133166124Srafan print " }" 134166124Srafan print "#if NCURSES_EXT_FUNCS && NCURSES_XNAMES" 135262629Sdelphij print " } else if (result == 0 && HasTerminal(sp)) {" 136166124Srafan print " int j, k;" 137166124Srafan print " char * bound;" 138262629Sdelphij print " TERMTYPE *tp = &(TerminalOf(sp)->type);" 139262629Sdelphij print " unsigned save_trace = _nc_tracing;" 14097049Speter print "" 141166124Srafan print " _nc_tracing = 0; /* prevent recursion via keybound() */" 142262629Sdelphij print " for (j = 0; (bound = NCURSES_SP_NAME(keybound)(NCURSES_SP_ARGx c, j)) != 0; ++j) {" 143184989Srafan print " for(k = STRCOUNT; k < (int) NUM_STRINGS(tp); k++) {" 144166124Srafan print " if (tp->Strings[k] != 0 && !strcmp(bound, tp->Strings[k])) {" 145166124Srafan print " result = ExtStrname(tp, k, strnames);" 146166124Srafan print " break;" 147166124Srafan print " }" 148166124Srafan print " }" 149166124Srafan print " free(bound);" 150166124Srafan print " if (result != 0)" 151166124Srafan print " break;" 152166124Srafan print " }" 153166124Srafan print " _nc_tracing = save_trace;" 154166124Srafan print "#endif" 155166124Srafan print " }" 156166124Srafan print " }" 157166124Srafan print " return result;" 15850276Speter print "}" 15997049Speter print "" 160262629Sdelphij print "NCURSES_EXPORT(NCURSES_CONST char *)" 161262629Sdelphij print "keyname (int c)" 162184989Srafan print "{" 163262629Sdelphij print " return safe_keyname (CURRENT_SCREEN, c);" 164184989Srafan print "}" 165184989Srafan print "" 166166124Srafan print "#if NO_LEAKS" 167166124Srafan print "void _nc_keyname_leaks(void)" 168166124Srafan print "{" 169166124Srafan print " int j;" 170174993Srafan print " if (MyTable != 0) {" 171166124Srafan print " for (j = 0; j < SIZEOF_TABLE; ++j) {" 172174993Srafan print " FreeIfNeeded(MyTable[j]);" 173166124Srafan print " }" 174174993Srafan print " FreeAndNull(MyTable);" 175166124Srafan print " }" 176166124Srafan print "}" 177166124Srafan print "#endif /* NO_LEAKS */" 17850276Speter} 179