#!/usr/bin/env perl use utf8; ############################################################################### # This program converts a stream o punch cards. # # Copyright © 2016 Richard Lesh. All rights reserved. ############################################################################### use Utils; use strict; use warnings; our $LINE_WIDTH = 78; our $LEFT_HALF_BLOCK = "\x{258c}"; our $HORIZONTAL_LINE = "\x{2500}"; our $VERTICAL_LINE = "\x{2502}"; our $TOP_LEFT = "\x{250C}"; our $TOP_RIGHT = "\x{2510}"; our $BOTTOM_LEFT = "\x{2514}"; our $BOTTOM_RIGHT = "\x{2518}"; our $LEFT_TEE = "\x{251C}"; our $RIGHT_TEE = "\x{2524}"; our $first = 1; sub print_divider { my ($first, $last) = @_; print ($first ? $TOP_LEFT : ($last ? $BOTTOM_LEFT : $LEFT_TEE)); for (my $i = 0; $i < $LINE_WIDTH; ++$i) { print $HORIZONTAL_LINE; } print $first ? $TOP_RIGHT : ($last ? $BOTTOM_RIGHT : $RIGHT_TEE), "\n"; } sub printcard { my ($s) = @_; print_divider($first, 0); $first = 0; for (my $mask = 128; $mask > 0; $mask = Utils::rshift32($mask, 1)) { print $VERTICAL_LINE; foreach my $c (split('', $s)) { my $c2 = (Utils::bitwiseAnd32(ord($c), $mask)) != 0 ? $LEFT_HALF_BLOCK : " "; print $c2; } print $VERTICAL_LINE, "\n"; } } MAIN: { binmode(STDOUT, ":utf8"); binmode(STDERR, ":utf8"); binmode(STDIN, ":utf8"); my $count = 0; my $s = ""; my $c; while (defined($c = Utils::getchar(*STDIN))) { $s .= chr($c); ++$count; if ($count % $LINE_WIDTH == 0) { printcard($s); $s = ""; } } if (length($s) > 0) { for (my $i = length($s); $i < $LINE_WIDTH; ++$i) { $s .= "\x00"; } printcard($s); } print_divider(0, 1); }