#!/usr/bin/perl # -*- perl -*- my $version_banner = < \$force_even, "save|s" => \$force_save, "nostrip|n|p" => \$nostrip, "help" => \$help_flag, "version" => \$version_flag, ) or usage(1); if ($version_flag) { print STDERR $version_banner; exit 0; } usage(0) if $help_flag or $#ARGV == -1; if ($force_save) { $save = "/#psjoin-save# save def %psjoin\n"; $restore = "#psjoin-save# restore %psjoin\n"; } my (@prolog, $prolog_inx, @trailer, @comments, @pages); if ($nostrip) { $prolog_inx = 9999; $prolog[$prolog_inx] = "% psjoin: don't strip\n"; $trailer[$prolog_inx] = "% psjoin: don't strip\n"; } else { for (my $i = 0; $i <= $#ARGV; $i++) { open(IN, $ARGV[$i]) || die "$0: can't open \"$ARGV[$i]\" ($!)"; my $in_comment = 1; my $in_prolog = 1; my $in_trailer = 0; $comments[$i] = ""; $prolog[$i] = ""; $trailer[$i] = ""; $pages[$i] = 0; while () { next if /^%%BeginDocument/ .. /^%%EndDocument/; if ($in_comment) { next if /^%!PS-Adobe-/; next if /^%%Title/; next if /^%%Pages/; next if /^%%Creator/; $in_comment = 0 if /^%%EndComments/; $comments[$i] .= $_; next; } elsif ($in_prolog) { if (/^%%Page:/) { $in_prolog = 0; } else { $prolog[$i] .= $_; next; } } $in_trailer = 1 if /^%%Trailer/; if ($in_trailer) { $trailer[$i] .= $_; next; } $pages[$i]++ if /^%%Page:/; } close(IN); if ($prolog[$i]) { for (my $j = 0; $j < $i; $j++) { if ($prolog[$j] eq $prolog[$i]) { $pages[$j] += $pages[$i]; last; } } } } my $largest = 0; $prolog_inx = 0; for (my $i = 0; $i <= $#ARGV; $i++) { my $size = length($prolog[$i]) * $pages[$i]; if ($largest < $size) { $largest = $size; $prolog_inx = $i; } } } my @files = @ARGV; @files = map basename($_), @ARGV; print <) { if (/^%%BeginDocument/ .. /^%%EndDocument/) { # s/^(%[%!])/% \1/; print $_; } else { if ($in_comment) { $in_comment = 0 if /^%%EndComments/; } elsif ($in_prolog) { if (/^%%Page:/) { $in_prolog = 0; } else { next; } } $in_trailer = 1 if !$nostrip && /^%%Trailer/; next if $in_trailer; if (/^%%Page:/) { if ($saved) { print $trailer[$i]; print $restore; $saved = 0; } $pages++; $total_pages++; say "\n%%Page: ($i-$pages) $total_pages"; if (!defined($prolog[$i]) || $prolog[$i] ne $prolog[$prolog_inx]) { print $save; print $prolog[$i] if defined($prolog[$i]); $saved = 1; } elsif ($force_save) { print $save; } } else { s/^(%[%!])/% $1/; print $_; } } } close(IN); if ($force_even && $pages % 2 != 0) { $pages++; $total_pages++; print <