# $Id: MKkeyname.awk,v 1.48 2013/08/24 17:37:22 tom Exp $
##############################################################################
# Copyright (c) 1999-2012,2013 Free Software Foundation, Inc.                #
#                                                                            #
# Permission is hereby granted, free of charge, to any person obtaining a    #
# copy of this software and associated documentation files (the "Software"), #
# to deal in the Software without restriction, including without limitation  #
# the rights to use, copy, modify, merge, publish, distribute, distribute    #
# with modifications, sublicense, and/or sell copies of the Software, and to #
# permit persons to whom the Software is furnished to do so, subject to the  #
# following conditions:                                                      #
#                                                                            #
# The above copyright notice and this permission notice shall be included in #
# all copies or substantial portions of the Software.                        #
#                                                                            #
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,   #
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL    #
# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER      #
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING    #
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER        #
# DEALINGS IN THE SOFTWARE.                                                  #
#                                                                            #
# Except as contained in this notice, the name(s) of the above copyright     #
# holders shall not be used in advertising or otherwise to promote the sale, #
# use or other dealings in this Software without prior written               #
# authorization.                                                             #
##############################################################################
BEGIN {
	print "/* generated by MKkeyname.awk */"
	print ""
	print "#include <curses.priv.h>"
	print "#include <tic.h>"
	print ""
	first = 1;
}

/^[^#]/ {
		if (bigstrings) {
			if (first)  {
				print "struct kn { short offset; int code; };"
				print "static const struct kn _nc_key_names[] = {"
			}
			printf "\t{ %d, %s },\n", offset, $1
			offset += length($1) + 1
			names = names"\n\t\""$1"\\0\""
		} else {
			if (first) {
				print "struct kn { const char *name; int code; };"
				print "static const struct kn _nc_key_names[] = {"
			}
			printf "\t{ \"%s\", %s },\n", $1, $1;
		}
		first = 0;
	}

END {
	if (bigstrings) {
		printf "\t{ -1, 0 }};\n"
		print ""
		print "static const char key_names[] = "names";"
	} else {
		printf "\t{ 0, 0 }};\n"
	}
	print ""
	print "#define SIZEOF_TABLE 256"
	print "#define MyTable _nc_globals.keyname_table"
	print "#define MyInit  _nc_globals.init_keyname"
	print ""
	print "NCURSES_EXPORT(NCURSES_CONST char *)"
	print "safe_keyname (SCREEN *sp, int c)"
	print "{"
	print "	int i;"
	print "	char name[20];"
	print "	char *p;"
	print "	NCURSES_CONST char *result = 0;"
	print ""
	print "	if (c == -1) {"
	print "		result = \"-1\";"
	print "	} else {"
	if (bigstrings) {
		print "		for (i = 0; _nc_key_names[i].offset != -1; i++) {"
		print "			if (_nc_key_names[i].code == c) {"
		print "				result = (NCURSES_CONST char *)key_names + _nc_key_names[i].offset;"
		print "				break;"
		print "			}"
		print "		}"
	} else {
		print "		for (i = 0; _nc_key_names[i].name != 0; i++) {"
		print "			if (_nc_key_names[i].code == c) {"
		print "				result = (NCURSES_CONST char *)_nc_key_names[i].name;"
		print "				break;"
		print "			}"
		print "		}"
	}
	print ""
	print "		if (result == 0 && (c >= 0 && c < SIZEOF_TABLE)) {"
	print "			if (MyTable == 0)"
	print "				MyTable = typeCalloc(char *, SIZEOF_TABLE);"
	print ""
	print "			if (MyTable != 0) {"
	print "				int m_prefix = (sp == 0 || sp->_use_meta);"
	print ""
	print "				/* if sense of meta() changed, discard cached data */"
	print "				if (MyInit != (m_prefix + 1)) {"
	print "					MyInit = m_prefix + 1;"
	print "					for (i = 0; i < SIZEOF_TABLE; ++i) {"
	print "						if (MyTable[i]) {"
	print "							FreeAndNull(MyTable[i]);"
	print "						}"
	print "					}"
	print "				}"
	print ""
	print "				/* create and cache result as needed */"
	print "				if (MyTable[c] == 0) {"
	print "					int cc = c;"
	print "					p = name;"
	print "#define P_LIMIT (sizeof(name) - (size_t) (p - name))"
	print "					if (cc >= 128 && m_prefix) {"
	print "						_nc_STRCPY(p, \"M-\", P_LIMIT);"
	print "						p += 2;"
	print "						cc -= 128;"
	print "					}"
	print "					if (cc < 32)"
	print "						_nc_SPRINTF(p, _nc_SLIMIT(P_LIMIT) \"^%c\", cc + '@');"
	print "					else if (cc == 127)"
	print "						_nc_STRCPY(p, \"^?\", P_LIMIT);"
	print "					else"
	print "						_nc_SPRINTF(p, _nc_SLIMIT(P_LIMIT) \"%c\", cc);"
	print "					MyTable[c] = strdup(name);"
	print "				}"
	print "				result = MyTable[c];"
	print "			}"
	print "#if NCURSES_EXT_FUNCS && NCURSES_XNAMES"
	print "		} else if (result == 0 && HasTerminal(sp)) {"
	print "			int j, k;"
	print "			char * bound;"
	print "			TERMTYPE *tp = &(TerminalOf(sp)->type);"
	print "			unsigned save_trace = _nc_tracing;"
	print ""
	print "			_nc_tracing = 0;	/* prevent recursion via keybound() */"
	print "			for (j = 0; (bound = NCURSES_SP_NAME(keybound)(NCURSES_SP_ARGx c, j)) != 0; ++j) {"
	print "				for(k = STRCOUNT; k < (int) NUM_STRINGS(tp);  k++) {"
	print "					if (tp->Strings[k] != 0 && !strcmp(bound, tp->Strings[k])) {"
	print "						result = ExtStrname(tp, k, strnames);"
	print "						break;"
	print "					}"
	print "				}"
	print "				free(bound);"
	print "				if (result != 0)"
	print "					break;"
	print "			}"
	print "			_nc_tracing = save_trace;"
	print "#endif"
	print "		}"
	print "	}"
	print "	return result;"
	print "}"
	print ""
	print "NCURSES_EXPORT(NCURSES_CONST char *)"
	print "keyname (int c)"
	print "{"
	print "	return safe_keyname (CURRENT_SCREEN, c);"
	print "}"
	print ""
	print "#if NO_LEAKS"
	print "void _nc_keyname_leaks(void)"
	print "{"
	print "	int j;"
	print "	if (MyTable != 0) {"
	print "		for (j = 0; j < SIZEOF_TABLE; ++j) {"
	print "			FreeIfNeeded(MyTable[j]);"
	print "		}"
	print "		FreeAndNull(MyTable);"
	print "	}"
	print "}"
	print "#endif /* NO_LEAKS */"
}
