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