paste64.pl revision d522f475
1#!/usr/bin/perl -w 2# $XTermId: paste64.pl,v 1.9 2006/03/13 01:28:02 tom Exp $ 3# $XFree86: xc/programs/xterm/vttests/paste64.pl,v 1.1 2006/03/13 01:28:02 dickey Exp $ 4# 5# -- Thomas Dickey (2006/3/7) 6# Test the paste64 option of xterm. 7 8use strict; 9 10use Term::ReadKey; 11use IO::Handle; 12use MIME::Base64; 13 14our $target = ""; 15 16sub to_hex($) { 17 my $value = $_[0]; 18 my $result = ""; 19 my $n; 20 21 for ( $n = 0; $n < length($value); ++$n) { 22 $result .= sprintf("%02X", ord substr($value,$n,1)); 23 } 24 return $result; 25} 26 27sub show_string($) { 28 my $value = $_[0]; 29 my $n; 30 31 my $result = ""; 32 for ( $n = 0; $n < length($value); $n += 1) { 33 my $c = ord substr($value,$n,1); 34 if ( $c == ord '\\' ) { 35 $result .= "\\\\"; 36 } elsif ( $c == 0x1b ) { 37 $result .= "\\E"; 38 } elsif ( $c == 0x7f ) { 39 $result .= "^?"; 40 } elsif ( $c == 32 ) { 41 $result .= "\\s"; 42 } elsif ( $c < 32 ) { 43 $result .= sprintf("^%c", $c + 64); 44 } elsif ( $c > 128 ) { 45 $result .= sprintf("\\%03o", $c); 46 } else { 47 $result .= chr($c); 48 } 49 } 50 51 printf "%s\r\n", $result; 52} 53 54sub get_reply($) { 55 my $command = $_[0]; 56 my $reply = ""; 57 58 printf "send: "; 59 show_string($command); 60 61 print STDOUT $command; 62 autoflush STDOUT 1; 63 while (1) { 64 my $test=ReadKey 1; 65 last if not defined $test; 66 #printf "%d:%s\r\n", length($reply), to_hex($test); 67 $reply .= $test; 68 } 69 return $reply; 70} 71 72sub get_paste() { 73 my $reply = get_reply("\x1b]52;" . $target . ";?\x1b\\"); 74 75 printf "read: "; 76 show_string($reply); 77 78 my $data = $reply; 79 $data =~ s/^\x1b]52;[[:alnum:]]*;//; 80 $data =~ s/\x1b\\$//; 81 printf "chop: "; 82 show_string($data); 83 84 $data = decode_base64($data); 85 printf "data: "; 86 show_string($data); 87} 88 89sub put_paste() { 90 ReadMode 1; 91 92 printf "data: "; 93 my $data = ReadLine 0; 94 chomp $data; 95 ReadMode 5; 96 97 $data = encode_base64($data); 98 chomp $data; 99 printf "data: "; 100 show_string($data); 101 102 my $send = "\x1b]52;" . $target . ";" . $data . "\x1b\\"; 103 104 printf "send: "; 105 show_string($send); 106} 107 108sub set_target() { 109 ReadMode 1; 110 111 printf "target: "; 112 $target = ReadLine 0; 113 $target =~ s/[^[:alnum:]]//g; 114 ReadMode 5; 115 printf "result: %s\r\n", $target; 116} 117 118ReadMode 5, 'STDIN'; # allow single-character inputs 119while (1) { 120 my $cmd; 121 122 printf "\r\nCommand (? for help):"; 123 $cmd = ReadKey 0; 124 if ( $cmd eq "?" ) { 125 printf "\r\np=put selection, g=get selection, q=quit, r=reset target, s=set target\r\n"; 126 } elsif ($cmd eq "p") { 127 printf " ...put selection\r\n"; 128 put_paste(); 129 } elsif ($cmd eq "g") { 130 printf " ...get selection\r\n"; 131 get_paste(); 132 } elsif ($cmd eq "q") { 133 printf " ...quit\r\n"; 134 last; 135 } elsif ($cmd eq "r") { 136 printf " ...reset\r\n"; 137 $target = ""; 138 } elsif ($cmd eq "s") { 139 printf " ...set target\r\n"; 140 set_target(); 141 } 142} 143ReadMode 0, 'STDIN'; # Reset tty mode before exiting 144