1184989Srafan# $Id: MKkeyname.awk,v 1.40 2008/07/12 18:40:00 tom Exp $
250276Speter##############################################################################
3184989Srafan# Copyright (c) 1999-2007,2008 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>"
34166124Srafan	print "#include <term_entry.h>"
3550276Speter	print ""
36174993Srafan	first = 1;
3750276Speter}
3850276Speter
3950276Speter/^[^#]/ {
40174993Srafan		if (bigstrings) {
41174993Srafan			if (first)  {
42174993Srafan				print "struct kn { short offset; int code; };"
43174993Srafan				print "static const struct kn _nc_key_names[] = {"
44174993Srafan			}
45174993Srafan			printf "\t{ %d, %s },\n", offset, $1
46174993Srafan			offset += length($1) + 1
47174993Srafan			names = names"\n\t\""$1"\\0\""
48174993Srafan		} else {
49174993Srafan			if (first) {
50174993Srafan				print "struct kn { const char *name; int code; };"
51174993Srafan				print "static const struct kn _nc_key_names[] = {"
52174993Srafan			}
53174993Srafan			printf "\t{ \"%s\", %s },\n", $1, $1;
54174993Srafan		}
55174993Srafan		first = 0;
5650276Speter	}
5750276Speter
5850276SpeterEND {
59174993Srafan	if (bigstrings) {
60174993Srafan		printf "\t{ -1, 0 }};\n"
61174993Srafan		print ""
62174993Srafan		print "static const char key_names[] = "names";"
63174993Srafan	} else {
64174993Srafan		printf "\t{ 0, 0 }};\n"
65174993Srafan	}
6650276Speter	print ""
67166124Srafan	print "#define SIZEOF_TABLE 256"
68174993Srafan	print "#define MyTable _nc_globals.keyname_table"
69166124Srafan	print ""
70184989Srafan	print "NCURSES_EXPORT(NCURSES_CONST char *) _nc_keyname (SCREEN *sp, int c)"
7150276Speter	print "{"
72166124Srafan	print "	int i;"
73166124Srafan	print "	char name[20];"
74166124Srafan	print "	char *p;"
75166124Srafan	print "	NCURSES_CONST char *result = 0;"
7650276Speter	print ""
77166124Srafan	print "	if (c == -1) {"
78166124Srafan	print "		result = \"-1\";"
79166124Srafan	print "	} else {"
80174993Srafan	if (bigstrings) {
81174993Srafan		print "		for (i = 0; _nc_key_names[i].offset != -1; i++) {"
82174993Srafan		print "			if (_nc_key_names[i].code == c) {"
83174993Srafan		print "				result = (NCURSES_CONST char *)key_names + _nc_key_names[i].offset;"
84174993Srafan		print "				break;"
85174993Srafan		print "			}"
86174993Srafan		print "		}"
87174993Srafan	} else {
88174993Srafan		print "		for (i = 0; _nc_key_names[i].name != 0; i++) {"
89174993Srafan		print "			if (_nc_key_names[i].code == c) {"
90174993Srafan		print "				result = (NCURSES_CONST char *)_nc_key_names[i].name;"
91174993Srafan		print "				break;"
92174993Srafan		print "			}"
93174993Srafan		print "		}"
94174993Srafan	}
9598503Speter	print ""
96166124Srafan	print "		if (result == 0 && (c >= 0 && c < SIZEOF_TABLE)) {"
97174993Srafan	print "			if (MyTable == 0)"
98174993Srafan	print "				MyTable = typeCalloc(char *, SIZEOF_TABLE);"
99174993Srafan	print "			if (MyTable != 0) {"
100174993Srafan	print "				if (MyTable[c] == 0) {"
101166124Srafan	print "					int cc = c;"
102166124Srafan	print "					p = name;"
103184989Srafan	print "					if (cc >= 128 && (sp == 0 || sp->_use_meta)) {"
104166124Srafan	print "						strcpy(p, \"M-\");"
105166124Srafan	print "						p += 2;"
106166124Srafan	print "						cc -= 128;"
107166124Srafan	print "					}"
108166124Srafan	print "					if (cc < 32)"
109166124Srafan	print "						sprintf(p, \"^%c\", cc + '@');"
110166124Srafan	print "					else if (cc == 127)"
111166124Srafan	print "						strcpy(p, \"^?\");"
112166124Srafan	print "					else"
113166124Srafan	print "						sprintf(p, \"%c\", cc);"
114174993Srafan	print "					MyTable[c] = strdup(name);"
115166124Srafan	print "				}"
116174993Srafan	print "				result = MyTable[c];"
117166124Srafan	print "			}"
118166124Srafan	print "#if NCURSES_EXT_FUNCS && NCURSES_XNAMES"
119166124Srafan	print "		} else if (result == 0 && cur_term != 0) {"
120166124Srafan	print "			int j, k;"
121166124Srafan	print "			char * bound;"
122166124Srafan	print "			TERMTYPE *tp = &(cur_term->type);"
123166124Srafan	print "			int save_trace = _nc_tracing;"
12497049Speter	print ""
125166124Srafan	print "			_nc_tracing = 0;	/* prevent recursion via keybound() */"
126166124Srafan	print "			for (j = 0; (bound = keybound(c, j)) != 0; ++j) {"
127184989Srafan	print "				for(k = STRCOUNT; k < (int) NUM_STRINGS(tp);  k++) {"
128166124Srafan	print "					if (tp->Strings[k] != 0 && !strcmp(bound, tp->Strings[k])) {"
129166124Srafan	print "						result = ExtStrname(tp, k, strnames);"
130166124Srafan	print "						break;"
131166124Srafan	print "					}"
132166124Srafan	print "				}"
133166124Srafan	print "				free(bound);"
134166124Srafan	print "				if (result != 0)"
135166124Srafan	print "					break;"
136166124Srafan	print "			}"
137166124Srafan	print "			_nc_tracing = save_trace;"
138166124Srafan	print "#endif"
139166124Srafan	print "		}"
140166124Srafan	print "	}"
141166124Srafan	print "	return result;"
14250276Speter	print "}"
14397049Speter	print ""
144184989Srafan	print "NCURSES_EXPORT(NCURSES_CONST char *) keyname (int c)"
145184989Srafan	print "{"
146184989Srafan	print "\treturn _nc_keyname(SP, c);"
147184989Srafan	print "}"
148184989Srafan	print ""
149166124Srafan	print "#if NO_LEAKS"
150166124Srafan	print "void _nc_keyname_leaks(void)"
151166124Srafan	print "{"
152166124Srafan	print "	int j;"
153174993Srafan	print "	if (MyTable != 0) {"
154166124Srafan	print "		for (j = 0; j < SIZEOF_TABLE; ++j) {"
155174993Srafan	print "			FreeIfNeeded(MyTable[j]);"
156166124Srafan	print "		}"
157174993Srafan	print "		FreeAndNull(MyTable);"
158166124Srafan	print "	}"
159166124Srafan	print "}"
160166124Srafan	print "#endif /* NO_LEAKS */"
16150276Speter}
162