xref: /plan9/sys/src/cmd/gs/lib/fixmswrd.pl (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
17dd7cddfSDavid du Colombier#!/usr/bin/perl
2*593dc095SDavid du Colombier# $Id: fixmswrd.pl,v 1.4 2002/02/21 21:53:01 giles Exp $
37dd7cddfSDavid du Colombier
47dd7cddfSDavid du Colombier#   (C) 1997 Anthony Shipman
57dd7cddfSDavid du Colombier#
67dd7cddfSDavid du Colombier#   This software is provided 'as-is', without any express or implied
77dd7cddfSDavid du Colombier#   warranty.  In no event will the authors be held liable for any damages
87dd7cddfSDavid du Colombier#   arising from the use of this software.
97dd7cddfSDavid du Colombier#
107dd7cddfSDavid du Colombier#   Permission is granted to anyone to use this software for any purpose,
117dd7cddfSDavid du Colombier#   including commercial applications, and to alter it and redistribute it
127dd7cddfSDavid du Colombier#   freely, subject to the following restrictions:
137dd7cddfSDavid du Colombier#
147dd7cddfSDavid du Colombier#   1. The origin of this software must not be misrepresented; you must not
157dd7cddfSDavid du Colombier#      claim that you wrote the original software. If you use this software
167dd7cddfSDavid du Colombier#      in a product, an acknowledgment in the product documentation would be
177dd7cddfSDavid du Colombier#      appreciated but is not required.
187dd7cddfSDavid du Colombier#   2. Altered source versions must be plainly marked as such, and must not be
197dd7cddfSDavid du Colombier#      misrepresented as being the original software.
207dd7cddfSDavid du Colombier#   3. This notice may not be removed or altered from any source distribution.
217dd7cddfSDavid du Colombier#
227dd7cddfSDavid du Colombier#   Anthony Shipman    shipmana@acm.org
237dd7cddfSDavid du Colombier
247dd7cddfSDavid du Colombier# This program patches the postscript generated by MS Word printer drivers
257dd7cddfSDavid du Colombier# so that they work with ghostview 1.5.  The problem is that the document
267dd7cddfSDavid du Colombier# structuring conventions are not followed by Word.  The pages are supposed
277dd7cddfSDavid du Colombier# to be independent but they depend on a dictionary being opened outside
287dd7cddfSDavid du Colombier# of the pages.  The erroneous structure is
297dd7cddfSDavid du Colombier#
307dd7cddfSDavid du Colombier# 	%%EndSetup
317dd7cddfSDavid du Colombier# 	NTPSOct95 begin
327dd7cddfSDavid du Colombier# 	%%Page: 1 1
337dd7cddfSDavid du Colombier# 	<text>
347dd7cddfSDavid du Colombier# 	showpage
357dd7cddfSDavid du Colombier# 	%%Page: 2 2
367dd7cddfSDavid du Colombier# 	<text>
377dd7cddfSDavid du Colombier# 	showpage
387dd7cddfSDavid du Colombier# 	......
397dd7cddfSDavid du Colombier# 	%%Trailer
407dd7cddfSDavid du Colombier# 	...
417dd7cddfSDavid du Colombier# 	end
427dd7cddfSDavid du Colombier# 	%%EOF
437dd7cddfSDavid du Colombier#
447dd7cddfSDavid du Colombier# This only works if the all of the structure around the pages is preserved.
457dd7cddfSDavid du Colombier# The opening of NTPSOct95 happens outside of any structured section so
467dd7cddfSDavid du Colombier# it is never seen by ghostview.  We change the structure to
477dd7cddfSDavid du Colombier#
487dd7cddfSDavid du Colombier# 	%%EndSetup
497dd7cddfSDavid du Colombier# 	%%Page: 1 1
507dd7cddfSDavid du Colombier# 	NTPSOct95 begin
517dd7cddfSDavid du Colombier# 	<text>
527dd7cddfSDavid du Colombier# 	showpage
537dd7cddfSDavid du Colombier# 	end
547dd7cddfSDavid du Colombier# 	%%Page: 2 2
557dd7cddfSDavid du Colombier# 	NTPSOct95 begin
567dd7cddfSDavid du Colombier# 	<text>
577dd7cddfSDavid du Colombier# 	showpage
587dd7cddfSDavid du Colombier# 	end
597dd7cddfSDavid du Colombier# 	......
607dd7cddfSDavid du Colombier# 	%%Trailer
617dd7cddfSDavid du Colombier# 	...
627dd7cddfSDavid du Colombier# 	%%EOF
637dd7cddfSDavid du Colombier#
647dd7cddfSDavid du Colombier# That is the dictionary opening is repeated inside each page.
657dd7cddfSDavid du Colombier#
667dd7cddfSDavid du Colombier# We add a comment to the document to mark that it has been converted.
677dd7cddfSDavid du Colombier# This has the form
687dd7cddfSDavid du Colombier#	%LOCALGhostviewPatched
697dd7cddfSDavid du Colombier#
707dd7cddfSDavid du Colombier# Usage:
717dd7cddfSDavid du Colombier#	fixmswrd [-v] [file [output-file]]
727dd7cddfSDavid du Colombier
737dd7cddfSDavid du Colombierrequire 'getopts.pl';
747dd7cddfSDavid du Colombier
757dd7cddfSDavid du Colombier#=================================================================
767dd7cddfSDavid du Colombier
777dd7cddfSDavid du Colombier$program = "fixmswrd";
787dd7cddfSDavid du Colombier
797dd7cddfSDavid du Colombiersub usage {
807dd7cddfSDavid du Colombier    die "Usage: $program [-v] [file [output-file]]\n";
817dd7cddfSDavid du Colombier}
827dd7cddfSDavid du Colombier
837dd7cddfSDavid du Colombier#=================================================================
847dd7cddfSDavid du Colombier
857dd7cddfSDavid du Colombier&Getopts("v") || &usage;
867dd7cddfSDavid du Colombier
877dd7cddfSDavid du Colombier$verbose = $opt_v;
887dd7cddfSDavid du Colombier
897dd7cddfSDavid du Colombier
907dd7cddfSDavid du Colombier$infile = shift(@ARGV);
917dd7cddfSDavid du Colombierif ($infile)
927dd7cddfSDavid du Colombier{
937dd7cddfSDavid du Colombier    open(INFILE, $infile) || die "$program: Cannot read from $infile\n";
947dd7cddfSDavid du Colombier    $handle = "INFILE";
957dd7cddfSDavid du Colombier}
967dd7cddfSDavid du Colombierelse
977dd7cddfSDavid du Colombier{
987dd7cddfSDavid du Colombier    $handle = "STDIN";
997dd7cddfSDavid du Colombier}
1007dd7cddfSDavid du Colombier
1017dd7cddfSDavid du Colombier
1027dd7cddfSDavid du Colombier$outfile = shift(@ARGV);
1037dd7cddfSDavid du Colombierif ($outfile)
1047dd7cddfSDavid du Colombier{
1057dd7cddfSDavid du Colombier    open(OUTFILE, ">$outfile") || die "$program: Cannot write to $outfile\n";
1067dd7cddfSDavid du Colombier    select(OUTFILE);
1077dd7cddfSDavid du Colombier}
1087dd7cddfSDavid du Colombier
1097dd7cddfSDavid du Colombier#  This reads the header comments and detects the presence of the marker.
1107dd7cddfSDavid du Colombier$have_marker = 0;
1117dd7cddfSDavid du Colombier
1127dd7cddfSDavid du Colombierundef $dict_name;
1137dd7cddfSDavid du Colombierundef $dict_line;
1147dd7cddfSDavid du Colombier
1157dd7cddfSDavid du Colombier&read_comments;
1167dd7cddfSDavid du Colombier&put_comments;
1177dd7cddfSDavid du Colombier
1187dd7cddfSDavid du Colombierif ($have_marker)
1197dd7cddfSDavid du Colombier{
1207dd7cddfSDavid du Colombier    $verbose && print STDERR "$program: Warning - already converted\n";
1217dd7cddfSDavid du Colombier
1227dd7cddfSDavid du Colombier    while(<$handle>)		# pass the file through unchanged.
1237dd7cddfSDavid du Colombier    {
1247dd7cddfSDavid du Colombier	print;
1257dd7cddfSDavid du Colombier    }
1267dd7cddfSDavid du Colombier}
1277dd7cddfSDavid du Colombierelse
1287dd7cddfSDavid du Colombier{
1297dd7cddfSDavid du Colombier    $seen_trailer = 0;
1307dd7cddfSDavid du Colombier
1317dd7cddfSDavid du Colombier    while(<$handle>)		# massage the file
1327dd7cddfSDavid du Colombier    {
1337dd7cddfSDavid du Colombier	if ($dict_line)
1347dd7cddfSDavid du Colombier	{
1357dd7cddfSDavid du Colombier	    next if (/$dict_line/o);		# drop the old begin line
1367dd7cddfSDavid du Colombier	    $seen_trailer = 1 if (/^%%Trailer/);
1377dd7cddfSDavid du Colombier	    next if ($seen_trailer and /^end/);	# drop the old end line
1387dd7cddfSDavid du Colombier	}
1397dd7cddfSDavid du Colombier
1407dd7cddfSDavid du Colombier	print;
1417dd7cddfSDavid du Colombier
1427dd7cddfSDavid du Colombier	if (/^%%Page:/)
1437dd7cddfSDavid du Colombier	{
1447dd7cddfSDavid du Colombier	    print "$dict_name begin\n";	# add at the start of the page
1457dd7cddfSDavid du Colombier	}
1467dd7cddfSDavid du Colombier	elsif (/^showpage/)
1477dd7cddfSDavid du Colombier	{
1487dd7cddfSDavid du Colombier	    print "end\n";			# add at the end of the page
1497dd7cddfSDavid du Colombier	}
1507dd7cddfSDavid du Colombier	elsif (/^%%BeginResource: procset (\S+)/)
1517dd7cddfSDavid du Colombier	{
1527dd7cddfSDavid du Colombier	    $dict_name = $1;
1537dd7cddfSDavid du Colombier	    $dict_line = "^$dict_name begin";
1547dd7cddfSDavid du Colombier	}
1557dd7cddfSDavid du Colombier	elsif (/^%%BeginProcSet: (\S+)/)	# for older document versions
1567dd7cddfSDavid du Colombier	{
1577dd7cddfSDavid du Colombier	    $dict_name = $1;
1587dd7cddfSDavid du Colombier	    $dict_line = "^$dict_name begin";
1597dd7cddfSDavid du Colombier	}
1607dd7cddfSDavid du Colombier	elsif (/^%%EndProlog:/)
1617dd7cddfSDavid du Colombier	{
1627dd7cddfSDavid du Colombier	    unless ($dict_line)
1637dd7cddfSDavid du Colombier	    {
1647dd7cddfSDavid du Colombier		$verbose &&
1657dd7cddfSDavid du Colombier		    print STDERR "$program: Warning - unrecognised document structure\n";
1667dd7cddfSDavid du Colombier	    }
1677dd7cddfSDavid du Colombier	}
1687dd7cddfSDavid du Colombier    }
1697dd7cddfSDavid du Colombier}
1707dd7cddfSDavid du Colombier
1717dd7cddfSDavid du Colombierexit 0;
1727dd7cddfSDavid du Colombier
1737dd7cddfSDavid du Colombier#=================================================================
1747dd7cddfSDavid du Colombier
1757dd7cddfSDavid du Colombier
1767dd7cddfSDavid du Colombier#  This reads all of the header comments into an array which we can write
1777dd7cddfSDavid du Colombier#  out again later.  In addition we detect the presence of the marker comment.
1787dd7cddfSDavid du Colombier
1797dd7cddfSDavid du Colombiersub read_comments
1807dd7cddfSDavid du Colombier{
1817dd7cddfSDavid du Colombier    @headers = ();
1827dd7cddfSDavid du Colombier
1837dd7cddfSDavid du Colombier    while (<$handle>)
1847dd7cddfSDavid du Colombier    {				# without chopping
1857dd7cddfSDavid du Colombier	push(@headers, $_);
1867dd7cddfSDavid du Colombier	if (/^%LOCALGhostviewPatched/)
1877dd7cddfSDavid du Colombier	{
1887dd7cddfSDavid du Colombier	    $have_marker = 1;
1897dd7cddfSDavid du Colombier	}
1907dd7cddfSDavid du Colombier	last if /^%%EndComments/;
1917dd7cddfSDavid du Colombier    }
1927dd7cddfSDavid du Colombier}
1937dd7cddfSDavid du Colombier
1947dd7cddfSDavid du Colombier
1957dd7cddfSDavid du Colombier
1967dd7cddfSDavid du Colombiersub put_comments
1977dd7cddfSDavid du Colombier{
1987dd7cddfSDavid du Colombier    foreach $h (@headers)
1997dd7cddfSDavid du Colombier    {
2007dd7cddfSDavid du Colombier	if (!$have_marker and ($h =~ /^%%EndComments/))
2017dd7cddfSDavid du Colombier	{
2027dd7cddfSDavid du Colombier	    print "%LOCALGhostviewPatched\n";
2037dd7cddfSDavid du Colombier	}
2047dd7cddfSDavid du Colombier	print $h;		# contains the newline
2057dd7cddfSDavid du Colombier    }
2067dd7cddfSDavid du Colombier}
207