1fdd4e1e0SJan Lentfer#! /bin/sh
2*32bb5217SDaniel Fojt# $Id: MKkey_defs.sh,v 1.19 2020/02/02 23:34:34 tom Exp $
3fdd4e1e0SJan Lentfer##############################################################################
4*32bb5217SDaniel Fojt# Copyright 2019,2020 Thomas E. Dickey                                       #
5*32bb5217SDaniel Fojt# Copyright 2001-2013,2017 Free Software Foundation, Inc.                    #
6fdd4e1e0SJan Lentfer#                                                                            #
7fdd4e1e0SJan Lentfer# Permission is hereby granted, free of charge, to any person obtaining a    #
8fdd4e1e0SJan Lentfer# copy of this software and associated documentation files (the "Software"), #
9fdd4e1e0SJan Lentfer# to deal in the Software without restriction, including without limitation  #
10fdd4e1e0SJan Lentfer# the rights to use, copy, modify, merge, publish, distribute, distribute    #
11fdd4e1e0SJan Lentfer# with modifications, sublicense, and/or sell copies of the Software, and to #
12fdd4e1e0SJan Lentfer# permit persons to whom the Software is furnished to do so, subject to the  #
13fdd4e1e0SJan Lentfer# following conditions:                                                      #
14fdd4e1e0SJan Lentfer#                                                                            #
15fdd4e1e0SJan Lentfer# The above copyright notice and this permission notice shall be included in #
16fdd4e1e0SJan Lentfer# all copies or substantial portions of the Software.                        #
17fdd4e1e0SJan Lentfer#                                                                            #
18fdd4e1e0SJan Lentfer# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
19fdd4e1e0SJan Lentfer# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,   #
20fdd4e1e0SJan Lentfer# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL    #
21fdd4e1e0SJan Lentfer# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER      #
22fdd4e1e0SJan Lentfer# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING    #
23fdd4e1e0SJan Lentfer# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER        #
24fdd4e1e0SJan Lentfer# DEALINGS IN THE SOFTWARE.                                                  #
25fdd4e1e0SJan Lentfer#                                                                            #
26fdd4e1e0SJan Lentfer# Except as contained in this notice, the name(s) of the above copyright     #
27fdd4e1e0SJan Lentfer# holders shall not be used in advertising or otherwise to promote the sale, #
28fdd4e1e0SJan Lentfer# use or other dealings in this Software without prior written               #
29fdd4e1e0SJan Lentfer# authorization.                                                             #
30fdd4e1e0SJan Lentfer##############################################################################
31fdd4e1e0SJan Lentfer#
32fdd4e1e0SJan Lentfer# MKkey_defs.sh -- generate function-key definitions for curses.h
33fdd4e1e0SJan Lentfer#
34fdd4e1e0SJan Lentfer# Author: Thomas E. Dickey 2001
35fdd4e1e0SJan Lentfer#
36fdd4e1e0SJan Lentfer# Extract function-key definitions from the Caps file
37fdd4e1e0SJan Lentfer#
38fdd4e1e0SJan Lentfer: ${AWK-awk}
39*32bb5217SDaniel Fojt
40*32bb5217SDaniel Fojttest $# = 0 && set Caps
41fdd4e1e0SJan Lentfer
42fdd4e1e0SJan Lentferdata=data$$
43fdd4e1e0SJan Lentferpass1=pass1_$$
44fdd4e1e0SJan Lentferpass2=pass2_$$
45fdd4e1e0SJan Lentferpass3=pass3_$$
46fdd4e1e0SJan Lentferpass4=pass4_$$
47*32bb5217SDaniel Fojttrap 'rm -f $data pass[1234]_$$' EXIT INT QUIT TERM HUP
48fdd4e1e0SJan Lentfer
49fdd4e1e0SJan Lentfer# change repeated tabs (used for readability) to single tabs (needed to make
50fdd4e1e0SJan Lentfer# awk see the right field alignment of the corresponding columns):
51*32bb5217SDaniel Fojtif sort -k 6 "$@" >$data 2>/dev/null
52fdd4e1e0SJan Lentferthen
53fdd4e1e0SJan Lentfer	# POSIX
54*32bb5217SDaniel Fojt	sed -e 's/[	][	]*/	/g' "$@" |sort -n -k 6 >$data
55*32bb5217SDaniel Fojtelif sort -n +5 "$@" >$data 2>/dev/null
56fdd4e1e0SJan Lentferthen
57fdd4e1e0SJan Lentfer	# SunOS (and SVr4, marked as obsolete but still recognized)
58*32bb5217SDaniel Fojt	sed -e 's/[	][	]*/	/g' "$@" |sort -n +5 >$data
59fdd4e1e0SJan Lentferelse
60fdd4e1e0SJan Lentfer	echo "Your sort utility is broken.  Please install one that works." >&2
61fdd4e1e0SJan Lentfer	exit 1
62fdd4e1e0SJan Lentferfi
63fdd4e1e0SJan Lentfer
64fdd4e1e0SJan Lentfer# add keys that we generate automatically:
65fdd4e1e0SJan Lentfercat >>$data <<EOF
66fdd4e1e0SJan Lentferkey_resize	kr1	str	R1	KEY_RESIZE	+	-----	Terminal resize event
67fdd4e1e0SJan Lentferkey_event	kv1	str	V1	KEY_EVENT	+	-----	We were interrupted by an event
68fdd4e1e0SJan LentferEOF
69fdd4e1e0SJan Lentfer
703468e90cSJohn MarinoTHIS=./`basename $0`
713468e90cSJohn Marino
72fdd4e1e0SJan Lentfercat <<EOF
73fdd4e1e0SJan Lentfer/*
74*32bb5217SDaniel Fojt * These definitions were generated by $THIS $*
75fdd4e1e0SJan Lentfer */
76fdd4e1e0SJan LentferEOF
77fdd4e1e0SJan Lentfer
78fdd4e1e0SJan Lentfer# KEY_RESET
79fdd4e1e0SJan Lentfermaxkey=345
80fdd4e1e0SJan Lentfer
81fdd4e1e0SJan Lentferfor pass in 1 2 3 4
82fdd4e1e0SJan Lentferdo
83fdd4e1e0SJan Lentfer
84fdd4e1e0SJan Lentferoutput=pass${pass}_$$
85fdd4e1e0SJan Lentfer
86fdd4e1e0SJan Lentfer${AWK-awk} >$output <$data '
87fdd4e1e0SJan Lentferfunction print_cols(text,cols) {
88fdd4e1e0SJan Lentfer	printf "%s", text
89fdd4e1e0SJan Lentfer	len = length(text);
90fdd4e1e0SJan Lentfer	while (len < cols) {
91fdd4e1e0SJan Lentfer		printf "	"
92fdd4e1e0SJan Lentfer		len += 8;
93fdd4e1e0SJan Lentfer	}
94fdd4e1e0SJan Lentfer}
95fdd4e1e0SJan Lentferfunction decode(keycode) {
96fdd4e1e0SJan Lentfer	result = 0;
97fdd4e1e0SJan Lentfer	if (substr(keycode, 1, 2) == "0x") {
98fdd4e1e0SJan Lentfer		digits="0123456789abcdef";
99fdd4e1e0SJan Lentfer	} else if (substr(keycode, 1, 1) == "0") {
100fdd4e1e0SJan Lentfer		digits="01234567";
101fdd4e1e0SJan Lentfer	} else {
102fdd4e1e0SJan Lentfer		digits="0123456789";
103fdd4e1e0SJan Lentfer	}
104fdd4e1e0SJan Lentfer	while (length(keycode) != 0) {
105fdd4e1e0SJan Lentfer		digit=substr(keycode, 1, 1);
106fdd4e1e0SJan Lentfer		keycode=substr(keycode, 2);
107fdd4e1e0SJan Lentfer		result = result * length(digits) + index(digits, digit) - 1;
108fdd4e1e0SJan Lentfer	}
109fdd4e1e0SJan Lentfer	return result;
110fdd4e1e0SJan Lentfer}
111fdd4e1e0SJan Lentfer
112fdd4e1e0SJan LentferBEGIN	{
113fdd4e1e0SJan Lentfer	maxkey='$maxkey';
114fdd4e1e0SJan Lentfer	pass='$pass';
115fdd4e1e0SJan Lentfer	key_max=1;
116fdd4e1e0SJan Lentfer	bits=1;
117fdd4e1e0SJan Lentfer	while (key_max < maxkey) {
118fdd4e1e0SJan Lentfer		bits = bits + 1;
119fdd4e1e0SJan Lentfer		key_max = (key_max * 2) + 1;
120fdd4e1e0SJan Lentfer	}
121fdd4e1e0SJan Lentfer	octal_fmt = sprintf ("%%0%do", (bits + 2) / 3 + 1);
122fdd4e1e0SJan Lentfer}
123fdd4e1e0SJan Lentfer
124fdd4e1e0SJan Lentfer/^$/		{next;}
125fdd4e1e0SJan Lentfer/^#/		{next;}
126fdd4e1e0SJan Lentfer/^capalias/	{next;}
127fdd4e1e0SJan Lentfer/^infoalias/	{next;}
128*32bb5217SDaniel Fojt/^used_by/	{next;}
129*32bb5217SDaniel Fojt/^userdef/	{next;}
130fdd4e1e0SJan Lentfer
131fdd4e1e0SJan Lentfer$5 != "-" && $6 != "-" {
132fdd4e1e0SJan Lentfer		if ($6 == "+") {
133fdd4e1e0SJan Lentfer			if (pass == 1 || pass == 2)
134fdd4e1e0SJan Lentfer				next;
135fdd4e1e0SJan Lentfer			thiskey=maxkey + 1;
136fdd4e1e0SJan Lentfer		} else {
137fdd4e1e0SJan Lentfer			if (pass == 3)
138fdd4e1e0SJan Lentfer				next;
139fdd4e1e0SJan Lentfer			thiskey=decode($6);
140fdd4e1e0SJan Lentfer		}
141fdd4e1e0SJan Lentfer		if (thiskey > maxkey)
142fdd4e1e0SJan Lentfer			maxkey = thiskey;
143fdd4e1e0SJan Lentfer		if (pass == 2 || pass == 3) {
144fdd4e1e0SJan Lentfer			showkey=sprintf(octal_fmt, thiskey);
145fdd4e1e0SJan Lentfer			if ($5 == "KEY_F(0)" ) {
146fdd4e1e0SJan Lentfer				printf "#define "
147fdd4e1e0SJan Lentfer				print_cols("KEY_F0", 16);
148fdd4e1e0SJan Lentfer				print_cols(showkey, 16);
149fdd4e1e0SJan Lentfer				print "/* Function keys.  Space for 64 */";
150fdd4e1e0SJan Lentfer				printf "#define "
151fdd4e1e0SJan Lentfer				print_cols("KEY_F(n)", 16);
152fdd4e1e0SJan Lentfer				print_cols("(KEY_F0+(n))", 16);
153fdd4e1e0SJan Lentfer				print "/* Value of function key n */"
154fdd4e1e0SJan Lentfer			} else {
155fdd4e1e0SJan Lentfer				printf "#define "
156fdd4e1e0SJan Lentfer				print_cols($5, 16);
157fdd4e1e0SJan Lentfer				print_cols(showkey, 16);
158fdd4e1e0SJan Lentfer				printf "/*"
159fdd4e1e0SJan Lentfer				for (i = 8; i <= NF; i++)
160fdd4e1e0SJan Lentfer					printf " %s", $i
161fdd4e1e0SJan Lentfer				print " */"
162fdd4e1e0SJan Lentfer			}
163fdd4e1e0SJan Lentfer		}
164fdd4e1e0SJan Lentfer	}
165fdd4e1e0SJan LentferEND	{
166fdd4e1e0SJan Lentfer		if (pass == 1) {
167fdd4e1e0SJan Lentfer			print maxkey;
168fdd4e1e0SJan Lentfer		} else if (pass == 4) {
169fdd4e1e0SJan Lentfer			print "";
170fdd4e1e0SJan Lentfer			printf "#define ";
171fdd4e1e0SJan Lentfer			print_cols("KEY_MAX", 16);
172fdd4e1e0SJan Lentfer			result = sprintf (octal_fmt, key_max);
173fdd4e1e0SJan Lentfer			print_cols(result, 16);
174fdd4e1e0SJan Lentfer			printf "/* Maximum key value is ";
175fdd4e1e0SJan Lentfer			printf octal_fmt, maxkey;
176fdd4e1e0SJan Lentfer			print " */";
177fdd4e1e0SJan Lentfer		}
178fdd4e1e0SJan Lentfer	}
179fdd4e1e0SJan Lentfer'
180fdd4e1e0SJan Lentferif test $pass = 1 ; then
181fdd4e1e0SJan Lentfer	maxkey=`cat $pass1`
182fdd4e1e0SJan Lentferfi
183fdd4e1e0SJan Lentfer
184fdd4e1e0SJan Lentferdone
185fdd4e1e0SJan Lentfer
186fdd4e1e0SJan Lentfercat $pass2
187fdd4e1e0SJan Lentfercat $pass3
188fdd4e1e0SJan Lentfercat $pass4
189