1184989Srafan# $Id: MKunctrl.awk,v 1.23 2008/10/04 21:40:24 tom Exp $
250276Speter##############################################################################
3176187Srafan# Copyright (c) 1998-2007,2008 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 ""
39176187Srafan		print "#if USE_WIDEC_SUPPORT"
40176187Srafan		print "#if HAVE_WCTYPE_H"
41176187Srafan		print "#include <wctype.h>"
42176187Srafan		print "#endif"
43176187Srafan		print "#endif"
44176187Srafan		print ""
4550276Speter		print "#undef unctrl"
4650276Speter		print ""
4750276Speter	}
4850276SpeterEND	{
49184989Srafan		print "NCURSES_EXPORT(NCURSES_CONST char *) _nc_unctrl (SCREEN *sp, chtype ch)"
5050276Speter		print "{"
51166124Srafan
52174993Srafan		blob=""
53174993Srafan		offset=0
54174993Srafan		if (bigstrings) {
55174993Srafan			printf "static const short unctrl_table[] = {"
56174993Srafan		} else {
57174993Srafan			printf "static const char* const unctrl_table[] = {"
58174993Srafan		}
5950276Speter		for ( ch = 0; ch < 256; ch++ ) {
6050276Speter			gap = ","
61174993Srafan			part=""
62174993Srafan			if ((ch % 8) == 0) {
6350276Speter				printf "\n    "
64174993Srafan				if (ch != 0)
65174993Srafan					blob = blob "\""
66174993Srafan				blob = blob "\n    \""
67174993Srafan			}
68174993Srafan			if (bigstrings)
69174993Srafan				printf "%4d%s", offset, gap;
7050276Speter			if (ch < 32) {
71174993Srafan				part = sprintf ("^\\%03o", ch + 64);
72174993Srafan				offset = offset + 3;
7350276Speter			} else if (ch == 127) {
74174993Srafan				part = "^?";
75174993Srafan				offset = offset + 3;
7662449Speter			} else if (ch >= 128 && ch < 160) {
77174993Srafan				part = sprintf("~\\%03o", ch - 64);
78174993Srafan				offset = offset + 3;
79176187Srafan			} else if (ch == 255) {
80176187Srafan				part = "~?";
81176187Srafan				offset = offset + 3;
82176187Srafan			} else if (ch >= 160) {
83176187Srafan				part = sprintf("M-\\%03o", ch - 128);
84176187Srafan				offset = offset + 4;
8550276Speter			} else {
8650276Speter				gap = gap " "
87174993Srafan				part = sprintf("\\%03o", ch);
88174993Srafan				offset = offset + 2;
8950276Speter			}
9050276Speter			if (ch == 255)
9150276Speter				gap = "\n"
9250276Speter			else if (((ch + 1) % 8) != 0)
9350276Speter				gap = gap " "
94174993Srafan			if (bigstrings) {
95174993Srafan				blob = blob part "\\0";
96174993Srafan			} else {
97174993Srafan				printf "\"%s\"%s", part, gap
98174993Srafan			}
9950276Speter		}
10050276Speter		print "};"
101174993Srafan		blob = blob "\"";
102166124Srafan
10350276Speter		print ""
104184989Srafan		printf "#if NCURSES_EXT_FUNCS\n";
105174993Srafan		if (bigstrings) {
106176187Srafan			blob = blob "\n/* printable values in 128-255 range */"
107174993Srafan			printf "static const short unctrl_c1[] = {"
108174993Srafan		} else {
109174993Srafan			printf "static const char* const unctrl_c1[] = {"
110174993Srafan		}
111176187Srafan		for ( ch = 128; ch < 256; ch++ ) {
112166124Srafan			gap = ","
113174993Srafan			if ((ch % 8) == 0) {
114174993Srafan				if (ch != 128)
115174993Srafan					blob = blob "\""
116166124Srafan				printf "\n    "
117174993Srafan				blob = blob "\n    \""
118166124Srafan			}
119174993Srafan			if (bigstrings) {
120174993Srafan				printf "%4d%s", offset, gap;
121174993Srafan				part = sprintf("\\%03o\\0", ch);
122174993Srafan				blob = blob part
123174993Srafan				offset = offset + 2;
124174993Srafan				if (((ch + 1) % 8) != 0)
125174993Srafan					gap = gap " "
126174993Srafan			} else {
127176187Srafan				if (ch >= 128) {
128174993Srafan					printf "\"\\%03o\"", ch
129174993Srafan					gap = gap " "
130174993Srafan				}
131174993Srafan				if (ch == 255)
132174993Srafan					gap = "\n"
133174993Srafan				else if (((ch + 1) % 8) != 0)
134174993Srafan					gap = gap " "
135174993Srafan				printf "%s", gap
136174993Srafan			}
137166124Srafan		}
138166124Srafan		print "};"
139184989Srafan		print "#endif /* NCURSES_EXT_FUNCS */"
140176187Srafan		blob = blob "\"\n"
141166124Srafan
142166124Srafan		print ""
143174993Srafan		if (bigstrings) {
144174993Srafan			print "static const char unctrl_blob[] = "blob";"
145174993Srafan			print ""
146174993Srafan			stringname = "unctrl_blob + unctrl"
147174993Srafan		} else {
148174993Srafan			stringname = "unctrl"
149174993Srafan		}
150176187Srafan		print  "\tint check = ChCharOf(ch);"
151176187Srafan		print  "\tconst char *result;"
152176187Srafan		print  ""
153176187Srafan		print  "\tif (check >= 0 && check < (int)SIZEOF(unctrl_table)) {"
154176187Srafan		print  "#if NCURSES_EXT_FUNCS"
155184989Srafan		print  "\t\tif ((sp != 0)"
156184989Srafan		print  "\t\t && (sp->_legacy_coding > 1)"
157176187Srafan		print  "\t\t && (check >= 128)"
158176187Srafan		print  "\t\t && (check < 160))"
159174993Srafan		printf "\t\t\tresult = %s_c1[check - 128];\n", stringname;
160176187Srafan		print  "\t\telse"
161176187Srafan		print  "#if USE_WIDEC_SUPPORT"
162176187Srafan		print  "\t\tif ((check >= 160)"
163176187Srafan		print  "\t\t && (check < 256)"
164184989Srafan		print  "\t\t && ((sp != 0)"
165184989Srafan		print  "\t\t  && ((sp->_legacy_coding > 0)"
166184989Srafan		print  "\t\t   || (sp->_legacy_coding == 0"
167176187Srafan		print  "\t\t       && (isprint(check) || iswprint(check))))))"
168176187Srafan		printf "\t\t\tresult = %s_c1[check - 128];\n", stringname;
169176187Srafan		print  "\t\telse"
170176187Srafan		print  "#else"
171176187Srafan		print  "\t\tif ((check >= 160)"
172176187Srafan		print  "\t\t && (check < 256)"
173184989Srafan		print  "\t\t && ((sp != 0)"
174184989Srafan		print  "\t\t  && ((sp->_legacy_coding > 0)"
175184989Srafan		print  "\t\t   || (sp->_legacy_coding == 0"
176176187Srafan		print  "\t\t       && isprint(check)))))"
177176187Srafan		printf "\t\t\tresult = %s_c1[check - 128];\n", stringname;
178176187Srafan		print  "\t\telse"
179176187Srafan		print  "#endif /* USE_WIDEC_SUPPORT */"
180176187Srafan		print  "#endif /* NCURSES_EXT_FUNCS */"
181174993Srafan		printf "\t\t\tresult = %s_table[check];\n", stringname;
182176187Srafan		print  "\t} else {"
183176187Srafan		print  "\t\tresult = 0;"
184176187Srafan		print  "\t}"
185176187Srafan		print  "\treturn (NCURSES_CONST char *)result;"
186176187Srafan		print  "}"
187184989Srafan		print  ""
188184989Srafan		print  "NCURSES_EXPORT(NCURSES_CONST char *) unctrl (chtype ch)"
189184989Srafan		print  "{"
190184989Srafan		print  "\treturn _nc_unctrl(SP, ch);"
191184989Srafan		print  "}"
19250276Speter	}
193