acme/bin/w+

64 lines
995 B
Text
Raw Normal View History

2017-01-26 19:29:57 +03:00
#!/usr/bin/env perl
use strict;
use warnings;
use feature 'say';
use utf8;
use open qw(:std :utf8);
my $WIDTH_DEFAULT = 80;
my $WIDTH = $ARGV[0] || $WIDTH_DEFAULT;
sub main {
my $buf = '';
while (my $line = <STDIN>) {
if ($line =~ /^\s+$/) {
say $buf;
say '' if ($buf);
$buf = '';
next;
}
if ($buf) {
$line = $buf . $line;
}
my ($head, $tail) = handle_str($line);
say $head;
$buf = handle_buf($tail);
}
say $buf if $buf;
}
sub handle_buf {
my $buf = shift;
my $len = length($buf);
if ($len == $WIDTH) {
say $buf;
return '';
}
if ($len < $WIDTH) {
return $buf;
}
## $len > $WIDTH
my ($head, $tail) = handle_str($buf);
say $head;
handle_buf($tail);
}
sub handle_str {
my $str = shift;
if ($str =~ m/^(.{0,$WIDTH})\s(.*)$/) {
return ($1, $2);
}
## no spaces here: 0..$WIDTH
if ($str =~ m/^(\S*)\s(.*)$/) {
return ($1, $2);
}
## no whitespace at all
if ($str =~ m/^(\S+)$/) {
return ($1, '');
}
die "ooops!";
}
main();