diff options
author | Karl Berry <karl@freefriends.org> | 2013-04-07 18:42:53 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2013-04-07 18:42:53 +0000 |
commit | edb2136c619d2c59bcb6dfd431c4c7636ff8913d (patch) | |
tree | 8aa04dd27bee1b2f2f9b3fd45dab41cf7771f82e /Master/texmf-dist/scripts/psutils/extractres.pl | |
parent | b3efa3bb4509e7bd53d737fb729d0d92a76f1f98 (diff) |
texmf -> texmf-dist: scripts
git-svn-id: svn://tug.org/texlive/trunk@29719 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/scripts/psutils/extractres.pl')
-rwxr-xr-x | Master/texmf-dist/scripts/psutils/extractres.pl | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/Master/texmf-dist/scripts/psutils/extractres.pl b/Master/texmf-dist/scripts/psutils/extractres.pl new file mode 100755 index 00000000000..adee938c95d --- /dev/null +++ b/Master/texmf-dist/scripts/psutils/extractres.pl @@ -0,0 +1,101 @@ +#!/usr/bin/env perl +# extractres: extract resources from PostScript file +# +# Copyright (C) Angus J. C. Duggan 1991-1995 +# See file LICENSE for details. + +$0 =~ s=.*/==; +$prog = $0; + +%resources = (); # list of resources included +%merge = (); # list of resources extracted this time +%extn = ("font", ".pfa", "file", ".ps", "procset", ".ps", # resource extns + "pattern", ".pat", "form", ".frm", "encoding", ".enc"); +%type = ("%%BeginFile:", "file", "%%BeginProcSet:", "procset", + "%%BeginFont:", "font"); # resource types + +while (@ARGV) { + $_ = shift; + if (/^-m(erge)?$/) { $merge = 1; } + elsif (/^-/) { + print STDERR "Usage: $prog [-merge] [file]\n"; + exit 1; + } else { + unshift(@ARGV, $_); + last; + } +} + +if (defined($ENV{TMPDIR})) { # set body file name + $body = "$ENV{TMPDIR}/body$$.ps"; +} elsif (defined($ENV{TEMP})) { + $body = "$ENV{TEMP}/body$$.ps"; +} elsif (defined($ENV{TMP})) { + $body = "$ENV{TMP}/body$$.ps"; +} else { + $body = "body$$.ps"; +} + +open(BODY, $body) && die "Temporary file $body already exists"; +open(BODY, ">$body") || die "Can't write file $body"; + +sub filename { # make filename for resource in @_ + local($name); + foreach (@_) { # sanitise name + s/[!()\$\#*&\\\|\`\'\"\~\{\}\[\]\<\>\?]//g; + $name .= $_; + } + $name =~ s@.*/@@; # drop directories + die "Filename not found for resource ", join(" ", @_), "\n" + if $name =~ /^$/; + $name; +} + +$output = STDOUT; # start writing header out +while (<>) { + if (/^%%BeginResource:/ || /^%%BeginFont:/ || /^%%BeginProcSet:/) { + local($comment, @res) = split(/\s+/); # look at resource type + local($type) = defined($type{$comment}) ? $type{$comment} : shift(@res); + local($name) = &filename(@res, $extn{$type}); # make file name + $saveout = $output; + if (!$resources{$name}) { + print "%%IncludeResource: $type ", join(" ", @res), "\n"; + if (!open(RES, $name)) { + open(RES, ">$name") || die "Can't write file $name"; + $resources{$name} = $name; + $merge{$name} = $merge; + $output = RES; + } else { # resource already exists + close(RES); + undef $output; + } + } elsif ($merge{$name}) { + open(RES, ">>$name") || die "Can't append to file $name"; + $output = RES; + } else { # resource already included + undef $output; + } + } elsif (/^%%EndResource/ || /^%%EndFont/ || /^%%EndProcSet/) { + if (defined $output) { + print $output $_; + close($output); + } + $output = $saveout; + next; + } elsif ((/^%%EndProlog/ || /^%%BeginSetup/ || /^%%Page:/)) { + $output = BODY; + } + print $output $_ + if defined $output; +} + +close(BODY); # close body output file + +open(BODY, $body); # reopen body for input +while (<BODY>) { # print it all + print $_; +} +close(BODY); + +unlink($body); # dispose of body file + |