summaryrefslogtreecommitdiff
path: root/Master/tlpkg/tlgs/lib/fixmswrd.pl
diff options
context:
space:
mode:
Diffstat (limited to 'Master/tlpkg/tlgs/lib/fixmswrd.pl')
-rw-r--r--Master/tlpkg/tlgs/lib/fixmswrd.pl206
1 files changed, 206 insertions, 0 deletions
diff --git a/Master/tlpkg/tlgs/lib/fixmswrd.pl b/Master/tlpkg/tlgs/lib/fixmswrd.pl
new file mode 100644
index 00000000000..521aaeabd4b
--- /dev/null
+++ b/Master/tlpkg/tlgs/lib/fixmswrd.pl
@@ -0,0 +1,206 @@
+#!/usr/bin/perl
+# $Id: fixmswrd.pl 6300 2005-12-28 19:56:24Z giles $
+
+# (C) 1997 Anthony Shipman
+#
+# This software is provided 'as-is', without any express or implied
+# warranty. In no event will the authors be held liable for any damages
+# arising from the use of this software.
+#
+# Permission is granted to anyone to use this software for any purpose,
+# including commercial applications, and to alter it and redistribute it
+# freely, subject to the following restrictions:
+#
+# 1. The origin of this software must not be misrepresented; you must not
+# claim that you wrote the original software. If you use this software
+# in a product, an acknowledgment in the product documentation would be
+# appreciated but is not required.
+# 2. Altered source versions must be plainly marked as such, and must not be
+# misrepresented as being the original software.
+# 3. This notice may not be removed or altered from any source distribution.
+#
+# Anthony Shipman shipmana@acm.org
+
+# This program patches the postscript generated by MS Word printer drivers
+# so that they work with ghostview 1.5. The problem is that the document
+# structuring conventions are not followed by Word. The pages are supposed
+# to be independent but they depend on a dictionary being opened outside
+# of the pages. The erroneous structure is
+#
+# %%EndSetup
+# NTPSOct95 begin
+# %%Page: 1 1
+# <text>
+# showpage
+# %%Page: 2 2
+# <text>
+# showpage
+# ......
+# %%Trailer
+# ...
+# end
+# %%EOF
+#
+# This only works if the all of the structure around the pages is preserved.
+# The opening of NTPSOct95 happens outside of any structured section so
+# it is never seen by ghostview. We change the structure to
+#
+# %%EndSetup
+# %%Page: 1 1
+# NTPSOct95 begin
+# <text>
+# showpage
+# end
+# %%Page: 2 2
+# NTPSOct95 begin
+# <text>
+# showpage
+# end
+# ......
+# %%Trailer
+# ...
+# %%EOF
+#
+# That is the dictionary opening is repeated inside each page.
+#
+# We add a comment to the document to mark that it has been converted.
+# This has the form
+# %LOCALGhostviewPatched
+#
+# Usage:
+# fixmswrd [-v] [file [output-file]]
+
+require 'getopts.pl';
+
+#=================================================================
+
+$program = "fixmswrd";
+
+sub usage {
+ die "Usage: $program [-v] [file [output-file]]\n";
+}
+
+#=================================================================
+
+&Getopts("v") || &usage;
+
+$verbose = $opt_v;
+
+
+$infile = shift(@ARGV);
+if ($infile)
+{
+ open(INFILE, $infile) || die "$program: Cannot read from $infile\n";
+ $handle = "INFILE";
+}
+else
+{
+ $handle = "STDIN";
+}
+
+
+$outfile = shift(@ARGV);
+if ($outfile)
+{
+ open(OUTFILE, ">$outfile") || die "$program: Cannot write to $outfile\n";
+ select(OUTFILE);
+}
+
+# This reads the header comments and detects the presence of the marker.
+$have_marker = 0;
+
+undef $dict_name;
+undef $dict_line;
+
+&read_comments;
+&put_comments;
+
+if ($have_marker)
+{
+ $verbose && print STDERR "$program: Warning - already converted\n";
+
+ while(<$handle>) # pass the file through unchanged.
+ {
+ print;
+ }
+}
+else
+{
+ $seen_trailer = 0;
+
+ while(<$handle>) # massage the file
+ {
+ if ($dict_line)
+ {
+ next if (/$dict_line/o); # drop the old begin line
+ $seen_trailer = 1 if (/^%%Trailer/);
+ next if ($seen_trailer and /^end/); # drop the old end line
+ }
+
+ print;
+
+ if (/^%%Page:/)
+ {
+ print "$dict_name begin\n"; # add at the start of the page
+ }
+ elsif (/^showpage/)
+ {
+ print "end\n"; # add at the end of the page
+ }
+ elsif (/^%%BeginResource: procset (\S+)/)
+ {
+ $dict_name = $1;
+ $dict_line = "^$dict_name begin";
+ }
+ elsif (/^%%BeginProcSet: (\S+)/) # for older document versions
+ {
+ $dict_name = $1;
+ $dict_line = "^$dict_name begin";
+ }
+ elsif (/^%%EndProlog:/)
+ {
+ unless ($dict_line)
+ {
+ $verbose &&
+ print STDERR "$program: Warning - unrecognised document structure\n";
+ }
+ }
+ }
+}
+
+exit 0;
+
+#=================================================================
+
+
+# This reads all of the header comments into an array which we can write
+# out again later. In addition we detect the presence of the marker comment.
+
+sub read_comments
+{
+ @headers = ();
+
+ while (<$handle>)
+ { # without chopping
+ push(@headers, $_);
+ if (/^%LOCALGhostviewPatched/)
+ {
+ $have_marker = 1;
+ }
+ last if /^%%EndComments/;
+ }
+}
+
+
+
+sub put_comments
+{
+ foreach $h (@headers)
+ {
+ if (!$have_marker and ($h =~ /^%%EndComments/))
+ {
+ print "%LOCALGhostviewPatched\n";
+ }
+ print $h; # contains the newline
+ }
+}