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