# $Id: MKunctrl.awk,v 1.23 2008/10/04 21:40:24 tom Exp $
##############################################################################
# Copyright (c) 1998-2007,2008 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.                                                             #
##############################################################################
#
# Author: Thomas E. Dickey (1997-on)
#

BEGIN	{
		print "/* generated by MKunctrl.awk */"
		print ""
		print "#include <curses.priv.h>"
		print "#include <ctype.h>"
		print ""
		print "#if USE_WIDEC_SUPPORT"
		print "#if HAVE_WCTYPE_H"
		print "#include <wctype.h>"
		print "#endif"
		print "#endif"
		print ""
		print "#undef unctrl"
		print ""
	}
END	{
		print "NCURSES_EXPORT(NCURSES_CONST char *) _nc_unctrl (SCREEN *sp, chtype ch)"
		print "{"

		blob=""
		offset=0
		if (bigstrings) {
			printf "static const short unctrl_table[] = {"
		} else {
			printf "static const char* const unctrl_table[] = {"
		}
		for ( ch = 0; ch < 256; ch++ ) {
			gap = ","
			part=""
			if ((ch % 8) == 0) {
				printf "\n    "
				if (ch != 0)
					blob = blob "\""
				blob = blob "\n    \""
			}
			if (bigstrings)
				printf "%4d%s", offset, gap;
			if (ch < 32) {
				part = sprintf ("^\\%03o", ch + 64);
				offset = offset + 3;
			} else if (ch == 127) {
				part = "^?";
				offset = offset + 3;
			} else if (ch >= 128 && ch < 160) {
				part = sprintf("~\\%03o", ch - 64);
				offset = offset + 3;
			} else if (ch == 255) {
				part = "~?";
				offset = offset + 3;
			} else if (ch >= 160) {
				part = sprintf("M-\\%03o", ch - 128);
				offset = offset + 4;
			} else {
				gap = gap " "
				part = sprintf("\\%03o", ch);
				offset = offset + 2;
			}
			if (ch == 255)
				gap = "\n"
			else if (((ch + 1) % 8) != 0)
				gap = gap " "
			if (bigstrings) {
				blob = blob part "\\0";
			} else {
				printf "\"%s\"%s", part, gap
			}
		}
		print "};"
		blob = blob "\"";

		print ""
		printf "#if NCURSES_EXT_FUNCS\n";
		if (bigstrings) {
			blob = blob "\n/* printable values in 128-255 range */"
			printf "static const short unctrl_c1[] = {"
		} else {
			printf "static const char* const unctrl_c1[] = {"
		}
		for ( ch = 128; ch < 256; ch++ ) {
			gap = ","
			if ((ch % 8) == 0) {
				if (ch != 128)
					blob = blob "\""
				printf "\n    "
				blob = blob "\n    \""
			}
			if (bigstrings) {
				printf "%4d%s", offset, gap;
				part = sprintf("\\%03o\\0", ch);
				blob = blob part
				offset = offset + 2;
				if (((ch + 1) % 8) != 0)
					gap = gap " "
			} else {
				if (ch >= 128) {
					printf "\"\\%03o\"", ch
					gap = gap " "
				}
				if (ch == 255)
					gap = "\n"
				else if (((ch + 1) % 8) != 0)
					gap = gap " "
				printf "%s", gap
			}
		}
		print "};"
		print "#endif /* NCURSES_EXT_FUNCS */"
		blob = blob "\"\n"

		print ""
		if (bigstrings) {
			print "static const char unctrl_blob[] = "blob";"
			print ""
			stringname = "unctrl_blob + unctrl"
		} else {
			stringname = "unctrl"
		}
		print  "\tint check = ChCharOf(ch);"
		print  "\tconst char *result;"
		print  ""
		print  "\tif (check >= 0 && check < (int)SIZEOF(unctrl_table)) {"
		print  "#if NCURSES_EXT_FUNCS"
		print  "\t\tif ((sp != 0)"
		print  "\t\t && (sp->_legacy_coding > 1)"
		print  "\t\t && (check >= 128)"
		print  "\t\t && (check < 160))"
		printf "\t\t\tresult = %s_c1[check - 128];\n", stringname;
		print  "\t\telse"
		print  "#if USE_WIDEC_SUPPORT"
		print  "\t\tif ((check >= 160)"
		print  "\t\t && (check < 256)"
		print  "\t\t && ((sp != 0)"
		print  "\t\t  && ((sp->_legacy_coding > 0)"
		print  "\t\t   || (sp->_legacy_coding == 0"
		print  "\t\t       && (isprint(check) || iswprint(check))))))"
		printf "\t\t\tresult = %s_c1[check - 128];\n", stringname;
		print  "\t\telse"
		print  "#else"
		print  "\t\tif ((check >= 160)"
		print  "\t\t && (check < 256)"
		print  "\t\t && ((sp != 0)"
		print  "\t\t  && ((sp->_legacy_coding > 0)"
		print  "\t\t   || (sp->_legacy_coding == 0"
		print  "\t\t       && isprint(check)))))"
		printf "\t\t\tresult = %s_c1[check - 128];\n", stringname;
		print  "\t\telse"
		print  "#endif /* USE_WIDEC_SUPPORT */"
		print  "#endif /* NCURSES_EXT_FUNCS */"
		printf "\t\t\tresult = %s_table[check];\n", stringname;
		print  "\t} else {"
		print  "\t\tresult = 0;"
		print  "\t}"
		print  "\treturn (NCURSES_CONST char *)result;"
		print  "}"
		print  ""
		print  "NCURSES_EXPORT(NCURSES_CONST char *) unctrl (chtype ch)"
		print  "{"
		print  "\treturn _nc_unctrl(SP, ch);"
		print  "}"
	}
