1262685Sdelphij# $Id: MKunctrl.awk,v 1.27 2012/06/09 20:29:33 tom Exp $
250276Speter##############################################################################
3262685Sdelphij# Copyright (c) 1998-2009,2012 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##############################################################################
2950276Speter#
30176187Srafan# Author: Thomas E. Dickey (1997-on)
3150276Speter#
3250276Speter
3350276SpeterBEGIN	{
3450276Speter		print "/* generated by MKunctrl.awk */"
3550276Speter		print ""
3650276Speter		print "#include <curses.priv.h>"
37176187Srafan		print "#include <ctype.h>"
3850276Speter		print ""
3950276Speter		print "#undef unctrl"
4050276Speter		print ""
4150276Speter	}
4250276SpeterEND	{
43262629Sdelphij		print "NCURSES_EXPORT(NCURSES_CONST char *) safe_unctrl(SCREEN *sp, chtype ch)"
4450276Speter		print "{"
45174993Srafan		blob=""
46174993Srafan		offset=0
47174993Srafan		if (bigstrings) {
48174993Srafan			printf "static const short unctrl_table[] = {"
49174993Srafan		} else {
50174993Srafan			printf "static const char* const unctrl_table[] = {"
51174993Srafan		}
5250276Speter		for ( ch = 0; ch < 256; ch++ ) {
5350276Speter			gap = ","
54174993Srafan			part=""
55174993Srafan			if ((ch % 8) == 0) {
5650276Speter				printf "\n    "
57174993Srafan				if (ch != 0)
58174993Srafan					blob = blob "\""
59174993Srafan				blob = blob "\n    \""
60174993Srafan			}
61174993Srafan			if (bigstrings)
62174993Srafan				printf "%4d%s", offset, gap;
6350276Speter			if (ch < 32) {
64174993Srafan				part = sprintf ("^\\%03o", ch + 64);
65174993Srafan				offset = offset + 3;
6650276Speter			} else if (ch == 127) {
67174993Srafan				part = "^?";
68174993Srafan				offset = offset + 3;
6962449Speter			} else if (ch >= 128 && ch < 160) {
70174993Srafan				part = sprintf("~\\%03o", ch - 64);
71174993Srafan				offset = offset + 3;
72176187Srafan			} else if (ch == 255) {
73176187Srafan				part = "~?";
74176187Srafan				offset = offset + 3;
75176187Srafan			} else if (ch >= 160) {
76176187Srafan				part = sprintf("M-\\%03o", ch - 128);
77176187Srafan				offset = offset + 4;
7850276Speter			} else {
7950276Speter				gap = gap " "
80174993Srafan				part = sprintf("\\%03o", ch);
81174993Srafan				offset = offset + 2;
8250276Speter			}
8350276Speter			if (ch == 255)
8450276Speter				gap = "\n"
8550276Speter			else if (((ch + 1) % 8) != 0)
8650276Speter				gap = gap " "
87174993Srafan			if (bigstrings) {
88174993Srafan				blob = blob part "\\0";
89174993Srafan			} else {
90174993Srafan				printf "\"%s\"%s", part, gap
91174993Srafan			}
9250276Speter		}
9350276Speter		print "};"
94174993Srafan		blob = blob "\"";
95166124Srafan
9650276Speter		print ""
97184989Srafan		printf "#if NCURSES_EXT_FUNCS\n";
98174993Srafan		if (bigstrings) {
99176187Srafan			blob = blob "\n/* printable values in 128-255 range */"
100174993Srafan			printf "static const short unctrl_c1[] = {"
101174993Srafan		} else {
102174993Srafan			printf "static const char* const unctrl_c1[] = {"
103174993Srafan		}
104176187Srafan		for ( ch = 128; ch < 256; ch++ ) {
105166124Srafan			gap = ","
106174993Srafan			if ((ch % 8) == 0) {
107174993Srafan				if (ch != 128)
108174993Srafan					blob = blob "\""
109166124Srafan				printf "\n    "
110174993Srafan				blob = blob "\n    \""
111166124Srafan			}
112174993Srafan			if (bigstrings) {
113174993Srafan				printf "%4d%s", offset, gap;
114174993Srafan				part = sprintf("\\%03o\\0", ch);
115174993Srafan				blob = blob part
116174993Srafan				offset = offset + 2;
117174993Srafan				if (((ch + 1) % 8) != 0)
118174993Srafan					gap = gap " "
119174993Srafan			} else {
120176187Srafan				if (ch >= 128) {
121174993Srafan					printf "\"\\%03o\"", ch
122174993Srafan					gap = gap " "
123174993Srafan				}
124174993Srafan				if (ch == 255)
125174993Srafan					gap = "\n"
126174993Srafan				else if (((ch + 1) % 8) != 0)
127174993Srafan					gap = gap " "
128174993Srafan				printf "%s", gap
129174993Srafan			}
130166124Srafan		}
131166124Srafan		print "};"
132184989Srafan		print "#endif /* NCURSES_EXT_FUNCS */"
133176187Srafan		blob = blob "\"\n"
134166124Srafan
135166124Srafan		print ""
136174993Srafan		if (bigstrings) {
137174993Srafan			print "static const char unctrl_blob[] = "blob";"
138174993Srafan			print ""
139174993Srafan			stringname = "unctrl_blob + unctrl"
140174993Srafan		} else {
141174993Srafan			stringname = "unctrl"
142174993Srafan		}
143262685Sdelphij		print  "\tint check = (int) ChCharOf(ch);"
144176187Srafan		print  "\tconst char *result;"
145176187Srafan		print  ""
146176187Srafan		print  "\tif (check >= 0 && check < (int)SIZEOF(unctrl_table)) {"
147176187Srafan		print  "#if NCURSES_EXT_FUNCS"
148184989Srafan		print  "\t\tif ((sp != 0)"
149184989Srafan		print  "\t\t && (sp->_legacy_coding > 1)"
150176187Srafan		print  "\t\t && (check >= 128)"
151176187Srafan		print  "\t\t && (check < 160))"
152174993Srafan		printf "\t\t\tresult = %s_c1[check - 128];\n", stringname;
153176187Srafan		print  "\t\telse"
154176187Srafan		print  "\t\tif ((check >= 160)"
155176187Srafan		print  "\t\t && (check < 256)"
156184989Srafan		print  "\t\t && ((sp != 0)"
157184989Srafan		print  "\t\t  && ((sp->_legacy_coding > 0)"
158184989Srafan		print  "\t\t   || (sp->_legacy_coding == 0"
159176187Srafan		print  "\t\t       && isprint(check)))))"
160176187Srafan		printf "\t\t\tresult = %s_c1[check - 128];\n", stringname;
161176187Srafan		print  "\t\telse"
162176187Srafan		print  "#endif /* NCURSES_EXT_FUNCS */"
163174993Srafan		printf "\t\t\tresult = %s_table[check];\n", stringname;
164176187Srafan		print  "\t} else {"
165176187Srafan		print  "\t\tresult = 0;"
166176187Srafan		print  "\t}"
167176187Srafan		print  "\treturn (NCURSES_CONST char *)result;"
168176187Srafan		print  "}"
169184989Srafan		print  ""
170184989Srafan		print  "NCURSES_EXPORT(NCURSES_CONST char *) unctrl (chtype ch)"
171184989Srafan		print  "{"
172262629Sdelphij		print  "\treturn safe_unctrl(CURRENT_SCREEN, ch);"
173184989Srafan		print  "}"
17450276Speter	}
175