#!/usr/bin/perl use strict; use warnings; use IO::Handle; our %flag; our (@order, @order_final_maybe); our $verbose=0; # we don't use Getopt::Long because we want to be quick to start up # and we're not really a very user-facing utility while (@ARGV && $ARGV[0] =~ m/^\-/) { $_ = shift @ARGV; if (s/^-U//) { $flag{$_}{Result} = 0; push @order_final_maybe, $_; } elsif (s/^-D//) { $flag{$_}{Result} = 1; push @order_final_maybe, $_; } elsif (m/^-v$/) { $verbose = 1; } elsif (m/^--$/) { last; } else { die "$0: bad option\n"; } } @ARGV==3 or die "$0: bad usage\n"; foreach my $ix (qw(0 1 2)) { open F, '<', $ARGV[$ix] or die "$ix $!"; while () { chomp or die; $flag{$_}{Input}[$ix] = 1; my $ff = $flag{$_}; push @order, $_ unless $ff->{InOrder}++; } F->error and die $!; close F or die $!; } foreach $_ (@order_final_maybe) { push @order, $_ unless $flag{$_}{InOrder}++; } my $current = $ARGV[0]; open O, '>', "$current.tmp" or die "$current.tmp $!"; foreach $_ (@order) { my $ff = $flag{$_}; if (!defined $ff->{Result}) { my $s = ''; foreach my $ix (qw(0 1 2)) { $ff->{Input}[$ix] ||= 0; $s .= $ff->{Input}[$ix]; } if ($verbose) { print STDERR "MERGE-LISTS $s $_\n" or die $!; } $ff->{Result} = $s eq '000' ? '000' : $s eq '111' ? '111' : !$ff->{Input}[1]; } if ($ff->{Result}) { print O "$_\n" or die $!; } } close O or die $!; rename "$current.tmp", "$current" or die "$current $!"; exit 0;