1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257
|
<HTML>
<!--
***********************************************************************
FUNNELWEB MANUAL WEB PAGE
=========================
Copyright (c) Ross N. Williams 1992,1999. All rights reserved.
Permission is granted to redistribute and use this manual in
any medium, with or without modification, provided that all
notices (including, without limitation, the copyright
notice, this permission notice, any record of modification,
and all legal notices) are preserved on all copies, that all
modifications are clearly marked, and that modified versions
are not represented as the original version unless all the
modifications since the manual's original release by Ross N.
Williams (www.ross.net) consist of translations or other
transformations that alter only the manual's form, not its
content. THIS MANUAL IS PROVIDED "AS IS" AND WITHOUT ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND
FITNESS FOR A PARTICULAR PURPOSE. TO THE EXTENT PERMITTED BY
LAW THERE IS ABSOLUTELY NO WARRANTY.
***********************************************************************
-->
<HEAD>
<TITLE>6.1 Analyzing the Monster Postscript Header File</TITLE>
<STYLE TYPE="text/css"> <!-- A {text-decoration: none} // --> </STYLE>
</HEAD>
<BODY BACKGROUND="binary/background.gif"
BGCOLOR="#FFFFFF"
TEXT="#000000"
VLINK="#660000"
LINK="#FF0000"
ALINK="#CC0000">
<TABLE WIDTH="490">
<TR>
<TD WIDTH="130" VALIGN="top">
<IMG SRC="binary/d_clear.gif" ALT="" WIDTH="130" HEIGHT="1"><BR>
<FONT SIZE="2">
<BR>
<A HREF="http://www.ross.net/"
TARGET="rosshome"
onClick="window.open('','rosshome','location,status,menubar,scrollbars,resizable',false).focus(); return true;"
>
<IMG SRC="binary/rossnet_logo.gif"
WIDTH="64" HEIGHT="32"
BORDER="0" ALT="RossNet"
HSPACE="0" VSPACE="1"></A><BR>
<BR>
<A HREF="../index.shtml"
TARGET="funnelweb"
onClick="window.open('','funnelweb','location,status,menubar,scrollbars,resizable',false).focus(); return true;"
>
<IMG SRC="binary/linklogo.gif"
WIDTH="64" HEIGHT="32"
BORDER="0" ALT="FunnelWeb"
HSPACE="0" VSPACE="1"></A><BR>
<BR>
<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0><TR><TD BGCOLOR="#000000">
<A HREF="../reference/index.html"
TARGET="funnelwebreference"
onClick="window.open('','funnelwebreference','location,status,menubar,scrollbars,resizable',false).focus(); return true;"
><FONT COLOR="#FFFFFF"><B>Reference</B></FONT></A><BR>
<BR>
<A HREF="../developer/index.html"
TARGET="funnelwebdeveloper"
onClick="window.open('','funnelwebdeveloper','location,status,menubar,scrollbars,resizable',false).focus(); return true;"
><FONT COLOR="#FFFFFF"><B>Developer</B></FONT></A><BR>
<BR>
<A HREF="index.html"><FONT COLOR="#FFFFFF"><B>Tutorial</B></FONT></A><BR>
<A HREF="intro.html"><FONT COLOR="#FFFFFF">1 Introduction</FONT></A><BR>
<A HREF="macro.html"><FONT COLOR="#FFFFFF">2 Macros</FONT></A><BR>
<A HREF="type.html"><FONT COLOR="#FFFFFF">3 Typesetting</FONT></A><BR>
<A HREF="example.html"><FONT COLOR="#FFFFFF">4 Example</FONT></A><BR>
<A HREF="hints.html"><FONT COLOR="#FFFFFF">5 Hints</FONT></A><BR>
<A HREF="examples.html"><FONT COLOR="#FFFFFF">6 Examples</FONT></A><BR>
<A HREF="web.html"><FONT COLOR="#FFFFFF">7 Webmaking</FONT></A><BR>
<BR>
<A HREF="search.html"><FONT COLOR="#FFFFFF"><B>SEARCH</B></FONT></A><BR>
</FONT>
</TD></TR></TABLE>
</TD>
<TD WIDTH="360" VALIGN="top">
<FONT SIZE="3">
<A HREF="../reference/index.html"><IMG SRC="binary/title.gif"
WIDTH="302" HEIGHT="24"
BORDER="0" ALT="FunnelWeb Tutorial Manual"
HSPACE="0" VSPACE="0"></A>
<P><FONT SIZE="5">6.1 Analyzing the Monster Postscript Header File</FONT><BR>
<P>During my Ph.D. candidature, I determined at one point
that it would be very desirable to automatically insert
diagrams from the <I>MacDraw</I> program
on my Macintosh into TeX <SAMP>insert</SAMP>ions in
my thesis. This would allow diagrams to
float around with the text and be printed automatically
rather than having to be printed separately and stuck in
with real glue. On the face of it, the problem seemed
inherently solvable, as the Macintosh could
generate PostScript for each diagram and
this PostScript could presumably be inserted into the
PostScript generated using TeX.
<P>The only trouble was that the Macintosh PostScript code
for the diagrams relied on an Apple PostScript header
file. This meant that the
header file had to be included at the start of the TeX
PostScript if the inserted PostScript for the diagrams was
to work. Unfortunately, merely including the header file at
the top didn't work, and it turned out that a rather
detailed analysis of some parts of the Apple header file was
required in order to perform the necessary surgery on the
header file to make it work. This analysis was severely
aggravated by the fact that the PostScript header file was
virtually unreadable. Basically it was about 50K of
interwoven definitions, that looked as if it had been run
through a word processor. There was no way that the code
could be understood clearly without some kind of
reformatting. Two other aspects of the problem further
complicated the analysis:
<P>
<UL>
<LI> The definitions of interest (i.e. the ones causing
the problems) were scattered throughout the heaeder file.
<LI> Many definitions could not be moved within the
header file. For one or more
reasons (e.g. to keep a definition within the activation of
a particular dictionary <SAMP>begin</SAMP> and <SAMP>end</SAMP>)
it would have been unwise to move the definitions of
interest to the same point in the file.
</UL>
<P>In fact the file was so messy and complicated that, as
a rule, it had to be handled with kid gloves. It would have
been unwise to re-arrange the definitions or to insert
comments.
<P>To my surprise, FunnelWeb provided an unexpected
solution to the problem. First I replaced all occurrences of
the <SAMP>@</SAMP> in the header file with <SAMP>@@</SAMP>.
Second, I placed the entire header file in a FunnelWeb macro
definition connected to a product file. I then processed the
file and checked to make sure that the product file was
identical to the original file. By doing all this I had
placed the header file under FunnelWeb control. I then left
the macro definition largely untouched, but replaced the
PostScript definitions of interest with FunnelWeb macro
calls, moving the actual PostScript definitions into
FunnelWeb macro definitions at the end of the FunnelWeb
file.
<P>
<PRE>
@O@<LaserHeader.ps@>==@{@-
Unreadable Postscript code
@<Print routine@>
Unreadable Postscript code
@<Zap routine@>
Unreadable Postscript code
@}
@A This routine looks as if it does this, but really is
does that, blah, blah blah.
@$@<Print routine@>==@{@-
/print { push pop pop push turn around
and jump up and down and print it} def
@}
@A This routine zaps the...
@$@<Zap routine@>==@{@-
/zap { push pop pop push turn around and
jump up and down and print it} def
@}
</PRE>
<P>Use of FunnelWeb meant that I was able to pluck out the
definitions of interest (a very small part of the whole
file) and collect them as a group at the end of the file
where they could be studied. Because each definition was
safely contained in a macro, it was possible to write a
detailed commentary of each routine without fear of
affecting the final PostScript code in any way at all. Once
this analysis was completed, it was possible to perform
surgery on the offending PostScript definitions in an
extremely controlled way. In particular, the FunnelWeb input
file served as a repository for all the different versions
of particular routines that were tried in order to get the
definitions to work. A new (<STRONG>Z</STRONG>ero) macro was created for
each version of each definition, and a commentary of how it
performed added above it.
<P>This case demonstrates that FunnelWeb is an extremely
powerful tool for dissecting and documenting cryptic text
files. Through the use of
macros, particular parts of the file can be isolated and
discussed without affecting the final product file in any
way. In the example above, only a small part of the file was
analysed, the rest being left as a blob, but in the general
case, a cryptic text file could be inserted into FunnelWeb
and then incrementally dissected (and possibly modified)
until the result is a fully documented literate program.
That this can be done without affecting the actual product
file demonstrates the high degree of descriptive control
that FunnelWeb provides.
<P>
<TABLE WIDTH="100%">
<TR>
<TD ALIGN="left" VALIGN="bottom"><A HREF="examples.html"><IMG SRC="binary/fw_up.gif" HEIGHT="32" WIDTH="32" BORDER="0" ALT="Up"></A></TD>
<TD ALIGN="center" VALIGN="bottom"><A HREF="examples.html"><IMG SRC="binary/fw_up.gif" HEIGHT="32" WIDTH="32" BORDER="0" ALT="Up"></A></TD>
<TD ALIGN="right" VALIGN="bottom"><A HREF="examples_adt.html"><IMG SRC="binary/fw_right.gif" HEIGHT="32" WIDTH="32" BORDER="0" ALT="Next"></A></TD>
</TR>
</TABLE>
<HR>
<FONT SIZE="2">
<A HREF="mailto:webmaster@ross.net">Webmaster</A>
<A HREF="copyright.html">Copyright © Ross N. Williams 1992,1999. All rights reserved.</A><BR>
</FONT>
</FONT>
</TD>
</TR>
</TABLE>
</BODY>
<!-- *********************************************************************** -->
<!-- End Of A FunnelWeb Manual Web Page (www.ross.net/funnelweb/) -->
<!-- *********************************************************************** -->
</HTML>
|