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