diff options
Diffstat (limited to 'misc-utils/scriptreplay.pl')
-rwxr-xr-x | misc-utils/scriptreplay.pl | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/misc-utils/scriptreplay.pl b/misc-utils/scriptreplay.pl new file mode 100755 index 000000000..ea72b1f3e --- /dev/null +++ b/misc-utils/scriptreplay.pl @@ -0,0 +1,83 @@ +#!/usr/bin/perl -w + +# "script -t" will output a typescript with timings +# this script "scriptreplay" replays it +# run pod2man on it to get a man page + +=head1 NAME + +scriptreplay - play back typescripts, using timing information + +=head1 SYNOPSIS + +scriptreplay timingfile [typescript [divisor]] + +=head1 DESCRIPTION + +This program replays a typescript, using timing information to ensure that +output happens at the same speed as it originally appeared when the script +was recorded. It is only guaranteed to work properly if run on the same +terminal the script was recorded on. + +The timings information is what script outputs to standard error if it is +run with the -t parameter. + +By default, the typescript to display is assumed to be named "typescript", +but other filenames may be specified, as the second parameter. + +If the third parameter exits, it is used as a time divisor. For example, +specifying a divisor of 2 makes the script be replayed twice as fast. + +=head1 EXAMPLE + + % script -t 2> timingfile + Script started, file is typescript + % ls + <etc, etc> + % exit + Script done, file is typescript + % scriptreplay timingfile + +=cut + +use strict; +$|=1; +open (TIMING, shift) + or die "cannot read timing info: $!"; +open (TYPESCRIPT, shift || 'typescript') + or die "cannot read typescript: $!"; +my $divisor=shift || 1; + +# Read starting timestamp line and ignore. +<TYPESCRIPT>; + +my $block; +my $oldblock=''; +while (<TIMING>) { + my ($delay, $blocksize)=split ' ', $_, 2; + # Sleep, unless the delay is really tiny. Really tiny delays cannot + # be accurately done, because the system calls in this loop will + # have more overhead. The 0.0001 is arbitrary, but works fairly well. + if ($delay / $divisor > 0.0001) { + select(undef, undef, undef, $delay / $divisor - 0.0001); + } + + read(TYPESCRIPT, $block, $blocksize) + or die "read failure on typescript: $!"; + print $oldblock; + $oldblock=$block; +} +print $oldblock; + +=head1 SEE ALSO + +script(1) + +=head1 COPYRIGHT + +This program is in the public domain. + +=head1 AUTHOR + +Joey Hess <joey@kitenet.net> + |