awful debugging hacking
[dpkg] / dselect / mkcurkeys.pl
CommitLineData
1479465f
GJ
1#!/usr/bin/perl
2#
3# dselect - Debian package maintenance user interface
4# mkcurkeys.pl - generate strings mapping key names to ncurses numbers
5#
6# Copyright © 1995 Ian Jackson <ijackson@chiark.greenend.org.uk>
7#
8# This is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation; either version 2 of the License, or
11# (at your option) any later version.
12#
13# This is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program. If not, see <https://www.gnu.org/licenses/>.
20
21use strict;
22use warnings;
23
24use Scalar::Util qw(looks_like_number);
25
26die 'usage: mkcurkeys.pl <filename> <curses.h>' if @ARGV != 2;
27
28my (%over, %base, %name);
29
30open(my $override_fh, '<', $ARGV[0]) or die $!;
31while (<$override_fh>) {
32 chomp;
33 /^#/ && next; # skip comments
34 /\S/ || next; # ignore blank lines
35 if (/^(\w+)\s+(\S.*\S)\s*$/) {
36 $over{$1} = $2;
37 $base{$1} = '';
38 } else {
39 die "cannot parse line:\n$_\n";
40 }
41}
42close($override_fh);
43
44my $let = 'A';
45for my $i (1 .. 26) {
46 $name{$i}= "^$let";
47 $base{$i}= '';
48 $let++;
49}
50
51my ($k, $v);
52
53open(my $header_fh, '<', $ARGV[1]) or die $!;
54while (<$header_fh>) {
55 s/\s+$//;
56 m/#define KEY_(\w+)\s+\d+\s+/p || next;
57 my $rhs = ${^POSTMATCH};
58 $k= "KEY_$1";
59 $base{$k} = capit($1);
60 $rhs =~ s/(\w)[\(\)]/$1/g;
61 $rhs =~ s/\w+ \((\w+)\)/$1/;
62 next unless $rhs =~ m{^/\* (\w[\w ]+\w) \*/$};
63 my $name = $1;
64 $name =~ s/ key$//;
65 if ($name =~ s/^shifted /shift /) {
66 next if $name =~ m/ .* .* /;
67 } else {
68 next if $name =~ m/ .* /;
69 }
70 $name{$k} = capit($name);
71}
72close($header_fh);
73
74printf(<<'END') or die $!;
75/*
76 * WARNING - THIS FILE IS GENERATED AUTOMATICALLY - DO NOT EDIT
77 * It is generated by mkcurkeys.pl from <curses.h>
78 * and keyoverride. If you want to override things try adding
79 * them to keyoverride.
80 */
81
82END
83
84my ($comma);
85
86for my $i (33 .. 126) {
87 $k= $i;
88 $v = pack('C', $i);
89 if ($v eq ',') { $comma=$k; next; }
90 p($k, $v);
91}
92
93## no critic (BuiltinFunctions::ProhibitReverseSortBlock)
94for my $k (sort {
95 looks_like_number($a) ?
96 looks_like_number($b) ? $a <=> $b : -1
97 : looks_like_number($b) ? 1 :
98 $a cmp $b
99 } keys %base) {
100 ## use critic
101 $v= $base{$k};
102 $v= $name{$k} if defined($name{$k});
103 $v= $over{$k} if defined($over{$k});
104 next if $v eq '[elide]';
105 p($k, $v);
106}
107
108for my $i (1 .. 63) {
109 p("KEY_F($i)", "F$i");
110}
111
112p($comma, ',');
113
114print(<<'END') or die $!;
115 { -1, nullptr }
116END
117
118close(STDOUT) or die $!;
119exit(0);
120
121sub capit {
122 my $str = shift;
123 my $o = '';
124
125 $str =~ y/A-Z/a-z/;
126 $str = " $str";
127 while ($str =~ m/ (\w)/p) {
128 $o .= ${^PREMATCH} . ' ';
129 $str = $1;
130 $str =~ y/a-z/A-Z/;
131 $o .= $str;
132 $str = ${^POSTMATCH};
133 }
134 $str = $o . $str;
135 $str =~ s/^ //;
136
137 return $str;
138}
139
140sub p {
141 my ($k, $v) = @_;
142
143 $v =~ s/(["\\])/\\$1/g;
144 printf(" { %-15s \"%-20s },\n", $k . ',', $v . '"') or die $!;
145}