xref: /freebsd/contrib/ncurses/include/MKkey_defs.sh (revision 21817992b3314c908ab50f0bb88d2ee750b9c4ac)
139f2269fSPeter Wemm#! /bin/sh
2*21817992SBaptiste Daroussin# $Id: MKkey_defs.sh,v 1.24 2024/01/19 12:26:17 tom Exp $
339f2269fSPeter Wemm##############################################################################
4*21817992SBaptiste Daroussin# Copyright 2019-2022,2024 Thomas E. Dickey                                  #
5e1865124SBaptiste Daroussin# 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
3339f2269fSPeter Wemm#
344a1a9510SRong-En Fan# Author: Thomas E. Dickey 2001
3539f2269fSPeter Wemm#
3639f2269fSPeter Wemm# Extract function-key definitions from the Caps file
3739f2269fSPeter Wemm#
38*21817992SBaptiste Daroussin: "${AWK-awk}"
39aae38d10SBaptiste Daroussin
40aae38d10SBaptiste Daroussintest $# = 0 && set Caps
4139f2269fSPeter Wemm
4239f2269fSPeter Wemmdata=data$$
4339f2269fSPeter Wemmpass1=pass1_$$
4439f2269fSPeter Wemmpass2=pass2_$$
4539f2269fSPeter Wemmpass3=pass3_$$
4639f2269fSPeter Wemmpass4=pass4_$$
47*21817992SBaptiste Daroussintrap 'rm -f $data pass[1234]_$$; exit 1' 1 2 3 15
48*21817992SBaptiste Daroussintrap 'rm -f $data pass[1234]_$$' 0
494a1a9510SRong-En Fan
504a1a9510SRong-En Fan# change repeated tabs (used for readability) to single tabs (needed to make
514a1a9510SRong-En Fan# awk see the right field alignment of the corresponding columns):
52aae38d10SBaptiste Daroussinif sort -k 6 "$@" >$data 2>/dev/null
534a1a9510SRong-En Fanthen
544a1a9510SRong-En Fan	# POSIX
55aae38d10SBaptiste Daroussin	sed -e 's/[	][	]*/	/g' "$@" |sort -n -k 6 >$data
56aae38d10SBaptiste Daroussinelif sort -n +5 "$@" >$data 2>/dev/null
574a1a9510SRong-En Fanthen
584a1a9510SRong-En Fan	# SunOS (and SVr4, marked as obsolete but still recognized)
59aae38d10SBaptiste Daroussin	sed -e 's/[	][	]*/	/g' "$@" |sort -n +5 >$data
604a1a9510SRong-En Fanelse
614a1a9510SRong-En Fan	echo "Your sort utility is broken.  Please install one that works." >&2
624a1a9510SRong-En Fan	exit 1
634a1a9510SRong-En Fanfi
644a1a9510SRong-En Fan
654a1a9510SRong-En Fan# add keys that we generate automatically:
66b82face1SPeter Wemmcat >>$data <<EOF
67*21817992SBaptiste Daroussinkey_resize	kr1	str	R1	KEY_RESIZE	+	NCURSES_SIGWINCH 	Terminal resize event
68b82face1SPeter WemmEOF
6939f2269fSPeter Wemm
70*21817992SBaptiste DaroussinTHIS=./`basename "$0"`
7173f0a83dSXin LI
7239f2269fSPeter Wemmcat <<EOF
7339f2269fSPeter Wemm/*
74aae38d10SBaptiste Daroussin * These definitions were generated by $THIS $*
7539f2269fSPeter Wemm */
7639f2269fSPeter WemmEOF
7739f2269fSPeter Wemm
78b82face1SPeter Wemm# KEY_RESET
79b82face1SPeter Wemmmaxkey=345
8039f2269fSPeter Wemm
8139f2269fSPeter Wemmfor pass in 1 2 3 4
8239f2269fSPeter Wemmdo
8339f2269fSPeter Wemm
8439f2269fSPeter Wemmoutput=pass${pass}_$$
8539f2269fSPeter Wemm
8639f2269fSPeter Wemm${AWK-awk} >$output <$data '
8739f2269fSPeter Wemmfunction print_cols(text,cols) {
8839f2269fSPeter Wemm	printf "%s", text
8939f2269fSPeter Wemm	len = length(text);
9039f2269fSPeter Wemm	while (len < cols) {
9139f2269fSPeter Wemm		printf "	"
9239f2269fSPeter Wemm		len += 8;
9339f2269fSPeter Wemm	}
9439f2269fSPeter Wemm}
9539f2269fSPeter Wemmfunction decode(keycode) {
9639f2269fSPeter Wemm	result = 0;
9739f2269fSPeter Wemm	if (substr(keycode, 1, 2) == "0x") {
9839f2269fSPeter Wemm		digits="0123456789abcdef";
9939f2269fSPeter Wemm	} else if (substr(keycode, 1, 1) == "0") {
10039f2269fSPeter Wemm		digits="01234567";
10139f2269fSPeter Wemm	} else {
10239f2269fSPeter Wemm		digits="0123456789";
10339f2269fSPeter Wemm	}
10439f2269fSPeter Wemm	while (length(keycode) != 0) {
10539f2269fSPeter Wemm		digit=substr(keycode, 1, 1);
10639f2269fSPeter Wemm		keycode=substr(keycode, 2);
10739f2269fSPeter Wemm		result = result * length(digits) + index(digits, digit) - 1;
10839f2269fSPeter Wemm	}
10939f2269fSPeter Wemm	return result;
11039f2269fSPeter Wemm}
11139f2269fSPeter Wemm
11239f2269fSPeter WemmBEGIN	{
11339f2269fSPeter Wemm	maxkey='$maxkey';
11439f2269fSPeter Wemm	pass='$pass';
11539f2269fSPeter Wemm	key_max=1;
11639f2269fSPeter Wemm	bits=1;
11739f2269fSPeter Wemm	while (key_max < maxkey) {
11839f2269fSPeter Wemm		bits = bits + 1;
11939f2269fSPeter Wemm		key_max = (key_max * 2) + 1;
12039f2269fSPeter Wemm	}
12139f2269fSPeter Wemm	octal_fmt = sprintf ("%%0%do", (bits + 2) / 3 + 1);
12239f2269fSPeter Wemm}
12339f2269fSPeter Wemm
12439f2269fSPeter Wemm/^$/		{next;}
12539f2269fSPeter Wemm/^#/		{next;}
12639f2269fSPeter Wemm/^capalias/	{next;}
12739f2269fSPeter Wemm/^infoalias/	{next;}
128aae38d10SBaptiste Daroussin/^used_by/	{next;}
129aae38d10SBaptiste Daroussin/^userdef/	{next;}
13039f2269fSPeter Wemm
13139f2269fSPeter Wemm$5 != "-" && $6 != "-" {
13239f2269fSPeter Wemm		if ($6 == "+") {
13339f2269fSPeter Wemm			if (pass == 1 || pass == 2)
13439f2269fSPeter Wemm				next;
13539f2269fSPeter Wemm			thiskey=maxkey + 1;
13639f2269fSPeter Wemm		} else {
13739f2269fSPeter Wemm			if (pass == 3)
13839f2269fSPeter Wemm				next;
13939f2269fSPeter Wemm			thiskey=decode($6);
14039f2269fSPeter Wemm		}
14139f2269fSPeter Wemm		if (thiskey > maxkey)
14239f2269fSPeter Wemm			maxkey = thiskey;
14339f2269fSPeter Wemm		if (pass == 2 || pass == 3) {
14439f2269fSPeter Wemm			showkey=sprintf(octal_fmt, thiskey);
1457a656419SBaptiste Daroussin			ifdef = 0;
1467a656419SBaptiste Daroussin			if (index($7,"NCURSES_") == 1) {
1477a656419SBaptiste Daroussin				ifdef = 1;
1487a656419SBaptiste Daroussin				printf "\n";
149*21817992SBaptiste Daroussin				printf "#if %s\n", $7;
1507a656419SBaptiste Daroussin			}
15139f2269fSPeter Wemm			if ($5 == "KEY_F(0)" ) {
15239f2269fSPeter Wemm				printf "#define "
15339f2269fSPeter Wemm				print_cols("KEY_F0", 16);
15439f2269fSPeter Wemm				print_cols(showkey, 16);
15539f2269fSPeter Wemm				print "/* Function keys.  Space for 64 */";
15639f2269fSPeter Wemm				printf "#define "
15739f2269fSPeter Wemm				print_cols("KEY_F(n)", 16);
15839f2269fSPeter Wemm				print_cols("(KEY_F0+(n))", 16);
15939f2269fSPeter Wemm				print "/* Value of function key n */"
16039f2269fSPeter Wemm			} else {
16139f2269fSPeter Wemm				printf "#define "
16239f2269fSPeter Wemm				print_cols($5, 16);
16339f2269fSPeter Wemm				print_cols(showkey, 16);
16439f2269fSPeter Wemm				printf "/*"
16539f2269fSPeter Wemm				for (i = 8; i <= NF; i++)
16639f2269fSPeter Wemm					printf " %s", $i
16739f2269fSPeter Wemm				print " */"
16839f2269fSPeter Wemm			}
1697a656419SBaptiste Daroussin			if (ifdef != 0) {
1707a656419SBaptiste Daroussin				printf "#endif\n";
1717a656419SBaptiste Daroussin			}
17239f2269fSPeter Wemm		}
17339f2269fSPeter Wemm	}
17439f2269fSPeter WemmEND	{
17539f2269fSPeter Wemm		if (pass == 1) {
17639f2269fSPeter Wemm			print maxkey;
17739f2269fSPeter Wemm		} else if (pass == 4) {
17839f2269fSPeter Wemm			print "";
17939f2269fSPeter Wemm			printf "#define ";
18039f2269fSPeter Wemm			print_cols("KEY_MAX", 16);
18139f2269fSPeter Wemm			result = sprintf (octal_fmt, key_max);
18239f2269fSPeter Wemm			print_cols(result, 16);
18339f2269fSPeter Wemm			printf "/* Maximum key value is ";
18439f2269fSPeter Wemm			printf octal_fmt, maxkey;
18539f2269fSPeter Wemm			print " */";
18639f2269fSPeter Wemm		}
18739f2269fSPeter Wemm	}
18839f2269fSPeter Wemm'
18939f2269fSPeter Wemmif test $pass = 1 ; then
19039f2269fSPeter Wemm	maxkey=`cat $pass1`
19139f2269fSPeter Wemmfi
19239f2269fSPeter Wemm
19339f2269fSPeter Wemmdone
19439f2269fSPeter Wemm
19539f2269fSPeter Wemmcat $pass2
19639f2269fSPeter Wemmcat $pass3
19739f2269fSPeter Wemmcat $pass4
198