139f2269fSPeter Wemm#! /bin/sh
24a1a9510SRong-En Fan# $Id: MKkey_defs.sh,v 1.21 2020/08/17 10:45:33 tom Exp $
339f2269fSPeter Wemm##############################################################################
44a1a9510SRong-En Fan# Copyright 2019,2020 Thomas E. Dickey                                       #
539f2269fSPeter Wemm# Copyright 2001-2013,2017 Free Software Foundation, Inc.                    #
639f2269fSPeter Wemm#                                                                            #
739f2269fSPeter Wemm# Permission is hereby granted, free of charge, to any person obtaining a    #
839f2269fSPeter Wemm# copy of this software and associated documentation files (the "Software"), #
939f2269fSPeter Wemm# to deal in the Software without restriction, including without limitation  #
1039f2269fSPeter Wemm# the rights to use, copy, modify, merge, publish, distribute, distribute    #
1139f2269fSPeter Wemm# with modifications, sublicense, and/or sell copies of the Software, and to #
1239f2269fSPeter Wemm# permit persons to whom the Software is furnished to do so, subject to the  #
1339f2269fSPeter Wemm# following conditions:                                                      #
1439f2269fSPeter Wemm#                                                                            #
1539f2269fSPeter Wemm# The above copyright notice and this permission notice shall be included in #
1639f2269fSPeter Wemm# all copies or substantial portions of the Software.                        #
1739f2269fSPeter Wemm#                                                                            #
1839f2269fSPeter Wemm# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
1939f2269fSPeter Wemm# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,   #
2039f2269fSPeter Wemm# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL    #
2139f2269fSPeter Wemm# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER      #
2239f2269fSPeter Wemm# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING    #
2339f2269fSPeter Wemm# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER        #
2439f2269fSPeter Wemm# DEALINGS IN THE SOFTWARE.                                                  #
2539f2269fSPeter Wemm#                                                                            #
2639f2269fSPeter Wemm# Except as contained in this notice, the name(s) of the above copyright     #
2739f2269fSPeter Wemm# holders shall not be used in advertising or otherwise to promote the sale, #
2839f2269fSPeter Wemm# use or other dealings in this Software without prior written               #
2939f2269fSPeter Wemm# authorization.                                                             #
3039f2269fSPeter Wemm##############################################################################
3139f2269fSPeter Wemm#
3239f2269fSPeter Wemm# MKkey_defs.sh -- generate function-key definitions for curses.h
334a1a9510SRong-En Fan#
3439f2269fSPeter Wemm# Author: Thomas E. Dickey 2001
3539f2269fSPeter Wemm#
3639f2269fSPeter Wemm# Extract function-key definitions from the Caps file
3739f2269fSPeter Wemm#
3839f2269fSPeter Wemm: ${AWK-awk}
3939f2269fSPeter Wemm
4039f2269fSPeter Wemmtest $# = 0 && set Caps
4139f2269fSPeter Wemm
4239f2269fSPeter Wemmdata=data$$
4339f2269fSPeter Wemmpass1=pass1_$$
4439f2269fSPeter Wemmpass2=pass2_$$
4539f2269fSPeter Wemmpass3=pass3_$$
464a1a9510SRong-En Fanpass4=pass4_$$
474a1a9510SRong-En Fantrap 'rm -f $data pass[1234]_$$' EXIT INT QUIT TERM HUP
484a1a9510SRong-En Fan
494a1a9510SRong-En Fan# change repeated tabs (used for readability) to single tabs (needed to make
504a1a9510SRong-En Fan# awk see the right field alignment of the corresponding columns):
514a1a9510SRong-En Fanif sort -k 6 "$@" >$data 2>/dev/null
524a1a9510SRong-En Fanthen
534a1a9510SRong-En Fan	# POSIX
544a1a9510SRong-En Fan	sed -e 's/[	][	]*/	/g' "$@" |sort -n -k 6 >$data
554a1a9510SRong-En Fanelif sort -n +5 "$@" >$data 2>/dev/null
564a1a9510SRong-En Fanthen
574a1a9510SRong-En Fan	# SunOS (and SVr4, marked as obsolete but still recognized)
584a1a9510SRong-En Fan	sed -e 's/[	][	]*/	/g' "$@" |sort -n +5 >$data
594a1a9510SRong-En Fanelse
604a1a9510SRong-En Fan	echo "Your sort utility is broken.  Please install one that works." >&2
614a1a9510SRong-En Fan	exit 1
624a1a9510SRong-En Fanfi
63b82face1SPeter Wemm
64b82face1SPeter Wemm# add keys that we generate automatically:
654a1a9510SRong-En Fancat >>$data <<EOF
66b82face1SPeter Wemmkey_resize	kr1	str	R1	KEY_RESIZE	+	NCURSES_EXT_FUNCS 	Terminal resize event
6739f2269fSPeter WemmEOF
6839f2269fSPeter Wemm
6939f2269fSPeter WemmTHIS=./`basename $0`
7039f2269fSPeter Wemm
7139f2269fSPeter Wemmcat <<EOF
7239f2269fSPeter Wemm/*
7339f2269fSPeter Wemm * These definitions were generated by $THIS $*
74b82face1SPeter Wemm */
75b82face1SPeter WemmEOF
7639f2269fSPeter Wemm
7739f2269fSPeter Wemm# KEY_RESET
7839f2269fSPeter Wemmmaxkey=345
7939f2269fSPeter Wemm
8039f2269fSPeter Wemmfor pass in 1 2 3 4
8139f2269fSPeter Wemmdo
8239f2269fSPeter Wemm
8339f2269fSPeter Wemmoutput=pass${pass}_$$
8439f2269fSPeter Wemm
8539f2269fSPeter Wemm${AWK-awk} >$output <$data '
8639f2269fSPeter Wemmfunction print_cols(text,cols) {
8739f2269fSPeter Wemm	printf "%s", text
8839f2269fSPeter Wemm	len = length(text);
8939f2269fSPeter Wemm	while (len < cols) {
9039f2269fSPeter Wemm		printf "	"
9139f2269fSPeter Wemm		len += 8;
9239f2269fSPeter Wemm	}
9339f2269fSPeter Wemm}
9439f2269fSPeter Wemmfunction decode(keycode) {
9539f2269fSPeter Wemm	result = 0;
9639f2269fSPeter Wemm	if (substr(keycode, 1, 2) == "0x") {
9739f2269fSPeter Wemm		digits="0123456789abcdef";
9839f2269fSPeter Wemm	} else if (substr(keycode, 1, 1) == "0") {
9939f2269fSPeter Wemm		digits="01234567";
10039f2269fSPeter Wemm	} else {
10139f2269fSPeter Wemm		digits="0123456789";
10239f2269fSPeter Wemm	}
10339f2269fSPeter Wemm	while (length(keycode) != 0) {
10439f2269fSPeter Wemm		digit=substr(keycode, 1, 1);
10539f2269fSPeter Wemm		keycode=substr(keycode, 2);
10639f2269fSPeter Wemm		result = result * length(digits) + index(digits, digit) - 1;
10739f2269fSPeter Wemm	}
10839f2269fSPeter Wemm	return result;
10939f2269fSPeter Wemm}
11039f2269fSPeter Wemm
11139f2269fSPeter WemmBEGIN	{
11239f2269fSPeter Wemm	maxkey='$maxkey';
11339f2269fSPeter Wemm	pass='$pass';
11439f2269fSPeter Wemm	key_max=1;
11539f2269fSPeter Wemm	bits=1;
11639f2269fSPeter Wemm	while (key_max < maxkey) {
11739f2269fSPeter Wemm		bits = bits + 1;
11839f2269fSPeter Wemm		key_max = (key_max * 2) + 1;
11939f2269fSPeter Wemm	}
12039f2269fSPeter Wemm	octal_fmt = sprintf ("%%0%do", (bits + 2) / 3 + 1);
12139f2269fSPeter Wemm}
12239f2269fSPeter Wemm
12339f2269fSPeter Wemm/^$/		{next;}
12439f2269fSPeter Wemm/^#/		{next;}
12539f2269fSPeter Wemm/^capalias/	{next;}
12639f2269fSPeter Wemm/^infoalias/	{next;}
12739f2269fSPeter Wemm/^used_by/	{next;}
12839f2269fSPeter Wemm/^userdef/	{next;}
12939f2269fSPeter Wemm
13039f2269fSPeter Wemm$5 != "-" && $6 != "-" {
13139f2269fSPeter Wemm		if ($6 == "+") {
13239f2269fSPeter Wemm			if (pass == 1 || pass == 2)
13339f2269fSPeter Wemm				next;
13439f2269fSPeter Wemm			thiskey=maxkey + 1;
13539f2269fSPeter Wemm		} else {
13639f2269fSPeter Wemm			if (pass == 3)
13739f2269fSPeter Wemm				next;
13839f2269fSPeter Wemm			thiskey=decode($6);
13939f2269fSPeter Wemm		}
14039f2269fSPeter Wemm		if (thiskey > maxkey)
14139f2269fSPeter Wemm			maxkey = thiskey;
14239f2269fSPeter Wemm		if (pass == 2 || pass == 3) {
14339f2269fSPeter Wemm			showkey=sprintf(octal_fmt, thiskey);
14439f2269fSPeter Wemm			ifdef = 0;
14539f2269fSPeter Wemm			if (index($7,"NCURSES_") == 1) {
14639f2269fSPeter Wemm				ifdef = 1;
14739f2269fSPeter Wemm				printf "\n";
14839f2269fSPeter Wemm				printf "#ifdef %s\n", $7;
14939f2269fSPeter Wemm			}
15039f2269fSPeter Wemm			if ($5 == "KEY_F(0)" ) {
15139f2269fSPeter Wemm				printf "#define "
15239f2269fSPeter Wemm				print_cols("KEY_F0", 16);
15339f2269fSPeter Wemm				print_cols(showkey, 16);
15439f2269fSPeter Wemm				print "/* Function keys.  Space for 64 */";
15539f2269fSPeter Wemm				printf "#define "
15639f2269fSPeter Wemm				print_cols("KEY_F(n)", 16);
15739f2269fSPeter Wemm				print_cols("(KEY_F0+(n))", 16);
15839f2269fSPeter Wemm				print "/* Value of function key n */"
15939f2269fSPeter Wemm			} else {
16039f2269fSPeter Wemm				printf "#define "
16139f2269fSPeter Wemm				print_cols($5, 16);
16239f2269fSPeter Wemm				print_cols(showkey, 16);
16339f2269fSPeter Wemm				printf "/*"
16439f2269fSPeter Wemm				for (i = 8; i <= NF; i++)
16539f2269fSPeter Wemm					printf " %s", $i
16639f2269fSPeter Wemm				print " */"
16739f2269fSPeter Wemm			}
16839f2269fSPeter Wemm			if (ifdef != 0) {
16939f2269fSPeter Wemm				printf "#endif\n";
17039f2269fSPeter Wemm			}
17139f2269fSPeter Wemm		}
17239f2269fSPeter Wemm	}
17339f2269fSPeter WemmEND	{
17439f2269fSPeter Wemm		if (pass == 1) {
17539f2269fSPeter Wemm			print maxkey;
17639f2269fSPeter Wemm		} else if (pass == 4) {
17739f2269fSPeter Wemm			print "";
17839f2269fSPeter Wemm			printf "#define ";
17939f2269fSPeter Wemm			print_cols("KEY_MAX", 16);
18039f2269fSPeter Wemm			result = sprintf (octal_fmt, key_max);
18139f2269fSPeter Wemm			print_cols(result, 16);
18239f2269fSPeter Wemm			printf "/* Maximum key value is ";
183			printf octal_fmt, maxkey;
184			print " */";
185		}
186	}
187'
188if test $pass = 1 ; then
189	maxkey=`cat $pass1`
190fi
191
192done
193
194cat $pass2
195cat $pass3
196cat $pass4
197