#!/usr/bin/perl
#
# bit_checker
#
# Checks to make sure the file only contains valid bits.
# Only values of 0 and 1 are considered valid for bits.
#
# usage: bit_checker [<file> [...] ]
#
# Exit code 0 if no errors.
# Nonzero exit code on error.
#
# Assumes an 8-bit per byte system
#
# Inspired by http://thedailywtf.com/Articles/Some-Crazy-Reason.aspx
#
use strict;
use warnings;
sub process {
my ($fh, $name) = @_;
my $error = 0;
my $offset = 0;
local $/ = \(64*1024);
while (my $blk = <$fh>) {
for my $byte_idx ( 0 .. length($blk)-1 ) {
my $byte = ord(substr($blk, $byte_idx, 1));
for my $bit_idx ( reverse 0 .. 7 ) {
my $bit = ( $byte >> $bit_idx ) & 1;
if ($bit != 0 && $bit != 1) {
$error = 1;
warn("Found bad bit ($bit) in $name"
." at pos ".( $offset+$byte_idx ).":$bit_idx"
.\n");
}
}
}
$offset += length($blk);
}
return $error;
}
{
my $error = 0;
if (@ARGV) {
for my $qfn (@ARGV) {
# Raw stream without disabling buffering.
open(my $fh, '<:unix:perlio', $qfn)
or die("Can't open \"$qfn\": $!\n");
$error = process($fh, "file \"$qfn\"") || $error;
}
} else {
binmode(*STDIN);
$error = process(*STDIN, 'STDIN');
}
exit($error);
}
Getting 100% test coverage is going to be hard...