Listing of atfsplit2.plx
use warnings; use strict; use utf8;
use Getopt::Long;
use Pod::Usage;
my $base = '';
my $dryrun = 0;
my $install = 0;
my $update = 0;
my $verbose = 0;
my $list = '';
my $stdin = 0;
my $cat = 0;
my $except = 0;
my %print = ();
my $mydir = '';
my $shallow = 0;
my $show_updates = 0;
my @texts = ();
my $use_lexical = 0;
GetOptions('base:s'=>\$base,
'cat+'=>\$cat,
'dir:s'=>\$mydir,
'dryrun+'=>\$dryrun,
'except'=>\$except,
'install'=>\$install,
'list:s'=>\$list,
'shallow'=>\$shallow,
'show-updates'=>\$show_updates,
'text:s'=>\@texts,
'update'=>\$update,
'verbose'=>\$verbose,
) or pod2usage(1);
my $counter = 0;
my $P = '';
my %P = ();
my $printing = 0;
my $dir = $mydir || 'D000';
my @preamble = ();
my $fname = '';
my $current_type = '';
my $old_atf = '';
my $new_atf = '';
my @updates = ();
if ($list) {
open(IN,$list) || die "can't open list file $list\n";
while (<IN>) {
foreach my $n (split(/\s+/)) {
++$print{$n};
}
}
close(IN);
} elsif ($#texts >= 0) {
$list = 'texts';
foreach my $t (@texts) {
++$print{$t};
}
}
if ($install && !length($base)) {
$base = '/usr/local/share/cdl/texts';
}
while (<>) {
s/^\x{ef}\x{bb}\x{bf}//;
if (/^&([PQX]\S+)/) {
if ($P ne $1) {
my $last_P = $P;
$P = $1;
close OUT unless $cat;
if (!$dryrun && $install && $update && $old_atf) {
my $old = slurp($old_atf);
my $new = slurp($new_atf);
if ($old ne $new) {
print STDERR "updating $old_atf\n" if $verbose;
open(OLD,">$old_atf");
print OLD $new;
close(OLD);
push @updates, $last_P;
} else {
print STDERR "$old_atf is unchanged\n" if $verbose;
}
unlink $new;
}
select STDOUT;
print "$fname\n" if $fname && $verbose && !$update;
if ($list && !print_this_p($P)) {
@preamble = ();
$printing = 0;
next;
}
if ($install) {
my $dname = $P;
my $PQ = $P;
$PQ =~ s/^([PQ]).*$/$1/;
$dname =~ s/...$//;
$dname = "$base/$dname/$P";
$fname = "$dname/$P.atf";
if ($dryrun) {
print "$fname\n";
}
if (!$dryrun) {
system("mkdir -p $dname") unless -d $dname;
if ($update) {
$old_atf = $fname;
$new_atf = "$fname.new";
$fname = $new_atf;
}
open(OUT,">$fname") || die "atfsplit.plx: can't write '$fname'\n";
select OUT;
$printing = 1;
print OUT;
chown 48, 48, $fname;
chmod 0664, $fname;
}
} else {
my $samedir = (++$counter % 1000);
if (!$cat && !$samedir) {
++$dir if $dir =~ /\d$/;
system "mkdir -p $dir" if $dir;
}
if (!defined $P{$P}) {
++$P{$P};
$fname = "$P.atf";
$fname = "$dir/$fname" if $dir;
if ($dryrun) {
print "$fname\n";
}
if (!$dryrun) {
if (!$cat) {
if ($dir) {
system "mkdir -p $dir"
|| die "can't mkdir $dir\n";
}
open(OUT,">$fname")
|| die "can't open $fname for write\n";
select OUT;
}
$printing = 1;
print @preamble; @preamble = ();
print;
}
} else {
warn "atfsplit.plx: $P occurs more than once\n";
$printing = 0;
}
}
}
} elsif (/^&/) {
warn "atfsplit.plx: bad &-line '$_'";
$printing = 0;
} else {
print if $printing;
}
}
if ($show_updates) {
select STDOUT;
print join("\n",@updates),"\n";
}
sub
print_this_p {
my $P = shift;
if ($except) {
!$print{$P};
} else {
$print{$P};
}
}
sub
slurp {
my $fn = shift;
local $/ = undef;
open(IN,$fn); my $ret = <IN>; close(IN);
$ret;
}
1;
=head1 NAME
=head1 SYNOPSIS
=head1 OPTIONS
=itemB<-base dir>
=itemB<-cat>
=itemB<-dir>
=itemB<-dryrun>
=itemB<-except>
=itemB<-install>
=itemB<-list filename>
=itemB<-shallow>
=itemB<-show-updates>
=itemB<-update>
=itemB<-verbose>
=back
=head1 DESCRIPTION
=head1 AUTHOR
stinney@sas.upenn.edu
=head1 COPYRIGHT
http://www.gnu.org/copyleft/gpl.html