1d8977eafSRong-En Fan# $Id: MKunctrl.awk,v 1.29 2020/02/02 23:34:34 tom Exp $
20e3d5408SPeter Wemm##############################################################################
3d8977eafSRong-En Fan# Copyright 2020 Thomas E. Dickey                                            #
40e3d5408SPeter Wemm# Copyright 1998-2012,2017 Free Software Foundation, Inc.                    #
50e3d5408SPeter Wemm#                                                                            #
60e3d5408SPeter Wemm# Permission is hereby granted, free of charge, to any person obtaining a    #
70e3d5408SPeter Wemm# copy of this software and associated documentation files (the "Software"), #
80e3d5408SPeter Wemm# to deal in the Software without restriction, including without limitation  #
90e3d5408SPeter Wemm# the rights to use, copy, modify, merge, publish, distribute, distribute    #
100e3d5408SPeter Wemm# with modifications, sublicense, and/or sell copies of the Software, and to #
110e3d5408SPeter Wemm# permit persons to whom the Software is furnished to do so, subject to the  #
120e3d5408SPeter Wemm# following conditions:                                                      #
130e3d5408SPeter Wemm#                                                                            #
140e3d5408SPeter Wemm# The above copyright notice and this permission notice shall be included in #
150e3d5408SPeter Wemm# all copies or substantial portions of the Software.                        #
160e3d5408SPeter Wemm#                                                                            #
170e3d5408SPeter Wemm# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
180e3d5408SPeter Wemm# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,   #
190e3d5408SPeter Wemm# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL    #
200e3d5408SPeter Wemm# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER      #
210e3d5408SPeter Wemm# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING    #
220e3d5408SPeter Wemm# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER        #
230e3d5408SPeter Wemm# DEALINGS IN THE SOFTWARE.                                                  #
240e3d5408SPeter Wemm#                                                                            #
250e3d5408SPeter Wemm# Except as contained in this notice, the name(s) of the above copyright     #
260e3d5408SPeter Wemm# holders shall not be used in advertising or otherwise to promote the sale, #
270e3d5408SPeter Wemm# use or other dealings in this Software without prior written               #
280e3d5408SPeter Wemm# authorization.                                                             #
290e3d5408SPeter Wemm##############################################################################
30d8977eafSRong-En Fan#
310e3d5408SPeter Wemm# Author: Thomas E. Dickey (1997-on)
320e3d5408SPeter Wemm#
330e3d5408SPeter Wemm
340e3d5408SPeter WemmBEGIN	{
350e3d5408SPeter Wemm		print "/* generated by MKunctrl.awk */"
360e3d5408SPeter Wemm		print ""
37d8977eafSRong-En Fan		print "#include <curses.priv.h>"
38d8977eafSRong-En Fan		print "#include <ctype.h>"
39d8977eafSRong-En Fan		print ""
40d8977eafSRong-En Fan		print "#undef unctrl"
41d8977eafSRong-En Fan		print ""
42d8977eafSRong-En Fan	}
43d8977eafSRong-En FanEND	{
440e3d5408SPeter Wemm		print "NCURSES_EXPORT(NCURSES_CONST char *) safe_unctrl(SCREEN *sp, chtype ch)"
450e3d5408SPeter Wemm		print "{"
460e3d5408SPeter Wemm		blob=""
470e3d5408SPeter Wemm		offset=0
480e3d5408SPeter Wemm		if (bigstrings) {
497a69bbfbSPeter Wemm			printf "static const short unctrl_table[] = {"
500e3d5408SPeter Wemm		} else {
514a1a9510SRong-En Fan			printf "static const char* const unctrl_table[] = {"
525ca44d1cSRong-En Fan		}
535ca44d1cSRong-En Fan		for ( ch = 0; ch < 256; ch++ ) {
545ca44d1cSRong-En Fan			gap = ","
555ca44d1cSRong-En Fan			part=""
565ca44d1cSRong-En Fan			if ((ch % 8) == 0) {
575ca44d1cSRong-En Fan				printf "\n    "
585ca44d1cSRong-En Fan				if (ch != 0)
590e3d5408SPeter Wemm					blob = blob "\""
600e3d5408SPeter Wemm				blob = blob "\n    \""
615ca44d1cSRong-En Fan			}
625ca44d1cSRong-En Fan			if (bigstrings)
630e3d5408SPeter Wemm				printf "%4d%s", offset, gap;
645ca44d1cSRong-En Fan			if (ch < 32) {
655ca44d1cSRong-En Fan				part = sprintf ("^\\%03o", ch + 64);
665ca44d1cSRong-En Fan				offset = offset + 3;
675ca44d1cSRong-En Fan			} else if (ch == 127) {
685ca44d1cSRong-En Fan				part = "^?";
695ca44d1cSRong-En Fan				offset = offset + 3;
700e3d5408SPeter Wemm			} else if (ch >= 128 && ch < 160) {
715ca44d1cSRong-En Fan				part = sprintf("~\\%03o", ch - 64);
725ca44d1cSRong-En Fan				offset = offset + 3;
730e3d5408SPeter Wemm			} else if (ch == 255) {
745ca44d1cSRong-En Fan				part = "~?";
755ca44d1cSRong-En Fan				offset = offset + 3;
7615589c42SPeter Wemm			} else if (ch >= 160) {
775ca44d1cSRong-En Fan				part = sprintf("M-\\%03o", ch - 128);
785ca44d1cSRong-En Fan				offset = offset + 4;
79d8977eafSRong-En Fan			} else {
80d8977eafSRong-En Fan				gap = gap " "
81d8977eafSRong-En Fan				part = sprintf("\\%03o", ch);
82d8977eafSRong-En Fan				offset = offset + 2;
83d8977eafSRong-En Fan			}
84d8977eafSRong-En Fan			if (ch == 255)
850e3d5408SPeter Wemm				gap = "\n"
860e3d5408SPeter Wemm			else if (((ch + 1) % 8) != 0)
875ca44d1cSRong-En Fan				gap = gap " "
885ca44d1cSRong-En Fan			if (bigstrings) {
890e3d5408SPeter Wemm				blob = blob part "\\0";
900e3d5408SPeter Wemm			} else {
910e3d5408SPeter Wemm				printf "\"%s\"%s", part, gap
920e3d5408SPeter Wemm			}
930e3d5408SPeter Wemm		}
945ca44d1cSRong-En Fan		print "};"
955ca44d1cSRong-En Fan		blob = blob "\"";
965ca44d1cSRong-En Fan
975ca44d1cSRong-En Fan		print ""
985ca44d1cSRong-En Fan		printf "#if NCURSES_EXT_FUNCS\n";
990e3d5408SPeter Wemm		if (bigstrings) {
1000e3d5408SPeter Wemm			blob = blob "\n/* printable values in 128-255 range */"
1015ca44d1cSRong-En Fan			printf "static const short unctrl_c1[] = {"
1024a1a9510SRong-En Fan		} else {
1030e3d5408SPeter Wemm			printf "static const char* const unctrl_c1[] = {"
1045ca44d1cSRong-En Fan		}
105d8977eafSRong-En Fan		for ( ch = 128; ch < 256; ch++ ) {
1065ca44d1cSRong-En Fan			gap = ","
1075ca44d1cSRong-En Fan			if ((ch % 8) == 0) {
1085ca44d1cSRong-En Fan				if (ch != 128)
1095ca44d1cSRong-En Fan					blob = blob "\""
110d8977eafSRong-En Fan				printf "\n    "
1114a1a9510SRong-En Fan				blob = blob "\n    \""
1125ca44d1cSRong-En Fan			}
1135ca44d1cSRong-En Fan			if (bigstrings) {
1145ca44d1cSRong-En Fan				printf "%4d%s", offset, gap;
1154a1a9510SRong-En Fan				part = sprintf("\\%03o\\0", ch);
1165ca44d1cSRong-En Fan				blob = blob part
1175ca44d1cSRong-En Fan				offset = offset + 2;
1185ca44d1cSRong-En Fan				if (((ch + 1) % 8) != 0)
1195ca44d1cSRong-En Fan					gap = gap " "
1205ca44d1cSRong-En Fan			} else {
1215ca44d1cSRong-En Fan				if (ch >= 128) {
1225ca44d1cSRong-En Fan					printf "\"\\%03o\"", ch
1235ca44d1cSRong-En Fan					gap = gap " "
1245ca44d1cSRong-En Fan				}
1255ca44d1cSRong-En Fan				if (ch == 255)
126d8977eafSRong-En Fan					gap = "\n"
1274a1a9510SRong-En Fan				else if (((ch + 1) % 8) != 0)
1284a1a9510SRong-En Fan					gap = gap " "
1294a1a9510SRong-En Fan				printf "%s", gap
1304a1a9510SRong-En Fan			}
1314a1a9510SRong-En Fan		}
1324a1a9510SRong-En Fan		print "};"
1334a1a9510SRong-En Fan		print "#endif /* NCURSES_EXT_FUNCS */"
1344a1a9510SRong-En Fan		blob = blob "\"\n"
1354a1a9510SRong-En Fan
1365ca44d1cSRong-En Fan		print ""
1374a1a9510SRong-En Fan		if (bigstrings) {
138d8977eafSRong-En Fan			print "static const char unctrl_blob[] = "blob";"
1394a1a9510SRong-En Fan			print ""
1404a1a9510SRong-En Fan			stringname = "unctrl_blob + unctrl"
1415ca44d1cSRong-En Fan		} else {
1425ca44d1cSRong-En Fan			stringname = "unctrl"
1435ca44d1cSRong-En Fan		}
1445ca44d1cSRong-En Fan		print  "\tint check = (int) ChCharOf(ch);"
1455ca44d1cSRong-En Fan		print  "\tconst char *result;"
1465ca44d1cSRong-En Fan		print  ""
1475ca44d1cSRong-En Fan		print  "(void) sp;"
1484a1a9510SRong-En Fan		print  "\tif (check >= 0 && check < (int)SIZEOF(unctrl_table)) {"
1494a1a9510SRong-En Fan		print  "#if NCURSES_EXT_FUNCS"
1504a1a9510SRong-En Fan		print  "\t\tif ((sp != 0)"
1515ca44d1cSRong-En Fan		print  "\t\t && (sp->_legacy_coding > 1)"
1524a1a9510SRong-En Fan		print  "\t\t && (check >= 128)"
1534a1a9510SRong-En Fan		print  "\t\t && (check < 160))"
1544a1a9510SRong-En Fan		printf "\t\t\tresult = %s_c1[check - 128];\n", stringname;
1554a1a9510SRong-En Fan		print  "\t\telse"
1564a1a9510SRong-En Fan		print  "\t\tif ((check >= 160)"
1575ca44d1cSRong-En Fan		print  "\t\t && (check < 256)"
1584a1a9510SRong-En Fan		print  "\t\t && ((sp != 0)"
159d8977eafSRong-En Fan		print  "\t\t  && ((sp->_legacy_coding > 0)"
160d8977eafSRong-En Fan		print  "\t\t   || (sp->_legacy_coding == 0"
161d8977eafSRong-En Fan		print  "\t\t       && isprint(check)))))"
162d8977eafSRong-En Fan		printf "\t\t\tresult = %s_c1[check - 128];\n", stringname;
163d8977eafSRong-En Fan		print  "\t\telse"
164d8977eafSRong-En Fan		print  "#endif /* NCURSES_EXT_FUNCS */"
165d8977eafSRong-En Fan		printf "\t\t\tresult = %s_table[check];\n", stringname;
166d8977eafSRong-En Fan		print  "\t} else {"
167d8977eafSRong-En Fan		print  "\t\tresult = 0;"
168d8977eafSRong-En Fan		print  "\t}"
169d8977eafSRong-En Fan		print  "\treturn (NCURSES_CONST char *)result;"
170d8977eafSRong-En Fan		print  "}"
171d8977eafSRong-En Fan		print  ""
172d8977eafSRong-En Fan		print  "NCURSES_EXPORT(NCURSES_CONST char *) unctrl (chtype ch)"
173d8977eafSRong-En Fan		print  "{"
174d8977eafSRong-En Fan		print  "\treturn safe_unctrl(CURRENT_SCREEN, ch);"
175d8977eafSRong-En Fan		print  "}"
176d8977eafSRong-En Fan	}
177d8977eafSRong-En Fan