#!/usr/bin/perl -w use strict; use warnings; use Getopt::Std; use CGenerator; my %o; getopts('ch', \%o); my $cg = CGenerator::new("keys"); my $cond = undef; $cg->hinc("X11/Xlib.h"); $cg->cinc("X11/keysym.h"); $cg->hinc("emulator.h", 1); $cg->hinc("defaults.h", 1); $cg->cinc("curses.h"); $cg->cinc("term.h"); $cg->fund("process_key", "char *", "KeySym keysym", "struct emulate *emulate", "struct terminfo_data *ti"); $cg->fun("process_key", "char *ptr = NULL;"); $cg->fun("process_key", "switch (keysym) {"); my $il = 1; my $i = "\t" x $il; sub di () { $il--; $i = "\t" x $il; } sub ii () { $il++; $i = "\t" x $il; } $cg->fund("get_terminfo_data", "void", "struct terminfo_data *ti"); $cg->fund("print_terminfo_data", "void", "struct terminfo_data *ti"); $cg->fun("get_terminfo_data", "setupterm((char *)D_terminalToEmulate, 1, NULL);"); foreach (<>) { #print $x; next if /^\s*$/; next if /^\s*\#/; if (/^\@(\S*)/) { di; $cg->fun("process_key", "$i}"); (di, $cg->fun("process_key", "$i}")) if $cond; $cond = $1; $cg->fun("process_key", "${i}if (emulate->mode_$cond) {"); ii; $cg->fun("process_key", "${i}switch (keysym) {"); ii; next; } /^\s*(\S*)\s+(\".*\")\s*(\w*)\s*$/; #print "XRebindKeysym(disp, XK_$1, NULL, 0, $2, strlen($2));\n"; if($3) { $cg->struct("terminfo_data", "char *$3"); $cg->fun("get_terminfo_data", "ti->$3 = tigetstr(\"$3\");"); $cg->fun("get_terminfo_data", "if (!ti->$3) ti->$3 = $2;"); $cg->fun("print_terminfo_data", "fprintf(stderr, \"$3: %s\\n\", ti->$3);"); $cg->fun("process_key", "${i}case XK_$1: ptr = ti->$3; break;"); } else { $cg->fun("process_key", "${i}case XK_$1: ptr = $2; break;"); } } (di, $cg->fun("process_key", "$i}")) if $cond; $cg->fun("process_key", "}"); $cg->fun("process_key", "return ptr;"); $cg->show(\%o);