summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/scripts/psutils/psjoin.pl
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/scripts/psutils/psjoin.pl')
-rwxr-xr-xMaster/texmf-dist/scripts/psutils/psjoin.pl220
1 files changed, 220 insertions, 0 deletions
diff --git a/Master/texmf-dist/scripts/psutils/psjoin.pl b/Master/texmf-dist/scripts/psutils/psjoin.pl
new file mode 100755
index 00000000000..21dfaffeef3
--- /dev/null
+++ b/Master/texmf-dist/scripts/psutils/psjoin.pl
@@ -0,0 +1,220 @@
+#!/usr/bin/env perl
+#
+# psjoin - concatenate PostScript files
+#
+# version 0.2, 2002-07-18
+# version 0.3, 2003-11-30
+# version 0.31, 2013-10-20
+#
+# versions up to 0.3 by Tom Sato <VEF00200@nifty.ne.jp>, http://homepage3.nifty.com/tsato/
+# versions from 0.31 by Reuben Thomas <rrt@sc3d.org>
+
+use strict;
+use warnings;
+
+use Getopt::Long;
+
+my $version = 0.31;
+
+sub usage {
+ my ($exit_code) = @_;
+ print STDERR <<END;
+Usage: psjoin [OPTION...] FILENAME...
+Concatenate PostScript files
+
+ --even, -a force each file to take an even number of pages
+ --save, -s try to close unclosed save operators
+ --strip, -p do not strip prolog or trailer from input files
+ --help, -h print this help, then exit
+ --version,-V print version information and exit
+END
+ exit $exit_code;
+}
+
+my $force_even = 0;
+my $force_save = 0;
+my $dont_strip = 0;
+my $save = "save %psjoin\n";
+my $restore = "restore %psjoin\n";
+my ($help_flag, $version_flag);
+
+GetOptions(
+ "even|a" => \$force_even,
+ "save|s" => \$force_save,
+ "strip|p" => \$dont_strip,
+ "help|h" => \$help_flag,
+ "version|V" => \$version_flag,
+ ) or usage(1);
+
+if ($help_flag) {
+ usage(0);
+} elsif ($version_flag) {
+ print "psjoin (version $version)\n";
+ print "(c) Tom Sato <VEF00200\@nifty.ne.jp> and Reuben Thomas <rrt\@sc3d.org>\n";
+ exit 0;
+}
+
+if ($force_save) {
+ $save = "/#psjoin-save# save def %psjoin\n";
+ $restore = "#psjoin-save# restore %psjoin\n";
+}
+my (@prolog, $prolog_inx, @trailer, @comments, @pages);
+if ($dont_strip) {
+ $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 (<IN>) {
+ 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;
+ }
+ }
+}
+
+print <<END;
+%!PS-Adobe-3.0
+%%Title: @ARGV
+%%Creator: psjoin $version
+%%Pages: (atend)
+END
+print $comments[$prolog_inx];
+
+print "\n$prolog[$prolog_inx]";
+for (my $i = 0; $i <= $#ARGV; $i++) {
+ $prolog[$i] =~ s/^%%/% %%/;
+ $prolog[$i] =~ s/\n%%/\n% %%/g;
+ $trailer[$i] =~ s/^%%/% %%/;
+ $trailer[$i] =~ s/\n%%/\n% %%/g;
+}
+
+my $total_pages = 0;
+for (my $i = 0; $i <= $#ARGV; $i++) {
+ print "\n% [ psjoin: file = $ARGV[$i] ]\n";
+ if ($prolog[$i] ne $prolog[$prolog_inx]) {
+ print "% [ psjoin: Prolog/Trailer will be inserted in each page ]\n";
+ } else {
+ print "% [ psjoin: common Prolog/Trailer will be used ]\n";
+ }
+
+ my $in_comment = 1 if !$dont_strip;
+ my $in_prolog = 1 if !$dont_strip;
+ my $in_trailer = 0;
+ my $saved = 0;
+ my $pages = 0;
+
+ open(IN, $ARGV[$i]) || die "$0: can't open \"$ARGV[$i]\" ($!)";
+ while (<IN>) {
+ 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 !$dont_strip && /^%%Trailer/;
+ next if $in_trailer;
+
+ if (/^%%Page:/) {
+ if ($saved) {
+ print $trailer[$i];
+ print $restore;
+ $saved = 0;
+ }
+
+ $pages++;
+ $total_pages++;
+ print "\n";
+ print "%%Page: ($i-$pages) $total_pages\n";
+ if ($prolog[$i] ne $prolog[$prolog_inx]) {
+ print $save;
+ print $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 <<END;
+
+%%Page: ($i-E) $total_pages
+% [ psjoin: empty page inserted to force even pages ]
+showpage
+END
+ }
+
+ print $trailer[$i] if $saved;
+ print $restore if $saved || $force_save;
+}
+
+print "\n%%Trailer\n";
+print $trailer[$prolog_inx];
+print "\n%%Pages: $total_pages\n%%EOF";