forked from Mirrors/freeswitch
150 lines
3.5 KiB
Perl
150 lines
3.5 KiB
Perl
|
#!/usr/local/bin/perl
|
||
|
#
|
||
|
# Heuristically converts line endings to the current OS's preferred format
|
||
|
#
|
||
|
# All existing line endings must be identical (e.g. lf's only, or even
|
||
|
# the accedental cr.cr.lf sequence.) If some lines end lf, and others as
|
||
|
# cr.lf, the file is presumed binary. If the cr character appears anywhere
|
||
|
# except prefixed to an lf, the file is presumed binary. If there is no
|
||
|
# change in the resulting file size, or the file is binary, the conversion
|
||
|
# is discarded.
|
||
|
#
|
||
|
# Todo: Handle NULL stdin characters gracefully.
|
||
|
#
|
||
|
|
||
|
use IO::File;
|
||
|
use File::Find;
|
||
|
|
||
|
# The ignore list is '-' seperated, with this leading hyphen and
|
||
|
# trailing hyphens in ever concatinated list below.
|
||
|
$ignore = "-";
|
||
|
|
||
|
# Image formats
|
||
|
$ignore .= "gif-jpg-jpeg-png-ico-bmp-";
|
||
|
|
||
|
# Archive formats
|
||
|
$ignore .= "tar-gz-z-zip-jar-war-bz2-tgz-";
|
||
|
|
||
|
# Many document formats
|
||
|
$ignore .= "eps-psd-pdf-ai-";
|
||
|
|
||
|
# Some encodings
|
||
|
$ignore .= "ucs2-ucs4-";
|
||
|
|
||
|
# Some binary objects
|
||
|
$ignore .= "class-so-dll-exe-obj-a-o-lo-slo-sl-dylib-";
|
||
|
|
||
|
# Some build env files
|
||
|
$ignore .= "mcp-xdc-ncb-opt-pdb-ilk-sbr-";
|
||
|
|
||
|
$preservedate = 1;
|
||
|
|
||
|
$forceending = 0;
|
||
|
|
||
|
$givenpaths = 0;
|
||
|
|
||
|
$notnative = 0;
|
||
|
|
||
|
while (defined @ARGV[0]) {
|
||
|
if (@ARGV[0] eq '--touch') {
|
||
|
$preservedate = 0;
|
||
|
}
|
||
|
elsif (@ARGV[0] eq '--nocr') {
|
||
|
$notnative = -1;
|
||
|
}
|
||
|
elsif (@ARGV[0] eq '--cr') {
|
||
|
$notnative = 1;
|
||
|
}
|
||
|
elsif (@ARGV[0] eq '--force') {
|
||
|
$forceending = 1;
|
||
|
}
|
||
|
elsif (@ARGV[0] eq '--FORCE') {
|
||
|
$forceending = 2;
|
||
|
}
|
||
|
elsif (@ARGV[0] =~ m/^-/) {
|
||
|
die "What is " . @ARGV[0] . " supposed to mean?\n\n"
|
||
|
. "Syntax:\t$0 [option()s] [path(s)]\n\n" . <<'OUTCH'
|
||
|
Where: paths specifies the top level directory to convert (default of '.')
|
||
|
options are;
|
||
|
|
||
|
--cr keep/add one ^M
|
||
|
--nocr remove ^M's
|
||
|
--touch the datestamp (default: keeps date/attribs)
|
||
|
--force mismatched corrections (unbalanced ^M's)
|
||
|
--FORCE all files regardless of file name!
|
||
|
|
||
|
OUTCH
|
||
|
}
|
||
|
else {
|
||
|
find(\&totxt, @ARGV[0]);
|
||
|
print "scanned " . @ARGV[0] . "\n";
|
||
|
$givenpaths = 1;
|
||
|
}
|
||
|
shift @ARGV;
|
||
|
}
|
||
|
|
||
|
if (!$givenpaths) {
|
||
|
find(\&totxt, '.');
|
||
|
print "did .\n";
|
||
|
}
|
||
|
|
||
|
sub totxt {
|
||
|
$oname = $_;
|
||
|
$tname = '.#' . $_;
|
||
|
if (!-f) {
|
||
|
return;
|
||
|
}
|
||
|
@exts = split /\./;
|
||
|
if ($forceending < 2) {
|
||
|
while ($#exts && ($ext = pop(@exts))) {
|
||
|
if ($ignore =~ m|-$ext-|i) {
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
@ostat = stat($oname);
|
||
|
$srcfl = new IO::File $oname, "r" or die;
|
||
|
$dstfl = new IO::File $tname, "w" or die;
|
||
|
binmode $srcfl;
|
||
|
if ($notnative) {
|
||
|
binmode $dstfl;
|
||
|
}
|
||
|
undef $t;
|
||
|
while (<$srcfl>) {
|
||
|
if (s/(\r*)\n$/\n/) {
|
||
|
$n = length $1;
|
||
|
if (!defined $t) {
|
||
|
$t = $n;
|
||
|
}
|
||
|
if (!$forceending && (($n != $t) || m/\r/)) {
|
||
|
print "mismatch in " .$oname. ":" .$n. " expected " .$t. "\n";
|
||
|
undef $t;
|
||
|
last;
|
||
|
}
|
||
|
elsif ($notnative > 0) {
|
||
|
s/\n$/\r\n/;
|
||
|
}
|
||
|
}
|
||
|
print $dstfl $_;
|
||
|
}
|
||
|
if (defined $t && (tell $srcfl == tell $dstfl)) {
|
||
|
undef $t;
|
||
|
}
|
||
|
undef $srcfl;
|
||
|
undef $dstfl;
|
||
|
if (defined $t) {
|
||
|
unlink $oname or die;
|
||
|
rename $tname, $oname or die;
|
||
|
@anames = ($oname);
|
||
|
if ($preservedate) {
|
||
|
utime $ostat[9], $ostat[9], @anames;
|
||
|
}
|
||
|
chmod $ostat[2] & 07777, @anames;
|
||
|
chown $ostat[5], $ostat[6], @anames;
|
||
|
print "Converted file " . $oname . " to text in " . $File::Find::dir . "\n";
|
||
|
}
|
||
|
else {
|
||
|
unlink $tname or die;
|
||
|
}
|
||
|
}
|