mkcurkeys.pl 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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. use strict;
  21. use warnings;
  22. use Scalar::Util qw(looks_like_number);
  23. die 'usage: mkcurkeys.pl <filename> <curses.h>' if @ARGV != 2;
  24. my (%over, %base, %name);
  25. open(my $override_fh, '<', $ARGV[0]) or die $!;
  26. while (<$override_fh>) {
  27. chomp;
  28. /^#/ && next; # skip comments
  29. /\S/ || next; # ignore blank lines
  30. if (/^(\w+)\s+(\S.*\S)\s*$/) {
  31. $over{$1} = $2;
  32. $base{$1} = '';
  33. } else {
  34. die "cannot parse line:\n$_\n";
  35. }
  36. }
  37. close($override_fh);
  38. my $let = 'A';
  39. for my $i (1 .. 26) {
  40. $name{$i}= "^$let";
  41. $base{$i}= '';
  42. $let++;
  43. }
  44. my ($k, $v);
  45. open(my $header_fh, '<', $ARGV[1]) or die $!;
  46. while (<$header_fh>) {
  47. s/\s+$//;
  48. m/#define KEY_(\w+)\s+\d+\s+/p || next;
  49. my $rhs = ${^POSTMATCH};
  50. $k= "KEY_$1";
  51. $base{$k} = capit($1);
  52. $rhs =~ s/(\w)[\(\)]/$1/g;
  53. $rhs =~ s/\w+ \((\w+)\)/$1/;
  54. next unless $rhs =~ m{^/\* (\w[\w ]+\w) \*/$};
  55. my $name = $1;
  56. $name =~ s/ key$//;
  57. if ($name =~ s/^shifted /shift /) {
  58. next if $name =~ m/ .* .* /;
  59. } else {
  60. next if $name =~ m/ .* /;
  61. }
  62. $name{$k} = capit($name);
  63. }
  64. close($header_fh);
  65. printf(<<'END') or die $!;
  66. /*
  67. * WARNING - THIS FILE IS GENERATED AUTOMATICALLY - DO NOT EDIT
  68. * It is generated by mkcurkeys.pl from <curses.h>
  69. * and keyoverride. If you want to override things try adding
  70. * them to keyoverride.
  71. */
  72. END
  73. my ($comma);
  74. for my $i (33 .. 126) {
  75. $k= $i;
  76. $v = pack('C', $i);
  77. if ($v eq ',') { $comma=$k; next; }
  78. p($k, $v);
  79. }
  80. ## no critic (BuiltinFunctions::ProhibitReverseSortBlock)
  81. for my $k (sort {
  82. looks_like_number($a) ?
  83. looks_like_number($b) ? $a <=> $b : -1
  84. : looks_like_number($b) ? 1 :
  85. $a cmp $b
  86. } keys %base) {
  87. ## use critic
  88. $v= $base{$k};
  89. $v= $name{$k} if defined($name{$k});
  90. $v= $over{$k} if defined($over{$k});
  91. next if $v eq '[elide]';
  92. p($k, $v);
  93. }
  94. for my $i (1 .. 63) {
  95. p("KEY_F($i)", "F$i");
  96. }
  97. p($comma, ',');
  98. print(<<'END') or die $!;
  99. { -1, nullptr }
  100. END
  101. close(STDOUT) or die $!;
  102. exit(0);
  103. sub capit {
  104. my $str = shift;
  105. my $o = '';
  106. $str =~ y/A-Z/a-z/;
  107. $str = " $str";
  108. while ($str =~ m/ (\w)/p) {
  109. $o .= ${^PREMATCH} . ' ';
  110. $str = $1;
  111. $str =~ y/a-z/A-Z/;
  112. $o .= $str;
  113. $str = ${^POSTMATCH};
  114. }
  115. $str = $o . $str;
  116. $str =~ s/^ //;
  117. return $str;
  118. }
  119. sub p {
  120. my ($k, $v) = @_;
  121. $v =~ s/(["\\])/\\$1/g;
  122. printf(" { %-15s \"%-20s },\n", $k . ',', $v . '"') or die $!;
  123. }