#!/usr/bin/perl -w
# yaeolc.pl - Yet Another End Of Line Converter
# v2003.0402 Chris Pressey, Cat's Eye Technologies
#
# SPDX-FileCopyrightText: Chris Pressey, the original author of this work, has dedicated it to the public domain.
# For more information, please refer to <https://unlicense.org/>
# SPDX-License-Identifier: Unlicense
# Why yaeolc.pl?
# - Needed script to massage Befunge source files to sensible EOLs.
# - Needed conversion for mounting MS-DOS partition under FreeBSD.
# - For both of these tasks it is extremely useful to have a script
# which just "readjusts" all text files in the current directory
# to the EOL convention which makes the most sense under the
# current operating system.
# How yaeolc.pl differs from other utilities like it:
# - if no file names are given, converts every file in the current dir
# - recurses into directories if -r switch is given
# - auto-detects file types - will not convert files which look like
# binary or directory files unless they're explicitly forced with -f
# - always converts files to what it considers the current native EOL
# - -crcrlf looks for and xlates the mangled marker 'CR CR LF' => EOL
# usage: [perl] yaeolc[.pl] [-f] [-q] [-r] [-crcrlf] {files}
# history:
# v0.7 Jul 17 2000 - hacked together in primary form.
# v2000.07.18 - added recursive operation into subdirs.
# - improved (GNUified) switches somewhat.
# v2003.0402 - fixed small bug involving -quiet mode
### GLOBALS ###
my $switch = '';
my $force = 0;
my $crcrlf = 0;
my $quiet = 0;
my $recur = 0;
my $file = '';
my $count = 0;
### SUBS ###
sub convert
{
my $file = shift;
my @char = ();
my $q; my $i;
open FILE, $file;
binmode FILE;
while (read(FILE, $q, 1))
{
push @char, ord($q);
}
close FILE;
$i = 0;
while ($i <= $#char)
{
if($char[$i] == 13) # Mac or MS-DOS EOL
{
if($char[$i+1] == 10) # MS-DOS EOL
{
$char[$i] = -2; $i++;
} else # Mac or Mangled EOL
{
if($char[$i+1] == 13 and $char[$i+2] == 10 and $crcrlf)
{ # Mangled EOL
$char[$i] = -3; $i += 2;
} else # Mac EOL
{
$char[$i] = -1;
}
}
} elsif($char[$i] == 10) # Unix EOL
{
$char[$i] = -1;
}
$i++;
}
open FILE, ">$file"; # overwrite file
while (defined($q = shift @char))
{
if ($q < 0)
{
print FILE "\n";
if ($q == -2)
{
$q = shift @char; # ignore second char in EOL
}
elsif ($q == -3)
{
$q = shift @char; # ignore second and third chars
$q = shift @char;
}
} else
{
print FILE chr($q);
}
}
close FILE;
}
sub convertdir
{
my $dir = shift;
my $fh = shift;
my $file;
print "Processing directory: $dir\n" if not $quiet;
opendir $fh, $dir;
while (defined($file = readdir $fh))
{
next if $file eq '..' or $file eq '.';
if (-d "$dir/$file")
{
convertdir("$dir/$file", "_$fh") if $recur;
next;
}
if(not -T "$dir/$file")
{
print "* $dir/$file does not look like a text file\n" if not $quiet;
next if not $force;
}
print "Converting $dir/$file...\n" if not $quiet;
convert "$dir/$file"; $count++;
}
closedir $fh;
}
### MAIN ###
while (defined($ARGV[0]) and $ARGV[0] =~ /^\-\-?(\w+?)$/)
{
$switch = $1; shift @ARGV;
if ($switch eq 'f' or $switch eq 'force') { $force = 1 }
elsif ($switch eq 'q' or $switch eq 'quiet') { $quiet = 1 }
elsif ($switch eq 'r' or $switch eq 'recurse') { $recur = 1 }
elsif ($switch eq 'crcrlf') { $crcrlf = 1 }
else
{
die "Usage: [perl] yaeolc[.pl] [-q] [-f] [-r] [-crcrlf] {files}\n";
}
}
print "yaeolc.pl v2000.07.18 Chris Pressey, Cat's Eye Technologies\n" if not $quiet;
if (defined $ARGV[0])
{
while (defined $ARGV[0])
{
$file = shift @ARGV;
if (-d $file)
{
convertdir($file, 'DIR') if $recur;
next;
}
if(not -T $file)
{
print "* $file does not look like a text file\n" if not $quiet;
next if not $force;
}
print "Converting $file...\n" if not $quiet;
convert $file; $count++;
}
} else
{
convertdir('.', 'DIR');
}
print "Done processing, $count files converted.\n" if not $quiet;
### END ###