Skip to content

Instantly share code, notes, and snippets.

@neomantra
Created January 16, 2023 14:25
Show Gist options
  • Select an option

  • Save neomantra/c999cf9575c9fa3dbc59f789b35afc23 to your computer and use it in GitHub Desktop.

Select an option

Save neomantra/c999cf9575c9fa3dbc59f789b35afc23 to your computer and use it in GitHub Desktop.

Revisions

  1. neomantra created this gist Jan 16, 2023.
    56 changes: 56 additions & 0 deletions sleepy-cat.pl
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,56 @@
    #!/usr/bin/env perl
    # From: https://klipkyle.gitlab.io/blog/2017-10-22-vt100-ani.html
    #
    # scat
    #
    # sleepy-cat - like cat, except delay a little bit to emulate the
    # behavior of an old terminal
    #
    # By default a delay is inserted after every line feed (to emulate
    # screen refresh), and a smaller delay is inserted between every
    # character (to emulate slow baud rate).
    #
    # -nXX sets the newline output rate in frames per second (default is 60)
    # -cXX sets the character output rate in frames per second (default 12800)
    # (set either option to 0 to disable)
    #
    # There are no spaces between the letter option and its number value
    # (i.e. "-c15" is valid, but "-c 15" is not)

    use strict;
    use warnings;
    use Time::HiRes qw(time usleep);
    use List::Util qw(max);

    my $linewait = 1e6 / 60;
    my $charwait = 1e6 / 12800;

    # Parse parameters
    while (defined($ARGV[0]) && $ARGV[0] =~ /^-/) {
    $_ = shift @ARGV;
    if (/^-n(\d+)/) {$linewait = $1 == 0? 0: 1e6 / $1;}
    elsif (/^-c(\d+)/) {$charwait = $1 == 0 ? 0 : 1e6 / $1;}
    elsif (/^-$/) {unshift @ARGV, $_; last}
    elsif (/^--$/) {last;}
    else {die "Unknown parameter $_";}
    }

    if ($charwait > 0) {
    $| = 1;
    while (<>) {
    my $t0 = time();
    foreach (split //, $_) {
    print;
    usleep($charwait);
    }
    my $elapsed = (time() - $t0) * 1e6;
    usleep(max(0, $linewait - $elapsed));
    }
    }
    # If charwait is disabled, we can skip many extra steps.
    else {
    while (<>) {
    print;
    usleep($linewait);
    }
    }