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