#!/usr/bin/perl -w

# psappend, copyright 2003 by Patrick Reynolds (reynolds .at. cs duke edu)
#
# Concatenate several Postscript or EPS files into a single, large
# Postscript file.  Works great for combining several Gnuplot graphs into
# a single output file.
#
# Usage:
#   psappend foo1.eps foo2.eps foo3.eps > combined.ps

$state = "first_header";
$pages = 0;

foreach my $fn (@ARGV) {
	do_file($fn);
}
print "%%Trailer\n";
print "%%DocumentFonts: ".(join' ', keys %fonts)."\n";
print "%%Pages: $pages\n";

sub do_file {
	open(FP, "<$_[0]") || die "$_[0]: $!";
	while (<FP>) {
		chomp;
		if ($state eq "first_header") {
			if (!/^%[%!]/) { $state = "document"; print "$_\n"; }
			elsif (/^%%Pages:/) { print "%%Pages: (atend)\n"; }
			elsif (/^%%BoundingBox:/) {}
			elsif (/^%%Orientation:/) {}
			elsif (/^%%DocumentFonts: (.*)/) { addfonts($1); print "%%DocumentFonts: (atend)\n"; }
			else { print "$_\n"; }
		}
		elsif ($state eq "document") {
			if (/^%%Page: /) {
				$pages++;
				print "%%Page: $pages $pages\n";
			}
			elsif (/^%%Trailer/) { $state = "trailer"; }
			else { print "$_\n"; }
		}
		elsif ($state eq "trailer") {
			if (/^%%DocumentFonts: (.*)/) { addfonts($1); print "%%DocumentFonts: (atend)\n"; }
			elsif (!/^%%/) { $state = "document"; }
		}
	}
}

sub addfonts {
	return if ($_[0] eq "(atend)");
	foreach my $font (split/\s+/, $_[0]) { $fonts{$font}++; }
}
