--- psutils/psmerge.pl.new 2006-06-12 09:53:37.000000000 +0200 +++ psutils/psmerge.pl 2006-06-12 09:53:47.000000000 +0200 @@ -1,11 +1,19 @@ -@PERL@ +#!/usr/bin/perl +eval 'exec perl -S $0 "$@"' + if (1 == 0); + # psmerge: merge PostScript files produced by same application and setup -# usage: psmerge [-oout.ps] [-thorough] file1.ps file2.ps ... +# usage: psmerge [-oout.ps] file1.ps file2.ps ... # # Copyright (C) Angus J. C. Duggan 1991-1995 # See file LICENSE for details. +# +# Unbroken (or, broken in a different way that at least sometimes +# works) by Peter Williams 2003 + -$prog = ($0 =~ s=.*/==); +$prog = $0; +$prog =~ s=.*/==; while ($ARGV[0] =~ /^-/) { $_ = shift; @@ -14,72 +22,75 @@ print STDERR "$prog: can't open $1 for output\n"; exit 1; } - } elsif (/^-t(horough)?$/) { - $thorough = 1; } else { - print STDERR "Usage: $prog [-oout] [-thorough] file...\n"; + print STDERR "Usage: $prog [-oout] file1 file2...\n"; exit 1; } } $page = 0; $first = 1; +$seenpages = 0; $nesting = 0; -@header = (); -$header = 1; - @trailer = (); -$trailer = 0; - -@pages = (); -@body = (); - -@resources = (); -$inresource = 0; +$trailermode = 0; while (<>) { - if (/^%%BeginFont:/ || /^%%BeginResource:/ || /^%%BeginProcSet:/) { - $inresource = 1; - push(@resources, $_); - } elsif ($inresource) { - push(@resources, $_); - $inresource = 0 if /^%%EndFont/ || /^%%EndResource/ || /^%%EndProcSet/; - } elsif (/^%%Page:/ && $nesting == 0) { - $header = $trailer = 0; - push(@pages, join("", @body)) if @body; - $page++; - @body = ("%%Page: ($page) $page\n"); - } elsif (/^%%Trailer/ && $nesting == 0) { - push(@trailer, $_); - push(@pages, join("", @body)) if @body; - @body = (); - $trailer = 1; - $header = 0; - } elsif ($header) { - push(@trailer, $_); - push(@pages, join("", @body)) if @body; - @body = (); - $trailer = 1; - $header = 0; - } elsif ($trailer) { - if (/^%!/ || /%%EOF/) { - $trailer = $first = 0; - } elsif ($first) { - push(@trailer, $_); - } - } elsif (/^%%BeginDocument/ || /^%%BeginBinary/ || /^%%BeginFile/) { - push(@body, $_); - $nesting++; - } elsif (/^%%EndDocument/ || /^%%EndBinary/ || /^%%EndFile/) { - push(@body, $_); - $nesting--; - } else { - print $_ if $print; - } + if ($seenpages == 0) { + if (/^%%Page:/) { + if ($nesting == 0) { + $seenpages = 1; + $page++; + print "%%Page: ($page) $page\n"; + } else { + print $_; + } + } elsif ($first) { + if (/^%%Pages: /) { + print "%%Pages: (atend)\n"; + } else { + print $_; + } + } + } elsif ($trailermode) { + if (/^%!/ || /%%EOF/) { + $seenpages = 0; + $first = 0; + $trailermode = 0; + } elsif ($first) { + push (@trailer, $_) + unless (/^%%Pages/); + } + } else { + if (/^%%Page:/) { + if ($nesting == 0) { + $seenpages = 1; + $page++; + print "%%Page: ($page) $page\n"; + } else { + print $_; + } + } elsif (/^%%Trailer/ && $nesting == 0) { + $trailermode = 1; + } elsif (/^%%BeginDocument/ || /^%%BeginBinary/ || /^%%BeginFile/) { + push(@body, $_); + $nesting++; + print $_; + } elsif (/^%%EndDocument/ || /^%%EndBinary/ || /^%%EndFile/) { + push(@body, $_); + $nesting--; + print $_; + } else { + print $_; + } + } } +print "%%Trailer\n"; print @trailer; +print "%%Pages: $page\n"; +print "%%EOF\n"; exit 0; -@END@ +