#!/usr/bin/perl -w # Convert text template to RLE string. # # 2017-12-03 use strict; use constant NEWLINE => 33; use constant MIN_CHAR => 35; use constant MAX_CHAR => 91; use constant MIN_SPACE => 93; use constant MAX_SPACE => 126; use constant CHAR_RANGE => MAX_CHAR - MIN_CHAR + 1; use constant SPACE_RANGE => MAX_SPACE - MIN_SPACE + 1; sub flush_char($) { my ($count) = @_; if( $$count > 0 ) { print chr(MIN_CHAR + $$count - 1); $$count = 0; } } sub flush_space($) { my ($count) = @_; if( $$count > 0 ) { print chr(MIN_SPACE + $$count - 1); $$count = 0; } } while( my $line = <> ) { chomp $line; my $space = 0; my $char = 0; foreach my $c (unpack 'C*', $line) { if( chr($c) =~ /\s/ ) { flush_char(\$char); if( $space >= SPACE_RANGE ) { flush_space(\$space); } $space++; } else { flush_space(\$space); if( $char >= CHAR_RANGE ) { flush_char(\$char); } $char++; } } flush_char(\$char); flush_space(\$space); print chr(NEWLINE); } print "\n";