diff options
Diffstat (limited to 'web/funnelAC/userman')
-rw-r--r-- | web/funnelAC/userman/u_ch0.tex | 197 | ||||
-rw-r--r-- | web/funnelAC/userman/u_ch1.tex | 1800 | ||||
-rw-r--r-- | web/funnelAC/userman/u_ch2.tex | 1586 | ||||
-rw-r--r-- | web/funnelAC/userman/u_ch3.tex | 2986 | ||||
-rw-r--r-- | web/funnelAC/userman/u_ch4.tex | 468 | ||||
-rw-r--r-- | web/funnelAC/userman/u_ch5.tex | 387 | ||||
-rw-r--r-- | web/funnelAC/userman/u_cha.tex | 228 | ||||
-rw-r--r-- | web/funnelAC/userman/u_manual.aux | 202 | ||||
-rw-r--r-- | web/funnelAC/userman/u_manual.dvi | bin | 0 -> 442412 bytes | |||
-rw-r--r-- | web/funnelAC/userman/u_manual.idx | 1020 | ||||
-rw-r--r-- | web/funnelAC/userman/u_manual.log | 188 | ||||
-rw-r--r-- | web/funnelAC/userman/u_manual.ps | 9876 | ||||
-rw-r--r-- | web/funnelAC/userman/u_manual.sin | 1020 | ||||
-rw-r--r-- | web/funnelAC/userman/u_manual.tex | 290 | ||||
-rw-r--r-- | web/funnelAC/userman/u_manual.toc | 166 |
15 files changed, 20414 insertions, 0 deletions
diff --git a/web/funnelAC/userman/u_ch0.tex b/web/funnelAC/userman/u_ch0.tex new file mode 100644 index 0000000000..ff8b3cca58 --- /dev/null +++ b/web/funnelAC/userman/u_ch0.tex @@ -0,0 +1,197 @@ +%==============================================================================% +% Start of Ch0.tex % +%==============================================================================% +% +% Copyright +% --------- +% Copyright (C) 1992 Ross N. Williams. +% This file contains a chapter of the FunnelWeb User's Manual. +% See the main TeX file for this manual for further information. +% +%==============================================================================% + +\vbox{\relax} +\vfill + +\hrule + +\medskip + +Copyright \copyright{} 1992 Ross~N.~Williams. +\xn{Ross}{Williams}\xx{copyright}{notice} + +Permission is granted to make and distribute verbatim copies of this manual +provided that the copyright notice and this permission notice are preserved +on all copies.\note{This paragraph was copied from the GNU Emacs manual to +avoid my having to get a legal opinion on something I could cook up.} + +\medskip + +\hrule + +\newpage + +%============================================================================== + +\tableofcontents + +\newpage + +%============================================================================== + +%I am not using LaTeX's figures and tables numbering so these are commented out. +%\pseudochapter{List of Figures} +%\pseudochapter{List of Tables} + +%============================================================================== + +% No forward. +%\pseudochapter{Foreword} +%\x{foreword} + +%============================================================================== + +\pseudochapter{Preface} +\x{preface} + +When, in 1986, I first read Donald Knuth's\xn{Donald}{Knuth} +technical report on Web\paper{Knuth83},\x{Web} and +tried Web out, I was simultaneously excited by Knuth's idea of literate +programming, and disappointed by his implementation of it. I was excited +because I could sense the potential for +the literate style to transform the state of mind of the programmer, but was +disappointed by Web's rigidity +and lack of practicality, which seemed to betray this potential. +The Web I used was Pascal-specific, \TeX{}-specific, and applied too +many constraints to the programming process. +In particular, it insisted on taking control of the +program text, mangling the code in the Pascal output files, +and imposing its own rather rigid ideas about indenting in the \TeX{} output. +All this, combined with the complexity of the tool, led me +to come to perceive Web as problem rather than solution. + +Despite all this, I was well and truly hooked on the idea of literate +programming. The inevitable result was that I designed and implemented +my own version of Web --- FunnelWeb! + +FunnelWeb is not the most sophisticated literate programming tool available, +but it is an extremely \i{practical} tool, striving for simplicity +and portability in all areas. Not only is FunnelWeb language-independent, +and to some extent typesetter independent, but its implementation also +stresses portability, being written in~C, and currently operating on four +major platforms (Sun, Vax, PC, Mac). FunnelWeb allows the +programmer total control over the output file, making it suitable +for use with all sorts of format-sensitive languages. It also allows +control over its own source code, which has been released under a +GNU license.\xx{GNU}{license} +FunnelWeb is quite solid, having to pass +a regression testing suite of over 200 tests +before being released. Finally, FunnelWeb is well documented by this manual +which provides a tutorial, advanced hints, and a language definition. + +I would like to dedicate FunnelWeb and this manual to Donald Knuth +and his literate programming tool Web. +Although this manual is somewhat critical of some aspects of +Web, this criticism is really a product of differing design goals. +Knuth designed a paradigm (literate programming) and a tool +(Web) aimed at the highest pitch of program presentation and typesetting. +FunnelWeb aims lower, relaxing constraints, and making compromises +in order to achieve simplicity, flexibility, and portability. +The result is a practical tool which I hope will attract more people to +the literate style. + +\bigskip + +\leftline{\b{Ross~N.~Williams}} +\leftline{\b{Adelaide, Australia}} +\leftline{\b{May~1992}} + +%============================================================================== + +\pseudochapter{Acknowledgements} +\x{acknowledgements} + +Many thanks to \b{David Hulse}\xn{David}{Hulse} +(\p{dave@cs.adelaide.edu.au}) for +translating the original version of FunnelWeb +(FunnelWeb~V1) from Ada\x{Ada} into~C +and getting it to work on Unix and a PC. +The C code written by David (FunnelWeb~V2) formed +the basis of FunnelWeb~V3, but was +entirely rewritten during the intensive refinement and feature-injection +period leading up to this release (FunnelWeb~V3 is about three times +the size of FunnelWeb~V2). +Nevertheless, without this important first translation step, +I would probably not have found the motivation to develop FunnelWeb to its +present state. + +Thanks go to \b{Simon Hackett}\xn{Simon}{Hackett} +(\p{simon@internode.com.au}) of Internode Systems +Pty Ltd for the use of his Sun, Mac, and PC, for assistance in porting +FunnelWeb to the Sun and PC, and for helpful discussions. + +Thanks go to \b{Jeremy Begg}\xn{Jeremy}{Begg} +(\p{jeremy@vsm.com.au}) of VSM Software Services +for the use of his VAX, and for assistance with the VMS-specific code. + +Thanks to \b{Barry Dwyer}\xn{Barry}{Dwyer} (\p{dwyer@cs.adelaide.edu.au}) +and \b{Roger Brissenden}\xn{Roger}{Brissenden} (\p{rjb@koala.harvard.edu}) +for trying out FunnelWeb Version~1 in 1987 and providing valuable feedback. + +Thanks to Donald Knuth\xn{Donald}{Knuth} +for establishing the idea of literate programming in the first place. + +\bigskip + +\leftline{\b{Ross~N.~Williams}} +\leftline{\b{Adelaide, Australia}} +\leftline{\b{May~1992}} + +%============================================================================== + +\pseudochapter{Presentation Notes} +\x{presentation notes} + +\thing{References:} All references are set in bold and are +cited in square brackets in the form +\b{[}$<$\i{firstauthor}$><$\i{year}$>$\b{]}. +All references cited in the text appear in the reference list and the index. + +\thing{Special terms:} New or important terminology has been set in bold +face and appears in the index. A glossary appears as an appendix. + +\thing{Typesetting:} This\x{typesetting} +document was prepared by the author using Andrew +Trevorrow's\xn{Andrew}{Trevorrow} (\p{akt150@cscgpo.anu.edu.au})\checked{} +implementation (OzTeX\x{OzTeX}) of the +\TeX{}/\LaTeX{}\paper{Knuth84}\paper{Lamport86}\x{TeX}\x{LaTeX} +typesetting system running on a Macintosh-SE.\x{Macintosh} + +\thing{Graphics:} All diagrams have been constructed out of text using +the \LaTeX{} \p{verbatim} environment so as to allow this document to +be disseminated electronically and printed using \LaTeX{} without access +to the author's drawing tools. + +%%%%Put this paragraph back again if I insert any \fix footnotes again. +%\thing{Correction footnotes:} Footnotes\x{footnotes} +%commencing with dots ($\bullet$) are +%notes to remind the author about something in the document that must be +%attended to.\fix{This is an example of such a footnote.} These footnotes +%will be attended to and eliminated in later versions. + +\thing{Known typesetting problems:} While every attempt has been made +to give a good presentation within the +time available, some shortcuts have had to be taken. In particular, the author +has +been unable to work out how to get \LaTeX{} to suppress blank pages at the +start of chapters. + +%============================================================================== + +% No abstract. +%\pseudochapter{Abstract} +%\x{abstract} + +%==============================================================================% +% End of Ch0.tex % +%==============================================================================% diff --git a/web/funnelAC/userman/u_ch1.tex b/web/funnelAC/userman/u_ch1.tex new file mode 100644 index 0000000000..947fd2326b --- /dev/null +++ b/web/funnelAC/userman/u_ch1.tex @@ -0,0 +1,1800 @@ +%==============================================================================% +% Start of Ch1.tex % +%==============================================================================% +% +% Copyright +% --------- +% Copyright (C) 1992 Ross N. Williams. +% This file contains a chapter of the FunnelWeb User's Manual. +% See the main TeX file for this manual for further information. +% +%==============================================================================% + +\chapter{A Tutorial Introduction} +\label{chapintroduction} +\x{tutorial} + +\section{What is Literate Programming?} +\x{literate programming} + +A traditional computer program consists of a text file containing program +code. Scattered in amongst the program code are comments which describe the +various parts of the code. + +In \newterm{literate programming} the emphasis is reversed. Instead of +writing code containing documentation, the literate programmer writes +documentation containing code. No longer does the English commentary +injected into a program have to be hidden in +comment delimiters at the top of the +file, or under procedure headings, or at the end of lines. +Instead, it is wrenched into the daylight and made the main focus. +The \dq{program} then becomes primarily a document directed at humans, +with the code being herded between \dq{code delimiters} from where it +can be extracted and shuffled out sideways to the language system +by literate programming tools. + +The effect of this simple shift of emphasis can be so +profound as to change one's whole approach to programming. Under the +literate programming paradigm, the central activity of programming becomes +that of conveying meaning to other intelligent beings rather than merely +convincing the computer to behave in a particular way. It is the difference +between performing and exposing a magic trick.\x{magic trick} + +In order to program in a literate style, particular tools are +required.\xx{tools}{literate programming} +The traditional approach (used in the FunnelWeb system) is to have +some sort of text-file-in/text-file-out utility that reads a +literate program (containing a program commentary peppered with scraps +of program text) and writes out a file containing all the program code and +a file containing typesetter commands representing the entire input document, +documentation, code, and all (\figarchitecture{}). + +\begin{figure}[htbp] +\begin{verbatim} + + +-----------------------------------------+ + | File containing the program description | + | peppered with scraps of program code. | + | This is what the programmer works on. | + | (e.g. sloth.web) | + +-----------------------------------------+ + | + v + o---------------------------o + | Literate Programming Tool | + o---------------------------o + | + +-------------------+-------------------+ + | | + v v + +------------------+ +----------------------------------+ + | Traditional | | Documentation file suitable for | + | Computer Program | | input into a typesetting program | + | (e.g. sloth.c) | | (e.g. sloth.tex) | + +------------------+ +----------------------------------+ + +\end{verbatim} +\mylabel{\figarchitecture{}: Traditional architecture of literate programming tools.}{% +% +Literate programming tools could be organized in a number of ways. However, +to fit in with current file and command line based environments, most tools +conform to the traditional architecture shown here in which the user feeds +in a file containing a literate program, and the literate programming +utility generates program files and a documentation file. +% +} +\end{figure} + +Given the coming age of hypertext\x{hypertext} systems, +this is probably not the best approach. +However, it does mesh beautifully with current text +files and command line interfaces, the expectation of linear presentations in +the documents we read, and the particular requirements of current programming +languages and typesetting systems. It is certainly not a bad approach. + +With this structure in place, the literate programming system can provide +far more than just a reversal of the priority of comments and code. +In its full blown form, a good literate programming facility can provide +total support for the essential thrust of literate programming, which is that +computer programs should be written more for the human reader +than for the compiler. In particular, a literate programming system can +provide:\xs{literate programming}{facilities} + +\narrowthing{Re-ordering of code:}{Programming languages often force the +programmer to give the various parts of a computer program in a particular +order.\xx{program}{ordering} +For example, the Pascal\x{Pascal} programming language\paper{BSI82} +imposes the ordering: +constants, types, variables, procedures, code. Pascal also requires that +procedures appear in an order consistent with the partial ordering +imposed by the static call graph (but forward +declarations allow this to be bypassed). In contrast, the literate style +requires that the programmer be free to present the computer program in +any order whatsoever. The facility to do this is implemented in literate +programming tools by providing text \i{macros} that can be defined +and used in any order.} + +\narrowthing{Typeset code and documentation:}{Traditionally program +listings are +dull affairs consisting of pages of fan-form paper imprinted with meandering +coastlines of structured text in a boring font. In contrast, literate +programming systems are capable of producing documentation that is +superior in two ways. First, because most of the documentation text is +fed straight to the typesetter, the programmer can make use of all the +power of the underlying typesetter, resulting in documentation that has the +same presentation as an ordinary typeset document. Second, because the +literate programming utility sees all the code, it can use its knowledge +of the programming language and the features of the typesetting language +to typeset the program code as if it were appearing in a +technical journal. It is the difference +between:} + +\begin{verbatim} + while sloth<walrus loop + sloth:=sloth+1; + end loop +\end{verbatim} + +\narrowtext{and} + +\begin{verse} +\b{while} \i{sloth}$<$\i{walrus} \b{loop}\\ +\qquad\qquad \i{sloth}$\leftarrow$\i{sloth}$+1$;\\ +\b{end} \b{loop} +\end{verse} + +\narrowtext{Unfortunately, while FunnelWeb provides full typesetting +of the +documentation, it typesets all of its code in the style of the first of these +two examples. To typeset in the style of the second requires knowledge of +the programming language, and the current version of FunnelWeb is +programming language independent. At a later stage, it is possible that +FunnelWeb will be modified to read in a file containing information +about the target programming language to be used to assist in +typesetting the code properly.} + +\narrowthing{Cross referencing:}{Because\x{cross referencing} +the literate tool sees all the +code and documentation, it is able to generate extensive cross referencing +information in the typeset documentation. This makes the printed program +document more easy to navigate and partially compensates for the lack of +an automatic searching facility when reading printed documentation.} + +In the end, the details don't matter. The most significant +benefit that literate programming offers +is \i{its capacity to transform the state of mind of the +programmer}.\xs{literate programming}{most significant benefit} +It is now legend that the act of explaining something can transform +one's understanding of it. This is one of the justifications behind the +powerful combination of research and teaching in +universities\paper{Rosovsky90}.\x{universities} +Similarly, by constantly explaining the unfolding program code in English to an +imaginary reader, the programmer transforms his perception of the code, +laying it open, prone, to the critical eye.\xx{explaining}{code} + +The result of this exposure is a higher quality of programming. +When exposed to the harsh light of the literate eye, +bugs crawl out, special cases vanish, and sloppy code evaporates. +As a rule literate programs +take longer to write than ordinary programs, but the total +development time\xx{development}{time} +is the same or less because the time taken to write and +document the program carefully is compensated for by a reduced debugging +and maintenance time. +Thus literate programming does not merely assist in the preparation of +documentation, but also makes significant contributes to the process of +programming itself. In practice this has turned out to be a contribution +far more important than the mere capacity to produce typeset documentation. + +For more information on literate programming, the reader is directed +to Knuth's early founding work \paper{Knuth83} and \paper{Knuth84}. +For more recent information refer to \paper{Smith91}, +which provides a comprehensive bibliography up to 1990. + +\section{What is FunnelWeb?} +\xx{FunnelWeb}{overview} + +FunnelWeb is a particular literate programming system that is implemented +by a single C program. FunnelWeb takes as input a single \p{.fw} +\newterm{input file} +and writes one or more \newterm{product files} +and a \newterm{documentation file} (\figfunarch{}). + +\begin{figure}[htbp] +\begin{verbatim} + +-----------+ + | sloth.fw | + +-----------+ + | + v + o-------------------o + | FUNNELWEB Program | + o-------------------o + | + +-------------------+----------------+ + | | + v v + +-----------------------------+ +--------------------------------+ + | Product File (e.g. sloth.c) | | Documentation File (sloth.tex) | + +-----------------------------+ +--------------------------------+ +\end{verbatim} +\mylabel{\figfunarch{}: Architecture of FunnelWeb.}{% +% +FunnelWeb follows the traditional architecture of literate programming +tools. +% +} +\end{figure} + +In literate programming systems, it is usual to refer to the product +file as a \dq{program file}. However, as FunnelWeb is a general tool that +can be used to prepare all sorts of text files that are not computer programs, +the more generic term \dq{product file} was chosen. Product files should +be carefully distinguished from the term \newterm{output files} which refers +to all of the output files produced by FunnelWeb. + +FunnelWeb is distinguished by the following characteristics: + +\narrowthing{Simplicity:}{A\x{simplicity} +governing design goal of FunnelWeb is to provide +a \i{simple} tool that could be easily learnt and completely mastered. +This manual is thick because it is comprehensive and lingers on the +ways in which FunnelWeb can be used. The tool itself is quite simple.} + +\narrowthing{Reliability:}{Another\x{reliability} +design goal is to provide a tool that will +protect the user as much as possible from silly errors. Macro preprocessors +are notorious for causing obscure errors. Every attempt has been made in +FunnelWeb to keep the syntax robust. +For example, in FunnelWeb the syntax of +macro calls has been purposely designed to be highly visible so that the +reader is always aware when the macro facility is being invoked.} + +\narrowthing{Language and Typesetter Independence:}{Unlike +Knuth's original\xx{language}{independence}\xx{typesetter}{independence} +Web system which was specific to the Pascal programming language\paper{BSI82} +and the \TeX{} typesetting language\paper{Knuth84}, FunnelWeb strives to +be language and typesetter independent. The current version of FunnelWeb +is completely language independent, but is still somewhat dependent on the +\TeX{}\x{TeX} typesetter language.} + +\narrowthing{Portability:}{FunnelWeb\x{portability} has been written in +the~C programming language with great emphasis on portability. +FunnelWeb currently runs on the Sun, VAX, IBM PC, and Mac.} + +\narrowthing{Controllable:}{FunnelWeb\x{controllability} +is an extremely controllable tool. +To protect users' investment in source files constructed in the FunnelWeb +macro language, the C source code to FunnelWeb has been released under GNU +license.\xx{GNU}{license} +This means that it will always be available to everyone. Furthermore, +license has been granted for the FunnelWeb User's Manual and FunnelWeb +Hacker's Manual to be copied freely so long as they are not modified. All +this means that FunnelWeb is not going to disappear suddenly.} + +\narrowthing{A Production Tool:}{Above\x{production tool} +all, FunnelWeb has been designed to be +a production tool and every effort has been made to ensure that it will +operate effectively in a professional environment. FunnelWeb is \dq{open} +and portable. There is a comprehensive user manual. Its error messages +are comprehensive. It is fast. Finally, it has been designed with the +experience of three years of using FunnelWeb~V1.} + +For more information on the history and design of FunnelWeb, see +the \i{FunnelWeb Hacker's Manual}. + +\section{The Name FunnelWeb} +\xx{FunnelWeb}{name} + +The name \dq{FunnelWeb} was chosen because it contains the name \dq{WEB}, +which is the name of Knuth's system. It was also chosen because it +has a distinctly Australian flavour. + +Funnel-web spiders\xx{Funnel-web}{spider} +are found in Northern and Eastern Australia. They are +about three to four centimetres long and are very poisonous. The +Sydney\x{Sydney} +Funnel-web spider (\i{Atrax robustus}\x{Atrax robustus}), +common in Sydney, +has caused the most trouble and has been responsible for several deaths. +Funnel-web spiders love to crawl into temporarily discarded shoes where they +later react in a hostile manner to an unsuspecting foot. They are known +to hang on once they sink their fangs in. Funnel-web spiders derive +their name from the shape of their webs which are horizontally-aligned +narrowing tubes, open at one end\paper{ANZE}. + +The Funnel-web spider, like the tiger snake\xx{tiger}{snake} +and the white pointer shark,\xx{white pointer}{shark} +is secretly regarded by Australians as a kind of national +treasure.\xn{Edna}{Everage}\xn{Barry}{Humphries} + +\begin{verse} +\b{F} is for Funnel-web\\ +Our furry-legged foe.\\ +He sleeps in your slipper\\ +And breakfasts on toe.\\ +--- One verse from \i{A Megastar's Mantras: Things that Mean a Lot to Me},\\ +\qquad{} by Dame Edna Everage\paper{Humphries91}.\\ +\end{verse} + +\section{A FunnelWeb Tutorial} +\x{tutorial}\xx{tutorial}{introduction} + +The remainder of this chapter consists of an introductory tutorial on +FunnelWeb. Ideally you should have a working version of FunnelWeb in front +of you when reading this chapter so that you can try out the examples +yourself. There is no need to try all the examples so long as you +type in enough to feel comfortable with what you are reading. There +is no harm in reading this chapter offline too, so long as you get to the +computer within a couple of days to reinforce what you have read. + +For best effect, you should create a new, temporary, empty directory in +which to experiment with FunnelWeb. That way, it will be more obvious +when FunnelWeb creates an output file. You can either type in the +examples in this chapter directly, or copy and paste them from the \LaTeX{} +source file for this chapter or the FunnelWeb +test suite. The source file for this chapter should be available +in a file such as \p{/fwdir/userman/ch1.tex}. The test suite should be +available in a directory such as \p{/fwdir/tests/}. The +test files called \p{ex01.fw} through \p{ex16.fw} contain the examples in this +chapter. The test files called \p{hi01.fw} through \p{hi10.fw} contain the +examples in the next chapter. + +If you do not yet have an installed copy of FunnelWeb, refer to +Chapter~\ref{chapinstall} for full details on how to obtain and install +a copy of FunnelWeb. If you are not sure if you have an installed copy, +try invoking FunnelWeb by giving the command \dqp{fw}. If this yields an error +such as \dq{command not found} then you do not have a properly +installed version of FunnelWeb. + +\section{A Hello World Document} +\x{hello world document} + +Just as one starts the process of learning a new programming language with a +\dq{Hello World} program, when learning FunnelWeb, you can start with a +\dq{Hello World} document! And here it is! Edit a text file +called \p{hello.fw} and put the following text in it. (Note: The second +character is the letter \dq{Oh}, not the digit \dq{Zero}). + +\begin{verbatim} +@O@<hello.txt@>@{Hello World@+@} +\end{verbatim} + +To \dq{run} this \dq{program}, invoke FunnelWeb using the \dqp{fw} +command as follows.\x{invoking FunnelWeb} + +\begin{verbatim} +fw hello +\end{verbatim} + +\i{If this command doesn't work, then chances are that +FunnelWeb has not been installed on your machine. Refer to +Chapter~\ref{chapinstall} for full details on how to obtain and install +a copy of FunnelWeb.} + +There should be no errors. If there are, have a look +at the listing file \p{hello.lis}, which should contain an explanation of the +error, and compare the area in the file where the error occurred with the +text above. If there are no errors, you will find that the following +two files have been created. + +\begin{verbatim} +hello.lis - The LISTING file. +hello.txt - The PRODUCT file. +\end{verbatim} + +Take a look at \p{hello.txt}. It should contain a single line with the +text \p{Hello World}. Let's take another look at the input file. + +\begin{verbatim} +@O@<hello.txt@>@{Hello World@+@} +\end{verbatim} + +The whole structure of the input file is controlled by \dqp{@}, +called the \newterm{special character}, which +introduces \newterm{special sequence}s. A scanner's-eye view of the command +line looks like this: + +\begin{verbatim} +@O @< "hello.txt" @> @{ "Hello World" @+ @} +\end{verbatim} + +The \p{@} character controls everything. In this file we have six different +special sequences that together +form a single macro definition. The \p{@<}\x{@<} and \p{@>}\x{@>} +delimit the name of +the macro. The \p{@O}\x{@O} signals the start of the macro +definition and indicates that the macro is to be connected to a product +file with the same name as the macro (This is is why we got a product file when +we ran FunnelWeb). The \p{@\{} and \p{@\}}\x{@braces} +delimit the body of the macro. +Finally, the \p{@+}\x{@+} instructs that an end of line sequence should be +inserted at that point in the product file. + +If you think this syntax looks messy, then you're right. +It \i{is} +messy. FunnelWeb \i{could} have employed a \dq{simpler} notation +in which more of the \p{@} sequences were eliminated. For example: + + +\begin{verbatim} +Warning: This example is NOT legal FunnelWeb. + +#hello.txt{Hello World+} +\end{verbatim} + +However, if such a syntax were used, the user (you!) would have to remember +that \p{\#} starts a new macro. You would also have to remember that +the characters \p{\}} and \p{+} cannot be used in a macro body without a fuss. +And so on. FunnelWeb is messier, but provides one simple +rule:\xx{simple}{rule} \i{Nothing special happens +unless the special character \p{@} appears.} + +This means that in FunnelWeb, you can look at large blocks of text in the +confidence that (unlike for the C +pre-processor\xx{C}{preprocessor}) there are no macro calls +hidden in there. If there were, there would be an \p{@} +character!\footnote{The only +exception to this rule occurs where the user has explicitly changed the +special character using the \p{@=}\x{@=} special sequence.} + +Let's take another look at the hello world program. + +\begin{verbatim} +@O@<hello.txt@>@{Hello World@+@} +\end{verbatim} + +In its current form, it consists of a single macro definition. This definition, +while completely valid on its own, only represents half the power of +FunnelWeb. In fact you could say that it is a \dq{Hello +Northern Hemisphere Program}.\x{Hello Northern Hemisphere Program} +To turn it into a proper FunnelWeb \dq{Hello +World} program, we need to add some documentation! + +A FunnelWeb input file consists of a sequence of macro definitions surrounded +by a sea of documentation which is just ordinary text. Modify your hello +world document so that it looks like this: + +\begin{verbatim} +This hello world document was created by -insert your name here-. + +@O@<hello.txt@>@{Hello World@+@} + +It writes out a file called hello.txt containing the string ``Hello World''. +\end{verbatim} + +Now run it through FunnelWeb, but this time, add a \p{+t} to the command line. + +\begin{verbatim} +fw hello +t +\end{verbatim} + +If all goes well, you should find that you now have + +\begin{verbatim} +hello.lis - A LISTING file. +hello.tex - A DOCUMENTATION file (in TeX format). +hello.txt - A PRODUCT file. +\end{verbatim} + +Take a look at \p{hello.txt}. You will find that it is identical to the +\p{hello.txt} of the previous run. Only macro +definitions affect the product files that FunnelWeb produces (as a result +of \p{@O} macro definitions). The surrounding documentation has \i{no} +effect. In contrast, the new file, \p{hello.tex} (have a look at it now) +which was created as +a result of your adding the \p{+t} option contains a fairly full +representation of the input file. Whereas \p{hello.txt} is the +\i{product file} of FunnelWeb, \p{hello.tex} is the \i{documentation file}. +Try typesetting the documentation file now using +the \TeX{} typesetting program. Then print it. +The following commands are an example of the +sort of commands you will have to give to do this. + +\begin{verbatim} +tex hello ! Typeset the documentation. +lpr -Pcslw -d hello.dvi ! Print the typeset documentation. +\end{verbatim} + +The result should be a single page containing the two lines of documentation +along with a typeset representation of the macro. +At this point, you have exercised the two main aspects of +FunnelWeb.\xx{FunnelWeb}{two main aspects} +Starting +with an input file containing macros (or in this case macro) and documentation, +you have successfully generated a product file based on the macros, and +a documentation file, based on the entire document. Congratulations! + +The remainder of this tutorial is divided into two parts, which focus on +FunnelWeb's macro facilities and its typesetting facilities. By tradition, +the generation of program files from a literate text is called +\newterm{Tangling}, and the generation of typeset documentation is +called \newterm{Weaving}.\footnote{In FunnelWeb, these two functions +are aspects of a single computer program. However, in Knuth's WEB\x{WEB} +system, +the two functions are embodied in two separate computer programs called +Tangle and Weave, presumably because, as everyone knows, \dq{it takes +two to Tangle}.} + +\section{Macro Facilities} +\xx{tutorial}{macro facilities} + +The hello world program of the previous section exercised both the macro +expansion (product-file) aspect of FunnelWeb, and the typesetting +(documentation file) aspect +of FunnelWeb. This section contains an exposition of the macro facilities, +and totally ignores the documentation side. This is partly to increase the +focus of the tutorial, and partly because documentation is usually bulky and +would take too long for the reader to type in to make the tutorial effective. + +\subsection{Simple Macros} +\xx{tutorial}{simple macros}\xx{tutorial}{macros simple} + +The original \dq{Hello World} program consisted of a single macro definition. + +\begin{verbatim} +@O@<hello.txt@>@{Hello World@+@} +\end{verbatim} + +In fact, this is a rather exceptional macro, as it causes its expansion to +be written to a +product file. The \p{@O}\x{@O} (for \b{O}utput) signals this. +In FunnelWeb, most macros are +defined using \p{@\$}.\x{@dollar} +This results in a macro that does not generate a product +file, but which can be called in other macros (including \p{@O} macros). +Let us expand the hello world program to include some other macros. + +\begin{verbatim} +@O@<hello.txt@>@{@<Greetings@>@+@} + +@$@<H@>==@{Hello@} +@$@<W@>==@{World@} + +@$@<Greetings@>==@{@<H@> @<W@>@} +\end{verbatim} + +Type in the file and run it through FunnelWeb using the command: + +\begin{verbatim} +fw hello +\end{verbatim} + +The product file (result.out) should look like this: + +\begin{verbatim} +Hello World +\end{verbatim} + +This short program illustrates some of the features of ordinary macros in +FunnelWeb. Consider the \p{@O} macro. Instead of containing +straight text (\dq{Hello World}), it now contains the macro call +\p{@<Greetings@>}. A FunnelWeb macro can be called from within the body of +another macro just by giving the macro +name delimited in \p{@<} and \p{@>}. + +At the bottom of the file is the +definition of the \p{@<Greetings@>} +macro. The definition is similar to the definition of \p{hello.txt} except +that it starts with \p{@\$} to indicate that no product file +is desired from this macro (directly). It also employs the optional +\p{==} syntax which has no semantic impact, but +can be used to make definitions clearer. +The body of the \p{@<Greetings@>} macro consists of +calls to the \p{H} and \p{W} macros which are defined immediately above. + +Note that the macros are not constrained to be +defined in any particular order. One of the main +features of literate programming tools is that +they allow the different parts of the text document being developed (usually +a computer program) to be layed out in any +order.\xx{order}{program}\xx{program}{layout} So long as there is a +definition somewhere in the input file for every macro call, FunnelWeb +will sort it all out. + +In fact, FunnelWeb's macro facility is very simple.\xx{macro}{bindings} +Unlike many macro preprocessors which allow macros to define other macros, +FunnelWeb completely +finishes parsing and analysing the macros in the input file before it +starts expanding them into product files. Other preprocessors allow +macros to +be redefined like variables (as in, say, \TeX{}\x{TeX}) taking on +many different values as the macro pre-processor travels through the input +file. In contrast, +FunnelWeb has no concept of \dq{different times} and +treats the input as one huge static orderless, timeless, +collection of definitions. +In FunnelWeb, there is only ever one time, and so there can only ever be +one value/definition for each macro. + + +\subsection{Number of Times Called} +\x{number of times called}\xx{calls}{number}\xx{invocation}{number} + +So far we have seen only tiny, degenerate input files. The next example +moves up to the level of \dq{trivial}, but starts to convey the flavour of +the way FunnelWeb can be used in practice. Normally, there would be +documentation text appearing between the macros, but this has been omitted +so as to keep the focus on the macros themselves. Although the next +example is +much longer than the previous example, the only new construct is \p{@-} +which can appear only at the end of a line, +and suppresses it,\xx{EOL}{suppression} +preventing it from appearing in the text. The \p{@-}\x{@-} construct allows +the text of a macro to be aligned at the left margin, rather than +having the first line hanging at the end of the +\p{@\{}. FunnelWeb could have been set up so that this end of +line marker was suppressed. However, it would have been a special case that +would have broken the very memorable rule \dq{the text of a macro is the +text appearing between the \p{@\{} and \p{@\}}}. + +Type the following text into the file \p{hello.fw} +and run it through FunnelWeb. The file contains some intentional errors so +be sure to type it in exactly and worry only if FunnelWeb \i{doesn't} +generate some errors. + +\begin{verbatim} +@O@<hello.c@>==@{@- +@<Include Files@> +@<Include Files@> +@<Main Program@> +@} + +@$@<Main Program@>==@{@- +main() +{ + doit(); +} +@} + +@$@<Subroutine@>==@{@- +void doit() +{ + int i; + for (i=0;i<10;i++) + { + @<Print@> + @<Print@> + } +}@} + +@$@<Print@>==@{@- +printf("Hello World!"); +printf("\n");@} + +@$@<Scan@>==@{scanf@} + +@$@<Include Files@>==@{@- +#include <stdio.h> +#include <stdlib.h>@} +\end{verbatim} + +What happened? Well, if you haven't typed the file in properly, you may +get some miscellaneous syntax errors. Fix these before continuing. +If the file has been correctly typed, you should be faced with some error +messages to do with the number of times some of the macros are called. + +By default, FunnelWeb insists that each macro defined is invoked +exactly once. However, the file above defines macros that are used +more than once and a macro that is not used at all. Let us examine the +errors. + +First, we see that FunnelWeb has alerted us to the fact that +the \p{Include Files} macro has been called twice. Once alerted to this, +a quick look at the program convinces us that calling the macro twice is +a mistake, and that one of the calls should be eliminated. + +Second, we note that FunnelWeb has alerted us to the fact that the +\p{@<subroutine@>} +macro is never called. Again, a quick look at the program tells us that this +is a mistake (and a very common one in the use of FunnelWeb), and that +a call to the \p{@<subroutine@>} macro should be inserted just above +the call to the \p{@<Main Program@>} macro +in the definition of \p{@<hello.c@>}. + +These two cases demonstrate why these checks have been placed in +FunnelWeb. It is nearly always acceptable for a macro to be called once. +However, if a macro is not called at all, or called more than once, +this is often a sign +that the user has made a mistake. + +These checks have a dark side too. In addition to the +errors mentioned above, FunnelWeb has generated two similar +errors that do not help us. + +First, we are alerted to the fact that the +\p{@<print@>} macro has been called twice. Clearly, in this case, this is not +a problem, and so here FunnelWeb's fussiness is a nuisance. + +Second, we are alerted to the fact that the \p{@<scan@>} macro has never +been called. Like the \p{@<print@>} macro, +this macro was defined as a notational +convenience, and clearly it does not matter here if it is not used. Again, +FunnelWeb is being a nuisance. + +The four cases above demonstrate the light and dark side of +FunnelWeb's insistence that each macro be called exactly once. To resolve +the conflict without reducing the strength of the checking, FunnelWeb +provides two special sequences \p{@Z} (for \b{Z}ero) and \p{@M} (for \b{M}any) +that can be attached to macro definitions. Presence of the +\p{@Z}\xx{@Z}{tutorial} +tag allows the designated macro to be called zero times. +Presence of the +\p{@M}\xx{@M}{tutorial} +tag allows the designated macro to be called more than once. +A single macro may carry both tags. +It is always true that all macros are allowed to be called exactly once. + +Here is the revised program with the errors fixed, +by eliminating or adding macro calls, or by adding tags. +Try processing the file now. There should be no errors. + +\begin{verbatim} +@O@<hello.c@>==@{@- +@<Include Files@> +@<Function@> +@<Main Program@> +@} + +@$@<Main Program@>==@{@- +main() +{ + doit(); +} +@} + +@$@<Function@>==@{@- +void doit() +{ + int i; + for (i=0;i<10;i++) + { + @<Print@> + @<Print@> + } +}@} + +@$@<Print@>@M==@{@- +printf("Hello World!"); +printf("\n");@} + +@$@<Scan@>@Z==@{scanf@} + +@$@<Include Files@>==@{@- +#include <stdio.h> +#include <stdlib.h>@} +\end{verbatim} + +\subsection{Indentation} +\xx{indentation}{macro calls} + +The body of the \p{print} macro of the previous example +contains two lines of text. +A literal substitution of this macro's body in its context would result in: + +\begin{verbatim} + { + printf("Hello World!"); +printf("\n"); + printf("Hello World!"); +printf("\n"); + } +\end{verbatim} + +But instead, it comes out as (have a look at this part of \p{hello.c} now): + +\begin{verbatim} + { + printf("Hello World!"); + printf("\n"); + printf("Hello World!"); + printf("\n"); + } +\end{verbatim} + +The explanation is that FunnelWeb indents each line of multiline macros +by the level of indentation at the point of call. +This means that, as in the case above, program texts, which are usually +highly indented, come out looking \dq{right}. + +In other circumstances, where the model of the text is one dimensional, +FunnelWeb's indentation could become an impediment or even a danger. +In these cases, it +can be switched off by including the FunnelWeb \newterm{pragma} line + +\begin{verbatim} +@p indentation = none +\end{verbatim} + +anywhere in the input file. + +One of the design goals of FunnelWeb is to allow the user total control over +the product files. This contrasts with the approach of Knuth's WEB\x{WEB} +system +\paper{Knuth83} (upon which FunnelWeb is based), which mangles the input +text at the Pascal\x{Pascal} program syntax level, truncating identifiers, +converting +the text to upper case, and paragraphing text. Here is an example of part of +a Pascal program produced by WEB\xx{output}{WEB} +(from page~14 of \paper{Knuth83}): + +\begin{verbatim} +IF R=0 THEN XREF[P]:=XREFPTR ELSE XMEM[R].XLINKFIELD:=XREFPTR;END;{:51} +{58:}FUNCTION IDLOOKUP(T:EIGHTBITS):NAMEPOINTER;LABEL 31; +VAR I:0..LONGBUFSIZE;H:0..HASHSIZE;K:0..MAXBYTES;W:0..1; +L:0..LONGBUFSIZE;P:NAMEPOINTER;BEGIN L:=IDLOC-IDFIRST;{59:} +H:=BUFFER[IDFIRST];I=IDFIRST+1; +WHILE I<IDLOC DO BEGIN H:=(H+H+BUFFER[I])MOD HASHSIZE;I=I+1;END{:59}; +\end{verbatim}\checked{I can't believe I actually typed this mess in.} + +Knuth's theory is that the program generated by a literate programming +system should be +treated as object code and hence should look like object code +too.\x{object code} While this +may be an admirable approach in the long run, the present programming +environment is one of faulty compilers and buggy tools. +The FunnelWeb view is that, in this environment, +the programmer needs all the help he can get +and that therefore he should be allowed total control over +the product file. Another reason for FunnelWeb's providing total +control over the product file, is that FunnelWeb is intended to be +target language independent, and so even if Knuth's view were adopted, it +would not be clear what a legitimate transformation of the text could be. + +\subsection{Additive Macros} +\xx{additive}{macros} + +Sometimes it is convenient to build up the definition of a macro in +stages throughout the input file. In FunnelWeb, this can be done using +an \newterm{additive macro}. +An additive macro is identical to an ordinary macro except +that\xx{tutorial}{==}\xx{tutorial}{+=} + +\begin{enumerate} +\item It has \p{+=} instead of \p{==}. +\item It can be defined in one or more parts throughout the input file. +The definition of the macro is the concatenation of all the parts in the +order in which they appear. +\end{enumerate} + +The following example shows how additive macros +can be used to scatter and regroup information, in this +case assisting in the lucid construction of a +data abstraction\xx{data}{abstraction} in a language (Pascal\x{Pascal}) +that does not support them explicitly. + +\begin{verbatim} +@!****************************** + +@O@<prog.pas@>==@{@- +program adt(input,output); +@<Types@> +@<Variables@> +@<Procedures@> +begin startproc; end. +@} + +@!****************************** + +@$@<Types@>+=@{@- +type buffer_type = + record + length : integer; + buf : array[1..100] of char; + end; +@} + +@$@<Variables@>+=@{@- +bigbuf : buffer_type; +@} + +@$@<Procedures@>+=@{@- +procedure buf_init (var b : buffer_type ) {Body of buf_init} +procedure buf_add (var b : buffer_type; ch : char) {Body of buf_add} +procedure buf_get (var b : buffer_type; var ch : char) {Body of buf_get} +@} + +@!****************************** + +@$@<Types@>+=@{@- +type complex_type = record r,i : real; end; +@} + +@$@<Procedures@>+=@{@- +procedure cm_set (var c: complex_type; a,b: real) {Body of cm_set} +procedure cm_add (a,b: complex_type; var c: complex_type) {Body of cm_add} +{Other procedures and functions} +@} + +@!****************************** + +{...more pieces of program...} + +@!****************************** +\end{verbatim} + +It is important to remember that the definition of each macro does not change +throughout the input file. FunnelWeb parses the entire input file and +assembles all the macro definitions before it even starts to expand macros. +As a result, each additive macro can only have one definition, and that +definition is the concatenation of all its parts. + +The example above shows how additive macros can be used to rearrange the +presentation of a computer program in the order in which the user wishes +to discuss it rather than the order in which the compiler requires that it +be consumed. It is easy, however, to abuse the feature of additive macros. +In many cases, the same effect can be obtained more clearly by replacing +each part of an additive macro in-situ using uniquely named non-additive +macros, and then collect them together as a group at the point where the +additive macro is called. Doing this is more work, and is more error +prone, but can result in a clearer exposition. +The following program illustrates this alternative approach. + +\begin{verbatim} +@!****************************** + +@O@<prog.pas@>==@{@- +program adt(input,output); +@<Types@> +@<Variables@> +@<Procedures@> +begin startproc; end. +@} + +@$@<Types@>==@{@- +@<Buffer type@> +@<Complex type@> +@} + +@$@<Variables@>==@{@- +@<Buffer variable@> +@} + +@$@<Procedures@>==@{@- +@<Buffer procedures@> +@<Complex procedures@> +@} + +@!****************************** + +@$@<Buffer type@>==@{@- +type buffer_type = record + length : integer; + buf : array[1..100] of char; + end; +@} + +@$@<Buffer variable@>==@{@- +bigbuf : buffer_type; +@} + +@$@<Buffer procedures@>==@{@- +procedure buf_init(var b : buffer_type) {Body of buf_init} +procedure buf_add(var b : buffer_type; ch : char) {Body of buf_add} +procedure buf_get(var b : buffer_type; var ch : char) {Body of buf_get} +@} + +@!****************************** + +@$@<Complex type@>==@{@- +type complex_type = record r,i : real; end; +@} + +@$@<Complex procedures@>+=@{@- +procedure cm_set(var c: complex_type; a,b : real) {Body of cm_set} +procedure cm_add(a,b : complex_type; var c: complex_type) {Body of cm_add} +{Other procedures and functions} +@} + +@!****************************** + +{...more pieces of program...} + +@!****************************** +\end{verbatim} + +One of advantages of FunnelWeb (and literate programming in general) is that +(as shown above) it allows the user to lay out the program in whatever order is +desired\xx{program}{layout} +with near total independence from the ordering requirements of the +target programming language. + +Additive macros are allowed to be tagged with \p{@Z} and \p{@M} just as other +macros can, but the tags must appear only on the first definition of the +macro. Additive macros cannot be connected directly to product files. + +\subsection{Parameterized Macros} +\xx{parameterized}{macros} + +No self-respecting macro preprocessor would be complete without some form +of macro parameterization, and FunnelWeb is no exception. FunnelWeb allows +each macro to have from zero to nine formal parameters\xx{formal}{parameters} +named \p{@1}\x{@1...}, \p{@2}, +\p{@3}, \p{@4}, \p{@5}, \p{@6}, \p{@7}, \p{@8}, and \p{@9}. + +To define a macro with one or more parameters, insert a formal parameter +list\xx{formal}{parameters} +just after the macro name in the macro definition. Because macro +parameters have fixed names (\p{@1}$\ldots$\p{@9}), there is no need to +specify the names of formal parameters in the formal parameter list. +All that need be conveyed is how many parameters the macro has. +Here is an example of the definition of a macro having three parameters: + +\begin{verbatim} +@$@<While loop@>@(@3@)@M==@{@- +@1 +while (@2) + { + @3 + } +@} +\end{verbatim} + +To call a parameterized macro, an actual +parameter\xx{actual}{parameters} list must be supplied +that contains exactly the same number of actual parameters as there are +formal parameters in the definition of the macro being called. An actual +parameter list is delimited by \p{@(}\x{@(} +and \p{@)},\x{@)} and parameters are +\i{separated} by \dqp{@,}.\x{@,} The actual parameters themselves are general +FunnelWeb expressions (see Chapter~\ref{chapdefinition} +for the exact syntax) and can +be inserted into the list directly or can be delimited by \p{@"}\x{@"} so as to +allow some white space to assist in formatting the actual parameters. +Here are some examples of calls of the \p{While loop} macro defined above. + +\begin{verbatim} +@! First form of actual parameters without whitespace and double quotes. +@<While loop@>@(x=1;@,x<=10@,printf("X=%u\n",x);@) + +@! Second form of actual parameters. The double quotes allow non-active +@! whitespace that helps to lay out the actual parameters neatly. +@! This call is functionally identical to the one above. +@<While loop@>@( + @"x:=1;@" @, + @"x<=10@" @, + @"printf("X=%u\n",x);@" @) + +@! The two forms can be mixed in a single call. +@<While loop@>@(x=1;@,x<=10@, + @"printf("X=%u\n",x);@" @) +\end{verbatim} + +A few rules about parameterized macros are worth mentioning. +Macros that do not have any parameters must have no formal or +actual parameter lists.\xs{parameter list}{absent} +Additive macros can have parameters, but the formal parameter list +must appear in the first definition part only. + +Here is another example of the use of parameterized macros. This time, +parameters and macro calls are used in a FunnelWeb input file +that constructs an $O(n)$ representation +of a song\x{song}\x{twelve bugs of christmas} whose full size is +$O(n^2)$ in the number $n$ of unique +lines.\x{rec.humor.funny}\xn{Pat}{Scannel} + +\begin{verbatim} + +@O@<Twelve_bugs.txt@>==@{@- +The Twelve Bugs of Christmas +---------------------------- +@<Verse@>@(@"first@" @,@<1@>@) +@<Verse@>@(@"second@" @,@<2@>@) +@<Verse@>@(@"third@" @,@<3@>@) +@<Verse@>@(@"fourth@" @,@<4@>@) +@<Verse@>@(@"fifth@" @,@<5@>@) +@<Verse@>@(@"sixth@" @,@<6@>@) +@<Verse@>@(@"seventh@" @,@<7@>@) +@<Verse@>@(@"eighth@" @,@<8@>@) +@<Verse@>@(@"ninth@" @,@<9@>@) +@<Verse@>@(@"tenth@" @,@<A@>@) +@<Verse@>@(@"eleventh@" @,@<B@>@) +@<Verse@>@(@"twelfth@" @,@<C@>@) + +This song appeared in the internet newsgroup rec.humor.funny on 24-Dec-1991. +It was contributed by Pat Scannell (scannell@@darkstar.ma30.bull.com). +@} + +@$@<Verse@>@(@2@)@M==@{@- +For the @1 bug of Christmas, my manager said to me + @2 +@} + +@$@<1@>@M==@{See if they can do it again.@} +@$@<2@>@M==@{Ask them how they did it and@+@<1@>@} +@$@<3@>@M==@{Try to reproduce it@+@<2@>@} +@$@<4@>@M==@{Run with the debugger@+@<3@>@} +@$@<5@>@M==@{Ask for a dump@+@<4@>@} +@$@<6@>@M==@{Reinstall the software@+@<5@>@} +@$@<7@>@M==@{Say they need an upgrade@+@<6@>@} +@$@<8@>@M==@{Find a way around it@+@<7@>@} +@$@<9@>@M==@{Blame it on the hardware@+@<8@>@} +@$@<A@>@M==@{Change the documentation@+@<9@>@} +@$@<B@>@M==@{Say it's not supported@+@<A@>@} +@$@<C@>@M==@{Tell them it's a feature@+@<B@>@} +\end{verbatim} + +\subsection{Macro Expansion} +\xx{macro}{expansion} + +One of the strengths of FunnelWeb is that, when writing product files, it +does not attempt to evaluate any text expression (\eg{}text block, parameter, +macro call) in memory\xx{memory}{use of} +and then write the result out. Instead, it always +writes out what it is expanding dynamically and directly. This means that +the user need not fear defining macros that expand to huge amounts of text +and then calling those macros in other macros, or passing those huge macros +as parameters to other macros. In all cases, FunnelWeb expands directly to +the product file, and there can be no danger in running out of memory during +expansion (except for running out of stack space and other +marginally used resources in pathological cases). + +The only thing to remember in this regard is that FunnelWeb always stores +the entire \i{input} file and all included files, in their entirety in +memory, for the duration of the run. + +Here is an example, that illustrates how robust FunnelWeb is: + +\begin{verbatim} +@! FunnelWeb copes well with the following macro definitions. +@! (Providing that it has a little over ten megabytes of memory). + +@O@<woppa.txt@>==@{@<Quote@>@(@<Humungeous@>@)@+@} + +@$@<Quote@>@(@1@)==@{"@1"@} + +@$@<Humungeous@>==@{@- +...Ten Megabytes of Text... +@} +\end{verbatim} + +\subsection{Include Files} +\xx{include}{files} + +FunnelWeb provides a nested include file facility that can be used for a +number of purposes. When FunnelWeb runs into a single line containing the +special sequence \p{@i}\x{@i} followed by a blank, followed by a file name, +it reads in the designated +file and replaces the line containing the command (including the end of +line marker at the end of the line) with the entire contents +of the designated file. For example, if there was a file called +\p{camera.txt} containing the two lines:\xx{poem}{camera}\xx{animal}{poem} + +\begin{verbatim} +'Cos I shoot with a camera instead of a gun. +The animals flock to be petted and fed, +\end{verbatim} + +and another file called \p{poem.fw} +containing the following four lines\x{shooting} + +\begin{verbatim} +I like to go shooting, it's a whole lot of fun, +@i camera.txt +Cos they know my camera isn't loaded with lead. +- RNW, 04-Jan-1991. +\end{verbatim} + +Then, if FunnelWeb were to process \p{poem.fw}, the result would be +as if FunnelWeb had read in: + +\begin{verbatim} +I like to go shooting, it's a whole lot of fun, +'Cos I shoot with a camera instead of a gun. +The animals flock to be petted and fed, +'Cos they know my camera isn't loaded with lead. +- RNW, 04-Jan-1991. +\end{verbatim} + +FunnelWeb expands include files before it starts scanning and parsing the +included text. The result is that include files can contain anything that +can be found in a FunnelWeb file. The following example illustrates +the level at which the include mechanism operates. If \p{main.fw} contains + +\begin{verbatim} +@O@<output.dat@>==@{@- +@i inc.fw +This is the text of the sloth macro. +@} +\end{verbatim} + +and inc.fw contains + +\begin{verbatim} +@<Sloth@> +@} + +@$@<Sloth@>==@{@- +\end{verbatim} + +Then if FunnelWeb were applied to \p{main.fw}, it would see: + +\begin{verbatim} +@O@<output.dat@>==@{@- +@<Sloth@> +@} + +@$@<Sloth@>==@{@- +This is the text of the sloth macro. +@} +\end{verbatim} + +which it would process in the normal manner. The only special +sequence processing that takes place at a level lower +than include files is the processing of the \p{<special>=<newspecial>} +sequence which changes the special character.\xx{special character}{changing} + +A few other facts about include files are worth mentioning here. Include +files inherit the directory specification supplied using the \p{+I} command +line option. The special character is saved at the start of each include +file and restored to its previous value at the end of each include file. +Include files can be nested up to ten levels. +Recursive included files\xx{include files}{recursive} +will always cause an infinite recursion as there +is no bottoming out mechanism available. +Include files +must contain an integer number of lines (\ie{}the last line must be +terminated with an end of line marker). Once FunnelWeb has seen +\dqp{@i\ } at the start of a line, it will grab the rest of the +line raw and treat it as a file name. There is no place on the +line for things like FunnelWeb comments (see later) or extraneous text. + +Include files can be used for many purposes, but are particularly useful for +hauling in macro libraries.\xx{macro}{libraries} + +\section{Typesetting Facilities} +\xx{tutorial}{typesetting} + +The first half of this tutorial focuses solely on the macro facilities +of FunnelWeb (which it more or less covers completely). As a result, +the example documents you have seen so far have been gross +distortions of \dq{normal} FunnelWeb documents which often contain as much +documentation as +code.\x{documentation vs code}\x{code vs documentation}\footnote{As +an example, the author used +FunnelWeb to develop a largish computer program and found that on average +his style of using FunnelWeb resulted in about 30\% documentation and +70\% macros (code) (measured by numbers of lines).} +While there are applications where FunnelWeb can be used solely +as a macro preprocessor, most applications will use its +typesetting facilities as well. + +This section restores the balance in this tutorial +by presenting FunnelWeb's typesetting facilities. + +\subsection{Overview} +\xx{overview}{typesetting} + +The macro definitions discussed in the macro tutorial completely define +the contents of the product files that FunnelWeb will generate. These macro +definitions can be arranged in any order and nothing external to them +can affect the contents of the product files. The macros +can be thought of as a group of self-contained islands. + +Although FunnelWeb will can process the macros all on their own, +the full power of FunnelWeb +is realized only when the macros are surrounded by a sea of documentation. +This sea can take two forms: directives and free text. +Some of the directives control things such as the maximum input line +length. However, most of them are typesetting directives that affect +the printed documentation. +Thus a FunnelWeb document can be viewed as a sequence +of \newterm{macro definitions}, +\newterm{directives}, and \newterm{free text}. + +Unlike the product files which consist of unscrambled macro calls, +the documentation file is more or less a +direct representation of the input file. Each part of the input file +appears in the documentation file in the order in which it appears in the +input file. However, each different kind of part is +typeset\footnote{Here the term \dq{typeset} is used loosely to refer to +FunnelWeb's generation of typesetter commands for each construct in the +input file. Strictly, the term should be used only to describe the actions +of a typesetter program (\eg{}\TeX{}).} in a different +manner. Macros are typeset in a particular style, with the macro body +appearing in \p{tt font} (see some FunnelWeb printed documentation for +an example). Typesetter directives have specific defined +effects (more later). +Free text is typeset exactly as it is, except that each block of text +between blank lines is filled and justified as a paragraph. + +The following example demonstrates how all this works. Type in the following +as \p{example.fw} and run it through FunnelWeb with the +command \dqp{fw~example~+t}. The \dqp{+t} instructs FunnelWeb to generate +a documentation file called \p{example.tex}. +Run the file through \TeX{} and print it. +Examine the files \p{example.out} and \p{example.tex}. + +\begin{verbatim} +You are reading some free text before the macro. Free text can consist +of any text (not containing the FunnelWeb special character) including +typesetter commands +such as $, %, #, and \TeX{} which +will be typeset to appear exactly as they do in the input file! +Look out! Here comes a macro! + +@O@<example.out@>==@{@- +This text is part of +a macro definition. +@} + +This is free text following the macro. This sentence contains +two @{inline@} typesetter @/directives@/. +Now here is a non-inline typesetting directive. + +@t new_page + +This sentence will appear on the next page. +\end{verbatim} + +At the top of the \p{example.tex} documentation file will be a set of \TeX{} +macro definitions. The \TeX{} code corresponding to the input above +appears at the end of the file. It should look something like this. + +\begin{verbatim} +You are reading some free text before the macro. Free text can consist +of any text (not containing the FunnelWeb special character) including +typesetter commands +such as \$, \%, \#, and $\backslash$TeX$\{$$\}$ which +will be typeset to appear exactly as they do in the input file! +Look out! Here comes a macro! + +\fwbeginmacro +\fwfilename{example.out}{1}\fwequals \fwodef \fwbtx[This text is part of +a macro definition. +]fwetx=% +\fwcdef +\fwbeginmacronotes +\fwisafile{This macro is attached to an output file.} +\fwendmacronotes +\fwendmacro + +This is free text following the macro. This sentence contains +two \fwlit{inline} typesetter \fwemp{directives}. +Now here is a non-inline typesetting directive. + +\fwnewpage + +This sentence will appear on the next page. +\end{verbatim} + +The following points explain the \p{example.tex} file. + +\narrowthing{You don't have to know TeX:}{If you don't know +\TeX{}, don't pay too much +attention to this section. You don't need to know \TeX{} to use FunnelWeb.} + +\narrowthing{In order:}{FunnelWeb has merely transformed the +input. It hasn't rearranged it.} + +\narrowthing{Free text:}{Most of the free text has been simply copied over. +The \TeX{} typesetter justifies and fills all paragraphs fed to it by +default, so most of the text has just been copied verbatim.} + +\narrowthing{TeX codes:}{The characters and sequences which +\TeX{} treats as special have been neutralized in the documentation +file. For example, \dqp{\$} has become \dqp{\bs\$}. By +default, FunnelWeb allows the user to write any text as free text and not +have to worry about accidentally invoking typesetter features.} + +\narrowthing{fw sequences:}{The \p{fw} sequences (\eg{}\p{\bs{}fwbeginmacro}) +invoke \TeX{} macros defined +earlier in the documentation file (and not shown here).} + +\narrowthing{The macro:}{The macro is typeset using a set of predefined +\TeX{} macros. See the printed documentation to see what this looks like +on paper.} + +\narrowthing{Typesetter directives:}{Unlike the \TeX{} +command sequences (which +were neutralized), the FunnelWeb typesetter directives turn into \TeX{} macro +calls. For example, \dqp{@\{inline@\}} became \dqp{\bs{}fwlit\{inline\}}.} + +In summary, FunnelWeb produces typeset documentation that transforms, +but does not reorder, the input file. Macros are typeset in a specific +style. FunnelWeb typesetter directives have particular well-defined effects. +Free text is filled and justified, but will otherwise appear in the +printed documentation exactly as it appears in the input file. + +\subsection{Typesetter Independence} +\xx{typesetter}{independence} + +Although the current version of FunnelWeb can only generate documentation +files in \TeX{} form, +it encourages typesetter independence +by neutralizing all \TeX{} control sequences before writing them out. The +result is that you don't have worry about upsetting or depending on \TeX{} +by accidentally including some special character or sequence. By default your +input file is \newterm{typesetter independent}. + +This scheme differs from other literate programming tools, including +all earlier versions of FunnelWeb, which copy their free text directly +to the documentation file, the justification being that the programmer +can use the full power of the typesetter language to describe the program. +The disadvantages of doing this are first that the +programmer is required to know the typesetting language and second that +the input file becomes typesetter dependent. FunnelWeb avoids these problems +by knobbling the free text be default. + +However, FunnelWeb does provide a trapdoor for those who want their +free text to be fed directly to \TeX{}. To open the trapdoor, +simply include the following pragma somewhere in your input file. + +\begin{verbatim} +@p typesetter = tex +\end{verbatim} + +See Section~\ref{typesetterpragma} for more information. + +FunnelWeb leaves the degree to which +the user wishes to bind a particular document to a particular typesetter +up to the user. In some cases, the extra typesetting power may compensate +for the lack of portability. However, as a rule, it is best to +avoid typesetter-specific commands, so as to allow your input files to +be formatted at a later date for different typesetters. +FunnelWeb includes a number of its own typesetter commands so as to +support typesetter-independent input files. +The following sections describe some of these commands. In particular, +the next section describes the most powerful FunnelWeb typesetting directives +which allow the user to structure the document hierarchically. + +\subsection{Hierarchical Structure} +\xx{hierarchical}{structure} + +The tree structure is one of the most effective structuring tools that +exists, deriving its power from the principal of divide and conquor. +So effective is it that the internal organization of +most technical books are tree +structures which are concisely summarized in the table of contents. +In contrast, computer programs +are usually presented as flat sequences of text to be consumed by an +anonymous compiler. + +In order to bring program documentation up to the structural +sophistication commonplace in technical books, FunnelWeb provides five levels +of section headings\xx{section}{headings} +implemented by the five special sequences \p{@A},\x{@A...} \p{@B}, +\p{@C}, \p{@D}, and \p{@E}. These must always appear at the start of a line. +\p{@A} is the highest level section +(\eg{}like \LaTeX{}'s \p{\bs{}chapter}) and \p{@E} is the lowest level +section (\eg{}like \LaTeX{}'s \p{\bs{}subsubsubsection}). +Section headings can appear anywhere in +the free text of a FunnelWeb input file (\ie{}anywhere except inside a +macro definition). + +Each section heading\xx{name}{section} in a FunnelWeb document +has an associated name. +The name of a section can be provided explicitly by supplying it +delimited by \p{@<} and \p{@>} immediately after the section sequence +(\eg{}\p{@A}), or implicitly by not providing an explicit name, in which +case the section takes the name of the first macro defined between the +section header in question and the following section header. An error is +generated if a section has not been given an explicit name and does not +contain any macro definitions. Here are some example headings: + +\begin{verbatim} +@A@<Feed the Penguins and Save the World@> +@B@<Feed the Penguins@> +@C@<Feed the little penguins@> +@C@<Feed the big penguins@> +@B@<Save the World@> +@C@<Save Europe@> +@C@<Save Africa@> + +@C This heading hasn't been given an explicit name, but will inherit the +name \p{Save the rest of the world} from the macro definition below. + +@$@<Save the rest of the world@>@Z==@{...@} +\end{verbatim} + +The feature of having unnamed sections inherit the name of the first +macro defined within their scope is present because a common style of +writing in FunnelWeb is to have one section per macro definition. Because, +under this style, +each section describes a single macro, it usually turns out that the +macro name makes a good name for the section too. The inheritance mechanism +prevents duplication of the name.\xx{section name}{inheritance} + +Apart from the requirement that each section have an explicit or implicit +name and that its special sequence appear at the start of a line, the only +other restriction on section headings is that a section heading at level +$n$ cannot appear immediately after a section heading at level $n-1$ or less. +In other words, the hierarchy cannot be broken. For +example, an \p{@C} cannot appear after an \p{@A} heading unless there +is an intervening \p{@B} heading. + +\begin{verbatim} +@A@<The Top Heading@> +@C@<Level C here is not allowed after an A and will cause an error@> +\end{verbatim} + +This rule extends to the start of the +file; if there are any headings at all, the first one must be an \p{@A} +heading. The following file, while short, is in error. + +\begin{verbatim} +This FunnelWeb input file is in error because its first section heading +is at level C rather than level A. +@C@<2@> +\end{verbatim} + +\subsection{Understanding the Printed Documentation} + +Type in the following file, and use FunnelWeb and \TeX{} to generate the +corresponding printed +documentation.\xx{programmer's}{cheer}\xx{hacker's}{cheer} +\xx{hacker's}{dictionary} + +\begin{verbatim} +@A@<Table of Contents@> + +@t table_of_contents + +@A@<Macros for Moral Support@> + +The following macro contain comments that provide moral support in the +output code. + +@$@<Programmer's Cheer@>@M==@{ +-- Shift to the left! +-- Shift to the right! +-- Pop up, push down! +-- Byte! Byte! Byte! +-- (From "The New Hacker's Dictionary"). +@} + +The next macro is similar but is distributed throughout the program. +@$@<Hacker's Cheer@>+=@{@+-- Pointer to the left@+@} + +@A@<An Extremely Imperative Stack Abstraction@> + +@B@<Define the Stack@> +@$@<Hacker's Cheer@>+=@{-- Pointer to the right@+@} +@$@<Stack Type@>@Z==@{type stack = record ... end;@} + +@B@<Push the Stack@> +@$@<Hacker's Cheer@>+=@{-- Hack that code@+@} +@$@<Push Procedure@>@Z==@{@- +procedure push(var b:stack; v:value); @<Programmer's Cheer@> {...}@} + +@B@<Pop the Stack@> +@$@<Hacker's Cheer@>+=@{-- Tight! Tight! Tight!@+@} +@$@<Pop Procedure@>@Z==@{@- +procedure pop(var b:stack); @<Programmer's Cheer@> {...}@} + +@B@<Rough the Stack Up a Bit@> +@$@<Hacker's Cheer@>+=@{-- (RNW, 04-Jan-1991).@+@} +@$@<Rough Procedure@>@Z==@{@- +procedure rough(var b:stack); @<Hacker's Cheer@> {...}@} + +@O@<dummy.txt@>==@{dummy@+@} +\end{verbatim} + +An examination of the printed documentation reveals a lot about how +FunnelWeb's presentation works. + +First, notice how the \p{@t} typesetter directive +at the top of the file has caused a table of contents to appear. +This is one of FunnelWeb's typesetting features and is discussed in a later +section. The table of contents shows that the sections have been +numbered hierarchically. + +Now take a look at the typeset macro definitions. Most important are the +numbers in square brackets that follow each macro name. As well as +numbering the headings \i{hierarchically}, FunnelWeb \i{independently} +numbers +the macro definitions \i{sequentially}. The first macro definition +(for \dq{Programmer's Cheer}) is numbered 1. +The second (for \dq{Hacker's Cheer}) is numbered 2 and so on. +Note that it is not macros that are numbered, but macro definitions. +The distinction is necessary because some macros (such as the +\dq{Hacker's Cheer} macro) are additive. +It is important to +realize that there is no relationship between the numbers of the headings +and the numbers of the macro definitions. + +Now take a look at the notes beneath the body of each macro definition. +All macro definitions are followed by a note indicating the definitions in +which the macro is called. Additive macros have an additional list, listing +the definitions in which they are defined. + +Finally, take a look at the macro \i{call} of \dq{Programmer's Cheer} +in section~3.2 of the printed documentation. +Macro calls are set in slanted roman (so that they can +be distinguished from the \p{tt font} code) and are followed by +the number of the defining macro definition. In this case, the macro +was defined in definition~1. Further down, the call to +the \dq{Hacker's Cheer} macro +indicates that the macro was defined in definition~2. In fact the macro is +additive and definition~2 is just the first of many definitions. To list +all definitions in a call to an additive macro would be unnecessarily messy. + +\subsection{Literals and Emphasis} +\x{literal construct}\x{emphasis construct} + +When writing about program code, it is often desirable to be able to indicate +that a particular word or phrase be typeset in the same manner as the code +being discussed. For example, one might talk about the variable \p{topval} +or the procedure \p{stack\_pop} and wish for them to be typeset +as they are in this sentence. This, of course, +is simple to do using \TeX{} macros, but use of the +(more general) FunnelWeb typesetting directives to do the same work has the +added benefit of keeping the document portable to other typesetters. + +FunnelWeb provides two in-text type modification constructs: \p{@\{...@\}} +and \p{@/...@/}\x{@slash}\x{@braces} +where $\ldots$ is raw text. The \p{@\{...@\}} +construct sets the enclosed +text in the same manner as the text of macro definitions is set. The +\p{@/...@/} construct emphasises its enclosed text in some +typesetter-dependent fashion. Typically the emphasised text is set in +italics. + +Here is an example of how these constructs might be used: + +\begin{verbatim} +The following procedure @{put_sloth@} writes the @{sloth@} variable to +the output file. Note: @/The output file must be opened for writing +at this point or the program will crash!@/ +\end{verbatim} + +\subsection{Adding a Header Page} +\x{header page} + +FunnelWeb provides a few typesetter-independent typesetting constructs +which are specifically designed for the construction of header pages. +These constructs are usually best placed at the top +of your input file, but can be placed anywhere the document if desired to +create header pages right through. The two main restrictions on these +constructs is that the \p{@t} must start at the start of a line (which +cannot contain comments), and that the constructs cannot appear inside +a macro definition. Here is what the top of an input file might look like: + +\begin{verbatim} +@t vskip 40 mm +@t title titlefont centre "Hairy Wombat" +@t title titlefont centre "Simulation" +@t vskip 10 mm +@t title smalltitlefont centre "A Program in Six Parts" +@t title smalltitlefont centre "Simulating the Life of Some Hairy Wombats" +@t vskip 20 mm +@t title normalfont left "By Zqitzypbuswapzra Ypongtatoslrtzz" +@t new_page +@t table_of_contents +@t new_page +\end{verbatim} + +The \p{@t} at the start of each line indicates that each entire line is +a typesetter directive. +The \p{vskip}\xx{vskip}{directive} +directive instructs FunnelWeb to skip some vertical space +(measured in millimetres). The \p{title} directive\xx{title}{directive} +instructs FunnelWeb to +position a string of text on a single line of its own. Options are +provided for font and alignment. The first word after \p{title} is the font +which can be one of (in decreasing order of size) \p{titlefont}, +\p{smalltitlefont}, and \p{normalfont}. The second word after \p{title} is +the desired alignment of the text. The options here are \p{left}, \p{right}, +and \p{centre}. The \p{new\_page} +directive\xx{newpage}{directive} +instructs FunnelWeb to skip to a new page. Finally, the +\p{table\_of\_contents} directive\xx{table of contents}{directive} +instructs FunnelWeb to insert a table of +contents at that point in the text. + +\subsection{Comments} +\x{comments} + +A FunnelWeb comment commences with the \p{@!}\x{@!} sequence and continues up to, +but not including, the end of line marker at the end of the line that the +comment sequence is on. Comments can be placed on any line except +\p{@i} include, \p{@p} pragma, and \p{@t} typesetter directive lines. + +The text following the FunnelWeb comment sequence \p{@!} will not appear +in the product files or the documentation file. It is +only for the eyes of those who bother to look at the original \p{.fw} +input file. Typically FunnelWeb comments are used to describe the way in +which particular FunnelWeb constructs are being used. Example: + +\begin{verbatim} +@! This macro is really revolting. Please forgive me. I had to do it! +@$@<Revolt Me@>==@{@- +@#X@(@#Y@(@#Z@,@"@#Z@"@)=6@,Teapot@,@"@#Q@(45@)@"@,Tiger@)@} +\end{verbatim} + +\section{A Complete Example} +\xx{complete}{example}\xx{FunnelWeb}{Example} + +To finish off the chapter, a complete example of a FunnelWeb input file +is presented. Although unrealistically short, it gives a better +idea of what a typical FunnelWeb \p{.fw} file looks like. + +\begin{verbatim} +@!---------------------------------------! +@! Start of FunnelWeb Example .fw File ! +@!---------------------------------------! + +@t vskip 40 mm +@t title titlefont centre "Powers:" +@t title titlefont centre "An Example of" +@t title titlefont centre "A Short" +@t title titlefont centre "FunnelWeb .fw File" +@t vskip 10 mm +@t title smalltitlefont centre "by Ross Williams" +@t title smalltitlefont centre "26 January 1992" +@t vskip 20 mm +@t table_of_contents + +@A@<FunnelWeb Example Program@> + +This program writes out each of the first @{p@} powers of the first @{n@} +integers. These constant parameters are located here so that they are easy to +change. + +@$@<Constants@>==@{@- +n : constant natural := 10; -- How many numbers? (Ans: [1,n]). +p : constant natural := 5; -- How many powers? (Ans: [1,p]).@} + +@B Here is the outline of the program. This FunnelWeb file generates a single +Ada output file called @{Power.ada@}. The main program consists of a loop that +iterates once for each number to be written out. + +@O@<Power.ada@>==@{@- +@<Pull in packages@> + +procedure example is + @<Constants@> +begin -- example + for i in 1..n loop + @<Write out the first p powers of i on a single line@> + end loop; +end example; +@} + +@B In this section, we pull in the packages that this program needs to run. In +fact, all we need is the IO package so that we can write out the results. To use +the IO package, we first of all need to haul it in (@{with text_io@}) and then +we need to make all its identifiers visible at the top level (@{use text_io@}). + +@$@<Pull in packages@>==@{with text_io; use text_io;@} + +@B Here is the bit that writes out the first @{p@} powers of @{i@}. The power +values are calculated incrementally in @{ip@} to avoid the use of the +exponentiation operator. + +@$@<Write out the first p powers of i on a single line@>==@{@- +declare + ip : natural := 1; +begin + for power in 1..p loop + ip:=ip*i; + put(natural'image(ip) & " "); + end loop; + new_line; +end;@} + +@!---------------------------------------! +@! End of FunnelWeb Example .fw File ! +@!---------------------------------------! +\end{verbatim} + +\section{Summary} + +This chapter has provided an introduction to FunnelWeb and a tutorial +that covers most of its features. FunnelWeb's functionality can be split into +two parts: a macro preprocessor, and support for typesetting. +The reader should be aware that +the examples in this chapter, constructed as they were to demonstrate +particular features of FunnelWeb, do not present a realistic picture +of the best use of the tool. Only the final example of this chapter +comes close. +The reader should study this last example carefully +and then write some real +programs using FunnelWeb before proceeding to Chapter~\ref{chapadvanced} +which provides more advanced information. At this stage it does not +particularly matter exactly how you use Funnelweb, as everyone develops +their own style anyway. The important thing is to try it. + +%==============================================================================% +% End of Ch1.tex % +%==============================================================================% diff --git a/web/funnelAC/userman/u_ch2.tex b/web/funnelAC/userman/u_ch2.tex new file mode 100644 index 0000000000..f1abe0773b --- /dev/null +++ b/web/funnelAC/userman/u_ch2.tex @@ -0,0 +1,1586 @@ +%==============================================================================% +% Start of Ch2.tex % +%==============================================================================% +% +% Copyright +% --------- +% Copyright (C) 1992 Ross N. Williams. +% This file contains a chapter of the FunnelWeb User's Manual. +% See the main TeX file for this manual for further information. +% +%==============================================================================% + +\chapter{FunnelWeb Hints} +\label{chapadvanced}\xx{FunnelWeb}{hints} + +Whereas Chapter~\ref{chapintroduction} provides an introduction to +FunnelWeb and Chapter~\ref{chapdefinition} a definition, \i{this} chapter +contains hints about how +FunnelWeb can be used. This chapter probably should not be read until +the reader has already commenced using FunnelWeb, or at the very least, +tried out some of the examples in Chapter~\ref{chapintroduction}. +Those who find themselves using FunnelWeb frequently +should read this chapter at some stage +so as to ensure that they are getting the most out of it. + +Most of the examples in this chapter have been +placed in the FunnelWeb regression test suite which should be +available in a directory called \p{/fwdir/tests/}. +The files to examine are \p{hi01.fw} through \p{hi10.fw}. + +\section{Macro Names} +\xx{macro}{names}\xx{macro}{identifiers} + +When using FunnelWeb, the choice of macro names can be as +important to the readability of a program as the choice of program +identifiers, +and it is important that the user know the range of options available. + +\narrowthing{Names are case sensitive and exact matching:}{Macro names are case +sensitive and are matched exactly. The strings used as a macro name +at the point of definition and call must be +\i{identical} for the connection to be made.} + +\narrowthing{Names can contain any printable character:}{FunnelWeb is less +restrictive about its macro names than most programming languages are +about their identifiers. A FunnelWeb macro name can contain any +sequence of printable characters, including blanks and punctuation. Names +can start and end with any character. Names cannot cross line boundaries. The +following are all legal macro names:} + +\begin{verbatim} + @<This macro expands to some really bad code@> + @<@> + @<453 #$ %&# --===~~1">>>@> + @<<@> + @<<>@> + @<a b c d e f g@> + @< ! @> + @<?? ...@> + @<"Who's been hacking MY program" said Father Bear.@> + @<Update the maximum and return for more data@> +\end{verbatim} + +\narrowthing{Names must be no more than a maximum limit in length:}{Names +can be +no longer than a predefined maximum length. Currently this length cannot +be modified.} + +Typically, macro names will consist of a short English phrase or sentence +that describes the contents of the macro. + +\section{Quick Names} +\xx{quick}{names} + +Sometimes a particular macro must be used extremely often. When this happens +it is desirable to make the macro's name as short as possible. +The shortest ordinary FunnelWeb macro name is the empty name\xx{empty}{name} +\dqp{@<@>}, which is four characters long. Single-character names are +five characters long. + +To cater for the cases where really short names are needed, FunnelWeb provides +a \newterm{quick name} syntax that allows one-character macro names to be +specified in two less characters. Quick names take the form of the special +character, followed by a hash (\p{\#}) followed by a single character. +Examples: + +\begin{verbatim} +@#A @#| @#& @#m +\end{verbatim} + +This form of macro name has the same syntactic functionality as an ordinary +name and can be substituted wherever an ordinary name can be. In fact +quick names live in the same namespace as ordinary macro names. For example +the quickname \p{@\#A} is the \i{same name} (refers to the same macro) +as the ordinary name \p{@<A@>}. + +Because quick names look syntactically \dq{open} (\ie{}they do not have +a closing\p{@>} as ordinary names do), it is best to avoid them except +where a macro must be called very often. + +\section{FunnelWeb the Martinet} +\xx{FunnelWeb}{rules}\xx{FunnelWeb}{martinet} + +There are many ways in which a macro preprocessor can cause unexpected +difficulties. FunnelWeb seeks to avoid many of these problems by performing +a number of checks. This section describes some of the checks that +FunnelWeb performs. + +\narrowthing{Trailing blanks in the input file:}{Trailing +blanks\xx{trailing}{blanks} are usually +not dangerous, but +FunnelWeb disallows them anyway. All trailing blanks in the +\i{input} (\p{.fw} file) are flagged as errors by FunnelWeb. +FunnelWeb does not flag trailing blanks in any of its output files.} + +\narrowthing{Input line length:}{FunnelWeb has a maximum input line +length.\xx{input line}{length} +If FunnelWeb reads an input line longer than this length, it flags the +line with an error message. The maximum length can be changed using a +pragma (see Chapter~\ref{chapdefinition}).} + +\narrowthing{Product file line length:}{FunnelWeb +watches the length of output lines\xx{output line}{length} +and all output lines longer than the limit are flagged with error +messages. +The maximum length can be changed using a +pragma (see Chapter~\ref{chapdefinition}). +That FunnelWeb polices output lines is very important. Some programs +can behave very strangely if they get an input line that is too long +(\eg{}Fortran compilers\xx{Fortran}{compilers} +can simply ignore text past a certain column!) +and once FunnelWeb starts expanding macros using indentation, it is sometimes +not obvious how wide the product file will be.} + +\narrowthing{Control characters:}{The presence of control +characters\xx{control}{characters} in a text file +can result in some confusing behaviour downstream when the file is +presented to various programs. Unfortunately, some text +editors\xx{text}{editors} allow +control characters to be inserted into the text rather too easily, and it is +all too easy to be tripped up. FunnelWeb prevents these problems by flagging +with diagnostics all non-end-of-line control characters detected +in the input (\p{.fw}) file (even TABs\x{tabs}). +The result is that the user is +guaranteed that product files generated from FunnelWeb contain no +unintentional control characters. This said, FunnelWeb does allow the +insertion of control characters in the output file by explicitly +specifying +them in the text using a \p{@\circumflex{}} control sequence.} + +\narrowthing{Number of invocations:}{FunnelWeb +checks the number of times that\xx{invocations}{number} +each macro is called and issues an error if the total is not one. The +\p{@Z} (for zero) and \p{@M} (for many) macro attributes can be used +to bypass these checks.} + +\narrowthing{Recursion:}{Because\xx{recursion}{macro} +FunnelWeb does not provide any conditional +constructs, all recursively defined macros must, by +definition, expand infinitely,\footnote{A special case exists where +there is recursion but no content. In this case, the expansion is finite +(the empty string) even though the operation of expanding is infinite. +FunnelWeb does not treat this case specially.} and are therefore +unacceptable. FunnelWeb performs \i{static} checks to detect recursion, +detecting it before macro expansion commences. The user need not fear that +FunnelWeb will lock up or spew forth +if a recursive macro is accidentally specified.} + +\section{Fiddling With End of Lines} +\xx{EOL}{fiddling with}\xx{end-of-line}{fiddling with}\x{spacing} + +One of the fiddly aspects of programming with FunnelWeb is coping with end of +lines. If you want your product file to be well indented without +multiple blank lines or code run-ons, you have to spend a little time working +out how the end of line markers get moved around. + +The rule to remember is that, +disregarding the effects of special sequences +within a macro body, \i{the body of a macro consists of exactly the text +between the opening \p{@\{} and the closing \p{@\}}}. This text includes end of +line markers. + +If for example you call a macro in a sequence of code$\ldots$ + +\begin{verbatim} +while the_walrus_is_sleepy do + begin + writeln('zzzzzzz'); + @<Wake up the walrus@> + writeln('Umpharumpha...'); + end; +\end{verbatim} + +where \p{<wake up the walrus>} is defined as follows + +\begin{verbatim} +@$@<Wake up the walrus@>==@{ +wake_up_the_walrus(the_walrus); +@} +\end{verbatim} + +then when \p{<Wake up the walrus>} is expanded you will get + +\begin{verbatim} +while the_walrus_is_sleepy do + begin + writeln("zzzzzzz"); + + wake_up_the_walrus(the_walrus); + + writeln("Umpharumpha..."); + end; +\end{verbatim} + +The blank lines were introduced by the end on line markers included in the +definition of \p{<Wake up the walrus>}. A good solution to this problem is to +suppress the end of line markers by defining the macro as follows + +\begin{verbatim} +@$@<Wake up the walrus@>==@{@- +wake_up_the_walrus(the_walrus);@} +\end{verbatim} + +This is the usual form of macro definitions in FunnelWeb files. + +In additive macros, this format does not +work properly because the end of line that is suppressed by the trailing \p{@\}} +does not get replaced by the end of line at the end of the macro invocation. For +example the definition + +\begin{verbatim} +@$@<Wake up the walrus@>+=@{@- +wake_up_the_walrus_once(the_walrus);@} +\end{verbatim} + +later followed by + +\begin{verbatim} +@$@<Wake up the walrus@>+=@{@- +wake_up_the_walrus_again(the_walrus);@} +\end{verbatim} + +is equivalent to the single definition + +\begin{verbatim} +@$@<Wake up the walrus@>==@{@- +wake_up_the_walrus_once(the_walrus);wake_up_the_walrus_again(the_walrus);@} +\end{verbatim} + +Putting the trailing \p{@\}} on a new line at the end of the macro (except for +the last definition part) solves the problem. + +\begin{verbatim} +@$@<Wake up the walrus@>+=@{@- +wake_up_the_walrus_once(the_walrus); +@} +\end{verbatim} + +later followed by + +\begin{verbatim} +@$@<Wake up the walrus@>+=@{@- +wake_up_the_walrus_again(the_walrus);@} +\end{verbatim} + +is equivalent to the single definition + +\begin{verbatim} +@$@<Wake up the walrus@>==@{@- +wake_up_the_walrus_once(the_walrus); +wake_up_the_walrus_again(the_walrus);@} +\end{verbatim} + +Managing end of line markers is tricky, +but once you establish a convention for coping +with them, the problem disappears into the background. + +\section{Fudging Conditionals} +\xx{fudging}{conditionals} + +As a macro preprocessor, the facility that FunnelWeb most obviously lacks +is a conditional facility (such as C's \p{\#ifdef}). It might, therefore, +come as a surprise to know that the first version of FunnelWeb +actually had a built in conditional facility. The facility allowed +the programmer to specify a construct that would select from one of a number +of macro expressions depending on the value of a controlling macro expression. + +In three years the construct was never used. + +The reason was that conditional constructs could be fudged nearly +as easily as they could be used. Because of this, the inbuilt conditional +feature was removed in the current version of FunnelWeb. Not only did this +simplify the program, but is also allowed recursive macros to be detected +through static analysis rather than during macro expansion. + +There are two basic ways to fudge a conditional. First, the comment +facility of the target programming language may be employed. For example, +in Ada,\x{Ada} +comments commence with \dqp{--} and terminate at the end of the line. +Using this fact, it is easy to construct macros that can be called at the +start of each target line and which turn on and off the lines so +marked by defining the macro to be the empty string (ON) or the comment +symbol (\p{--}) (OFF). For example: + +\begin{verbatim} +@A@<Debug Macro@> + +The following macro determines whether debug code will be included in the +program. All lines of debug code commence with a call to this macro and so +we can turn all that code on or off here by defining this macro to be either +empty or the single-line comment symbol (\p{--}). Note the use of a +quick macro name. + +@$@#D@M==@{@} @! Turns the debug code ON. +@! Use this definition to turn the debug code OFF: @$@#D==@{--@} + +... then later in the file... + +@$@<Sloth incrementing loop@>==@{@- +while sloth<walrus loop + @#D assert(sloth<walrus,"AWK! sloth>=walrus!!!!!!!"); + @#D assert(timer<timermax,"AWK! timer>=timermax!!!"); + inc(sloth); +end loop@} +\end{verbatim} + +The other way to fudge a conditional is to define a macro with a +single parameter. A call to the macro is then wrapped around all the +conditional code in the program. The macro can then be defined to +present or ignore the code of its argument. For example: + +\begin{verbatim} +@A@<Debug Macro@> + +The following macro determines whether debug code will be included in the +program. All debug code is wrapped by a call to this macro and so +we can turn all the debug code on or off here by defining this macro to be +either empty or its parameter. + +@$@#D@(@1@)@M==@{@1@} @! Turns the debug code ON. +@! Use this definition to turn the debug code OFF: @$@#D@(@1@)==@{@} + +... then later in the file... + +@$@<Sloth incrementing loop@>==@{@- +while sloth<walrus loop + @#D@(assert(sloth<walrus,"AWK! sloth>=walrus!!!!!!!"); + assert(timer<timermax,"AWK! timer>=timermax!!!");@) + inc(sloth); +end loop@} +\end{verbatim} + +In languages that allow multi-line comments (\eg{}C with \p{/*} and \p{*/}), +comments can be used to eliminate the conditioned code rather than +absence. For example: + +\begin{verbatim} +@$@#D@(@1@)@M==@{/* @1 */@} @! Comments out the debug code +\end{verbatim} + +(Note: If this example were ever actually used, +the programmer would have to be careful not to place comments in +the argument code. Nested comments in~C are non-portable.) + +The parameterized macro idea can be generalized to support the choice of +more than one mutually exclusive alternative. For example: + +\begin{verbatim} +@A This module contains non-portable code that must execute on Hewlett +Packard, Sun, and DEC workstations. The following FunnelWeb macro is +defined to choose between these three. The first parameter is the HP code, +the second is the Sun code, and the third is the DEC code. Whichever +parameter constitutes the body of this macro determines which +machine the code is being targeted\note{Dictionary says only one t +in targeted.} for. + +@$@<Machine specific code@>@(@3@)@M==@{@1@} @! Configure for HP. + +...then later in the file... + +@<Machine specific code@>@( +@"get_command_line(comline)@" @, @! HP. +@"scan_command_line(128,comline);@" @, @! Sun. +@"dcl_get_command_line(comline,256);@" @) @! DEC. +\end{verbatim} + +Of course, this could also be performed using three separate macros. The +main advantage of using a single macro is that the mutual exclusivity is +enforced. Also, because FunnelWeb ensures that the number of formal and +actual parameters are the same, this method lessens the chance that a +machine will be forgotten in some places. + + +\section{Changing the Strength of Headings} +\xx{headings}{strength}\xx{typesetting}{strength}% +\xx{section}{strength}\xx{font}{size} + +FunnelWeb provides five heading levels: +\p{@A}, \p{@B}, \p{@C}, \p{@D}, and \p{@E} to which it binds five different +typographical strengths. These bindings are static; a level +\p{@A} heading will always be typeset in a particular font size regardless +of the size of the document. The font +sizes have been preset to be \dq{reasonable} for a range of document sizes, +but may be inappropriate for very small or large documents. + +FunnelWeb does not currently provide an \dq{official} +way (\eg{}a pragma) to change the typesetting +strength of headings. This feature might be added in later versions. +Meanwhile, a hack is available that will do the job, providing that you +do not mind the hack being \TeX{}-specific and probably FunnelWeb-version +specific. + +Inside the set of \TeX{} macro definitions +that FunnelWeb writes at the top of every documentation +file are five \dq{library} +definitions \p{fwliba}$\ldots$\p{fwlibe} which +provide five different typesetting strengths for headings. Near the +end of the set of definitions, FunnelWeb binds these macros to five +other macros \p{fwseca}$\ldots$\p{fwsece} which are invoked directly in the +generated \TeX{} code to typeset the headings. + +\begin{verbatim} +\def\fwseca#1#2{\fwliba{#1}{#2}} +\def\fwsecb#1#2{\fwlibb{#1}{#2}} +\def\fwsecc#1#2{\fwlibc{#1}{#2}} +\def\fwsecd#1#2{\fwlibd{#1}{#2}} +\def\fwsece#1#2{\fwlibe{#1}{#2}} +\end{verbatim} + +This means that the typesetting strength of the headings in a FunnelWeb +document can be changed by redefining these macros at the top of a FunnelWeb +document. For example: + +\begin{verbatim} +@p typesetter = tex +\def\fwseca#1#2{\fwlibc{#1}{#2}} +\end{verbatim} + +would set \p{@A} headings at the same strength as the default strength of +\p{@C} headings. The \p{typesetter} directive is necessary to ensure that the +\TeX{} control sequences get through to the documentation file unfiltered. + +The following will tone down all headings by two levels (with the +\p{@D} and \p{@E} levels being allocated the default \p{@E} typesetting +strength because there is nothing weaker). + +\begin{verbatim} +@p typesetter = tex +\def\fwseca#1#2{\fwlibc{#1}{#2}} +\def\fwsecb#1#2{\fwlibd{#1}{#2}} +\def\fwsecc#1#2{\fwlibe{#1}{#2}} +\def\fwsecd#1#2{\fwlibe{#1}{#2}} +\def\fwsece#1#2{\fwlibe{#1}{#2}} +\end{verbatim} + +These definitions affect only the headings that follow them, and so they +should be placed at the top of the FunnelWeb input file. + +\section{Efficiency Notes} +\xx{FunnelWeb}{efficiency}\xx{efficiency}{notes} + +The following notes are worth keeping in mind when using FunnelWeb. + +\narrowthing{Memory:}{When\x{memory}\xx{input}{files} +FunnelWeb processes an input file, it reads +the entire input file, and all the included files into memory.\footnote{If a +file is included $n$ times, FunnelWeb keeps $n$ copies in memory.} This +organization does not pose a constraint on machines with large memories, +but could +present a problem on the smaller machines such as the PC.} + +\narrowthing{Speed:}{FunnelWeb\x{speed} is not a slow program. However, it is +not particularly fast either. If the speed at which FunnelWeb runs is +important to you, then the thing to keep in mind is that FunnelWeb has been +optimized to deal efficiently with large slabs of text. FunnelWeb treats +input files as a sequence of text slabs and special sequences (\eg{}\p{@+}) +and whenever it hits a special sequence, it has to stop and think. +Thus, while a ten megabyte text slab would be manipulated as a single token, +in a few milliseconds, a similar ten megabyte chunk filled with special +sequences would take a lot longer. +If FunnelWeb is running slowly, look to see if the input contains +a high density of special sequences. This can sometimes happen if FunnelWeb +is being used as a backend macro processor and its input is being +generated automatically by some other program.} + +\narrowthing{Macro expansion:}{When\xx{macro}{expansion} +tangling (expanding macros), FunnelWeb never +expands a macro expression into memory; it always writes it to the +product file +as it goes. This is a powerful fact, because it means that you can +write macros containing an unlimited amount of text, and pass such macros +as parameters to other macros without becoming concerned about overflowing +some kind of buffer memory. In short, FunnelWeb does not impose any +limits on the size of macro bodies or their expansions.} + +\section{Interactive Mode} +\x{interactive mode}\x{keyboard mode} + +As well as having a command line interface with lots of options, FunnelWeb +also provides a command language and a mode (\dq{interactive mode}) +in which commands in the language can be typed interactively. The +FunnelWeb command interpreter was created primarily +to support regression testing,\xx{regression}{testing} +but can also be useful to FunnelWeb users. + +FunnelWeb's command interpreter\xx{command}{interpreter} +reads one command per line and can read +a stream of commands either from a text file, or from the console. The +interpreter can understand over twenty commands. See +Chapter~\ref{chapdefinition} for a full list. However, most of them +were designed to support regression testing and will not be of use to the +casual user. + +The commands that are of greatest use to the casual user +are:\xx{useful}{commands} + +\begin{verbatim} + ! - Comment. Ignores the whole line. + EXECUTE fn - Execute the specified file. + FW options - Invoke FunnelWeb-proper once. + SET options - Sets options. + SHOW - Displays currently active options. + TRACE ON - Turns command tracing ON. + QUIT - Quits FunnelWeb. +\end{verbatim} + +To distinguish here between invocations of the FunnelWeb program +and FunnelWeb runs inside the shell, we call the latter \newterm{FunnelWeb +proper}. The \dqp{FW} command invokes FunnelWeb proper with the specified +options which take the same syntax as they do on the command line. The only +restriction is that none of the action options can be turned on except +\dqp{+F} which must be turned on. + +The \dqp{SET} command\xx{set}{command} +has the same syntax as the \dqp{FW} command except that it +does not allow \i{any} action options to be +specified. It's sole effect is to set default option values for the +rest of the run. + +The \dqp{SHOW}\xx{show}{command} +command displays the current default options. + +By default, FunnelWeb does not echo the commands that it processes in a +script. The \dqp{TRACE ON}\xx{trace on}{command} +command turns on such tracing. + +These commands can be combined to streamline the use of FunnelWeb. +For example, you might wish to create a script called \p{typeset.fws} +to process a whole group of files. + +\begin{verbatim} +trace on +!This script typesets the whole program. +! Set no listing file, no product files, but specify a documentation file +! and specify the directory into which it should be placed. +set -L -O +T/usr/ross/typeset/ +fw prog1 +fw prog2 +fw prog3 +fw prog4 +\end{verbatim} + +There are a few ways in which this script can be run. The simplest is +simply to specify it in the \dqp{+X} option of a FunnelWeb invocation. +FunnelWeb shellscripts default to \dqp{<current\_directory>} and \dqp{.fws}. + +\begin{verbatim} +fw +xtypeset +\end{verbatim} + +The second alternative is to enter interactive mode. + +\begin{verbatim} +fw +k +\end{verbatim} + +From there, you can execute the script using: + +\begin{verbatim} +execute typeset +\end{verbatim} + +Interactive mode could be very useful to those with multiple-window +workstations.\x{workstations} +The user could create a window containing an interactive +session of FunnelWeb, and then switch between windows, editing, and executing +FunnelWeb proper and other programs. + +If you find yourself using the command interpreter a lot, be sure to +read about the other commands that are available in +Chapter~\ref{chapdefinition}. + +\section{Setting Up Default Options} +\xx{options}{setting defaults}\xx{default}{options} + +If you do not like FunnelWeb's default settings for its command line +options, there are a number of ways in which you can change them. + +\narrowthing{Define an \dq{alias}:}{Use your operating system +\dqp{alias}\x{alias} +facility to create an alias for FunnelWeb containing the desired options. +FunnelWeb processes options from left to right, so you can override +these defaults later if you wish.} + +\narrowthing{Create a script called \dqp{fwinit.fws}:}{When FunnelWeb +starts up, it executes a script called \dqp{fwinit.fws}\x{fwinit.fws} +if\xx{startup}{script}\xx{initialization}{script} such a +script exists in the current directory. You can use this fact to set options +before the run of FunnelWeb proper by creating such a script and placing +a single \dqp{set} command in it containing the desired options. The main +trouble with this approach is that the options in the \p{set} command will +be processed \i{after} the command line options, which means that you won't +be able to override them on the command line.} + +For example, you might be involved more with presenting programs than with +running them, and want FunnelWeb to generate a documentation +file by default, but not to produce +listing or product files by default. In Unix you could do this with: + +\begin{verbatim} +alias fw fw -L -O +T +\end{verbatim} + +\section{FunnelWeb and Make} +\x{make utility}\xx{file}{dependencies} + +The Unix \p{Make} program allows a set of dependencies between a set of +files to be described, and then uses these dependencies to control the way in +which the files are created and updated. Typically, +\p{Make} is used to control the process of transforming a collection of +source code files to one or more executable files. +As the use of FunnelWeb implies an extra stage to this process, it is +natural to include the transformation of \p{.fw} files to source code +files as part of the \p{Make} process. This is easy to do, but the user +should be aware of one aspect of FunnelWeb which can cause problems. + +It is often useful, when using FunnelWeb, to create a FunnelWeb \p{.fw} +file that generates more than one product file. +That is, a single \p{.fw} file may have many macro definitions connected +to product files so that when the FunnelWeb \p{.fw} file is processed by +FunnelWeb, several files are created. For example, this facility has been +used to great effect to place the description of an Ada\x{Ada} package's +package specification file and package body file in the same FunnelWeb +\p{.fw} file. + +The use of multiple product files, however, provokes a problem +with dependencies. Suppose for example that a FunnelWeb \p{prog.fw} +produces two product files \p{proc.spec} (a package specification) +and \p{prog.body} (a package body). If the package is accessed in the way +that packages normally are, it will be quite common for the programmer +to want to modify the package body without modifying the program specification. +So the programmer will edit the \p{prog.fw} file to change the package +body. The result of running this through FunnelWeb will be the desired +new package body file. However, FunnelWeb will also produce a new package +specification product file \i{even though it may be identical to the +previous version!} The result is that the newly created (with a recent +file date) specification package file could provoke a huge remake of much +of the program in which it resides. + +To solve the problem, FunnelWeb includes a command line option +(\p{D} for Delete),\xx{D}{option}\xx{delete}{output files} +which when turned on (using \dqp{+D}) causes +FunnelWeb to suppress\xx{suppression}{file} +product and documentation files that are identical +to the previously existing versions of the same files. For example, +if, during a FunnelWeb run, a macro was connected to a product file called +\p{x.dat}, and the macro expanded to \i{exactly} the same text as is +contained in \p{x.dat} then FunnelWeb would simply \i{never write the product +file}, the file \p{x.dat} would be untouched and, as a result, no further +\p{Make} propagations would take place. + +FunnelWeb implements this feature by writing each product file to +a temporary file with a temporary file name. It then compares the temporary +file with the target file. If the two are identical, it deletes the +temporary file. If the two are different it deletes the target file and +renames the temporary file to the target file. + +Use of the \p{D} facility means that the programmer need not be punished +(by extra \p{Make} propagations) for describing more than one product file +in the same FunnelWeb file. + + +\section{The Dangers of FunnelWeb} +\xx{FunnelWeb}{dangers}\xx{FunnelWeb}{pitfalls} + +Like many tools that are general and flexible, FunnelWeb can be used in a +variety of ways, both good and bad. One of the original appeals of the +literate approach to programming for Knuth,\xn{Donald}{Knuth} +the inventor of literate +programming,\xx{literate}{programming} +was that it allows the programmer to describe the target +program bottom up, top down, size to side, or chaotically if desired. +The flexibility that this style of programming leaves much +room for bad documentation as well as good documentation. Years of +experience with FunnelWeb has revealed the following stylistic pitfalls +which the experienced FunnelWeb user should take care to +avoid.\footnote{The fact that these faults are listed here does not mean +that the author has eliminated them in his own work. Rather, +it is mainly the author's own mistakes that have resulted in this list +being compiled. The author immediately +confesses to several of the faults listed here, most notably that of +Pavlov documentation.} + +\narrowthing{Spaghetti organization:}{By\xx{spaghetti}{organization} +far the worst problem that arises +in connection with the literate style occurs where the programmer has +used the literate tool to completely scramble the program so that the +program is described and layed out in an unordered, undisciplined +\dq{stream of consciousness}.\x{stream of consciousness} +In such cases the programmer may be using +the literate style as a crutch to avoid having to +think about structuring the presentation.} + +\narrowthing{Boring organization:}{At\xx{boring}{organization} +the other extreme, a program may be +organized in such a strict way that it is essentially laid out in the +order most \dq{desired} by the target programming language. For example, +each macro might contain a single procedure, with all the macros being +called by a macro connected to a file at the top. In many cases a boring +structure may be entirely appropriate, but the programmer should be warned +that it is easy to slip into such a normative style, largely forgetting the +descriptive structural power that FunnelWeb provides.} + +\narrowthing{Poor random access:}{Using\xx{random}{access} +FunnelWeb, it is quite possible to write +programs like novels\x{novels} +--- to be read from cover to cover. Sometimes the +story is very exciting, with data structures making dashing triumphs and +optimized code bringing the story to a satisfying conclusion. These programs +can be works of art. +Unfortunately, without careful construction, +such \dq{novel-programs} can become very hard to access randomly by (say) +a maintenance programmer\xx{maintenance}{programmer} +who wishes only to dive in and fix a specific +problem. If the entire program is scrambled for sequential exposition, it +can be hard to find the parts relating to a single function. +Somehow a balance must be struck in the document between the +needs of the sequential and of the random-access reader. +This balance will depend on the intended use of the program.} + +\narrowthing{Too-interdependent documentation:}{Sometimes, +when\xx{documentation}{interdependent} editing a +program written using FunnelWeb, one knows how to modify the program, +but one is unsure of how to update the surrounding documentation! +The documentation may be woven into such a network of facts that it seems that +changing a small piece of code could invalidate many +pieces of documentation scattered throughout the document. The documentation +becomes a big tar pit in which movement is impossible. +For example, +if you have talked about a particular data structure invariant throughout +a document, changing that invariant in +a small way could mean having to update all the documentation without +touching much +code. In such cases, the documentation is too interdependent. This could be +symptomatic of an excessibly interconnected program, or of an +excessively verbose or redundant documenting style. In any case, a balance +must be struck between the conversational style that encourages redundancy +(by mentioning things many times) and the normalized database approach where +each fact is given at only one point, and the reader is left to figure +out the implications throughout the document.} + +\narrowthing{Pavlov documentation:}{By\xx{pavlov}{documentation} +placing so much emphasis on the documentation, +FunnelWeb naturally provides slots where documentation \dq{should} go. For +example, a FunnelWeb user may feel that there may be a rather unpleasant +gap between a \p{@C} marker and the following macro. In many cases \i{no} +commentary is needed and the zone is better left blank rather than being +filled with the kind of uninformative waffle one often finds filling the slots +of structured documentation written according to a military standards +(\eg{}MIL-STD-2167A).\x{MIL-STD-2167A}\x{2167A}\footnote{Note: +This is not a criticism of 2167A, +only of the way it is sometimes used.} The lesson is to add documentation +only when it adds something. The lesson in Strunk and White\paper{Strunk79} +(p.~23) +holds for +program documentation as it does for other writing: \dq{Vigorous writing is +concise. A sentence should contain no unnecessary words, a paragraph no +unnecessary sentences, for the same reason that a drawing should have +no unnecessary lines and a machine no unnecessary parts. This +requires not that the writer make all his sentences short, or that he avoid +all detail and treat his subjects only in outline, but that every word +tell.}.\checked{}} + +\narrowthing{Duplicate documentation:}{Where\xx{duplicate}{documentation} +the programmer is generating +product files that must exist on their own within the entire programming +environment (\eg{}the case of a programmer in a team who is using FunnelWeb +for his own benefit but must generate (say) commented Ada\x{Ada} +specification +package files) there is a tendency for the comments in the +target code to duplicate the commentary in the FunnelWeb text. This may or +may not be a problem, depending on the exact situation. However, if this is +happening, it is certainly worth the programmer spending some time deciding +if one or other of the FunnelWeb or inline-comment documentation should be +discarded. +In many cases, a mixture can be used, with the FunnelWeb documentation +referring the reader to the inline comments where they are present. +For example:} + +\begin{verbatim} +@A Here is the header comment for the list package specification. +The reader should read these comments carefully as they define a list. +There is no need to duplicate the comments in this text. + +@$@<Specification package header comments@>==@{@- +-- LIST PACKAGE +-- ============ +-- * A LIST consists of zero or more ITEMS. +-- * The items are numbered 1 to N where N is the number of items in the list. +-- * If the list is non-empty, item 1 is called the HEAD of the list. +-- * If the list is non-empty, item N is called the TAIL of the list. +-- ... +@} +\end{verbatim} + +\narrowthing{Overdocumenting:}{Another\xx{over}{documentation} +evil that can arise when using FunnelWeb is +to over-document the target program. In some of Knuth's earlier (\eg{}1984) +examples of literate programming, each variable is given its own description +and each piece of code has a detailed explanation. This level of analysis, +while justified for tricky tracts of code, is probably not warranted +for most of the code that constitutes most programs. Such over-commenting +can even have the detrimental affect of obscuring the code, making it hard +to understand because it is so scattered (see \dq{spaghetti organization} +earlier). It is up to the user to decide when a stretch of just a few lines of +code should be pulled to bits and analysed and when it is clearer to leave it +alone.} + +\narrowtext{In the case where there +are a few rather tricky lines of code, a detailed +explanation may be appropriate. The following example +contains a solution to a problem outlined in section 16.3 of +the book \dq{The Science of Programming} by David Gries\paper{Gries81}.} + +\begin{verbatim} +@C@<Calculation of the longest plateau in array b@> + +This section contains a solution to a problem outlined in section 16.3 of +the book @/The Science of Programming@/ by David Gries[Gries81]. + +@D Given a sorted array @{b[1..N]@} of integers, we wish to determine the +@/length@/ of the longest run of identically valued elements in the array. +This problem is defined by the following precondition and postcondition. + +@$@<Precondition@>==@{/* Pre: sorted(b). */@} +@$@<Postcondition@>==@{@- +/* Post: sorted(b) and p is the length of the longest run in b[1..N]. */@} + +@D We approach a solution to the problem by deciding to try the approach of +scanning through the array one element at a time maintaining a useful +invariant through each iteration. A loop variable +array index @{i@} is created for this purpose. The bound function is +@{N-i@}. Here is the invariant. + +@$@<Invariant@>==@{@- +/* Invariant: sorted(b) and 1<=i<=N and */ +/* p is len of longest run in b[1..i]. */@} + +@D Establishing the invariant above in the initial, degenerate case is easy. + +@$@<Establish the plateau loop invariant initially@>==@{i=1; p=1;@} + +@D At this stage, we have the following loop structure. Note that when both +the invariant and @{i != N@} are true, the postcondition holds and the loop +can terminate. + +@$@<Set p to the length of the longest plateau in sorted array b[1..N]@>==@{@- +@<Precondition@> +@<Establish the plateau loop invariant initially@> +while (i != N) + { + @<Invariant@> + @<Loop body@> + } +@<Postcondition@> +@} + +@D Now there remains only the loop body whose sole task is to increase @{i@} +(and so decrease the value of the bound function) while maintaining the +invariant. If @{p@} is the length of the longest run +seen so far (i.e. in b[1..i]), then, because the array is sorted, +the extension of our array range to +@{b[1..i+1]@} can only result in an increase in @{p@} if the new element +terminates a run of length @{p+1@}. The increase can be at most 1. Because +the array is sorted, we need +only compare the endpoints of this possible run to see if it exists. This +is performed as shown below. + +@$@<Loop body@>==@{i++; if (b[i] != b[i-p]) p++;@} +\end{verbatim} + +\narrowtext{Where the code is more obvious, +it is often better to let the code speak for itself.} + +\begin{verbatim} +@C The following function compares two C~strings and returns TRUE iff they +are identical. + +@$@<Function comp@>==@{@- +bool comp(p,q) +char *p,*q; +{ + while (TRUE) + { + if (*p != *q ) return FALSE; + if (*p == '\0') return TRUE; + p++; q++; + } +} +@} +\end{verbatim} + +\section{Wholistic Debugging} +\xx{wholistic}{debugging} + +Surprising though it may be, FunnelWeb has a key role to play in the +\i{debugging} of programs. Long experience in programming has led me to the +concept of \newterm{wholistic debugging}. When most programmers detect a +bug, their first reaction seems to be to jump into the debugger\x{debugger} +where they +often spend many hours stepping through endless stretches of code and +generally wasting a lot of time. + +In contrast, my first reaction when I detect a bug is to realize that +\i{the code must not be in good enough shape if such a bug can arise.} +The presence of the bug is taken as symptomatic of the lack of general +health of the code. If that bug occurred, why not another? +In response to this realization, my reaction is not to enter the debugger, +but rather to return to the original code and tend it like a +garden,\xx{code}{gardening} +adding more comments, reworking the grotty bits, adding assertions, +and looking for faults. In many cases, the search for faults does not +even centre on the specific bug that arose, but does tend to focus on +the area of code where the bug is likely to be. + +The result is often that the original bug is located more quickly than it +would have been had the debugger been involved. But even if it isn't, there +are other benefits. A programmer who enters the debugger may +stay there for hours and still not find the bug. The result is +frustration and no positive gain at all. In contrast, by tending to the +code, the programmer is making forward progress at all times (the code +is constantly improving) even if the bug is not immediately found. +At the end of ten hours, the programmer can at least feel that the code +is \dq{ten hours better}, whereas the debugger freak will likely feel +defeated. +All this makes code tending better psychologically as well as a more +efficient approach to debugging. + +I call this technique wholistic debugging, for it is like the +difference between conventional and wholistic medicine.\xx{wholistic}{medicine} +Go to a +conventional doctor with a headache and he might send off for head X-rays, +perform allergy tests and perform many other +debugging activities. Go to a wholistic doctor with the same problem and +he might look to see if you are fit, assess your mental health, and ask you +if your marriage is working. Both approaches are appropriate at different +times. In programming, the wholistic approach is not used enough. + +\section{Examples of FunnelWeb Applications} +\xx{FunnelWeb}{example applications}\xx{FunnelWeb}{applications} + +Despite (or perhaps because of) its flexibility and simplicity, +FunnelWeb can be applied to quite a number of different +text processing and documenting problems. This section describes some of +the more interesting real problems that FunnelWeb has solved. + +\subsection{Analyzing the Monster Postscript Header File} +\xx{monster file}{postscript} + +During my Ph.D. candidature, I determined at one point that it would be +very desirable to automatically insert diagrams from the \i{MacDraw}\x{MacDraw} +program on my Macintosh into +\TeX{}\x{TeX} +\p{insert}ions in my thesis.\xx{PhD}{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\x{Macintosh} +could generate PostScript\x{PostScript} +for each diagram and this PostScript could presumably be inserted into the +PostScript generated using \TeX{}. + +The only trouble was that the Macintosh PostScript code for the diagrams +relied on an Apple PostScript header file.\xx{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: + +\begin{itemize} + +\item The definitions of interest (\ie{}the ones causing the problems) +were scattered throughout the file. + +\item Many definitions could not be moved. For one or more reasons +(\eg{}to keep a definition within the activation of a particular +dictionary \p{begin} and \p{end}) it would have been unwise to move the +definitions of interest to the same point in the file. + +\end{itemize} + +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. + +To my surprise, FunnelWeb provided an unexpected solution to +the problem. First I replaced all occurrences of the \p{@} in the +header file with \p{@@}. 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. + +\begin{verbatim} +@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 +@} +\end{verbatim} + +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 (\b{Z}ero) +macro was created for each version of each definition, and a commentary of how +it performed added above it. + +This case demonstrates that +FunnelWeb is an extremely powerful tool for dissecting and +documenting cryptic text files.\xx{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. + +\subsection{Making Ada ADTs more A} +\x{Ada}\x{abstract data type}\x{ADT} + +Like many modern programming languages, Ada provides mechanisms for hiding +information and structure. In particular, Ada provides a \newterm{package} +facility that allows the programmer to declare objects in a +package definition and define them in a corresponding package body. +This works well +for functions and procedures. However, in the case of types, implementation +issues (in particular, the need to know the size of exported types) have +led the designers of Ada to force the placement of +private type definitions in the definition package rather than the +implementation package. This means that some implementation details +are present in the package definition for all to see. While not actually +dangerous (the user of the package cannot make use of the information +without recourse to \dq{Chapter~13} of the Ada Language Reference +Manual\paper{DOD83}), this aspect of Ada is certainly unpleasant. + +During the development of some Ada programs, FunnelWeb was used to solve +this problem. Instead of creating a separate file for the package +specification and package body, a single FunnelWeb file was created containing +two sections, one for the each package part. The \dq{private} part of the +package specification was then moved (using a FunnelWeb macro definition) +to the section describing the package body. Readers who wished only to read +the package specification could read only the first part, which contained +a fully documented description not containing the private definition. + +\subsection{Multiple Language Systems} +\xx{multiple}{languages} + +With the prevalence of open systems\x{open systems} +and multi-vendor computing, it is +often necessary to construct systems consisting of programs written in +a number of different programming languages for a number of different +systems. For example, a particular functionality might be implemented by a +shellscript +(invoked by the user) that calls a C~program that makes a network connection +to a Pascal program that queries a database. Quite often all these programs +must conspire closely to execute their function. In the normal case, they +must be written separately. FunnelWeb allows them to be written as a +whole. + +By creating a single FunnelWeb file that creates many product files in +different languages, the programmer can describe the interaction between +the different programs in any manner desired. Furthermore, because +the different product files are all created in the same \dq{text space} +(\ie{}in a single FunnelWeb file), it is easy for them to share information. + +For example, in one real application FunnelWeb was used to create a +system for printing files\xx{printing}{system} +on a laser printer\xx{laser}{printer} +connected to a remote Vax +Unix machine from a local Vax VMS +machine. The system consisted of two files: a VMS DCL command procedure +to run on the local node, and a Unix shellscript to run on the remote +node. The user, by giving the print command, invoked the local VMS +command procedure, which in turn fired up the remote Unix shellscript. The +two scripts then cooperated to transfer the files to be printed and print +them. + +In addition to its usual documentation powers, FunnelWeb assisted in the +creation of this system in two special ways. First, it allowed pieces of +code from the two different command procedures to be partially interwoven in a +description of their interaction. This is just not possible with comments. +Second, it facilitated the use of shared information. For example, under +some conditions, each file to be printed would be renamed and copied to the +remote system using a particular constant filename (\eg{}\dqp{printfile.tmp}). +FunnelWeb allowed this constant filename to be included in a single macro +definition which was invoked in the definition of each of the scripts. This +ensured that the two scripts used the same name. + +\begin{verbatim} +@A The following macro contains the temporary file name used to allow the +two shellscripts to transfer each file to be printed. + +@$@<printfile@>@M==@{printme.txt@} + +@A Here are the scripts for the local VMS node and the remote UNIX node. + +@O@<vmscommandprocedure.com@>==@{@- +DCL commands +copy @<printfile@> unixnode:: +DCL commands +@} + +@O@<unixshellscript@>==@{@- +unix commands +print @<printfile@> +unix commands +@} +\end{verbatim} + +In the case of the printing system, the entire system was described and +defined in a single FunnelWeb \p{.fw} file. In larger systems containing +many FunnelWeb \p{.fw} files for many different modules in many different +languages, the same trick can be pulled by placing FunnelWeb macro +definitions for shared values into FunnelWeb include files. For example, +a suite of implementations of network nodes, with each implementation being +in a different programming language for a different target machine, could +all share a table of configuration constants defined in macros in a +FunnelWeb include file. + +In summary, FunnelWeb's macro and include file mechanisms provide +a simple way for programs written in different languages to share +information. This reduces redundancy between the systems and hence the +chance of inconsistencies arising.\x{sharing information} + +\subsection{The Case of the Small Function} +\xx{small}{functions} + +Often, when programming, there is a need for a +code abstraction\xx{code}{abstraction} facility +that operates at the text level. If the statement \dqp{a:=3;} occurs often, +it may be best simply to repeat it verbatim. If a sequence of one hundred +statements is repeated often, it is normal to remove the code to a function +and replace the occurrences by a function call. +However, in between these two extremes are cases where a particular sequence +of code is long enough and appears often enough to be troublesome, but which +is bound so messily to its environment as to make a function call +cumbersome. + +For example, the following line of statements (referring to five variables +declared \i{local} to a function) might appear ten times in +a function: + +\begin{verbatim} +a=b*3.14159; c=d % 256; e=e+1; +\end{verbatim} + +Now the \dq{normal} rule of programming says that these statements should be +placed in a procedure (also called a \dq{function} in the C programming language +used in this example), +but here five local variables are used. Use of a procedure +(function) would result in a procedure definition looking something like: + +\begin{verbatim} +void frobit(a,b,c,d,e) +float *a,b; +int *c,d; +unsigned *e; +{*a=b << 8; *c=d % 256; *e=*e+1;} +\end{verbatim} + +and a procedure call something like + +\begin{verbatim} +frobit(&a,b,&c,d,&e); +\end{verbatim} + +This might be workable in a language that allowed formal parameters to be +specified to be bound only to particular variables. Similarly, it might +be possible to avoid the parameter list in languages that support +local procedures that can access non-local variables (such as +Pascal\x{Pascal}). +However, in our example here, in the C programming language, these options +are not available, and so we must either create a function with five +parameters, +or use the C macro preprocessor\xx{preprocessor}{C} +(the best solution). FunnelWeb provides the +same macro facility for languages that do not have a built-in +preprocessor. + +In particularly speed-stressed applications, the programmer may be +reluctant to remove code to a procedure because of the procedure-call +overhead.\xx{procedure call}{overhead} +FunnelWeb macros can help there too. + +In summary, there sometimes arises in programming situations where the +cost of defining a procedure is higher than the benefits it will bestow. +Common reasons for this are the run-time procedure overhead and +the messy binding problems\xx{binding}{problems} +caused by removing target code from its target context. FunnelWeb +can help in these situations by allowing the programmer to define a text +macro. This avoids all the problems and provides an additional incentive +for the programmer to describe the piece of code so isolated. + +\subsection{When Comments are Bad} +\xx{comments}{abuse}\xx{eliminating}{comments} + +In the \dq{good old days}\x{good old days} +of small machine memories and interpreted BASIC,\x{BASIC} +programmers would eliminate the \dqp{REM} statements\xx{REM}{statement} +(comments) from their +BASIC programs so as to save space and increase execution speed. Whilst +this was obviously an appalling programming practice, the small memories +and slow microprocessors often made this tempting, if not necessary. + +Thankfully, times have changed since then, +and most code is now compiled +rather than interpreted. However, from time to time one still runs into +an environment or situation, or special-purpose language, where comments +are either unavailable (no comment feature) or undesirable. Here +FunnelWeb can be used to fully document the code without resulting in any +comments in the final code at all. For example:\xx{header}{files} + +\begin{itemize} + +\item Comments in frequently used \p{.h} header files in C +programs\xx{C}{header} can +have a significant impact on compilation speed. Often such header files +are fairly cryptic and really ought to be well commented, but their authors +are reluctant to. + +\item Comments are undesirable in PostScript\x{postscript} +header files that must be +transferred repeatedly along communications channels (\eg{}the Apple +Macintosh LaserWriter header file). + +\item Interpreted programs in embedded systems. + +\item Hand written machine code in hex dump form could be commented. + +\item A programmer may wish to annotate a text data file containing lists +of numbers that is to be fed into a statistical program that does not +provide any comment facility for its input file. + +\end{itemize} + +In all these situations, FunnelWeb allows full integrated documentation +without any impact on the final code. + +\subsection{Documents That Share Text} +\xx{sharing}{text} + +FunnelWeb is very useful when preparing multiple documents that must +share large slabs of identical text that are being constantly modified. + +For example someone preparing two slightly different user manuals for two +slightly different audiences might want the manuals to share +large slabs of text, while still allowing differences between them. +The following example shows how this can be done. The code is cluttered, +but this clutter would not be a problem if the lumps of text were moderately +large. + +\begin{verbatim} +@O@<manual1.txt@>==@{@<M1@>@+@} +@O@<manual2.txt@>==@{@<M2@>@+@} + +@$@<M1@>+=@{@<T1@>@} +@$@<M2@>+=@{@<T1@>@} +@$@<T1@>@M==@{First lump of text shared by both documents.@+@} + +@$@<M1@>+=@{Text for first document@+@} +@$@<M2@>+=@{Text for second document@+@} + +@$@<M1@>+=@{@<T2@>@} +@$@<M2@>+=@{@<T2@>@} +@$@<T2@>@M==@{Second lump of text shared by both documents.@+@} +\end{verbatim} + +An alternative approach, which might work better in situations where there +are many small differences between the two documents rather than a few large +ones, is to define a macro with two arguments, one for each product +file document. +Write the document from top to bottom, but place all stretches that +differ between the two documents in a macro call.\xx{annual}{report} + +\begin{verbatim} +@! Set the definition of @#D to +@! @1 to create the shareholders report. +@! @2 to create the customers report. +@$@#D@(@2@)@M==@{@1@} + +@O@<report.txt@>==@{@- +1992 ANNUAL REPORT TO @#D@(Shareholders@,Customers@) +======================@#D@(============@,=========@) +This has been a very good year for The Very Big Corporation of America. +With your help, we have been able to successfully +@#D@(@"screw the customers for every cent they have@"@, + @"knock the shareholders into submission to bring you lower prices@"@). +With gross earnings approaching six trillion dollars, we have been able to +@#D@(@"increase dividends@"@, + @"lower prices@"@). +We expect to have an even better year next year. +@} +\end{verbatim} + +One application where text sharing can be particularly useful is in the +preparation of computer documentation\xx{examples}{documentation} +containing examples. For example, +a book describing a new programming language might be full of examples +of small programs written in the language which the user might want to try +without having to type them all in. The \dq{default} approach of keeping +a copy of the examples in the text of the book and another copy in +separate files is cumbersome and error prone, because both files have to +be updated whenever an example is changed. A more sophisticated approach is +to store each example in a separate file, and then use the \dq{include file} +facility of the word processor to include each example in the text. +This is a better solution, but suffers from a few drawbacks. First, when +editing the book in a word processor, the +examples in the book will not be directly accessible or visible. To see an +example, the writer would have to open the file containing the example in +a separate window. This could become tedious if the text contained many +examples, as many texts do. Furthermore, there is a risk that some example +files will be included in the wrong place. Second, because the book is +dependent on the included files, the book will end up consisting of a +directory of a hundred or more files instead of just a few. + +An alternative solution is to construct a single FunnelWeb \p{.fw} +file that, when processed, produces both the book file and the example files. +This solution assumes that the book consists of a text file containing +commands for a typesetter such as \TeX{}. + +\begin{verbatim} +@O@<Book.tex@>==@{@#B@} + +@$@#B+=@{@- +The first step to learning the object oriented AdaCgol++ language is to examine +a hello world program. + +\start{verbatim} +@<Ex1@> +\finish{verbatim} +@} + +@$@<Ex1@>==@{read iopack@+Enter !World~! !Hello~! ex pr flu X[1]@} +@O@<Ex1.c@>==@{@<Ex1@>@} + +@$@#B+=@{@- +To understand the program, think of the execution state as a plate of cheese... +@} +\end{verbatim} + +Most of the file will consist of part definitions of the additive +macro \p{@\#B}. The definition is \dq{broken} to allow a macro definition, +wherever an example appears. + +The example above is a little messy because FunnelWeb does not allow +macros connected to product files to be called, and it does not have +text expressions that write to an product file as well as evaluating to text. +Nevertheless, it presents a fairly clean solution to the problem of keeping +the example programs in a computing text up to date. + +\subsection{Generics} +\xx{generics}{fudging} + +It is well known that generics in programming languages are closely aligned +with textual substitution. In fact, a good way to understand the generic +facility of a new programming language is to ask oneself the question +\dq{In what way does this generic facility differ from simple text +substitution?} The differences, if any, typically have to do with +the difference in scoping between textual and intelligent substitution +and whether the generic code is shared or copied by the implementation. +In most cases the differences are quite minor. + +Because generic facilities are so closely aligned with text substitution, +it is possible to use FunnelWeb's parameterized macros to provide generics +in programming languages that do not support generics. Simply write a +FunnelWeb macro whose parameters are the parameters of the generic and +whose body is the generic object. + +The following FunnelWeb file gives an example of a fully worked Vax +Pascal\x{Pascal} +generic set package implemented using FunnelWeb parameterized macros. +The package was written by Barry Dwyer\xn{Barry}{Dwyer} +of the Computer Science Department +of the University of Adelaide\xx{University}{Adelaide} +in 1987 and was emailed to me on +11~November 1987. The generic package provides a set +abstraction\xx{set}{abstraction} implemented +using linked lists. Note the clever use of the instantiation parameters in +type, function, and procedure names. + +\begin{verbatim} +@$@<Generic Set Module@>@(@2@)==@{@- +@! @1 is the base type, @2 is the set type. +[inherit ('@1'), environment ('@2')] + +module @2; + +type @2 = ^@2Record; + @2Record = record + Member: @1; + Next: @2; + end; + +procedure Null@2 (var Result: @2); +begin new (Result); +Result^.Member := (- MaxInt)::@1; +Result^.Next := nil end; + +function IsNull@2 (S: @2): boolean; +begin IsNull@2 := S^.Member::integer = - MaxInt end; + +procedure ForEach@1 (S: @2; procedure DoIt (i: @1)); +var ThisS, NextS: @2; +begin ThisS := S; +while ThisS^.Member::integer <> - MaxInt do + begin NextS := ThisS^.Next; + DoIt (ThisS^.Member); + ThisS := NextS end; +end; + +function First@1 (S: @2): @1; +begin First@1 := S^.Member end; + +function Is@1InSet (i: @1; S: @2): boolean; + procedure TestEquals (j: @1); + begin if Equal@1 (i, j) then Is@1InSet := true; end; +begin Is@1InSet := false; ForEach@1 (S, TestEquals); end; + +function Includes@2 (S1, S2: @2): boolean; +var Result: boolean; + procedure TestIfInS1 (i: @1); + begin if Result then if not Is@1InSet (i, S1) then Result := false; end; +begin Result := true; +ForEach@1 (S2, TestIfInS1); +Includes@2 := Result end; + +function Disjoint@2s (S1, S2: @2): boolean; +var Result: boolean; + procedure TestIfInS1 (i: @1); + begin if Result then if Is@1InSet (i, S1) then Result := false; end; +begin Result := true; +ForEach@1 (S2, TestIfInS1); +Disjoint@2s := Result end; + +function Equal@2 (S1, S2: @2): boolean; +begin +Equal@2 := Includes@2 (S1, S2) and Includes@2 (S2, S1); +end; + +procedure Insert@1 (i: @1; var S: @2); +var This, Pred, Succ: @2; +begin +if not Is@1InSet (i, S) then + begin + Pred := nil; Succ := S; + while Succ^.Member::integer > i::integer do begin + Pred := Succ; Succ := Succ^.Next end; + if Succ^.Member::integer < i::integer then begin + new (This); This^.Next := Succ; This^.Member := i; + if Pred <> nil then Pred^.Next := This else S := This; + end; + end; +end; + +procedure Insert@1s (S1: @2; var S2: @2); +var This, Pred, Succ: @2; + procedure Add@1 (i: @1); + begin Insert@1 (i, S2) end; +begin +ForEach@1 (S1, Add@1); +end; + +procedure Remove@1 (i: @1; var S: @2); +var Pred, This: @2; +begin +Pred := nil; This := S; +while not Equal@1 (This^.Member, i) do begin + Pred := This; This := This^.Next end; +if Pred <> nil then Pred^.Next := This^.Next else S := This^.Next; +Dispose (This); +end; + +procedure Dispose@2 (var S: @2); +var Old: @2; +begin +while S <> nil do begin Old := S; S := S^.Next; Dispose (Old) end; +end; + +end. +@} + +@O@<NaryTreeSet.pas@>==@{@- + @<Generic Set Module@>@(@"NaryTree@"@,@"NaryTreeSet@"@)@} +@O@<NaryTreeSetSet.pas@>==@{@- + @<Generic Set Module@>@(@"NaryTreeSet@"@,@"NaryTreeSetSet@"@)@} +\end{verbatim} + +A great advantage of the approach reflected in the above example is that +it allows the programmer to construct a generic object in a language that +does not supply generics, \i{with complete typesafety.}\xx{typesafe}{generics} +This contrasts to the +approach that might be used in a language such as C where the programmer +might choose to construct a \dq{generic} package by parameterizing a +package with pointers to \p{void}. The resulting package is +powerful but extremely untypesafe. Such a generic list package is used in the +code of FunnelWeb itself and caused no end of problems, as the compiler had +no way of telling if pointers to the correctly typed object were being +handed to the correct list-object/function combination. + +The major disadvantage of the text generic approach is that it causes the +code of the generic object to be duplicated once for each instantiation. +Depending on the number and size of the instantiations, this may or may not +be acceptable. + +Where the duplication of code is unacceptable, a hybrid approach may be +taken. As in the C~example, the programmer could write +a single generic package +using pointers to \p{void} or some other untypesafe mechanism. +Then the programmer +creates a FunnelWeb generic package whose functions do nothing +more than call the functions of the untypesafe package, and whose types do +nothing more than contain the types of the untypesafe package. This solution +involves the use of untypesafe programming, but this is a one-off +and if done carefully and correctly, the result can be +a typesafe generic package involving minimal code duplication. + +\section{Summary} + +This chapter has described some of the finer aspects of the use of FunnelWeb. +Throughout, the power and danger of FunnelWeb as a general text-rearranging +preprocessor has been emphasised. FunnelWeb can be used both to make programs +more readable or more obscure. It is up to the programmer to ensure that +FunnelWeb is used properly. + +%==============================================================================% +% End of Ch2.tex % +%==============================================================================% diff --git a/web/funnelAC/userman/u_ch3.tex b/web/funnelAC/userman/u_ch3.tex new file mode 100644 index 0000000000..7669732fc8 --- /dev/null +++ b/web/funnelAC/userman/u_ch3.tex @@ -0,0 +1,2986 @@ +%==============================================================================% +% Start of Ch3.tex % +%==============================================================================% +% +% Copyright +% --------- +% Copyright (C) 1992 Ross N. Williams. +% This file contains a chapter of the FunnelWeb User's Manual. +% See the main TeX file for this manual for further information. +% +%==============================================================================% + +\chapter{FunnelWeb Definition} +\label{chapdefinition}\xx{FunnelWeb}{definition} + +\section{Introduction} + +This purpose of this chapter is to provide a complete and consistent +definition of the FunnelWeb input language and the behaviour of the +FunnelWeb program. Usually, a chapter such as this is called a +\dq{reference manual}, but this chapter is intended to go further +by actually defining the language and program. This chapter takes +precedence over all other chapters and all implementations of FunnelWeb. +If an implementation contradicts this chapter, then the implementation +is wrong. + +This is the chapter that you should turn if you find yourself asking a +specific question about a specific aspect of FunnelWeb. In many +cases it will be convenient to access this chapter through the index. + +\section{Notation} +\x{notation} + +A particular variant of EBNF\xx{EBNF}{syntax} +(Extended Bachus Naur Form) will be used to +describe the FunnelWeb syntax. In this variant, literal strings are +delimited by double quotes (\eg{}\p{"string"}), optional constructs by +square brackets (\eg{}\p{[optional]}), and constructs repeated zero or +more times by braces (\eg{}\p{\{zeroormore\}}). Constructs to be repeated +a fixed number of times are enclosed in braces followed by a decimal +number indicating the number of times to be repeated +(\eg{}\p{\{sixtimes\}6}). Constructs to be +repeated one or more times are +enclosed in braces and followed by a \p{+} (\eg{}\p{\{oneormore\}+}). +The traditional BNF \dqp{::=} +is replaced by the visually simpler \dqp{=}. The traditional BNF angle +brackets are abandoned. + +Although FunnelWeb allows the special character to be changed using the +construct \dq{$<$special$>$=}, use of \dq{$<$special$>$} to refer to +FunnelWeb's special character is cumbersome and abstract. To simplify +the presentation, the default special character \dqp{@} is used throughout +this chapter to represent the special character. + +\section{Terminology} +\x{terminology} + +A specific terminology has arisen for dealing with FunnelWeb. Some +particularly useful examples are: + +\narrowthing{Journal file:}{An output file containing +a copy of the output sent to +the user's console during an invocation of FunnelWeb. In other systems, +this file is sometimes called a \dq{log file}.} + +\narrowthing{Product file:}{An output file, generated by the Tangle +component of +FunnelWeb, that contains the expansion of the macros in the input +file.\footnote{Other names considered for this were: +generated file, expanded file, result file, program file, and tangle file.}} + +A complete list of all the special FunnelWeb terminology appears in the +glossary. Be sure to refer to it if any of the terms used are unclear. + +\section{An Architectural Overview} +\xx{semantic}{architecture}\xx{FunnelWeb}{overview} + +An understanding of the internals of FunnelWeb assists with understanding +its operation (\figphases{}).\xx{execution}{phases} + +During a single run, FunnelWeb reads and +processes a single input file called the \newterm{input file} or +the \newterm{FunnelWeb file}. The file is processed by passing it through +a series of stages called \newterm{phases}. The result is that some +\newterm{output files} are generated. +A \newterm{journal file} is generated containing a copy of the messages that +appear on the console during the FunnelWeb run. A \newterm{listing file} +is created containing a summary of the run, including any error messages. +A \newterm{documentation} file is generated containing typesetter commands +that when fed into a typesetter program will result in +printed documentation. Finally, one or more \newterm{product files} +are generated containing the result of unscrambling the macro definitions +of the input file. + +These files need not all be generated on any particular FunnelWeb run. +Whether each output file appears is controlled by command line options. + +\begin{figure}[htbp] +\begin{verbatim} + + .fw Input File (FunnelWeb file) + V + +---------+ \ + | Scanner | | + +---------+ | + V | + +--------+ | + | Parser | | + +--------+ | + V | + +----------+ >-------+------------+ + | Analyser | | | | + +----------+ | | | + V | | | + +-----------+------------+ | V V + V V | | | + +--------+ +-------+ | | | + | Tangle | | Weave | | | | + +--------+ +-------+ / | | + | | | | + V V V V + Product Files Documentation File Listing File Journal File + +\end{verbatim} +\mylabel{\figphases{}: FunnelWeb's processing phases.}{% +% +FunnelWeb processes each input file in a sequence of phases. +If an error occurs during a phase, no subsequent phases are executed. +% +} +\end{figure} + +The phases are briefly described below. + +\narrowthing{The Scanner}{reads\x{scanner} the input file, expands +and reads in include files, +scans the input stream, processes pragmas and typesetter directives, +and parses all the +FunnelWeb special sequences. The result is a list of tokens that +is handed to the parser.} + +\narrowthing{The Parser}{reads\x{parser} +the scanner's token list and parses it, constructing a +document list\xx{document}{list} and a macro +table.\xx{macro}{table} which are passed to later phases.} + +\narrowthing{The Analyser}{examines\x{analyser} +the macro table generated by the parser +and performs a number of checks of the macro structures +that the parser could not make on its single pass. +For example, the +analyser detects and flags unused macros and recursive macros. The +analyser forms the final stage of FunnelWeb's front-end processing.} + +\narrowthing{Tangle}{expands certain macros in the macro table +to generate\x{tangle} one or more product files.} + +\narrowthing{Weave}{uses the document list to generate\x{weave} +a documentation file.} + +A single run through these phases constitutes a single invocation of +\newterm{FunnelWeb proper}. Most invocations of the +\newterm{FunnelWeb program} +will consist only of a single execution of FunnelWeb proper. However, +FunnelWeb also provides a command shell that provides many useful commands, +including a command to invoke FunnelWeb proper. Discussion of the command +shell is deferred until Section~\ref{commandshell}. + +\section{Diagnostics} +\label{diagnostics}\x{diagnostics} + +During execution, FunnelWeb proceeds cautiously with each of its phases, +only proceeding with the next phase if the previous phase has been +successful. This means that, when debugging +a FunnelWeb file, you may find that the number of errors \i{increases} +after you fix some of them, as you will be exposing yourself to the +next FunnelWeb phase. + +FunnelWeb employs five levels of diagnostics\xx{diagnostics}{levels of} +at different levels of +severity.\x{severity} +Severity is defined in terms of the level of activity at which the +diagnostic causes FunnelWeb to abort. + +\narrowthing{Warning:}{A warning\xx{warning}{severity} +does not cause FunnelWeb to terminate or +curtail its operation in any way, but serves merely to warn the user of +particular conditions that might be symptomatic of deeper problems.} + +\narrowthing{Error:}{An\xx{error}{severity} error causes +FunnelWeb to terminate processing of the +current input file at the end of the current phase. For example, if an +error occurs during scanning, FunnelWeb will continue scanning (and possibly +generate further scanning diagnostics), but will not invoke the parser.} + +\narrowthing{Severe Error:}{A\xx{severe}{severity} severe error +(or \dq{severe} for short) is the same +as an error except that FunnelWeb terminates the current phase immediately.} + +\narrowthing{Fatal Error:}{A\xx{fatal}{severity} fatal error +causes FunnelWeb not only to terminate +the current phase and run immediately, but also to terminate total +FunnelWeb processing immediately. A severe error will not cause a +FunnelWeb script to terminate, but a fatal error will. A fatal error +causes FunnelWeb to return control to the operating system.} + +\narrowthing{Assertion Error:}{An\xx{assertion}{severity} +assertion error occurs if FunnelWeb detects +an internal inconsistency, in which case FunnelWeb terminates immediately +and ungracefully. Such +an error can occur only if there are bugs in FunnelWeb. With luck, such +errors will be extremely rare.} + +FunnelWeb indicates the level of severity of each diagnostic that it issues +by starting each diagnostic either with the full name of the severity level +or with just the first letter of the severity level followed by a colon. + +FunnelWeb conveys the presence or absence of diagnostics at the operating +system level by returning \p{EXIT\_SUCCESS}\xx{return}{status} +status if no +diagnostics occurred during the run and \p{EXIT\_FAILURE} status +if one or more +diagnostics (including warnings) +occurred during the run.\footnote{From +the symbols of the ANSI standard C library \p{stdlib.h}. +See \paper{Kernighan88}, p.252.} + + +\section{Typesetter Independence} +\xx{typesetter}{independence} + +One of the design goals of FunnelWeb was to provide a \i{target-language} +independent literate programming system. This goal has been achieved +simply by treating the text written to the product file +as homogeneous and typesetting +it in \p{tt font}. A secondary goal was to provide +a \i{typesetter} independent literate programming +system. By this is meant that it be possible to create FunnelWeb input files +that do not contain typesetter-specific commands. +To a lesser extent this goal has also been achieved. + +The difficulty with providing typesetter-independent typesetting is that +each desired typesetting feature must be recreated in a +typesetter-independent FunnelWeb typesetting construct that FunnelWeb can +translate into whatever typesetting language is being targeted by Weave. +Taken to the extreme, this would result in FunnelWeb providing the full +syntactic and semantic power of \TeX{}, but with a more generic, +FunnelWeb-specific syntax. This was unfeasible in the time available, and +undesirable as well. + +The compromise struck in the FunnelWeb design is to provide a set of +primitive typesetter-independent typesetting features that are implemented +by FunnelWeb. These are the \newterm{typesetter directives}. +If the user is prepared to restrict to these directives, +then the user's +FunnelWeb document will be both target-language and typesetter independent. +However, if the user wishes to use the more sophisticated features of the +target typesetting system, the user can specify the typesetter +in a \dqp{typesetter} pragma and then place typesetter commands +in the free text +of the FunnelWeb document where they will be passed verbatim to the +documentation file. The choice of the trade-off between typesetter +independence and typesetting power is left to the user. + +This said, experience with FunnelWeb V1 over a three year period, +indicates that the typesetting facilities provided by FunnelWeb are +sufficient for most documentation. + +\section{Command Line Interface} +\xx{command line}{interface} + +\subsection{Invoking FunnelWeb} +\xx{FunnelWeb}{invoking}\xx{FunnelWeb}{running} + +When a user invokes FunnelWeb at the operating system command level, the +user must provide a command line instructing FunnelWeb what to do. Typically +an operating system command line consists of a \i{verb} indicating that a +particular program should be run, followed by a list of options. For example: + +\begin{verbatim} +$ rename file1 file2 +\end{verbatim} + +In this case, the verb is \p{rename} and the command line options are +\p{file1 file2}. The entire command line begins with the \p{\$} and ends with +the \p{2}. + +Operating systems differ greatly in the depth with which +they process their command\xx{command line}{processing} +lines, ranging from systems that simply pass the entire command line string +to the invoked program (\eg{}MSDOS) through to systems that perform complete +command line parsing (\eg{}VMS). Syntax conventions vary considerably. + +So as to achieve maximum portability and consistency of invocation across +different platforms, FunnelWeb reads its command line as a raw string and +performs all its own parsing.\xx{command line}{parsing} +This is portable because, at the very least, all +operating systems allow invoked programs access to the raw command line. + +The command verb used to invoke FunnelWeb should be +\dqp{fw}.\xx{fw}{command verb} + +\begin{verbatim} +FunnelWeb_verb = "fw" +\end{verbatim} + +If this verb is not available, some alternatives are +\dqp{funweb}, \dqp{fun}, and \dqp{funnelweb}. +The verbs \p{web} or \p{fweb} should be avoided +as they are the names of other literate programming systems. + +\subsection{Command Line Arguments} +\xx{command line}{argument}\xx{syntax}{command line} + +Following the verb is the body of the command line which +FunnelWeb parses into +zero or more \newterm{arguments} separated by runs +of one or more blanks. + +\begin{verbatim} +FunnelWeb_command_line = FunnelWeb_verb {{" "}+ argument} +\end{verbatim} + +Because some operating systems convert +their command line to upper case before handing it to the invoked program, +FunnelWeb has been constructed so as to be \i{insensitive} to the case +of its command line arguments.\xx{case}{dependence} However, when +dealing internally with arguments, FunnelWeb \i{preserves} the case of +its command line arguments so that it will be able to operate with +operating systems (such as Unix\x{Unix}) +whose file names are case dependent. + +A valid FunnelWeb argument consists of a +\newterm{sign}, an identifying \newterm{letter}, and an +optional +\newterm{string} with no spaces separating +them.\xx{command line options}{syntax}\xx{options}{syntax} + +\begin{verbatim} +argument = sign id_letter [non_blank_string] +sign = "+" | "-" | "=" +id_letter = "B" | "C" | "D" | "F" | "H" |"I" | "J" | "K" | + "L" | "O" | "Q" | "S" | "T" | "W" | "X" +\end{verbatim} + +In addition there is a special form of argument that does not begin with +a sign. + +\begin{verbatim} +argument = non_blank_string_not_beginning_with_+_=_or_- +\end{verbatim} + +This form is exactly equivalent to the same string with \dqp{+F} +prepended to it. + +The semantic effect of these arguments is +defined in terms of \newterm{options} which are the +internal parameters of FunnelWeb +and which correspond closely with the set of legal command line arguments. +FunnelWeb has a predefined set of options each identified +by an identifying letter having two attributes: a \i{string}, and a +\i{boolean}. The boolean determines whether an option is turned +\i{on} or \i{off}. The string contains additional information +depending on the option. + +When FunnelWeb starts up, its options have predefined default values. +FunnelWeb then parses its command line sequentially from +left to right +executing the effect of each argument on the argument's corresponding +option. The sign and the +string components of the argument are processed \i{independently}. +A sign of \p{+} turns the option on. A sign of \p{-} turns the option off. +A sign of \p{=} leaves the option's boolean attribute unchanged. The argument +string replaces the string of the corresponding +option, unless the argument string is empty, in which case the +option string is not changed. + +Because FunnelWeb processes its command line arguments from left to right, +a later argument can cancel the effect of an earlier one. +For example \p{fw +t -t} will result in the \p{t} option +ending up \i{off}. This allows users to set up their own default arguments +by defining a symbol in their operating system's command language. For +example, a Unix user who wants FunnelWeb to delete all identical output +files and create a documentation file on each run +with a default \p{.typ} extension could simply place the following definition +in their \dqp{.login} file. + +\begin{verbatim} +alias fw fw +d +t.typ +\end{verbatim} + +These default options can then later be easily overridden on the command line. + +\subsection{Options} +\label{commandlineoptions}\x{options}\xx{list}{options} + +FunnelWeb's options are internal parameters which can be modified by +corresponding arguments on FunnelWeb's command line. A description of each +argument and option follows. + +\narrowthing{B1$\ldots$B6: Tracedumps:}{These\xx{B}{option} +six\xx{tracedump}{options}\xx{dump}{option} options have been provided to +assist in the debugging and testing +of FunnelWeb. They determine which of six possible trace dumps are +to be written to the listing file. Only the boolean attributes +of these options are ever used. The six dumps are identified by the +digits \p{1..6} as +follows:\xx{dump}{mapped file} +\xx{dump}{global line list}\xx{dump}{token list} +\xx{dump}{macro table}\xx{dump}{document list}\xx{dump}{times}} + +\begin{enumerate} +\item Dump a hexdump of each mapped input and include file. +\item Dump the global line list created by the scanner. +\item Dump the token list created by the scanner. +\item Dump the macro table created by the parser. +\item Dump the document list created by the parser. +\item Dump a table summarizing CPU and real time usage. +\end{enumerate} + +\narrowtext{Because these options are so closely related, a hack has been +pulled to enable them to all to be controlled by the \p{B} argument. +The +string argument to the \p{B} argument determines which of the six options +are to be affected by the sign. Examples: \p{+B134} turns on options \p{B1}, +\p{B3}, and \p{B4}. \p{-B1} turns off option \p{B1}. +\p{Default:~-B123456}.} + +\narrowthing{B7: Determinism:}{If the \p{B7} option is turned on, +FunnelWeb suppresses the output of anything +non-deterministic,\x{non-determinism} +or machine dependent. This assists in regression testing. +Only the boolean attribute is used in this option. +This option is controlled by the \p{B7} argument which falls under the +same argument syntax as the other \p{B} options. Examples: \p{+B7}, \p{-B7}. +\p{Default:~-B7}.} + +\narrowthing{C: Listing File Context:}{The\xx{C}{option} +\p{C}\xx{listing file}{context} +option is always turned on and +cannot be turned off. Its only attribute is a number which determines the +number of lines of context that the lister will place around lines flagged +with diagnostics in the listing file (if a listing file is written). +A value of 100 indicates infinite context\xx{infinite}{context} +which means that the entire +listing file will be written out if a single diagnostic occurs. +The value of this number can be specified by specifying it as a string of +decimal digits to the \p{+C} argument. Examples: \p{+C100}, \p{+C10}. +\p{Default:~+C2}.} + +\narrowthing{D: Delete Identical Output Files:}{Only the boolean +attribute of this option is used.\xx{D}{option}\xx{delete output}{option} +When turned on, the option causes the suppression (deletion) +of product files and documentation files +(but not listing or journal files) that +are identical to the currently existing files of the same name. For example, +if FunnelWeb is instructed to generate \p{stack.h} as an product file, and +the text to be written to \p{stack.h} is identical to the currently existing +\p{stack.h}, then FunnelWeb will simply not write any product file, leaving the +currently existing \p{stack.h} as it is (and in particular leaving the +file's date attribute the same). +This prevents unnecessary \p{make} propagations. For example, in a C program, +if \p{stack.fw} is a +FunnelWeb input file that generates \p{stack.h} and \p{stack.c}, +a modification to \p{stack.fw} that affects \p{stack.c} but does not +affect \p{stack.h} will not provoke the recompilation of modules +that \p{\#include stack.h}, so long as the intervening FunnelWeb run has +\p{+D} set. Examples: \p{-D}, \p{+D}. \p{Default:~-D}.} + +\narrowthing{F: FunnelWeb Input File:}{If\xx{F}{option} +this option is turned on, FunnelWeb\xx{input file}{option} +processes the input file whose name is specified by the option string. +Examples: \p{+Fsloth.fw}, \p{+Fwalrus}, \p{-F}. +\p{Default:~-F}.} + +\narrowthing{H: Display Help Message:}{If\xx{H}{option} +this option\xx{help}{option} is turned on, FunnelWeb +displays the message specified by the argument string. +Each message has a name. The main help message is called \dqp{menu} +and contains a list of the other help messages. Examples: \p{+Hregistration}, +\p{+Hoptions}. \p{Default:~-Hmenu}.} + +\narrowthing{I: Include default file specification:}{This\xx{I}{option} +option\xx{include file}{option}\xx{include}{file} is always turned +on and cannot be turned off. Its string attribute is used as the default file +specification for include files. Usually this option is used to specify +a directory from which include files should be obtained. +Examples: \p{=I/usr/dave/includes/}. \p{Default:~+I}.} + +\narrowthing{J: Journal File:}{If\xx{J}{option} this option is turned on, +FunnelWeb generates a\xx{journal file}{option}\xx{journal}{file} +journal file. A journal file contains a log of +all the console input and output to FunnelWeb during a single invocation of +the FunnelWeb program (Note: The \p{Q} option does not affect this.). +The journal file is particularly useful for examining what happened during +a FunnelWeb shell run. The string attribute is the name of the journal +file. Examples: \p{+Jjournfile}, \p{-J}. \p{Default:~-J}.} + +\narrowthing{K: Keyboard:}{If\xx{K}{option} +this option\xx{keyboard}{option}\xx{interactive}{option} +is turned on, FunnelWeb enters an +interactive mode in which the user can enter FunnelWeb shell commands +interactively. The string attribute is unused. +Examples: \p{+K}, \p{-K}. \p{Default:~-K}.} + +\narrowthing{L: Listing File:}{If\xx{L}{option} +this option is turned on, FunnelWeb +generates a\xx{listing file}{option}\xx{listing}{file} +listing file containing a summary of a run on FunnelWeb proper. +The string argument is the name of the listing file to be created. +Examples: \p{+L}, \p{-L}, \p{+Llisting.lis}. +\p{Default:~-L}.} + +\narrowthing{O: Product Files:}{If this option is turned on, +FunnelWeb generates a product file for each macro in the input file +that is bound to an output file. The string attribute contributes to the +name of the product files. This option is controlled +by the \p{O} argument +because product files used to be called \dq{\b{O}utput files}). +Examples: \p{-O}, \p{+O/usr/dave/product/}. \p{Default:~+O}.} + +\narrowthing{Q: Quiet:}{If\xx{Q}{option} this option is turned on, +FunnelWeb suppresses all\xx{quiet}{option}\xx{suppress}{console output} +output to the screen (standard output) unless one or more errors occur, +in which case a single line summarizing the errors is sent to standard +output at the end of the run. If this option is turned off, FunnelWeb +writes to the console in its normal garrulous way. The string +attribute is unused in this option. Examples: \p{-Q}, \p{+Q}. \p{Default:~-Q}.} + +\narrowthing{S: Screen:}{If\xx{S}{option} this option is turned on, +FunnelWeb writes all\xx{screen}{option} +diagnostics to the screen (standard output) +as well as to the listing file. +By default, they are sent only to the listing file. +This option has a single numerical attribute +that can be specified as a decimal string in the string component of the +\p{S} argument. The number is the number of lines of context that should +surround each diagnostic sent to the screen.\x{context} +Examples: \p{-S}, \p{+S6}, \p{+S0}. \p{Default:~-S}.} + +\narrowthing{T: Documentation file:}{If\xx{T}{option} this +option\footnote{This option is controlled by the \p{T} command line +argument because documentation files used to be called typesetter files.} is +turned on, FunnelWeb\xx{typeset}{option}\xx{typeset}{file} +generates a documentation file in \TeX{} format. +The string argument contributes to the +name of the documentation file to be created. +By default this option is turned off, as experience has +shown that most FunnelWeb runs are made during program development; +documentation runs occur far more rarely. Examples: \p{-T}, +\p{+Tsloth.tex}. \p{Default:~-T}.} + +\narrowthing{W: Width of Product Files:}{If\xx{W}{option} +this option\xx{width}{option}\xx{product file}{width} +is turned on, a limit is +placed on the length of lines in product files generated during the +run. Lines that breach the limit are flagged with error messages. +This option has a single numerical attribute +that can be specified as a decimal string in the string component of the +\p{W} argument. The number is the specified maximum width. +This option is one of two limits that are placed on the width of +product files. The other limit is an attribute of the input file that +defaults to 80 characters, +but can be raised or lowered using an output line length +pragma. The width that is enforced is the lower of this value and the +value of the \p{W} option (if turned on). +Examples: \p{-W}, \p{+W100}. \p{Default:~-W80}.} + +\narrowthing{X: Execute:}{If\xx{X}{option} +this option\xx{execute script}{option} +is turned on, FunnelWeb executes the FunnelWeb shell +script file specified by the string attribute. +Examples: \p{+Xmaster}, \p{-X}. +\p{Default:~-X}.} + +\section{File Name Inheritance} +\xx{filename}{inheritance} + +During a single run of FunnelWeb, FunnelWeb can produce many different +output files. As it would be very tedious to have to specify the name +of each of these files explicitly each time FunnelWeb is run, FunnelWeb +provides a system of defaults that allows the user to specify the minimum +required to successfully complete the run. To do this FunnelWeb allows +file specifications to inherit fields from one another. + +FunnelWeb structures filenames into three fields\xx{filename}{fields} +which are inherited +independently. The fields are: \newterm{directory}, \newterm{name}, +and \newterm{extension}. +On systems having other fields (\eg{}\i{network node}, \i{device name}), +the extra fields are considered to be part of the directory field. +Version numbers are +ignored. A field can inherit a value if its current value is +the empty string. + +The following table gives the full inheritance scheme used in FunnelWeb. + +\begin{center} +\begin{tabular}{|l|l|l|l|l|l|l|} \hline +Script & Input & Include & Journal & List & Document & Product \\ \hline + & & \p{@i} & & & & \p{@o} \\ +\p{+x} & \p{+f} & \p{+i} & \p{+j} & \p{+l} & \p{+t} & \p{+o} \\ +\dqp{.fws} & \dqp{.fw} & \dqp{.fwi} & \dqp{.jrn} & \dqp{.lis} & \dqp{.tex} & \\ + & & \p{+f} & \p{+f} & \p{+f} & \p{+f} & \\ +DefDir & Defdir & Defdir & Defdir & Defdir & Defdir & Defdir \\ \hline +\end{tabular} +\end{center} + +The table is arranged with items of highest priority at the top. +The \dqp{+<letter>} cells refer to the file +specification supplied in the given command line argument. +\dqp{+F} is the name of the input file. +\dq{Defdir} refers to the default directory +specification provided by the operating system. Empty cells +do not contribute. + +The following example shows how the table is used. +Suppose that the user invoked FunnelWeb as +follows:\xx{filename inheritance}{example} + +\begin{verbatim} +fw /usr/ross/work/sloth.fw +twalrus +\end{verbatim} + +To work out what the documentation file should be called, FunnelWeb starts +with the empty string and then works down the Document column of the table. +The top entry is empty +so we ignore it and proceed to the second entry which consists of \dqp{+T}. +The user specified the string \dqp{walrus} as the value of this option, and +as our current (empty) +string does not have a name field, we insert the string +\dqp{walrus} into the name field, resulting in the string \dqp{walrus}. +Moving down to the next row, we encounter the constant string \dqp{.tex}. +This string consists of an empty directory and name field, but a \dqp{.tex} +file extension. As our current string \dqp{walrus}, does not already +have a file extension (\ie{}the file extension field of our current string +is empty), we add in \dqp{.tex}, +resulting in the string \dqp{walrus.tex}. Next we encounter the \dqp{+F} field +which is the input filename \dqp{/usr/ross/work/sloth.fw} consisting of +a directory field \dqp{/usr/ross/work/}, a name field \dqp{sloth}, and a +file extension field \dqp{.fw}. Our \dqp{walrus.tex} string already has +name and file extension fields, but its directory field is empty, and +so we add in the directory field from the input file specification, +resulting in the string \dqp{/usr/ross/work/walrus.tex}. Finally, we hit +the default directory specification, which is (say) +\dqp{/usr/ross/play/}. However, as the directory field of our walrus +string is already full, it has no effect. + +In general, there is no need to remember the exact details of FunnelWeb's +filename inheritance. The important thing is to know that it exists, and to +use it. + +\section{FunnelWeb Startup} +\xx{FunnelWeb}{startup}\xx{FunnelWeb}{initialization} + +FunnelWeb's command line options can be divided into two groups. +\newterm{Action options} instruct FunnelWeb to performs some sort of +independent action such as processing a file. \newterm{Ordinary options} +merely modify the way in which FunnelWeb executes the actions. + +The four action options are: \p{+F}, \p{+K}, \p{+X}, and \p{+H}. For +FunnelWeb to be successfully invoked, at least one action option must be +specified. If zero action options are specified, FunnelWeb terminates +with failure status. +If more than one action option is specified, FunnelWeb performs +the specified actions in a predefined order. + +Assuming that the user has specified at least one action, the order in which +actions are executed is as follows:\xx{action execution}{order} + +\narrowthing{Initialization script:}{FunnelWeb\xx{initialization}{script} +starts by +looking in the current +directory for a file called \dqp{fwinit.fws}.\x{fwinit.fws} +If it doesn't find one, it +doesn't raise any error. If it does find one, it executes it as a FunnelWeb +shellscript. Initialization scripts are useful for setting up FunnelWeb +options (\eg{}using the \dqp{set} +command without having to type them each time).} + +\narrowthing{Execute argument script:}{If a shellscript has been specified +using the \dqp{+X} option, FunnelWeb executes it.} + +\narrowthing{Process input file:}{If the user has specified an input file +using the \dqp{+F} option, then this is processed next (by FunnelWeb proper).} + +\narrowthing{Display help message:}{If the user requested, +using the \dqp{+H} option, that a help message be displayed, +the message is displayed at this time.} + +\narrowthing{Interactive mode:}{If the user specified the +\dqp{+K} option, FunnelWeb enters interactive (keyboard) mode.} + +FunnelWeb processes these actions in the above order regardless of the +order in which they appear on the command line. + +It may be hard to see how some of these actions might be combined. +Nevertheless, FunnelWeb allows this. For example, a user might wish +to process a batch of files as specified in a script (\dqp{+Xscript.fws}), +be reminded of the interactive commands available (\dqp{+Hcommand}), and +then enter interactive mode so as to be able to +reprocess files for which FunnelWeb +reported errors (after correcting the errors in a different +workstation window). + + +\section{Scanner} +\x{scanner} + +The scanner reads in the input file and produces a list of tokens +which it hands onto the parser. In addition, some input constructs may cause +the scanner to modify some of FunnelWeb's options. + +\subsection{Basic Input File Processing} + +In order to read in an input file or include file, the scanner calls a +submodule called the \newterm{mapper} +that reads a file in and creates a contiguous copy of +it in memory. The scanner then performs three checks on the file, the first +(file termination) of +which is performed before scanning commences, and the other two of which take +place during scanning before each line is scanned. + +\narrowthing{File Termination:}{The\xx{file}{termination} +first check the scanner makes\xx{line}{termination} +is whether +the file is terminated properly. A file is considered to be properly +terminated if it either contains no lines, or if the last line in the file +is terminated by an end-of-line marker. If the scanner detects that an +input file is not properly terminated, it adds an end-of-line marker +itself (to the copy in memory only).} + +\narrowthing{Unprintable Characters:}{The second check the +scanner makes is for\xx{unprintable}{characters} +unprintable characters (ASCII 0--31 and 127--255 +(except for EOL(10))) which it flags +as errors and replaces by question marks.} + +\narrowthing{Line Lengths:}{The third check +the scanner makes is input line length.\xx{line}{length} +When FunnelWeb starts up, a default maximum +input line length of 80 is set. This can be changed dynamically during scanning +using a \p{@p maximum\_input\_line\_length} pragma. +If the number of characters on a line (not including the end of line marker) +exceeds this limit, FunnelWeb generates an error.\checked{}} + +\subsection{Special Sequences} +\xx{special}{sequences} + +The scanner scans the input file from top to bottom, left to right, treating +the input as ordinary text (to be handed directly to the parser as a text +token) unless it encounters the \newterm{special character}\footnote{This sort +of character is often referred to as the \dq{escape character} or the +\dq{control character} in other +systems. However, as there is great potential to confuse these names +with the \dq{escape} character (ASCII 27) and ASCII \dq{control} characters, +the term \dq{special} has been chosen instead. This results in the terms +\i{special character} and \i{special sequence}.} which introduces +a \newterm{special sequence}. Thus, the +scanner partitions the input file into ordinary text and special sequences. + +\begin{verbatim} +input_file = {ordinary_text | special_sequence} +\end{verbatim} + +Upon startup, the special character\xx{default}{special character} +is \p{@}, but it can +be changed using the $<$special$>$\p{=}$<$new\_special$>$ special sequence. +Rather than using $<$special$>$ whenever the special character appears, +this document uses the default special character \dqp{@} to represent the +current special character. +More importantly, FunnelWeb's +error messages all use the default special character in their error messages +even if the special character has been changed. + +An occurrence of the special character in the input file introduces a +special sequence. The kind of special sequence is determined by the +character following the special character. Only printable characters can +follow the special character. + +The following list gives all the possible characters that can follow the +special character, and the legality of each sequence. +The first column gives the ASCII number of each ASCII character. The second +column gives the special sequence for that character. The next column contains +one of three characters: \dqp{-} means that the sequence is illegal. \dqp{S} +indicates that the sequence is a \newterm{simple sequence} (with no attributes +or side effects) that appears exactly as shown and is +converted directly into a token and fed to the parser. Finally, \dqp{C} +indicates that the special sequence is complex, possibly having a following +syntax or producing funny side effects. + +\begin{verbatim} +ASC SEQ COMMENT +----------------- +000 \ +016 | Unprintable characters and hence illegal specials. +031 / +032 @ - Illegal (space). +033 @! C Comment. +034 @" S Parameter delimeter. +035 @# C Short name sequence. +036 @$ S Start of macro definition. +037 @% - Illegal. +038 @& - Illegal. +039 @' - Illegal. +040 @( S Open parameter list. +041 @) S Close parameter list. +042 @* - Illegal. +043 @+ C Insert newline. +044 @, S Parameter separator. +045 @- C Suppress end of line marker. +046 @. - Illegal. +047 @/ S Open or close emphasised text. +048 @0 - Illegal. +049 @1 S Formal parameter 1. +050 @2 S Formal parameter 2. +051 @3 S Formal parameter 3. +052 @4 S Formal parameter 4. +053 @5 S Formal parameter 5. +054 @6 S Formal parameter 6. +055 @7 S Formal parameter 7. +056 @8 S Formal parameter 8. +057 @9 S Formal parameter 9. +058 @: - Illegal. +059 @; - Illegal. +060 @< S Open macro name. +061 @= C Set special character. +062 @> S Close macro name. +063 @? - Illegal. Reserved for future use. +064 @@ C Insert special character into text. +065 @A S New section (level 1). +066 @B S New section (level 2). +067 @C S New section (level 3). +068 @D S New section (level 4). +069 @E S New section (level 5). +070 @F - Illegal. +071 @G - Illegal. +072 @H - Illegal. +073 @I C Include file. +074 @J - Illegal. +075 @K - Illegal. +076 @L - Illegal. +077 @M S Tag macro as being allowed to be called many times. +078 @N - Illegal. +079 @O S New macro attached to product file. Has to be at start of line. +080 @P C Pragma. +081 @Q - Illegal. +082 @R - Illegal. +083 @S - Illegal. +084 @T C Typesetter directive. +085 @U - Illegal. +086 @V - Illegal. +087 @W - Illegal. +088 @X - Illegal. +089 @Y - Illegal. +090 @Z S Tags macro as being allowed to be called zero times. +091 @[ - Illegal. Reserved for future use. +092 @\ - Illegal. +093 @] - Illegal. Reserved for future use. +094 @^ C Insert control character into text +095 @_ - Illegal. +096 @` - Illegal. +097 @a \ +109 @m | Identical to @A..@Z. +122 @z / +123 @{ S Open macro body/Open literal directive. +124 @| - Illegal. +125 @} S Close macro body/Close literal directive. +126 @~ - Illegal. +127 to 255 are not standard printable ASCII characters and are illegal. +\end{verbatim} + +The most important thing to remember about the scanner is that \i{nothing +happens unless the special character is seen.} There are no funny sequences +that will cause strange things to happen. The best way to view a FunnelWeb +document at the scanner level is as a body of text punctuated by special +sequences that serve to structure the text at a higher level. + +The remaining description of the scanner consists of a detailed description +of the effect of each complex special sequence. + +\subsection{Setting the Special Character} +\xx{setting}{special character} + +The special character can be set using the sequence +$<$special$>$\p{=}$<$newspecialchar$>$. For example, \p{@=\#} would change the +special character to a hash (\p{\#}) character. The special character may +be set to any printable ASCII character except the blank character +(\ie{}any character in the ASCII range $[33,126]$). In normal use, it +should not be necessary to change the special character of FunnelWeb, and it +is probably best to avoid changing the special character so as not to +confuse FunnelWeb readers conditioned to the \p{@} character. +However, the feature is very useful where the text being prepared contains +many \p{@} characters (\eg{}a list of internet electronic mail addresses). + +\subsection{Inserting the Special Character into the Text} +\xx{special character}{inserting into text} + +The special sequence $<$special$>$\p{@} inserts the special character +into the text as if it were not special at all. The \p{@} of this +sequence has nothing to do with the current special character. If the +current special character is \p{P} then the sequence \p{P@} will insert +a \p{P} into the text. Example: \p{@@\#@=\#@\#@\#=@@@} translates +to \p{@\#@\#@}. + +\subsection{Inserting Arbitrary Characters into the Text} +\xx{arbitrary characters}{inserting into text} +\xx{control characters}{inserting into text}\x{@circumflex} + +While FunnelWeb does not tolerate unprintable characters in the input file +(except for the end of line character), +it does allow the user to specify that unprintable characters appear in the +product file. The \p{@\circumflex{}} sequence inserts a single character +of the user's choosing into the text. +The character can be specified by giving its +ASCII number in one of four bases: +binary, octal, decimal, and hexadecimal. Here is the syntax: + +\begin{verbatim} +control_sequence = "@^" char_spec +char_spec = binary | octal | decimal | hexadecimal +binary = ("b" | "B") "(" {binary_digit}8 ")" +octal = ("o" | "O" | "q" | "Q") "(" {octal_digit}3 ")" +decimal = ("d" | "D") "(" {decimal_digit}3 ")" +hexadecimal = ("h" | "H" | "x" | "X") "(" {hex_digit}2 ")" +binary_digit = "0" | "1" +octal_digit = binary_digit | "2" | "3" | "4" | "5" | "6" | "7" +decimal_digit = octal_digit | "8" | "9" +hex_digit = decimal_digit | "A" | "B" | "C" | "D" | "E" | "F" + | "a" | "b" | "c" | "d" | "e" | "f" +\end{verbatim} + +Example: + +\begin{verbatim} +@! Unix Make requires that productions commence with tab characters. +@^D(009)prog.o <- prog.c +\end{verbatim} + +Note that the decimal \dqp{9} is expressed with leading zeros +as \dqp{009}. FunnelWeb requires +a fixed number of digits for each base. Eight digits for base two, three +digits for base ten, three digits for base eight and two digits for base +sixteen. + +FunnelWeb treats the character resulting from a +\p{@\circumflex{}} sequence as ordinary text in every sense. +If your input file contains many instances of a particular control +character, +you can package it up in a macro like any other text. In particular, +quick names can be used to great effect: + +\begin{verbatim} +@! Unix "Make" requires that productions commence with tab characters. +@! So we define a macro with a quick name as a tab character. +$@#T@{@^D(009)@} +@! And use it in our productions. +@#Tprog.o <- prog.c +@#Ta.out <- prog.o +\end{verbatim} + +Warning: If you insert a Unix\x{Unix newline} +newline character (decimal 10) into the text, +FunnelWeb will treat this as an end of line sequence regardless of what +the character sequence for end of line is on the machine upon which it is +running. Unix EOL is FunnelWeb's internal representation for end of line. +Thus, in the current version of FunnelWeb, inserting character 10 into the +text is impossible unless this also happens to be +the character used by the operating system to mark the end of line. + +\subsection{Comments} +\xx{comments}{FunnelWeb} + +When FunnelWeb encounters the \p{@!}\x{@!} +sequence during its left-to-right scan +of the line, it throws away the rest of the line (including the EOL) +without analysing it further. +Comments can appear in any line except \dqp{@i}, +\dqp{@t}, and \dqp{@p} lines. + +FunnelWeb comments can be used to insert +comments into your input file that will +neither appear in the product files nor in the documentation file, +but will be +solely for the benefit of those reading and editing the input +file directly. Example: + +\begin{verbatim} +@! I have used a quick macro for this definition as it will be used often. +@$@#C@{--@} +\end{verbatim} + +Because comments are defined to include the end-of-line marker, +care must be taken when they are being added or removed within the text +of macro bodies. For example +the text fragment + +\begin{verbatim} +for (i=0;i<MAXVAL;i++) @! Print out a[0..MAXVAL-1]. + printf("%u\n",a[i]); +\end{verbatim} + +will expand to + +\begin{verbatim} +for (i=0;i<MAXVAL;i++) printf("%u\n",a[i]); +\end{verbatim} + +This problem really has no solution; if FunnelWeb comments were defined to +omit the end of line marker, the expanded text would contain trailing blanks! +As it is, FunnelWeb comments are designed to support single line comments +which can be inserted and removed as a line without causing trouble. +For example: + +\begin{verbatim} +@! Print out a[0..MAXVAL-1]. +for (i=0;i<MAXVAL;i++) + printf("%u\n",a[i]); +\end{verbatim} + +If you want a comment construct that does not enclose the end of line +marker, combine the insert end of line construct \p{@+} with the comment +construct \p{@!} as in + +\begin{verbatim} +for (i=0;i<MAXVAL;i++) @+@! Print out a[0..MAXVAL-1]. + printf("%u\n",a[i]); +\end{verbatim} + +FunnelWeb comments should really only be used to comment the FunnelWeb +constructs being used in the input file. Comments on the target code are +best placed in comments in the target language or in the documenting text +surrounding the macro definitions. In the example above, a C +comment would have been more appropriate. + +\subsection{Quick Names} +\xx{quick}{names} + +FunnelWeb provides a \newterm{quick name} syntax as an alternative, +for macros whose name consists of a single character, to the +angle bracket syntax usually used (\eg{}\p{@<Sloth@>}). +A quick name sequence consists of \p{@\#}$x$\x{@hash} +where $x$, the name of the macro, +can be any printable character except space. + +\begin{verbatim} +quick_name = "@#" non_space_printable +\end{verbatim} + +The result is identical to the +equivalent ordinary name syntax, but is +shorter. For example, \p{@\#X} is equivalent to \p{@<X@>}. +This shorter way of writing one-character macro names is more convenient where +a macro must be used very often. For example, the macro calls in the +following fragment of an Ada program are a little clumsy. + +\begin{verbatim} +@! Define @<D@> as "" to turn on debug code and "--" to turn it off. +@$@<D@>@{--@} +@<D@>assert(b>3); +@<D@>if x>7 then write("error") end if +\end{verbatim} + +The calls can be shortened using the alternative syntax. + +\begin{verbatim} +@! Define @#| as "" to turn on debug code and "--" to turn it off. +@$@#|@{--@} +@#|assert(b>3); +@#|if x>7 then write("error") end if +\end{verbatim} + +\subsection{Inserting End of Line Markers} +\xx{EOL markers}{inserting} + +An end of line marker/character can be inserted into the text +using the \p{@+}\x{@+} sequence. This is +exactly equivalent to a real end of line in the text at the point where +it occurs. +While this feature may sound rather useless, +it is very useful for laying out the input file. For +example, the following input data for a database program + +\begin{verbatim} +Animal = Kangaroo +Size = Medium +Speed = Fast + +Animal = Sloth +Size = Medium +Speed = Slow + +Animal = Walrus +Size = Big +Speed = Medium +\end{verbatim} + +can be converted into + +\begin{verbatim} +Animal = Kangaroo @+Size = Medium @+Speed = Fast @+ +Animal = Sloth @+Size = Medium @+Speed = Slow @+ +Animal = Walrus @+Size = Big @+Speed = Medium @+ +\end{verbatim} + +which is easier to read, and more easily allows comparisons between +records. + +\subsection{Suppressing End of Line Markers} +\xx{EOL markers}{suppressing} + +End of line markers can be suppressed by the \p{@-}\x{@-} +sequence. +A single occurrence of a \p{@-} sequence serves to suppress only the end of line +marker following it and must appear \i{exactly} before the end of line marker to +be suppressed. No trailing spaces, \p{@!} comments, or any other characters +are permitted between a \p{@-} sequence and the end of line that it is +supposed to suppress. The \p{@-} sequence is useful for constructing +long output lines without them having to appear in the input. +It can also be used in the same way as the \p{@+} +was used in the previous section to assist in exposing the structure of output +text without affecting the output text itself. Finally, it is invaluable for +suppressing the EOL after the opening macro text \p{@\{} construct. +For example: + +\begin{verbatim} +@$@<Walrus@>@{@- +I am the walrus!@} +\end{verbatim} + +is equivalent to + +\begin{verbatim} +@$@<Walrus@>@{I am the walrus!@} +\end{verbatim} + +The comment construct (\p{@!}) can also be used to suppress end of lines. +However, the \p{@-} construct should be preferred for this purpose as it +makes explicit the programmer's intent to suppress the end of line. + +\subsection{Include Files} +\xx{include}{files} + +FunnelWeb provides an include file facility with a maximum depth of 10. +When FunnelWeb sees a line of the form \p{@i <filename>},\x{@i} +it replaces the entire line (including the EOL) with the +contents of the specified include file. FunnelWeb's include file +facility is intended to operate at the line level. If the last line of the +include file is not terminated by an EOL, FunnelWeb issues a warning +and interts one (in the copy in memory). + +The +\p{@i} construct is illegal if it appears anywhere except +at the start of a line. +The construct must be followed by a single blank. The file +name is defined to be everything +between the blank and the end of the line (no +comments (\p{@!}) please!). Example: If the input file is + +\begin{verbatim} +"Uh Oh, It's the Fuzz. We're busted!" said Baby Bear. +@i mr_plod.txt +"Quick! Flush the stash down the dunny and let's split." said Father Bear. +\end{verbatim} + +and there is a file called \p{mr\_plod.txt} containing + +\begin{verbatim} +"'Ello, 'Ello, 'Ello! What's all this 'ere then?" Mr Plod exclaimed. +\end{verbatim} + +then the scanner translates the input file into + +\begin{verbatim} +"Uh Oh, It's the Fuzz. We're busted!" said Baby Bear. +"'Ello, 'Ello, 'Ello! What's all this 'ere then?" Mr Plod exclaimed. +"Quick! Flush the stash down the dunny and let's split." said Father Bear. +\end{verbatim} + +As a point of terminology, FunnelWeb calls the original input file the +\newterm{input file} and calls include files and their included files +\newterm{include files}. + +The include file construct operates at a very low level. An include +line can appear anywhere in the input file regardless of the context +of the surrounding lines. + +FunnelWeb sets the special character to the default (\p{@}) at the +start of each include file and restores it to its previous value at the end +of the include file. This allows macro libraries to be constructed and +included that are independent of the prevailing special character +at the point of inclusion. +The same goes for the input line length limit +which is reset to the default +value at the start of each include file and +restored to its previous value afterwards. + +\subsection{Pragmas} +\x{pragmas}\xx{pragmas}{visible}\xx{pragmas}{invisible} + +Most tools have to support some essential, but rather inelegant features. +In FunnelWeb these messy bits have all been stuffed into the +scanner's \newterm{pragma} (for \i{pragma}tic) construct. + +A pragma consists of a single line of input (including the EOL) +commencing with \p{@p}. This +must be followed by a single space, and then the pragma verb. +This must +be followed by a sequence of zero or more arguments separated by one or +more spaces. Four pragmas are available + +\begin{verbatim} +pragma = pragma_ident | pragma_mill | pragma_moll | pragma_typesetter +\end{verbatim} +The following syntax definitions assist in defining the pragmas. + +\begin{verbatim} +s = {" "}+ +ps = ("@p" | "@P") " " +number = { decimal_digit }+ +numorinf = number | "infinity" +\end{verbatim} + +The arguments to pragmas are case-sensitive and must be specified in +lower case. + +Pragmas are processed and consumed entirely by the scanner. The parser +never sees them and so they can play +no part in the parser level syntax. As a result, pragma lines +can appear anywhere in the entire input file regardless of the surrounding +context (\eg{}even in the middle of a macro definition). +The sole effect of a pragma is to modify some internal parameter of +FunnelWeb. + +The following sections describe the four FunnelWeb pragmas. + +\subsubsection{Indentation} +\label{indentationpragma}\xx{indentation}{macro expansion} + +When FunnelWeb expands a macro, it can do so in two ways. First it can treat +the text it is processing as a one-dimensional stream of text, and merely +insert the body of the macro in place of the macro call. Second, it can +treat the text of the macro as a two dimensional object and +indent each line of the macro body by the amount that the macro +call itself was indented. Consider the following macros. + +\begin{verbatim} +@$@<Loop Structure@>@{@- +i=1; +while (i<=N) + @<Loop body@> +endwhile +@} + +@$@<Loop body@>@{@- +a[i]:=0; +i:=i+1;@} +\end{verbatim} + +Under the regime of \newterm{no indentation}\xx{indentation}{none} +the loop structure +macro expands to: + +\begin{verbatim} +i=1; +while (i<=N) + a[i]:=0; +i:=i+1; +endwhile +\end{verbatim} + +Under the regime of \newterm{blank indentation}\xx{indentation}{blank} +the loop structure macro expands to: + +\begin{verbatim} +i=1; +while (i<=N) + a[i]:=0; + i:=i+1; +endwhile +\end{verbatim} + +The \p{indentation} pragma determines which of these two regimes will be used +to expand the macros when constructing the product files. The syntax of the +pragma is: + +\begin{verbatim} +pragma_ident = ps "indentation" s "=" s ("blank" | "none") +\end{verbatim} + +Its two forms look like this: + +\begin{verbatim} +@p indentation = blank +@p indentation = none +\end{verbatim} + +In the current version of FunnelWeb, the indentation regime is an attribute +that is attached to an entire run of Tangle; it is not possible to bind it +to particular product files or to particular macros. As a result, it doesn't +matter where indentation pragmas occur in the input file or how many +there are so long as they are all the same. By default FunnelWeb uses +blank indentation. + +\subsubsection{Maximum Input Line Length} +\label{millpragma}\xx{input}{line length}\xx{maximum}{input line length} + +FunnelWeb generates an error for each input line +that exceeds a certain maximum number of characters. At the start of the +processing of each input +file and each include file, this maximum is set to a default value of 80. +However, +the maximum can be changed using a maximum input line length +pragma.\xx{pragma}{input line length} + +\begin{verbatim} +pragma_mill = ps "maximum_input_line_length" s "=" s numorinf +\end{verbatim} + +The maximum input line length can be varied +\i{dynamically} throughout the input file. Each maximum input line length +pragma's scope covers the line following the pragma through to and including +the next maximum input line length pragma, but not covering any intervening +include files. At the start of an include file, FunnelWeb resets +the maximum input line length to the default value. It restores it to +its previous value at the end of the include file. + +This pragma is useful for detecting text that has strayed off the +right side of the screen when editing. If you use FunnelWeb, and set the +maximum input line length to be the width of your editing window, you will +never be caught by, for example, off-screen opening comment symbols. +You can also be sure that your source text can be printed raw, if necessary, +without lines wrapping around. + +\subsubsection{Maximum Output File Line Length} +\label{mollpragma}% +\xx{maximum}{product file line length}% +\xx{pragma}{maximum product file line length}% +\xx{maximum}{output file line length}% +\xx{pragma}{maximum output file line length} + +As well as keeping an eye on input line lengths, FunnelWeb also keeps an +eye on the line lengths of product files and flags all lines longer +than a certain limit with error messages. +Unlike the +maximum input line length, which can vary dynamically throughout the input +file, the maximum product file line length remains fixed throughout the +generation +of all the product files. The maximum product file +line length pragma allows this +value to be set. If there is more than one such pragma in an input file, the +pragmas must all specify the same value. + +\begin{verbatim} +pragma_moll = ps "maximum_output_line_length" s "=" s numorinf +\end{verbatim} + +The default value is 80 characters. + +This pragma is only one of two constraints on the length of the lines of the +product files. The \p{+W} command line option also contributes. +The actual value that FunnelWeb uses is the minimum of the limits +specified in the command line and pragmas. + +FunnelWeb does not monitor the length of the lines of its other output files +(journal file, listing file, documentation file). + +\subsubsection{Typesetter} +\xx{typesetter}{pragma}\xx{typesetter}{independence} + +The \p{typesetter} pragma allows the user to specify whether the input +file is supposed to be typesetter-independent, or whether it contains +commands in a particular typesetter language. The pragma has the +following syntax. + +\begin{verbatim} +pragma_typesetter = ps "typesetter" s "=" s ("none" | "tex") +\end{verbatim} + +The two forms of the pragma look like this. + +\begin{verbatim} +@ typesetter = none +@ typesetter = tex +\end{verbatim} + +A source file can contain more than one typesetter pragma, but they must +all specify the same value. The default is \p{none}. +The typesetter setting affects two things: + +\narrowthing{Handling of free text:}{If the typesetter is not \p{none}, +Weave writes the free text \i{directly} +to the documentation file without changing it whatsoever. This means that +if (say) \p{\char`\\ centerline} appears in the input file, it will copied +directly to the documentation file. If the typesetter is \p{none}, Weave +intercepts any characters or sequences that might have a special +meaning to the target typesetter and replaces them +with typesetter commands to typeset the sequences so that they will appear +as they do in the input. For example, if the typesetter is \p{none} and +the target typesetter is \TeX{}, then if +\p{\$} (the \TeX{} \dq{mathematics mode} character) +appears in the input file, it will be +be written to the documentation file as \p{\char`\\ \$}.} + +\narrowthing{Restrictions on the target typesetter:}{At a later date, +different weave modules might be incorporated into FunnelWeb to cater +for a variety +of different typesetters. If this happens, it will be important to ensure +that typesetter-specific source files +(\ie{}\p{typesetter} $\ne$ \p{none}) are not processed with different +target typesetters. For example, a user might innocently attempt to generate +a \p{troff} documentation file from a +FunnelWeb source file containing a \p{typesetter = tex} (and by +implication \TeX{} control sequences). The pragma could also be useful +for catching typesetter clashes in source and include files. The setting +\p{none} is special because it is guaranteed to work with any +future target typesetter.} + +The aim of all this is +to ensure that any typesetter dependency is correctly proclaimed. +Because \p{none} is the default typesetter, +a user who creates a source file without a \p{typesetter = x} pragma +will soon find that the control sequences they are inserting into +the source document are appearing verbatim in the printed documentation! +In order to activate these sequences, they will be forced to add a +\p{typesetter} pragma, thus making the dependency explicit. + +It may seem strange to place the \p{typesetter} setting facility within +a pragma (\p{@p}) when there is a separate typesetting construct (\p{@t}). +This has been done to sustain the rule of thumb that says that +pragmas do not participate in the parser-level syntax, but typesetter +directives do. + +\subsection{Freestanding Typesetter Directives} +\xx{typesetter}{directives} + +FunnelWeb provides two kinds of typesetter directive to assist the user +to produce documentation. These are \newterm{inline} and +\newterm{freestanding}. Unlike pragmas, +each of these categories of directive participates in the parser-level +syntax and can appear only in certain contexts (see the parser section). +Inline directives are +designed to be used within paragraphs to alter the look of the enclosed +text. Freestanding typesetter directives are designed to +appear on lines of their own and have a bigger typographical impact. + +The syntax of freestanding typesetter directives is almost identical to that +of pragmas. All the same syntax rules apply (except that the actual +keywords are different). +The following subsections describe the four typesetter directives +available. + +\begin{verbatim} +ftd = ftd_newpage | ftd_toc | ftd_vskip | ftd_title +ts = "@t " +\end{verbatim} + +\subsubsection{New Page} +\x{new page}\xx{pragma}{new page} + +The new page pragma is a typesetting pragma with the following syntax. + +\begin{verbatim} +ftd_newpage = ts "new_page" +\end{verbatim} + +It only form looks like this. + +\begin{verbatim} +@t new_page +\end{verbatim} + +Its sole effect is to cause a \dq{skip to a new page} command to be inserted +into the documentation file. +The new page command is such that if the typesetter is already at +the top of a page, it will skip to the top of the next page. + +\subsubsection{Table of Contents} +\xx{table of}{contents}\xx{pragma}{table of contents} + +The new page pragma is a typesetting pragma with the following syntax. + +\begin{verbatim} +ftd_toc = ts "table_of_contents" +\end{verbatim} + +It only form looks like this. + +\begin{verbatim} +@t table_of_contents +\end{verbatim} + +Its sole effect is to instruct Weave to insert a table of contents at +this point in the printed documentation. +This pragma does not skip to a top of a new page first. + +\subsubsection{Vertical Skip} +\xx{vertical}{skip}\xx{pragma}{vskip} + +The vertical skip pragma is a typesetting pragma that +instructs Weave to insert a specified amount of +vertical space into the documentation. The pragma has the following syntax. + +\begin{verbatim} +ftd_vskip = ts "vskip" s number s "mm" +\end{verbatim} + +For example: + +\begin{verbatim} +@t vskip 26 mm +\end{verbatim} + +\subsubsection{Title} +\x{title}\xx{pragma}{title} + +The title pragma is a typesetting pragma with the following syntax. + +\begin{verbatim} +ftd_title = ts "title" s font s alignment text +font = "normalfont" | "titlefont" | "smalltitlefont" +alignment = "left" | "centre" | "right" +text = """" {printable_char} """" +\end{verbatim} + +It's effect is to instruct Weave to insert a single line +into the printed documentation +containing the specified text set in the specified font +and aligned in the specified manner. The double quotes delimiting +the text are for show only; if you want to put a double quote in the string, +you don't need to double them. + +Here is an example of the pragma. + +\begin{verbatim} +@t title smalltitlefont centre "How to Flip a Bit" +\end{verbatim} + +\subsection{Scanner/Parser Interface} + +If the scanner terminates without any errors, control +is passed to the parser. The parser parses the token list generated by +the scanner. The token list consists of text scraps, freestanding +typesetter directives, +and special sequence tokens. + +The user should bear in mind that +\i{the scanner finishes running before the +parser starts running.} This means that the scanner cannot be influenced +in any way by higher order structures such as the parser might parse. +For example, +it is impossible to write a FunnelWeb macro to include a file, or insert +a \p{vskip} pragma into the input text. + +\section{Parser} +\x{parser} + +By the time the parser starts, the scanner has completely terminated. +At this point, it +is not possible for any more files to be included, and special characters are +no longer present to confuse things. All that remains is a list of +\newterm{text tokens}, +\newterm{special tokens}, and \newterm{typesetter directive tokens}. +Text tokens consist entirely of +sequences of printable characters and end of line markers. Special tokens +represent the special sequences that the scanner found in the input file. +Typesetter directive tokens represent the freestanding typesetter directives +that the scanner encountered. +The parser consumes the token list and builds a macro table that is +later used to generate product files. It also constructs +a document list that is used to generate the documentation file. + +The syntax rules appearing in the following sections refer to the +token list. + +\subsection{High Level Structure} +\xx{syntax}{high level} + +At the highest level, the FunnelWeb parser parses the input file (token +list) into a sequence of text scraps, macro definitions, +and typesetter directives. + +\begin{verbatim} +input_file = {text | macro | directive} +\end{verbatim} + +All three of these kinds of components contribute to the documentation file, +but only macro definitions +contribute to the product files. If all the free text +and directives were removed from a FunnelWeb input file, the +product files would not be affected. + +\subsection{Free Text} +\xx{free}{text} + +\newterm{Free text} is any text that is not part of a macro definition or a +directive. A scrap of free text consists of a sequence of items drawn +from the following list: +non-special printable characters, insert-eol special +sequences, insert special character special sequences, insert arbitrary +character special sequence. + +\begin{verbatim} +free_text = ordinary_text +ordinary_text = {ordinary_char | eol | text_special}+ +text_special = "@+" | "@@" | "@^" char_spec +ordinary_char = " ".."~"-special +\end{verbatim} + +An example of some rather messy free text is as follows: + +\begin{verbatim} +This@@ is a very@+ messy +@^D(009)chunk of text indeed. +But FunnelWeb still views it as +a single chunk of text. +\end{verbatim} + +FunnelWeb never sees two text chunks next to each other in the input; +they are always merged into a single text token. + +The free text in an input file +does not affect the product files. However, by default, it appears in the +printed documentation exactly as it is given in the input file, except +that it is filled and justified into paragraphs. + +Any printable character +or particular sequence of characters +may appear in the free text of a document. FunnelWeb ensures that they +will appear exactly as given in the input file, even if they happen to be +escape characters or commands in the target typesetter. +However, FunnelWeb also provides a special mode that allows +this censoring to be +overridden. See Section~\label{typesetterpragma} for more information. + +\subsection{Typesetter Directives} +\x{directives} + +FunnelWeb provides a variety of typesetter directives to assist the +user to typeset the document in a typesetter-independent way. These are +divided into \newterm{freestanding typesetter directives} (ftd) and +\newterm{inline typesetter directives} (itd). The internal syntax of the +freestanding typesetter directives has already been discussed +in the scanner section. The following syntax rule defines +the context in which these constructs can appear. + +\begin{verbatim} +directive = ftd | itd +itd = section | literal | emphasis +\end{verbatim} + +The remainder of this section describes the inline typesetter directives. + +\subsubsection{Section} +\xx{section}{constructs} + +The section directive +provides a way for the user to structure the program and documentation into +a hierarchical tree structure,\xx{tree}{structure} +just as in most large documents. +A section construct consists of a case-insensitive +identifying letter, which determines the +absolute level of the section in the document, and an optional section +name, which has exactly the same syntax as a macro name. + +\begin{verbatim} +section = "@" levelchar [name] +levelchar = "A" | "B" | "C" | "D" | "E" | + "a" | "b" | "c" | "d" | "e" +\end{verbatim} + +The section construct is not quite \dq{inline} as it must appear only +at the start of a line. However, unlike the \dqp{@i}, \dqp{@p}, and +\dqp{@t} constructs, it does not consume the remainder of the line +(although it would be silly to place anything on the same line anyway). + +FunnelWeb provides five levels of sections, ranging from the highest level +of \p{A} (like a \LaTeX{}\x{LaTeX} +chapter) to the lowest level of \p{E} (like a \LaTeX{} +subsubsubsection). FunnelWeb input files need not contain +any sections at all, but if they do, the first section must be at level \p{A}, +and following sections must not skip hierarchical levels (\eg{}an \p{@D} cannot +follow an \p{@C}). FunnelWeb generates an error if a level is skipped. + +All section \i{must} have names associated with them, but for convenience, +the section name is optional if the section contains one or more +macro definitions +(\ie{}at least one macro definition appears between the section construct +in question and the +next section construct in the input file.). In this case, the section +\i{inherits} the name of the first macro defined in the section. This +feature streamlines the input file, avoiding duplicate name inconsistencies. + +Any sequence of printable characters can be used in the +section name,\xx{section}{name} +even the target typesetter's escape sequence (\eg{}in \TeX{}, +\dqp{\bs{}}). + +The following example demonstrates the section construct. + +\begin{verbatim} +@A@<Life Simulation@> + +This is the main simulation module for planet earth, simulated down to the +molecular level. This is a REALLY big program. I mean really big. I mean, +if you thought the X-Windows source code was big, you're in for a shock... + +@B We start by looking at the code for six legged stick insects as they +form a good example of a typical object-oriented animal implementation. + +@$@<Six Legged Stick Insects@>@{@- +slsi.creep; slsi.crawl; slsi.creep;@} +\end{verbatim} + +In the above example, the name for the level A section is provided +explicitly, while the name for the level B section will be inherited from the +macro name. + +\subsubsection{Literal Directive} +\xx{literal}{directive} + +Experience has shown that one of the most common typesetting requirement +is that of being able to typeset small program fragments +in the middle of the documenting free text. Typically +there is a frequent need to refer to program identifiers, and it +assists the reader to have such identifiers typeset in the same manner +as the program text in the macro definition. +FunnelWeb~V1 +defined a \TeX{} macro for this (called \p{p}) that simply typeset its +argument in \p{tt font}. This proved so +useful, that the facility has been made typesetter-independent in +FunnelWeb~V3. + +To specify that some text be typeset in \p{tt font}, +enclose the text in curly brace special sequences as follows. + +\begin{verbatim} +literal = "@{" ordinary_text "@}" +\end{verbatim} + +As in macro names, section names, and macro bodies, the text contained +within the literal +construct is protected by FunnelWeb from any non-literal interpretation by +the typesetter and the user is +free to enclose \i{any} text covered by the definition \p{ordinary\_text}. +FunnelWeb guarantees that, no matter what the text is, it will +be typeset in \p{tt font} exactly as it appears. However, the text will be +filled and justified into a paragraph as usual. + +Here is an example of the use of the construct: + +\begin{verbatim} +@C The @{WOMBAT@} (Waste Of Money, Brains, And Time) function +calls the @{kangaroo@} input function which has been +known to cause keybounce. +This keybounce can be dampened using the @{wet_sloth@} subsystem. +\end{verbatim} + +\subsubsection{Emphasis Directive} +\xx{emphasis}{directive} + +The emphasis directive is very similar to the literal directive except that +it causes its argument to be typeset in an emphasised manner +(\eg{}italics). Like the literal directive, +the emphasis directive protects its text argument. + +\begin{verbatim} +emphasise = "@/" ordinary_text "@/" +\end{verbatim} + +Example: + +\begin{verbatim} +@C What you @/really@/ need, of course, is a @/great@/, @/big@/, +network with packets just flying @/everywhere@/. +This section implements an interface +to such a @/humungeous@/ network. +\end{verbatim} + +\subsection{Macros} +\xx{macro}{definition} + +The third category of +construct appearing at the highest syntactic level in a FunnelWeb +input file is the macro definition. +A macro definition binds a unique +\newterm{macro name} to a \newterm{macro body} containing an +\newterm{expression} consisting of text, calls to +other macros, and formal parameters. The syntax for a macro definition is as +follows: + +\begin{verbatim} +macro = ("@O" | "@$") name [formal_parameter_list] + ["@Z"] ["@M"] ["==" | "+="] "@{" expression "@}" +\end{verbatim} + +The complexity of the macro definition syntax is mostly to enable the user +to attach various attributes to the macro.\xx{macro}{attributes} +If the user chooses \p{@O}, +then the macro cannot be called, but is instead +attached to a product file. If the user chooses \p{@\$}, then the macro is +an ordinary macro definition that is not attached to a file. + +By default, a non-file macro must be invoked exactly once by one other +macro. Macros that +aren't are flagged with errors by the FunnelWeb analyser. However, if the +user uses the \p{@Z}\x{@Z} sequence in the macro definition, the macro is then +permitted to be invoked zero times, as well as once. Similarly, if the +user uses the \p{@M}\x{@M} +sequence in the macro definition, the macro is +permitted to be called many times as well as once. If both \p{@Z} and +\p{@M} are present then the macro is permitted to be invoked zero, one, +or many times. + +The purpose of enforcing the default \dq{exactly one call} rule is to +flag pieces of code that the user may have defined in a macro but not +hooked into the rest of the program. Experience shows that this is a +common error. Similarly, it can be dangerous to multiply invoke a +macro intended to be invoked only once. For example, it may be dangerous +to invoke a scrap of non-idempotent initialization code in two different +parts of the main function of a program! However, FunnelWeb will not +generate an error if a macro without \p{@M} is called by another +macro that is called more than once. + +If the text string \p{==}\x{==} (or nothing) follows the macro name, +the expression that follows +is the entire text of the macro body. If the text string \p{+=}\x{+=} +follows +the macro name, then more than one such definition is allowed +(but not required) in the document +and the body of +the macro consists of the concatenation of all such expressions in the order +in which they occur in the input file. Such a macro is said to be +additive and is +\newterm{additively defined}. Thus a macro body can either be defined +in one place using one definition (using \p{==}) or it can be \i{distributed} +throughout the input file in a sequence of one or more macro definitions (using +\p{+=}). If neither \p{==} and \p{+=} are present, FunnelWeb assumes a +default of \p{==}. + +Macros attached to product files cannot be additively defined. +Additively defined macros can have parameter lists and \p{@Z} and \p{@M} +attributes, but these must be specified only in the first definition of the +macro. However, \p{+=} must appear in each definition. + +\subsubsection{Names} +\x{names}\xx{macro}{names}\xx{section}{names} + +Names are used to identify macros and sections. +A name consists of a sequence of from zero to 80 printable characters, +including the blank +character. End of line characters are not permitted in names. +Names are case sensitive; two different macros are permitted to have names +that differ in case only. Like free text, names are typeset by FunnelWeb and +are safe from misinterpretation by the target typesetter. For example, it +is quite acceptable to use the macro name \p{@<\bs{}medskip@>} +even if the target typesetter is \TeX{}. + +\begin{verbatim} +name = "@<" name_text "@>" +name_text = {ordinary_char | text_special} +\end{verbatim} + +\subsubsection{Formal Parameter Lists} +\xx{parameter lists}{formal} + +FunnelWeb allows macros to have up to nine macro parameters, named +\p{@1},\x{@1...} +\p{@2}, $\ldots$, \p{@9}. If a macro does not have a formal +parameter list, +it is defined to have no parameters, and an actual parameter list must not +appear at the point of call. If a macro has a formal parameter list, it +is defined to have one or more parameters, and a corresponding actual +parameter must be supplied for each formal parameter, at the point of call. + +Because FunnelWeb parameters have predictable names, the only information +that a formal parameter list need convey is \i{how many} parameters a macro +has. For this reason a formal parameter list takes the form of the highest +numbered formal parameter desired, enclosed in parentheses sequences. + +\begin{verbatim} +formal_parameter_list = "@(" formal_parameter "@)". +formal_parameter = "@1" | "@2" | "@3" | "@4" | "@5" | + "@6" | "@7" | "@8" | "@9" +\end{verbatim} + +\subsection{Expressions} +\xx{macro}{expressions} + +Expressions are FunnelWeb's most powerful form of expressing a text +string. +Macro bodies are defined as expressions. Actual parameters consist of +expressions. + +An expression consists of a sequence of zero or more expression elements. +An expression element can be ordinary text, a macro call, or a formal +parameter of the macro \i{definition} in which the formal parameter occurs. + +\begin{verbatim} +expression = {ordinary_text | macro_call | formal_parameter} +\end{verbatim} + +\subsection{Macro Calls} +\xx{macro}{calls} + +A macro call consists of a name optionally followed by an actual parameter +list. The +number of parameters in the actual parameter list must be the same as +the number of formal parameters specified in the definition of the +macro. If the macro has no formal parameter list, its call must have no +actual parameter list. + +\begin{verbatim} +macro_call = name [actual_parameter_list] +actual_parameter_list = "@(" actpar { "@," actpar } "@)" +actpar = expression | + ( whitespace "@""" expression "@""" whitespace ) +whitespace = {" " | eol} +\end{verbatim} + +FunnelWeb allows parameters to be passed directly, or delimited by +special double +quotes.\xx{macro parameter}{delimiting} +Each form is useful under different circumstances. Direct specification +is useful where the parameters are short and can be all placed on one line. +Double quoted parameters allow whitespace on either side +(that is not considered part of the parameter) and are useful for laying out +rather messy parameters. Here are examples of the two forms. + +\begin{verbatim} +@<Generic Loop@>@( + @"x:=1;@" @, + @"x<=10;@" @, + @"print "x=%u, x^2=%u",x,x*x; + x:=x+1;@+@" +@) + +@<Colours@>@(red@,green@,blue@,yellow@) +\end{verbatim} + +As shown, the two forms may be mixed within the same parameter list. + +Experience has shown that the vast majority of macros have no parameters. + +\subsection{Formal Parameters} +\xx{formal}{parameters} + +Formal parameters can appear in the expressions forming macro bodies +in accordance with the syntax rules defined above. A formal parameter +expands to the text of the expansion of its corresponding +actual parameter. There is nothing preventing a formal +parameter being provided as part of an expression that forms an actual +parameter. +In that happens, the formal parameter is bound to the actual parameter of the +calling macro, not the called macro. +After the following definitions, + +\begin{verbatim} +@$@<One@>@(@1@)=@{A walrus in @1 is a walrus in vain.@} +@$@<Two@>@(@1@)=@{@<One@>@(S@1n@)@} +\end{verbatim} + +the call + +\begin{verbatim} +@<Two@>@(pai@) +\end{verbatim} + +will result in the expansion + +\begin{verbatim} +A walrus in Spain is a walrus in vain. +\end{verbatim} + +\subsection{Macros are Static} +\xx{macro}{definition}\xx{macro}{expansion}\xx{macros}{static} + +In FunnelWeb, the actions of \i{macro definition} and \i{macro +expansion} occur during two separate phases (parser and tangle) +and cannot be interleaved. As a result, the FunnelWeb macro facility is +completely static. +It is not possible for one macro to +define another while the first macro is being +expanded; each must be defined statically. It is not possible to define a +macro to even assist in the definition of other macros. Because the scanner, +parser, analyser, and tangler phases are all invoked sequentially, there is +no room for feedback of definitions between different levels (\eg{}the user +cannot define a macro for the \p{vskip} pragma). + +This lack of power is fully intentional. By totally excluding the more +incomprehensible ways in which a general purpose macro preprocessor can be +used, FunnelWeb provides definite guarantees to the reader of its input files: + +\begin{itemize} +\item FunnelWeb guarantees that a piece of text does not contain a macro call +unless it contains the special character followed by \p{$<$} or \p{\#}. +\item FunnelWeb allows calls to be made to macros that are defined later +in the input file. +\end{itemize} + +\section{Analyser} +\x{analyser}\xx{checks}{macro} + +The effect of the parser is to construct a macro table containing a +representation of all the macros defined within the document, and a document +list which contains a complete representation of the entire document. +If there are no error diagnostics (or worse) at the end of the parser +run, FunnelWeb invokes the analyser which tests for the following conditions +and flags them with errors if they arise. + +\begin{itemize} +\item No macros defined in the input file. +\item No macros connected to output files. +\item Call of an undefined macro. +\item Call having the wrong number of parameters. +\item Call of a macro that is connected to an output file. +\item No calls made to a macro without the \p{@Z} option. +\item More than one call made to a macro without the \p{@M} option. +\item Directly or indirectly recursively defined macros. +\item Unnamed sections that contain no macro definitions. +\end{itemize} + +FunnelWeb performs a static analysis\xx{static}{analysis} to detect +recursion.\xx{macro}{recursion} +Unfortunately, the recursion detection algorithm +flags all macros that have an infinite expansion +rather than just all macros +with a recursive definition. If A calls B, and B calls +C, and C calls B, then FunnelWeb will flag A as well +as B and C. It is hoped that this problem will be fixed in a later version. + +Because FunnelWeb does not provide any kind of conditional feature, the +prevention of recursion does not represent a curtailment of expressive power. + +Macros may be invoked recursively, but may not be recursive. Thus: + +\begin{verbatim} +@<Sloth@>@(@<Sloth@>@(Walrus@)@) @! LEGAL recursive invocation. + +@$@<Teapot@>==@{@<Teapot@>@} @! ILLEGAL recursive definition. +\end{verbatim} + +\section{Tangle} +\x{tangle} + +If the scanner, parser, and analyser have successfully (\ie{}with no +errors, severe errors, or fatal errors) completed, and the Tangle option +(\p{+O}) is turned on (it is by default), then the Tangle component of +FunnelWeb is invoked to generate the product files specified in the \p{@O} +macros of the input file. + +The operation of Tangle is very simple. Each \p{@O} macro is expanded and +written to a file of the same name. As there are a finite number of macros, +and the analyser guarantees that the +macro structure is non-recursive, Tangle is guaranteed to terminate. + +Three remaining points are worth discussing. + +\begin{enumerate} + +\item Tangle expands macros using blank indentation unless the +user has specified otherwise in an indentation pragma in the +input file (see Section~\ref{indentationpragma}). + +\item Tangle keeps track of the +length of the lines that it is writing +and issues an error if any line of any product file that it generates is +longer than the maximum. The maximum is the minimum of a value defaulted +or specified in the input file (Section~\ref{mollpragma}), +and the value (if any) provided by the +\p{+w} command line argument (Section~\ref{commandlineoptions}). + +\item It is worth the user obtaining +some understanding of the resources +that FunnelWeb requires to perform its task. + +\end{enumerate} + +When FunnelWeb's scanner +executes, it reads each file into memory where it is kept for the duration +of the run. Thus, there must be room in memory for the entire +input file, including all include files. While this approach may seem +expensive in memory, it is almost necessary in order to support +forward references. To merely scan the input file, recording the macro +names, but leaving the text on disk, would require many random +access disk seeks. + +In contrast, FunnelWeb never builds an internal representation +of the product file. +Instead, each piece of output is written immediately to the +product file. This means that as long as the input file fits in memory, +the product file can be arbitrarily large. It also means that users need +not fear to define or call macros that they know will expand to megabytes +of text. Nor need they fear placing a call to such a macro as part of +an actual parameter. FunnelWeb does not ever expand actual parameters +internally. In fact, it does not expand them until it hits the corresponding +formal parameter during its expansion of the called macro. At that point, it +looks up the \i{expression} (not the expansion of the expression) for the +corresponding actual parameter, and starts expanding it. + +\section{Weave} +\x{weave}\x{typesetting} + +If the scanner, parser, and analyser have successfully (\ie{}with no +errors, severe errors, or fatal errors) completed, and the Weave option +(\p{+T}) is turned on (it is \i{off} by default), then the Weave component of +FunnelWeb is invoked to generate a text file in the format of a particular +typesetter. The result, when fed through the particular typesetter and printed, +is a fully typeset representation of the entire input file complete with +cross referencing information. + +\subsection{Target Typesetter} +\xx{target}{typesetter} + +Currently, FunnelWeb produces documentation files +in the format of only one typesetter --- +\TeX{}. However, the Weave package of FunnelWeb is fairly small, and it +is hoped that it can be rewritten so as to provide +a collection of typesetter modules from which +the user will be able to choose using a command line argument. + +\subsection{Cross Reference Numbering} +\xx{cross}{referencing}\xx{cross reference}{numbering} +\xx{section}{numbering} + +When FunnelWeb produces its typeset documentation, it \i{numbers} each +section and each macro definition and cross references the macro definitions. +The exact scheme used has been carefully thought out. However, as it can +be a little confusing to the beginner, it is explained here in full. + +The most important thing is that there is \i{no relation} between the +macro numbering and the section numbering. In Knuth's Web there are only +section numbers. In FunnelWeb, the numbering of sections and macros +is separated. + +In FunnelWeb, \i{sections} are numbered +hierarchically in ascending order. For example, the second level-C section +of the third level-B section of the first level-A section is +numbered \dq{1.3.2}. In contrast, \i{macro definitions} are numbered +sequentially in ascending order. For example, the first macro definition is +number 1, the second is number 2, and so on. Note that it is \i{macro +definitions} that are numbered, not \i{macros}. This distinction is necessary +because additive macros (\ie{}the ones with \p{+=}) +can be defined by a collection +of partial definitions scattered throughout the input file. A single additive +macro may be defined in definitions 5, 67, 128, and 153. + +\section{FunnelWeb Shell} +\label{commandshell}% +\xx{FunnelWeb}{command shell}\xx{commands}{FunnelWeb}\xx{FunnelWeb}{shell} + +\subsection{Introduction} + +One of the goals of FunnelWeb is +that it must be extremely portable. Huge efforts, desperate actions, +and great sacrifices were made in the name of portability. +For example, FunnelWeb is written in~C. + +An equally important goal was that of correctness and reliability. To this +end, it was determined that a large automated suite of test programs be +prepared to assist in regression testing. Preparing the test suite was +tedious, but achievable. Automating it portably was more difficult. + +The difficulty faced was that if FunnelWeb was implemented in the form of +a utility that could be +invoked from the operating system command language, the only way to set up +regression testing was in the command language of the operating system +of the target machine (shellscripts for UNIX, DCL for VMS, batch files +for MSDOS, and \i{nothing} on the Macintosh). The huge variation in these +command languages led to the conclusion that either the automation of +regression testing would have to be rewritten on each target machine, or +a small command language would have to be created within FunnelWeb. In the +end, the twin goals of portability and regression testing were considered so +important that a small command +shell was constructed inside FunnelWeb. This is called the +\newterm{FunnelWeb command shell}, or just \dq{the shell} for short. + +By default, when FunnelWeb is invoked, it does not enter its shell. If +just given the name of an input file, it will simple process the input file +in the normal manner and then terminate. To instruct FunnelWeb to +invoke its shell, the \p{+K} or \p{+X} command line option must be specified +when FunnelWeb is invoked from the operating system. It is also +invoked upon startup if the file \p{fwinit.fws} exists. + +Most FunnelWeb users will never need to use the shell and need not even +know about it. There are four main uses of the shell:\xx{uses}{shell} + +\begin{enumerate} + +\item As a tool to support automated regression testing. + +\item As a development tool on machines that do not have a built in shell +(\eg{}the Macintosh). The shell can be used to process whole groups of +files automatically. + +\item As a convenience. A user working on a multi-tasking, multi-window +workstation\x{workstation} +may wish to keep an interactive session of FunnelWeb going in +one window rather than having to run up the utility each time it is required. + +\item As a convenient +vehicle for enclosing utilities. The FunnelWeb shell contains +useful general purpose commands such as the +differences command \p{diff}. + +\end{enumerate} + +\subsection{Return Statuses} +\xx{errors}{shell}\xx{status}{success}% +\xx{status}{warning}\xx{status}{error}\xx{status}{severe}\xx{status}{fatal}% +\xx{status}{assertion} + +The hierarchy of diagnostics described in Section~\ref{diagnostics} +is also used in the +shell commands. Each shell command returns a status which can affect +further processing. + +\narrowthing{Success}{status is the normal command return status.} + +\narrowthing{Warning}{status is returned if some minor problem +arose with the execution of the command.} + +\narrowthing{Error}{status is returned if a significant problem +arises during the execution of the command. +However, unlike a severe error, +it does \i{not} cause termination of the enclosing shellscript.} + +\narrowthing{Severe error}{status is returned if a problem arises +during the execution of the command that prevents the command from +delivering on its \dq{promise}. A severe error causes FunnelWeb +to abort the script (and any stacked scripts) to the interactive level. +(However, the \p{tolerate} command allows this to be temporarily +overridden).} + +\narrowthing{Fatal error}{status is returned if a problem arises +that is so serious that execution of FunnelWeb cannot continue. +A fatal error causes FunnelWeb to abort to the operating system level.} + +\narrowthing{Assertion error}{status is never returned. If an assertion +error occurs, FunnelWeb bombs out ungracefully to the operating system. +Assertion errors should never happen. If they do, then there is a bug +in FunnelWeb.} + +To be precise, the status returned by each command +is a vector of numbers being the number of each of the different kinds of +diagnostic generated by the command. Usually only one kind +of diagnostic is generated. However, the \p{fw} command and a few of the other +commands can generate more than one kind of diagnostic. +These status vectors are summed internally where they may later be accessed +using the \p{status} command. However, the current diagnostic state +evaporates as soon as the next command is encountered. + +\subsection{Command Line Length} +\xx{command}{length} + +The maximum length of a shell command line is guaranteed to be +at least 300 characters. + +\subsection{String Substitution} +\label{stringsubstitution}\xx{string}{substitution} + +Most command shells provide some form of string substitution so +as to provide some degree of parameterization. +The FunnelWeb shell provides 36 different string variables named +\p{\$0..\$9} and \p{\$A..\$Z} (case insensitive). +Each variable can hold a string containing +any sequence of printable characters and can be as long as a command line. + +The \p{define} command\xx{define}{command} +allows the user to assign a value to these variables. +The \p{define} command takes two arguments. The first is the digit or letter +of the +variable to be defined. The second is a double quote delimited string being the +string value to be assigned to the variable. If you want to include a +double quote character within the string, you don't need to double it. + +Examples: + +\begin{verbatim} +define 3 "/root/usr/usrs/users/users5/thisuser/workdir/fwdir/testdir" +define M "/user/local/rubbish/bin/fw" +define Q "You don't need to double" double quotes" +\end{verbatim} + +Only the identifying character of the variable being assigned +is used in the definition. This syntax is a simple way of preventing +the variable from being substituted before it has a chance to be +defined! + +The following points clean up the remaining semantic details: + +\begin{itemize} + +\item There is only one set of variables and they are global to all +shellscripts. There are \i{no local variables}. + +\item When a shellscript is invoked using the \p{execute} command, the +substitution variables \p{0} through \p{9} are affected. See +Section~\ref{executecommand} for more details. + +\item If you want to include a dollar sign character in a command +use \dqp{\$\$}. + +\item FunnelWeb also defines \dqp{\$/} which translates to the character +that separates directory and file name fields in file names on the host +machine. For example: Sun=\dqp{/}, Vax=\dqp{]}, Mac=\dqp{:}, +PC=\dqp{\bs{}}. + +\item Substitution is not performed recursively. + +\end{itemize} + +\subsection{How a Command Line is Processed} +\xx{command line}{processing} + +When FunnelWeb reads in a command line (from the console or a script file), +it processes it in the following sequence: + +\begin{enumerate} + +\item The command line is checked for non-printable characters. If there +are any, they are flagged with a severe error. + +\item All dollar string substitution variables in the command line are +replaced by their corresponding string. +The command line is processed from left to right. Substitutions are +performed non recursively. + +\item At this point, if the line is empty, or consists entirely of +blanks, it is ignored and the interpreter moves to the next line. + +\item A severe error is generated if the line at this stage begins with +a blank. + +\item If the first character of the line is \dqp{!}, the line is a +comment line and is ignored. + +\item The run of non-blanks commencing at the start of the line is +compared case-insensitively to each of the legal command verbs. If the +command is illegal, a severe error is generated, otherwise the command +is processed. + +\end{enumerate} + +\subsection{Options} +\xx{command}{options}\xx{default}{options} + +The FunnelWeb shell maintains three sets of command line options. + +\begin{enumerate} + +\item The set of options resulting from applying the operating system +level command line +arguments to the default option settings. + +\item A set of shell options that prevail during the shell invocation. + +\item The set of option values active during a particular invocation +of FunnelWeb proper. + +\end{enumerate} + +When FunnelWeb is invoked from the operating system with just \p{+F}, +only the first of these three sets comes into existence. If the user +invokes the FunnelWeb shell, the shell options come into existence and are +initialized with the value of the first set. These shell options are +used as the default for all subsequent \p{fw} commands. However, +they can be altered using the script command \p{set}. If a +\p{fw} command executed in a shell contains additional command line options, +these override the shell options for that run, but do not change the +shell options. An example follows: + +\begin{verbatim} +$ fw +k +t ! Original invocation of FunnelWeb from OS. + ! Shell options are now default with "+t". +FunnelWeb>fw sloth ! Equivalent to fw sloth +t. +FunnelWeb>set -l ! Change the l shell option. +FunnelWeb>fw sloth +q ! Equivalent to fw sloth +t -l +q. +FunnelWeb>fw sloth ! Equivalent to fw sloth +t -l. +\end{verbatim} + +The existence of the shell option set means that the user can set up +a set of defaults to be applied to all \p{fw} commands issued within +the shell. + +\subsection{Shell Commands} +\xx{shell commands}{list}\xx{commands}{shell} + +This section describes each of the FunnelWeb shell commands. The syntax +is: + +\begin{verbatim} +shell_command = absent | codify | compare | define | diff | diffsummary | + diffzero | eneo | execute | exists | fixeols | help | + here | quit | set | show | skipto | status | + tolerate | trace | write | writeu +s = {" "}+ +\end{verbatim} + +As a rule, FunnelWeb shell commands return severe status if their +arguments are syntactically incorrect or if they are +unable to successfully operate on argument files. + +\subsubsection{Absent} +\xx{command}{absent} + +The \p{absent} command performs no action except to return a status. If the +file specified in its argument doesn't exist +it returns success status, otherwise it returns severe status. + +\begin{verbatim} +Syntax : absent = "absent" s filename +Example: absent result.out +\end{verbatim} + +This command is useful in regression testing +for making sure that +FunnelWeb \i{hasn't} produced a particular output file. + +\subsubsection{Codify} +\xx{command}{codify} + +The \p{codify} command takes two arguments: an input file and an output file. +It reads each line of the input file and writes a corresponding line to the +output file. The corresponding line consists of a C macro call containing +a string containing the input line. The command converts all backslashes in +input lines to double backslashes so as to avoid unwanted interpretations by +the C compiler. It also converts double quotes in the line to backslashed +double quotes. + +\begin{verbatim} +Syntax : codify = "codify" s filename s filename +Example: codify header.tex header.c +\end{verbatim} + +The following example demonstrates the transformation. + +\begin{verbatim} +Input Line: \def\par{\leavevmode\endgraf}% A "jolly good hack". +Output Line: WX("\\def\\par{\\leavevmode\\endgraf}% A \"jolly good hack\"."); +\end{verbatim} + +The \p{codify} command was introduced to assist in the +development of FunnelWeb. +It is used to convert longish text files +into C code to write them out. The C code is then included within +the FunnelWeb C program. For example, +the set of \TeX{} definitions that appears at the top of every +documentation file was \p{codif}ied and inserted into the +FunnelWeb code so that FunnelWeb would not have to look for a file containing +the definitions at run time. + +\subsubsection{Compare} +\xx{command}{compare} + +The \p{compare} command takes two filename arguments and performs a binary +comparison of the two files. If the files are identical, success status +is returned. If they are different, severe status is returned. No information +about the manner in which the files differ is conveyed. + +\begin{verbatim} +Syntax : compare = "compare" s filename s filename +Example: compare result.txt answer.txt +\end{verbatim} + +The \p{compare} command was created as the main checking mechanism for +regression testing. However, its binary output was soon found to be +unworkable and the more sophisticated \p{diff} command was added so +that the actual differences between the files could be examined. + +\subsubsection{Define} +\xx{command}{define}\xx{string}{substitution} + +The \p{define} command +assigns a value to a shell string substitution variable. +The \p{define} command takes two arguments. The first is the digit or letter +of the +variable to be defined. The second is a double quote delimited string being the +string value to be assigned to the variable. If you want to include a +double quote character within the string, you don't need to double it. + +\begin{verbatim} +Syntax : define = "define" s letter s """" text """" +Examples: define 3 "/usr/usrs/thisuser/workdir/fwdir/testdir" + define M "/user/local/rubbish/bin/fw" + define Q "You don't need to double" double quotes" +\end{verbatim} + +The command interpreter expands the command line before it executes the +\p{define} command. This means that you can define string substitution +variables in terms of each other with static binding. + +The \p{define} command was introduced to allow the parameterization +of the directories involved in regression testing. + +See Section~\ref{stringsubstitution} for more details. + +\subsubsection{Diff} +\xx{command}{diff}\xx{file}{differences} + +The \p{diff} command reads in two text files and \i{appends} a report to a log +file containing a list of the differences between the two input +files. If the log file does not already exist, an empty one is created first. + +\begin{verbatim} +Syntax : diff = "diff" s filename s filename s filename s ["ABORT"] +Examples: diff result.tex answer.tex diff.log + diff $Otest23.out $Atest23.out $Ldiff.log ABORT +\end{verbatim} + +The \p{diff} command performs a full line-based differences operation. +It will identify different sections in a file, even if they are of differing +length. + +The implementation of the \p{diff} command is quite complicated. To be +sure that it is at least getting its same/different proclamation right, +the \p{diff} command performs a binary comparison as an extra check. + +The following points describe the rules for determining the result status. + +\begin{enumerate} + +\item \p{diff} aborts with a +severe error if the log file cannot be opened or +created for appending. + +\item An ordinary error is generated if either or both of the input files +cannot be opened. + +\item If, at the end of the run, the two input files have not +been proven to be identical, and the \p{ABORT} keyword is present, \p{diff} +returns severe status. + +\item \p{diff} returns success status if none of the above conditions +(or similar conditions) occur, even if the two files are different. + +\end{enumerate} + +The \p{diff} command \i{appends} its differences report rather than +merely writing it. This allows a regression test script to perform +a series of regression tests and produce a report for the user. + +The \p{diff} command was added to the shell after it had become apparent +that the simpler \p{compare} command was not yielding enough information. +Whereas early on, regression testing was treated +mainly as a tool to ensure that FunnelWeb was being ported to other machines +correctly, it began to place an increasing role during development in +identifying the effects of changes made to the code. The \p{diff} command +supports this application of regression testing by pinpointing the +differences between nearly-identical text files. + +\subsubsection{Diffsummary} +\xx{command}{diffsummary} + +The \p{diffsummary} command writes a short report to the +console giving the number of +difference operations that have taken place and how many of the pairs +of files compared were identical. Counting starts at the most recent +execution of a \p{diffzero} command, or if there has been none, when +FunnelWeb started up. + +\begin{verbatim} +Syntax : diffsummary = "diffsummary" +Examples: diffsummary +\end{verbatim} + +The \p{diffsummary} command was added so as to allow regression testing +scripts to display a summary of the results of the test. If the summary +indicates that no pair of files differed, then there is no need to look +in the \p{diff} log file. + +\subsubsection{Diffzero} +\xx{command}{diffzero} + +The \p{diffzero} command zeros the different summary counters used by the +\p{diff} and \p{diffsummary} commands. + +\begin{verbatim} +Syntax : diffzero = "diffzero" +Examples: diffzero +\end{verbatim} + +The \p{diffzero} command was added so as to allow regression testing +shellscripts to zero their differences counters at the start of a run. +This allows testers to invoke the same regression testing script +twice in one interactive session without receiving an inflated +differences summary. + +\subsubsection{Eneo} +\xx{command}{eneo} + +The \p{eneo} command takes one filename argument. If the file does +not exist, no action is taken. If the file does exist, it is deleted. +In both cases success status is returned. However, if the file exists +and cannot be deleted, \p{eneo} returns severe status. + +\begin{verbatim} +Syntax : eneo = "eneo" s filename +Examples: eneo result.out +\end{verbatim} + +The \p{eneo} command was added so as to allow regression testing scripts +to ensure that existing output files were not present before proceeding +with a test run. If FunnelWeb were to fail to generate an output file, it +would be +extremely undesirable for the old version to be used. + +ENEO stands for \b{E}stablish the \b{N}on \b{E}xistence \b{O}f. +Most operating systems provide a command to delete files. Typically +these commands are verbs such as \dq{delete}, \dq{remove}, and \dq{kill}. +As a consequence, the designers of delete commands usually +consider the command to have failed if it fails to find the file to be +deleted. However, in my experience, the most common use +for the delete command +is to \i{establish the non-existence of} one or more files. Typically, a +script is starting up and needs to clear the air before getting started. +If the files are there, they should be deleted; if they are not, then that's +OK too.\footnote{As far as I know, the \p{eneo} command is original.} + +\subsubsection{Execute} +\label{executecommand}\xx{command}{execute} + +The \p{execute} command causes a specified text file to be +executed as a FunnelWeb shellscript. The first argument is the +name of the script file. +The remaining arguments are assigned to the substitution +variables \p{\$1}, \p{\$2}, $\ldots$, \p{\$9}. +Substitution variables in the range +\p{\$1} to \p{\$9} that do not correspond to an argument are set to +the empty string \p{""}. \p{\$0} is set to the empty string regardless. +The execute command can be used recursively, allowing shell scripts to +invoke each other. A file extension default of \dqp{.fws} +(FunnelWeb Script) applies to script files. + +\begin{verbatim} +Syntax : execute = "execute" s filename {argument_string} +Examples: execute megatest.fws /usr/users/ross/fwtest ! + execute sloth +\end{verbatim} + +The first example above will result in the following substitution variable +assignments. + +\begin{verbatim} +$0 = "" +$1 = "/usr/users/ross/fwtest" +$2 = "!" +$3 = "" +... +$9 = "" +\end{verbatim} + +It should be stressed that there are no local variables in the FunnelWeb +command language; the variables above are globally modified. + +The \p{execute} command was added to allow the creation of sub-scripts +to test FunnelWeb in particular ways. + +\subsubsection{Exists} +\xx{command}{exists} + +The \p{exists} command performs no action except to return a status. If the +file specified in its argument exists +it returns success status, otherwise it returns severe status. + +\begin{verbatim} +Syntax : exists = "exists" s filename +Example: exists test6.fw +\end{verbatim} + +This command is useful in regression testing +for ensuring that +FunnelWeb has produced a particular output file. + +\subsubsection{Fixeols} +\xx{command}{fixeols} + +The \p{fixeols} command takes two filename arguments: an input file and +an output file. It reads in the input file and writes it to the output file +changing all the end of line control character +sequences to the local format. It can also take one filename argument, in +which case it replaces the target file with its transformation. + +\begin{verbatim} +Syntax : fixeols = "fixeols" s filename [s filename] +Examples: fixeols imported.hak result.kln + fixeols sloth.dat +\end{verbatim} + +The \p{fixeols} command works by parsing the input file into alternating +runs of +printable characters (ASCII 20 to ASCII 126) and runs of non-printable +characters (all the others). +It then\xx{non-printable}{characters} +parses each run of non-printable characters from left to right into +subruns of non-printables not containing the same character twice. +It then replaces each subrun with a native EOL.\footnote{Note: A native +EOL can be inserted into a text file in a portable manner +simply by writing \dqp{\bs{}n} to the text output stream.} +For example, +if a native EOL is \p{X}, and \p{ABCD} are non-printable characters, and +the file to be converted is + +\begin{verbatim} +thisABisABCDanABABexampleABCCCof the conversion. +\end{verbatim} + +then \p{fixeols} would produce + +\begin{verbatim} +thisXisXanXXexampleXXXof the conversion. +\end{verbatim} + +The \p{fixeols} command was devised to solve the problem created sometimes +when text files are moved from one machine to another +(\eg{}with the kermit program) +using a binary transfer mode rather than a text transfer mode. +If such a transfer is made, and the text file line termination conventions +differ on the two machines, one can wind up with a set of +text files with improperly terminated lines. This can cause problems +on a number of fronts, but in particular affects regression testing +which relies heavily on exact comparisons between files. The \p{fixeols} +command provides a solution to this problem by providing a portable way +to \dq{purify} text files whose end of lines have become incorrect. +The regression testing scripts all apply \p{fixeols} to their input and +output files before each test. + +\subsubsection{Fw} +\xx{command}{fw} + +The \p{fw} command allows FunnelWeb proper to be invoked from a shell +script. The syntax is almost identical to the syntax with which FunnelWeb is +invoked from the operating system. + +\begin{verbatim} +Syntax : fw = "fw" s ordinary_funnelweb_command_line +Examples: fw sloth +t +d + fw -l walrus +\end{verbatim} + +Some important points about this \p{fw} command are: + +\begin{itemize} +\item Options are inherited from the default shell options. +\item The \p{F} (input file option) must be turned on. +\item The \p{K}, \p{H}, and \p{X} options must be turned off. +\item The \p{J} option must be turned off. +\item The options specified in a \p{fw} command do not affect the default +shell options. +\item This command performs no action in the VAX VMS version of FunnelWeb. +\end{itemize} + +\subsubsection{Help} +\xx{command}{help} + +The \p{help} command provides online help from within the FunnelWeb shell. +It provides access to all of the same messages that the \p{+H} command +line option does. + +\begin{verbatim} +Syntax : help = "help" [s help_message_name] +Examples: help + help commands +\end{verbatim} + +If no message name is given, the default message is displayed. It contains +a list of the other help messages and their names. The actual messages +themselves are not listed here. + +\subsubsection{Here} +\xx{command}{here} + +The \p{here} command acts as a target for the \p{skipto} command. When +the shell interpreter encounters a \p{skipto} command, it ignores all +the following commands until it encounters a \p{here} command. + +\begin{verbatim} +Syntax : here = "here" +Example: here +\end{verbatim} + +The \p{skipto}/\p{here} mechanism was created to allow groups of +regression tests to be skipped during debugging without having to comment +them out. For more information, see Section~\ref{skiptocommand}. + +\subsubsection{Quit} +\xx{command}{quit} + +The \p{quit} command terminates FunnelWeb immediately and returns +control to the operating system. This applies regardless of the depth +of the script being executed. + +\begin{verbatim} +Syntax : quit = "quit" +Example: quit +\end{verbatim} + +\subsubsection{Set} +\xx{command}{set} + +The \p{set} command modifies the default shell options. +For example, \p{set +t} sets the \p{+t} option for all subsequent +FunnelWeb runs within the shell until another set command +sets \p{-t}. + +\begin{verbatim} +Syntax : set = "set" s ordinary_funnelweb_command_line +Examples: set sloth +t +d + set -lwalrus +\end{verbatim} + +The restrictions on the \p{set} command are identical to those on the +\p{fw} command except that, in addition, +the \p{+F} option cannot be turned on in the \p{set} command. + +The set command is useful for setting option defaults before a long run +of regression tests. It could also be useful to set default options in +a FunnelWeb shell kept by a user in a workstation window. + +\subsubsection{Show} +\xx{command}{show} + +The \p{show} command displays the current default shell options. +These options are the options that subsequent \p{fw} commands will +inherit. + +\begin{verbatim} +Syntax : show = "show" +Example: show +\end{verbatim} + +\subsubsection{Skipto} +\label{skiptocommand}\xx{command}{skipto} + +The \p{skipto} command causes the shell to ignore all subsequent commands +until a \p{here} command is encountered. + +\begin{verbatim} +Syntax : skipto = "skipto" +Examples: skipto +\end{verbatim} + +The \p{skipto}/\p{here} mechanism was created to allow groups of +regression tests to be skipped during debugging without having to comment +them out. It is like a cut price \p{goto}. +For example, supposing that there were eight tests and that +you had debugged the first five. You might want to skip the first five +tests so that you can concentrate on the next three. The following +code shows how this can be done. + +\begin{verbatim} +skipto +execute test infile1 +execute test infile2 +execute test infile3 +execute test infile4 +execute test infile5 +here +execute test infile6 +execute test infile7 +execute test infile8 +\end{verbatim} + +It should be stressed that FunnelWeb performs full command line processing +including the dollar substitutions before testing the line to see if +it is \p{here}. This can lead to non-obvious problems. For example. + +\begin{verbatim} +skipto +! Test the Parser +! --------------- +define X "execute parsertest.fws" +$X infile1 +$X infile2 +$X infile3 +$X infile4 +$X infile5 +here +\end{verbatim} + +The above looks correct, but, because the \p{define} command isn't executed +(and \p{\$X} is not defined) the subsequent \p{\$X} lines result in a +leading blanks error. The problem can be corrected by defining \p{\$X} +before the \p{skipto} command. + +\subsubsection{Status} +\xx{command}{status} + +The \p{status} command takes two forms. In its first form in which +no arguments are given, it writes out the number of warnings, errors +and severe errors that 1) were generated by the previous command +and 2) have been generated during the entire shell invocation. +In its second form it takes from one to three arguments each of which +specifies a diagnostic severity and a number. The \p{status} command +compares each of these numbers with the number of that diagnostic +generated by the previous command and generates a severe error if +they differ. + +\begin{verbatim} +Syntax : status = "status" {s ("w"|"e"|"s") num}0..3 +Examples: status + status w1 e5 s1 + status w4 + status s1 e2 +\end{verbatim} + +The \p{status} command was introduced to test the status results of +commands during their debugging. It is also useful for checking to see that +the right number of diagnostics have been generated at particular points +in test scripts. + +\subsubsection{Tolerate} +\xx{command}{tolerate} + +The \p{tolerate} command instructs the shell not to abort processing +of the script if the next command generates one or more warnings, errors, +or severe errors. For the purposes of this command, a blank line counts +as a command, so be sure to place the \p{tolerate} command immediately +above the command about which you wish to be tolerant. + +\begin{verbatim} +Syntax : tolerate = "tolerate" +Example: tolerate +\end{verbatim} + +The tolerate command was introduced to allow FunnelWeb (\ie{}the +\p{fw} command) to be tested +in a script under conditions which would normally cause it to abort the +script. + +\subsubsection{Trace} +\xx{command}{trace} + +The \p{trace} command turns on or off command tracing during script +execution. By default, tracing is turned off. + +\begin{verbatim} +Syntax : trace = "trace" [s ("on" | "off")] +Examples: trace on + trace off +\end{verbatim} + +The \p{trace} command was introduced to assist in the debugging of +regression test scripts. + +\subsubsection{Write} +\xx{command}{write} + +The \p{write} command accepts a double-quoted argument and writes it followed +by an EOL to the console (standard output). +There is no need to double any double quotes +occurring within the string. + +\begin{verbatim} +Syntax : write = "write" s string +Examples: write "Now about to start the next test." + write "You don't need to " double enclosed double quotes." +\end{verbatim} + +The \p{write} command was added so as to allow regression testing scripts +to inform the user of their progress. + +\subsubsection{Writeu} +\xx{command}{writeu} + +The \p{writeu} command is identical to the \p{write} command except that it +underlines the text on an additional following output line. + +\begin{verbatim} +Syntax : writeu = "writeu" s string +Examples: writeu "Test 6" +\end{verbatim} + +\section{Concluding Remarks} + +This chapter defines the semantics of the FunnelWeb program. As stated +at the start of this chapter, this document takes precedence over the +FunnelWeb program. While the +definition of FunnelWeb in this chapter is reasonably solid, it is far +from watertight, and it is hoped that it can be tightened further in +future versions. All constructive criticism will be gratefully received +by the author Ross Williams (\p{ross@spam.adelaide.edu.au}). + +%==============================================================================% +% End of Ch3.tex % +%==============================================================================% diff --git a/web/funnelAC/userman/u_ch4.tex b/web/funnelAC/userman/u_ch4.tex new file mode 100644 index 0000000000..82a9be4010 --- /dev/null +++ b/web/funnelAC/userman/u_ch4.tex @@ -0,0 +1,468 @@ +%==============================================================================% +% Start of Ch4.tex % +%==============================================================================% +% +% Copyright +% --------- +% Copyright (C) 1992 Ross N. Williams. +% This file contains a chapter of the FunnelWeb User's Manual. +% See the main TeX file for this manual for further information. +% +%==============================================================================% + +\chapter{FunnelWeb Installation} +\label{chapinstall}\xx{FunnelWeb}{installation} + +This chapter describes how to obtain, compile, and install FunnelWeb. +You will need: + +\begin{itemize} + +\item FTP access to the internet \i{or} a FunnelWeb distribution kit on disk. + +\item A Sun, VMS VAX, Macintosh, or PC \i{or} lots of extra time to port +FunnelWeb to a new platform. + +\item About four megabytes of free disk space. You might be able to +install it with less, but four megabytes is safe. The distribution kit itself +is about two and a half megabytes. +If you are short on space, you can throw away everything after installation +except the binary executable which will consume about half a megabyte. + +\item A C compiler. + +\item An acquaintance with the C programming language and the ability to +compile and link C programs on your machine. + +\item Elementary systems programming knowledege for your machine. + +\item About an hour. + +\end{itemize} + +You will \i{not} need any sort of system privileges to install FunnelWeb, +unless you want the FunnelWeb command \p{fw} to be automatically available +to everyone on your machine as well as yourself. + +\section{Obtaining a Copy of FunnelWeb} +\xx{FunnelWeb}{obtaining}\xx{ftp}{anonymous} + +The simplest way to obtain a copy of FunnelWeb is by anonymous FTP from: + +\begin{verbatim} + Machine : sirius.itd.adelaide.edu.au [IP=129.127.40.3]. + Directory : ~pub/funnelweb/ (or a directory of similar name). +\end{verbatim} + +It is not clear at the time of writing whether FunnelWeb will be presented +as a \dqp{.tar} file, or as a directory tree, +or both. Just sniff around and use +your common sense. Two points deserve attention however: + +\begin{enumerate} + +\item Be sure to use the \i{text} transfer mode whenever you transfer +raw FunnelWeb files. However, you should use \i{binary} mode for TAR files +and other conglomerate representations. + +\item If you have to transfer the files individually, +don't lump all the FunnelWeb files into a single directory. Refer to +the sections that follow for information on the directory tree you should +create to receive the FunnelWeb files. + +\end{enumerate} + +If anonymous FTP is not available to you, contact the author +for up-to-date information on other channels of distribution. + +\begin{verbatim} + Name: Dr Ross N. Williams + Email: ross@spam.adelaide.edu.au + Snail: 16 Lerwick Avenue, Hazelwood Park 5066, Australia. +\end{verbatim} + +\section{Establishing The Directory Tree} +\xx{directory}{tree} + +At this stage, +we will assume that you have somehow obtained a set of files that +are supposed to be FunnelWeb, and that they are sitting on a disk +on the machine on which you wish to compile and install +FunnelWeb. + +The first thing you have to do is to make sure that +the FunnelWeb directory tree has been correctly unpacked. The directory +tree should look like this. + +\begin{verbatim} + fwdir - Root FunnelWeb directory. + admin - Administrative files. + answers - Answers to test suite. + hackman - FunnelWeb Hacker's Manual. + results - For test results. + scripts - Test scripts. + sources - Source code. + tests - Test suite. + userman - FunnelWeb User's Manual. +\end{verbatim} + +The following sections describe the contents of each directory in +alphabetical order. Check the +contents to make sure that you have everything. Do not become fussed if +your configuration is not quite as specified as +it is very easy for +installation guides such as this one to go out +of date as minor last minute changes and updates +are made to the distribution kit. Check the source from which you obtained +the kit, and if it is different too, proceed. + +\subsection{Admin Directory} +\xx{admin}{directory} + +The \p{admin} directory contains administrative files to do with licensing +and such. It is also a catch-all directory for files that don't belong +anywhere else. At the time of writing, it is not clear +exactly what will be in the \p{admin} directory. Why not take a look? + +\subsection{Answers Directory} +\xx{answers}{directory} + +The \p{answers} directory contains the +\dq{correct answers}\xx{correct}{answers} +to all the regression testing input files. The regression test scripts +compare these files to the files generated in the \p{results} directory. + +\begin{verbatim} +an01.lis ... an04.lis +ex01.lis ... ex16.lis +ex01.out ... ex10.out +ex11.tex ... ex16.tex +generate.lis +hi01.lis ... hi10.lis +hi01.out ... hi05.out +hi06a.out +hi06b.out +hi07a.out +hi07b.out +hi08.out ... hi10.out +pr01.lis ... pr10.lis +sc01.lis ... sc29.lis +tg01.lis ... tg09.lis +tg01.out ... tg09.out +wv01.lis ... wv06.lis +wv01.tex ... wv06.tex +\end{verbatim} + +\subsection{Hackman Directory} +\xx{hackman}{directory} + +The \p{hackman} directory contains the \p{.tex} files that make up the +\i{FunnelWeb Hacker's Manual}. + +\begin{verbatim} +h_ch0.tex - Preface, etc. +h_ch1.tex - Design. +h_ch2.tex - Implementation. +h_ch3.tex - Modification. +h_ch4.tex - Future. +h_cha.tex - Appendices. +h_manual.tex - Main TeX file. +\end{verbatim} + +See the comment at the top of \p{h\_manual.tex} file for +instructions on how to typeset and print the \i{FunnelWeb Hacker's Manual}. + +There is no need to read or print the \i{FunnelWeb Hacker's Manual} unless you +intend to modify FunnelWeb. + +\subsection{Results Directory} +\xx{results}{directory} + +The \p{results} directory exists as a target directory for +the output files generated by FunnelWeb during regression testing. +This directory is distributed empty and +should be empty at the start of regression testing. +However, it is permissible for the \p{results} directory to +contain files generated +during a previous test run, as the regression testing scripts +delete specific unwanted files before each test anyway. + +\subsection{Scripts Directory} +\xx{scripts}{directory} + +The \p{scripts} directory stores the FunnelWeb command shell scripts that +are used to perform regression testing.\xx{regression}{testing} + +\begin{verbatim} +master.fws - The master test script. This is the one you run. +test_gen.fws - Script to generate certain tricky input files. +test_l.fws - Test FunnelWeb with +L. +test_ld.fws - Test FunnelWeb with +L +B... +test_lo.fws - Test FunnelWeb with +L +O. +test_lo2.fws - Test FunnelWeb with +L +O (two output files). +test_lot.fws - Test FunnelWeb with +L +O +T. +test_lt.fws - Test FunnelWeb with +L +T. +\end{verbatim} + +\subsection{Sources Directory} +\xx{sources}{directory} + +The \p{sources} directory contains \i{all} of the C source files +required to build a FunnelWeb binary executable. In the following list, +files given without an extension represent both \p{.c} and \p{.h} files. + +\begin{verbatim} +analyse - The analyser. +as - Assertions. +clock - A clock abstraction. +command - The shell command interpreter. +data - Shared data structures and global variables. +dump - Functions to dump internal data structures. +environ.h - Lightweight machine-dependent, program-independent header. +help - Module to write out help messages. +help_gnu - Function to write out the GNU license. +help_gnu.txt - The GNU license in text form. +help_gnu.ctx - The GNU license in C code form. +list - A list abstraction. +lister - Module to manage the listing file. +machin - Module to hold machine-dependent, program-dependent stuff. +main.c - The main() program. +mapper - Module to read files into memory. +memory - Memory management. +misc - Miscellaneous functions. +option - Command line option processing. +parser - The parser. +scanner - The scanner. +section - A section number abstraction. +style.h - A machine-independent, program-independent header file. +table - A table abstraction. +tangle - The tangler. +texhead - Module to write out TeX header in documentation files. +texhead.ctx - The TeX header in C code form. +texhead.tex - The TeX header in TeX form. +weave - The weaver. +writfile - Output abstraction. +\end{verbatim} + +The \dqp{.txt}, and \dqp{.tex} files do not participate in the compilation, +but are considered part of the source code as they +were used to generate the \dqp{.ctx} files. The \dqp{.ctx} files +are included by \p{.c} files of the same name. They do not need to be +compiled themselves. + +\subsection{Tests Directory} +\xx{tests}{directory} + +The \p{tests} directory stores all the input files of the +regression test suite. These come in two kinds: FunnelWeb input +files with extensions of \dqp{.fw}, and FunnelWeb include files with +extensions of \dqp{.fwi}. + +\begin{verbatim} +FunnelWeb Input Files: + an01.fw ... an04.fw - Analyser tests. + ex01.fw ... ex16.fw - Examples from the tutorial in user manual. + generate.fw - Generates a few other tricky input files. + hi01.fw ... hi10.fw - Examples from the hints chapter in user manual. + pr01.fw ... pr10.fw - Parser tests. + sc01_note.fw - A note explaining absence of sc01.fw + sc02.fw ... sc29.fw - Scanner tests. + tg01.fw ... tg09.fw - Tangler tests. + wv01.fw ... wv06.fw - Weaver tests. + +FunnelWeb Include Files: + ex09a.fwi + sc13a.fwi ... sc13f.fwi + sc15a.fwi + tg08a.fwi +\end{verbatim} + +\subsection{Userman Directory} +\xx{userman}{directory} + +The \p{userman} directory contains the \p{.tex} files that make up the +\i{FunnelWeb User's Manual}. + +\begin{verbatim} +u_ch0.tex - Preface, etc. +u_ch1.tex - Tutorial. +u_ch2.tex - Hints. +u_ch3.tex - Definition. +u_ch4.tex - Installation. +u_ch5.tex - Administration. +u_cha.tex - Appendices. +u_manual.tex - Main TeX file. +\end{verbatim} + +See the comment at the top of \p{u\_manual.tex} file for +instructions on how to typeset and print the \i{FunnelWeb User's Manual}. + +\section{Compiling FunnelWeb} +\xx{compiling}{FunnelWeb} + +The FunnelWeb source code is entirely contained within the \p{sources} +directory. However, some simple +script files and makefiles can be found in the \p{admin} directory. + +FunnelWeb contains some machine-dependent components, so before compiling +FunnelWeb, you need to specify your machine in the source file \p{environ.h}. +To do this, +edit the \p{environ.h} file and set exactly one of the machine name +\p{\#define}s to \p{1}. For example, on the Sun you should set: + +\begin{verbatim} +#define MAC 0 +#define SUN 1 +#define VMS 0 +#define PC 0 +\end{verbatim} + +There should be little difficulty compiling FunnelWeb for any of these +platforms. +If the machine on which you are compiling FunnelWeb is not one of the ones +listed in the \p{environ.h} file, then choose the closest one you can. +Try the \p{SUN} if you are running a non-Sun Unix. +If you run into serious difficulties, you will have to +customize \p{machin.h} and \p{machin.c} for your machine. +See the comments in these files +for instructions on how to do this. + +Once you have specified a target machine, compile FunnelWeb by pointing +your C compiler at all the +\dqp{.c} files in the \p{sources} directory. +The \dqp{.txt}, and \dqp{.tex} files do not participate in the compilation, +but appear in the \p{sources} directory because they +were used to generate the \dqp{.ctx} files. The \dqp{.ctx} files +are included by \p{.c} files of the same name and do not need to be +compiled separately. +Link the results. + +The result of all this should be a binary executable called +\p{fw}, or \p{fw.exe}, +or \p{fw.xxx} where \p{.xxx} is whatever file extension is +appropriate on the target machine. Clean up the +\p{sources} directory by deleting all the listing and object files. + +\section{Testing FunnelWeb} +\label{testingfunnelweb}\xx{testing}{FunnelWeb} + +Once you have obtained a binary executable, you should test FunnelWeb +before making it available to users. To do this: + +\begin{enumerate} + +\item Set the default directory to be the \p{scripts} directory. + +\item Copy the FunnelWeb executable into the scripts directory (or +be able to invoke it from the scripts directory). + +\item Edit the script \p{master.fws}. Locate the section called +\dq{Define Symbol For the Root Test Directory} and define the \p{R} +symbol to point to the FunnelWeb root directory \p{fwdir}. The examples +in the comments in the script should make it clear what is required. + +\item Invoke FunnelWeb to execute the master test script +with the command line \p{fw +xmaster} + +\end{enumerate} + +The \p{master.fws} script should run for a few minutes. If all goes +well, you will find a differences report on your screen reporting +zero differences. If this happens, then FunnelWeb has been +fully tested and is ready to be made available to users. You should +delete all the files in the \p{results} directory and proceed to the next +section on installing FunnelWeb for users. + +If there were +one or more differences, you can either give up and contact the author, +or attempt to fix the code yourself. If you decide to fix the code +yourself, start +with the differences log file and follow your nose. Good luck! + +\section{Installing FunnelWeb} +\xx{installing}{FunnelWeb} + +At this stage you should have a \p{fwdir} directory tree somewhere in your +file system. Its contents should be almost identical to the directory +contents specified earlier in this chapter except there should now be +an additional binary executable file sitting in the \p{scripts} +directory. + +To make FunnelWeb available to users, you should: + +\begin{enumerate} + +\item Make the entire directory tree readable to all users. + +\item Move the binary executable from the scripts directory to the +\p{admin} directory \i{or} copy it to somewhere convenient such as +a \p{/bin} directory. + +\item Set up a symbol, path, or command of some kind by the name of \p{fw} +that \dq{points} to the binary executable. If possible, set this up so +that the \p{fw} symbol is available to all users. Alternatively, +you can inform interested users of how they can add a command to their +\p{login} command file to make the command available to them. + +\end{enumerate} + +If you are short of disk space or have a system that is stressed in some other +way, it may be of assistance to you to know that +FunnelWeb has been constructed so that its +binary executable\xx{FunnelWeb}{executable} is +\i{totally self contained}. The binary executable does not rely on any +other files to operate. Nor does it care about its position in the file system. +In fact, all that is really required to use FunnelWeb is the binary +executable and the \i{FunnelWeb User's Manual}. Thus, if you are short +of disk space, you can move the binary executable to your \dqp{/bin} +directory and delete the entire FunnelWeb tree. However, making the +tree available to users is encouraged because: + +\begin{itemize} + +\item It allows users to copy the tree and install it on another machine +without bothering you. + +\item It allows users access to the \TeX{} code for the \i{FunnelWeb +User's Manual} and the \i{FunnelWeb Hacker's Manual}. + +\item It allows users access to the regression test suite. This may not +seem important, but it could be very convenient for the user as the +\p{ex*} and \p{hi*} files of the regression test suite contain most +of the examples from the \i{FunnelWeb User's Manual}. By making them available +you will save users the trouble of typing them in. + +\end{itemize} + +Finally, you should fill in and send off a FunnelWeb registration form. +This allows me to get a handle on the size and needs of the user base, and you +to be kept informed of new FunnelWeb releases (optional). +See Section~\ref{registration} for more information. + +\section{Printing Manuals} +\xx{printing}{manuals} + +FunnelWeb comes with two manuals, a \i{FunnelWeb User's Manual} and a +\i{FunnelWeb Hacker's Manual}. Instructions for how to +typeset and print these manuals appear at the top of +the main \TeX{} files for these manuals +\p{u\_manual.tex} and \p{h\_manual.tex}. + +There is no need to print the \i{FunnelWeb Hacker's Manual} unless you +intend to modify FunnelWeb. However, you should make a few copies of the +\i{FunnelWeb User's Manual} available for users, or at least +let them know where the \TeX{} source for the \i{FunnelWeb User's Manual} +is kept so that they can typeset and print it themselves. + +\section{Installation Problems?} +\xx{problems}{installation} + +If you run into any problems installing FunnelWeb, please write a short +report describing the problem and mail it to the author Ross Williams +(\p{ross@spam.adelaide.edu.au}). I may not be able to help you with it +immediately, but I certainly want to know that a problem exists so that +it can be corrected in future releases of FunnelWeb. + +%==============================================================================% +% End of Ch4.tex % +%==============================================================================% diff --git a/web/funnelAC/userman/u_ch5.tex b/web/funnelAC/userman/u_ch5.tex new file mode 100644 index 0000000000..ab676074f8 --- /dev/null +++ b/web/funnelAC/userman/u_ch5.tex @@ -0,0 +1,387 @@ +%==============================================================================% +% Start of Ch5.tex % +%==============================================================================% +% +% Copyright +% --------- +% Copyright (C) 1992 Ross N. Williams. +% This file contains a chapter of the FunnelWeb User's Manual. +% See the main TeX file for this manual for further information. +% +%==============================================================================% + +\chapter{FunnelWeb Administration} +\label{chapadministration}\xx{FunnelWeb}{administration} + +\section{Introduction} + +Whether a computer program is useful depends not just on the functionality +provided by the program, but also on the totality of the culture +and services surrounding it such as license costs, the +quality of +documentation, presence of a standard and so on. +This chapter addresses these issues from a user perspective. + +\section{The User's Commitment To FunnelWeb} +\xx{commitment}{FunnelWeb} + +One of the problems that might prevent potential users from using FunnelWeb +is the level of commitment that it requires. As soon as the user starts +creating FunnelWeb \p{.fw} files, the user becomes dependent on the +FunnelWeb program, as the files so created will become unmanageable if +the FunnelWeb program were to become unavailable for some reason. +There are a number of ways in which computer programs can become unavailable, +including operating system upgrades, copyright problems, inability to +fix bugs, or just the inability of the program to be ported to a new target +platform. + +The fact +is that FunnelWeb defines an input language and that currently there is +only one implementation of the language. Users will only write programs +using that language if they feel comfortable about the availability of its +implementation. + +I have been critically +aware of these issues throughout the development of FunnelWeb and have +taken every possible step to make FunnelWeb a solid base onto which to +build programs. The following points describe the actions I have taken. + +\narrowthing{GNU license:}{FunnelWeb's C source code +has been released under GNU General Public +License Version 2. This means that the source code to FunnelWeb will always +be available to anyone who wants it. The FunnelWeb program can never be +taken away from you.} + +\narrowthing{Portability:}{FunnelWeb has been designed and written to be +extremely portable. First, all FunnelWeb really does is read and write +text files. This makes it easy to make portable. Second, +FunnelWeb is written in the C programming language\paper{ANSI} +with portability as +a major design goal. Third, FunnelWeb has already been ported to four +popular platforms: SunOS, VAX VMS, PC, and Macintosh and it should not prove +hard to move it to others. Fourth, FunnelWeb comes with a huge automated +regression test suite. This makes it easy to pinpoint problems when it +is moved to a new platform. Portability is important because, even if \i{you} +are not using FunnelWeb on some funny platform, you may want to send +a computer program written using FunnelWeb to someone who does.} + +\narrowthing{Quality:}{The FunnelWeb source code is high quality code. +Although it has not been formally developed under any particular coding +standard, it is well designed and documented. Design decisions have +not been taken lightly.} + +\narrowthing{Documentation:}{FunnelWeb is well documented by this manual +and by the \i{FunnelWeb Hacker's Manual}. This is important because it +means that if you want to send someone a program written using FunnelWeb, +you can simply point them to this manual rather than having to explain +it all yourself. It is also comforting for managers who are controlling +source code to know that the format in which the source code is written +is well-documented.} + +\narrowthing{Standardization:}{Users who create source files using FunnelWeb +are not only committing to the FunnelWeb program; they are also investing +in the FunnelWeb language. If FunnelWeb's language changes radically for +some reason, then this investment by users will be undermined. To protect +this investment, I intend to maintain an \dq{official} version of FunnelWeb +whose language will not change radically, at least not +in a non backward compatible manner.} + +It is my hope that the combination of these factors will alleviate any +fears that users may have about committing their source files +to FunnelWeb. + +\section{Documentation} +\xx{FunnelWeb}{documentation} + +The following FunnelWeb documentation is available: + +\begin{verbatim} + "FunnelWeb User's Manual": Tutorial, Hints, Reference Manual. + "FunnelWeb Hacker's Manual": Notes on Design and Implementation. +\end{verbatim} + +Everyone involved with FunnelWeb should read the \i{FunnelWeb User's Manual}. +It contains everything you need to know about how to use FunnelWeb. In fact, +you are reading it now! + +The \i{FunnelWeb Hacker's Manual} +is for those who want to install, modify, fix, +fiddle with, and generally hack the FunnelWeb C source code. + +Both of these manuals are shipped with the FunnelWeb distribution +kit, and should be available on your machine in the form of LaTeX text +files. If you cannot find them, you can obtain them from the +FunnelWeb FTP archive (see Section~\ref{ftparchive}). + +\section{Registration} +\label{registration}\xx{FunnelWeb}{registration} + +If you install or use FunnelWeb, please register by filling in and +returning the registration form in \figregform{}. +Feel free to expand the form if there is not enough room. + + +\begin{figure}[htbp] +\begin{verbatim} + +----------------------FunnelWeb Registration Form----------------------+ + | 1. Date: | + | | + | 2. Title and name: | + | | + | 3. Internet email address: | + | | + | 4. Snail mail address: | + | | + | 5. Work phone number (country,area,number): | + | | + | 6. Which category of FunnelWeb user best describes you? | + | Latent - Installed FunnelWeb, but don't intend to use it. | + | Beginner - Haven't used FunnelWeb much yet; have an open mind. | + | Casual - Use FunnelWeb occasionally. | + | Convert - Use FunnelWeb to do most programming. | + | Fanatic - FunnelWeb has become a way of life. | + | | + | 7. What changes or new features would you like to see in FunnelWeb? | + | | + | | + | | + | | + | | + | | + | 8. Do you want to be kept informed of new FunnelWeb developments? | + | | + +-----------------------------------------------------------------------+ +\end{verbatim} +\mylabel{\figregform{}: The FunnelWeb registration form.}{% +% +To register as a FunnelWeb user, please fill in this form and email it to +\p{ross@spam.adelaide.edu.au}, or snail mail it to +Ross Williams, 16 Lerwick Avenue, Hazelwood Park 5066, Australia. +You may wish to make a contribution when you register. +See Section~\ref{support} for more information. +% +} +\end{figure} + +Email the form to \p{ross@spam.adelaide.edu.au}, or snail mail it to +Ross Williams, 16 Lerwick Avenue, Hazelwood Park 5066, Australia. +You may wish to make a contribution when you register. +See Section~\ref{support} for more information. + +\section{Support} +\xx{FunnelWeb}{support}\label{support} + +FunnelWeb is released \dq{as is} under a GNU license, and +no formal support is available. +You have the right to make changes to FunnelWeb +and to use the modified versions created by random programmers. +However, this is discouraged (see Section~\ref{modification}). + +In fact the support that is most needed is your financial +support for the +FunnelWeb developers! It has taken \i{months} of full-time \i{unpaid} +work to bring FunnelWeb to you in its current form. +I don't want to inconvenience users who install +FunnelWeb, play with it, and then hardly ever use it. +If you are in this category, +please register, but don't bother contributing. However, if you find that +FunnelWeb has become a useful programming tool, a +contribution of some positive multiple of US\$50 would be appreciated. + +To make a contribution, send payment with a completed registration form +(see Section~\ref{registration}) to: + +\begin{verbatim} + Renaissance Software Pty Ltd + Email: ross@spam.adelaide.edu.au + Snail: 16 Lerwick Avenue, Hazelwood Park 5066, Australia. +\end{verbatim} + +Payment can be by personal or bank cheque to any bank in the world or by +Visa or Mastercard. Please give the card name, number, expiry date, and +the amount to be paid in US dollars. All contributions will be appreciated +and will encourage further FunnelWeb development. However, no undertaking +is made whatsoever about how the money will be used. + +\section{Copyright} +\xx{copyright}{FunnelWeb}\xx{FunnelWeb}{license}\xx{GNU}{license}% +\label{copyright} + +The FunnelWeb program is Copyright $\copyright$ 1992 Ross Williams. + +However, FunnelWeb has been released by the author and copyright owner Ross +Williams (\p{ross@spam.adelaide.edu.au}) under Version 2 of the GNU General +Public +License published by the Free Software Foundation. Here are some ways +that you can obtain a copy of this license. + +\begin{itemize} + +\item The license appears as an appendix in the \i{FunnelWeb Hacker's +Manual}. + +\item If you have a working version of FunnelWeb, invoke it with +\p{fw +hlicense +jlicense.txt}. + +\item Look in the \p{help} module of the FunnelWeb source code. + +\item FTP the license from \p{prep.ai.mit.edu} in \p{/pub/gnu/COPYING-2}. + +\item Write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +\end{itemize} + +The license allows you to +redistribute FunnelWeb and/or modify it under certain conditions. +The license does not cover the \i{FunnelWeb User's Manual} and +\i{FunnelWeb Hacker's Manual} which are distributed under a simpler +license that prohibits changes. + +Note: FunnelWeb is distributed WITHOUT ANY WARRANTY; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +\section{Nowarranty} +\x{warranty} + +Users of FunnelWeb should be aware that FunnelWeb comes with no +warranty. Here is an extract from the GNU General Public License Version 2, +under which +FunnelWeb is distributed. For more information see Section~\ref{copyright}. + +\begin{verbatim} + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY + FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN + OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES + PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED + OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS + TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE + PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, + REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING + WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR + REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, + INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING + OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED + TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY + YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER + PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE + POSSIBILITY OF SUCH DAMAGES. +\end{verbatim} + +\section{Distribution} +\xx{FunnelWeb}{Distribution} + +Users of FunnelWeb should be aware that they can distribute the program +freely. +The following is an extract from the GNU General Public License Version 2, +under which FunnelWeb is distributed. + +\begin{verbatim} + 1. You may copy and distribute verbatim copies of the Program's + source code as you receive it, in any medium, provided that you + conspicuously and appropriately publish on each copy an appropriate + copyright notice and disclaimer of warranty; keep intact all the + notices that refer to this License and to the absence of any warranty; + and give any other recipients of the Program a copy of this License + along with the Program. + + You may charge a fee for the physical act of transferring a copy, and + you may at your option offer warranty protection in exchange for a fee. +\end{verbatim} + +The license also allows you other freedoms. +For more information see Section~\ref{copyright}. + +\section{Modification} +\label{modification} + +FunnelWeb is distributed under a GNU license, and you are free to modify the +source code and distribute modified copies (see Section~\ref{copyright}). +However, there are good reasons why you should avoid doing this. + +\begin{enumerate} + +\item If you distribute modified versions of FunnelWeb, you run the risk of +creating a version that will diverge from the \dq{official} version of +FunnelWeb that I intend to maintain. + +\item If you release a version of FunnelWeb with a changed input language, +users of your modified version will create source files that will no +longer work on other versions of FunnelWeb. The result would be chaos. + +\end{enumerate} + +For these reasons I request that you do not distribute modified versions of +FunnelWeb, particularly versions with a modified language. However, if you must +distribute a version with a modified language, \i{please change its name} +(\ie{}from \dq{FunnelWeb} to something else). Please also allocate a new +file extension +to replace \dqp{.fw} as the extension for source files written in the modified +language. + +For more information, refer to the \i{FunnelWeb Hacker's Manual}. + +\section{Versions} +\xx{FunnelWeb}{versions} + +FunnelWeb was created in 1986 and was used extensively by Ross Williams +(\p{ross@spam.adelaide.edu.au}) for three years. However, +Version~1.0 was written +in Ada and was not very portable (it was fairly VAX/VMS specific). +David Hulse +(\p{dave@cs.adelaide.edu.au}) took the first step towards a +release by translating +the Ada code into C. Ross Williams then extensively reworked the C code, making +it robust and portable, adding new features, and polishing it to its +current form. + +\begin{verbatim} + Vers Lang Created Released Author Copyright Licensing + ---- ---- ------- -------- -------------- ------------- --------- + V1.0 Ada 1986 Never Ross Williams Ross Williams + V2.0 C 1989 Never David Hulse Public domain No restriction. + V3.0 C 1992 May-1992 Ross Williams Ross Williams GNU release. +\end{verbatim} + +This manual was released for: + +\begin{verbatim} + * FunnelWeb V3.0. + * User's Manual V1.0. + * Hacker's Manual V1.0. + * TeX Definitions V1.0. +\end{verbatim} + +\section{FTP Archive and Author} +\label{ftparchive}% +\xx{author}{contacting}\xx{ftp}{archive}\xx{FunnelWeb}{archive} + +The FunnelWeb FTP archive is: + +\begin{verbatim} + Machine : sirius.itd.adelaide.edu.au [IP=129.127.40.3]. + Directory : ~pub/funnelweb/ (or a directory of similar name). +\end{verbatim} + +The author of FunnelWeb and this manual is: + +\begin{verbatim} + Name: Dr Ross N. Williams + Email: ross@spam.adelaide.edu.au + Snail: 16 Lerwick Avenue, Hazelwood Park 5066, Australia. +\end{verbatim} + +I intend to maintain an \dq{official} version of FunnelWeb which I will +release under GNU license from time to time. I am happy to receive +constructive criticism +about FunnelWeb and its documentation. + +I will always be happy to receive mail about FunnelWeb, but cannot +guarantee that I will be able to reply to it immediately. + +%==============================================================================% +% End of Ch5.tex % +%==============================================================================% diff --git a/web/funnelAC/userman/u_cha.tex b/web/funnelAC/userman/u_cha.tex new file mode 100644 index 0000000000..f1ddd2b776 --- /dev/null +++ b/web/funnelAC/userman/u_cha.tex @@ -0,0 +1,228 @@ +%==============================================================================% +% Start of Cha.tex % +%==============================================================================% +% +% Copyright +% --------- +% Copyright (C) 1992 Ross N. Williams. +% This file contains a chapter of the FunnelWeb User's Manual. +% See the main TeX file for this manual for further information. +% +%==============================================================================% + +\appendix + +%============================================================================== + +\chapter{Glossary} +\x{glossary} + +\gloss{Analyser} A component of the FunnelWeb program +that checks the macro table created by the parser for errors. +For example, the analyser checks to see if any macro without a \p{@Z} has +not been called. + +\gloss{Argument} A string delimited by blanks appearing on the FunnelWeb +command line. Arguments are used to control options. + +\gloss{Directive} A FunnelWeb special sequence or +cooperating group of special sequences that do not form part of +a macro definition. A directive can take the form of a pragma. + +\gloss{Documentation} Descriptive text. + +\gloss{Documentation file} An output file, produced by the Weave +component of FunnelWeb, that +contains typesetter commands. When fed into the appropriate typesetter +program, the result is a typeset image of the input file. + +\gloss{Free text} The text in an input file that remains +if one were to remove macro definitions and directives. + +\gloss{FunnelWeb} This word has a number of different meanings all +pertaining to the FunnelWeb system of programming. 1) The +entire system of programming as in \dq{Maybe FunnelWeb can help.} +2) The computer program that implements the +system as in \dq{Run it through FunnelWeb and see what comes out.} +3) The language implemented by the FunnelWeb program as in \dq{I wrote the +program in FunnelWeb.} or \dq{I wrote the program in Ada using FunnelWeb.}. + +\gloss{FunnelWeb file} A file whose contents are written in the FunnelWeb +language. + +\gloss{FunnelWeb language} The language in which FunnelWeb input files are +written. + +\gloss{FunnelWeb proper} Usually, when FunnelWeb is invoked, it processes +a single input file and then terminates. However, it also has a command +language mode in which it is possible to invoke \dq{FunnelWeb} many times. +This leads to confusion between \dq{FunnelWeb} the outer program and +\dq{FunnelWeb} the inner program. To avoid this confusion, the inner +FunnelWeb is sometimes referred to as \dq{FunnelWeb proper}. + +\gloss{FW} An abbreviation for \dq{FunnelWeb} that is +used wherever appropriate. + +\gloss{Include file} A file read in by FunnelWeb as the result of an +include pragma (\p{@i filename}). + +\gloss{Input file} Any file read in by FunnelWeb. The phrase +\dq{the input file} refers to the root input file +(specified using the \p{+F} option). + +\gloss{Journal file} An output file containing a copy of the output sent to +the user's console during an invocation of FunnelWeb. In other systems, +this file is sometimes called a \dq{log file}. + +\gloss{Listing file} An output file summarizing the result of processing +an input file. + +\gloss{Macro} A binding of a name to a string. + +\gloss{Macro definition} A construct appearing in a FunnelWeb file that +binds a name to a text string. +A FunnelWeb file consists of a series of macro definitions surrounded by +documentary text. + +\gloss{Mapper} A component of the FunnelWeb program +that reads in the input file and creates a copy of it in memory. + +\gloss{Option} An parameter internal to the FunnelWeb program which can be +controlled by command line arguments or pragmas. + +\gloss{Output file} Any file written by FunnelWeb. This includes +listing, journal, product, and documentation files. (Warning: During most +of FunnelWeb's development the term \dq{output file} was also used to +refer to what are now called \dq{product files}. This turned out to be +extremely confusing and so the term \dq{product file} was invented to +distinguish the generic from the specific. +However, as this was a late modification, +you may find some occurrences of the old +use of \dq{output file}.). + +\gloss{Parser} A component of the FunnelWeb program +that processes the token list generated by the scanner and produces a +macro table and a document list. The parser mainly +analyses the input file at the syntactic level, but also does some lightweight +semantic checking too. + +\gloss{Pragma} Single-line directives that appears in +FunnelWeb files. Pragmas control everything from maximum input line length +to typesetter dependence. A pragma line starts with \dqp{@p}. + +\gloss{Printed documentation} Sheets of paper +resulting from actually typesetting and printing a documentation file. + +\gloss{Product file} An output file, generated by the Tangle component of +FunnelWeb, that contains the expansion of the macros in the input +file. Note: Other names considered for this were: +generated file, expanded file, result file, program file, and tangle file. + +\gloss{Scanner} A component of the FunnelWeb program +that scans a copy of the input file in memory and generates a line list +and a token list to be fed to the parser. The scanner processes the input +at the lexical level. + +\gloss{Script} A file containing FunnelWeb shell commands. + +\gloss{Shell} A command language interpreter built into the FunnelWeb +program. The interpreter allows the user to invoke FunnelWeb proper +many times during a single invocation of the FunnelWeb program. + +\gloss{Special character} A distinguished character +in a FunnelWeb input file that introduces a special sequence. +By default the special +character is \dqp{@}. However, it can be changed using the \dqp{@=} special +sequence. + +\gloss{Special sequence} A special sequence is a construct introduced by the +special character. Special sequences are used to define a structure in a +FunnelWeb input file that exists at a higher level to the surrounding text. +A FunnelWeb input file may be considered to be a sequence of text and +special sequences. + +\gloss{Tangle} This is the name for the component of FunnelWeb that +generates one or more product files containing the expansion of macros +in the input file. + +\gloss{Typesetting directive} A FunnelWeb directive whose +sole effect is to modify the way in which the input file is represented +in the documentation file. + +\gloss{Weave} This is the name for the component of FunnelWeb that +generates a documentation file containing typesetting commands representing +the input file. + +%============================================================================== + +\chapter{References} +\x{references} + +\paper{ANSI} Australian Standard AS~3955-1991, \dq{Programming Languages --- C}, +(ISBN: 0-7262-6970-0), 12~July~1991. Identical to: +International Standard ISO/IEC 9899: +1990 Programming Languages --- C.\checked{} + +\paper{ANZE} \dq{Australia, New Zealand Encyclopedia}, +Entry: \dq{Funnel-web spiders}, Vol~7, pp.~564--565, Bay Books, +Sydney, (ISBN: 85835--127--7), 1975.\checked{} + + +\paper{BSI82} British Standards Institute, \dq{Specification for +Computer Programming Language Pascal}, Publication BS6192:1982, +British Standards Institute, P.O. Box 372, Milton Keynes, MK146LO, +1982.\checked{} + +\paper{Gries81} Gries~D., \dq{The Science of Programming}, +Springer-Verlag, (ISBN: 0-387-90641-X), 1981. + +\paper{Humphries91} Humphries~B, \dq{Neglected Poems and Other Creatures}, +Angus and Robertson, Sydney, (ISBN: 0-207-17212-9), 1991.\checked{} + +\paper{Kernighan88} Kernighan~B.W., Ritchie~D.M., \dq{The~C Programming +Language}, (second edition,\dq{ANSI~C}), Prentice Hall, +(ISBN: 0-13-110362-8), 1988.\checked{} + +\paper{Knuth83} Knuth~D.E., \dq{The WEB System of Structured +Documentation}, (Web User Manual, Version~2.5, November, 1983), +Stanford University, 1983. + +\paper{Knuth84} Knuth~D.E., \dq{The \TeX{}book}, Addison-Wesley, +(ISBN: 0-201-13448-9), 1984. + +\paper{Knuth84} Knuth~D.E., \dq{Literate Programming}, \i{The Computer +Journal}, Vol.~27, No.~2, pp.~97-111, 1984.\checked{Reference copied from +SIGPLAN 26(1) p.16} Note: The author of this manual has not yet obtained +this paper. + +\paper{Lamport86} Lamport~L., \dq{\LaTeX{}: A Document Preparation System}, +Addison-Wesley, (ISBN: 0-201-15790-X), +1986.\checked{} + +\paper{Rosovsky90} Rosovsky~H., \dq{The University: An Owner's Manual}, +W.W.Norton \& Company, Inc., (ISBN: 0-393-02782-1), 1990.\checked{} + +\paper{Smith91} Smith~L.M.C., \dq{An Annotated Bibliography +of Literate Programming}, ACM SIGPLAN Notices, Vol.~26, No.~1, +January 1991.\checked{} + +\paper{Strunk79} Strunk~W., White~E.B., \dq{The Elements of +Style}, Third Edition, MacMillan Publishing Company, New York, +(ISBN: 0-02-418200-1), +1979.\checked{} + +\paper{USDOD83} \dq{The Programming Language Ada Reference Manual}, +American National Standards Institute Inc, +ANSI/MIL-STD-1815A-1983, 1983.\checked{} + +%============================================================================== + +\addcontentsline{toc}{chapter}{Index} +\def\indexentry#1#2{\item #1~#2} +\begin{theindex} +\input u_manual.sin +\end{theindex} + +%==============================================================================% +% End of Cha.tex % +%==============================================================================% diff --git a/web/funnelAC/userman/u_manual.aux b/web/funnelAC/userman/u_manual.aux new file mode 100644 index 0000000000..ca824ce14d --- /dev/null +++ b/web/funnelAC/userman/u_manual.aux @@ -0,0 +1,202 @@ +\relax +\@writefile{toc}{\string\contentsline\space {chapter}{Preface}{9}} +\@writefile{toc}{\string\contentsline\space {chapter}{Acknowledgements}{11}} +\@writefile{toc}{\string\contentsline\space {chapter}{Presentation Notes}{13}} +\@writefile{toc}{\string\contentsline\space {chapter}{\string\numberline\space {1}A Tutorial Introduction}{15}} +\@writefile{lof}{\string\addvspace\space {10\p@ }} +\@writefile{lot}{\string\addvspace\space {10\p@ }} +\newlabel{chapintroduction}{{1}{15}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {1.1}What is Literate Programming?}{15}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {1.2}What is FunnelWeb?}{18}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {1.3}The Name FunnelWeb}{19}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {1.4}A FunnelWeb Tutorial}{19}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {1.5}A Hello World Document}{20}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {1.6}Macro Facilities}{22}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {1.6.1}Simple Macros}{22}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {1.6.2}Number of Times Called}{23}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {1.6.3}Indentation}{25}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {1.6.4}Additive Macros}{26}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {1.6.5}Parameterized Macros}{28}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {1.6.6}Macro Expansion}{30}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {1.6.7}Include Files}{30}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {1.7}Typesetting Facilities}{32}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {1.7.1}Overview}{32}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {1.7.2}Typesetter Independence}{34}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {1.7.3}Hierarchical Structure}{34}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {1.7.4}Understanding the Printed Documentation}{35}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {1.7.5}Literals and Emphasis}{37}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {1.7.6}Adding a Header Page}{37}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {1.7.7}Comments}{37}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {1.8}A Complete Example}{38}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {1.9}Summary}{39}} +\@writefile{toc}{\string\contentsline\space {chapter}{\string\numberline\space {2}FunnelWeb Hints}{41}} +\@writefile{lof}{\string\addvspace\space {10\p@ }} +\@writefile{lot}{\string\addvspace\space {10\p@ }} +\newlabel{chapadvanced}{{2}{41}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2.1}Macro Names}{41}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2.2}Quick Names}{42}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2.3}FunnelWeb the Martinet}{42}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2.4}Fiddling With End of Lines}{43}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2.5}Fudging Conditionals}{44}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2.6}Changing the Strength of Headings}{46}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2.7}Efficiency Notes}{47}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2.8}Interactive Mode}{47}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2.9}Setting Up Default Options}{49}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2.10}FunnelWeb and Make}{49}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2.11}The Dangers of FunnelWeb}{50}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2.12}Wholistic Debugging}{53}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2.13}Examples of FunnelWeb Applications}{53}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {2.13.1}Analyzing the Monster Postscript Header File}{54}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {2.13.2}Making Ada ADTs more A}{55}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {2.13.3}Multiple Language Systems}{55}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {2.13.4}The Case of the Small Function}{56}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {2.13.5}When Comments are Bad}{57}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {2.13.6}Documents That Share Text}{58}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {2.13.7}Generics}{59}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2.14}Summary}{62}} +\@writefile{toc}{\string\contentsline\space {chapter}{\string\numberline\space {3}FunnelWeb Definition}{63}} +\@writefile{lof}{\string\addvspace\space {10\p@ }} +\@writefile{lot}{\string\addvspace\space {10\p@ }} +\newlabel{chapdefinition}{{3}{63}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.1}Introduction}{63}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.2}Notation}{63}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.3}Terminology}{63}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.4}An Architectural Overview}{64}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.5}Diagnostics}{65}} +\newlabel{diagnostics}{{3.5}{65}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.6}Typesetter Independence}{65}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.7}Command Line Interface}{66}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.7.1}Invoking FunnelWeb}{66}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.7.2}Command Line Arguments}{67}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.7.3}Options}{68}} +\newlabel{commandlineoptions}{{3.7.3}{68}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.8}File Name Inheritance}{70}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.9}FunnelWeb Startup}{70}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.10}Scanner}{71}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.10.1}Basic Input File Processing}{71}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.10.2}Special Sequences}{72}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.10.3}Setting the Special Character}{74}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.10.4}Inserting the Special Character into the Text}{74}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.10.5}Inserting Arbitrary Characters into the Text}{74}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.10.6}Comments}{75}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.10.7}Quick Names}{76}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.10.8}Inserting End of Line Markers}{76}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.10.9}Suppressing End of Line Markers}{77}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.10.10}Include Files}{77}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.10.11}Pragmas}{78}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.10.11.1}Indentation}{78}} +\newlabel{indentationpragma}{{3.10.11.1}{78}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.10.11.2}Maximum Input Line Length}{79}} +\newlabel{millpragma}{{3.10.11.2}{79}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.10.11.3}Maximum Output File Line Length}{79}} +\newlabel{mollpragma}{{3.10.11.3}{79}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.10.11.4}Typesetter}{80}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.10.12}Freestanding Typesetter Directives}{81}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.10.12.1}New Page}{81}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.10.12.2}Table of Contents}{81}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.10.12.3}Vertical Skip}{81}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.10.12.4}Title}{82}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.10.13}Scanner/Parser Interface}{82}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.11}Parser}{82}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.11.1}High Level Structure}{82}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.11.2}Free Text}{83}} +\newlabel{typesetterpragma}{{3.11.2}{83}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.11.3}Typesetter Directives}{83}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.11.3.1}Section}{83}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.11.3.2}Literal Directive}{84}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.11.3.3}Emphasis Directive}{85}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.11.4}Macros}{85}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.11.4.1}Names}{86}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.11.4.2}Formal Parameter Lists}{86}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.11.5}Expressions}{86}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.11.6}Macro Calls}{86}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.11.7}Formal Parameters}{87}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.11.8}Macros are Static}{87}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.12}Analyser}{88}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.13}Tangle}{88}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.14}Weave}{89}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.14.1}Target Typesetter}{89}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.14.2}Cross Reference Numbering}{89}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.15}FunnelWeb Shell}{90}} +\newlabel{commandshell}{{3.15}{90}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.15.1}Introduction}{90}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.15.2}Return Statuses}{90}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.15.3}Command Line Length}{91}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.15.4}String Substitution}{91}} +\newlabel{stringsubstitution}{{3.15.4}{91}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.15.5}How a Command Line is Processed}{92}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.15.6}Options}{92}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {3.15.7}Shell Commands}{93}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.15.7.1}Absent}{93}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.15.7.2}Codify}{93}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.15.7.3}Compare}{93}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.15.7.4}Define}{94}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.15.7.5}Diff}{94}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.15.7.6}Diffsummary}{95}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.15.7.7}Diffzero}{95}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.15.7.8}Eneo}{95}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.15.7.9}Execute}{96}} +\newlabel{executecommand}{{3.15.7.9}{96}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.15.7.10}Exists}{96}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.15.7.11}Fixeols}{96}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.15.7.12}Fw}{97}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.15.7.13}Help}{97}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.15.7.14}Here}{98}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.15.7.15}Quit}{98}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.15.7.16}Set}{98}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.15.7.17}Show}{98}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.15.7.18}Skipto}{98}} +\newlabel{skiptocommand}{{3.15.7.18}{98}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.15.7.19}Status}{99}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.15.7.20}Tolerate}{100}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.15.7.21}Trace}{100}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.15.7.22}Write}{100}} +\@writefile{toc}{\string\contentsline\space {subsubsection}{\string\numberline\space {3.15.7.23}Writeu}{100}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.16}Concluding Remarks}{100}} +\@writefile{toc}{\string\contentsline\space {chapter}{\string\numberline\space {4}FunnelWeb Installation}{101}} +\@writefile{lof}{\string\addvspace\space {10\p@ }} +\@writefile{lot}{\string\addvspace\space {10\p@ }} +\newlabel{chapinstall}{{4}{101}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4.1}Obtaining a Copy of FunnelWeb}{101}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4.2}Establishing The Directory Tree}{102}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {4.2.1}Admin Directory}{102}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {4.2.2}Answers Directory}{102}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {4.2.3}Hackman Directory}{103}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {4.2.4}Results Directory}{103}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {4.2.5}Scripts Directory}{103}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {4.2.6}Sources Directory}{103}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {4.2.7}Tests Directory}{104}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {4.2.8}Userman Directory}{105}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4.3}Compiling FunnelWeb}{105}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4.4}Testing FunnelWeb}{105}} +\newlabel{testingfunnelweb}{{4.4}{105}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4.5}Installing FunnelWeb}{106}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4.6}Printing Manuals}{107}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4.7}Installation Problems?}{107}} +\@writefile{toc}{\string\contentsline\space {chapter}{\string\numberline\space {5}FunnelWeb Administration}{109}} +\@writefile{lof}{\string\addvspace\space {10\p@ }} +\@writefile{lot}{\string\addvspace\space {10\p@ }} +\newlabel{chapadministration}{{5}{109}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {5.1}Introduction}{109}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {5.2}The User's Commitment To FunnelWeb}{109}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {5.3}Documentation}{110}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {5.4}Registration}{110}} +\newlabel{registration}{{5.4}{110}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {5.5}Support}{110}} +\newlabel{support}{{5.5}{110}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {5.6}Copyright}{112}} +\newlabel{copyright}{{5.6}{112}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {5.7}Nowarranty}{112}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {5.8}Distribution}{113}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {5.9}Modification}{113}} +\newlabel{modification}{{5.9}{113}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {5.10}Versions}{114}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {5.11}FTP Archive and Author}{114}} +\newlabel{ftparchive}{{5.11}{114}} +\@writefile{toc}{\string\contentsline\space {chapter}{\string\numberline\space {A}Glossary}{115}} +\@writefile{lof}{\string\addvspace\space {10\p@ }} +\@writefile{lot}{\string\addvspace\space {10\p@ }} +\@writefile{toc}{\string\contentsline\space {chapter}{\string\numberline\space {B}References}{117}} +\@writefile{lof}{\string\addvspace\space {10\p@ }} +\@writefile{lot}{\string\addvspace\space {10\p@ }} +\@writefile{toc}{\string\contentsline\space {chapter}{Index}{117}} diff --git a/web/funnelAC/userman/u_manual.dvi b/web/funnelAC/userman/u_manual.dvi Binary files differnew file mode 100644 index 0000000000..36d149f69b --- /dev/null +++ b/web/funnelAC/userman/u_manual.dvi diff --git a/web/funnelAC/userman/u_manual.idx b/web/funnelAC/userman/u_manual.idx new file mode 100644 index 0000000000..5935623e5c --- /dev/null +++ b/web/funnelAC/userman/u_manual.idx @@ -0,0 +1,1020 @@ +\indexentry{Ross Williams}{1} +\indexentry{Williams Ross}{1} +\indexentry{copyright notice}{1} +\indexentry{notice copyright}{1} +\indexentry{preface}{9} +\indexentry{Donald Knuth}{9} +\indexentry{Knuth Donald}{9} +\indexentry{Knuth83}{9} +\indexentry{Web}{9} +\indexentry{GNU license}{9} +\indexentry{license GNU}{9} +\indexentry{acknowledgements}{11} +\indexentry{David Hulse}{11} +\indexentry{Hulse David}{11} +\indexentry{Ada}{11} +\indexentry{Simon Hackett}{11} +\indexentry{Hackett Simon}{11} +\indexentry{Jeremy Begg}{11} +\indexentry{Begg Jeremy}{11} +\indexentry{Barry Dwyer}{11} +\indexentry{Dwyer Barry}{11} +\indexentry{Roger Brissenden}{11} +\indexentry{Brissenden Roger}{11} +\indexentry{Donald Knuth}{11} +\indexentry{Knuth Donald}{11} +\indexentry{presentation notes}{13} +\indexentry{typesetting}{13} +\indexentry{Andrew Trevorrow}{13} +\indexentry{Trevorrow Andrew}{13} +\indexentry{OzTeX}{13} +\indexentry{Knuth84}{13} +\indexentry{Lamport86}{13} +\indexentry{TeX}{13} +\indexentry{LaTeX}{13} +\indexentry{Macintosh}{13} +\indexentry{tutorial}{15} +\indexentry{literate programming}{15} +\indexentry{literate programming}{15} +\indexentry{magic trick}{15} +\indexentry{tools literate programming}{15} +\indexentry{literate programming tools}{15} +\indexentry{hypertext}{15} +\indexentry{literate programming, facilities}{15} +\indexentry{program ordering}{15} +\indexentry{ordering program}{15} +\indexentry{Pascal}{15} +\indexentry{BSI82}{15} +\indexentry{cross referencing}{17} +\indexentry{literate programming, most significant benefit}{17} +\indexentry{Rosovsky90}{17} +\indexentry{universities}{17} +\indexentry{explaining code}{17} +\indexentry{code explaining}{17} +\indexentry{development time}{17} +\indexentry{time development}{17} +\indexentry{Knuth83}{17} +\indexentry{Knuth84}{17} +\indexentry{Smith91}{17} +\indexentry{FunnelWeb overview}{18} +\indexentry{overview FunnelWeb}{18} +\indexentry{input file}{18} +\indexentry{product files}{18} +\indexentry{documentation file}{18} +\indexentry{output files}{18} +\indexentry{simplicity}{18} +\indexentry{reliability}{18} +\indexentry{language independence}{18} +\indexentry{independence language}{18} +\indexentry{typesetter independence}{18} +\indexentry{independence typesetter}{18} +\indexentry{BSI82}{18} +\indexentry{Knuth84}{18} +\indexentry{TeX}{18} +\indexentry{portability}{18} +\indexentry{controllability}{18} +\indexentry{GNU license}{18} +\indexentry{license GNU}{18} +\indexentry{production tool}{19} +\indexentry{FunnelWeb name}{19} +\indexentry{name FunnelWeb}{19} +\indexentry{Funnel-web spider}{19} +\indexentry{spider Funnel-web}{19} +\indexentry{Sydney}{19} +\indexentry{Atrax robustus}{19} +\indexentry{ANZE}{19} +\indexentry{tiger snake}{19} +\indexentry{snake tiger}{19} +\indexentry{white pointer shark}{19} +\indexentry{shark white pointer}{19} +\indexentry{Edna Everage}{19} +\indexentry{Everage Edna}{19} +\indexentry{Barry Humphries}{19} +\indexentry{Humphries Barry}{19} +\indexentry{Humphries91}{19} +\indexentry{tutorial}{19} +\indexentry{tutorial introduction}{19} +\indexentry{introduction tutorial}{19} +\indexentry{hello world document}{20} +\indexentry{invoking FunnelWeb}{20} +\indexentry{special character}{20} +\indexentry{special sequence}{20} +\indexentry{@<}{20} +\indexentry{@>}{20} +\indexentry{@O}{20} +\indexentry{@braces}{20} +\indexentry{@+}{20} +\indexentry{simple rule}{20} +\indexentry{rule simple}{20} +\indexentry{C preprocessor}{20} +\indexentry{preprocessor C}{20} +\indexentry{@=}{20} +\indexentry{Hello Northern Hemisphere Program}{21} +\indexentry{FunnelWeb two main aspects}{21} +\indexentry{two main aspects FunnelWeb}{21} +\indexentry{Tangling}{21} +\indexentry{Weaving}{21} +\indexentry{WEB}{21} +\indexentry{tutorial macro facilities}{22} +\indexentry{macro facilities tutorial}{22} +\indexentry{tutorial simple macros}{22} +\indexentry{simple macros tutorial}{22} +\indexentry{tutorial macros simple}{22} +\indexentry{macros simple tutorial}{22} +\indexentry{@O}{22} +\indexentry{@dollar}{22} +\indexentry{order program}{22} +\indexentry{program order}{22} +\indexentry{program layout}{22} +\indexentry{layout program}{22} +\indexentry{macro bindings}{22} +\indexentry{bindings macro}{22} +\indexentry{TeX}{22} +\indexentry{number of times called}{23} +\indexentry{calls number}{23} +\indexentry{number calls}{23} +\indexentry{invocation number}{23} +\indexentry{number invocation}{23} +\indexentry{EOL suppression}{23} +\indexentry{suppression EOL}{23} +\indexentry{@-}{23} +\indexentry{@Z tutorial}{24} +\indexentry{tutorial @Z}{24} +\indexentry{@M tutorial}{24} +\indexentry{tutorial @M}{24} +\indexentry{indentation macro calls}{25} +\indexentry{macro calls indentation}{25} +\indexentry{pragma}{25} +\indexentry{WEB}{25} +\indexentry{Knuth83}{25} +\indexentry{Pascal}{25} +\indexentry{output WEB}{25} +\indexentry{WEB output}{25} +\indexentry{Knuth83}{25} +\indexentry{object code}{26} +\indexentry{additive macros}{26} +\indexentry{macros additive}{26} +\indexentry{additive macro}{26} +\indexentry{tutorial ==}{26} +\indexentry{== tutorial}{26} +\indexentry{tutorial +=}{26} +\indexentry{+= tutorial}{26} +\indexentry{data abstraction}{26} +\indexentry{abstraction data}{26} +\indexentry{Pascal}{26} +\indexentry{program layout}{28} +\indexentry{layout program}{28} +\indexentry{parameterized macros}{28} +\indexentry{macros parameterized}{28} +\indexentry{formal parameters}{28} +\indexentry{parameters formal}{28} +\indexentry{@1...}{28} +\indexentry{formal parameters}{28} +\indexentry{parameters formal}{28} +\indexentry{actual parameters}{29} +\indexentry{parameters actual}{29} +\indexentry{@(}{29} +\indexentry{@)}{29} +\indexentry{@,}{29} +\indexentry{@"}{29} +\indexentry{parameter list, absent}{29} +\indexentry{song}{29} +\indexentry{twelve bugs of christmas}{29} +\indexentry{rec.humor.funny}{29} +\indexentry{Pat Scannel}{29} +\indexentry{Scannel Pat}{29} +\indexentry{macro expansion}{30} +\indexentry{expansion macro}{30} +\indexentry{memory use of}{30} +\indexentry{use of memory}{30} +\indexentry{include files}{30} +\indexentry{files include}{30} +\indexentry{@i}{30} +\indexentry{poem camera}{30} +\indexentry{camera poem}{30} +\indexentry{animal poem}{30} +\indexentry{poem animal}{30} +\indexentry{shooting}{31} +\indexentry{special character changing}{31} +\indexentry{changing special character}{31} +\indexentry{include files recursive}{31} +\indexentry{recursive include files}{31} +\indexentry{macro libraries}{31} +\indexentry{libraries macro}{31} +\indexentry{tutorial typesetting}{32} +\indexentry{typesetting tutorial}{32} +\indexentry{documentation vs code}{32} +\indexentry{code vs documentation}{32} +\indexentry{overview typesetting}{32} +\indexentry{typesetting overview}{32} +\indexentry{macro definitions}{32} +\indexentry{directives}{32} +\indexentry{free text}{32} +\indexentry{typesetter independence}{34} +\indexentry{independence typesetter}{34} +\indexentry{typesetter independent}{34} +\indexentry{hierarchical structure}{34} +\indexentry{structure hierarchical}{34} +\indexentry{section headings}{34} +\indexentry{headings section}{34} +\indexentry{@A...}{34} +\indexentry{name section}{34} +\indexentry{section name}{34} +\indexentry{section name inheritance}{35} +\indexentry{inheritance section name}{35} +\indexentry{programmer's cheer}{35} +\indexentry{cheer programmer's}{35} +\indexentry{hacker's cheer}{35} +\indexentry{cheer hacker's}{35} +\indexentry{hacker's dictionary}{35} +\indexentry{dictionary hacker's}{35} +\indexentry{literal construct}{37} +\indexentry{emphasis construct}{37} +\indexentry{@slash}{37} +\indexentry{@braces}{37} +\indexentry{header page}{37} +\indexentry{vskip directive}{37} +\indexentry{directive vskip}{37} +\indexentry{title directive}{37} +\indexentry{directive title}{37} +\indexentry{newpage directive}{37} +\indexentry{directive newpage}{37} +\indexentry{table of contents directive}{37} +\indexentry{directive table of contents}{37} +\indexentry{comments}{37} +\indexentry{@!}{37} +\indexentry{complete example}{38} +\indexentry{example complete}{38} +\indexentry{FunnelWeb Example}{38} +\indexentry{Example FunnelWeb}{38} +\indexentry{FunnelWeb hints}{41} +\indexentry{hints FunnelWeb}{41} +\indexentry{macro names}{41} +\indexentry{names macro}{41} +\indexentry{macro identifiers}{41} +\indexentry{identifiers macro}{41} +\indexentry{quick names}{42} +\indexentry{names quick}{42} +\indexentry{empty name}{42} +\indexentry{name empty}{42} +\indexentry{quick name}{42} +\indexentry{FunnelWeb rules}{42} +\indexentry{rules FunnelWeb}{42} +\indexentry{FunnelWeb martinet}{42} +\indexentry{martinet FunnelWeb}{42} +\indexentry{trailing blanks}{42} +\indexentry{blanks trailing}{42} +\indexentry{input line length}{42} +\indexentry{length input line}{42} +\indexentry{output line length}{42} +\indexentry{length output line}{42} +\indexentry{Fortran compilers}{42} +\indexentry{compilers Fortran}{42} +\indexentry{control characters}{42} +\indexentry{characters control}{42} +\indexentry{text editors}{42} +\indexentry{editors text}{42} +\indexentry{tabs}{42} +\indexentry{invocations number}{42} +\indexentry{number invocations}{42} +\indexentry{recursion macro}{43} +\indexentry{macro recursion}{43} +\indexentry{EOL fiddling with}{43} +\indexentry{fiddling with EOL}{43} +\indexentry{end-of-line fiddling with}{43} +\indexentry{fiddling with end-of-line}{43} +\indexentry{spacing}{43} +\indexentry{fudging conditionals}{44} +\indexentry{conditionals fudging}{44} +\indexentry{Ada}{44} +\indexentry{headings strength}{46} +\indexentry{strength headings}{46} +\indexentry{typesetting strength}{46} +\indexentry{strength typesetting}{46} +\indexentry{section strength}{46} +\indexentry{strength section}{46} +\indexentry{font size}{46} +\indexentry{size font}{46} +\indexentry{FunnelWeb efficiency}{47} +\indexentry{efficiency FunnelWeb}{47} +\indexentry{efficiency notes}{47} +\indexentry{notes efficiency}{47} +\indexentry{memory}{47} +\indexentry{input files}{47} +\indexentry{files input}{47} +\indexentry{speed}{47} +\indexentry{macro expansion}{47} +\indexentry{expansion macro}{47} +\indexentry{interactive mode}{47} +\indexentry{keyboard mode}{47} +\indexentry{regression testing}{47} +\indexentry{testing regression}{47} +\indexentry{command interpreter}{47} +\indexentry{interpreter command}{47} +\indexentry{useful commands}{47} +\indexentry{commands useful}{47} +\indexentry{FunnelWeb proper}{48} +\indexentry{set command}{48} +\indexentry{command set}{48} +\indexentry{show command}{48} +\indexentry{command show}{48} +\indexentry{trace on command}{48} +\indexentry{command trace on}{48} +\indexentry{workstations}{48} +\indexentry{options setting defaults}{49} +\indexentry{setting defaults options}{49} +\indexentry{default options}{49} +\indexentry{options default}{49} +\indexentry{alias}{49} +\indexentry{fwinit.fws}{49} +\indexentry{startup script}{49} +\indexentry{script startup}{49} +\indexentry{initialization script}{49} +\indexentry{script initialization}{49} +\indexentry{make utility}{49} +\indexentry{file dependencies}{49} +\indexentry{dependencies file}{49} +\indexentry{Ada}{49} +\indexentry{D option}{49} +\indexentry{option D}{49} +\indexentry{delete output files}{49} +\indexentry{output files delete}{49} +\indexentry{suppression file}{49} +\indexentry{file suppression}{49} +\indexentry{FunnelWeb dangers}{50} +\indexentry{dangers FunnelWeb}{50} +\indexentry{FunnelWeb pitfalls}{50} +\indexentry{pitfalls FunnelWeb}{50} +\indexentry{Donald Knuth}{50} +\indexentry{Knuth Donald}{50} +\indexentry{literate programming}{50} +\indexentry{programming literate}{50} +\indexentry{spaghetti organization}{50} +\indexentry{organization spaghetti}{50} +\indexentry{stream of consciousness}{50} +\indexentry{boring organization}{50} +\indexentry{organization boring}{50} +\indexentry{random access}{50} +\indexentry{access random}{50} +\indexentry{novels}{50} +\indexentry{maintenance programmer}{50} +\indexentry{programmer maintenance}{50} +\indexentry{documentation interdependent}{50} +\indexentry{interdependent documentation}{50} +\indexentry{pavlov documentation}{51} +\indexentry{documentation pavlov}{51} +\indexentry{MIL-STD-2167A}{51} +\indexentry{2167A}{51} +\indexentry{Strunk79}{51} +\indexentry{duplicate documentation}{51} +\indexentry{documentation duplicate}{51} +\indexentry{Ada}{51} +\indexentry{over documentation}{51} +\indexentry{documentation over}{51} +\indexentry{Gries81}{51} +\indexentry{wholistic debugging}{53} +\indexentry{debugging wholistic}{53} +\indexentry{wholistic debugging}{53} +\indexentry{debugger}{53} +\indexentry{code gardening}{53} +\indexentry{gardening code}{53} +\indexentry{wholistic medicine}{53} +\indexentry{medicine wholistic}{53} +\indexentry{FunnelWeb example applications}{53} +\indexentry{example applications FunnelWeb}{53} +\indexentry{FunnelWeb applications}{53} +\indexentry{applications FunnelWeb}{53} +\indexentry{monster file postscript}{54} +\indexentry{postscript monster file}{54} +\indexentry{MacDraw}{54} +\indexentry{TeX}{54} +\indexentry{PhD thesis}{54} +\indexentry{thesis PhD}{54} +\indexentry{Macintosh}{54} +\indexentry{PostScript}{54} +\indexentry{postscript header file}{54} +\indexentry{header file postscript}{54} +\indexentry{cryptic text files}{55} +\indexentry{text files cryptic}{55} +\indexentry{Ada}{55} +\indexentry{abstract data type}{55} +\indexentry{ADT}{55} +\indexentry{package}{55} +\indexentry{DOD83}{55} +\indexentry{multiple languages}{55} +\indexentry{languages multiple}{55} +\indexentry{open systems}{55} +\indexentry{printing system}{55} +\indexentry{system printing}{55} +\indexentry{laser printer}{55} +\indexentry{printer laser}{55} +\indexentry{sharing information}{56} +\indexentry{small functions}{56} +\indexentry{functions small}{56} +\indexentry{code abstraction}{56} +\indexentry{abstraction code}{56} +\indexentry{Pascal}{57} +\indexentry{preprocessor C}{57} +\indexentry{C preprocessor}{57} +\indexentry{procedure call overhead}{57} +\indexentry{overhead procedure call}{57} +\indexentry{binding problems}{57} +\indexentry{problems binding}{57} +\indexentry{comments abuse}{57} +\indexentry{abuse comments}{57} +\indexentry{eliminating comments}{57} +\indexentry{comments eliminating}{57} +\indexentry{good old days}{57} +\indexentry{BASIC}{57} +\indexentry{REM statement}{57} +\indexentry{statement REM}{57} +\indexentry{header files}{57} +\indexentry{files header}{57} +\indexentry{C header}{57} +\indexentry{header C}{57} +\indexentry{postscript}{57} +\indexentry{sharing text}{58} +\indexentry{text sharing}{58} +\indexentry{annual report}{58} +\indexentry{report annual}{58} +\indexentry{examples documentation}{58} +\indexentry{documentation examples}{58} +\indexentry{generics fudging}{59} +\indexentry{fudging generics}{59} +\indexentry{Pascal}{59} +\indexentry{Barry Dwyer}{59} +\indexentry{Dwyer Barry}{59} +\indexentry{University Adelaide}{59} +\indexentry{Adelaide University}{59} +\indexentry{set abstraction}{59} +\indexentry{abstraction set}{59} +\indexentry{typesafe generics}{61} +\indexentry{generics typesafe}{61} +\indexentry{FunnelWeb definition}{63} +\indexentry{definition FunnelWeb}{63} +\indexentry{notation}{63} +\indexentry{EBNF syntax}{63} +\indexentry{syntax EBNF}{63} +\indexentry{terminology}{63} +\indexentry{semantic architecture}{64} +\indexentry{architecture semantic}{64} +\indexentry{FunnelWeb overview}{64} +\indexentry{overview FunnelWeb}{64} +\indexentry{execution phases}{64} +\indexentry{phases execution}{64} +\indexentry{input file}{64} +\indexentry{FunnelWeb file}{64} +\indexentry{phases}{64} +\indexentry{output files}{64} +\indexentry{journal file}{64} +\indexentry{listing file}{64} +\indexentry{documentation}{64} +\indexentry{product files}{64} +\indexentry{scanner}{64} +\indexentry{parser}{64} +\indexentry{document list}{64} +\indexentry{list document}{64} +\indexentry{macro table}{64} +\indexentry{table macro}{64} +\indexentry{analyser}{65} +\indexentry{tangle}{65} +\indexentry{weave}{65} +\indexentry{FunnelWeb proper}{65} +\indexentry{FunnelWeb program}{65} +\indexentry{diagnostics}{65} +\indexentry{diagnostics levels of}{65} +\indexentry{levels of diagnostics}{65} +\indexentry{severity}{65} +\indexentry{warning severity}{65} +\indexentry{severity warning}{65} +\indexentry{error severity}{65} +\indexentry{severity error}{65} +\indexentry{severe severity}{65} +\indexentry{severity severe}{65} +\indexentry{fatal severity}{65} +\indexentry{severity fatal}{65} +\indexentry{assertion severity}{65} +\indexentry{severity assertion}{65} +\indexentry{return status}{65} +\indexentry{status return}{65} +\indexentry{typesetter independence}{65} +\indexentry{independence typesetter}{65} +\indexentry{Kernighan88}{65} +\indexentry{typesetter directives}{66} +\indexentry{command line interface}{66} +\indexentry{interface command line}{66} +\indexentry{FunnelWeb invoking}{66} +\indexentry{invoking FunnelWeb}{66} +\indexentry{FunnelWeb running}{66} +\indexentry{running FunnelWeb}{66} +\indexentry{command line processing}{66} +\indexentry{processing command line}{66} +\indexentry{command line parsing}{66} +\indexentry{parsing command line}{66} +\indexentry{fw command verb}{66} +\indexentry{command verb fw}{66} +\indexentry{command line argument}{67} +\indexentry{argument command line}{67} +\indexentry{syntax command line}{67} +\indexentry{command line syntax}{67} +\indexentry{arguments}{67} +\indexentry{case dependence}{67} +\indexentry{dependence case}{67} +\indexentry{Unix}{67} +\indexentry{sign}{67} +\indexentry{letter}{67} +\indexentry{string}{67} +\indexentry{command line options syntax}{67} +\indexentry{syntax command line options}{67} +\indexentry{options syntax}{67} +\indexentry{syntax options}{67} +\indexentry{options}{67} +\indexentry{options}{68} +\indexentry{list options}{68} +\indexentry{options list}{68} +\indexentry{B option}{68} +\indexentry{option B}{68} +\indexentry{tracedump options}{68} +\indexentry{options tracedump}{68} +\indexentry{dump option}{68} +\indexentry{option dump}{68} +\indexentry{dump mapped file}{68} +\indexentry{mapped file dump}{68} +\indexentry{dump global line list}{68} +\indexentry{global line list dump}{68} +\indexentry{dump token list}{68} +\indexentry{token list dump}{68} +\indexentry{dump macro table}{68} +\indexentry{macro table dump}{68} +\indexentry{dump document list}{68} +\indexentry{document list dump}{68} +\indexentry{dump times}{68} +\indexentry{times dump}{68} +\indexentry{non-determinism}{68} +\indexentry{C option}{68} +\indexentry{option C}{68} +\indexentry{listing file context}{68} +\indexentry{context listing file}{68} +\indexentry{infinite context}{68} +\indexentry{context infinite}{68} +\indexentry{D option}{68} +\indexentry{option D}{68} +\indexentry{delete output option}{68} +\indexentry{option delete output}{68} +\indexentry{F option}{68} +\indexentry{option F}{68} +\indexentry{input file option}{68} +\indexentry{option input file}{68} +\indexentry{H option}{68} +\indexentry{option H}{68} +\indexentry{help option}{68} +\indexentry{option help}{68} +\indexentry{I option}{69} +\indexentry{option I}{69} +\indexentry{include file option}{69} +\indexentry{option include file}{69} +\indexentry{include file}{69} +\indexentry{file include}{69} +\indexentry{J option}{69} +\indexentry{option J}{69} +\indexentry{journal file option}{69} +\indexentry{option journal file}{69} +\indexentry{journal file}{69} +\indexentry{file journal}{69} +\indexentry{K option}{69} +\indexentry{option K}{69} +\indexentry{keyboard option}{69} +\indexentry{option keyboard}{69} +\indexentry{interactive option}{69} +\indexentry{option interactive}{69} +\indexentry{L option}{69} +\indexentry{option L}{69} +\indexentry{listing file option}{69} +\indexentry{option listing file}{69} +\indexentry{listing file}{69} +\indexentry{file listing}{69} +\indexentry{Q option}{69} +\indexentry{option Q}{69} +\indexentry{quiet option}{69} +\indexentry{option quiet}{69} +\indexentry{suppress console output}{69} +\indexentry{console output suppress}{69} +\indexentry{S option}{69} +\indexentry{option S}{69} +\indexentry{screen option}{69} +\indexentry{option screen}{69} +\indexentry{context}{69} +\indexentry{T option}{69} +\indexentry{option T}{69} +\indexentry{typeset option}{69} +\indexentry{option typeset}{69} +\indexentry{typeset file}{69} +\indexentry{file typeset}{69} +\indexentry{W option}{69} +\indexentry{option W}{69} +\indexentry{width option}{69} +\indexentry{option width}{69} +\indexentry{product file width}{69} +\indexentry{width product file}{69} +\indexentry{X option}{69} +\indexentry{option X}{69} +\indexentry{execute script option}{69} +\indexentry{option execute script}{69} +\indexentry{filename inheritance}{70} +\indexentry{inheritance filename}{70} +\indexentry{filename fields}{70} +\indexentry{fields filename}{70} +\indexentry{directory}{70} +\indexentry{name}{70} +\indexentry{extension}{70} +\indexentry{filename inheritance example}{70} +\indexentry{example filename inheritance}{70} +\indexentry{FunnelWeb startup}{70} +\indexentry{startup FunnelWeb}{70} +\indexentry{FunnelWeb initialization}{70} +\indexentry{initialization FunnelWeb}{70} +\indexentry{Action options}{70} +\indexentry{Ordinary options}{70} +\indexentry{action execution order}{71} +\indexentry{order action execution}{71} +\indexentry{initialization script}{71} +\indexentry{script initialization}{71} +\indexentry{fwinit.fws}{71} +\indexentry{scanner}{71} +\indexentry{mapper}{71} +\indexentry{file termination}{71} +\indexentry{termination file}{71} +\indexentry{line termination}{71} +\indexentry{termination line}{71} +\indexentry{unprintable characters}{71} +\indexentry{characters unprintable}{71} +\indexentry{line length}{71} +\indexentry{length line}{71} +\indexentry{special sequences}{72} +\indexentry{sequences special}{72} +\indexentry{special character}{72} +\indexentry{special sequence}{72} +\indexentry{default special character}{72} +\indexentry{special character default}{72} +\indexentry{simple sequence}{72} +\indexentry{setting special character}{74} +\indexentry{special character setting}{74} +\indexentry{special character inserting into text}{74} +\indexentry{inserting into text special character}{74} +\indexentry{arbitrary characters inserting into text}{74} +\indexentry{inserting into text arbitrary characters}{74} +\indexentry{control characters inserting into text}{74} +\indexentry{inserting into text control characters}{74} +\indexentry{@circumflex}{74} +\indexentry{Unix newline}{75} +\indexentry{comments FunnelWeb}{75} +\indexentry{FunnelWeb comments}{75} +\indexentry{@!}{75} +\indexentry{quick names}{76} +\indexentry{names quick}{76} +\indexentry{quick name}{76} +\indexentry{@hash}{76} +\indexentry{EOL markers inserting}{76} +\indexentry{inserting EOL markers}{76} +\indexentry{@+}{76} +\indexentry{EOL markers suppressing}{77} +\indexentry{suppressing EOL markers}{77} +\indexentry{@-}{77} +\indexentry{include files}{77} +\indexentry{files include}{77} +\indexentry{@i}{77} +\indexentry{input file}{77} +\indexentry{include files}{77} +\indexentry{pragmas}{78} +\indexentry{pragmas visible}{78} +\indexentry{visible pragmas}{78} +\indexentry{pragmas invisible}{78} +\indexentry{invisible pragmas}{78} +\indexentry{pragma}{78} +\indexentry{indentation macro expansion}{78} +\indexentry{macro expansion indentation}{78} +\indexentry{no indentation}{78} +\indexentry{indentation none}{78} +\indexentry{none indentation}{78} +\indexentry{blank indentation}{78} +\indexentry{indentation blank}{78} +\indexentry{blank indentation}{78} +\indexentry{input line length}{79} +\indexentry{line length input}{79} +\indexentry{maximum input line length}{79} +\indexentry{input line length maximum}{79} +\indexentry{pragma input line length}{79} +\indexentry{input line length pragma}{79} +\indexentry{maximum product file line length}{79} +\indexentry{product file line length maximum}{79} +\indexentry{pragma maximum product file line length}{79} +\indexentry{maximum product file line length pragma}{79} +\indexentry{maximum output file line length}{79} +\indexentry{output file line length maximum}{79} +\indexentry{pragma maximum output file line length}{79} +\indexentry{maximum output file line length pragma}{79} +\indexentry{typesetter pragma}{80} +\indexentry{pragma typesetter}{80} +\indexentry{typesetter independence}{80} +\indexentry{independence typesetter}{80} +\indexentry{typesetter directives}{81} +\indexentry{directives typesetter}{81} +\indexentry{inline}{81} +\indexentry{freestanding}{81} +\indexentry{new page}{81} +\indexentry{pragma new page}{81} +\indexentry{new page pragma}{81} +\indexentry{table of contents}{81} +\indexentry{contents table of}{81} +\indexentry{pragma table of contents}{81} +\indexentry{table of contents pragma}{81} +\indexentry{vertical skip}{81} +\indexentry{skip vertical}{81} +\indexentry{pragma vskip}{81} +\indexentry{vskip pragma}{81} +\indexentry{title}{82} +\indexentry{pragma title}{82} +\indexentry{title pragma}{82} +\indexentry{parser}{82} +\indexentry{text tokens}{82} +\indexentry{special tokens}{82} +\indexentry{typesetter directive tokens}{82} +\indexentry{syntax high level}{82} +\indexentry{high level syntax}{82} +\indexentry{free text}{83} +\indexentry{text free}{83} +\indexentry{Free text}{83} +\indexentry{directives}{83} +\indexentry{freestanding typesetter directives}{83} +\indexentry{inline typesetter directives}{83} +\indexentry{section constructs}{83} +\indexentry{constructs section}{83} +\indexentry{tree structure}{83} +\indexentry{structure tree}{83} +\indexentry{LaTeX}{84} +\indexentry{section name}{84} +\indexentry{name section}{84} +\indexentry{literal directive}{84} +\indexentry{directive literal}{84} +\indexentry{emphasis directive}{85} +\indexentry{directive emphasis}{85} +\indexentry{macro definition}{85} +\indexentry{definition macro}{85} +\indexentry{macro name}{85} +\indexentry{macro body}{85} +\indexentry{expression}{85} +\indexentry{macro attributes}{85} +\indexentry{attributes macro}{85} +\indexentry{@Z}{85} +\indexentry{@M}{85} +\indexentry{==}{85} +\indexentry{+=}{85} +\indexentry{additively defined}{85} +\indexentry{names}{86} +\indexentry{macro names}{86} +\indexentry{names macro}{86} +\indexentry{section names}{86} +\indexentry{names section}{86} +\indexentry{parameter lists formal}{86} +\indexentry{formal parameter lists}{86} +\indexentry{@1...}{86} +\indexentry{macro expressions}{86} +\indexentry{expressions macro}{86} +\indexentry{macro calls}{86} +\indexentry{calls macro}{86} +\indexentry{macro parameter delimiting}{87} +\indexentry{delimiting macro parameter}{87} +\indexentry{formal parameters}{87} +\indexentry{parameters formal}{87} +\indexentry{macro definition}{87} +\indexentry{definition macro}{87} +\indexentry{macro expansion}{87} +\indexentry{expansion macro}{87} +\indexentry{macros static}{87} +\indexentry{static macros}{87} +\indexentry{analyser}{88} +\indexentry{checks macro}{88} +\indexentry{macro checks}{88} +\indexentry{static analysis}{88} +\indexentry{analysis static}{88} +\indexentry{macro recursion}{88} +\indexentry{recursion macro}{88} +\indexentry{tangle}{88} +\indexentry{weave}{89} +\indexentry{typesetting}{89} +\indexentry{target typesetter}{89} +\indexentry{typesetter target}{89} +\indexentry{cross referencing}{89} +\indexentry{referencing cross}{89} +\indexentry{cross reference numbering}{89} +\indexentry{numbering cross reference}{89} +\indexentry{section numbering}{89} +\indexentry{numbering section}{89} +\indexentry{FunnelWeb command shell}{90} +\indexentry{command shell FunnelWeb}{90} +\indexentry{commands FunnelWeb}{90} +\indexentry{FunnelWeb commands}{90} +\indexentry{FunnelWeb shell}{90} +\indexentry{shell FunnelWeb}{90} +\indexentry{FunnelWeb command shell}{90} +\indexentry{uses shell}{90} +\indexentry{shell uses}{90} +\indexentry{workstation}{90} +\indexentry{errors shell}{90} +\indexentry{shell errors}{90} +\indexentry{status success}{90} +\indexentry{success status}{90} +\indexentry{status warning}{90} +\indexentry{warning status}{90} +\indexentry{status error}{90} +\indexentry{error status}{90} +\indexentry{status severe}{90} +\indexentry{severe status}{90} +\indexentry{status fatal}{90} +\indexentry{fatal status}{90} +\indexentry{status assertion}{90} +\indexentry{assertion status}{90} +\indexentry{command length}{91} +\indexentry{length command}{91} +\indexentry{string substitution}{91} +\indexentry{substitution string}{91} +\indexentry{define command}{91} +\indexentry{command define}{91} +\indexentry{command line processing}{92} +\indexentry{processing command line}{92} +\indexentry{command options}{92} +\indexentry{options command}{92} +\indexentry{default options}{92} +\indexentry{options default}{92} +\indexentry{shell commands list}{93} +\indexentry{list shell commands}{93} +\indexentry{commands shell}{93} +\indexentry{shell commands}{93} +\indexentry{command absent}{93} +\indexentry{absent command}{93} +\indexentry{command codify}{93} +\indexentry{codify command}{93} +\indexentry{command compare}{93} +\indexentry{compare command}{93} +\indexentry{command define}{94} +\indexentry{define command}{94} +\indexentry{string substitution}{94} +\indexentry{substitution string}{94} +\indexentry{command diff}{94} +\indexentry{diff command}{94} +\indexentry{file differences}{94} +\indexentry{differences file}{94} +\indexentry{command diffsummary}{95} +\indexentry{diffsummary command}{95} +\indexentry{command diffzero}{95} +\indexentry{diffzero command}{95} +\indexentry{command eneo}{95} +\indexentry{eneo command}{95} +\indexentry{command execute}{96} +\indexentry{execute command}{96} +\indexentry{command exists}{96} +\indexentry{exists command}{96} +\indexentry{command fixeols}{96} +\indexentry{fixeols command}{96} +\indexentry{non-printable characters}{96} +\indexentry{characters non-printable}{96} +\indexentry{command fw}{97} +\indexentry{fw command}{97} +\indexentry{command help}{97} +\indexentry{help command}{97} +\indexentry{command here}{98} +\indexentry{here command}{98} +\indexentry{command quit}{98} +\indexentry{quit command}{98} +\indexentry{command set}{98} +\indexentry{set command}{98} +\indexentry{command show}{98} +\indexentry{show command}{98} +\indexentry{command skipto}{98} +\indexentry{skipto command}{98} +\indexentry{command status}{99} +\indexentry{status command}{99} +\indexentry{command tolerate}{100} +\indexentry{tolerate command}{100} +\indexentry{command trace}{100} +\indexentry{trace command}{100} +\indexentry{command write}{100} +\indexentry{write command}{100} +\indexentry{command writeu}{100} +\indexentry{writeu command}{100} +\indexentry{FunnelWeb installation}{101} +\indexentry{installation FunnelWeb}{101} +\indexentry{FunnelWeb obtaining}{101} +\indexentry{obtaining FunnelWeb}{101} +\indexentry{ftp anonymous}{101} +\indexentry{anonymous ftp}{101} +\indexentry{directory tree}{102} +\indexentry{tree directory}{102} +\indexentry{admin directory}{102} +\indexentry{directory admin}{102} +\indexentry{answers directory}{102} +\indexentry{directory answers}{102} +\indexentry{correct answers}{102} +\indexentry{answers correct}{102} +\indexentry{hackman directory}{103} +\indexentry{directory hackman}{103} +\indexentry{results directory}{103} +\indexentry{directory results}{103} +\indexentry{scripts directory}{103} +\indexentry{directory scripts}{103} +\indexentry{regression testing}{103} +\indexentry{testing regression}{103} +\indexentry{sources directory}{103} +\indexentry{directory sources}{103} +\indexentry{tests directory}{104} +\indexentry{directory tests}{104} +\indexentry{userman directory}{105} +\indexentry{directory userman}{105} +\indexentry{compiling FunnelWeb}{105} +\indexentry{FunnelWeb compiling}{105} +\indexentry{testing FunnelWeb}{105} +\indexentry{FunnelWeb testing}{105} +\indexentry{installing FunnelWeb}{106} +\indexentry{FunnelWeb installing}{106} +\indexentry{FunnelWeb executable}{106} +\indexentry{executable FunnelWeb}{106} +\indexentry{printing manuals}{107} +\indexentry{manuals printing}{107} +\indexentry{problems installation}{107} +\indexentry{installation problems}{107} +\indexentry{FunnelWeb administration}{109} +\indexentry{administration FunnelWeb}{109} +\indexentry{commitment FunnelWeb}{109} +\indexentry{FunnelWeb commitment}{109} +\indexentry{ANSI}{109} +\indexentry{FunnelWeb documentation}{110} +\indexentry{documentation FunnelWeb}{110} +\indexentry{FunnelWeb registration}{110} +\indexentry{registration FunnelWeb}{110} +\indexentry{FunnelWeb support}{110} +\indexentry{support FunnelWeb}{110} +\indexentry{copyright FunnelWeb}{112} +\indexentry{FunnelWeb copyright}{112} +\indexentry{FunnelWeb license}{112} +\indexentry{license FunnelWeb}{112} +\indexentry{GNU license}{112} +\indexentry{license GNU}{112} +\indexentry{warranty}{112} +\indexentry{FunnelWeb Distribution}{113} +\indexentry{Distribution FunnelWeb}{113} +\indexentry{FunnelWeb versions}{114} +\indexentry{versions FunnelWeb}{114} +\indexentry{author contacting}{114} +\indexentry{contacting author}{114} +\indexentry{ftp archive}{114} +\indexentry{archive ftp}{114} +\indexentry{FunnelWeb archive}{114} +\indexentry{archive FunnelWeb}{114} +\indexentry{glossary}{115} +\indexentry{Analyser}{115} +\indexentry{Argument}{115} +\indexentry{Directive}{115} +\indexentry{Documentation}{115} +\indexentry{Documentation file}{115} +\indexentry{Free text}{115} +\indexentry{FunnelWeb}{115} +\indexentry{FunnelWeb file}{115} +\indexentry{FunnelWeb language}{115} +\indexentry{FunnelWeb proper}{115} +\indexentry{FW}{115} +\indexentry{Include file}{115} +\indexentry{Input file}{115} +\indexentry{Journal file}{115} +\indexentry{Listing file}{115} +\indexentry{Macro}{115} +\indexentry{Macro definition}{116} +\indexentry{Mapper}{116} +\indexentry{Option}{116} +\indexentry{Output file}{116} +\indexentry{Parser}{116} +\indexentry{Pragma}{116} +\indexentry{Printed documentation}{116} +\indexentry{Product file}{116} +\indexentry{Scanner}{116} +\indexentry{Script}{116} +\indexentry{Shell}{116} +\indexentry{Special character}{116} +\indexentry{Special sequence}{116} +\indexentry{Tangle}{116} +\indexentry{Typesetting directive}{116} +\indexentry{Weave}{116} +\indexentry{references}{117} +\indexentry{ANSI}{117} +\indexentry{ANZE}{117} +\indexentry{BSI82}{117} +\indexentry{Gries81}{117} +\indexentry{Humphries91}{117} +\indexentry{Kernighan88}{117} +\indexentry{Knuth83}{117} +\indexentry{Knuth84}{117} +\indexentry{Knuth84}{117} +\indexentry{Lamport86}{117} +\indexentry{Rosovsky90}{117} +\indexentry{Smith91}{117} +\indexentry{Strunk79}{117} +\indexentry{USDOD83}{117} diff --git a/web/funnelAC/userman/u_manual.log b/web/funnelAC/userman/u_manual.log new file mode 100644 index 0000000000..309de749d7 --- /dev/null +++ b/web/funnelAC/userman/u_manual.log @@ -0,0 +1,188 @@ +This is emTeX (tex386), Version 3.1415 [3c-beta9] (preloaded format=lplain 93.12.31) 15 APR 1994 15:04 +**&lplain u_manual +(u_manual.tex +LaTeX Version 2.09 <25 March 1992> +(d:/emtex/texinput/book.sty +Standard Document Style `book' <14 Jan 92>. +(d:/emtex/texinput/bk10.sty) +\descriptionmargin=\dimen99 +\c@part=\count79 +\c@chapter=\count80 +\c@section=\count81 +\c@subsection=\count82 +\c@subsubsection=\count83 +\c@paragraph=\count84 +\c@subparagraph=\count85 +\c@figure=\count86 +\c@table=\count87 +) (d:/emtex/texinput/titlepag.sty +Document Style Option `titlepage' -- Released 16 June 1991. +) +\@indexfile=\write3 + +Writing index file u_manual.idx +(u_manual.aux) [0 + + +] +(u_ch0.tex [1] [2 + +] (u_manual.toc [3] [4] [5] [6]) +\tf@toc=\write4 + [7] [8 + +] [9] [10 + +] +Underfull \hbox (badness 10000) in paragraph at lines 137--140 +[]\tenrm Thanks to \tenbf Barry Dwyer[][] \tenrm (\tentt dwyer@cs.adelaide.edu. +au\tenrm ) and \tenbf Roger Bris-senden[][] + +\hbox(7.5+2.5)x426.79134, glue set 5.25278 +.\hbox(0.0+0.0)x0.0 +.\tenrm T +.\tenrm h +.\tenrm a +.\tenrm n +.etc. + +[11] [12 + +] +Underfull \hbox (badness 5652) in paragraph at lines 163--169 +[]\tenbf Typesetting: \tenrm This[] doc-u-ment was pre-pared by the au-thor us- +ing An-drew Trevor- + +\hbox(6.94444+1.94444)x426.79134, glue set 3.83969 +.\hbox(0.0+0.0)x0.0 +.\tenbf T +.\kern-0.31944 +.\tenbf y +.\tenbf p +.etc. + + +Underfull \hbox (badness 1117) in paragraph at lines 163--169 +\tenrm row's[][] (\tentt akt150@cscgpo.anu.edu.au\tenrm ) im-ple-men-ta-tion (O +z-TeX[]) of the T[]X/L[]T[]X\tenbf [Knuth84][] + +\hbox(7.5+3.01385)x426.79134, glue set 2.23746 +.\tenrm r +.\tenrm o +.\kern-0.27779 +.\tenrm w +.\tenrm ' +.etc. + +) (u_ch1.tex [13] [14 + +] +Chapter 1. +[15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] +[30] [31] [32] [33] [34] [35] +Underfull \vbox (badness 4108) has occurred while \output is active +\vbox(682.86613+0.0)x426.79134, glue set 3.45125 +.\glue(\topskip) 3.05556 +.\hbox(6.94444+0.8333)x426.79134, glue set 416.29143fil +..\hbox(0.0+0.0)x0.0 +..\tentt @ +..\tentt } +..\hbox(0.0+0.0)x0.0 +..\penalty 10000 +..etc. +.\penalty 0 +.\glue(\baselineskip) 11.1667 +.\hbox(0.0+0.0)x0.0 +.etc. + + [36] +[37] [38]) (u_ch2.tex [39] [40 + +] +Chapter 2. +[41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] +[56] [57] [58] [59] +Underfull \vbox (badness 10000) has occurred while \output is active +\vbox(682.86613+0.0)x426.79134 +.\glue(\topskip) 3.88889 +.\hbox(6.11111+2.22223)x426.79134, glue set 201.0433fil +..\hbox(0.0+0.0)x0.0 +..\tentt @ +..\tentt ! +..\penalty 10000 +..\glue 5.24995 +..etc. +.\penalty 0 +.\glue(\parskip) 0.0 +.\glue(\baselineskip) 2.83333 +.etc. + + [60] +[61]) (u_ch3.tex [62] +Chapter 3. +[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]) (u_ch4.tex [100] +Chapter 4. +[101 + +] [102] [103] [104] [105] [106]) (u_ch5.tex [107] [108 + +] +Chapter 5. +[109] +Underfull \hbox (badness 10000) in paragraph at lines 163--163 +[] []\egtrm To reg-is-ter as a + +\hbox(5.46666+1.55556)x376.79134, glue set 71.60066 +.\hbox(0.0+0.0)x15.00002 +.\glue -15.00002 +.\hbox(0.0+0.0)x15.00002 +..\glue 15.00002 +..\glue -20.0 +..\glue -5.0 +..\hbox(0.0+0.0)x20.0, glue set 20.0fil +...\glue 0.0 plus 1.0fil +..\glue 5.0 +.\penalty 0 +.\egtrm T +.etc. + +[110] [111] [112] +Underfull \hbox (badness 10000) in paragraph at lines 330--340 +\tenrm FunnelWeb was + +\hbox(6.94444+0.0)x426.79134, glue set 215.12605 +.\tenrm F +.\kern-0.83334 +.\tenrm u +.\tenrm n +.\tenrm n +.etc. + +[113]) (u_cha.tex [114] +Appendix A. +[115 + +] [116] +Appendix B. +[117 + +] (u_manual.sin [118 + +] [119] [120] [121] [122] [123] [124] [125] [126]) +[127 + +]) (u_manual.aux) ) +Here is how much of TeX's memory you used: + 253 strings out of 56972 + 2338 string characters out of 225268 + 43716 words of memory out of 262143 + 2191 multiletter control sequences out of 10000 + 20390 words of font info for 77 fonts, out of 81920 for 254 + 14 hyphenation exceptions out of 607 + 16i,8n,15p,187b,243s stack positions out of 300i,100n,60p,5000b,1000s + +Output written on u_manual.dvi (128 pages, 442412 bytes). diff --git a/web/funnelAC/userman/u_manual.ps b/web/funnelAC/userman/u_manual.ps new file mode 100644 index 0000000000..e8b54fd616 --- /dev/null +++ b/web/funnelAC/userman/u_manual.ps @@ -0,0 +1,9876 @@ +%!PS-Adobe-2.0 +%%Creator: dvips 5.493 Copyright 1986, 1992 Radical Eye Software +%%Title: u_manual.dvi +%%CreationDate: Sat Feb 6 19:08:15 1993 +%%Pages: 128 +%%PageOrder: Ascend +%%BoundingBox: 0 0 612 792 +%%EndComments +%DVIPSCommandLine: dvips u_manual +%DVIPSSource: TeX output 1993.02.06:1904 +%%BeginProcSet: tex.pro +%! +/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N /X{S N} +B /TR{translate}N /isls false N /vsize 11 72 mul N /@rigin{isls{[0 -1 1 0 0 0] +concat}if 72 Resolution div 72 VResolution div neg scale isls{Resolution hsize +-72 div mul 0 TR}if Resolution VResolution vsize -72 div 1 add mul TR matrix +currentmatrix dup dup 4 get round 4 exch put dup dup 5 get round 5 exch put +setmatrix}N /@landscape{/isls true N}B /@manualfeed{statusdict /manualfeed +true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N +/IE 0 N /ctr 0 N /df-tail{/nn 8 dict N nn begin /FontType 3 N /FontMatrix +fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{ +CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn +put /ctr 0 N[}B /df{/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 +0 sf neg 0 0]N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data +dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{128 +ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 +sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type +/stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N +/cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get +S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height +sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0 +-1 -.1 ch-xoff sub ch-yoff .1 add]{ch-image}imagemask restore}B /D{/cc X dup +type /stringtype ne{]}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 +ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N} +B /I{cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin +0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul add +.99 lt{/FV}{/RV}ifelse load def pop pop}N /eop{SI restore showpage userdict +/eop-hook known{eop-hook}if}N /@start{userdict /start-hook known{start-hook} +if pop /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255 +{IE S 1 string dup 0 3 index put cvn put}for 65781.76 div /vsize X 65781.76 +div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N +/ruley 0 N /v{/ruley X /rulex X V}B /V{}B /RV statusdict begin /product where{ +pop product dup length 7 ge{0 7 getinterval dup(Display)eq exch 0 4 +getinterval(NeXT)eq or}{pop false}ifelse}{false}ifelse end{{gsave TR -.1 -.1 +TR 1 1 scale rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1 +-.1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /FV{ +gsave transform round exch round exch itransform moveto rulex 0 rlineto 0 +ruley neg rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N +/tail{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M} +B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{4 M}B +/w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{p 1 w}B /r{ +p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p a}B /bos{/SS save +N}B /eos{SS restore}B end +%%EndProcSet +TeXDict begin 40258437 52099154 1000 300 300 +(/users/onl2/coates/startup/tmp/funnelweb/userman/u_manual.dvi) +@start /Fa 13 118 df<072008E018E0306030C060C060C060C0C180C188C1884388659038E0 +0D0E7C8D12>97 D<03C00C6018E030E030006000600060004000C0004020604021801E000B0E7C +8D10>99 D<07001880304060404080FF00C000C000C0008000C040C08043003C000A0E7B8D10> +101 D<1F0006000600060006000C000C000C000C0019C01A601C201830306030603060306060C0 +60C461846188C098C0E00E177D9612>104 D<030706000000000000384C4C4C8C181818303262 +62243808177D960B>I<3E0C0C0C0C181818183030303060606060C0D0D0D0D06007177C9609> +108 D<387044984708460C8C180C180C180C18183018311861186230263038100E7D8D14>110 +D<1C702288230C230C460C060C060C060C0C180C180C100C301A601B8018001800300030003000 +FC000E147E8D12>112 D<072008A018E0306030C060C060C060C0C180C180C180438067003B00 +030003000600060006003F800B147C8D10>I<38F04518463846308C000C000C000C0018001800 +18001800300030000D0E7D8D0F>I<07800C4018E018E038001E001F8007C000C060C0E0C0C180 +C3003E000B0E7D8D0F>I<030003000600060006000600FF800C000C000C001800180018001800 +300031003100310032001C0009147D930C>I<1C0826184618461886300C300C300C3018601862 +1862186208E407380F0E7D8D13>I E /Fb 11 115 df<07E01FF03838701C701C781C7E1C7FB8 +3FF01FF00FF83BFC70FEE03EE01EE00EE00EF00C78183FF00FE00F157E9414>56 +D<FFF83FE0FFF83FE00F800E000F801C000F8030000F8060000F81C0000F8380000F8700000F8F +00000F9F00000FBF80000FE7C0000FC7C0000F83E0000F81F0000F81F8000F80F8000F807C000F +803E000F803F00FFF8FFE0FFF8FFE01B177E9620>75 D<FEFEFEE0E0E0E0E0E0E0E0E0E0E0E0E0 +E0E0E0E0E0E0E0E0E0E0E0E0E0E0FEFEFE07217D980B>91 D<FEFEFE0E0E0E0E0E0E0E0E0E0E0E +0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0EFEFEFE072180980B>93 D<0FE0003838003C1C003C1E00 +181E00001E0000FE000F9E003C1E00781E00F01E00F01E00F01E00786FC01F87C0120F7F8E14> +97 D<07F01C18380C78067007F007F007FFFFF000F0007000780038031E0603FC100F7F8E13> +101 D<0FCF001873803033807038007038007038007038003030001860002FC000200000300000 +3FF8003FFE003FFF00700780E00380E00380E00380700700380E000FF80011167F8E14>103 +D<FC0000FC00003C00003C00003C00003C00003C00003C00003C7C003D8E003E0F003E0F003C0F +003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F00FF3FC0FF3FC012177E9617>I<38 +7C7C7C3800000000FCFC3C3C3C3C3C3C3C3C3C3C3CFFFF08187F970B>I<FC7C00FD8E003E0F00 +3E0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F00FF3FC0FF3FC0120F7E +8E17>110 D<F8E0F9383A783A783C303C003C003C003C003C003C003C003C00FF80FF800D0F7E +8E11>114 D E /Fc 1 111 df<383C0044C6004702004602008E06000C06000C06000C0C00180C +00180C40181840181880300880300F00120E7F8D15>110 D E /Fd 57 123 +df<387CFEFEFE7C3807077C8610>46 D<0000180000380000380000700000700000E00000E000 +00E00001C00001C0000380000380000380000700000700000700000E00000E00001C00001C0000 +1C0000380000380000700000700000700000E00000E00001C00001C00001C00003800003800007 +00000700000700000E00000E00000E00001C00001C0000380000380000380000700000700000E0 +0000E00000C0000015317DA41C>I<00FE0007FFC00F83E01F01F03E00F83E00F87C007C7C007C +7C007CFC007CFC007EFC007EFC007EFC007EFC007EFC007EFC007EFC007EFC007EFC007EFC007E +FC007EFC007E7C007C7C007C7C007C3E00F83E00F81F01F00F83E007FFC000FE0017207E9F1C> +I<00180000780001F800FFF800FFF80001F80001F80001F80001F80001F80001F80001F80001F8 +0001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F8 +0001F80001F80001F80001F8007FFFE07FFFE013207C9F1C>I<03FC000FFF003C1FC07007E07C +07F0FE03F0FE03F8FE03F8FE01F87C01F83803F80003F80003F00003F00007E00007C0000F8000 +1F00003E0000380000700000E01801C0180380180700180E00380FFFF01FFFF03FFFF07FFFF0FF +FFF0FFFFF015207D9F1C>I<00FE0007FFC00F07E01E03F03F03F03F81F83F81F83F81F81F03F8 +1F03F00003F00003E00007C0001F8001FE0001FF000007C00001F00001F80000FC0000FC3C00FE +7E00FEFF00FEFF00FEFF00FEFF00FC7E01FC7801F81E07F00FFFC001FE0017207E9F1C>I<0000 +E00001E00003E00003E00007E0000FE0001FE0001FE00037E00077E000E7E001C7E00187E00307 +E00707E00E07E00C07E01807E03807E07007E0E007E0FFFFFEFFFFFE0007E00007E00007E00007 +E00007E00007E00007E000FFFE00FFFE17207E9F1C>I<1000201E01E01FFFC01FFF801FFF001F +FE001FF8001BC00018000018000018000018000019FC001FFF001E0FC01807E01803E00003F000 +03F00003F80003F83803F87C03F8FE03F8FE03F8FC03F0FC03F07007E03007C01C1F800FFF0003 +F80015207D9F1C>I<001F8000FFE003F07007C0F00F01F81F01F83E01F83E01F87E00F07C0000 +7C0000FC0800FC7FC0FCFFE0FD80F0FF00F8FE007CFE007CFC007EFC007EFC007EFC007E7C007E +7C007E7C007E3C007C3E007C1E00F80F00F00783E003FFC000FF0017207E9F1C>I<6000007800 +007FFFFE7FFFFE7FFFFC7FFFF87FFFF87FFFF0E00060E000C0C00180C00300C00300000600000C +00001C0000180000380000780000780000F00000F00000F00001F00001F00001F00003F00003F0 +0003F00003F00003F00003F00003F00001E00017227DA11C>I<00FE0003FFC00703E00E00F01C +00F01C00783C00783E00783F00783F80783FE0F01FF9E01FFFC00FFF8007FFC003FFE007FFF01E +7FF83C1FFC7807FC7801FEF000FEF0003EF0001EF0001EF0001CF8001C7800383C00381F01F00F +FFC001FF0017207E9F1C>I<01FE0007FF800F83E01E01F03E00F07C00F87C0078FC007CFC007C +FC007CFC007EFC007EFC007EFC007E7C00FE7C00FE3E01FE1E037E0FFE7E07FC7E00207E00007C +00007C1E007C3F00F83F00F83F00F03F01E01E03C01C0F800FFE0003F80017207E9F1C>I<0000 +70000000007000000000F800000000F800000000F800000001FC00000001FC00000003FE000000 +03FE00000003FE00000006FF000000067F0000000E7F8000000C3F8000000C3F800000183FC000 +00181FC00000381FE00000300FE00000300FE00000600FF000006007F00000E007F80000FFFFF8 +0000FFFFF800018001FC00018001FC00038001FE00030000FE00030000FE000600007F00060000 +7F00FFE00FFFF8FFE00FFFF825227EA12A>65 D<FFFFFF8000FFFFFFE00007F001F80007F000FC +0007F0007E0007F0007E0007F0007F0007F0007F0007F0007F0007F0007F0007F0007F0007F000 +7E0007F000FE0007F000FC0007F003F80007FFFFF00007FFFFF00007F001FC0007F0007E0007F0 +003F0007F0003F8007F0001F8007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007 +F0001FC007F0003F8007F0003F8007F0007F0007F001FE00FFFFFFF800FFFFFFC00022227EA128 +>I<0003FE0080001FFF818000FF01E38001F8003F8003E0001F8007C0000F800F800007801F80 +0007803F000003803F000003807F000001807E000001807E00000180FE00000000FE00000000FE +00000000FE00000000FE00000000FE00000000FE00000000FE000000007E000000007E00000180 +7F000001803F000001803F000003801F800003000F8000030007C000060003F0000C0001F80038 +0000FF00F000001FFFC0000003FE000021227DA128>I<FFFFFF8000FFFFFFF00007F003FC0007 +F0007E0007F0003F0007F0001F8007F0000FC007F00007E007F00007E007F00007F007F00003F0 +07F00003F007F00003F007F00003F807F00003F807F00003F807F00003F807F00003F807F00003 +F807F00003F807F00003F807F00003F807F00003F007F00003F007F00003F007F00007E007F000 +07E007F0000FC007F0001F8007F0003F0007F0007E0007F003FC00FFFFFFF000FFFFFF80002522 +7EA12B>I<FFFFFFFCFFFFFFFC07F000FC07F0003C07F0001C07F0000C07F0000E07F0000E07F0 +000607F0180607F0180607F0180607F0180007F0380007F0780007FFF80007FFF80007F0780007 +F0380007F0180007F0180007F0180307F0180307F0000307F0000607F0000607F0000607F0000E +07F0000E07F0001E07F0003E07F001FCFFFFFFFCFFFFFFFC20227EA125>I<FFFFFFF8FFFFFFF8 +07F001F807F0007807F0003807F0001807F0001C07F0001C07F0000C07F0000C07F0180C07F018 +0C07F0180007F0180007F0380007F0780007FFF80007FFF80007F0780007F0380007F0180007F0 +180007F0180007F0180007F0000007F0000007F0000007F0000007F0000007F0000007F0000007 +F00000FFFFE000FFFFE0001E227EA123>I<0003FE0040001FFFC0C0007F00F1C001F8003FC003 +F0000FC007C00007C00FC00003C01F800003C03F000001C03F000001C07F000000C07E000000C0 +7E000000C0FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE000000 +00FE000FFFFC7E000FFFFC7F00001FC07F00001FC03F00001FC03F00001FC01F80001FC00FC000 +1FC007E0001FC003F0001FC001FC003FC0007F80E7C0001FFFC3C00003FF00C026227DA12C>I< +FFFF83FFFEFFFF83FFFE07F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001F +C007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007FFFF +FFC007FFFFFFC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0 +001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007 +F0001FC0FFFF83FFFEFFFF83FFFE27227EA12C>I<FFFFE0FFFFE003F80003F80003F80003F800 +03F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F800 +03F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F800 +FFFFE0FFFFE013227FA115>I<FFFFE000FFFFE00007F0000007F0000007F0000007F0000007F0 +000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007 +F0000007F0000007F0000007F0000007F0000007F0001807F0001807F0001807F0001807F00038 +07F0003807F0007007F0007007F000F007F001F007F007F0FFFFFFF0FFFFFFF01D227EA122>76 +D<FFF000000FFFFFF800001FFF07F800001FE006FC000037E006FC000037E006FC000037E0067E +000067E0067E000067E0063F0000C7E0063F0000C7E0061F800187E0061F800187E0060FC00307 +E0060FC00307E0060FC00307E00607E00607E00607E00607E00603F00C07E00603F00C07E00601 +F81807E00601F81807E00601F81807E00600FC3007E00600FC3007E006007E6007E006007E6007 +E006003FC007E006003FC007E006001F8007E006001F8007E006001F8007E006000F0007E0FFF0 +0F00FFFFFFF00600FFFF30227EA135>I<FFF8001FFEFFFC001FFE07FC0000C007FE0000C006FF +0000C0067F8000C0063FC000C0061FE000C0060FE000C0060FF000C00607F800C00603FC00C006 +01FE00C00600FE00C00600FF00C006007F80C006003FC0C006001FE0C006000FF0C0060007F0C0 +060007F8C0060003FCC0060001FEC0060000FFC00600007FC00600007FC00600003FC00600001F +C00600000FC006000007C006000003C006000003C0FFF00001C0FFF00000C027227EA12C>I<00 +07FC0000003FFF800000FC07E00003F001F80007E000FC000FC0007E001F80003F001F80003F00 +3F00001F803F00001F807F00001FC07E00000FC07E00000FC0FE00000FE0FE00000FE0FE00000F +E0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE07E00000FC07F0000 +1FC07F00001FC03F00001F803F80003F801F80003F000FC0007E0007E000FC0003F001F80000FC +07E000003FFF80000007FC000023227DA12A>I<FFFFFF00FFFFFFE007F007F007F001FC07F000 +FC07F0007E07F0007E07F0007F07F0007F07F0007F07F0007F07F0007F07F0007E07F0007E07F0 +00FC07F001FC07F007F007FFFFE007FFFF0007F0000007F0000007F0000007F0000007F0000007 +F0000007F0000007F0000007F0000007F0000007F0000007F0000007F00000FFFF8000FFFF8000 +20227EA126>I<0007FC0000003FFF800000FC07E00003F001F80007E000FC000FC0007E001F80 +003F001F80003F003F00001F803F00001F807F00001FC07E00000FC07E00000FC0FE00000FE0FE +00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0 +7E00000FC07F00001FC07F00001FC03F00001F803F81F03F801F83F83F000FC70C7E0007E606FC +0003F607F80000FF07E000003FFF80000007FF80200000038020000003C020000003E0E0000003 +FFE0000001FFC0000001FFC0000000FFC0000000FF800000007F000000001E00232C7DA12A>I< +FFFFFE0000FFFFFFC00007F007F00007F001F80007F000FC0007F0007E0007F0007F0007F0007F +0007F0007F0007F0007F0007F0007F0007F0007F0007F0007E0007F000FC0007F001F80007F007 +F00007FFFFC00007FFFF800007F00FE00007F007F00007F003F80007F001FC0007F001FC0007F0 +01FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0607F000FE0607 +F000FF0CFFFF803FF8FFFF800FF027227EA12A>I<01FC0407FF8C1F03FC3C007C7C003C78001C +78001CF8000CF8000CFC000CFC0000FF0000FFE0007FFF007FFFC03FFFF01FFFF80FFFFC03FFFE +003FFE0003FF00007F00003F00003FC0001FC0001FC0001FE0001EE0001EF0003CFC003CFF00F8 +C7FFE080FF8018227DA11F>I<7FFFFFFF807FFFFFFF807E03F80F807803F807807003F8038060 +03F80180E003F801C0E003F801C0C003F800C0C003F800C0C003F800C0C003F800C00003F80000 +0003F800000003F800000003F800000003F800000003F800000003F800000003F800000003F800 +000003F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8 +00000003F800000003F800000003F8000003FFFFF80003FFFFF80022227EA127>I<FFFF803FFC +FFFF803FFC07F000018007F000018007F000018007F000018007F000018007F000018007F00001 +8007F000018007F000018007F000018007F000018007F000018007F000018007F000018007F000 +018007F000018007F000018007F000018007F000018007F000018007F000018007F000018007F0 +00018007F000018003F000030003F800030001F800060000FC000E00007E001C00003F80F80000 +0FFFE0000001FF000026227EA12B>I<FFFF0FFFF01FFEFFFF0FFFF01FFE0FF000FF0000E007F0 +007F0000C007F0007F0000C003F8007F80018003F8003F80018003FC003F80038001FC003FC003 +0001FC003FC0030000FE007FE0060000FE006FE0060000FF006FE00600007F00C7F00C00007F00 +C7F00C00007F80C7F81C00003F8183F81800003F8183F81800001FC383FC3000001FC301FC3000 +001FE301FC3000000FE600FE6000000FE600FE6000000FF600FFE0000007FC007FC0000007FC00 +7FC0000003FC007F80000003F8003F80000003F8003F80000001F0001F00000001F0001F000000 +00F0001E00000000E0000E00000000E0000E000037227FA13A>87 D<07FC001FFF803F07C03F03 +E03F01E03F01F01E01F00001F00001F0003FF003FDF01FC1F03F01F07E01F0FC01F0FC01F0FC01 +F0FC01F07E02F07E0CF81FF87F07E03F18167E951B>97 D<FF000000FF0000001F0000001F0000 +001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0F +E0001F3FF8001FF07C001F801E001F001F001F000F801F000F801F000FC01F000FC01F000FC01F +000FC01F000FC01F000FC01F000FC01F000FC01F000F801F001F801F801F001FC03E001EE07C00 +1C3FF800180FC0001A237EA21F>I<00FF8007FFE00F83F01F03F03E03F07E03F07C01E07C0000 +FC0000FC0000FC0000FC0000FC0000FC00007C00007E00007E00003E00301F00600FC0E007FF80 +00FE0014167E9519>I<0001FE000001FE0000003E0000003E0000003E0000003E0000003E0000 +003E0000003E0000003E0000003E0000003E0000003E0001FC3E0007FFBE000F81FE001F007E00 +3E003E007E003E007C003E00FC003E00FC003E00FC003E00FC003E00FC003E00FC003E00FC003E +00FC003E007C003E007C003E003E007E001E00FE000F83BE0007FF3FC001FC3FC01A237EA21F> +I<00FE0007FF800F87C01E01E03E01F07C00F07C00F8FC00F8FC00F8FFFFF8FFFFF8FC0000FC00 +00FC00007C00007C00007E00003E00181F00300FC07003FFC000FF0015167E951A>I<003F8000 +FFC001E3E003C7E007C7E00F87E00F83C00F80000F80000F80000F80000F80000F8000FFFC00FF +FC000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F +80000F80000F80000F80000F80000F80007FF8007FF80013237FA211>I<03FC1E0FFF7F1F0F8F +3E07CF3C03C07C03E07C03E07C03E07C03E07C03E03C03C03E07C01F0F801FFF0013FC00300000 +3000003800003FFF801FFFF00FFFF81FFFFC3800FC70003EF0001EF0001EF0001EF0001E78003C +7C007C3F01F80FFFE001FF0018217E951C>I<FF000000FF0000001F0000001F0000001F000000 +1F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F07E0001F1FF8 +001F307C001F403C001F803E001F803E001F003E001F003E001F003E001F003E001F003E001F00 +3E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E00FFE1FFC0FF +E1FFC01A237EA21F>I<1C003E007F007F007F003E001C000000000000000000000000000000FF +00FF001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00 +FFE0FFE00B247EA310>I<FF000000FF0000001F0000001F0000001F0000001F0000001F000000 +1F0000001F0000001F0000001F0000001F0000001F0000001F00FF801F00FF801F0038001F0060 +001F01C0001F0380001F0700001F0E00001F1C00001F7E00001FFF00001FCF00001F0F80001F07 +C0001F03E0001F01E0001F01F0001F00F8001F007C001F003C00FFE0FFC0FFE0FFC01A237EA21E +>107 D<FF00FF001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F +001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00FFE0FFE00B237EA2 +10>I<FF07F007F000FF1FFC1FFC001F303E303E001F403E403E001F801F801F001F801F801F00 +1F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F +001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00 +1F001F001F00FFE0FFE0FFE0FFE0FFE0FFE02B167E9530>I<FF07E000FF1FF8001F307C001F40 +3C001F803E001F803E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F +003E001F003E001F003E001F003E001F003E001F003E001F003E00FFE1FFC0FFE1FFC01A167E95 +1F>I<00FE0007FFC00F83E01E00F03E00F87C007C7C007C7C007CFC007EFC007EFC007EFC007E +FC007EFC007EFC007E7C007C7C007C3E00F81F01F00F83E007FFC000FE0017167E951C>I<FF0F +E000FF3FF8001FF07C001F803E001F001F001F001F801F001F801F000FC01F000FC01F000FC01F +000FC01F000FC01F000FC01F000FC01F000FC01F001F801F001F801F803F001FC03E001FE0FC00 +1F3FF8001F0FC0001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000 +00FFE00000FFE000001A207E951F>I<00FE030007FF87000FC1C7001F006F003F003F007E003F +007E001F007C001F00FC001F00FC001F00FC001F00FC001F00FC001F00FC001F00FC001F007E00 +1F007E001F003E003F001F007F000FC1DF0007FF9F0001FC1F0000001F0000001F0000001F0000 +001F0000001F0000001F0000001F0000001F000000FFE00000FFE01B207E951E>I<FE1F00FE3F +C01E67E01EC7E01E87E01E87E01F83C01F00001F00001F00001F00001F00001F00001F00001F00 +001F00001F00001F00001F00001F0000FFF000FFF00013167E9517>I<0FF3003FFF00781F0060 +0700E00300E00300F00300FC00007FE0007FF8003FFE000FFF0001FF00000F80C00780C00380E0 +0380E00380F00700FC0E00EFFC00C7F00011167E9516>I<018000018000018000018000038000 +0380000780000780000F80003F8000FFFF00FFFF000F80000F80000F80000F80000F80000F8000 +0F80000F80000F80000F80000F80000F81800F81800F81800F81800F81800F830007C30003FE00 +00F80011207F9F16>I<FF01FE00FF01FE001F003E001F003E001F003E001F003E001F003E001F +003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E00 +1F007E001F00FE000F81BE0007FF3FC001FC3FC01A167E951F>I<FFE01FE0FFE01FE00F800600 +0F8006000FC00E0007C00C0007E01C0003E0180003E0180001F0300001F0300000F8600000F860 +00007CC000007CC000007FC000003F8000003F8000001F0000001F0000000E0000000E00001B16 +7F951E>I<FFE7FF07F8FFE7FF07F81F007800C00F807801800F807C01800F807C018007C07E03 +0007C0DE030007E0DE070003E0DF060003E18F060001F18F0C0001F38F8C0001FB079C0000FB07 +D80000FE03D800007E03F000007E03F000007C01F000003C01E000003800E000001800C0002516 +7F9528>I<FFE07FC0FFE07FC00F801C0007C0380003E0700003F0600001F8C00000F98000007F +8000003F0000001F0000001F8000003FC0000037C0000063E00000C1F00001C0F8000380FC0007 +007E000E003E00FF80FFE0FF80FFE01B167F951E>I<FFE01FE0FFE01FE00F8006000F8006000F +C00E0007C00C0007E01C0003E0180003E0180001F0300001F0300000F8600000F86000007CC000 +007CC000007FC000003F8000003F8000001F0000001F0000000E0000000E0000000C0000000C00 +000018000078180000FC380000FC300000FC60000069C000007F8000001F0000001B207F951E> +I<7FFFF07FFFF07C03E07007C0600FC0E01F80C01F00C03E00C07E0000FC0000F80001F00003F0 +3007E03007C0300F80701F80703F00603E00E07C03E0FFFFE0FFFFE014167E9519>I +E /Fe 20 118 df<60F0F0600404798312>46 D<FFFEFFFE7FFE0000000000007FFEFFFEFFFE0F +097F8E12>61 D<03E007F01E18381C30FC71FE739EE30EE70EE70EE70EE70EE30C739C71F830F0 +38001E0E07FE03F80F147F9312>64 D<7FFEFFFEE38EE38EE38E03800380038003800380038003 +800380038003800380038003801FF01FF00F147F9312>84 D<C000E000E0007000700038003800 +1C001C001C000E000E00070007000380038001C001C001C000E000E0007000700038003800180D +1A7E9612>92 D<3F807FC070E0207000700FF03FF07870E070E070E07070F03FFE1F3E0F0E7E8D +12>97 D<F800F80038003800380038003BE03FF03C38381C380C380E380E380E380E380C381C3C +383FF01BC00F147F9312>I<00F800F8003800380038003807B81FF8387870386038E038E038E0 +38E0386038707838781FFE0FBE0F147F9312>100 D<07801FE0387070706038E038FFF8FFF8E0 +006000703838381FF007C00D0E7E8D12>I<F800F800380038003800380039E03FF03E383C3838 +383838383838383838383838383838FE3EFE3E0F147F9312>104 D<06000F000F000600000000 +000000FF00FF000700070007000700070007000700070007000700FFF0FFF00C157D9412>I<FF +00FF000700070007000700070007000700070007000700070007000700070007000700FFF8FFF8 +0D147E9312>108 D<F71C00FFBE0079E70079E70071C70071C70071C70071C70071C70071C700 +71C70071C700F9E780F8E380110E808D12>I<F9E0FFF03E383C38383838383838383838383838 +38383838FE3EFE3E0F0E7F8D12>I<0F803FE038E07070E038E038E038E038E038F078707038E0 +3FE00F800D0E7E8D12>I<FBE0FFF03C38381C380C380E380E380E380E380C381C3C383FF03BC0 +38003800380038003800FE00FE000F157F8D12>I<FCF8FDFC1F1C1E081E001C001C001C001C00 +1C001C001C00FFC0FFC00E0E7E8D12>114 D<1FF03FF06070C070E0007F003FE00FF000786018 +E018F030FFE0DFC00D0E7E8D12>I<06000E000E000E007FF8FFF80E000E000E000E000E000E00 +0E000E380E380E3807F003C00D127F9112>I<F8F8F8F838383838383838383838383838383838 +383838781FFE0FBE0F0E7F8D12>I E /Ff 6 55 df<0C003C00CC000C000C000C000C000C000C +000C000C000C000C000C000C00FF8009107E8F0F>49 D<1F00618040C08060C0600060006000C0 +0180030006000C00102020207FC0FFC00B107F8F0F>I<1F00218060C060C000C0008001800F00 +008000400060C060C060804060801F000B107F8F0F>I<0300030007000F000B00130033002300 +4300C300FFE003000300030003001FE00B107F8F0F>I<20803F002C002000200020002F003080 +2040006000600060C06080C061801F000B107F8F0F>I<0780184030C060C06000C000CF00F080 +E040C060C060C060406060C030801F000B107F8F0F>I E /Fg 6 55 df<0C001C00EC000C000C +000C000C000C000C000C000C000C000C000C000C000C000C000C00FFC00A137D9211>49 +D<1F0060C06060F070F030603000700070006000C001C00180020004000810101020207FE0FFE0 +0C137E9211>I<0FC030707038703870380038003000E00FC0007000380018001C601CF01CF018 +E03860701FC00E137F9211>I<006000E000E00160026006600C600860106020606060C060FFFC +0060006000600060006003FC0E137F9211>I<60607FC07F8044004000400040004F0070C040E0 +006000700070E070E070E06040E021C01F000C137E9211>I<07C00C201070207060006000C000 +CF00D0C0E060C020C030C030C03040306020206010C00F000C137E9211>I +E /Fh 60 123 df<00FC000782000E07001C07001C02001C00001C00001C00001C0000FFFF001C +07001C07001C07001C07001C07001C07001C07001C07001C07001C07001C07001C0700FF1FE013 +17809614>12 D<60C0F1E0F1E070E01020102020402040408040800B0A7F9612>34 +D<1C00183200186180706161E0E09E60E080C0E08180E08180E08300E08300610600610C00320C +001C18380030640030C20060C200C1C100C1C10181C10181C10301C10601C10600C20C00C21800 +64080038181B7E981D>37 D<60F0F070101020204040040A7D960A>39 D<0102040C1818303070 +606060E0E0E0E0E0E0E0E0E0E060606070303018180C04020108227D980E>I<8040203018180C +0C0E060606070707070707070707070606060E0C0C18183020408008227E980E>I<60F0F07010 +1020204040040A7D830A>44 D<60F0F06004047D830A>46 D<07C018303018701C600C600CE00E +E00EE00EE00EE00EE00EE00EE00EE00E600C600C701C30181C7007C00F157F9412>48 +D<03000700FF000700070007000700070007000700070007000700070007000700070007000700 +07007FF00C157E9412>I<0F8030E040708030C038E0384038003800700070006000C001800300 +06000C08080810183FF07FF0FFF00D157E9412>I<0FE030306018701C701C001C001800380060 +07E000300018000C000E000EE00EE00EC00C401830300FE00F157F9412>I<20303FE03FC02400 +20002000200020002F8030E020700030003800384038E038E0388030406020C01F000D157E9412 +>53 D<01F00608080C181C301C70006000E000E3E0EC30F018F00CE00EE00EE00E600E600E300C +3018183007C00F157F9412>I<40007FFE7FFC7FF8C00880108020004000800080010001000300 +0200060006000E000E000E000E000E0004000F167E9512>I<60F0F06000000000000060F0F060 +040E7D8D0A>58 D<001000003800003800003800005C00005C00005C00008E00008E00008E0001 +070001070003078002038002038007FFC00401C00401C00800E00800E01800E03800F0FE03FE17 +177F961A>65 D<FFFE001C03801C00E01C00601C00701C00701C00701C00701C00E01C01C01FFF +801FFFC01C00E01C00701C00301C00381C00381C00381C00381C00701C00E01C01C0FFFF001517 +7F9619>I<00FC100383300E00B01C0070380030300030700010600010E00010E00000E00000E0 +0000E00000E00000E000106000107000103000203800201C00400E008003830000FC0014177E96 +19>I<FFFFE01C00E01C00601C00201C00101C00101C00101C04001C04001C04001C0C001FFC00 +1C0C001C04001C04081C04081C00081C00181C00101C00101C00301C00F0FFFFF015177F9618> +69 D<FFFFE01C00E01C00601C00201C00101C00101C00101C04001C04001C04001C0C001FFC00 +1C0C001C04001C04001C04001C00001C00001C00001C00001C00001C0000FFC00014177F9617> +I<FF83FE1C00701C00701C00701C00701C00701C00701C00701C00701C00701C00701FFFF01C00 +701C00701C00701C00701C00701C00701C00701C00701C00701C0070FF83FE17177F961A>72 +D<FFE00E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00 +0E000E000E00FFE00B177F960D>I<FF80FE1C00781C00601C00401C00801C01001C06001C0800 +1C10001C38001C78001C9C001D0E001E0E001C07001C03801C01C01C01C01C00E01C00701C0078 +1C007CFF80FF18177F961B>75 D<FFC0001C00001C00001C00001C00001C00001C00001C00001C +00001C00001C00001C00001C00001C00001C00201C00201C00201C00601C00601C00401C00C01C +03C0FFFFC013177F9616>I<FC00FE1E00381F001017001013801011C01011C01010E010107010 +103810103810101C10100E10100F101007101003901001D01001D01000F0100070100030380030 +FE001017177F961A>78 D<00FC000303000E01C01C00E0380070300030700038600018E0001CE0 +001CE0001CE0001CE0001CE0001CE0001C7000387000383000303800701C00E00E01C003030000 +FC0016177E961B>I<FFFE001C03801C00C01C00601C00701C00701C00701C00701C00601C00C0 +1C03801FFE001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0000FF8000 +14177F9618>I<FFFC001C03801C00C01C00E01C00701C00701C00701C00701C00E01C00C01C03 +801FFE001C07801C01C01C00E01C00E01C00E01C00E01C00E01C00E11C00E11C0072FF803C1817 +7F961A>82 D<0FC4302C601C400CC004C004C004E00070007F003FE00FF801FC001C000E000680 +0680068006C004E008D81087E00F177E9614>I<7FFFF860381840380840380880380480380480 +380400380000380000380000380000380000380000380000380000380000380000380000380000 +380000380000380007FFC016177F9619>I<FF07FC3F803C01E00E001C00E004001C00E004001C +017004000E017008000E017008000E023808000702381000070238100007041C100003841C2000 +03841C200003880E200001C80E400001C80E400001D80F400000F007800000F007800000F00780 +0000600300000060030000006003000021177F9624>87 D<FF83FC1F01E00E0080070080078100 +03820001C20001E40000E800007800007800003800007C00005E00008E00018700010780020380 +0601C00401E00C00E01C00F0FF03FE17177F961A>I<FFC03F801E001C000F0008000700100007 +8030000380200001C0400001E0400000E0800000F1800000710000003A0000003E0000001C0000 +001C0000001C0000001C0000001C0000001C0000001C0000001C0000001C000000FF8000191780 +961A>I<204020404080408081008100E1C0F1E0F1E060C00B0A7B9612>92 +D<1FC0386038301038003803F81E3830387038E039E039E07970FF1F1E100E7F8D12>97 +D<FC00001C00001C00001C00001C00001C00001C00001C00001C00001CF8001F06001C03001C03 +801C01801C01C01C01C01C01C01C01C01C01801C03801C03001B0E0010F8001217809614>I<07 +F01838303870106000E000E000E000E000600070083008183007C00D0E7F8D10>I<007E00000E +00000E00000E00000E00000E00000E00000E00000E0007CE001C3E00300E00700E00600E00E00E +00E00E00E00E00E00E00600E00700E00301E00182E0007CFC012177F9614>I<0FC01860303070 +38E018FFF8E000E000E000600070083010183007C00D0E7F8D10>I<03E006700E701C201C001C +001C001C001C00FF801C001C001C001C001C001C001C001C001C001C001C001C00FF800C178096 +0B>I<0F9E18E33060707070707070306018C02F80200060003FE03FF83FFC600EC006C006C006 +600C38380FE010157F8D12>I<FC00001C00001C00001C00001C00001C00001C00001C00001C00 +001C7C001D8E001E07001C07001C07001C07001C07001C07001C07001C07001C07001C07001C07 +00FF9FE01317809614>I<183C3C1800000000007C1C1C1C1C1C1C1C1C1C1C1C1CFF081780960A> +I<FC00001C00001C00001C00001C00001C00001C00001C00001C00001C3F801C1C001C18001C20 +001C40001CC0001FE0001CF0001C70001C78001C3C001C1E001C1E00FF3FC01217809613>107 +D<FC001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C00 +1C001C001C00FF80091780960A>I<FC7C1F001D8E63801E0781C01C0701C01C0701C01C0701C0 +1C0701C01C0701C01C0701C01C0701C01C0701C01C0701C01C0701C0FF9FE7F81D0E808D1E>I< +FC7C001D8E001E07001C07001C07001C07001C07001C07001C07001C07001C07001C07001C0700 +FF9FE0130E808D14>I<07C018303018600C600CE00EE00EE00EE00EE00E701C3018183007C00F +0E7F8D12>I<FCF8001F0E001C03001C03801C01801C01C01C01C01C01C01C01C01C01801C0380 +1C07001F0E001CF8001C00001C00001C00001C00001C0000FF80001214808D14>I<07C2001C26 +00381E00700E00600E00E00E00E00E00E00E00E00E00600E00700E00301E001C2E0007CE00000E +00000E00000E00000E00000E00007FC012147F8D13>I<FCF01D381E381C101C001C001C001C00 +1C001C001C001C001C00FF800D0E808D0E>I<1F4060C0C040C040E000FF007F801FC001E08060 +8060C060E0C09F000B0E7F8D0E>I<080008000800180018003800FF8038003800380038003800 +3800380038403840384038401C800F000A147F930E>I<FC3F001C07001C07001C07001C07001C +07001C07001C07001C07001C07001C07001C0F000E170003E7E0130E808D14>I<FE1F3C0E3C0C +1C081C080E100E100720072003C003C003C001800180100E7F8D13>I<FCFE7C3838383838101C +3C201C3C201C4C200E4E400E4E400E8640078780078780070380030300030300160E7F8D19>I< +FE3F3C181C100E20074007C0038001C002E004F008701838383CFC7F100E7F8D13>I<FE1F3C0E +3C0C1C081C080E100E100720072003C003C003C00180018001000100E200E200A400780010147F +8D13>I<FFF0C0E080E081C08380878007000E001E081C08381870107030FFF00D0E7F8D10>I +E /Fi 57 122 df<0001FF0000001FFFC000007F80F00000FC00F80001F801F80003F803FC0007 +F003FC0007F003FC0007F003FC0007F001F80007F000F00007F000000007F000000007F0000000 +07F0000000FFFFFFFC00FFFFFFFC00FFFFFFFC0007F001FC0007F001FC0007F001FC0007F001FC +0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001 +FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F0 +01FC0007F001FC007FFF1FFFC07FFF1FFFC07FFF1FFFC0222A7FA926>12 +D<0001FF803FE000001FFFE3FFF800007F80FFF01E0000FE007F801F0001F800FF003F0003F801 +FF007F8007F001FE007F8007F001FE007F8007F001FE007F8007F000FE003F0007F000FE001E00 +07F000FE00000007F000FE00000007F000FE00000007F000FE000000FFFFFFFFFFFF80FFFFFFFF +FFFF80FFFFFFFFFFFF8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007 +F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE00 +3F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007F0 +00FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F +807FFF0FFFE3FFF87FFF0FFFE3FFF87FFF0FFFE3FFF8352A7FA939>14 D<1C007F007F00FF80FF +C0FFC07FC07FC01CC000C000C00180018001800300030006000C001800300020000A157BA913> +39 D<1C003E007F00FF80FF80FF807F003E001C0009097B8813>46 D<003F800001FFF00007E0 +FC000FC07E001F803F001F803F003F001F803F001F807F001FC07F001FC07F001FC07F001FC0FF +001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0 +FF001FE0FF001FE0FF001FE0FF001FE0FF001FE07F001FC07F001FC07F001FC07F001FC03F001F +803F001F801F803F001F803F000FC07E0007E0FC0001FFF000003F80001B277DA622>48 +D<000E00001E00007E0007FE00FFFE00FFFE00F8FE0000FE0000FE0000FE0000FE0000FE0000FE +0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE +0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE007FFFFE7FFFFE7FFF +FE17277BA622>I<00FF800003FFF0000FFFFC001F03FE003800FF007C007F80FE003FC0FF003F +C0FF003FE0FF001FE0FF001FE07E001FE03C003FE000003FE000003FC000003FC000007F800000 +7F000000FE000000FC000001F8000003F0000003E00000078000000F0000001E0000003C00E000 +7000E000E000E001C001C0038001C0070001C00FFFFFC01FFFFFC03FFFFFC07FFFFFC0FFFFFF80 +FFFFFF80FFFFFF801B277DA622>I<007F800003FFF00007FFFC000F81FE001F00FF003F80FF00 +3F807F803F807F803F807F801F807F800F007F800000FF000000FF000000FE000001FC000001F8 +000007F00000FFC00000FFF0000001FC0000007E0000007F0000007F8000003FC000003FC00000 +3FE000003FE03C003FE07E003FE0FF003FE0FF003FE0FF003FC0FF007FC07E007F807C007F003F +01FE001FFFFC0007FFF00000FF80001B277DA622>I<00000E0000001E0000003E0000007E0000 +00FE000000FE000001FE000003FE0000077E00000E7E00000E7E00001C7E0000387E0000707E00 +00E07E0000E07E0001C07E0003807E0007007E000E007E000E007E001C007E0038007E0070007E +00E0007E00FFFFFFF8FFFFFFF8FFFFFFF80000FE000000FE000000FE000000FE000000FE000000 +FE000000FE000000FE00007FFFF8007FFFF8007FFFF81D277EA622>I<0C0003000F803F000FFF +FE000FFFFC000FFFF8000FFFF0000FFFE0000FFFC0000FFE00000E0000000E0000000E0000000E +0000000E0000000E0000000E7FC0000FFFF8000F80FC000E003E000C003F0000001F8000001FC0 +00001FC000001FE000001FE018001FE07C001FE0FE001FE0FE001FE0FE001FE0FE001FC0FC001F +C078003F8078003F803C007F001F01FE000FFFF80003FFF00000FF80001B277DA622>I<0007F0 +00003FFC0000FFFE0001FC0F0003F01F8007E03F800FC03F801FC03F801F803F803F801F003F80 +00007F0000007F0000007F000000FF000000FF0FC000FF3FF800FF707C00FFC03E00FFC03F00FF +801F80FF801FC0FF001FC0FF001FE0FF001FE0FF001FE07F001FE07F001FE07F001FE07F001FE0 +3F001FE03F001FC01F801FC01F803F800FC03F0007E07E0003FFFC0000FFF000003FC0001B277D +A622>I<380000003E0000003FFFFFF03FFFFFF03FFFFFF07FFFFFE07FFFFFC07FFFFF807FFFFF +0070000E0070000E0070001C00E0003800E0007000E000E0000000E0000001C000000380000007 +800000078000000F0000000F0000001F0000001F0000003F0000003E0000003E0000007E000000 +7E0000007E0000007E000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 +00FE0000007C0000003800001C297CA822>I<003FC00001FFF00003FFFC0007C07E000F003F00 +1E001F001E000F803E000F803E000F803F000F803F000F803FC00F003FF01F001FFC1E001FFE3C +000FFFF80007FFE00003FFF80001FFFC0001FFFE0007FFFF000F0FFF801E03FFC03C01FFC07C00 +7FE078001FE0F80007E0F80007E0F80003E0F80003E0F80003E0F80003C07C0003C07C0007803F +000F001FC03E000FFFFC0003FFF800007FC0001B277DA622>I<007F800001FFF00007FFF8000F +E0FC001F807E003F803F007F003F007F001F80FF001F80FF001FC0FF001FC0FF001FC0FF001FE0 +FF001FE0FF001FE0FF001FE07F001FE07F003FE03F003FE01F807FE00F807FE007C1DFE003FF9F +E0007E1FE000001FE000001FC000001FC000001FC000003F801F003F803F803F003F803F003F80 +7E003F807C001F01F8001E03F0000FFFE00007FF800001FE00001B277DA622>I<01FF000FFFE0 +1E03F03801F87801FCFC01FEFE01FEFE01FEFE01FE7C01FE3801FC0003F80007F00007C0000F80 +001F00001E00003C00003800003800007800007000007000007000007000007000007000000000 +00000000000000000000000000000000700000F80001FC0003FE0003FE0003FE0001FC0000F800 +007000172A7CA920>63 D<000003800000000007C00000000007C0000000000FE0000000000FE0 +000000000FE0000000001FF0000000001FF0000000003FF8000000003FF8000000003FF8000000 +0073FC0000000073FC00000000F3FE00000000E1FE00000000E1FE00000001C0FF00000001C0FF +00000003C0FF80000003807F80000007807FC0000007003FC0000007003FC000000E003FE00000 +0E001FE000001E001FF000001C000FF000001FFFFFF000003FFFFFF800003FFFFFF80000780007 +FC0000700003FC0000700003FC0000E00001FE0000E00001FE0001E00001FF0001C00000FF0001 +C00000FF00FFFE001FFFFEFFFE001FFFFEFFFE001FFFFE2F297EA834>65 +D<00003FF001800003FFFE0380000FFFFF8780003FF007DF8000FF8001FF8001FE00007F8003FC +00003F8007F000001F800FF000000F801FE0000007801FE0000007803FC0000007803FC0000003 +807FC0000003807F80000003807F8000000000FF8000000000FF8000000000FF8000000000FF80 +00000000FF8000000000FF8000000000FF8000000000FF8000000000FF80000000007F80000000 +007F80000000007FC0000003803FC0000003803FC0000003801FE0000003801FE0000007000FF0 +0000070007F000000E0003FC00001E0001FE00003C0000FF8000F800003FF007E000000FFFFFC0 +000003FFFF000000003FF8000029297CA832>67 D<FFFFFFF80000FFFFFFFF8000FFFFFFFFE000 +03FC001FF80003FC0007FC0003FC0001FE0003FC0000FF0003FC00007F8003FC00003FC003FC00 +001FC003FC00001FE003FC00001FE003FC00000FF003FC00000FF003FC00000FF003FC00000FF0 +03FC00000FF803FC00000FF803FC00000FF803FC00000FF803FC00000FF803FC00000FF803FC00 +000FF803FC00000FF803FC00000FF803FC00000FF803FC00000FF003FC00000FF003FC00000FF0 +03FC00001FE003FC00001FE003FC00001FC003FC00003FC003FC00007F8003FC00007F0003FC00 +01FE0003FC0003FC0003FC001FF800FFFFFFFFE000FFFFFFFF8000FFFFFFFC00002D297DA835> +I<FFFFFFFFE0FFFFFFFFE0FFFFFFFFE003FC001FE003FC0007F003FC0001F003FC0001F003FC00 +00F003FC00007003FC00007003FC00007003FC01C07803FC01C03803FC01C03803FC01C03803FC +03C00003FC03C00003FC0FC00003FFFFC00003FFFFC00003FFFFC00003FC0FC00003FC03C00003 +FC03C00003FC01C00E03FC01C00E03FC01C00E03FC01C01C03FC00001C03FC00001C03FC00001C +03FC00003C03FC00003803FC00007803FC0000F803FC0001F803FC0003F803FC001FF8FFFFFFFF +F0FFFFFFFFF0FFFFFFFFF027297DA82D>I<FFFFFFFFC0FFFFFFFFC0FFFFFFFFC003FC003FC003 +FC000FE003FC0003E003FC0001E003FC0001E003FC0000E003FC0000E003FC0000E003FC0000F0 +03FC03807003FC03807003FC03807003FC03800003FC07800003FC07800003FC1F800003FFFF80 +0003FFFF800003FFFF800003FC1F800003FC07800003FC07800003FC03800003FC03800003FC03 +800003FC03800003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC +00000003FC00000003FC000000FFFFFC0000FFFFFC0000FFFFFC000024297DA82B>I<FFFFF01F +FFFEFFFFF01FFFFEFFFFF01FFFFE03FC00007F8003FC00007F8003FC00007F8003FC00007F8003 +FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC0000 +7F8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FFFFFFFF8003FFFFFFFF8003 +FFFFFFFF8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC0000 +7F8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003 +FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F80FFFFF01FFFFEFFFFF01F +FFFEFFFFF01FFFFE2F297DA836>72 D<FFFFFCFFFFFCFFFFFC01FE0001FE0001FE0001FE0001FE +0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE +0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE +0001FE0001FE0001FE0001FE00FFFFFCFFFFFCFFFFFC16297EA81A>I<FFFFFC0000FFFFFC0000 +FFFFFC000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC0000 +0003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00 +000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC0001C003FC +0001C003FC0001C003FC0001C003FC0003C003FC00038003FC00038003FC00078003FC00078003 +FC000F8003FC000F8003FC001F8003FC007F8003FC01FF00FFFFFFFF00FFFFFFFF00FFFFFFFF00 +22297DA829>76 D<FFFE0000001FFFC0FFFE0000001FFFC0FFFF0000003FFFC003FF0000003FF0 +0003FF0000003FF00003BF80000077F00003BF80000077F000039FC00000E7F000039FC00000E7 +F000038FE00001C7F000038FE00001C7F0000387F0000387F0000387F0000387F0000387F00003 +87F0000383F8000707F0000383F8000707F0000381FC000E07F0000381FC000E07F0000380FE00 +1C07F0000380FE001C07F0000380FF003807F00003807F003807F00003807F003807F00003803F +807007F00003803F807007F00003801FC0E007F00003801FC0E007F00003800FE1C007F0000380 +0FE1C007F00003800FE1C007F000038007F38007F000038007F38007F000038003FF0007F00003 +8003FF0007F000038001FE0007F000038001FE0007F000038000FC0007F000038000FC0007F000 +FFFE00FC01FFFFC0FFFE007801FFFFC0FFFE007801FFFFC03A297DA841>I<FFFC0000FFFEFFFE +0000FFFEFFFF0000FFFE03FF8000038003FF8000038003BFC0000380039FE0000380039FF00003 +80038FF80003800387F80003800383FC0003800381FE0003800381FF0003800380FF8003800380 +7FC0038003803FC0038003801FE0038003800FF0038003800FF80380038007FC0380038003FC03 +80038001FE0380038000FF0380038000FF83800380007FC3800380003FE3800380001FE3800380 +000FF38003800007FB8003800007FF8003800003FF8003800001FF8003800000FF80038000007F +80038000007F80038000003F80038000001F80038000000F80FFFE00000780FFFE00000380FFFE +000003802F297DA836>I<0000FFE000000007FFFC0000003FC07F8000007F001FC00001FC0007 +F00003F80003F80007F00001FC000FF00001FE001FE00000FF001FE00000FF003FC000007F803F +C000007F807FC000007FC07F8000003FC07F8000003FC07F8000003FC0FF8000003FE0FF800000 +3FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF +8000003FE0FF8000003FE07F8000003FC07FC000007FC07FC000007FC03FC000007F803FC00000 +7F801FE00000FF001FE00000FF000FF00001FE0007F00001FC0003F80003F80001FC0007F00000 +FF001FE000003FC07F8000000FFFFE00000000FFE000002B297CA834>I<FFFFFFF800FFFFFFFF +00FFFFFFFFC003FC003FE003FC000FF003FC0007F803FC0007FC03FC0003FC03FC0003FE03FC00 +03FE03FC0003FE03FC0003FE03FC0003FE03FC0003FE03FC0003FE03FC0003FC03FC0007FC03FC +0007F803FC000FF003FC003FE003FFFFFF8003FFFFFE0003FC00000003FC00000003FC00000003 +FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC000000 +03FC00000003FC00000003FC00000003FC00000003FC000000FFFFF00000FFFFF00000FFFFF000 +0027297DA82F>I<0000FFE000000007FFFC0000003FC07F8000007F001FC00001FC0007F00003 +F80003F80007F00001FC000FF00001FE001FE00000FF001FE00000FF003FC000007F803FC00000 +7F807FC000007FC07FC000007FC07F8000003FC07F8000003FC0FF8000003FE0FF8000003FE0FF +8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF800000 +3FE0FF8000003FE07F8000003FC07F8000003FC07FC000007FC03FC000007F803FC000007F801F +E00000FF001FE01F00FF000FF03F81FE0007F060C1FC0003F8C063F80001FCC077F00000FFC07F +E000003FE07F8000000FFFFE00000000FFFE00600000003E00600000003F00600000001F81E000 +00001FFFE00000001FFFC00000000FFFC00000000FFFC000000007FF8000000007FF8000000003 +FF0000000001FE000000000078002B357CA834>I<FFFFFFE00000FFFFFFFE0000FFFFFFFF8000 +03FC007FE00003FC000FF00003FC0007F80003FC0007FC0003FC0003FC0003FC0003FE0003FC00 +03FE0003FC0003FE0003FC0003FE0003FC0003FE0003FC0003FE0003FC0003FC0003FC0007F800 +03FC0007F80003FC001FE00003FC007FC00003FFFFFE000003FFFFF0000003FC00FC000003FC00 +7F000003FC003F800003FC003F800003FC001FC00003FC001FE00003FC001FE00003FC001FE000 +03FC001FE00003FC001FE00003FC001FF00003FC001FF00003FC001FF00003FC001FF00703FC00 +1FF80703FC000FF80703FC0007F80EFFFFF003FE1CFFFFF001FFF8FFFFF0003FF030297DA834> +I<007F806003FFF0E007FFF9E00F807FE01F001FE03E0007E07C0003E07C0001E0FC0001E0FC00 +01E0FC0000E0FE0000E0FE0000E0FF000000FFC000007FFE00007FFFE0003FFFFC001FFFFE000F +FFFF8007FFFFC003FFFFE000FFFFE00007FFF000007FF000000FF8000007F8000003F8600001F8 +E00001F8E00001F8E00001F8F00001F0F00001F0F80003F0FC0003E0FF0007C0FFE01F80F3FFFF +00E0FFFE00C01FF0001D297CA826>I<7FFFFFFFFFC07FFFFFFFFFC07FFFFFFFFFC07F803FC03F +C07E003FC007C078003FC003C078003FC003C070003FC001C0F0003FC001E0F0003FC001E0E000 +3FC000E0E0003FC000E0E0003FC000E0E0003FC000E0E0003FC000E000003FC0000000003FC000 +0000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC000000000 +3FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC000 +0000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC000000000 +3FC00000007FFFFFE000007FFFFFE000007FFFFFE0002B287EA730>I<FFFFF001FFFCFFFFF001 +FFFCFFFFF001FFFC03FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003 +FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC0000 +070003FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003 +FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC0000 +070003FC0000070003FC0000070003FC0000070001FC00000E0001FE00000E0000FE00001C0000 +7E00001C00007F00003800003FC000F000000FF007E0000007FFFFC0000001FFFF000000001FF8 +00002E297DA835>I<FFFFF0003FFF80FFFFF0003FFF80FFFFF0003FFF8003FE000001E00001FE +000001C00001FF000003C00000FF000003800000FF0000038000007F8000070000007F80000700 +00007FC0000F0000003FC0000E0000003FE0001E0000001FE0001C0000001FF0001C0000000FF0 +00380000000FF0003800000007F8007000000007F8007000000007FC00F000000003FC00E00000 +0003FE01E000000001FE01C000000001FF01C000000000FF038000000000FF038000000000FF87 +80000000007F8700000000007FCF00000000003FCE00000000003FFE00000000001FFC00000000 +001FFC00000000000FF800000000000FF800000000000FF8000000000007F0000000000007F000 +0000000003E0000000000003E0000000000001C000000031297FA834>I<FFFFE07FFFF007FFF0 +FFFFE07FFFF007FFF0FFFFE07FFFF007FFF003FC0001FE00001C0003FC0001FE00001C0001FE00 +01FF0000380001FE0000FF0000380001FF0000FF0000780000FF0000FF8000700000FF0000FF80 +00700000FF8000FF8000F000007F8001FFC000E000007F8001FFC000E000003FC003FFE001C000 +003FC0039FE001C000003FE0039FE003C000001FE0070FF0038000001FE0070FF0038000001FF0 +0F0FF0078000000FF00E07F8070000000FF00E07F80700000007F81E07FC0E00000007F81C03FC +0E00000007FC1C03FC1E00000003FC3801FE1C00000003FC3801FE1C00000001FE7801FF380000 +0001FE7000FF3800000001FE7000FF3800000000FFF000FFF000000000FFE0007FF000000000FF +E0007FF0000000007FC0003FE0000000007FC0003FE0000000003FC0003FC0000000003F80001F +C0000000003F80001FC0000000001F80001F80000000001F00000F80000000001F00000F800000 +00000E00000700000044297FA847>I<01FF800007FFF0000F81F8001FC07E001FC07E001FC03F +000F803F8007003F8000003F8000003F8000003F80000FFF8000FFFF8007FC3F800FE03F803F80 +3F803F003F807F003F80FE003F80FE003F80FE003F80FE003F807E007F807F00DF803F839FFC0F +FF0FFC01FC03FC1E1B7E9A21>97 D<FFE0000000FFE0000000FFE00000000FE00000000FE00000 +000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE000 +00000FE00000000FE00000000FE1FE00000FE7FF80000FFE07E0000FF801F0000FF000F8000FE0 +00FC000FE000FE000FE0007F000FE0007F000FE0007F000FE0007F800FE0007F800FE0007F800F +E0007F800FE0007F800FE0007F800FE0007F800FE0007F000FE0007F000FE0007F000FE000FE00 +0FE000FC000FF001F8000FF803F0000F9E07E0000F07FF80000E01FC0000212A7EA926>I<001F +F80000FFFE0003F01F0007E03F800FC03F801F803F803F801F007F800E007F0000007F000000FF +000000FF000000FF000000FF000000FF000000FF000000FF0000007F0000007F0000007F800000 +3F8001C01F8001C00FC0038007E0070003F01E0000FFFC00001FE0001A1B7E9A1F>I<00003FF8 +0000003FF80000003FF800000003F800000003F800000003F800000003F800000003F800000003 +F800000003F800000003F800000003F800000003F800000003F800000003F800001FE3F80000FF +FBF80003F03FF80007E00FF8000FC007F8001F8003F8003F8003F8007F0003F8007F0003F8007F +0003F800FF0003F800FF0003F800FF0003F800FF0003F800FF0003F800FF0003F800FF0003F800 +7F0003F8007F0003F8007F0003F8003F8003F8001F8003F8000F8007F80007C00FF80003F03BFF +8000FFF3FF80003FC3FF80212A7EA926>I<003FE00001FFF80003F07E0007C01F000F801F801F +800F803F800FC07F000FC07F0007C07F0007E0FF0007E0FF0007E0FFFFFFE0FFFFFFE0FF000000 +FF000000FF0000007F0000007F0000007F0000003F8000E01F8000E00FC001C007E0038003F81F +0000FFFE00001FF0001B1B7E9A20>I<0007F0003FFC00FE3E01F87F03F87F03F07F07F07F07F0 +3E07F00007F00007F00007F00007F00007F00007F000FFFFC0FFFFC0FFFFC007F00007F00007F0 +0007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0 +0007F00007F00007F00007F00007F0007FFF807FFF807FFF80182A7EA915>I<00FF81F003FFE7 +F80FC1FE7C1F80FC7C1F007C383F007E107F007F007F007F007F007F007F007F007F007F007F00 +7F003F007E001F007C001F80FC000FC1F8001FFFE00018FF800038000000380000003C0000003E +0000003FFFF8001FFFFF001FFFFF800FFFFFC007FFFFE01FFFFFF03E0007F07C0001F8F80000F8 +F80000F8F80000F8F80000F87C0001F03C0001E01F0007C00FC01F8003FFFE00007FF0001E287E +9A22>I<FFE0000000FFE0000000FFE00000000FE00000000FE00000000FE00000000FE0000000 +0FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000 +000FE07F00000FE1FFC0000FE787E0000FEE03F0000FF803F0000FF803F8000FF003F8000FF003 +F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE0 +03F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000F +E003F800FFFE3FFF80FFFE3FFF80FFFE3FFF80212A7DA926>I<07000F801FC03FE03FE03FE01F +C00F8007000000000000000000000000000000FFE0FFE0FFE00FE00FE00FE00FE00FE00FE00FE0 +0FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0FFFEFFFEFFFE0F2B7DAA14 +>I<FFE00000FFE00000FFE000000FE000000FE000000FE000000FE000000FE000000FE000000F +E000000FE000000FE000000FE000000FE000000FE000000FE01FFC0FE01FFC0FE01FFC0FE00780 +0FE00F000FE01E000FE03C000FE078000FE0E0000FE3C0000FE7C0000FEFE0000FFFE0000FFFF0 +000FF3F8000FE3F8000FC1FC000FC0FE000FC07F000FC07F000FC03F800FC01FC00FC00FC00FC0 +0FE0FFFC3FFEFFFC3FFEFFFC3FFE1F2A7EA924>107 D<FFE0FFE0FFE00FE00FE00FE00FE00FE0 +0FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00F +E00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0FFFEFFFEFFFE0F2A7DA914>I<FFC07F +800FF000FFC1FFE03FFC00FFC383F0707E000FC603F8C07F000FCC01F9803F000FD801FF003F80 +0FF001FE003F800FF001FE003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC +003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F800F +E001FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC00 +3F800FE001FC003F80FFFE1FFFC3FFF8FFFE1FFFC3FFF8FFFE1FFFC3FFF8351B7D9A3A>I<FFC0 +7F0000FFC1FFC000FFC787E0000FCE03F0000FD803F0000FD803F8000FF003F8000FF003F8000F +E003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F800 +0FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8 +00FFFE3FFF80FFFE3FFF80FFFE3FFF80211B7D9A26>I<003FE00001FFFC0003F07E000FC01F80 +1F800FC03F800FE03F0007E07F0007F07F0007F07F0007F0FF0007F8FF0007F8FF0007F8FF0007 +F8FF0007F8FF0007F8FF0007F8FF0007F87F0007F07F0007F03F800FE03F800FE01F800FC00FC0 +1F8007F07F0001FFFC00003FE0001D1B7E9A22>I<FFE1FE0000FFE7FF8000FFFE07E0000FF803 +F0000FF001F8000FE000FC000FE000FE000FE000FF000FE0007F000FE0007F000FE0007F800FE0 +007F800FE0007F800FE0007F800FE0007F800FE0007F800FE0007F800FE0007F000FE000FF000F +E000FF000FE000FE000FE001FC000FF001F8000FF803F0000FFE0FE0000FE7FF80000FE1FC0000 +0FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000 +000FE0000000FFFE000000FFFE000000FFFE00000021277E9A26>I<FFC1F0FFC7FCFFCE3E0FD8 +7F0FD87F0FF07F0FF03E0FF01C0FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0 +000FE0000FE0000FE0000FE0000FE0000FE0000FE000FFFF00FFFF00FFFF00181B7E9A1C>114 +D<03FE300FFFF01E03F03800F0700070F00070F00070F80070FC0000FFE0007FFE007FFF803FFF +E01FFFF007FFF800FFF80003FC0000FC60007CE0003CF0003CF00038F80038FC0070FF01E0F7FF +C0C1FF00161B7E9A1B>I<00700000700000700000700000F00000F00000F00001F00003F00003 +F00007F0001FFFF0FFFFF0FFFFF007F00007F00007F00007F00007F00007F00007F00007F00007 +F00007F00007F00007F00007F00007F03807F03807F03807F03807F03807F03803F03803F87001 +F86000FFC0001F8015267FA51B>I<FFE03FF800FFE03FF800FFE03FF8000FE003F8000FE003F8 +000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003 +F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE0 +03F8000FE007F80007E007F80007E00FF80003F03BFF8001FFF3FF80003FC3FF80211B7D9A26> +I<FFFE03FF80FFFE03FF80FFFE03FF8007F000700007F000700007F800F00003F800E00003FC01 +E00001FC01C00001FC01C00000FE03800000FE038000007F070000007F070000007F8F0000003F +8E0000003FDE0000001FDC0000001FDC0000000FF80000000FF80000000FF800000007F0000000 +07F000000003E000000003E000000001C00000211B7F9A24>I<FFFE7FFC0FFEFFFE7FFC0FFEFF +FE7FFC0FFE0FE007E000E007F003F001C007F003F001C007F807F803C003F807F8038003F807F8 +038001FC0EFC070001FC0EFC070001FE1EFC0F0000FE1C7E0E0000FE1C7E0E0000FF383F1E0000 +7F383F1C00007F783F3C00003FF01FB800003FF01FB800003FF01FF800001FE00FF000001FE00F +F000000FC007E000000FC007E000000FC007E00000078003C00000078003C0002F1B7F9A32>I< +FFFC0FFF00FFFC0FFF00FFFC0FFF0007F003C00003F807800001FC07800000FE0F000000FF1E00 +00007F3C0000003FF80000001FF00000000FF00000000FF000000007F000000007F80000000FFC +0000001FFE0000001EFE0000003C7F000000783F800000F01FC00001E01FE00001C00FE00003C0 +07F000FFF01FFF80FFF01FFF80FFF01FFF80211B7F9A24>I<FFFE03FF80FFFE03FF80FFFE03FF +8007F000700007F000700007F800F00003F800E00003FC01E00001FC01C00001FC01C00000FE03 +800000FE038000007F070000007F070000007F8F0000003F8E0000003FDE0000001FDC0000001F +DC0000000FF80000000FF80000000FF800000007F000000007F000000003E000000003E0000000 +01C000000001C000000003800000000380000038078000007C07000000FE0F000000FE0E000000 +FE1E000000FE3C0000007C780000003FE00000000FC000000021277F9A24>I +E /Fj 18 121 df<00001E000000003E00000000FE00000003FE0000003FFE0000FFFFFE0000FF +FFFE0000FFFFFE0000FFCFFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000 +000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE00 +00000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE +0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000F +FE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE000000 +0FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE00007FFFFFFFC0 +7FFFFFFFC07FFFFFFFC07FFFFFFFC0223879B731>49 D<0007FE0000007FFFE00001FFFFF80003 +FFFFFE0007F01FFF000F8007FF801F0001FFC03E0000FFE07F8000FFF07FC0007FF0FFE0007FF8 +FFF0003FF8FFF0003FFCFFF0003FFCFFF0003FFCFFF0003FFC7FE0003FFC3FC0003FFC1F80003F +FC0000003FFC0000003FF80000007FF80000007FF00000007FF0000000FFE0000000FFC0000001 +FF80000001FF00000003FE00000007FC00000007F80000000FF00000001FC00000003F80000000 +7F00000000FC00000001F800000001F0003C0003E0003C0007C0003C000F000078001E00007800 +3C00007800780000F800F00000F801FFFFFFF803FFFFFFF007FFFFFFF00FFFFFFFF01FFFFFFFF0 +3FFFFFFFF07FFFFFFFF0FFFFFFFFF0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE026387BB731>I<0003 +FF8000001FFFF000007FFFFE0000FE03FF0001F000FF8003C000FFC00780007FE00FF0007FF00F +F8007FF01FFC007FF81FFE007FF81FFE007FF81FFE007FF81FFE007FF81FFE007FF80FFC007FF0 +07F8007FF003F0007FF0000000FFE0000000FFC0000001FF80000001FF00000003FE00000007FC +0000001FF000000FFFC000000FFF8000000FFFF800000003FE00000000FF800000007FE0000000 +3FF00000003FF80000003FFC0000001FFC0000001FFE0000001FFE0200001FFF1FC0001FFF3FE0 +001FFF7FF0001FFF7FF0001FFFFFF8001FFFFFF8001FFFFFF8001FFEFFF8001FFEFFF0001FFE7F +F0003FFC7FE0003FFC3FC0003FF81F80007FF01FE000FFE007FC03FFC003FFFFFF0001FFFFFE00 +003FFFF0000007FF800028397CB731>I<00000007C0000000000FC0000000000FC0000000001F +C0000000003FC0000000007FC000000000FFC000000000FFC000000001FFC000000003FFC00000 +0007FFC00000000FFFC00000000FFFC00000001EFFC00000003CFFC00000007CFFC0000000F8FF +C0000000F0FFC0000001E0FFC0000003C0FFC0000007C0FFC000000F80FFC000000F00FFC00000 +1E00FFC000003C00FFC000007C00FFC00000F800FFC00000F000FFC00001E000FFC00003C000FF +C00007C000FFC0000F8000FFC0000F0000FFC0001E0000FFC0003C0000FFC0007C0000FFC000F8 +0000FFC000FFFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFFC0000001FFC000000001FF +C000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC00000 +0001FFC000000001FFC0000007FFFFFFC00007FFFFFFC00007FFFFFFC00007FFFFFFC02A377DB6 +31>I<04000000C00F800007C00FF8007FC00FFFFFFF800FFFFFFF000FFFFFFE000FFFFFFC000F +FFFFF8000FFFFFF0000FFFFFE0000FFFFF80000FFFFE00000FFFF800000F800000000F80000000 +0F800000000F800000000F800000000F800000000F800000000F800000000F81FF00000F8FFFE0 +000FBFFFF8000FFE03FE000FF000FF000FC000FF800F80007FC00F00007FE00700007FF0000000 +3FF00000003FF80000003FF80000003FF80000003FFC0000003FFC0600003FFC1F80003FFC3FC0 +003FFC7FE0003FFCFFE0003FFCFFF0003FFCFFF0003FFCFFF0003FF8FFE0003FF8FFE0003FF87F +C0007FF07F00007FF03C00007FE03E0000FFC01F0000FF800FC003FF0007F00FFE0003FFFFFC00 +01FFFFF000007FFFC000000FFC000026397BB731>I<00000001F80000000000000001F8000000 +0000000003FC0000000000000003FC0000000000000007FE0000000000000007FE000000000000 +0007FE000000000000000FFF000000000000000FFF000000000000001FFF800000000000001FFF +800000000000001FFF800000000000003FFFC00000000000003FFFC00000000000007FFFE00000 +000000007DFFE00000000000007DFFE0000000000000FDFFF0000000000000F8FFF00000000000 +01F8FFF8000000000001F07FF8000000000001F07FF8000000000003F07FFC000000000003E03F +FC000000000007E03FFE000000000007C01FFE00000000000FC01FFF00000000000F801FFF0000 +0000000F800FFF00000000001F800FFF80000000001F0007FF80000000003F0007FFC000000000 +3E0003FFC0000000003E0003FFC0000000007E0003FFE0000000007C0001FFE000000000FC0001 +FFF000000000F80000FFF000000000F80000FFF000000001FFFFFFFFF800000001FFFFFFFFF800 +000003FFFFFFFFFC00000003FFFFFFFFFC00000003E000003FFC00000007E000003FFE00000007 +C000001FFE0000000FC000001FFF0000000F8000000FFF0000001F8000000FFF8000001F000000 +0FFF8000001F00000007FF8000003F00000007FFC000003E00000003FFC000007E00000003FFE0 +0000FF00000001FFE000FFFFFC0001FFFFFFF0FFFFFC0001FFFFFFF0FFFFFC0001FFFFFFF0FFFF +FC0001FFFFFFF0443B7DBA4B>65 D<FFFFFFFFFFC00000FFFFFFFFFFFC0000FFFFFFFFFFFF0000 +FFFFFFFFFFFFC000007FF00001FFF000007FF000007FF800007FF000003FFC00007FF000001FFE +00007FF000001FFE00007FF000000FFF00007FF000000FFF00007FF0000007FF80007FF0000007 +FF80007FF0000007FF80007FF0000007FF80007FF0000007FF80007FF0000007FF80007FF00000 +07FF80007FF0000007FF00007FF000000FFF00007FF000000FFF00007FF000001FFE00007FF000 +001FFC00007FF000003FF800007FF000007FF000007FF00001FFE000007FF0000FFF8000007FFF +FFFFFE0000007FFFFFFFFE0000007FFFFFFFFFC000007FF000007FF000007FF000001FFC00007F +F000000FFE00007FF0000007FF00007FF0000007FF80007FF0000003FFC0007FF0000003FFC000 +7FF0000001FFE0007FF0000001FFE0007FF0000001FFF0007FF0000001FFF0007FF0000001FFF0 +007FF0000001FFF0007FF0000001FFF0007FF0000001FFF0007FF0000001FFF0007FF0000001FF +F0007FF0000001FFE0007FF0000003FFE0007FF0000003FFC0007FF0000007FFC0007FF000000F +FF80007FF000001FFF00007FF000003FFE00007FF00001FFFC00FFFFFFFFFFFFF800FFFFFFFFFF +FFE000FFFFFFFFFFFF8000FFFFFFFFFFF800003C3B7CBA46>I<0000001FFF000030000001FFFF +E000F000000FFFFFFC01F000007FFFFFFE03F00001FFFE007F87F00003FFE0000FCFF0000FFF00 +0003FFF0001FFC000001FFF0003FF80000007FF0007FF00000003FF000FFC00000003FF001FFC0 +0000001FF003FF800000000FF007FF000000000FF00FFF0000000007F00FFE0000000007F01FFE +0000000003F01FFE0000000003F03FFC0000000003F03FFC0000000001F03FFC0000000001F07F +FC0000000001F07FF80000000001F07FF80000000000007FF8000000000000FFF8000000000000 +FFF8000000000000FFF8000000000000FFF8000000000000FFF8000000000000FFF80000000000 +00FFF8000000000000FFF8000000000000FFF8000000000000FFF8000000000000FFF800000000 +00007FF80000000000007FF80000000000007FF80000000000007FFC0000000000F03FFC000000 +0000F03FFC0000000000F03FFC0000000000F01FFE0000000000F01FFE0000000001E00FFE0000 +000001E00FFF0000000001E007FF0000000003C003FF8000000003C001FFC0000000078000FFE0 +0000000F00007FF00000001F00003FF80000003E00001FFC0000007C00000FFF000001F8000003 +FFE00007F0000001FFFE003FC00000007FFFFFFF000000000FFFFFFC0000000001FFFFF0000000 +00001FFF0000003C3D7BBB47>I<001FFF00000001FFFFF0000003FFFFFC000007F007FE00000F +F801FF00001FFC00FF80001FFC007FC0001FFC007FE0001FFC003FE0000FF8003FF0000FF8003F +F00007F0003FF00001C0003FF0000000003FF0000000003FF0000000003FF0000000FFFFF00000 +0FFFFFF000007FF83FF00001FF803FF00007FE003FF0000FF8003FF0001FF0003FF0003FE0003F +F0007FE0003FF0007FE0003FF000FFC0003FF000FFC0003FF000FFC0003FF000FFC0003FF000FF +C0007FF0007FE0007FF0007FE000DFF0003FF0039FF8001FFC0F0FFFF007FFFE0FFFF001FFFC07 +FFF0003FE000FFF02C267DA530>97 D<000000003FC00000003FFFC00000003FFFC00000003FFF +C00000003FFFC000000001FFC000000000FFC000000000FFC000000000FFC000000000FFC00000 +0000FFC000000000FFC000000000FFC000000000FFC000000000FFC000000000FFC000000000FF +C000000000FFC000000000FFC000000000FFC000000000FFC000000000FFC00000FFC0FFC0000F +FFF8FFC0003FFFFEFFC000FFE03FFFC001FF000FFFC003FE0003FFC007FC0001FFC00FF80000FF +C01FF00000FFC01FF00000FFC03FF00000FFC03FE00000FFC07FE00000FFC07FE00000FFC07FE0 +0000FFC0FFE00000FFC0FFE00000FFC0FFE00000FFC0FFE00000FFC0FFE00000FFC0FFE00000FF +C0FFE00000FFC0FFE00000FFC0FFE00000FFC07FE00000FFC07FE00000FFC07FE00000FFC03FF0 +0000FFC03FF00000FFC01FF00000FFC00FF80001FFC007F80003FFC003FC0007FFC001FE000FFF +E000FFC07EFFFF003FFFFCFFFF000FFFF0FFFF0001FF80FFFF303C7DBB37>100 +D<0001FFC000000FFFF800003FFFFE0000FF80FF0001FE003F8007FC001FC00FF8000FE00FF800 +0FF01FF00007F03FF00007F83FF00007F87FE00007F87FE00003FC7FE00003FC7FE00003FCFFE0 +0003FCFFFFFFFFFCFFFFFFFFFCFFFFFFFFFCFFE0000000FFE0000000FFE0000000FFE00000007F +E00000007FE00000007FE00000003FE00000003FF000003C1FF000003C1FF000003C0FF8000078 +07FC0000F803FE0001F001FF0007E000FFC03FC0003FFFFF000007FFFC000000FFE00026267DA5 +2D>I<00FF00000000FFFF00000000FFFF00000000FFFF00000000FFFF0000000007FF00000000 +03FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF00 +00000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF00000000 +03FF0000000003FF0000000003FF0000000003FF007FC00003FF01FFF80003FF07FFFC0003FF0F +03FE0003FF1C01FF0003FF3001FF8003FF6000FF8003FFE000FFC003FFC000FFC003FF8000FFC0 +03FF8000FFC003FF8000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF00 +00FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC0 +03FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF00 +00FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC0FFFFFC3FFFFFFFFFFC3FFFFF +FFFFFC3FFFFFFFFFFC3FFFFF303C7CBB37>104 D<01F00007FC000FFE000FFE001FFF001FFF00 +1FFF001FFF001FFF000FFE000FFE0007FC0001F000000000000000000000000000000000000000 +00000000000000000000000000FF00FFFF00FFFF00FFFF00FFFF0007FF0003FF0003FF0003FF00 +03FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF00 +03FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF00FFFFF8 +FFFFF8FFFFF8FFFFF8153D7DBC1B>I<00FE007FC000FFFE01FFF800FFFE07FFFC00FFFE0F03FE +00FFFE1C01FF0007FE3001FF8003FE6000FF8003FEE000FFC003FEC000FFC003FF8000FFC003FF +8000FFC003FF8000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FF +C003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF +0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FF +C003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC0FFFFFC3FFFFFFFFFFC3FFFFFFFFF +FC3FFFFFFFFFFC3FFFFF30267CA537>110 D<00FF01FF8000FFFF0FFFF000FFFF3FFFFC00FFFF +FE03FF00FFFFF000FF8003FFC0007FC003FF80003FE003FF00003FF003FF00001FF803FF00001F +FC03FF00000FFC03FF00000FFE03FF00000FFE03FF000007FE03FF000007FF03FF000007FF03FF +000007FF03FF000007FF03FF000007FF03FF000007FF03FF000007FF03FF000007FF03FF000007 +FF03FF000007FE03FF000007FE03FF00000FFE03FF00000FFC03FF00000FFC03FF00001FF803FF +00001FF803FF00003FF003FF80003FE003FFC0007FC003FFF001FF8003FFFC07FF0003FF3FFFFC +0003FF0FFFF00003FF01FF000003FF0000000003FF0000000003FF0000000003FF0000000003FF +0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF000000 +0003FF0000000003FF00000000FFFFFC000000FFFFFC000000FFFFFC000000FFFFFC0000003037 +7DA537>112 D<00FE03F000FFFE0FFE00FFFE1FFF00FFFE3C3F80FFFE707FC007FE60FFE003FE +E0FFE003FEC0FFE003FFC0FFE003FF807FC003FF807FC003FF803F8003FF800E0003FF00000003 +FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF000000 +03FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF0000 +0003FF00000003FF00000003FF00000003FF000000FFFFFE0000FFFFFE0000FFFFFE0000FFFFFE +000023267DA529>114 D<0007800000078000000780000007800000078000000F8000000F8000 +000F8000000F8000001F8000001F8000003F8000003F8000007F800000FF800001FF800007FF80 +001FFFFFF0FFFFFFF0FFFFFFF0FFFFFFF001FF800001FF800001FF800001FF800001FF800001FF +800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001 +FF800001FF800001FF800001FF800001FF803C01FF803C01FF803C01FF803C01FF803C01FF803C +01FF803C01FF803C00FF807800FFC078007FC070003FE0E0001FFFC00007FF800001FF001E377E +B626>116 D<FFFFF007FFFCFFFFF007FFFCFFFFF007FFFCFFFFF007FFFC01FF8000FC0000FFC0 +00F80000FFE001F000007FF003E000003FF007C000001FF80FC000000FFC1F8000000FFE1F0000 +0007FF3E00000003FFFC00000001FFF800000000FFF0000000007FE0000000007FF0000000003F +F8000000001FF8000000001FFC000000003FFE000000007FFF00000000FBFF80000001F9FF8000 +0003F0FFC0000003E07FE0000007C07FF000000F803FF800001F001FFC00003E000FFC00007C00 +07FE0000FC0003FF0001FC0003FF80FFFF801FFFFEFFFF801FFFFEFFFF801FFFFEFFFF801FFFFE +2F267EA534>120 D E /Fk 1 98 df<00200000700000700000700000B80000B80000B800011C +00011C00011C00020E00020E0004070004070007FF000803800803800803801801C03803C0FE0F +F815157F9419>97 D E /Fl 94 127 df<60F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0600000000060 +F0F0600419779816>33 D<E038F078F078F078F078F078F078F078E038E03860300D0B7C9816> +I<0387000387000387000387000387000387007FFFC0FFFFE0FFFFE0070E00070E00070E000E1C +000E1C000E1C000E1C00FFFFE0FFFFE07FFFC01C38001C38001C38001C38001C38001C38001319 +7F9816>I<00C00001C00001C00001C00007F0001FFC003FFE007DCF0071C780E1C380E1C780E1 +C780F1C30079C0003FC0001FF00007FC0001FE0001CF0001C70061C380F1C380F1C380E1C38071 +C70079DF003FFE001FF80007E00001C00001C00000C00011207E9C16>I<3801807C03807C0380 +EE0700EE0700EE0E00EE0E00EE0E00EE1C007C1C007C380038380000700000700000700000E000 +00E00001C00001C00001C0000380000383800707C00707C00E0EE00E0EE00E0EE01C0EE01C0EE0 +3807C03807C018038013207F9C16>I<03800007E0000FE0001E70001C70001C70001C70001C77 +E01CE7E01DE7E00FC7000F8E000F0E001E0E003F1C007F1C00739C00E3F800E1F800E0F1C0E0F1 +C071F9C07FFFC03F9F801E070013197F9816>I<30787C3C1C1C1C1C3878F0E040060D789816>I< +00E001E0038007000E001C001C0038003800700070007000E000E000E000E000E000E000E000E0 +00E000700070007000380038001C001C000E000700038001E000E00B217A9C16>I<C000E00070 +0038001C000E000E000700070003800380038001C001C001C001C001C001C001C001C001C00380 +03800380070007000E000E001C0038007000E000C0000A217B9C16>I<01C00001C00001C00001 +C00071C700F9CF807FFF001FFC0007F00007F0001FFC007FFF00F9CF8071C70001C00001C00001 +C00001C00011127E9516>I<01C00001C00001C00001C00001C00001C00001C00001C000FFFF80 +FFFF80FFFF8001C00001C00001C00001C00001C00001C00001C00001C00011137E9516>I<387C +7E7E3E0E1E1C78F060070B798416>I<FFFF80FFFF80FFFF8011037E8D16>I<70F8F8F870050578 +8416>I<000180000380000380000700000700000E00000E00001C00001C000038000038000070 +0000700000E00000E00001C00001C0000380000380000700000700000E00000E00001C00001C00 +00380000380000700000700000E00000E00000C0000011207E9C16>I<03E0000FF8001FFC001E +3C00380E00780F00700700700700E00380E00380E00380E00380E00380E00380E00380E00380F0 +0780700700700700780F003C1E001E3C001FFC000FF80003E00011197E9816>I<018003800380 +07800F807F80FF807380038003800380038003800380038003800380038003800380038003807F +F87FFC7FF80E197C9816>I<07E0001FF8003FFC00783E00E00700F00780F00380600380000380 +000380000700000700000E00001C0000380000700000E00001C0000380000F00001E0380380380 +7FFF80FFFF807FFF8011197E9816>I<07E0001FF8003FFC00781E007807003007000007000007 +00000E00003E0007FC0007F00007FC00001E00000700000300000380000380600380F00380E007 +00781E003FFC001FF80007E00011197E9816>I<007C0000FC0000DC0001DC00039C00039C0007 +1C000F1C000E1C001E1C003C1C00381C00781C00F01C00FFFFE0FFFFE0FFFFE0001C00001C0000 +1C00001C00001C0001FFC001FFC001FFC013197F9816>I<3FFE003FFE003FFE00380000380000 +3800003800003800003800003800003BF0003FFC003FFE003C0F00300700000380000380600380 +F00380F00380E00700781E003FFC001FF80007E00011197E9816>I<00F80003FC0007FE000F07 +001C0F00380F00780600700000700000E3F800EFFC00FFFE00F80F00F00700F00380E00380E003 +807003807003807007803807003C1E001FFC000FF80003E00011197E9816>I<E00000FFFF80FF +FF80FFFF80E00F00E01E00001C0000380000780000700000E00000E00001C00001C00001C00003 +8000038000038000038000070000070000070000070000070000070000070000111A7E9916>I< +07F0001FFC003FFE007C1F00F00780E00380E00380E003807007007C1F001FFC0007F0001FFC00 +3C1E00700700F00780E00380E00380E00380F007807007007C1F003FFE001FFC0007F00011197E +9816>I<03E0000FF8001FFC003C1E00700E00700700E00700E00780E00380E00380E007807007 +80780F803FFF801FFB800FE380000700000700300700780E00781C007078003FF0001FE0000F80 +0011197E9816>I<70F8F8F870000000000000000070F8F8F8700512789116>I<387C7C7C380000 +00000000000038787C7C3C1C1C3870E0400618799116>I<000180000780001F80003E0000F800 +01F00007C0000F80003E0000FC0000F00000FC00003E00000F800007C00001F00000F800003E00 +001F8000078000018011157E9616>I<7FFF00FFFF80FFFF800000000000000000000000000000 +00FFFF80FFFF807FFF00110B7E9116>I<C00000F00000FC00003E00000F800007C00001F00000 +F800003E00001F80000780001F80003E0000F80001F00007C0000F80003E0000FC0000F00000C0 +000011157E9616>I<0FE03FF87FFCF01EF00EF00E601E003C007800F001C00380038003800380 +03800300000000000000000003000780078003000F197D9816>I<00F80003FC0007FE000F0700 +1C3F80387F8078FF8071C3C071C3C0E381C0E381C0E381C0E381C0E381C0E381C0E381C071C380 +71C38078FF00387E001C3C000F03C007FFC003FF0000FC0012197E9816>I<00E00001F00001F0 +0001B00001B00003B80003B80003B800031800071C00071C00071C00071C00071C000E0E000E0E +000FFE000FFE001FFF001C07001C07001C07007F1FC0FF1FE07F1FC013197F9816>I<7FF800FF +FE007FFF001C0F001C07801C03801C03801C03801C07801C07001FFF001FFE001FFE001C1F001C +03801C03C01C01C01C01C01C01C01C01C01C03C01C07807FFF80FFFF007FFC0012197F9816>I< +01F18007FB800FFF801F0F803C0780380380700380700380F00000E00000E00000E00000E00000 +E00000E00000E00000F000007003807003803803803C07001F0F000FFE0007FC0001F00011197E +9816>I<7FF800FFFE007FFF001C0F001C07801C03C01C01C01C01C01C01E01C00E01C00E01C00 +E01C00E01C00E01C00E01C00E01C00E01C01C01C01C01C03C01C07801C0F807FFF00FFFE007FF8 +001319809816>I<7FFFC0FFFFC07FFFC01C01C01C01C01C01C01C01C01C00001C00001C1C001C +1C001FFC001FFC001FFC001C1C001C1C001C00001C00E01C00E01C00E01C00E01C00E07FFFE0FF +FFE07FFFE013197F9816>I<FFFFE0FFFFE0FFFFE01C00E01C00E01C00E01C00E01C00001C0000 +1C1C001C1C001FFC001FFC001FFC001C1C001C1C001C00001C00001C00001C00001C00001C0000 +FF8000FFC000FF800013197F9816>I<03E30007FF000FFF001E1F003C0F003807007007007007 +00F00000E00000E00000E00000E00000E03F80E07FC0E03F80F00700700700700700380F003C0F +001E1F000FFF0007F70003E70012197E9816>I<7F1FC0FFBFE07F1FC01C07001C07001C07001C +07001C07001C07001C07001FFF001FFF001FFF001C07001C07001C07001C07001C07001C07001C +07001C07001C07007F1FC0FFBFE07F1FC013197F9816>I<FFFEFFFEFFFE038003800380038003 +8003800380038003800380038003800380038003800380038003800380FFFEFFFEFFFE0F197D98 +16>I<07FE07FF07FE003800380038003800380038003800380038003800380038003800380038 +00386038F038F0707FF07FE01F8010197D9816>I<7F0FE0FF8FF07F0FE01C07801C0F001C0E00 +1C1C001C3C001C78001CF0001CE0001DF0001FF0001FF8001F38001E1C001C1C001C0E001C0E00 +1C07001C07001C03807F07E0FF8FF07F07E01419809816>I<FFC000FFC000FFC0001C00001C00 +001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00 +401C00E01C00E01C00E01C00E0FFFFE0FFFFE0FFFFE013197F9816>I<FC07E0FE0FE0FE0FE03A +0B803B1B803B1B803B1B803B1B803B1B803BBB8039B38039B38039B38039B38039F38038E38038 +E380380380380380380380380380380380FE0FE0FE0FE0FE0FE013197F9816>I<7E1FC0FF3FE0 +7F1FC01D07001D87001D87001D87001DC7001DC7001CC7001CC7001CE7001CE7001CE7001C6700 +1C67001C77001C77001C37001C37001C37001C17007F1F00FF9F007F0F0013197F9816>I<1FFC +003FFE007FFF00780F00F00780E00380E00380E00380E00380E00380E00380E00380E00380E003 +80E00380E00380E00380E00380E00380F00780F00780780F007FFF003FFE001FFC0011197E9816 +>I<7FF800FFFE007FFF001C0F801C03801C03C01C01C01C01C01C01C01C03C01C03801C0F801F +FF001FFE001FF8001C00001C00001C00001C00001C00001C00001C00007F0000FF80007F000012 +197F9816>I<1FFC003FFE007FFF00780F00F00780E00380E00380E00380E00380E00380E00380 +E00380E00380E00380E00380E00380E00380E00380E0E380E1E380F0F780787F007FFF003FFE00 +1FFC00001C00001E00000E00000F00000700000700111F7E9816>I<7FE000FFF8007FFC001C1E +001C0F001C07001C07001C07001C07001C0F001C1E001FFC001FF8001FFC001C1C001C0E001C0E +001C0E001C0E001C0E201C0E701C0E707F07E0FF87E07F03C014197F9816>I<07E3001FFF003F +FF00781F00F00700E00700E00700E00000F000007800003F80001FF00007FC0000FE00000F0000 +0700000380000380600380E00380E00700F80F00FFFE00FFFC00C7F00011197E9816>I<7FFFE0 +FFFFE0FFFFE0E0E0E0E0E0E0E0E0E0E0E0E000E00000E00000E00000E00000E00000E00000E000 +00E00000E00000E00000E00000E00000E00000E00000E00007FC000FFE0007FC0013197F9816> +I<7F07F0FF8FF87F07F01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01 +C01C01C01C01C01C01C01C01C01C01C01C01C00E03800E038007070007FF0003FE0000F8001519 +809816>I<FE0FE0FF1FE0FE0FE03803801C07001C07001C07001C07000E0E000E0E000E0E000E +0E00060C00071C00071C00071C00071C0003180003B80003B80003B80001B00001F00001F00000 +E00013197F9816>I<FC07E0FE0FE0FC07E07001C07001C07001C0300180380380380380380380 +38E38039F38039F38039B38019B30019B30019B30019B30019B30019B3001913001B1B000F1E00 +0F1E000E0E0013197F9816>I<7F1F807F3F807F1F800E1E000E1C00073C0007380003B80003F0 +0001F00001E00000E00001E00001F00003F00003B80007B800071C00071C000E0E000E0E001C07 +007F1FC0FF1FE07F1FC013197F9816>I<FE0FE0FF1FE0FE0FE01C07001C07000E0E000E0E0007 +1C00071C00071C0003B80003B80001F00001F00000E00000E00000E00000E00000E00000E00000 +E00000E00003F80007FC0003F80013197F9816>I<7FFF80FFFF80FFFF80E00700E00F00E01E00 +E01C00003C0000780000700000F00001E00001C00003C0000780000700000F00001E03801C0380 +3C0380780380700380FFFF80FFFF80FFFF8011197E9816>I<FFF0FFF0FFF0E000E000E000E000 +E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E0 +00E000E000FFF0FFF0FFF00C20789C16>I<C00000E00000E00000700000700000380000380000 +1C00001C00000E00000E000007000007000003800003800001C00001C00000E00000E000007000 +007000003800003800001C00001C00000E00000E0000070000070000038000038000018011207E +9C16>I<FFF0FFF0FFF00070007000700070007000700070007000700070007000700070007000 +7000700070007000700070007000700070007000700070FFF0FFF0FFF00C207F9C16>I<03000F +803FE0FDF8F07840100D067C9816>I<FFFF80FFFF80FFFF8011037E7E16>I<081C3C7870E0E0E0 +E0F0F87830060D789B16>I<1FE0003FF0007FF800783C00300E00000E00000E0003FE001FFE00 +3E0E00700E00E00E00E00E00E00E00783E007FFFE03FE7E00F83E013127E9116>I<7E0000FE00 +007E00000E00000E00000E00000E00000E3E000EFF000FFF800F83C00F00E00E00E00E00700E00 +700E00700E00700E00700E00700E00E00F01E00F83C00FFF800EFF00063C001419809816>I<03 +F80FFC1FFE3C1E780C7000E000E000E000E000E000F000700778073E0E1FFC0FF803F010127D91 +16>I<003F00007F00003F0000070000070000070000070003C7000FF7001FFF003C1F00780F00 +700700E00700E00700E00700E00700E00700E00700700F00700F003C1F001FFFE00FE7F007C7E0 +14197F9816>I<03E00FF81FFC3C1E780E7007E007FFFFFFFFFFFFE000E000700778073C0F1FFE +0FFC03F010127D9116>I<001F00007F8000FF8001E78001C30001C00001C0007FFF00FFFF00FF +FF0001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0003F +FE007FFF003FFE0011197F9816>I<03E3C007F7E00FFFE01C1CC0380E00380E00380E00380E00 +380E001C1C000FF8001FF0001BE0003800001800001FFC001FFF003FFF807803C0E000E0E000E0 +E000E0E000E07001C07C07C03FFF800FFE0003F800131C7F9116>I<7E0000FE00007E00000E00 +000E00000E00000E00000E3C000EFE000FFF000F87800F03800E03800E03800E03800E03800E03 +800E03800E03800E03800E03800E03807FC7F0FFE7F87FC7F01519809816>I<018003C003C001 +8000000000000000007FC07FC07FC001C001C001C001C001C001C001C001C001C001C001C001C0 +7FFFFFFF7FFF101A7D9916>I<003000780078003000000000000000001FF81FF81FF800380038 +003800380038003800380038003800380038003800380038003800380038003800386070F0F0FF +E07FC03F800D237E9916>I<7E0000FE00007E00000E00000E00000E00000E00000E7FE00E7FE0 +0E7FE00E0F000E1E000E3C000E78000EF0000FF0000FF8000FBC000F1E000E0E000E07000E0780 +7F87F0FFCFF07F87F01419809816>I<FFC000FFC000FFC00001C00001C00001C00001C00001C0 +0001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0 +0001C000FFFF80FFFF80FFFF8011197E9816>I<F9C380FFEFC0FFFFE03C78E03C78E03870E038 +70E03870E03870E03870E03870E03870E03870E03870E03870E0FE7CF8FE7CF8FE3C7815128091 +16>I<7E3C00FEFE007FFF000F87800F03800E03800E03800E03800E03800E03800E03800E0380 +0E03800E03800E03807FC7F0FFE7F87FC7F01512809116>I<03E0000FF8001FFC003C1E00780F +00700700E00380E00380E00380E00380E00380F00780700700780F003C1E001FFC000FF80003E0 +0011127E9116>I<7E3E00FEFF007FFF800F83C00F00E00E00E00E00700E00700E00700E00700E +00700E00700E00E00F01E00F83C00FFF800EFF000E3C000E00000E00000E00000E00000E00000E +00007FC000FFE0007FC000141B809116>I<07C7000FE7001FF7003C1F00700F00700F00E00700 +E00700E00700E00700E00700E00700700F00700F003C3F003FF7001FE70007C700000700000700 +000700000700000700000700003FE0007FF0003FE0141B7E9116>I<FF0FC0FF3FE0FF7FE007F0 +4007C000078000078000070000070000070000070000070000070000070000070000FFFC00FFFC +00FFFC0013127F9116>I<0FEC3FFC7FFCF03CE01CE01C70007F801FF007F8003C600EE00EF00E +F81EFFFCFFF8C7E00F127D9116>I<0300000700000700000700000700007FFF00FFFF00FFFF00 +07000007000007000007000007000007000007000007010007038007038007038007870003FE00 +01FC0000F80011177F9616>I<7E1F80FE3F807E1F800E03800E03800E03800E03800E03800E03 +800E03800E03800E03800E03800E03800E0F800FFFF007FBF803E3F01512809116>I<7F1FC0FF +1FE07F1FC01C07001E0F000E0E000E0E000E0E00071C00071C00071C00071C0003B80003B80003 +B80001F00001F00000E00013127F9116>I<FF1FE0FFBFE0FF1FE0380380380380380380380380 +38E38019F30019F30019B3001DB7001DB7001DB7001DB7000F1E000F1E000F1E0013127F9116> +I<7F1FC07F3FC07F1FC00F1C00073C0003B80003F00001F00000E00001E00001F00003B800073C +00071C000E0E007F1FC0FF3FE07F1FC013127F9116>I<7F1FC0FF9FE07F1FC01C07000E07000E +0E000E0E00070E00071C00071C00039C00039C0003980001B80001B80000F00000F00000F00000 +E00000E00000E00001C00079C0007BC0007F80003F00003C0000131B7F9116>I<3FFFC07FFFC0 +7FFFC0700780700F00701E00003C0000780001F00003E0000780000F00001E01C03C01C07801C0 +FFFFC0FFFFC0FFFFC012127F9116>I<001F80007F8000FF8001E00001C00001C00001C00001C0 +0001C00001C00001C00001C00001C00003C0007F8000FF0000FF00007F800003C00001C00001C0 +0001C00001C00001C00001C00001C00001C00001C00001E00000FF80007F80001F8011207E9C16 +>I<E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E00320779C16> +I<7C0000FF0000FF800003C00001C00001C00001C00001C00001C00001C00001C00001C00001C0 +0001E00000FF00007F80007F8000FF0001E00001C00001C00001C00001C00001C00001C00001C0 +0001C00001C00003C000FF8000FF00007C000011207E9C16>I<1C303F78FFF8F7E061C00D057C +9816>I E /Fm 47 122 df<0001FC3C00060E67000C0EC7001C0DC6001C01C0003801C0003803 +800038038000380380003803800070038007FFFFF800700700007007000070070000E0070000E0 +0E0000E00E0000E00E0000E00E0001C00E0001C01C0001C01C0001C01C0001C01C0003801C0003 +803800038038000380380003003800070030000700700006006000C6606000E470C000C8618000 +703E00002025819C19>11 D<0001FC000703000C03001C07001C03001800003800003800003800 +00380000700007FFFC00701C00701C00701C00E03800E03800E03800E03800E07001C07001C070 +01C07001C0E201C0E201C0E20380E4038064038038038000030000070000060000C60000E40000 +CC00007000001825819C17>I<00C001E001E001E001C003C003C0038003800380030007000700 +06000600060004000C000C00080008000000000000000000000030007800F00060000B1E7C9D0D +>33 D<183C3C3C0404080810204080060C779C0D>39 D<183878380808101020404080050C7D83 +0D>44 D<FFC0FFC0FFC00A037D890F>I<3078F06005047C830D>I<0001800001C0000380000380 +000380000300000700000700000600000E00000C00001C00001800001800003000003000006000 +00400000C600018E00010E00020E00061C000C1C00181C003F1C0040F800803F00003800003800 +00700000700000700000700000E00000600012247E9B15>52 D<060F0F06000000000000000000 +003078F06008127C910D>58 D<0000180000001800000038000000380000007800000078000000 +B8000001B800000138000002380000023C0000041C0000041C0000081C0000181C0000101C0000 +201C0000201C00007FFC0000401C0000801C0001801C0001001C0002001C0002001C0004000E00 +0C000E001C001E00FF00FFC01A1D7E9C1F>65 D<0003F020001E0C60003002E000E003C001C001 +C0038001C0070000C00E0000801E0000801C0000803C0000803C00000078000000780000007800 +0000F0000000F0000000F0000000F0000000F0000400F0000400F0000400F00008007000080070 +00100038002000180040000C0180000706000001F800001B1E7A9C1E>67 +D<01FFFE00003C0780003801C0003801C0003800E0003800E0007000F000700070007000700070 +00F000E000F000E000F000E000F000E000F001C001E001C001E001C001E001C001C0038003C003 +800380038007800380070007000E0007001C0007003800070070000E01C000FFFF00001C1C7D9B +1F>I<01FFFFC0003C01C0003800C0003800800038008000380080007000800070008000702080 +0070200000E0400000E0400000E0C00000FFC00001C0800001C0800001C0800001C08000038100 +00038000000380000003800000070000000700000007000000070000000F000000FFF000001A1C +7D9B1B>70 D<01FFCFFE003C01E0003801C0003801C0003801C0003801C0007003800070038000 +7003800070038000E0070000E0070000E0070000FFFF0001C00E0001C00E0001C00E0001C00E00 +03801C0003801C0003801C0003801C00070038000700380007003800070038000F007800FFE7FF +001F1C7D9B1F>72 D<01FFC0003C00003800003800003800003800007000007000007000007000 +00E00000E00000E00000E00001C00001C00001C00001C000038000038000038000038000070000 +0700000700000700000F0000FFE000121C7E9B10>I<007FF00007800007000007000007000007 +00000E00000E00000E00000E00001C00001C00001C00001C000038000038000038000038000070 +0000700000700000700060E000E0E000C0C00081C0008380004700003C0000141D7B9B16>I<01 +FFE0003C0000380000380000380000380000700000700000700000700000E00000E00000E00000 +E00001C00001C00001C00001C0000380080380080380080380100700100700300700600700E00E +03C0FFFFC0151C7D9B1A>76 D<01FE0007F8003E000780002E000F00002E001700002E00170000 +2E002700004E002E00004E004E00004E004E00004E008E00008E011C00008E011C00008E021C00 +008E021C0001070438000107043800010708380001071038000207107000020720700002072070 +000207407000040740E000040780E000040700E0000C0700E0001C0601E000FF861FFC00251C7D +9B25>I<01FC03FE001C0070003C0060002E0040002E0040002E00400047008000470080004700 +80004380800083810000838100008181000081C1000101C2000101C2000100E2000100E2000200 +E4000200740002007400020074000400380004003800040038000C0018001C001000FF8010001F +1C7D9B1F>I<01FFF800003C0E0000380700003803800038038000380380007007800070078000 +70078000700F0000E00E0000E01C0000E0700000FFC00001C0C00001C0600001C0700001C07000 +038070000380700003807000038070000700F0000700F0400700F0400700F0800F007880FFE079 +0000001E001A1D7D9B1E>82 D<1FFFFFC01C0701C0300E00C0200E0080600E0080400E0080401C +0080801C0080801C0080001C000000380000003800000038000000380000007000000070000000 +7000000070000000E0000000E0000000E0000000E0000001C0000001C0000001C0000001C00000 +03C000007FFE00001A1C799B1E>84 D<7FF0FF800F001C000E0018000E0010000E0010000E0010 +001C0020001C0020001C0020001C00200038004000380040003800400038004000700080007000 +80007000800070008000E0010000E0010000E0010000E0020000E0020000E0040000E004000060 +08000030300000104000000F800000191D779B1F>I<FF83FF0FF03C007001C038007001803800 +F001003800F0020038017002003801700400380270040038027008001C047008001C047010001C +087010001C087020001C107020001C107040001C207040001C207080001C407180001C40710000 +1C807200001D807200001D007400001E007400001E007800001C007800001C0070000018007000 +0018006000001000600000241D779B29>87 D<03CC063C0C3C181C3838303870387038E070E070 +E070E070E0E2C0E2C0E261E462643C380F127B9115>97 D<3F00070007000E000E000E000E001C +001C001C001C0039C03E60383038307038703870387038E070E070E070E060E0E0C0C0C1C06180 +63003C000D1D7B9C13>I<01F007080C08181C3838300070007000E000E000E000E000E000E008 +E010602030C01F000E127B9113>I<001F80000380000380000700000700000700000700000E00 +000E00000E00000E0003DC00063C000C3C00181C00383800303800703800703800E07000E07000 +E07000E07000E0E200C0E200C0E20061E4006264003C3800111D7B9C15>I<01E007100C101808 +3810701070607F80E000E000E000E000E000E0086010602030C01F000D127B9113>I<0003C000 +0670000C70001C60001C00001C0000380000380000380000380000380003FF8000700000700000 +700000700000700000E00000E00000E00000E00000E00001C00001C00001C00001C00001C00003 +8000038000038000030000030000070000C60000E60000CC00007800001425819C0D>I<00F301 +8F030F06070E0E0C0E1C0E1C0E381C381C381C381C383830383038187818F00F700070007000E0 +00E0C0C0E1C0C3007E00101A7D9113>I<0FC00001C00001C00003800003800003800003800007 +00000700000700000700000E78000E8C000F0E000E0E001C0E001C0E001C0E001C0E00381C0038 +1C00381C00383800703880703880707080707100E03200601C00111D7D9C15>I<018003800100 +00000000000000000000000000001C002600470047008E008E000E001C001C001C003800380071 +0071007100720072003C00091C7C9B0D>I<0FC00001C00001C000038000038000038000038000 +0700000700000700000700000E0F000E11000E23800E43801C83001C80001D00001E00003F8000 +39C00038E00038E00070E20070E20070E20070E400E06400603800111D7D9C13>107 +D<1F800380038007000700070007000E000E000E000E001C001C001C001C003800380038003800 +7000700070007000E400E400E400E40068003800091D7C9C0B>I<3C1E0780266318C04683A0E0 +4703C0E08E0380E08E0380E00E0380E00E0380E01C0701C01C0701C01C0701C01C070380380E03 +88380E0388380E0708380E0710701C0320300C01C01D127C9122>I<3C3C002646004687004707 +008E07008E07000E07000E07001C0E001C0E001C0E001C1C00381C40381C403838403838807019 +00300E0012127C9117>I<01E007180C0C180C380C300E700E700EE01CE01CE01CE018E038E030 +E06060C031801E000F127B9115>I<07870004D98008E0C008E0C011C0E011C0E001C0E001C0E0 +0381C00381C00381C00381800703800703000707000706000E8C000E70000E00000E00001C0000 +1C00001C00001C00003C0000FF8000131A7F9115>I<03C4062C0C3C181C3838303870387038E0 +70E070E070E070E0E0C0E0C0E061E063C03DC001C001C0038003800380038007803FF00E1A7B91 +13>I<3C3C26C2468747078E068E000E000E001C001C001C001C00380038003800380070003000 +10127C9112>I<01F006080C080C1C18181C001F001FC00FF007F0007800386030E030C0308060 +60C01F000E127D9111>I<00C001C001C001C00380038003800380FFE00700070007000E000E00 +0E000E001C001C001C001C00384038403840388019000E000B1A7D990E>I<1E03002707004707 +00470700870E00870E000E0E000E0E001C1C001C1C001C1C001C1C003838803838801838801839 +001C5900078E0011127C9116>I<1E06270E470E4706870287020E020E021C041C041C041C0818 +083808181018200C4007800F127C9113>I<1E01832703874703874703838707018707010E0701 +0E07011C0E021C0E021C0E021C0E04180C04181C04181C081C1C100C263007C3C018127C911C> +I<070E0019910010E38020E38041C30041C00001C00001C0000380000380000380000380000702 +00670200E70400CB04008B080070F00011127D9113>I<1E03270747074707870E870E0E0E0E0E +1C1C1C1C1C1C1C1C38383838183818381C7007F00070007000E0E0C0E1C0818047003C00101A7C +9114>I E /Fn 7 121 df<60F0F06004047C830C>58 D<60F0F0701010101020204080040C7C83 +0C>I<0000038000000F0000003C000000F0000003C000000F0000003C000000F0000003C00000 +0F0000003C000000F0000000F00000003C0000000F00000003C0000000F00000003C0000000F00 +000003C0000000F00000003C0000000F000000038019187D9520>I<E0000000780000001E0000 +000780000001E0000000780000001E0000000780000001E0000000780000001E00000007800000 +078000001E00000078000001E00000078000001E00000078000001E00000078000001E00000078 +000000E000000019187D9520>62 D<0003F800000E0E000038038000E001C001C001C0038000E0 +070000E00F0000F01E0000F01C0000F03C0000F03C0000F0780000F0780000F0780000F0F00001 +E0F00001E0F00001E0F00003C0F00003C0F0000780F0000780F0000F0070000E0070001C003800 +38003C0070001C01C0000707800001FC00001C1E7E9C20>79 D<381F004E61804681C04701C08F +01C08E01C00E01C00E01C01C03801C03801C03801C0700380710380710380E10380E2070064030 +038014127E9119>110 D<07878008C84010F0C020F1E020E3C040E18000E00000E00001C00001 +C00001C00001C000638080F38080F38100E5810084C60078780013127E9118>120 +D E /Fo 73 123 df<003FE3F801F03F1C03C03E3E07C07C3E0F807C3E0F807C1C0F807C000F80 +7C000F807C000F807C000F807C00FFFFFFC0FFFFFFC00F807C000F807C000F807C000F807C000F +807C000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F807C00 +7FE1FFC07FE1FFC01F1D809C1C>11 D<003FC00001F0300003C0380007C07C000F807C000F807C +000F8038000F8000000F8000000F8000000F800000FFFFFC00FFFFFC000F807C000F807C000F80 +7C000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F +807C000F807C007FE1FF807FE1FF80191D809C1B>I<781E00FC3F00FC3F00FE3F80FE3F807A1E +80020080020080040100040100080200080200300C00401000110E7E9C19>34 +D<78FCFCFEFE7A0202040408083040070E7D9C0D>39 D<78FCFCFEFE7A0202040408083040070E +7D850D>44 D<FFE0FFE0FFE0FFE00B047F8A10>I<78FCFCFCFC7806067D850D>I<03F8000F1E00 +1C07003C07803803807803C07803C07803C0F803E0F803E0F803E0F803E0F803E0F803E0F803E0 +F803E0F803E0F803E0F803E0F803E07803C07803C03803803C07801C07000F1E0003F800131B7E +9A18>48 D<00600001E0000FE000FFE000F3E00003E00003E00003E00003E00003E00003E00003 +E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003 +E0007FFF807FFF80111B7D9A18>I<07F8001FFE00383F80780FC0FC07C0FC07E0FC03E0FC03E0 +7803E00007E00007C00007C0000F80001F00001E0000380000700000E000018060030060060060 +0800E01FFFC03FFFC07FFFC0FFFFC0FFFFC0131B7E9A18>I<03F8001FFE003C1F003C0F807C07 +C07E07C07C07C03807C0000F80000F80001E00003C0003F800001E00000F800007C00007C00007 +E03007E07807E0FC07E0FC07E0FC07C0780F80781F001FFE0007F800131B7E9A18>I<00018000 +0380000780000F80001F80003F80006F8000CF80008F80018F80030F80060F800C0F80180F8030 +0F80600F80C00F80FFFFF8FFFFF8000F80000F80000F80000F80000F80000F8001FFF801FFF815 +1B7F9A18>I<1801801FFF001FFE001FFC001FF8001FC00018000018000018000018000019F800 +1E0E00180F801007800007C00007E00007E00007E07807E0F807E0F807E0F807C0F007C0600F80 +381F001FFE0007F000131B7E9A18>I<007E0003FF000781800F03C01E07C03C07C03C03807800 +00780000F80000F8F800FB0E00FA0780FC0380FC03C0F803E0F803E0F803E0F803E07803E07803 +E07803C03C03C03C07801E0F0007FE0003F800131B7E9A18>I<6000007FFFE07FFFE07FFFC07F +FF807FFF80E00300C00600C00C00C0180000300000300000600000E00000E00001E00001C00003 +C00003C00003C00003C00007C00007C00007C00007C00007C00007C000038000131C7D9B18>I< +03F8000FFE001E0F803807803803C07803C07803C07E03C07F83807FC7003FFE001FFC000FFE00 +07FF801DFF80387FC0781FE0F007E0F003E0F001E0F001E0F001E07801C07803803E07801FFE00 +03F800131B7E9A18>I<03F8000FFE001E0F003C07807807807803C0F803C0F803C0F803E0F803 +E0F803E0F803E07807E03807E03C0BE00E1BE003E3E00003E00003C00003C03807C07C07807C07 +00780F00383C001FF8000FE000131B7E9A18>I<78FCFCFCFC7800000000000078FCFCFCFC7806 +127D910D>I<00038000000380000007C0000007C0000007C000000FE000000FE000001FF00000 +1BF000001BF0000031F8000031F8000061FC000060FC0000E0FE0000C07E0000C07E0001803F00 +01FFFF0003FFFF8003001F8003001F8006000FC006000FC00E000FE00C0007E0FFC07FFEFFC07F +FE1F1C7E9B24>65 D<FFFFF800FFFFFF000FC01F800FC00FC00FC007C00FC007E00FC007E00FC0 +07E00FC007E00FC007E00FC007C00FC00F800FC03F000FFFFE000FC00F800FC007C00FC007E00F +C003E00FC003F00FC003F00FC003F00FC003F00FC003F00FC007E00FC007E00FC01FC0FFFFFF00 +FFFFFC001C1C7E9B22>I<001FE02000FFF8E003F80FE007C003E00F8001E01F0000E03E0000E0 +3E0000607E0000607C000060FC000000FC000000FC000000FC000000FC000000FC000000FC0000 +00FC0000007C0000607E0000603E0000603E0000C01F0000C00F80018007C0030003F80E0000FF +FC00001FE0001B1C7D9B22>I<FFFFF800FFFFFF000FC01FC00FC007E00FC001F00FC001F80FC0 +00F80FC000FC0FC0007C0FC0007C0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0F +C0007E0FC0007E0FC0007C0FC0007C0FC0007C0FC000F80FC000F80FC001F00FC007E00FC01FC0 +FFFFFF00FFFFF8001F1C7E9B25>I<FFFFFF00FFFFFF000FC01F000FC007000FC003000FC00380 +0FC003800FC181800FC181800FC181800FC180000FC380000FFF80000FFF80000FC380000FC180 +000FC180000FC180600FC180600FC000E00FC000C00FC000C00FC001C00FC001C00FC003C00FC0 +0F80FFFFFF80FFFFFF801B1C7E9B1F>I<FFFFFF00FFFFFF000FC01F000FC007000FC003000FC0 +03800FC003800FC001800FC181800FC181800FC180000FC180000FC380000FFF80000FFF80000F +C380000FC180000FC180000FC180000FC180000FC000000FC000000FC000000FC000000FC00000 +0FC00000FFFF0000FFFF0000191C7E9B1E>I<000FF008007FFE3801FC07F807E001F80F800078 +1F0000783F0000383E0000387E0000187C000018FC000000FC000000FC000000FC000000FC0000 +00FC000000FC007FFFFC007FFF7C0001F87E0001F83E0001F83F0001F81F0001F80F8001F807E0 +01F801FC07F8007FFE78000FF818201C7D9B26>I<FFFC3FFFFFFC3FFF0FC003F00FC003F00FC0 +03F00FC003F00FC003F00FC003F00FC003F00FC003F00FC003F00FC003F00FFFFFF00FFFFFF00F +C003F00FC003F00FC003F00FC003F00FC003F00FC003F00FC003F00FC003F00FC003F00FC003F0 +0FC003F00FC003F0FFFC3FFFFFFC3FFF201C7E9B25>I<FFFFFFFF07E007E007E007E007E007E0 +07E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E0FFFFFF +FF101C7F9B12>I<07FFF007FFF0001F80001F80001F80001F80001F80001F80001F80001F8000 +1F80001F80001F80001F80001F80001F80001F80001F80001F80001F80301F80781F80FC1F80FC +1F80FC1F00783E00387C000FF000141C7F9B19>I<FFFC07FFFFFC07FF0FC000E00FC001C00FC0 +03800FC006000FC00C000FC038000FC070000FC0E0000FC1C0000FC3C0000FC7E0000FCFE0000F +FBF0000FF3F8000FE1F8000FC0FC000FC0FE000FC07E000FC03F000FC01F800FC01FC00FC00FC0 +0FC007E00FC007F0FFFC3FFFFFFC3FFF201C7E9B25>I<FFFF00FFFF000FC0000FC0000FC0000F +C0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0030F +C0030FC0030FC0070FC0070FC0060FC00E0FC01E0FC07EFFFFFEFFFFFE181C7E9B1D>I<FFC000 +03FFFFE00007FF0FE00007F00DF0000DF00DF0000DF00DF0000DF00CF80019F00CF80019F00C7C +0031F00C7C0031F00C3E0061F00C3E0061F00C1F00C1F00C1F00C1F00C1F00C1F00C0F8181F00C +0F8181F00C07C301F00C07C301F00C03E601F00C03E601F00C01FC01F00C01FC01F00C01FC01F0 +0C00F801F00C00F801F0FFC0701FFFFFC0701FFF281C7E9B2D>I<FFE003FFFFE003FF0FF00030 +0FF800300DFC00300CFE00300C7E00300C3F00300C1F80300C1FC0300C0FE0300C07F0300C03F0 +300C01F8300C01FC300C00FE300C007F300C003F300C001FB00C001FF00C000FF00C0007F00C00 +03F00C0001F00C0000F00C0000F0FFC00070FFC00030201C7E9B25>I<003FE00001F07C0003C0 +1E000F800F801F0007C01E0003C03E0003E07E0003F07C0001F07C0001F0FC0001F8FC0001F8FC +0001F8FC0001F8FC0001F8FC0001F8FC0001F8FC0001F87C0001F07E0003F07E0003F03E0003E0 +3F0007E01F0007C00F800F8003C01E0001F07C00003FE0001D1C7D9B24>I<FFFFF800FFFFFE00 +0FC03F800FC00F800FC007C00FC007E00FC007E00FC007E00FC007E00FC007E00FC007C00FC007 +C00FC00F800FC03F000FFFFC000FC000000FC000000FC000000FC000000FC000000FC000000FC0 +00000FC000000FC000000FC000000FC00000FFFC0000FFFC00001B1C7E9B21>I<003FE00001F0 +7C0003C01E000F800F801F0007C01F0007C03E0003E07E0003F07C0001F07C0001F0FC0001F8FC +0001F8FC0001F8FC0001F8FC0001F8FC0001F8FC0001F8FC0001F87C0001F07C0001F07E0003F0 +3E0003E03E0703E01F08C7C00F906F8003D07E0001F87C00003FF8080000380800003C1800003F +F800001FF800001FF000000FF0000007E0000003C01D247D9B24>I<FFFFF00000FFFFFE00000F +C03F00000FC00F80000FC007C0000FC007E0000FC007E0000FC007E0000FC007E0000FC007E000 +0FC007C0000FC00F80000FC03E00000FFFF000000FC07C00000FC03E00000FC03F00000FC01F80 +000FC01F80000FC01F80000FC01F80000FC01F80000FC01F80000FC01F81800FC01F81800FC00F +C180FFFC07C300FFFC01FE00211C7E9B24>I<07F8201FFEE03C07E07801E07000E0F000E0F000 +60F00060F80000FE0000FFE0007FFE003FFF003FFF800FFFC007FFE0007FE00003F00001F00000 +F0C000F0C000F0C000E0E000E0F001C0FC03C0EFFF0083FC00141C7D9B1B>I<7FFFFFE07FFFFF +E0781F81E0701F80E0601F8060E01F8070C01F8030C01F8030C01F8030C01F8030001F8000001F +8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800000 +1F8000001F8000001F8000001F8000001F800007FFFE0007FFFE001C1C7E9B21>I<FFFC03FFFF +FC03FF0FC000300FC000300FC000300FC000300FC000300FC000300FC000300FC000300FC00030 +0FC000300FC000300FC000300FC000300FC000300FC000300FC000300FC000300FC000300FC000 +3007C0003007C0006003E000E001F001C000FC0780007FFE00000FF800201C7E9B25>I<FFFC01 +FF80FFFC01FF800FC000180007E000300007E000300007F000700003F000600003F800E00001F8 +00C00001FC00C00000FC01800000FC018000007E030000007E030000007F070000003F06000000 +3F8E0000001F8C0000001FCC0000000FD80000000FD800000007F000000007F000000007F00000 +0003E000000003E000000001C000000001C00000211C7F9B24>I<FFFC7FFE0FFCFFFC7FFE0FFC +0FC007E000C00FC007F000C00FE003F001C007E003F0018007E007F8018003F007F8030003F007 +F8030003F80CFC070001F80CFC060001F81CFE060001FC187E0E0000FC187E0C0000FC387F0C00 +007E303F1800007E303F1800007F601FB800003F601FB000003FE01FF000003FC00FF000001FC0 +0FE000001FC00FE000000F8007C000000F8007C000000F0003C000000700038000000700038000 +2E1C7F9B31>I<7FFE1FFE007FFE1FFE0007F001800003F803800001FC07000000FC06000000FE +0C0000007F1C0000003F380000003FB00000001FE00000000FE00000000FE000000007F0000000 +03F800000007F80000000FFC0000000CFE000000187E000000387F000000703F800000601F8000 +00C01FC00001C00FE000018007F000030007F000FFF03FFF80FFF03FFF80211C7F9B24>I<FFFC +01FF80FFFC01FF800FE000380007F000300003F800700003F800600001FC00C00000FE01C00000 +FE018000007F030000003F870000003F860000001FCE0000000FFC0000000FF800000007F80000 +0003F000000003F000000003F000000003F000000003F000000003F000000003F000000003F000 +000003F000000003F00000003FFF0000003FFF0000211C7F9B24>I<7FFFFC7FFFFC7E01F87803 +F87003F0E007E0E007E0C00FC0C01FC0C01F80003F00007F00007E0000FC0000FC0001F80003F8 +0603F00607E0060FE0060FC00E1F800E1F801C3F001C7F003C7E00FCFFFFFCFFFFFC171C7D9B1D +>I<FEFEFEE0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0 +E0FEFEFE07297C9E0D>I<040100180600200800200800401000401000802000802000BC2F00FE +3F80FE3F807E1F807E1F803C0F00110E7B9C19>I<FEFEFE0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E +0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0EFEFEFE07297F9E0D>I<0FF8001C1E003E0F80 +3E07803E07C01C07C00007C0007FC007E7C01F07C03C07C07C07C0F807C0F807C0F807C0780BC0 +3E13F80FE1F815127F9117>97 D<FF0000FF00001F00001F00001F00001F00001F00001F00001F +00001F00001F00001F3F801FE1E01F80701F00781F003C1F003C1F003E1F003E1F003E1F003E1F +003E1F003E1F003C1F003C1F00781F80701EC1E01C3F00171D7F9C1B>I<03FC000E0E001C1F00 +3C1F00781F00780E00F80000F80000F80000F80000F80000F800007800007801803C01801C0300 +0E0E0003F80011127E9115>I<000FF0000FF00001F00001F00001F00001F00001F00001F00001 +F00001F00001F001F9F00F07F01C03F03C01F07801F07801F0F801F0F801F0F801F0F801F0F801 +F0F801F07801F07801F03C01F01C03F00F0FFE03F9FE171D7E9C1B>I<01FC000F07001C03803C +01C07801C07801E0F801E0F801E0FFFFE0F80000F80000F800007800007C00603C00601E00C00F +038001FC0013127F9116>I<007F0001E38003C7C00787C00F87C00F83800F80000F80000F8000 +0F80000F8000FFF800FFF8000F80000F80000F80000F80000F80000F80000F80000F80000F8000 +0F80000F80000F80000F80000F80007FF8007FF800121D809C0F>I<03F8F00E0F381E0F381C07 +303C07803C07803C07803C07801C07001E0F000E0E001BF8001000001800001800001FFF001FFF +C00FFFE01FFFF07801F8F00078F00078F000787000707800F01E03C007FF00151B7F9118>I<FF +0000FF00001F00001F00001F00001F00001F00001F00001F00001F00001F00001F0FC01F31E01F +40F01F80F81F80F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F +00F8FFE7FFFFE7FF181D7F9C1B>I<1E003F003F003F003F001E00000000000000000000000000 +FF00FF001F001F001F001F001F001F001F001F001F001F001F001F001F001F00FFE0FFE00B1E7F +9D0E>I<007800FC00FC00FC00FC007800000000000000000000000003FC03FC007C007C007C00 +7C007C007C007C007C007C007C007C007C007C007C007C007C007C007C707CF87CF878F8F070E0 +1F800E26839D0F>I<FF0000FF00001F00001F00001F00001F00001F00001F00001F00001F0000 +1F00001F0FF81F0FF81F03801F07001F0C001F18001F70001FF8001FFC001FBC001F3E001F1F00 +1F0F001F0F801F07C01F03E0FFC7FCFFC7FC161D7F9C19>I<FF00FF001F001F001F001F001F00 +1F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F +00FFE0FFE00B1D7F9C0E>I<FF0FC07E00FF31E18F001F40F207801F80FC07C01F80FC07C01F00 +F807C01F00F807C01F00F807C01F00F807C01F00F807C01F00F807C01F00F807C01F00F807C01F +00F807C01F00F807C01F00F807C0FFE7FF3FF8FFE7FF3FF825127F9128>I<FF0FC0FF31E01F40 +F01F80F81F80F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00 +F8FFE7FFFFE7FF18127F911B>I<01FC000F07801C01C03C01E07800F07800F0F800F8F800F8F8 +00F8F800F8F800F8F800F87800F07800F03C01E01E03C00F078001FC0015127F9118>I<FF3F80 +FFE1E01F80F01F00781F007C1F003C1F003E1F003E1F003E1F003E1F003E1F003E1F003C1F007C +1F00781F80F01FC1E01F3F001F00001F00001F00001F00001F00001F0000FFE000FFE000171A7F +911B>I<03F0600F0CE01E07E03C03E07C03E07803E0F803E0F803E0F803E0F803E0F803E0F803 +E07803E07C03E03C03E01C07E00E0FE003F3E00003E00003E00003E00003E00003E00003E0001F +FC001FFC161A7E9119>I<FE3E00FE47001E8F801E8F801E8F801F07001F00001F00001F00001F +00001F00001F00001F00001F00001F00001F0000FFF000FFF00011127F9114>I<1FD830786018 +E018E018F000FF807FE07FF01FF807FC007CC01CC01CE01CE018F830CFC00E127E9113>I<0300 +030003000300070007000F000F003FFCFFFC1F001F001F001F001F001F001F001F001F001F0C1F +0C1F0C1F0C0F08079803F00E1A7F9913>I<FF07F8FF07F81F00F81F00F81F00F81F00F81F00F8 +1F00F81F00F81F00F81F00F81F00F81F00F81F00F81F01F80F01F80786FF01F8FF18127F911B> +I<FFC1FCFFC1FC1F00601F80E00F80C00FC0C007C18007C18003E30003E30001F60001F60001FE +0000FC0000FC0000780000780000300016127F9119>I<FF8FF8FEFF8FF8FE1F03E0301F03E030 +1F83E0700F83F0600F86F06007C6F0C007CEF8C007EC79C003EC7D8003F83D8001F83F0001F83F +0001F01F0000F01E0000E00E0000E00E001F127F9122>I<FFC7FCFFC7FC1F81800F838007C700 +03EE0001FC0001F80000F800007C0000FE0001DF00039F00070F800607C00C03E0FF07FCFF07FC +16127F9119>I<FFC1FCFFC1FC1F00601F80E00F80C00FC0C007C18007C18003E30003E30001F7 +0001F60000FE0000FC0000FC00007800007800003000003000007000706000F86000F8C000F980 +007300003E0000161A7F9119>I<3FFF803C1F00303F00303E00607C0060FC0060F80001F00003 +F00007E00007C1800F81801F81801F03803E03007E07007C0F00FFFF0011127F9115>I +E /Fp 33 122 df<00000007FF800000000001FFFFF0000000000FFFFFFC000000003FFFFFFE00 +000000FFFC00FF00000001FFC0003F80000007FF00007FC000000FFE0001FFC000001FFC0001FF +E000001FF80003FFE000003FF00003FFE000003FF00003FFE000007FE00003FFE000007FE00003 +FFE000007FE00003FFE000007FE00003FFE000007FE00001FFC000007FE00000FF8000007FE000 +003E0000007FE00000000000007FE00000000000007FE00000000000007FE00000000000007FE0 +0000000000007FE00000000000007FE0003FFFF000FFFFFFFFFFFFF000FFFFFFFFFFFFF000FFFF +FFFFFFFFF000FFFFFFFFFFFFF000FFFFFFFFFFFFF000007FF00000FFF000007FF000007FF00000 +7FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000 +007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF0 +00007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007F +F000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF00000 +7FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000 +007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF0 +00007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF0003FFF +FFE03FFFFFE03FFFFFE03FFFFFE03FFFFFE03FFFFFE03FFFFFE03FFFFFE03FFFFFE03FFFFFE03B +487EC742>12 D<0000000003E000000000000000000007F000000000000000000007F000000000 +00000000000FF80000000000000000000FF80000000000000000000FF80000000000000000001F +FC0000000000000000001FFC0000000000000000003FFE0000000000000000003FFE0000000000 +000000007FFF0000000000000000007FFF0000000000000000007FFF000000000000000000FFFF +800000000000000000FFFF800000000000000001FFFFC00000000000000001FFFFC00000000000 +000001FFFFC00000000000000003FFFFE00000000000000003EFFFE00000000000000007EFFFF0 +0000000000000007CFFFF00000000000000007C7FFF0000000000000000FC7FFF8000000000000 +000F83FFF8000000000000001F83FFFC000000000000001F03FFFC000000000000001F01FFFC00 +0000000000003F01FFFE000000000000003E00FFFE000000000000007E00FFFF00000000000000 +7C007FFF00000000000000FC007FFF80000000000000F8007FFF80000000000000F8003FFF8000 +0000000001F8003FFFC0000000000001F0001FFFC0000000000003F0001FFFE0000000000003E0 +001FFFE0000000000003E0000FFFE0000000000007E0000FFFF0000000000007C00007FFF00000 +0000000FC00007FFF800000000000F800007FFF800000000000F800003FFF800000000001F8000 +03FFFC00000000001F000001FFFC00000000003FFFFFFFFFFE00000000003FFFFFFFFFFE000000 +00007FFFFFFFFFFF00000000007FFFFFFFFFFF00000000007FFFFFFFFFFF0000000000FC000000 +7FFF8000000000F80000003FFF8000000001F80000003FFFC000000001F00000003FFFC0000000 +01F00000001FFFC000000003F00000001FFFE000000003E00000000FFFE000000007E00000000F +FFF000000007C00000000FFFF000000007C000000007FFF00000000FC000000007FFF80000000F +8000000003FFF80000001F8000000003FFFC0000001F0000000003FFFC0000007FC000000001FF +FC0000FFFFFFC00007FFFFFFFF80FFFFFFC00007FFFFFFFF80FFFFFFC00007FFFFFFFF80FFFFFF +C00007FFFFFFFF80FFFFFFC00007FFFFFFFF8051487CC75A>65 D<000000003FFE00000E000000 +0FFFFFC0001E0000007FFFFFF8003E000003FFFFFFFE00FE00000FFFFFFFFF81FE00003FFFF800 +FFC3FE0000FFFF80000FF7FE0001FFFC000003FFFE0007FFF0000001FFFE000FFFC00000007FFE +001FFF800000003FFE003FFF000000001FFE007FFE000000000FFE00FFFC0000000007FE01FFF8 +0000000007FE03FFF00000000003FE03FFF00000000001FE07FFE00000000001FE07FFE0000000 +0000FE0FFFC00000000000FE0FFFC000000000007E1FFFC000000000007E1FFF8000000000007E +3FFF8000000000007E3FFF8000000000003E3FFF8000000000003E7FFF8000000000003E7FFF00 +00000000003E7FFF000000000000007FFF00000000000000FFFF00000000000000FFFF00000000 +000000FFFF00000000000000FFFF00000000000000FFFF00000000000000FFFF00000000000000 +FFFF00000000000000FFFF00000000000000FFFF00000000000000FFFF00000000000000FFFF00 +000000000000FFFF00000000000000FFFF000000000000007FFF000000000000007FFF00000000 +0000007FFF000000000000007FFF8000000000003E3FFF8000000000003E3FFF8000000000003E +3FFF8000000000003E1FFF8000000000003E1FFFC000000000003E0FFFC000000000007C0FFFC0 +00000000007C07FFE000000000007C07FFE00000000000F803FFF00000000000F803FFF0000000 +0001F801FFF80000000001F000FFFC0000000003E0007FFE0000000007E0003FFF000000000FC0 +001FFF800000001F80000FFFC00000003F000007FFF0000000FE000001FFFC000001FC000000FF +FF80000FF80000003FFFF8007FF00000000FFFFFFFFFC000000003FFFFFFFF00000000007FFFFF +FC00000000000FFFFFE00000000000003FFE000000474979C756>67 D<FFFFFFFFFFFFC0000000 +FFFFFFFFFFFFFE000000FFFFFFFFFFFFFFC00000FFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFC00 +00001FFF800007FFFF0000001FFF8000007FFF8000001FFF8000000FFFE000001FFF80000007FF +F000001FFF80000001FFF800001FFF80000000FFFC00001FFF800000007FFE00001FFF80000000 +3FFF00001FFF800000001FFF00001FFF800000000FFF80001FFF800000000FFFC0001FFF800000 +0007FFC0001FFF8000000007FFE0001FFF8000000003FFE0001FFF8000000003FFF0001FFF8000 +000003FFF0001FFF8000000003FFF8001FFF8000000001FFF8001FFF8000000001FFF8001FFF80 +00000001FFFC001FFF8000000001FFFC001FFF8000000001FFFC001FFF8000000001FFFC001FFF +8000000001FFFC001FFF8000000001FFFE001FFF8000000000FFFE001FFF8000000000FFFE001F +FF8000000000FFFE001FFF8000000000FFFE001FFF8000000000FFFE001FFF8000000000FFFE00 +1FFF8000000000FFFE001FFF8000000000FFFE001FFF8000000000FFFE001FFF8000000000FFFE +001FFF8000000000FFFE001FFF8000000000FFFE001FFF8000000001FFFE001FFF8000000001FF +FC001FFF8000000001FFFC001FFF8000000001FFFC001FFF8000000001FFFC001FFF8000000001 +FFF8001FFF8000000001FFF8001FFF8000000001FFF8001FFF8000000003FFF0001FFF80000000 +03FFF0001FFF8000000003FFF0001FFF8000000007FFE0001FFF8000000007FFE0001FFF800000 +000FFFC0001FFF800000000FFF80001FFF800000001FFF80001FFF800000003FFF00001FFF8000 +00003FFE00001FFF800000007FFC00001FFF80000001FFF800001FFF80000003FFF000001FFF80 +00000FFFE000001FFF8000007FFFC000001FFF800003FFFF0000FFFFFFFFFFFFFFFE0000FFFFFF +FFFFFFFFF80000FFFFFFFFFFFFFFC00000FFFFFFFFFFFFFE000000FFFFFFFFFFFFC00000004F47 +7CC65B>I<FFFFFFFFFFFFFFFC00FFFFFFFFFFFFFFFC00FFFFFFFFFFFFFFFC00FFFFFFFFFFFFFF +FC00FFFFFFFFFFFFFFFE00001FFFC00003FFFE00001FFFC000003FFE00001FFFC000000FFE0000 +1FFFC0000003FE00001FFFC0000001FE00001FFFC0000000FE00001FFFC0000000FE00001FFFC0 +0000007E00001FFFC00000007F00001FFFC00000003F00001FFFC00000003F00001FFFC0000000 +1F00001FFFC00000001F00001FFFC00000001F00001FFFC00000001F00001FFFC0007C001F0000 +1FFFC0007C000F80001FFFC0007C000F80001FFFC0007C000F80001FFFC0007C000F80001FFFC0 +007C000000001FFFC000FC000000001FFFC000FC000000001FFFC000FC000000001FFFC001FC00 +0000001FFFC003FC000000001FFFC01FFC000000001FFFFFFFFC000000001FFFFFFFFC00000000 +1FFFFFFFFC000000001FFFFFFFFC000000001FFFFFFFFC000000001FFFC01FFC000000001FFFC0 +03FC000000001FFFC001FC000000001FFFC000FC000000001FFFC000FC000000001FFFC000FC00 +0000001FFFC0007C000000001FFFC0007C000000001FFFC0007C000000001FFFC0007C00000000 +1FFFC0007C000000001FFFC0007C000000001FFFC00000000000001FFFC00000000000001FFFC0 +0000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC0000000 +0000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC0000000000000 +1FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC0 +0000000000FFFFFFFFFF00000000FFFFFFFFFF00000000FFFFFFFFFF00000000FFFFFFFFFF0000 +0000FFFFFFFFFF0000000041467CC54B>70 D<000000003FFE00000E000000000FFFFFC0001E00 +0000007FFFFFF8003E00000003FFFFFFFE00FE0000000FFFFFFFFF81FE0000003FFFF800FFC3FE +000000FFFF80000FF7FE000001FFFC000003FFFE000007FFF0000001FFFE00000FFFC00000007F +FE00001FFF800000003FFE00003FFF000000001FFE00007FFE000000000FFE0000FFFC00000000 +07FE0001FFF80000000007FE0003FFF00000000003FE0003FFF00000000001FE0007FFE0000000 +0001FE0007FFE00000000000FE000FFFC00000000000FE000FFFC000000000007E001FFFC00000 +0000007E001FFF8000000000007E003FFF8000000000007E003FFF8000000000003E003FFF8000 +000000003E007FFF8000000000003E007FFF0000000000003E007FFF00000000000000007FFF00 +00000000000000FFFF0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF +0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF0000000000000000FF +FF0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF0000000000000000 +FFFF0000000000000000FFFF0000007FFFFFFFFE7FFF0000007FFFFFFFFE7FFF0000007FFFFFFF +FE7FFF8000007FFFFFFFFE7FFF8000007FFFFFFFFE3FFF8000000000FFFE003FFF8000000000FF +FE003FFF8000000000FFFE001FFF8000000000FFFE001FFFC000000000FFFE000FFFC000000000 +FFFE000FFFC000000000FFFE0007FFE000000000FFFE0007FFE000000000FFFE0003FFF0000000 +00FFFE0003FFF800000000FFFE0001FFF800000000FFFE0000FFFC00000000FFFE00007FFE0000 +0000FFFE00003FFF00000000FFFE00001FFF80000000FFFE00000FFFE0000001FFFE000007FFF0 +000003FFFE000001FFFC000007FFFE000000FFFF80001FFFFE0000003FFFFC00FFC7FE0000000F +FFFFFFFF83FE00000003FFFFFFFE00FE000000007FFFFFF8003E000000000FFFFFE0000E000000 +00003FFE000000004F4979C75D>I<FFFFFFFFF801FFFFFFFFF0FFFFFFFFF801FFFFFFFFF0FFFF +FFFFF801FFFFFFFFF0FFFFFFFFF801FFFFFFFFF0FFFFFFFFF801FFFFFFFFF0001FFFC00000003F +FF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFF +C00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF +8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC0 +0000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF80 +00001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC000 +00003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000 +001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000 +003FFF8000001FFFC00000003FFF8000001FFFFFFFFFFFFFFF8000001FFFFFFFFFFFFFFF800000 +1FFFFFFFFFFFFFFF8000001FFFFFFFFFFFFFFF8000001FFFFFFFFFFFFFFF8000001FFFC0000000 +3FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001F +FFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003F +FF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFF +C00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF +8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC0 +0000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF80 +00001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC000 +00003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000 +FFFFFFFFF801FFFFFFFFF0FFFFFFFFF801FFFFFFFFF0FFFFFFFFF801FFFFFFFFF0FFFFFFFFF801 +FFFFFFFFF0FFFFFFFFF801FFFFFFFFF054477CC65D>I<FFFFFFFFFEFFFFFFFFFEFFFFFFFFFEFF +FFFFFFFEFFFFFFFFFE000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000 +000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE0 +00000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFF +E000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000F +FFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE00000 +0FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000 +000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE0 +00000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFF +E000FFFFFFFFFEFFFFFFFFFEFFFFFFFFFEFFFFFFFFFEFFFFFFFFFE27477DC62D>I<FFFFFFC000 +0000FFFFFFF0FFFFFFE0000000FFFFFFF0FFFFFFF0000000FFFFFFF0FFFFFFF8000000FFFFFFF0 +FFFFFFFC000000FFFFFFF0001FFFFC000000007FE000001FFFFE000000001F8000001FFFFF0000 +00001F8000001FFFFF800000001F8000001FFFFFC00000001F8000001FBFFFE00000001F800000 +1F9FFFE00000001F8000001F9FFFF00000001F8000001F8FFFF80000001F8000001F87FFFC0000 +001F8000001F83FFFE0000001F8000001F81FFFF0000001F8000001F80FFFF0000001F8000001F +80FFFF8000001F8000001F807FFFC000001F8000001F803FFFE000001F8000001F801FFFF00000 +1F8000001F800FFFF800001F8000001F8007FFF800001F8000001F8007FFFC00001F8000001F80 +03FFFE00001F8000001F8001FFFF00001F8000001F8000FFFF80001F8000001F80007FFFC0001F +8000001F80003FFFC0001F8000001F80003FFFE0001F8000001F80001FFFF0001F8000001F8000 +0FFFF8001F8000001F800007FFFC001F8000001F800003FFFE001F8000001F800001FFFF001F80 +00001F800001FFFF001F8000001F800000FFFF801F8000001F8000007FFFC01F8000001F800000 +3FFFE01F8000001F8000001FFFF01F8000001F8000000FFFF81F8000001F8000000FFFF81F8000 +001F80000007FFFC1F8000001F80000003FFFE1F8000001F80000001FFFF1F8000001F80000000 +FFFF9F8000001F800000007FFFDF8000001F800000007FFFDF8000001F800000003FFFFF800000 +1F800000001FFFFF8000001F800000000FFFFF8000001F8000000007FFFF8000001F8000000003 +FFFF8000001F8000000003FFFF8000001F8000000001FFFF8000001F8000000000FFFF8000001F +80000000007FFF8000001F80000000003FFF8000001F80000000001FFF8000001F80000000001F +FF8000001F80000000000FFF8000001F800000000007FF8000001F800000000003FF8000001F80 +0000000001FF8000007FE00000000000FF8000FFFFFFF000000000FF8000FFFFFFF0000000007F +8000FFFFFFF0000000003F8000FFFFFFF0000000001F8000FFFFFFF0000000000F000054477CC6 +5D>78 D<FFFFFFFFFFFF800000FFFFFFFFFFFFFC0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFC0 +00FFFFFFFFFFFFFFF000001FFF80000FFFFC00001FFF800001FFFE00001FFF8000007FFF00001F +FF8000003FFF80001FFF8000001FFFC0001FFF8000000FFFC0001FFF8000000FFFE0001FFF8000 +000FFFE0001FFF80000007FFF0001FFF80000007FFF0001FFF80000007FFF0001FFF80000007FF +F8001FFF80000007FFF8001FFF80000007FFF8001FFF80000007FFF8001FFF80000007FFF8001F +FF80000007FFF8001FFF80000007FFF8001FFF80000007FFF8001FFF80000007FFF0001FFF8000 +0007FFF0001FFF80000007FFF0001FFF8000000FFFE0001FFF8000000FFFE0001FFF8000000FFF +C0001FFF8000001FFF80001FFF8000003FFF80001FFF8000007FFF00001FFF800001FFFE00001F +FF80000FFFF800001FFFFFFFFFFFF000001FFFFFFFFFFFC000001FFFFFFFFFFE0000001FFFFFFF +FFF00000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC000000000 +00001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001F +FFC00000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC000 +00000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC000000000 +00001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001F +FFC00000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC000 +00000000001FFFC00000000000FFFFFFFFF800000000FFFFFFFFF800000000FFFFFFFFF8000000 +00FFFFFFFFF800000000FFFFFFFFF80000000045477CC651>80 D<FFFFFFFFFFFC0000000000FF +FFFFFFFFFFF000000000FFFFFFFFFFFFFE00000000FFFFFFFFFFFFFF80000000FFFFFFFFFFFFFF +E0000000001FFF80001FFFF8000000001FFF800001FFFC000000001FFF8000007FFF000000001F +FF8000003FFF800000001FFF8000001FFF800000001FFF8000000FFFC00000001FFF8000000FFF +E00000001FFF8000000FFFE00000001FFF80000007FFF00000001FFF80000007FFF00000001FFF +80000007FFF80000001FFF80000007FFF80000001FFF80000007FFF80000001FFF80000007FFF8 +0000001FFF80000007FFF80000001FFF80000007FFF80000001FFF80000007FFF80000001FFF80 +000007FFF80000001FFF80000007FFF00000001FFF80000007FFF00000001FFF8000000FFFE000 +00001FFF8000000FFFE00000001FFF8000000FFFC00000001FFF8000001FFF800000001FFF8000 +003FFF000000001FFF800000FFFE000000001FFF800003FFF8000000001FFF80001FFFF0000000 +001FFFFFFFFFFFC0000000001FFFFFFFFFFE00000000001FFFFFFFFFF800000000001FFFFFFFFF +FE00000000001FFF80007FFF80000000001FFF80001FFFC0000000001FFF800007FFE000000000 +1FFF800003FFF0000000001FFF800001FFF8000000001FFF800001FFFC000000001FFF800000FF +FE000000001FFF800000FFFE000000001FFF8000007FFE000000001FFF8000007FFF000000001F +FF8000007FFF000000001FFF8000007FFF000000001FFF8000007FFF000000001FFF8000007FFF +000000001FFF8000007FFF000000001FFF8000007FFF000000001FFF8000007FFF800000001FFF +8000007FFF800000001FFF8000007FFF800000001FFF8000007FFF800000001FFF8000007FFF80 +0000001FFF8000007FFF8000E0001FFF8000007FFF8001F0001FFF8000007FFFC001F0001FFF80 +00007FFFC001F0001FFF8000003FFFC001F0001FFF8000003FFFC003F0001FFF8000001FFFE003 +E0001FFF8000000FFFE007E0FFFFFFFFF00007FFF007C0FFFFFFFFF00003FFFC1F80FFFFFFFFF0 +0001FFFFFF00FFFFFFFFF000007FFFFE00FFFFFFFFF000001FFFFC000000000000000000FFF000 +54487CC659>82 D<3FFFFFFFFFFFFFFFFF003FFFFFFFFFFFFFFFFF003FFFFFFFFFFFFFFFFF003F +FFFFFFFFFFFFFFFF003FFFFFFFFFFFFFFFFF003FFF0003FFF8003FFF007FF80003FFF80007FF80 +7FE00003FFF80001FF807FC00003FFF80000FF807F800003FFF800007F807F000003FFF800003F +807F000003FFF800003F807E000003FFF800001F807E000003FFF800001F807E000003FFF80000 +0F807C000003FFF800000F807C000003FFF800000F807C000003FFF800000F807C000003FFF800 +000F80FC000003FFF800000FC0F8000003FFF8000007C0F8000003FFF8000007C0F8000003FFF8 +000007C0F8000003FFF8000007C0F8000003FFF8000007C000000003FFF80000000000000003FF +F80000000000000003FFF80000000000000003FFF80000000000000003FFF80000000000000003 +FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF800000000000000 +03FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF8000000000000 +0003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF80000000000 +000003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF800000000 +00000003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF8000000 +0000000003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF80000 +000000000003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF800 +00000000000003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF8 +0000000000000003FFF80000000000000003FFF80000000000000003FFF8000000000003FFFFFF +FFFFF800000003FFFFFFFFFFF800000003FFFFFFFFFFF800000003FFFFFFFFFFF800000003FFFF +FFFFFFF800004A467CC553>84 D<FFFFFFFFC03FFFFFFFF0001FFFFFF0FFFFFFFFC03FFFFFFFF0 +001FFFFFF0FFFFFFFFC03FFFFFFFF0001FFFFFF0FFFFFFFFC03FFFFFFFF0001FFFFFF0FFFFFFFF +C03FFFFFFFF0001FFFFFF0007FFF0000001FFFE00000000FF800007FFF0000000FFFE000000003 +E000007FFF8000000FFFE000000007E000003FFF8000000FFFF000000007C000003FFFC0000007 +FFF000000007C000003FFFC0000007FFF80000000FC000001FFFC0000003FFF80000000F800000 +1FFFE0000003FFF80000001F8000000FFFE0000003FFFC0000001F0000000FFFE0000001FFFC00 +00001F0000000FFFF0000001FFFE0000003F00000007FFF0000001FFFE0000003E00000007FFF8 +000001FFFE0000007E00000003FFF8000003FFFF0000007C00000003FFF8000003FFFF0000007C +00000003FFFC000003FFFF000000FC00000001FFFC000007FFFF800000F800000001FFFE000007 +FFFF800000F800000001FFFE000007FFFFC00001F800000000FFFE00000F9FFFC00001F0000000 +00FFFF00000F9FFFC00003F0000000007FFF00001F9FFFE00003E0000000007FFF00001F0FFFE0 +0003E0000000007FFF80001F0FFFE00007E0000000003FFF80003F0FFFF00007C0000000003FFF +C0003E07FFF00007C0000000001FFFC0007E07FFF8000F80000000001FFFC0007C03FFF8000F80 +000000001FFFE0007C03FFF8001F80000000000FFFE000FC03FFFC001F00000000000FFFE000F8 +01FFFC001F00000000000FFFF000F801FFFE003F000000000007FFF001F801FFFE003E00000000 +0007FFF801F000FFFE007E000000000003FFF803F000FFFF007C000000000003FFF803E0007FFF +007C000000000003FFFC03E0007FFF00FC000000000001FFFC07E0007FFF80F8000000000001FF +FE07C0003FFF80F8000000000001FFFE0FC0003FFFC1F8000000000000FFFE0F80001FFFC1F000 +0000000000FFFF0F80001FFFC3F00000000000007FFF1F80001FFFE3E00000000000007FFF1F00 +000FFFE3E00000000000007FFF9F00000FFFF7E00000000000003FFFBF00000FFFF7C000000000 +00003FFFFE000007FFFFC00000000000001FFFFE000007FFFF800000000000001FFFFC000003FF +FF800000000000001FFFFC000003FFFF800000000000000FFFFC000003FFFF000000000000000F +FFF8000001FFFF000000000000000FFFF8000001FFFF0000000000000007FFF0000000FFFE0000 +000000000007FFF0000000FFFE0000000000000003FFF0000000FFFC0000000000000003FFE000 +00007FFC0000000000000003FFE00000007FFC0000000000000001FFE00000007FF80000000000 +000001FFC00000003FF80000000000000001FFC00000003FF80000000000000000FF800000001F +F00000000000000000FF800000001FF000000000000000007F800000001FE00000000000000000 +7F000000000FE000000000000000007F000000000FE000000000000000003E0000000007C00000 +000074487DC67B>87 D<0007FFFC000000007FFFFFC0000001FFFFFFF8000003FFFFFFFE000007 +FE001FFF000007FF0003FFC0000FFF8001FFE0000FFF8000FFF0000FFF80007FF0000FFF80007F +F8000FFF80007FF80007FF00003FFC0007FF00003FFC0003FE00003FFC0000F800003FFC000000 +00003FFC00000000003FFC00000000003FFC00000000003FFC00000007FFFFFC000000FFFFFFFC +000007FFFFFFFC00003FFFE03FFC0000FFFE003FFC0003FFF0003FFC0007FFC0003FFC000FFF00 +003FFC001FFE00003FFC003FFC00003FFC007FF800003FFC007FF800003FFC00FFF000003FFC00 +FFF000003FFC00FFF000003FFC00FFF000003FFC00FFF000003FFC00FFF000007FFC007FF80000 +FFFC007FF80001EFFC003FFC0003EFFC003FFF0007CFFF000FFFC03F8FFFF807FFFFFF07FFFC01 +FFFFFC03FFFC007FFFF001FFFC0003FF80007FF8362E7DAD3A>97 D<007FC00000000000FFFFC0 +0000000000FFFFC00000000000FFFFC00000000000FFFFC00000000000FFFFC0000000000003FF +C0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001 +FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC00000000000 +01FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC000000000 +0001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000 +000001FFC00FFC00000001FFC07FFFC0000001FFC3FFFFF0000001FFCFFFFFFC000001FFDFF00F +FF000001FFFF8003FF800001FFFE0001FFC00001FFF800007FE00001FFF000007FF00001FFE000 +003FF80001FFE000001FFC0001FFE000001FFC0001FFE000001FFE0001FFE000001FFE0001FFE0 +00000FFF0001FFE000000FFF0001FFE000000FFF0001FFE000000FFF0001FFE000000FFF8001FF +E000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001 +FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF00 +01FFE000000FFF0001FFE000000FFF0001FFE000001FFE0001FFE000001FFE0001FFE000001FFC +0001FFE000001FFC0001FFE000003FF80001FFF000003FF80001FFF800007FF00001FFFC0000FF +E00001FFFE0001FFC00001FFBF0007FF800001FF1FE01FFE000001FE0FFFFFFC000001FC03FFFF +F0000001F800FFFF80000001F0001FF800000039487CC742>I<00001FFFC0000000FFFFF80000 +07FFFFFE00001FFFFFFF80007FFC00FFC000FFE001FFC001FFC003FFE003FF8003FFE007FF0003 +FFE00FFE0003FFE00FFE0003FFE01FFC0001FFC01FFC0001FFC03FFC0000FF803FFC00003E007F +F8000000007FF8000000007FF800000000FFF800000000FFF800000000FFF800000000FFF80000 +0000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF8000000007F +F8000000007FF8000000007FFC000000003FFC000000003FFC000000001FFC000000F81FFE0000 +00F80FFE000000F80FFF000001F007FF800003F003FFC00007E001FFE0000FC000FFF0001F8000 +7FFE00FF00001FFFFFFE000007FFFFF8000000FFFFE00000001FFE00002D2E7CAD35>I<000000 +00007FC00000000000FFFFC00000000000FFFFC00000000000FFFFC00000000000FFFFC0000000 +0000FFFFC0000000000003FFC0000000000001FFC0000000000001FFC0000000000001FFC00000 +00000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC000 +0000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0 +000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FF +C0000000000001FFC00000000FFC01FFC0000000FFFF81FFC0000007FFFFE1FFC000001FFFFFF9 +FFC000007FFC03FFFFC00000FFF0007FFFC00001FFC0001FFFC00003FF80000FFFC00007FF0000 +07FFC0000FFE000003FFC0000FFE000003FFC0001FFC000003FFC0001FFC000003FFC0003FFC00 +0003FFC0003FFC000003FFC0007FF8000003FFC0007FF8000003FFC0007FF8000003FFC000FFF8 +000003FFC000FFF8000003FFC000FFF8000003FFC000FFF8000003FFC000FFF8000003FFC000FF +F8000003FFC000FFF8000003FFC000FFF8000003FFC000FFF8000003FFC000FFF8000003FFC000 +7FF8000003FFC0007FF8000003FFC0007FF8000003FFC0003FF8000003FFC0003FFC000003FFC0 +003FFC000003FFC0001FFC000003FFC0001FFC000003FFC0000FFE000007FFC00007FF00000FFF +C00003FF00001FFFC00001FFC0003FFFC00000FFE000FFFFE000007FF807FBFFFF80001FFFFFF3 +FFFF800007FFFFC3FFFF800001FFFF03FFFF8000001FF803FFFF8039487CC742>I<00001FFE00 +000001FFFFE0000007FFFFF800001FFFFFFE00007FFC07FF0000FFE001FF8001FFC0007FC003FF +80003FE007FF00003FF00FFE00001FF01FFE00000FF81FFC00000FF83FFC00000FFC3FFC000007 +FC7FFC000007FC7FF8000007FC7FF8000007FE7FF8000007FEFFF8000007FEFFF8000007FEFFFF +FFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFCFFF800000000FFF800000000FFF8000000 +00FFF8000000007FF8000000007FF8000000007FFC000000003FFC000000003FFC000000003FFC +0000001C1FFE0000003E0FFE0000003E07FF0000007E07FF000000FC03FF800001F801FFC00003 +F0007FF0001FE0003FFE00FFC0001FFFFFFF800007FFFFFE000000FFFFF80000000FFF80002F2E +7DAD36>I<000000FFC000000007FFF80000003FFFFC000000FFFFFF000001FFC1FF000007FF03 +FF80000FFC03FF80000FF807FFC0001FF807FFC0003FF007FFC0003FF007FFC0003FE003FF8000 +7FE003FF80007FE001FF00007FE000FE00007FE0003800007FE0000000007FE0000000007FE000 +0000007FE0000000007FE0000000007FE0000000007FE0000000007FE0000000007FE000000000 +7FE0000000FFFFFFFE0000FFFFFFFE0000FFFFFFFE0000FFFFFFFE0000FFFFFFFE0000007FF000 +0000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF000000000 +7FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF000 +0000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF000000000 +7FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF000 +0000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF000000000 +7FF0000000007FF0000000007FF00000003FFFFFF800003FFFFFF800003FFFFFF800003FFFFFF8 +00003FFFFFF800002A487DC724>I<00000000001F8000007FF000FFE00007FFFF03FFF0001FFF +FFC7FFF0007FFFFFFFC7F800FFE03FFE0FF801FF800FFC0FF803FF0007FE0FF807FE0003FF07F0 +07FE0003FF07F00FFC0001FF81C00FFC0001FF80000FFC0001FF80001FFC0001FFC0001FFC0001 +FFC0001FFC0001FFC0001FFC0001FFC0001FFC0001FFC0001FFC0001FFC0000FFC0001FF80000F +FC0001FF80000FFC0001FF800007FE0003FF000007FE0003FF000003FF0007FE000001FF800FFC +000000FFE03FF8000001FFFFFFF0000001DFFFFFC0000003C7FFFF00000003C07FF000000007C0 +000000000007C0000000000007C0000000000007C0000000000007E0000000000007F000000000 +0007F8000000000007FFFFFFF0000007FFFFFFFF000003FFFFFFFFE00003FFFFFFFFF80001FFFF +FFFFFE0001FFFFFFFFFF0000FFFFFFFFFF80007FFFFFFFFF8003FFFFFFFFFFC00FFFFFFFFFFFC0 +1FF800001FFFE03FE0000001FFE07FC00000007FF07FC00000003FF0FF800000001FF0FF800000 +001FF0FF800000001FF0FF800000001FF0FF800000001FF07FC00000003FE07FC00000003FE03F +E00000007FC03FF0000000FFC01FFC000003FF800FFF00000FFF0003FFF000FFFC0000FFFFFFFF +F000003FFFFFFFC0000007FFFFFE000000003FFFC0000035447DAE3B>I<00FC0001FE0003FF00 +07FF800FFFC01FFFE01FFFE01FFFE01FFFE01FFFE01FFFE00FFFC007FF8003FF0001FE0000FC00 +000000000000000000000000000000000000000000000000000000000000000000007FC0FFFFC0 +FFFFC0FFFFC0FFFFC0FFFFC003FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC0 +01FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC0 +01FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC0 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18497CC820>105 D<007FC000000000FFFFC000000000FF +FFC000000000FFFFC000000000FFFFC000000000FFFFC00000000003FFC00000000001FFC00000 +000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FF +C00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC0000000 +0001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC0 +0000000001FFC00000000001FFC0007FFFF801FFC0007FFFF801FFC0007FFFF801FFC0007FFFF8 +01FFC0007FFFF801FFC0000FFE0001FFC00007F00001FFC0000FE00001FFC0003FC00001FFC000 +7F800001FFC000FE000001FFC001FC000001FFC007F8000001FFC00FF0000001FFC01FC0000001 +FFC03F80000001FFC0FF00000001FFC1FE00000001FFC3FF00000001FFCFFF80000001FFDFFFC0 +000001FFFFFFC0000001FFFFFFE0000001FFFFFFF0000001FFFCFFF8000001FFF87FFC000001FF +E03FFC000001FFC01FFE000001FFC01FFF000001FFC00FFF800001FFC007FFC00001FFC003FFC0 +0001FFC001FFE00001FFC001FFF00001FFC000FFF80001FFC0007FFC0001FFC0003FFC0001FFC0 +001FFE0001FFC0000FFF0001FFC0000FFF8001FFC0000FFFC0FFFFFF807FFFFFFFFFFF807FFFFF +FFFFFF807FFFFFFFFFFF807FFFFFFFFFFF807FFFFF38487CC73F>107 D<007FC000FFFFC000FF +FFC000FFFFC000FFFFC000FFFFC00003FFC00001FFC00001FFC00001FFC00001FFC00001FFC000 +01FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0 +0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FF +C00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001 +FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC000 +01FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0 +0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC000FFFFFF80FFFFFF80FFFFFF80FFFF +FF80FFFFFF8019487CC720>I<007FC001FFC00000FFE00000FFFFC00FFFF80007FFFC0000FFFF +C03FFFFE001FFFFF0000FFFFC0FFFFFF007FFFFF8000FFFFC1FC07FF80FE03FFC000FFFFC3E003 +FFC1F001FFE00003FFC7C001FFC3E000FFE00001FFCF0001FFE78000FFF00001FFDE0000FFEF00 +007FF00001FFDC0000FFEE00007FF00001FFFC0000FFFE00007FF80001FFF80000FFFC00007FF8 +0001FFF00000FFF800007FF80001FFF00000FFF800007FF80001FFF00000FFF800007FF80001FF +E00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000 +FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000 +007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF8 +0001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FF +E00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000 +FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000 +007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF8 +0001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF800FFFF +FFC07FFFFFE03FFFFFF0FFFFFFC07FFFFFE03FFFFFF0FFFFFFC07FFFFFE03FFFFFF0FFFFFFC07F +FFFFE03FFFFFF0FFFFFFC07FFFFFE03FFFFFF05C2E7CAD63>I<007FC001FFC00000FFFFC00FFF +F80000FFFFC03FFFFE0000FFFFC0FFFFFF0000FFFFC1FC07FF8000FFFFC3E003FFC00003FFC7C0 +01FFC00001FFCF0001FFE00001FFDE0000FFE00001FFDC0000FFE00001FFFC0000FFF00001FFF8 +0000FFF00001FFF00000FFF00001FFF00000FFF00001FFF00000FFF00001FFE00000FFF00001FF +E00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001 +FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF000 +01FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF0 +0001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FF +F00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000 +FFF000FFFFFFC07FFFFFE0FFFFFFC07FFFFFE0FFFFFFC07FFFFFE0FFFFFFC07FFFFFE0FFFFFFC0 +7FFFFFE03B2E7CAD42>I<00000FFF0000000000FFFFF000000007FFFFFE0000001FFFFFFF8000 +003FFC03FFC00000FFE0007FF00001FF80001FF80003FF00000FFC0007FE000007FE000FFE0000 +07FF000FFC000003FF001FFC000003FF803FFC000003FFC03FF8000001FFC03FF8000001FFC07F +F8000001FFE07FF8000001FFE07FF8000001FFE0FFF8000001FFF0FFF8000001FFF0FFF8000001 +FFF0FFF8000001FFF0FFF8000001FFF0FFF8000001FFF0FFF8000001FFF0FFF8000001FFF0FFF8 +000001FFF0FFF8000001FFF07FF8000001FFE07FF8000001FFE07FF8000001FFE07FF8000001FF +E03FFC000003FFC03FFC000003FFC01FFC000003FF801FFE000007FF800FFE000007FF0007FF00 +000FFE0003FF80001FFC0001FFC0003FF80000FFE0007FF000007FFC03FFE000001FFFFFFF8000 +0007FFFFFE00000000FFFFF0000000000FFF000000342E7DAD3B>I<00FF803F8000FFFF80FFF0 +00FFFF83FFFC00FFFF87FFFE00FFFF8FC3FF00FFFF8F07FF0003FF9E0FFF8001FFBC0FFF8001FF +B80FFF8001FFF80FFF8001FFF00FFF8001FFF007FF0001FFF007FF0001FFE003FE0001FFE000F8 +0001FFE000000001FFE000000001FFC000000001FFC000000001FFC000000001FFC000000001FF +C000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC00000 +0001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FF +C000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC00000 +00FFFFFFE00000FFFFFFE00000FFFFFFE00000FFFFFFE00000FFFFFFE00000292E7CAD31>114 +D<000FFF00E0007FFFF3E001FFFFFFE007FFFFFFE00FF800FFE01FC0001FE03F80000FE03F0000 +07E07F000003E07F000003E0FF000003E0FF000003E0FF800003E0FFC0000000FFF0000000FFFE +000000FFFFF800007FFFFFC0007FFFFFF0003FFFFFFC001FFFFFFF000FFFFFFF8007FFFFFFC003 +FFFFFFE000FFFFFFF0003FFFFFF00003FFFFF800001FFFF8000000FFFC0000001FFC7800000FFC +F8000007FCF8000003FCFC000003FCFC000003FCFE000003F8FE000003F8FF000003F8FF800007 +F0FFC0000FF0FFF0001FE0FFFC00FFC0FFFFFFFF80FC7FFFFE00F81FFFF800E003FF8000262E7C +AD2F>I<0001F000000001F000000001F000000001F000000001F000000001F000000003F00000 +0003F000000003F000000007F000000007F000000007F00000000FF00000000FF00000001FF000 +00003FF00000003FF00000007FF0000001FFF0000003FFF000000FFFFFFFC0FFFFFFFFC0FFFFFF +FFC0FFFFFFFFC0FFFFFFFFC000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FF +F0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000 +FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF00000 +00FFF0000000FFF0000000FFF001F000FFF001F000FFF001F000FFF001F000FFF001F000FFF001 +F000FFF001F000FFF001F000FFF001F0007FF001E0007FF803E0003FF803E0003FFC07C0001FFE +0F80000FFFFF800007FFFE000001FFFC0000001FF00024427EC12E>I<007FE000003FF000FFFF +E0007FFFF000FFFFE0007FFFF000FFFFE0007FFFF000FFFFE0007FFFF000FFFFE0007FFFF00003 +FFE00001FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF000 +01FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF0 +0001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FF +F00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000 +FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE000 +00FFF00001FFE00000FFF00001FFE00000FFF00001FFE00001FFF00001FFE00001FFF00001FFE0 +0001FFF00001FFE00003FFF00000FFE00007FFF00000FFE0000F7FF000007FE0001F7FF000007F +F0003E7FF800003FFC00FC7FFFE0001FFFFFF87FFFE00007FFFFE07FFFE00001FFFF807FFFE000 +003FFE007FFFE03B2E7CAD42>I<FFFFFF07FFFFE007FFFEFFFFFF07FFFFE007FFFEFFFFFF07FF +FFE007FFFEFFFFFF07FFFFE007FFFEFFFFFF07FFFFE007FFFE03FFC0001FFC00003FC003FFE000 +0FFC00001F8001FFE0000FFC00001F0001FFE0000FFE00001F0001FFF00007FE00003F0000FFF0 +000FFF00003E0000FFF8000FFF00007E00007FF8000FFF00007C00007FF8001FFF80007C00003F +FC001FFF8000F800003FFC003FFFC000F800003FFE003EFFC001F800001FFE003EFFC001F00000 +1FFE007EFFE003F000000FFF007C7FE003E000000FFF00FC7FF003E000000FFF80F83FF007E000 +0007FF80F83FF007C0000007FF81F83FF80FC0000003FFC1F01FF80F80000003FFC3F01FFC0F80 +000003FFE3E00FFC1F80000001FFE3E00FFC1F00000001FFE7E00FFE3F00000000FFF7C007FE3E +00000000FFFFC007FF3E00000000FFFF8003FF7E000000007FFF8003FF7C000000007FFF8003FF +FC000000003FFF0001FFF8000000003FFF0001FFF8000000003FFE0000FFF8000000001FFE0000 +FFF0000000001FFE0000FFF0000000000FFC00007FE0000000000FFC00007FE0000000000FF800 +003FE00000000007F800003FC00000000007F800003FC00000000003F000001F800000000001E0 +00000F0000004F2E7DAD56>119 D<7FFFFF801FFFFF007FFFFF801FFFFF007FFFFF801FFFFF00 +7FFFFF801FFFFF007FFFFF801FFFFF00007FF80001FF0000007FFC0001FC0000003FFE0003F800 +00001FFF0007F00000000FFF0007E000000007FF800FC000000003FFC01F8000000003FFE03F80 +00000001FFF07F0000000000FFF8FE00000000007FF9FC00000000003FFFF800000000003FFFF0 +00000000001FFFE000000000000FFFC0000000000007FFC0000000000003FFC0000000000001FF +E0000000000001FFF0000000000001FFF8000000000003FFFC000000000003FFFE000000000007 +FFFE00000000000FEFFF00000000001FCFFF80000000003F87FFC0000000007F03FFE000000000 +FE01FFE000000001FC00FFF000000001F8007FF800000003F0007FFC00000007F0003FFE000000 +0FE0001FFF0000001FC0000FFF0000003F800007FF800000FF800007FFC000FFFFF8003FFFFFC0 +FFFFF8003FFFFFC0FFFFF8003FFFFFC0FFFFF8003FFFFFC0FFFFF8003FFFFFC03A2E7EAD3F>I< +7FFFFFC000FFFF807FFFFFC000FFFF807FFFFFC000FFFF807FFFFFC000FFFF807FFFFFC000FFFF +8000FFF000000FE00000FFF800000FC00000FFF800000FC000007FFC00000F8000007FFC00001F +8000003FFC00001F0000003FFE00003F0000001FFE00003E0000001FFF00007E0000000FFF0000 +7C0000000FFF8000FC00000007FF8000F800000007FFC001F800000003FFC001F000000003FFE0 +03F000000003FFE003F000000001FFF003E000000001FFF007E000000000FFF007C000000000FF +F80FC0000000007FF80F80000000007FFC1F80000000003FFC1F00000000003FFE3F0000000000 +1FFE3E00000000001FFF7E00000000000FFF7C00000000000FFFFC00000000000FFFFC00000000 +0007FFF8000000000007FFF8000000000003FFF0000000000003FFF0000000000001FFE0000000 +000001FFE0000000000000FFC0000000000000FFC00000000000007F800000000000007F800000 +000000003F000000000000003F000000000000003F000000000000003E000000000000007E0000 +00000000007C00000000000000FC000000001F8000F8000000003FC001F8000000007FE001F000 +000000FFF003F000000000FFF003E000000000FFF007E000000000FFF00FC000000000FFF01F80 +00000000FFF03F80000000007FE07F00000000007F43FE00000000003FFFF800000000001FFFF0 +000000000007FFC0000000000001FE00000000000039427EAD3F>I E /Fq +7 104 df<FFFFFF80FFFFFF8019027D8A20>0 D<0003FE0000000FFF8000003C01E00000F00078 +0001C0001C00030000060006000003000C0000018018000000C018000000C03000000060300000 +0060600000003060000000306000000030C000000018C000000018C000000018C000000018C000 +000018C000000018C000000018C000000018C00000001860000000306000000030600000003030 +00000060300000006018000000C018000000C00C000001800600000300030000060001C0001C00 +00F0007800003C01E000000FFF80000003FE000025277E9D2A>13 D<03C00FF01FF83FFC7FFE7F +FEFFFFFFFFFFFFFFFF7FFE7FFE3FFC1FF80FF003C010107E9115>15 D<02000000000400000000 +0400000000080000000010000000002000000000FFFFFFFFF0FFFFFFFFF0200000000010000000 +000800000000040000000004000000000200000000240E7D902A>32 D<0000600000600000C000 +00C0000180000180000180000300000300000600000600000C00000C0000180000180000180000 +300000300000600000600000C00000C0000180000180000300000300000300000600000600000C +00000C0000180000180000300000300000300000600000600000C0000040000013287A9D00>54 +D<003C00E001C00180038003800380038003800380038003800380038003800380038003000700 +1C00F0001C00070003000380038003800380038003800380038003800380038003800380018001 +C000E0003C0E297D9E15>102 D<F0001C00070003000380038003800380038003800380038003 +800380038003800380018001C000E0003C00E001C0018003800380038003800380038003800380 +03800380038003800380030007001C00F0000E297D9E15>I E /Fr 91 125 +df<007E1F0001C1B1800303E3C00703C3C00E03C1800E01C0000E01C0000E01C0000E01C0000E +01C0000E01C000FFFFFC000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C000 +0E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0007F87FC +001A1D809C18>11 D<007E0001C1800301800703C00E03C00E01800E00000E00000E00000E0000 +0E0000FFFFC00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0 +0E01C00E01C00E01C00E01C00E01C07F87F8151D809C17>I<007FC001C1C00303C00703C00E01 +C00E01C00E01C00E01C00E01C00E01C00E01C0FFFFC00E01C00E01C00E01C00E01C00E01C00E01 +C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C07FCFF8151D809C17 +>I<003F07E00001C09C18000380F018000701F03C000E01E03C000E00E018000E00E000000E00 +E000000E00E000000E00E000000E00E00000FFFFFFFC000E00E01C000E00E01C000E00E01C000E +00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C00 +0E00E01C000E00E01C000E00E01C000E00E01C000E00E01C007FC7FCFF80211D809C23>I<003F +07FC0001C0DC1C000381F03C000701F03C000E01E01C000E00E01C000E00E01C000E00E01C000E +00E01C000E00E01C000E00E01C00FFFFFFFC000E00E01C000E00E01C000E00E01C000E00E01C00 +0E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C +000E00E01C000E00E01C000E00E01C000E00E01C007FC7FCFF80211D809C23>I<60F0F0F0F0F0 +F0F060606060606060606060606060000000000060F0F060041E7C9D0C>33 +D<6060F0F0F8F86868080808080808101010102020404080800D0C7F9C15>I<0080008007E018 +98308460824081C087C08FC08FC086E080F0807E803FC01FF00FF803FC00BE008E00876087F083 +F083E0838082408240842088189007E00080008010217E9E15>36 D<00E0000001900000030800 +0003080000070800000708000007080000070800000710000007100000072000000740000003C0 +3FE003800F00038006000380040005C0040009C0080010E0100030E010006070200060702000E0 +384000E03C4000E01C8000E00F0020E0070020700780403009C0401830E18007C03E001B1F7E9D +20>38 D<60F0F8680808081010204080050C7C9C0C>I<004000800100020006000C000C001800 +1800300030007000600060006000E000E000E000E000E000E000E000E000E000E000E000E00060 +0060006000700030003000180018000C000C00060002000100008000400A2A7D9E10>I<800040 +002000100018000C000C000600060003000300038001800180018001C001C001C001C001C001C0 +01C001C001C001C001C001C0018001800180038003000300060006000C000C0018001000200040 +0080000A2A7E9E10>I<0006000000060000000600000006000000060000000600000006000000 +0600000006000000060000000600000006000000060000FFFFFFE0FFFFFFE00006000000060000 +000600000006000000060000000600000006000000060000000600000006000000060000000600 +00000600001B1C7E9720>43 D<60F0F0701010101020204080040C7C830C>I<FFE0FFE00B0280 +890E>I<60F0F06004047C830C>I<00010003000600060006000C000C000C001800180018003000 +3000300060006000C000C000C0018001800180030003000300060006000C000C000C0018001800 +1800300030003000600060006000C000C00010297E9E15>I<03C00C301818300C300C700E6006 +6006E007E007E007E007E007E007E007E007E007E007E007E007E00760066006700E300C300C18 +180C3007E0101D7E9B15>I<030007003F00C70007000700070007000700070007000700070007 +000700070007000700070007000700070007000700070007000F80FFF80D1C7C9B15>I<07C018 +30201C400C400EF00FF80FF807F8077007000F000E000E001C001C00380070006000C001800300 +06010C01180110023FFE7FFEFFFE101C7E9B15>I<07E01830201C201C781E780E781E381E001C +001C00180030006007E00030001C001C000E000F000F700FF80FF80FF80FF00E401C201C183007 +E0101D7E9B15>I<000C00000C00001C00003C00003C00005C0000DC00009C00011C00031C0002 +1C00041C000C1C00081C00101C00301C00201C00401C00C01C00FFFFC0001C00001C00001C0000 +1C00001C00001C00001C0001FFC0121C7F9B15>I<300C3FF83FF03FC020002000200020002000 +200023E024302818301C200E000E000F000F000F600FF00FF00FF00F800E401E401C2038187007 +C0101D7E9B15>I<00F0030C06040C0E181E301E300C700070006000E3E0E430E818F00CF00EE0 +06E007E007E007E007E007600760077006300E300C18180C3003E0101D7E9B15>I<4000007FFF +807FFF007FFF0040020080040080040080080000100000100000200000600000400000C00000C0 +0001C0000180000180000380000380000380000380000780000780000780000780000780000780 +00030000111D7E9B15>I<03E00C301008200C20066006600660067006780C3E083FB01FE007F0 +07F818FC307E601E600FC007C003C003C003C00360026004300C1C1007E0101D7E9B15>I<03C0 +0C301818300C700C600EE006E006E007E007E007E007E0076007700F300F18170C2707C7000600 +06000E300C780C78187010203030C00F80101D7E9B15>I<60F0F0600000000000000000000060 +F0F06004127C910C>I<60F0F0600000000000000000000060F0F0701010101020204080041A7C +910C>I<60F0F060000000000060606060606060606060606060F0F0F0F0F0F0F060041E7C940C> +I<7FFFFFC0FFFFFFE0000000000000000000000000000000000000000000000000000000000000 +0000FFFFFFE07FFFFFC01B0C7E8F20>I<03000780078003000000000000000000000001000100 +0200020002000200060004000C00180038007000E000E01EE01EE01EE00E600430180FE00F1D7E +9414>I<0FE03038401CE00EF00EF00EF00E000C001C0030006000C00080018001000100010001 +00010001000000000000000000000003000780078003000F1D7E9C14>I<003F800000C0600003 +001800040004000800020010000100201F00802070808040E0404040C0384041C0384081803820 +83803820838038208380382083803820838038208180382041C0382040C0384040E07840207098 +80201F0F00100000000800000004000000030001E000C01F80003FF0001B1D7E9C20>I<000600 +000006000000060000000F0000000F0000000F00000017800000178000001780000023C0000023 +C0000023C0000041E0000041E0000041E0000080F0000080F0000180F8000100780001FFF80003 +007C0002003C0002003C0006003E0004001E0004001E000C001F001E001F00FF80FFF01C1D7F9C +1F>I<FFFFC00F00F00F00380F003C0F001C0F001E0F001E0F001E0F001E0F001C0F003C0F0078 +0F01F00FFFE00F00780F003C0F001E0F000E0F000F0F000F0F000F0F000F0F000F0F001E0F001E +0F003C0F0078FFFFE0181C7E9B1D>I<001F808000E0618001801980070007800E0003801C0003 +801C00018038000180780000807800008070000080F0000000F0000000F0000000F0000000F000 +0000F0000000F0000000F0000000700000807800008078000080380000801C0001001C0001000E +000200070004000180080000E03000001FC000191E7E9C1E>I<FFFFC0000F00F0000F003C000F +000E000F0007000F0007000F0003800F0003C00F0001C00F0001C00F0001E00F0001E00F0001E0 +0F0001E00F0001E00F0001E00F0001E00F0001E00F0001C00F0001C00F0003C00F0003800F0007 +800F0007000F000E000F001C000F007000FFFFC0001B1C7E9B20>I<FFFFFC0F003C0F000C0F00 +040F00040F00060F00020F00020F02020F02000F02000F02000F06000FFE000F06000F02000F02 +000F02000F02010F00010F00020F00020F00020F00060F00060F000C0F003CFFFFFC181C7E9B1C +>I<FFFFF80F00780F00180F00080F00080F000C0F00040F00040F02040F02000F02000F02000F +06000FFE000F06000F02000F02000F02000F02000F00000F00000F00000F00000F00000F00000F +00000F8000FFF800161C7E9B1B>I<001F808000E0618001801980070007800E0003801C000380 +1C00018038000180780000807800008070000080F0000000F0000000F0000000F0000000F00000 +00F0000000F000FFF0F0000F80700007807800078078000780380007801C0007801C0007800E00 +078007000B800180118000E06080001F80001C1E7E9C21>I<FFF3FFC00F003C000F003C000F00 +3C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F +FFFC000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C00 +0F003C000F003C000F003C000F003C00FFF3FFC01A1C7E9B1F>I<FFF00F000F000F000F000F00 +0F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F +000F00FFF00C1C7F9B0F>I<1FFF00F80078007800780078007800780078007800780078007800 +7800780078007800780078007800787078F878F878F878F0F040E021C01F00101D7F9B15>I<FF +F03FE00F000F000F000C000F0008000F0010000F0020000F0040000F0080000F0100000F020000 +0F0400000F0E00000F1F00000F2F00000F2780000F4780000F83C0000F01E0000F01E0000F00F0 +000F00F8000F0078000F003C000F003C000F001E000F001F000F001F80FFF07FF01C1C7E9B20> +I<FFF8000F80000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00 +000F00000F00000F00000F00000F00000F00080F00080F00080F00180F00180F00100F00300F00 +700F01F0FFFFF0151C7E9B1A>I<FF8000FF800F8000F8000F8000F8000BC00178000BC0017800 +0BC001780009E002780009E002780008F004780008F004780008F0047800087808780008780878 +000878087800083C107800083C107800083C107800081E207800081E207800081E207800080F40 +7800080F40780008078078000807807800080780780008030078001C03007800FF8307FF80211C +7E9B26>I<FF007FC00F800E000F8004000BC0040009E0040009E0040008F0040008F804000878 +0400083C0400083C0400081E0400080F0400080F0400080784000807C4000803C4000801E40008 +01E4000800F40008007C0008007C0008003C0008003C0008001C0008000C001C000C00FF800400 +1A1C7E9B1F>I<003F800000E0E0000380380007001C000E000E001C0007003C00078038000380 +780003C0780003C0700001C0F00001E0F00001E0F00001E0F00001E0F00001E0F00001E0F00001 +E0F00001E0700001C0780003C0780003C0380003803C0007801C0007000E000E0007001C000380 +380000E0E000003F80001B1E7E9C20>I<FFFF800F00E00F00780F003C0F001C0F001E0F001E0F +001E0F001E0F001E0F001C0F003C0F00780F00E00FFF800F00000F00000F00000F00000F00000F +00000F00000F00000F00000F00000F00000F0000FFF000171C7E9B1C>I<003F800000E0E00003 +80380007001C000E000E001C0007003C00078038000380780003C0780003C0700001C0F00001E0 +F00001E0F00001E0F00001E0F00001E0F00001E0F00001E0F00001E0700001C0780003C0780003 +C0380003803C0E07801C1107000E208E000720DC0003A0F80000F0E020003FE020000060200000 +7060000078E000003FC000003FC000001F8000000F001B257E9C20>I<FFFF00000F01E0000F00 +78000F003C000F001C000F001E000F001E000F001E000F001E000F001C000F003C000F0078000F +01E0000FFF00000F03C0000F00E0000F00F0000F0078000F0078000F0078000F0078000F007800 +0F0078000F0078100F0078100F0038100F003C20FFF01C20000007C01C1D7E9B1F>I<07E0801C +1980300580700380600180E00180E00080E00080E00080F00000F800007C00007FC0003FF8001F +FE0007FF0000FF80000F800007C00003C00001C08001C08001C08001C0C00180C00180E00300D0 +0200CC0C0083F800121E7E9C17>I<7FFFFFC0700F01C0600F00C0400F0040400F0040C00F0020 +800F0020800F0020800F0020000F0000000F0000000F0000000F0000000F0000000F0000000F00 +00000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F +0000001F800003FFFC001B1C7F9B1E>I<FFF07FC00F000E000F0004000F0004000F0004000F00 +04000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F +0004000F0004000F0004000F0004000F0004000F0004000F000400070008000780080003801000 +0180100000C020000070C000001F00001A1D7E9B1F>I<FFE00FF01F0003C00F0001800F000100 +0F800300078002000780020003C0040003C0040003C0040001E0080001E0080001F0080000F010 +0000F0100000F830000078200000782000003C4000003C4000003C4000001E8000001E8000001F +8000000F0000000F00000006000000060000000600001C1D7F9B1F>I<FFE0FFE0FF1F001F003C +1E001E00180F001F00100F001F00100F001F001007801F00200780278020078027802003C02780 +4003C043C04003C043C04003E043C04001E081E08001E081E08001E081E08000F100F10000F100 +F10000F100F100007900FA00007A007A00007A007A00003E007C00003C003C00003C003C00003C +003C00001800180000180018000018001800281D7F9B2B>I<7FF0FFC00FC03E000780180003C0 +180003E0100001E0200001F0600000F0400000788000007D8000003D0000001E0000001F000000 +0F0000000F8000000F80000013C0000023E0000021E0000041F00000C0F8000080780001007C00 +03003C0002001E0006001F001F003F80FFC0FFF01C1C7F9B1F>I<FFF007FC0F8001E007800080 +07C0018003C0010003E0020001F0020000F0040000F8040000780800007C1800003C1000001E20 +00001F2000000F4000000FC0000007800000078000000780000007800000078000000780000007 +800000078000000780000007800000078000007FF8001E1C809B1F>I<7FFFF07C01F07001E060 +03C06003C0400780400F80400F00401E00001E00003C00007C0000780000F00000F00001E00003 +E00003C0100780100780100F00101F00301E00203C00203C00607800E0F803E0FFFFE0141C7E9B +19>I<FEFEC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 +C0C0C0FEFE07297C9E0C>I<08081010202040404040808080808080B0B0F8F8787830300D0C7A +9C15>I<FEFE060606060606060606060606060606060606060606060606060606060606060606 +06060606FEFE0729809E0C>I<1FC000307000783800781C00301C00001C00001C0001FC000F1C +00381C00701C00601C00E01C40E01C40E01C40603C40304E801F870012127E9115>97 +D<FC00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C7C001D86 +001E03001C01801C01C01C00C01C00E01C00E01C00E01C00E01C00E01C00E01C00C01C01C01C01 +801E030019060010F800131D7F9C17>I<07E00C301878307870306000E000E000E000E000E000 +E00060007004300418080C3007C00E127E9112>I<003F00000700000700000700000700000700 +00070000070000070000070000070003E7000C1700180F00300700700700600700E00700E00700 +E00700E00700E00700E00700600700700700300700180F000C370007C7E0131D7E9C17>I<03E0 +0C301818300C700E6006E006FFFEE000E000E000E00060007002300218040C1803E00F127F9112 +>I<00F8018C071E061E0E0C0E000E000E000E000E000E00FFE00E000E000E000E000E000E000E +000E000E000E000E000E000E000E000E000E007FE00F1D809C0D>I<00038003C4C00C38C01C38 +80181800381C00381C00381C00381C001818001C38000C300013C0001000003000001800001FF8 +001FFF001FFF803003806001C0C000C0C000C0C000C06001803003001C0E0007F800121C7F9215 +>I<FC00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C7C001C +87001D03001E03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C +03801C03801C0380FF9FF0141D7F9C17>I<18003C003C00180000000000000000000000000000 +00FC001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C00FF80091D +7F9C0C>I<00C001E001E000C000000000000000000000000000000FE000E000E000E000E000E0 +00E000E000E000E000E000E000E000E000E000E000E000E000E000E000E060E0F0C0F1C061803E +000B25839C0D>I<FC00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C +00001C3FC01C0F001C0C001C08001C10001C20001C40001CE0001DE0001E70001C78001C38001C +3C001C1C001C0E001C0F001C0F80FF9FE0131D7F9C16>I<FC001C001C001C001C001C001C001C +001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C00 +1C00FF80091D7F9C0C>I<FC7E07E0001C838838001D019018001E01E01C001C01C01C001C01C0 +1C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01 +C01C001C01C01C001C01C01C001C01C01C00FF8FF8FF8021127F9124>I<FC7C001C87001D0300 +1E03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C0380 +1C0380FF9FF014127F9117>I<03F0000E1C00180600300300700380600180E001C0E001C0E001 +C0E001C0E001C0E001C06001807003803003001806000E1C0003F00012127F9115>I<FC7C001D +86001E03001C01801C01C01C00C01C00E01C00E01C00E01C00E01C00E01C00E01C01C01C01C01C +01801E03001D06001CF8001C00001C00001C00001C00001C00001C00001C0000FF8000131A7F91 +17>I<03C1000C3300180B00300F00700700700700E00700E00700E00700E00700E00700E00700 +600700700700300F00180F000C370007C700000700000700000700000700000700000700000700 +003FE0131A7E9116>I<FCE01D301E781E781C301C001C001C001C001C001C001C001C001C001C +001C001C00FFC00D127F9110>I<1F9030704030C010C010E010F8007F803FE00FF000F8803880 +18C018C018E010D0608FC00D127F9110>I<04000400040004000C000C001C003C00FFE01C001C +001C001C001C001C001C001C001C001C101C101C101C101C100C100E2003C00C1A7F9910>I<FC +1F801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C +03801C07800C07800E1B8003E3F014127F9117>I<FF07E03C03801C01001C01000E02000E0200 +07040007040007040003880003880003D80001D00001D00000E00000E00000E00000400013127F +9116>I<FF3FCFE03C0F03801C0701801C0701001C0B01000E0B82000E0B82000E1182000711C4 +000711C4000720C40003A0E80003A0E80003C0680001C0700001C0700001803000008020001B12 +7F911E>I<7F8FF00F03800F030007020003840001C80001D80000F00000700000780000F80000 +9C00010E00020E000607000403801E07C0FF0FF81512809116>I<FF07E03C03801C01001C0100 +0E02000E020007040007040007040003880003880003D80001D00001D00000E00000E00000E000 +004000004000008000008000F08000F10000F300006600003C0000131A7F9116>I<7FFC703860 +38407040F040E041C003C0038007000F040E041C043C0C380870087038FFF80E127F9112>I<FF +FFF01401808B15>I<FFFFFFFFFF802901808B2A>I E /Fs 20 122 df<78FCFCFCFC7806067B85 +11>46 D<007F000001C1C0000780F0000F0078000E0038001C001C003C001E003C001E003C001E +0078000F0078000F0078000F0078000F00F8000F80F8000F80F8000F80F8000F80F8000F80F800 +0F80F8000F80F8000F80F8000F80F8000F80F8000F80F8000F80F8000F80F8000F80F8000F8078 +000F0078000F0078000F0078000F003C001E003C001E003C001E001C001C000E0038000F007800 +0780F00001C1C000007F000019297EA71E>48 D<00100000700001F0000FF000FEF000F0F00000 +F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000 +F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000 +F00000F00000F00000F00000F00001F8007FFFE07FFFE013287BA71E>I<00FE0007FF800E07E0 +1803F02001F82000F840007C40007CF8007EFC007EFC003EFC003EFC003E78007E00007E00007C +00007C0000F80000F80001F00001E00003C0000780000700000E00001C00003800007000006000 +00C0000180020300020600040C000418000410000C3FFFFC7FFFF8FFFFF8FFFFF817287DA71E> +I<007F000003FFC0000701F0000C00F80010007C001C007C003E007E003E003E003E003E001E00 +3E000C007E0000007C0000007C00000078000000F0000000E0000001C0000007000000FF000000 +01E0000000F0000000780000003C0000003E0000001F0000001F0000001F8000001F8030001F80 +78001F80FC001F80FC001F80FC001F00F8001F0040003F0040003E0030007C001800F8000F01F0 +0003FFC000007F000019297EA71E>I<007F000001FFC00007C1E0000F0070001E0038001C003C +003C001C0078001E0078001E00F8000F00F8000F00F8000F00F8000F00F8000F80F8000F80F800 +0F80F8000F8078000F8078001F803C001F803C001F801C002F800E004F800700CF8003810F8000 +7E0F8000000F0000000F0000000F0000001E0000001E0000001E0000003C001C003C003E007800 +3E0070003C00E0001801C0001C0780000FFE000003F8000019297EA71E>57 +D<FFFFFFFF00FFFFFFFF0007E0003F0003E000070003E000038003E000018003E000018003E000 +008003E000008003E000008003E000008003E000004003E002004003E002004003E002000003E0 +02000003E002000003E006000003E00E000003FFFE000003FFFE000003E00E000003E006000003 +E002000003E002000003E002000003E002000003E002000003E000000003E000000003E0000000 +03E000000003E000000003E000000003E000000003E000000003E000000003E000000007F00000 +00FFFFE00000FFFFE0000022297EA827>70 D<FFE0000003FFC0FFE0000003FFC007E0000003F8 +0002F0000005F00002F0000005F0000278000009F0000278000009F0000278000009F000023C00 +0011F000023C000011F000021E000021F000021E000021F000021E000021F000020F000041F000 +020F000041F0000207800081F0000207800081F0000207800081F0000203C00101F0000203C001 +01F0000203E00201F0000201E00201F0000201E00201F0000200F00401F0000200F00401F00002 +00F00401F0000200780801F0000200780801F00002003C1001F00002003C1001F00002003C1001 +F00002001E2001F00002001E2001F00002000F4001F00002000F4001F00002000F4001F0000200 +078001F0000700078001F0000F80030003F800FFF803007FFFC0FFF803007FFFC032297EA837> +77 D<FFFF0003FFC0FFFF0003FFC007F000007E0003E00000380003E00000100001F000002000 +01F00000200001F00000200000F80000400000F80000400000FC0000C000007C00008000007C00 +008000003E00010000003E00010000003F00010000001F00020000001F00020000001F80060000 +000F80040000000F800400000007C00800000007C00800000007E00800000003E01000000003E0 +1000000001F02000000001F02000000001F02000000000F84000000000F84000000000FCC00000 +00007C80000000007C80000000003F00000000003F00000000003F00000000001E00000000001E +00000000000C00000000000C00000000000C0000002A2A7FA82D>86 D<FFFE03FFF803FFC0FFFE +03FFF803FFC00FE0003F80007E0007C0001F0000180003E0001F0000180003E0000F8000100003 +E0000F8000100001F0000F8000200001F0000FC000200001F0000FC000200000F8000FC0004000 +00F80013E000400000F80013E000400000FC0013E000C000007C0033F0008000007C0021F00080 +00007E0021F0008000003E0021F8010000003E0040F8010000003E0040F8010000001F0040F802 +0000001F00807C020000001F00807C020000000F80807C040000000F81003E040000000F81003E +0400000007C1003E0800000007C2001F0800000007C2001F0800000003E2001F1000000003E400 +0F9000000003E4000F9000000001F4000FA000000001F80007E000000001F80007E000000000F8 +0007C000000000F00003C000000000F00003C00000000070000380000000006000018000000000 +60000180000000006000018000003A2A7FA83D>I<01FC00000E0780001001C0003C00E0003E00 +F0003E0078001C00780008007800000078000000780000007800007FF80003E078000F8078001F +0078003E0078007C00780078007820F8007820F8007820F8007820F800F8207C00F8203C013C40 +1F063FC007F80F001B1A7E991E>97 D<07800000FF800000FF8000000F80000007800000078000 +000780000007800000078000000780000007800000078000000780000007800000078000000780 +00000783F000078C1C0007B0070007A0038007C003C0078001E0078001E0078000F0078000F007 +8000F8078000F8078000F8078000F8078000F8078000F8078000F8078000F0078000F0078001F0 +078001E0078001C007C003C00740078007200E0006181C000407E0001D2A7FA921>I<007E0003 +C3800700E00E00F01C00703C00783C003878003C78003CF8003CF8003CFFFFFCF80000F80000F8 +0000F80000F800007800007C00003C00043C00041E00080E001007002001C0C0007F00161A7E99 +1B>101 D<001F000070C000E1E001C3E003C3E00381C007808007800007800007800007800007 +8000078000078000078000078000FFFE00FFFE0007800007800007800007800007800007800007 +800007800007800007800007800007800007800007800007800007800007800007800007800007 +800007800007C000FFFE00FFFE00132A7FA912>I<0780FF80FF800F8007800780078007800780 +078007800780078007800780078007800780078007800780078007800780078007800780078007 +8007800780078007800780078007800780078007800780FFFCFFFC0E2A7FA911>108 +D<0783F800FF8C1C00FF900E000FA0070007A0078007C0078007C0078007800780078007800780 +078007800780078007800780078007800780078007800780078007800780078007800780078007 +80078007800780078007800780078007800780FFFCFFFCFFFCFFFC1E1A7F9921>110 +D<007F000001C1C000070070000E0038001C001C003C001E003C001E0078000F0078000F00F800 +0F80F8000F80F8000F80F8000F80F8000F80F8000F80F8000F80F8000F8078000F0078000F003C +001E003C001E001E003C000E0038000700700001C1C000007F0000191A7E991E>I<0787C0FF98 +E0FF91F00FA1F007C1F007C0E007C0000780000780000780000780000780000780000780000780 +0007800007800007800007800007800007800007800007800007C000FFFE00FFFE00141A7F9917 +>114 D<07800780FF80FF80FF80FF800F800F8007800780078007800780078007800780078007 +800780078007800780078007800780078007800780078007800780078007800780078007800780 +07800780078007800F8007800F800380178001C027C000E047FC003F87FC1E1A7F9921>117 +D<FFF00FF8FFF00FF80F8003C0078003800780010003C0020003C0020003E0020001E0040001E0 +040000F0080000F0080000F818000078100000781000003C2000003C2000003E6000001E400000 +1E4000000F8000000F800000070000000700000007000000020000000200000004000000040000 +000400000008000070080000F8100000F8100000F8200000F0400000608000001F0000001D267F +9920>121 D E /Ft 10 116 df<78FCFCFCFC7806067A8512>46 D<FFE00007FFC0FFF00007FF +C003F000007C0002F80000380002FC00001000027C00001000023E00001000023E00001000021F +00001000021F80001000020F800010000207C00010000207E00010000203E00010000203F00010 +000201F00010000200F80010000200FC00100002007C00100002007E00100002003E0010000200 +1F00100002001F80100002000F80100002000FC01000020007C01000020003E01000020003F010 +00020001F01000020000F81000020000F810000200007C10000200007E10000200003E10000200 +001F10000200001F10000200000F90000200000FD00002000007D00002000003F00002000003F0 +0002000001F00002000001F00002000000F0000200000070000700000070000F8000003000FFF8 +00003000FFF8000010002A317CB032>78 D<FFFFFF000000FFFFFFF0000007E001FC000003E000 +3E000003E0000F800003E00007C00003E00003E00003E00001E00003E00001F00003E00000F000 +03E00000F80003E00000F80003E00000F80003E00000F80003E00000F80003E00000F80003E000 +00F00003E00001F00003E00001E00003E00003C00003E00007800003E0000F000003E0003C0000 +03E001F0000003FFFF00000003E001F0000003E0007C000003E0001E000003E0000F800003E000 +07800003E00007C00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E000 +03E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E000 +03E00803E00003E00803E00001E00803E00001E00807F00000F010FFFF80007010FFFF80003860 +000000000F802D327CB031>82 D<FFFE003FFF8001FFC0FFFE003FFF8001FFC00FE00003F80000 +7E0007C00001F000003C0007C00001F00000180003E00000F80000100003E00000F80000100003 +E00000F80000100001F00000FC0000200001F00000FC0000200001F00000FC0000200000F80001 +3E0000400000F800013E0000400000F800013E0000400000FC00033F0000C000007C00021F0000 +8000007C00021F00008000007E00021F80008000003E00040F80010000003E00040F8001000000 +3E00040F80010000001F000807C0020000001F000807C0020000001F000807C0020000000F8010 +03E0040000000F801003E0040000000F801003E0040000000FC02001F00C00000007C02001F008 +00000007C02001F00800000007E02001F80800000003E04000F81000000003E04000F810000000 +03E04000F81000000001F080007C2000000001F080007C2000000001F080007C2000000000F900 +003E4000000000F900003E4000000000F900003E40000000007E00001F80000000007E00001F80 +000000007E00001F80000000007E00001F80000000003C00000F00000000003C00000F00000000 +003C00000F00000000001800000600000000001800000600000000001800000600000042327FB0 +44>87 D<00FE00000303C0000C00E00010007000100038003C003C003E001C003E001E003E001E +0008001E0000001E0000001E0000001E00000FFE0000FC1E0003E01E000F801E001F001E003E00 +1E003C001E007C001E00F8001E04F8001E04F8001E04F8003E04F8003E0478003E047C005E043E +008F080F0307F003FC03E01E1F7D9E21>97 D<0F001F801F801F801F800F000000000000000000 +00000000000000000000000000000780FF80FF800F800780078007800780078007800780078007 +800780078007800780078007800780078007800780078007800780078007800FC0FFF8FFF80D30 +7EAF12>105 D<0780FF80FF800F80078007800780078007800780078007800780078007800780 +078007800780078007800780078007800780078007800780078007800780078007800780078007 +80078007800780078007800780078007800780078007800FC0FFFCFFFC0E327EB112>108 +D<0780FE001FC000FF83078060F000FF8C03C18078000F9001E2003C0007A001E4003C0007A000 +F4001E0007C000F8001E0007C000F8001E00078000F0001E00078000F0001E00078000F0001E00 +078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0 +001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E0007 +8000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F000 +1E000FC001F8003F00FFFC1FFF83FFF0FFFC1FFF83FFF0341F7E9E38>I<001FC00000F0780001 +C01C00070007000F0007801E0003C01C0001C03C0001E03C0001E0780000F0780000F0780000F0 +F80000F8F80000F8F80000F8F80000F8F80000F8F80000F8F80000F8F80000F8780000F07C0001 +F03C0001E03C0001E01E0003C01E0003C00F00078007800F0001C01C0000F07800001FC0001D1F +7E9E21>111 D<01FC100E03301800F0300070600030E00030E00010E00010E00010F00010F800 +007E00003FF0001FFF000FFFC003FFE0003FF00001F80000F880003C80003C80001CC0001CC000 +1CE0001CE00018F00038F00030CC0060C301C080FE00161F7E9E1A>115 +D E /Fu 13 118 df<1F003F807FC0FFC0FFE0FFE0FFF0FFF07FF03FB01F300030003000300030 +003000600060006000C000C000C0018001800300060006000C001800300020000C1F77C71D>39 +D<FFFFFFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFFFFFF00007FF800001FFF00003FF0000001 +FF80001FF00000007F80001FF00000003F80001FF00000001F80001FF00000000F80001FF00000 +000780001FF00000000780001FF00000000380001FF000000003C0001FF000000003C0001FF000 +000001C0001FF000000001C0001FF000000001C0001FF000000001C0001FF000000001C0001FF0 +00000000E0001FF000000000E0001FF000000000E0001FF00001C000E0001FF00001C00000001F +F00001C00000001FF00001C00000001FF00001C00000001FF00001C00000001FF00001C0000000 +1FF00003C00000001FF00003C00000001FF00007C00000001FF0000FC00000001FF0003FC00000 +001FFFFFFFC00000001FFFFFFFC00000001FFFFFFFC00000001FF0003FC00000001FF0000FC000 +00001FF00007C00000001FF00003C00000001FF00003C00000001FF00001C00000001FF00001C0 +0000001FF00001C00000001FF00001C00000001FF00001C00000001FF00001C00000001FF00001 +C00000001FF00000000000001FF00000000000001FF00000000000001FF00000000000001FF000 +00000000001FF00000000000001FF00000000000001FF00000000000001FF00000000000001FF0 +0000000000001FF00000000000001FF00000000000001FF00000000000001FF00000000000001F +F00000000000001FF00000000000001FF00000000000003FF80000000000007FFE0000000000FF +FFFFFF80000000FFFFFFFF80000000FFFFFFFF800000003B477DC643>70 +D<FFFFF800000000001FFFFFFFFFF800000000001FFFFFFFFFF800000000001FFFFF007FFC0000 +0000003FFE00003FFC00000000003FFC00001DFE000000000077F800001DFE000000000077F800 +001DFE000000000077F800001CFF0000000000E7F800001CFF0000000000E7F800001C7F800000 +0001C7F800001C7F8000000001C7F800001C7F8000000001C7F800001C3FC00000000387F80000 +1C3FC00000000387F800001C1FE00000000707F800001C1FE00000000707F800001C1FE0000000 +0707F800001C0FF00000000E07F800001C0FF00000000E07F800001C0FF00000000E07F800001C +07F80000001C07F800001C07F80000001C07F800001C03FC0000003807F800001C03FC00000038 +07F800001C03FC0000003807F800001C01FE0000007007F800001C01FE0000007007F800001C00 +FF000000E007F800001C00FF000000E007F800001C00FF000000E007F800001C007F800001C007 +F800001C007F800001C007F800001C007F800001C007F800001C003FC000038007F800001C003F +C000038007F800001C001FE000070007F800001C001FE000070007F800001C001FE000070007F8 +00001C000FF0000E0007F800001C000FF0000E0007F800001C0007F8001C0007F800001C0007F8 +001C0007F800001C0007F8001C0007F800001C0003FC00380007F800001C0003FC00380007F800 +001C0001FE00700007F800001C0001FE00700007F800001C0001FE00700007F800001C0000FF00 +E00007F800001C0000FF00E00007F800001C0000FF00E00007F800001C00007F81C00007F80000 +1C00007F81C00007F800001C00003FC3800007F800001C00003FC3800007F800001C00003FC380 +0007F800001C00001FE7000007F800001C00001FE7000007F800001C00000FFE000007F800001C +00000FFE000007F800001C00000FFE000007F800001C000007FC000007F800001C000007FC0000 +07F800003E000007FC000007F800007F000003F8000007F80000FF800003F800000FFC0003FFE0 +0001F000001FFE00FFFFFF8001F0003FFFFFFFFFFFFF8001F0003FFFFFFFFFFFFF8000E0003FFF +FFFF58477DC65F>77 D<FFFFFFFE0007FFFFFCFFFFFFFE0007FFFFFCFFFFFFFE0007FFFFFC007F +FC0000001FFF00003FF800000007FC00001FF000000003F800001FF000000001F000001FF00000 +0000E000001FF000000000E000001FF000000000E000001FF000000000E000001FF000000000E0 +00001FF000000000E000001FF000000000E000001FF000000000E000001FF000000000E000001F +F000000000E000001FF000000000E000001FF000000000E000001FF000000000E000001FF00000 +0000E000001FF000000000E000001FF000000000E000001FF000000000E000001FF000000000E0 +00001FF000000000E000001FF000000000E000001FF000000000E000001FF000000000E000001F +F000000000E000001FF000000000E000001FF000000000E000001FF000000000E000001FF00000 +0000E000001FF000000000E000001FF000000000E000001FF000000000E000001FF000000000E0 +00001FF000000000E000001FF000000000E000001FF000000000E000001FF000000000E000001F +F000000000E000001FF000000000E000001FF000000000E000001FF000000000E000001FF00000 +0000E000001FF000000000E000001FF000000000E000001FF000000000E000001FF000000000E0 +00001FF000000000E000000FF000000000C000000FF000000001C000000FF800000001C0000007 +F800000001C0000007F80000000380000007F80000000380000003FC0000000700000003FC0000 +000700000001FC0000000E00000000FE0000000E000000007F0000001C000000003F0000003800 +0000001F80000070000000000FC00000E00000000007F00003C00000000003FC000F8000000000 +00FF007F0000000000003FFFFC0000000000000FFFF000000000000001FF8000000046487DC64D +>85 D<FFFFFFE003FFFFFF8001FFFFF8FFFFFFE003FFFFFF8001FFFFF8FFFFFFE003FFFFFF8001 +FFFFF803FFF800000FFFE000001FFF8000FFE0000003FF80000007FE00007FC0000001FF000000 +01FC00007FC0000001FF00000000F800007FC0000001FF80000000F000003FE0000000FF800000 +00E000003FE0000000FF80000000E000003FE0000000FF80000000E000001FF00000007FC00000 +01C000001FF00000007FC0000001C000001FF00000007FC0000001C000001FF8000000FFE00000 +03C000000FF8000000FFE00000038000000FF8000000FFE00000038000000FFC000001DFF00000 +0780000007FC000001DFF000000700000007FC000001DFF000000700000007FE0000038FF80000 +0F00000003FE0000038FF800000E00000003FE0000038FF800000E00000003FF0000078FFC0000 +1E00000001FF00000707FC00001C00000001FF00000707FC00001C00000001FF00000F07FE0000 +1C00000000FF80000E03FE00003800000000FF80000E03FE00003800000000FF80001E03FF0000 +38000000007FC0001C01FF000070000000007FC0001C01FF000070000000007FC0003C01FF8000 +70000000003FE0003800FF8000E0000000003FE0003800FF8000E0000000003FE0003800FF8000 +E0000000001FF00070007FC001C0000000001FF00070007FC001C0000000001FF00070007FC001 +C0000000001FF800E0003FE003C0000000000FF800E0003FE00380000000000FF800E0003FE003 +80000000000FFC01C0001FF007800000000007FC01C0001FF007000000000007FC01C0001FF007 +000000000007FE0380000FF80F000000000003FE0380000FF80E000000000003FE0380000FF80E +000000000003FF0780000FFC1E000000000001FF07000007FC1C000000000001FF07000007FC1C +000000000001FF0F000007FE1C000000000000FF8E000003FE38000000000000FF8E000003FE38 +000000000000FF9E000003FF380000000000007FDC000001FF700000000000007FDC000001FF70 +0000000000007FFC000001FFF00000000000003FF8000000FFE00000000000003FF8000000FFE0 +0000000000003FF8000000FFE00000000000001FF00000007FC00000000000001FF00000007FC0 +0000000000001FF00000007FC00000000000001FE00000003FC00000000000000FE00000003F80 +0000000000000FE00000003F800000000000000FC00000001F8000000000000007C00000001F00 +00000000000007C00000001F0000000000000007800000000F0000000000000003800000000E00 +00000065487EC66A>87 D<0003FE000000001FFFC00000007E03F0000000F000FC000001C0007E +00000380003F000007C0001F800007F0001FC0000FF0000FC0000FF8000FE0000FF8000FE0000F +F80007F00007F00007F00007F00007F00001C00007F00000000007F00000000007F00000000007 +F00000000007F000000001FFF00000007FFFF0000003FF87F000001FF007F000007F8007F00001 +FE0007F00003F80007F00007F00007F0000FE00007F0001FC00007F0003FC00007F0003F800007 +F0007F800007F01C7F800007F01CFF000007F01CFF000007F01CFF000007F01CFF00000FF01CFF +00000FF01CFF00000FF01C7F80001BF01C7F800033F01C3FC00031F8381FC00061F8380FF001C0 +FC7003FC0780FFE000FFFE003FC0001FF8001F802E2F7CAD34>97 D<01FE0000000000FFFE0000 +000000FFFE0000000000FFFE000000000003FE000000000001FE000000000000FE000000000000 +FE000000000000FE000000000000FE000000000000FE000000000000FE000000000000FE000000 +000000FE000000000000FE000000000000FE000000000000FE000000000000FE000000000000FE +000000000000FE000000000000FE000000000000FE000000000000FE000000000000FE00000000 +0000FE000000000000FE000000000000FE000000000000FE00FF00000000FE07FFF0000000FE1F +01FC000000FE38003E000000FE70001F800000FEC0000FC00000FF800007E00000FF800003F000 +00FF000003F80000FE000001FC0000FE000001FC0000FE000000FE0000FE000000FE0000FE0000 +00FF0000FE000000FF0000FE0000007F8000FE0000007F8000FE0000007F8000FE0000007FC000 +FE0000007FC000FE0000007FC000FE0000007FC000FE0000007FC000FE0000007FC000FE000000 +7FC000FE0000007FC000FE0000007FC000FE0000007FC000FE0000007F8000FE0000007F8000FE +000000FF8000FE000000FF0000FE000000FF0000FE000000FE0000FE000001FE0000FE000001FC +0000FE000001F80000FF000003F00000FF800007F00000FD800007E00000F9C0000F800000F8E0 +003F000000F078007E000000F01E03F8000000E00FFFE00000000001FE00000032497DC739>I< +00007F80000003FFF000000FC0FC00003F003F00007C001F8000F8000FC001F80007E003F00007 +E007E00003F00FE00003F80FE00003F81FC00001FC1FC00001FC3FC00001FC3FC00001FC7F8000 +01FE7F800000FE7F800000FEFF800000FEFF800000FEFFFFFFFFFEFFFFFFFFFEFF80000000FF80 +000000FF80000000FF80000000FF80000000FF800000007F800000007F800000007F800000007F +C00000003FC00000003FC000000E1FC000000E1FE000000E0FE000001C07E000001C07F0000038 +03F000007001F800007000FC0000E0003E0003C0001F8007000007E03E000001FFF80000003FC0 +00272F7DAD2E>101 D<01FE00FFFE00FFFE00FFFE0003FE0001FE0000FE0000FE0000FE0000FE +0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE +0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE +0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE +0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE +0000FE0000FE0000FE0000FE0000FE0000FE0003FF80FFFFFEFFFFFEFFFFFE17487DC71C>108 +D<01FC007F800000FFFC03FFF00000FFFC0781F80000FFFC0C007C000003FC18007E000001FC30 +003F000000FC60003F800000FCC0001F800000FD80001F800000FD80001FC00000FF00001FC000 +00FF00001FC00000FF00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE0000 +1FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000 +FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001F +C00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE +00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC0 +0000FE00001FC00000FE00001FC00003FF80007FF000FFFFFE1FFFFFC0FFFFFE1FFFFFC0FFFFFE +1FFFFFC0322D7CAC39>110 D<01FC01F800FFFC07FE00FFFC1E1F00FFFC383F8003FC607FC001 +FC607FC000FCC07FC000FCC07FC000FD803F8000FD801F0000FF000E0000FF00000000FF000000 +00FF00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE0000 +0000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00 +000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE +00000000FE00000000FE00000000FE00000000FF00000003FF800000FFFFFF8000FFFFFF8000FF +FFFF8000222D7DAC28>114 D<001FF8060000FFFF0E0003F0079E00078001FE000E00007E001C +00003E003C00003E007800001E007800001E00F800001E00F800000E00F800000E00FC00000E00 +FC00000E00FE00000E00FF000000007FC00000007FF80000003FFFE000001FFFFE00000FFFFF80 +0007FFFFE00003FFFFF00000FFFFFC00001FFFFE000001FFFE0000000FFF00000001FF80000000 +7F806000001FC0E000001FC0E000000FC0F000000FC0F0000007C0F0000007C0F0000007C0F800 +0007C0F800000780FC00000780FC00000F00FE00000F00FF00001E00FF80003C00F9E0007800F0 +F803E000E03FFFC000C007FC0000222F7DAD29>I<01FE00003FC000FFFE001FFFC000FFFE001F +FFC000FFFE001FFFC00003FE00007FC00001FE00003FC00000FE00001FC00000FE00001FC00000 +FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001F +C00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE +00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC0 +0000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00 +001FC00000FE00001FC00000FE00001FC00000FE00003FC00000FE00003FC00000FE00003FC000 +00FE00007FC000007E00007FC000007E00007FC000003F0000DFC000003F00019FE000001F0003 +1FF000000F80061FFFC00007F01C1FFFC00001FFF81FFFC000003FE01FE000322E7CAC39>117 +D E end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 300dpi +TeXDict begin + +%%EndSetup +%%Page: 0 1 +0 0 bop 258 823 a Fu(F)-9 b(unnelW)g(eb)38 b(User's)c(Man)m(ual)603 +1151 y Ft(Ross)21 b(N.)g(Williams)519 1343 y Fs(V1.0)e(for)h(F)-5 +b(unnelW)g(eb)20 b(V3.0)725 1536 y(Ma)n(y)g(1992)p eop +%%Page: 1 2 +1 1 bop 177 2597 1772 2 v 177 2675 a Fr(Cop)o(yrigh)o(t)384 +2674 y(c)372 2675 y Fq(\015)14 b Fr(1992)e(Ross)i(N.)g(William)o(s.)177 +2750 y(P)o(ermission)j(is)g(gran)o(ted)g(to)h(mak)o(e)d(and)j(distribute)g(v) +o(erbatim)d(copies)j(of)f(this)h(man)o(ual)c(pro)o(vided)k(that)f(the)177 +2800 y(cop)o(yrigh)o(t)d(notice)g(and)g(this)g(p)q(ermission)e(notice)j(are)f +(preserv)o(ed)i(on)e(all)e(copies.)p 177 2835 V 1053 2940 a(1)p +eop +%%Page: 2 3 +2 2 bop 1053 2940 a Fr(2)p eop +%%Page: 3 4 +3 3 bop 177 401 a Fp(Con)m(ten)m(ts)177 687 y Fo(Preface)1592 +b(9)177 808 y(Ac)o(kno)o(wledgemen)o(ts)1324 b(11)177 928 y(Presen)o(tation) +12 b(Notes)1323 b(13)177 1048 y(1)38 b(A)16 b(T)l(utorial)e(In)o(tro)q +(duction)1159 b(15)239 1126 y Fr(1.1)42 b(What)13 b(is)h(Literate)h +(Programmi)o(ng?)9 b Fn(:)20 b(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:) +f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(15)239 1204 y(1.2)42 b(What)13 b(is)h(F)m(unnelW)m(eb?)19 +b Fn(:)i(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h +(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(18)239 1281 y(1.3)42 b(The)14 b(Name)f(F)m(unnelW)m(eb)26 +b Fn(:)20 b(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h +(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(19)239 1359 y(1.4)42 b(A)14 b(F)m(unnelW)m(eb)f(T)m(utorial)24 +b Fn(:)c(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(19)239 1437 y(1.5)42 b(A)14 b(Hello)f(W)m(orld)g(Do)q(cumen)o(t)34 +b Fn(:)21 b(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(20)239 1514 y(1.6)42 b(Macro)14 b(F)m(acilities)i Fn(:)k(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b +Fr(22)335 1592 y(1.6.1)46 b(Simple)12 b(Macros)35 b Fn(:)20 +b(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b +Fr(22)335 1670 y(1.6.2)46 b(Num)o(b)q(er)13 b(of)g(Times)g(Called)h +Fn(:)20 b(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(23)335 1747 +y(1.6.3)46 b(Inden)o(tation)26 b Fn(:)20 b(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:) +f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(25)335 1825 y(1.6.4)46 b(Additiv)o(e)13 +b(Macros)34 b Fn(:)20 b(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(26)335 1903 y(1.6.5)46 b(P)o(arameterized)14 b(Macros)26 +b Fn(:)20 b(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(28)335 +1980 y(1.6.6)46 b(Macro)14 b(Expansion)i Fn(:)k(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(30)335 2058 y(1.6.7)46 b(Include)14 +b(Files)37 b Fn(:)21 b(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:) +h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)61 b Fr(30)239 2136 y(1.7)42 b(T)o(yp)q(esetting)15 b(F)m(acilities)10 +b Fn(:)21 b(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(32)335 2213 y(1.7.1)46 b(Ov)o(erview)35 b Fn(:)20 b(:)g(:)h(:)f(:)g(:)h +(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(32)335 +2291 y(1.7.2)46 b(T)o(yp)q(esetter)16 b(Indep)q(endence)41 +b Fn(:)21 b(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(34)335 2369 +y(1.7.3)46 b(Hierarc)o(hical)14 b(Structure)30 b Fn(:)20 b(:)g(:)h(:)f(:)g(:) +h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)61 b Fr(34)335 2446 y(1.7.4)46 b(Understanding)14 +b(the)h(Prin)o(ted)f(Do)q(cumen)o(tation)36 b Fn(:)21 b(:)f(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(35)335 +2524 y(1.7.5)46 b(Literals)14 b(and)f(Emphasis)24 b Fn(:)c(:)g(:)h(:)f(:)g(:) +h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)61 b Fr(37)335 2602 y(1.7.6)46 b(Adding)13 +b(a)h(Header)h(P)o(age)20 b Fn(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:) +g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(37)335 2679 y(1.7.7)46 b(Commen)o(ts)9 b Fn(:)20 b(:)g(:)h(:)f(:)g(:)h +(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(37)239 +2757 y(1.8)42 b(A)14 b(Complete)f(Example)c Fn(:)21 b(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(38)239 2835 y(1.9)42 +b(Summary)31 b Fn(:)20 b(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(39)1053 2940 y(3)p eop +%%Page: 4 5 +4 4 bop 177 42 a Fo(2)38 b(F)l(unnelW)l(eb)14 b(Hin)o(ts)1296 +b(41)239 116 y Fr(2.1)42 b(Macro)14 b(Names)22 b Fn(:)f(:)f(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b +Fr(41)239 190 y(2.2)42 b(Quic)o(k)14 b(Names)30 b Fn(:)21 b(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(42)239 265 y(2.3)42 b(F)m(unnelW)m(eb)13 b(the)i(Martinet)i +Fn(:)j(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:) +g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(42)239 339 y(2.4)42 b(Fiddling)12 b(With)i(End)g(of)f(Lines)28 +b Fn(:)20 b(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b +Fr(43)239 413 y(2.5)42 b(F)m(udging)13 b(Conditionals)e Fn(:)21 +b(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(44)239 488 y(2.6)42 b(Changing)13 b(the)h(Strength)h(of)e(Headings)19 +b Fn(:)h(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(46)239 562 y(2.7)42 +b(E\016ciency)14 b(Notes)h Fn(:)20 b(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(47)239 636 y(2.8)42 +b(In)o(teractiv)o(e)15 b(Mo)q(de)28 b Fn(:)20 b(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h +(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(47)239 711 y(2.9)42 +b(Setting)14 b(Up)g(Default)f(Options)29 b Fn(:)20 b(:)g(:)g(:)h(:)f(:)g(:)h +(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)61 b Fr(49)239 785 y(2.10)21 b(F)m(unnelW)m(eb)13 +b(and)h(Mak)o(e)38 b Fn(:)20 b(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:) +g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)61 b Fr(49)239 860 y(2.11)21 b(The)14 b(Dangers)g(of)g(F)m(unnelW)m +(eb)33 b Fn(:)20 b(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:) +g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(50)239 934 y(2.12)21 b(Wholistic)13 b(Debugging)21 b Fn(:)g(:)f(:)g(:)h +(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(53)239 +1008 y(2.13)21 b(Examples)13 b(of)g(F)m(unnelW)m(eb)g(Applications)e +Fn(:)20 b(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(53)335 1083 y(2.13.1)25 +b(Analyzing)13 b(the)h(Monster)h(P)o(ostscript)g(Header)g(File)e +Fn(:)20 b(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(54)335 1157 y(2.13.2)25 b(Making)13 b(Ada)g(ADTs)h(more)f(A)31 +b Fn(:)20 b(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h +(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(55)335 1231 +y(2.13.3)25 b(Multiple)13 b(Language)g(Systems)26 b Fn(:)20 +b(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(55)335 1306 y(2.13.4)25 +b(The)14 b(Case)g(of)g(the)g(Small)e(F)m(unction)g Fn(:)21 +b(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)61 b Fr(56)335 1380 y(2.13.5)25 b(When)14 +b(Commen)o(ts)d(are)k(Bad)24 b Fn(:)d(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h +(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(57)335 1455 y(2.13.6)25 b(Do)q(cumen)o(ts)13 b(That)h(Share)g(T)m(ext)41 +b Fn(:)20 b(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(58)335 1529 y(2.13.7)25 +b(Generics)18 b Fn(:)i(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:) +f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)61 b Fr(59)239 1603 y(2.14)21 b(Summary)31 b +Fn(:)20 b(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)61 b Fr(62)177 1719 y Fo(3)38 b(F)l(unnelW)l(eb)14 +b(De\014niti)o(on)1201 b(63)239 1793 y Fr(3.1)42 b(In)o(tro)q(duction)13 +b Fn(:)20 b(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)61 b Fr(63)239 1868 y(3.2)42 b(Notation)14 b +Fn(:)21 b(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h +(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)61 b Fr(63)239 1942 y(3.3)42 b(T)m(erminology)11 +b Fn(:)20 b(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)61 b Fr(63)239 2017 y(3.4)42 b(An)14 b(Arc)o(hitectural)h(Ov)o +(erview)40 b Fn(:)20 b(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:) +f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(64)239 2091 y(3.5)42 b(Diagnostics)32 b Fn(:)20 b(:)h(:)f(:)g(:)g(:)h(:) +f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b +Fr(65)239 2165 y(3.6)42 b(T)o(yp)q(esetter)16 b(Indep)q(endence)45 +b Fn(:)21 b(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(65)239 2240 y(3.7)42 b(Command)11 b(Line)i(In)o(terface)j +Fn(:)k(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:) +g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(66)335 2314 y(3.7.1)46 b(In)o(v)o(oking)12 b(F)m(unnelW)m(eb)25 +b Fn(:)20 b(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b +Fr(66)335 2388 y(3.7.2)46 b(Comma)o(nd)11 b(Line)j(Argumen)o(ts)35 +b Fn(:)20 b(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h +(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(67)335 2463 +y(3.7.3)46 b(Options)29 b Fn(:)20 b(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(68)239 2537 y(3.8)42 +b(File)13 b(Name)g(Inheritance)30 b Fn(:)20 b(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(70)239 2612 y(3.9)42 b(F)m(unnelW)m(eb)13 +b(Startup)h Fn(:)20 b(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)61 b Fr(70)239 2686 y(3.10)21 b(Scanner)33 b Fn(:)21 +b(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h +(:)f(:)g(:)61 b Fr(71)335 2760 y(3.10.1)25 b(Basic)14 b(Input)g(File)g(Pro)q +(cessing)30 b Fn(:)20 b(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(71)335 +2835 y(3.10.2)25 b(Sp)q(ecial)14 b(Sequences)44 b Fn(:)21 b(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(72)1053 2940 y(4)p eop +%%Page: 5 6 +5 5 bop 335 42 a Fr(3.10.3)25 b(Setting)14 b(the)g(Sp)q(ecial)g(Character)24 +b Fn(:)c(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(74)335 115 y(3.10.4)25 +b(Inserting)14 b(the)h(Sp)q(ecial)f(Character)g(in)o(to)g(the)g(T)m(ext)30 +b Fn(:)20 b(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(74)335 189 y(3.10.5)25 b(Inserting)14 b(Arbitrary)g(Characters)i(in)o +(to)d(the)h(T)m(ext)40 b Fn(:)20 b(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:) +f(:)g(:)h(:)f(:)g(:)61 b Fr(74)335 262 y(3.10.6)25 b(Commen)o(ts)9 +b Fn(:)20 b(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)61 b Fr(75)335 336 y(3.10.7)25 b(Quic)o(k)14 b(Names)26 +b Fn(:)21 b(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(76)335 409 y(3.10.8)25 b(Inserting)14 b(End)g(of)g(Line)g(Mark)o(ers)42 +b Fn(:)21 b(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(76)335 483 y(3.10.9)25 +b(Suppressing)15 b(End)f(of)f(Line)h(Mark)o(ers)21 b Fn(:)f(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(77)335 556 y(3.10.10)t(Include)14 b(Files)37 b Fn(:)21 +b(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(77)335 630 y(3.10.11)t(Pragmas)13 b Fn(:)20 b(:)g(:)g(:)h(:)f(:)g(:)h(:) +f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(78)468 703 +y(3.10.11.1)8 b(Inden)o(tation)18 b Fn(:)i(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:) +g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)61 b Fr(78)468 777 y(3.10.11.2)8 b(Maxim)o(um)i(Input)k(Line)g(Length) +19 b Fn(:)i(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)61 b Fr(79)468 850 y(3.10.11.3)8 b(Maxim)o(um)i(Output)15 +b(File)e(Line)h(Length)33 b Fn(:)20 b(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(79)468 924 y(3.10.11.4)8 b(T)o(yp)q(esetter)35 +b Fn(:)20 b(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b +Fr(80)335 997 y(3.10.12)t(F)m(reestanding)14 b(T)o(yp)q(esetter)i(Directiv)o +(es)23 b Fn(:)d(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(81)468 1071 y(3.10.12.1)8 +b(New)14 b(P)o(age)h Fn(:)21 b(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:) +f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:) +61 b Fr(81)468 1144 y(3.10.12.2)8 b(T)m(able)13 b(of)g(Con)o(ten)o(ts)35 +b Fn(:)20 b(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h +(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(81)468 1218 +y(3.10.12.3)8 b(V)m(ertical)14 b(Skip)25 b Fn(:)20 b(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)61 b Fr(81)468 1291 y(3.10.12.4)8 b(Title)i +Fn(:)21 b(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h +(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(82)335 1365 y(3.10.13)t(Scanner/P)o(arser)16 b(In)o(terface)c +Fn(:)20 b(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(82)239 1438 +y(3.11)21 b(P)o(arser)29 b Fn(:)20 b(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(82)335 +1512 y(3.11.1)25 b(High)13 b(Lev)o(el)h(Structure)20 b Fn(:)g(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(82)335 1585 y(3.11.2)25 +b(F)m(ree)14 b(T)m(ext)31 b Fn(:)20 b(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(83)335 1659 y(3.11.3)25 +b(T)o(yp)q(esetter)16 b(Directiv)o(es)42 b Fn(:)20 b(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)61 b Fr(83)468 1732 y(3.11.3.1)29 b(Section)j +Fn(:)20 b(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(83)468 1806 y(3.11.3.2)29 b(Literal)13 b(Directiv)o(e)27 +b Fn(:)21 b(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(84)468 1879 +y(3.11.3.3)29 b(Emphasis)13 b(Directiv)o(e)38 b Fn(:)20 b(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)61 b Fr(85)335 1953 y(3.11.4)25 b(Macros)42 b Fn(:)20 b(:)g(:)g(:)h(:)f(:) +g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(85)468 +2026 y(3.11.4.1)29 b(Names)41 b Fn(:)20 b(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)61 b Fr(86)468 2100 y(3.11.4.2)29 b(F)m(ormal)11 +b(P)o(arameter)j(Lists)24 b Fn(:)c(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:) +f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(86)335 +2173 y(3.11.5)25 b(Expressions)g Fn(:)20 b(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:) +f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(86)335 2247 y(3.11.6)25 +b(Macro)14 b(Calls)j Fn(:)j(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)61 b Fr(86)335 2320 y(3.11.7)25 b(F)m(ormal)11 +b(P)o(arameters)19 b Fn(:)i(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(87)335 2394 y(3.11.8)25 b(Macros)14 b(are)h(Static)e Fn(:)20 +b(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(87)239 +2467 y(3.12)21 b(Analyser)16 b Fn(:)21 b(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(88)239 +2541 y(3.13)21 b(T)m(angle)g Fn(:)f(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(88)239 +2614 y(3.14)21 b(W)m(ea)o(v)o(e)26 b Fn(:)20 b(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:) +h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(89)335 2688 y(3.14.1)25 b(T)m(arget)13 b(T)o(yp)q(esetter)40 +b Fn(:)21 b(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(89)335 2761 y(3.14.2)25 b(Cross)14 b(Reference)i(Num)o(b)q(ering)22 +b Fn(:)e(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(89)239 2835 y(3.15)21 +b(F)m(unnelW)m(eb)13 b(Shell)32 b Fn(:)20 b(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(90)1053 2940 y(5)p +eop +%%Page: 6 7 +6 6 bop 335 42 a Fr(3.15.1)25 b(In)o(tro)q(duction)41 b Fn(:)21 +b(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(90)335 116 y(3.15.2)25 b(Return)14 b(Statuses)43 b Fn(:)20 +b(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(90)335 +190 y(3.15.3)25 b(Comma)o(nd)11 b(Line)j(Length)42 b Fn(:)20 +b(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(91)335 265 y(3.15.4)25 +b(String)13 b(Substitution)k Fn(:)k(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)61 b Fr(91)335 339 y(3.15.5)25 b(Ho)o(w)13 b(a)h(Command)d(Line)i(is)h +(Pro)q(cessed)j Fn(:)j(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:) +g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(92)335 413 y(3.15.6)25 +b(Options)k Fn(:)20 b(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)61 b Fr(92)335 488 y(3.15.7)25 b(Shell)13 b(Commands)26 +b Fn(:)20 b(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(93)468 562 y(3.15.7.1)29 b(Absen)o(t)37 b Fn(:)20 b(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(93)468 636 y(3.15.7.2)29 +b(Co)q(dify)41 b Fn(:)20 b(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:) +f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:) +61 b Fr(93)468 711 y(3.15.7.3)29 b(Compare)h Fn(:)21 b(:)f(:)g(:)g(:)h(:)f(:) +g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(93)468 785 y(3.15.7.4)29 b(De\014ne)17 +b Fn(:)j(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(94)468 860 y(3.15.7.5)29 b(Di\013)h Fn(:)21 b(:)f(:)g(:)h(:)f(:)g(:)g(:) +h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(94)468 934 y(3.15.7.6)29 +b(Di\013summary)22 b Fn(:)e(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h +(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(95)468 1008 y(3.15.7.7)29 b(Di\013zero)22 b Fn(:)e(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(95)468 1083 y(3.15.7.8)29 +b(Eneo)41 b Fn(:)20 b(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(95)468 1157 y(3.15.7.9)29 b(Execute)20 b Fn(:)g(:)h(:)f(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(96)468 1231 y(3.15.7.10)8 +b(Exists)21 b Fn(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(96)468 1306 y(3.15.7.11)8 b(Fixeols)35 b Fn(:)20 b(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(96)468 1380 y(3.15.7.12)8 +b(Fw)41 b Fn(:)21 b(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)61 b Fr(97)468 1455 y(3.15.7.13)8 b(Help)14 b Fn(:)21 b(:)f(:)g(:)h(:)f(:) +g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h +(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(97)468 1529 +y(3.15.7.14)8 b(Here)15 b Fn(:)21 b(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h +(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)61 b Fr(98)468 1603 y(3.15.7.15)8 b(Quit)15 +b Fn(:)21 b(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fr(98)468 1678 y(3.15.7.16)8 b(Set)41 b Fn(:)21 b(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(98)468 1752 y(3.15.7.17)8 +b(Sho)o(w)35 b Fn(:)20 b(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)61 b Fr(98)468 1826 y(3.15.7.18)8 b(Skipto)14 b Fn(:)20 +b(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b +Fr(98)468 1901 y(3.15.7.19)8 b(Status)16 b Fn(:)k(:)g(:)h(:)f(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fr(99)468 1975 y(3.15.7.20)8 +b(T)m(olerate)14 b Fn(:)20 b(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)41 b Fr(100)468 2049 y(3.15.7.21)8 b(T)m(race)31 b Fn(:)20 +b(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)41 b +Fr(100)468 2124 y(3.15.7.22)8 b(W)m(rite)29 b Fn(:)20 b(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)41 b Fr(100)468 2198 y(3.15.7.23)8 +b(W)m(riteu)38 b Fn(:)20 b(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:) +f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:) +41 b Fr(100)239 2273 y(3.16)21 b(Concluding)13 b(Remarks)22 +b Fn(:)f(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h +(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)41 +b Fr(100)177 2388 y Fo(4)d(F)l(unnelW)l(eb)14 b(Installation)1146 +b(101)239 2463 y Fr(4.1)42 b(Obtaining)13 b(a)h(Cop)o(y)f(of)g(F)m(unnelW)m +(eb)37 b Fn(:)21 b(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:) +f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)41 b Fr(101)239 +2537 y(4.2)h(Establishing)13 b(The)i(Directory)f(T)m(ree)41 +b Fn(:)21 b(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)41 b Fr(102)335 +2612 y(4.2.1)46 b(Admin)12 b(Directory)25 b Fn(:)20 b(:)h(:)f(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)41 b Fr(102)335 2686 y(4.2.2)46 +b(Answ)o(ers)15 b(Directory)30 b Fn(:)21 b(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:) +g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h +(:)f(:)g(:)41 b Fr(102)335 2760 y(4.2.3)46 b(Hac)o(kman)12 +b(Directory)f Fn(:)21 b(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)41 +b Fr(103)335 2835 y(4.2.4)46 b(Results)14 b(Directory)i Fn(:)k(:)h(:)f(:)g(:) +g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)41 b Fr(103)1053 2940 y(6)p +eop +%%Page: 7 8 +7 7 bop 335 42 a Fr(4.2.5)46 b(Scripts)14 b(Directory)24 b +Fn(:)c(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:) +g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)41 +b Fr(103)335 116 y(4.2.6)46 b(Sources)15 b(Directory)d Fn(:)20 +b(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)41 b Fr(103)335 +191 y(4.2.7)46 b(T)m(ests)14 b(Directory)23 b Fn(:)d(:)g(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)41 b Fr(104)335 266 y(4.2.8)46 +b(Userman)13 b(Directory)20 b Fn(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)41 b Fr(105)239 340 y(4.3)h(Compiling)11 b(F)m(unnelW)m(eb)29 +b Fn(:)20 b(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h +(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)41 +b Fr(105)239 415 y(4.4)h(T)m(esting)14 b(F)m(unnelW)m(eb)k +Fn(:)i(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:) +h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)41 +b Fr(105)239 490 y(4.5)h(Installing)12 b(F)m(unnelW)m(eb)i +Fn(:)21 b(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h +(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)41 +b Fr(106)239 565 y(4.6)h(Prin)o(ting)13 b(Man)o(uals)21 b Fn(:)f(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)41 b +Fr(107)239 639 y(4.7)h(Installation)12 b(Problems?)24 b Fn(:)c(:)g(:)h(:)f(:) +g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h +(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)41 b Fr(107)177 756 +y Fo(5)d(F)l(unnelW)l(eb)14 b(Administr)o(ati)o(on)1066 b(109)239 +830 y Fr(5.1)42 b(In)o(tro)q(duction)13 b Fn(:)20 b(:)h(:)f(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)41 b +Fr(109)239 905 y(5.2)h(The)14 b(User's)h(Commitm)n(en)o(t)d(T)m(o)h(F)m +(unnelW)m(eb)30 b Fn(:)20 b(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)41 b Fr(109)239 +980 y(5.3)h(Do)q(cumen)o(tation)25 b Fn(:)20 b(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:) +g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h +(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)41 b Fr(110)239 1054 +y(5.4)h(Registration)17 b Fn(:)j(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g +(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)41 b Fr(110)239 1129 y(5.5)h(Supp)q(ort)29 +b Fn(:)21 b(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h +(:)f(:)g(:)h(:)f(:)g(:)41 b Fr(110)239 1204 y(5.6)h(Cop)o(yrigh)o(t)26 +b Fn(:)20 b(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h +(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)41 b Fr(112)239 1279 y(5.7)h(No)o(w)o(arran)o(t)o(y)27 +b Fn(:)20 b(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)41 b Fr(112)239 1353 y(5.8)h(Distribution)18 +b Fn(:)i(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h +(:)f(:)g(:)41 b Fr(113)239 1428 y(5.9)h(Mo)q(di\014cation)11 +b Fn(:)20 b(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f +(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)41 b Fr(113)239 1503 y(5.10)21 b(V)m(ersions)k +Fn(:)c(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:) +f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)41 b Fr(114)239 1577 y(5.11)21 b(FTP)14 b(Arc)o(hiv)o(e)g(and) +g(Author)36 b Fn(:)21 b(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g +(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)41 +b Fr(114)177 1694 y Fo(A)26 b(Glossary)1456 b(115)177 1810 +y(B)28 b(References)1412 b(117)177 1926 y(Index)1581 b(117)1053 +2940 y Fr(7)p eop +%%Page: 8 9 +8 8 bop 1053 2940 a Fr(8)p eop +%%Page: 9 10 +9 9 bop 177 399 a Fp(Preface)177 639 y Fr(When,)17 b(in)f(1986,)g(I)g +(\014rst)i(read)f(Donald)e(Kn)o(uth's)i(tec)o(hnical)g(rep)q(ort)h(on)e(W)m +(eb)p Fo([Kn)o(uth83])p Fr(,)f(and)h(tried)h(W)m(eb)177 689 +y(out,)f(I)f(w)o(as)h(sim)o(ultaneously)d(excited)k(b)o(y)e(Kn)o(uth's)h +(idea)f(of)g(literate)h(programming,)c(and)k(disapp)q(oin)o(ted)f(b)o(y)177 +739 y(his)f(implemen)o(tati)o(on)d(of)i(it.)18 b(I)13 b(w)o(as)h(excited)g(b) +q(ecause)i(I)d(could)h(sense)h(the)f(p)q(oten)o(tial)g(for)f(the)h(literate)g +(st)o(yle)g(to)177 789 y(transform)g(the)h(state)g(of)f(mind)f(of)h(the)h +(programmer,)d(but)j(w)o(as)f(disapp)q(oin)o(ted)g(b)o(y)h(W)m(eb's)f +(rigidit)o(y)f(and)h(lac)o(k)177 839 y(of)h(practicalit)o(y)m(,)f(whic)o(h)h +(seemed)h(to)f(b)q(etra)o(y)g(this)h(p)q(oten)o(tial.)21 b(The)16 +b(W)m(eb)f(I)g(used)h(w)o(as)f(P)o(ascal-sp)q(eci\014c,)i(T)1881 +847 y(E)1904 839 y(X-)177 888 y(sp)q(eci\014c,)c(and)e(applied)f(to)q(o)h +(man)o(y)e(constrain)o(ts)i(to)g(the)h(programmi)o(ng)c(pro)q(cess.)19 +b(In)11 b(particular,)g(it)g(insisted)g(on)177 938 y(taking)i(con)o(trol)g +(of)g(the)h(program)e(text,)h(mangling)e(the)j(co)q(de)g(in)f(the)h(P)o +(ascal)f(output)h(\014les,)f(and)h(imp)q(osing)d(its)177 988 +y(o)o(wn)i(rather)g(rigid)f(ideas)h(ab)q(out)g(inden)o(ting)f(in)g(the)i(T) +1026 997 y(E)1049 988 y(X)f(output.)18 b(All)12 b(this,)g(com)o(bined)g(with) +g(the)i(complexit)o(y)177 1038 y(of)f(the)i(to)q(ol,)e(led)h(me)e(to)i(come)f +(to)h(p)q(erceiv)o(e)h(W)m(eb)f(as)g(problem)e(rather)j(than)f(solution.)177 +1112 y(Despite)h(all)f(this,)g(I)h(w)o(as)f(w)o(ell)g(and)g(truly)h(ho)q(ok)o +(ed)f(on)h(the)g(idea)f(of)g(literate)h(programming)o(.)i(The)e(inevitable) +177 1162 y(result)g(w)o(as)f(that)g(I)f(designed)i(and)f(implem)o(en)o(ted)e +(m)o(y)g(o)o(wn)i(v)o(ersion)g(of)f(W)m(eb)h(|)f(F)m(unnelW)m(eb!)177 +1237 y(F)m(unnelW)m(eb)d(is)h(not)f(the)i(most)d(sophisticated)j(literate)e +(programming)d(to)q(ol)j(a)o(v)n(ailable,)f(but)i(it)f(is)h(an)f(extremely) +177 1287 y Fm(pr)n(actic)n(al)i Fr(to)q(ol,)g(striving)g(for)g(simplicit)o(y) +f(and)h(p)q(ortabilit)o(y)g(in)g(all)f(areas.)18 b(Not)13 b(only)f(is)h(F)m +(unnelW)m(eb)f(language-)177 1337 y(indep)q(enden)o(t,)23 b(and)d(to)g(some)f +(exten)o(t)i(t)o(yp)q(esetter)i(indep)q(enden)o(t,)f(but)f(its)f(implemen)o +(tatio)o(n)d(also)j(stresses)177 1386 y(p)q(ortabilit)o(y)m(,)14 +b(b)q(eing)h(written)h(in)f(C,)g(and)h(curren)o(tly)g(op)q(erating)g(on)f +(four)g(ma)r(jor)f(platforms)g(\(Sun,)h(V)m(ax,)g(PC,)177 1436 +y(Mac\).)j(F)m(unnelW)m(eb)13 b(allo)o(ws)f(the)j(programmer)c(total)h(con)o +(trol)i(o)o(v)o(er)f(the)h(output)g(\014le,)f(making)e(it)i(suitable)g(for) +177 1486 y(use)18 b(with)e(all)g(sorts)h(of)f(format-sensitiv)o(e)g +(languages.)26 b(It)17 b(also)f(allo)o(ws)f(con)o(trol)i(o)o(v)o(er)f(its)h +(o)o(wn)f(source)i(co)q(de,)177 1536 y(whic)o(h)11 b(has)g(b)q(een)h +(released)g(under)g(a)e(GNU)h(license.)18 b(F)m(unnelW)m(eb)10 +b(is)h(quite)g(solid,)f(ha)o(ving)g(to)h(pass)g(a)g(regression)177 +1586 y(testing)17 b(suite)h(of)e(o)o(v)o(er)h(200)f(tests)i(b)q(efore)f(b)q +(eing)g(released.)28 b(Finally)m(,)15 b(F)m(unnelW)m(eb)h(is)h(w)o(ell)f(do)q +(cumen)o(ted)h(b)o(y)177 1636 y(this)d(man)o(ual)e(whic)o(h)h(pro)o(vides)h +(a)g(tutorial,)f(adv)n(anced)h(hin)o(ts,)f(and)h(a)f(language)g +(de\014nition.)177 1710 y(I)e(w)o(ould)e(lik)o(e)h(to)g(dedicate)i(F)m +(unnelW)m(eb)e(and)g(this)g(man)o(ual)e(to)j(Donald)e(Kn)o(uth)i(and)f(his)h +(literate)f(programming)177 1760 y(to)q(ol)g(W)m(eb.)17 b(Although)10 +b(this)g(man)o(ual)f(is)h(somewhat)g(critical)g(of)g(some)g(asp)q(ects)i(of)e +(W)m(eb,)h(this)f(criticism)g(is)g(really)177 1810 y(a)j(pro)q(duct)h(of)e +(di\013ering)h(design)g(goals.)k(Kn)o(uth)d(designed)f(a)g(paradigm)e +(\(literate)i(programming\))d(and)j(a)f(to)q(ol)177 1860 y(\(W)m(eb\))20 +b(aimed)f(at)h(the)h(highest)f(pitc)o(h)h(of)e(program)g(presen)o(tation)i +(and)f(t)o(yp)q(esetting.)38 b(F)m(unnelW)m(eb)20 b(aims)177 +1910 y(lo)o(w)o(er,)13 b(relaxing)f(constrain)o(ts,)h(and)g(making)e +(compromises)g(in)h(order)i(to)f(ac)o(hiev)o(e)g(simplicit)o(y)m(,)d +(\015exibilit)o(y)m(,)h(and)177 1959 y(p)q(ortabilit)o(y)m(.)16 +b(The)c(result)g(is)f(a)g(practical)h(to)q(ol)f(whic)o(h)g(I)g(hop)q(e)h +(will)e(attract)i(more)f(p)q(eople)h(to)f(the)h(literate)g(st)o(yle.)177 +2059 y Fo(Ross)j(N.)i(Williams)177 2109 y(Adelaide,)d(Australia)177 +2159 y(Ma)o(y)i(1992)1053 2940 y Fr(9)p eop +%%Page: 10 11 +10 10 bop 1042 2940 a Fr(10)p eop +%%Page: 11 12 +11 11 bop 177 399 a Fp(Ac)m(kno)m(wledgemen)m(ts)177 645 y +Fr(Man)o(y)16 b(thanks)h(to)g Fo(Da)o(vid)h(Hulse)d Fr(\()p +Fl(dave@cs.adelaide.e)o(du.au)o Fr(\))f(for)j(translating)f(the)h(original)e +(v)o(ersion)177 695 y(of)g(F)m(unnelW)m(eb)g(\(F)m(unnelW)m(eb)h(V1\))f(from) +f(Ada)i(in)o(to)f(C)g(and)h(getting)f(it)h(to)f(w)o(ork)g(on)h(Unix)f(and)h +(a)f(PC.)g(The)177 744 y(C)i(co)q(de)h(written)f(b)o(y)g(Da)o(vid)e(\(F)m +(unnelW)m(eb)i(V2\))f(formed)g(the)h(basis)g(of)g(F)m(unnelW)m(eb)f(V3,)h +(but)g(w)o(as)g(en)o(tirely)177 794 y(rewritten)h(during)f(the)h(in)o(tensiv) +o(e)f(re\014nemen)o(t)h(and)e(feature-injection)i(p)q(erio)q(d)f(leading)f +(up)h(to)g(this)h(release)177 844 y(\(F)m(unnelW)m(eb)12 b(V3)g(is)f(ab)q +(out)h(three)h(times)e(the)i(size)g(of)e(F)m(unnelW)m(eb)g(V2\).)18 +b(Nev)o(ertheless,)c(without)e(this)g(imp)q(or-)177 894 y(tan)o(t)h(\014rst)i +(translation)d(step,)i(I)g(w)o(ould)e(probably)h(not)g(ha)o(v)o(e)g(found)g +(the)h(motiv)n(ation)d(to)i(dev)o(elop)g(F)m(unnelW)m(eb)177 +944 y(to)h(its)g(presen)o(t)h(state.)177 1018 y(Thanks)f(go)e(to)h +Fo(Simon)h(Hac)o(k)o(ett)e Fr(\()p Fl(simon@internode.com)o(.au)p +Fr(\))e(of)j(In)o(terno)q(de)h(Systems)f(Pt)o(y)h(Ltd)f(for)g(the)177 +1068 y(use)18 b(of)e(his)h(Sun,)h(Mac,)g(and)e(PC,)h(for)g(assistance)h(in)f +(p)q(orting)f(F)m(unnelW)m(eb)h(to)g(the)g(Sun)h(and)e(PC,)h(and)g(for)177 +1118 y(helpful)c(discussions.)177 1193 y(Thanks)j(go)g(to)f +Fo(Jerem)o(y)i(Begg)f Fr(\()p Fl(jeremy@vsm.com.au)o Fr(\))d(of)j(VSM)g(Soft) +o(w)o(are)f(Services)j(for)d(the)i(use)g(of)e(his)177 1243 +y(V)-5 b(AX,)14 b(and)g(for)g(assistance)h(with)e(the)i(VMS-sp)q(eci\014c)g +(co)q(de.)177 1317 y(Thanks)50 b(to)h Fo(Barry)57 b(Dwy)o(er)50 +b Fr(\()p Fl(dwyer@cs.adelaid)o(e.edu)o(.au)p Fr(\))d(and)j +Fo(Roger)57 b(Brissenden)177 1367 y Fr(\()p Fl(rjb@koala.harvard.e)o(du)p +Fr(\))15 b(for)j(trying)g(out)g(F)m(unnelW)m(eb)g(V)m(ersion)g(1)g(in)g(1987) +f(and)h(pro)o(viding)f(v)n(aluable)177 1417 y(feedbac)o(k.)177 +1492 y(Thanks)d(to)g(Donald)f(Kn)o(uth)h(for)f(establishing)h(the)g(idea)g +(of)f(literate)h(programming)d(in)i(the)i(\014rst)f(place.)177 +1591 y Fo(Ross)h(N.)i(Williams)177 1641 y(Adelaide,)d(Australia)177 +1691 y(Ma)o(y)i(1992)1042 2940 y Fr(11)p eop +%%Page: 12 13 +12 12 bop 1042 2940 a Fr(12)p eop +%%Page: 13 14 +13 13 bop 177 399 a Fp(Presen)m(tation)42 b(Notes)177 639 y +Fo(References:)e Fr(All)24 b(references)29 b(are)c(set)i(in)e(b)q(old)f(and)i +(are)f(cited)h(in)f(square)h(brac)o(k)o(ets)h(in)e(the)h(form)177 +689 y Fo([)p Fn(<)p Fm(\014rstauthor)p Fn(><)p Fm(ye)n(ar)p +Fn(>)p Fo(])p Fr(.)19 b(All)13 b(references)j(cited)e(in)f(the)g(text)h(app)q +(ear)g(in)f(the)h(reference)h(list)e(and)g(the)h(index.)177 +764 y Fo(Sp)q(ecial)d(terms:)17 b Fr(New)12 b(or)f(imp)q(ortan)o(t)f +(terminology)f(has)i(b)q(een)i(set)f(in)f(b)q(old)g(face)h(and)f(app)q(ears)h +(in)f(the)h(index.)177 814 y(A)i(glossary)g(app)q(ears)g(as)g(an)g(app)q +(endix.)177 888 y Fo(T)o(yp)q(esetting:)69 b Fr(This)41 b(do)q(cumen)o(t)f(w) +o(as)g(prepared)i(b)o(y)e(the)h(author)f(using)h(Andrew)g(T)m(rev)o(or-)177 +938 y(ro)o(w's)29 b(\()p Fl(akt150@cscgpo.anu.e)o(du.au)o Fr(\))e(implemen)o +(tatio)o(n)g(\(OzT)m(eX\))j(of)f(the)h(T)1558 947 y(E)1581 +938 y(X/L)1644 933 y Fk(a)1663 938 y Fr(T)1686 951 y(E)1709 +938 y(X)p Fo([Kn)o(uth84])177 988 y([Lamp)q(ort86])13 b Fr(t)o(yp)q(esetting) +i(system)e(running)h(on)g(a)f(Macin)o(tosh-SE.)177 1063 y Fo(Graphics:)i +Fr(All)c(diagrams)e(ha)o(v)o(e)i(b)q(een)i(constructed)g(out)e(of)g(text)h +(using)f(the)h(L)1431 1058 y Fk(a)1450 1063 y Fr(T)1473 1075 +y(E)1496 1063 y(X)f Fl(verbatim)f Fr(en)o(vironmen)o(t)177 +1112 y(so)17 b(as)f(to)h(allo)o(w)e(this)h(do)q(cumen)o(t)g(to)h(b)q(e)g +(disseminated)e(electronically)i(and)f(prin)o(ted)h(using)f(L)1695 +1107 y Fk(a)1714 1112 y Fr(T)1737 1125 y(E)1761 1112 y(X)g(without)177 +1162 y(access)g(to)e(the)g(author's)g(dra)o(wing)f(to)q(ols.)177 +1237 y Fo(Kno)o(wn)g(t)o(yp)q(esetting)d(problems:)k Fr(While)d(ev)o(ery)h +(attempt)f(has)h(b)q(een)g(made)e(to)i(giv)o(e)f(a)g(go)q(o)q(d)g(presen)o +(tation)177 1287 y(within)h(the)h(time)e(a)o(v)n(ailable,)f(some)i(shortcuts) +i(ha)o(v)o(e)e(had)g(to)g(b)q(e)h(tak)o(en.)18 b(In)13 b(particular,)f(the)h +(author)f(has)h(b)q(een)177 1337 y(unable)h(to)g(w)o(ork)f(out)h(ho)o(w)g(to) +f(get)h(L)754 1332 y Fk(a)773 1337 y Fr(T)796 1349 y(E)820 +1337 y(X)g(to)g(suppress)h(blank)f(pages)g(at)f(the)i(start)f(of)g(c)o +(hapters.)1042 2940 y(13)p eop +%%Page: 14 15 +14 14 bop 1042 2940 a Fr(14)p eop +%%Page: 15 16 +15 15 bop 177 378 a Fj(Chapter)34 b(1)177 610 y Fp(A)40 b(T)-10 +b(utorial)41 b(In)m(tro)s(duction)177 876 y Fi(1.1)70 b(What)23 +b(is)f(Literate)g(Programming?)177 992 y Fr(A)e(traditional)e(computer)h +(program)f(consists)i(of)f(a)g(text)h(\014le)f(con)o(taining)g(program)f(co)q +(de.)35 b(Scattered)21 b(in)177 1041 y(amongst)12 b(the)j(program)d(co)q(de)j +(are)f(commen)o(ts)e(whic)o(h)i(describ)q(e)i(the)e(v)n(arious)f(parts)i(of)e +(the)i(co)q(de.)177 1116 y(In)d Fo(literate)f(programming)e +Fr(the)k(emphasis)e(is)h(rev)o(ersed.)20 b(Instead)13 b(of)e(writing)g(co)q +(de)i(con)o(taining)e(do)q(cumen-)177 1166 y(tation,)g(the)i(literate)f +(programmer)e(writes)i(do)q(cumen)o(tation)f(con)o(taining)g(co)q(de.)18 +b(No)11 b(longer)h(do)q(es)h(the)f(English)177 1216 y(commen)o(tary)d +(injected)j(in)o(to)f(a)g(program)f(ha)o(v)o(e)h(to)g(b)q(e)h(hidden)f(in)g +(commen)o(t)e(delimiters)h(at)i(the)f(top)h(of)e(the)i(\014le,)177 +1266 y(or)j(under)g(pro)q(cedure)h(headings,)e(or)h(at)f(the)h(end)g(of)f +(lines.)19 b(Instead,)c(it)f(is)g(wrenc)o(hed)i(in)o(to)e(the)h(da)o(yligh)o +(t)e(and)177 1315 y(made)j(the)h(main)e(fo)q(cus.)26 b(The)17 +b(\\program")e(then)i(b)q(ecomes)g(primarily)d(a)j(do)q(cumen)o(t)f(directed) +i(at)f(h)o(umans,)177 1365 y(with)12 b(the)h(co)q(de)h(b)q(eing)e(herded)i(b) +q(et)o(w)o(een)g(\\co)q(de)f(delimiters")e(from)g(where)i(it)f(can)h(b)q(e)g +(extracted)h(and)e(sh)o(u\017ed)177 1415 y(out)i(sidew)o(a)o(ys)g(to)g(the)g +(language)f(system)h(b)o(y)f(literate)i(programmi)o(ng)c(to)q(ols.)177 +1490 y(The)k(e\013ect)i(of)d(this)h(simple)e(shift)h(of)h(emphasis)e(can)i(b) +q(e)h(so)f(profound)f(as)h(to)f(c)o(hange)h(one's)g(whole)g(approac)o(h)177 +1540 y(to)f(programming.)i(Under)f(the)g(literate)g(programming)c(paradigm,)g +(the)k(cen)o(tral)g(activit)o(y)f(of)f(programming)177 1589 +y(b)q(ecomes)i(that)g(of)f(con)o(v)o(eying)g(meaning)f(to)i(other)g(in)o +(telligen)o(t)f(b)q(eings)h(rather)g(than)g(merely)f(con)o(vincing)g(the)177 +1639 y(computer)i(to)g(b)q(eha)o(v)o(e)g(in)g(a)g(particular)g(w)o(a)o(y)m(.) +23 b(It)16 b(is)g(the)h(di\013erence)h(b)q(et)o(w)o(een)f(p)q(erforming)e +(and)h(exp)q(osing)g(a)177 1689 y(magic)c(tric)o(k.)177 1764 +y(In)18 b(order)g(to)g(program)e(in)i(a)f(literate)h(st)o(yle,)h(particular)e +(to)q(ols)h(are)g(required.)30 b(The)19 b(traditional)d(approac)o(h)177 +1814 y(\(used)f(in)f(the)g(F)m(unnelW)m(eb)g(system\))g(is)g(to)f(ha)o(v)o(e) +h(some)f(sort)i(of)e(text-\014le-in/text-\014le-out)h(utilit)o(y)f(that)h +(reads)177 1863 y(a)20 b(literate)f(program)f(\(con)o(taining)h(a)h(program)e +(commen)o(tary)f(p)q(epp)q(ered)22 b(with)d(scraps)i(of)e(program)f(text\)) +177 1913 y(and)e(writes)g(out)g(a)g(\014le)g(con)o(taining)e(all)h(the)h +(program)f(co)q(de)h(and)g(a)f(\014le)h(con)o(taining)f(t)o(yp)q(esetter)j +(commands)177 1963 y(represen)o(ting)e(the)e(en)o(tire)h(input)e(do)q(cumen)o +(t,)g(do)q(cumen)o(tation,)g(co)q(de,)h(and)g(all)e(\()p Fo(Figure)i(1)p +Fr(\).)177 2038 y(Giv)o(en)h(the)h(coming)e(age)h(of)g(h)o(yp)q(ertext)i +(systems,)e(this)h(is)f(probably)g(not)h(the)g(b)q(est)g(approac)o(h.)23 +b(Ho)o(w)o(ev)o(er,)16 b(it)177 2087 y(do)q(es)c(mesh)f(b)q(eautifully)f +(with)h(curren)o(t)i(text)f(\014les)g(and)f(command)e(line)i(in)o(terfaces,)h +(the)g(exp)q(ectation)g(of)f(linear)177 2137 y(presen)o(tations)k(in)f(the)g +(do)q(cumen)o(ts)g(w)o(e)g(read,)g(and)g(the)h(particular)e(requiremen)o(ts)i +(of)e(curren)o(t)i(programming)177 2187 y(languages)f(and)f(t)o(yp)q +(esetting)i(systems.)j(It)c(is)g(certainly)g(not)g(a)f(bad)h(approac)o(h.)177 +2262 y(With)i(this)h(structure)h(in)e(place,)h(the)g(literate)g(programming)c +(system)j(can)h(pro)o(vide)f(far)g(more)g(than)g(just)h(a)177 +2312 y(rev)o(ersal)h(of)e(the)i(priorit)o(y)e(of)h(commen)o(ts)e(and)i(co)q +(de.)28 b(In)17 b(its)g(full)e(blo)o(wn)i(form,)e(a)i(go)q(o)q(d)f(literate)i +(program-)177 2361 y(ming)c(facilit)o(y)g(can)h(pro)o(vide)h(total)f(supp)q +(ort)h(for)f(the)h(essen)o(tial)g(thrust)h(of)e(literate)h(programmi)o(ng,)c +(whic)o(h)k(is)177 2411 y(that)f(computer)g(programs)f(should)h(b)q(e)h +(written)g(more)e(for)h(the)h(h)o(uman)e(reader)i(than)f(for)g(the)h +(compiler.)21 b(In)177 2461 y(particular,)13 b(a)h(literate)g(programming)c +(system)k(can)g(pro)o(vide:)295 2536 y Fo(Re-ordering)f(of)j(co)q(de:)k +Fr(Programmi)o(ng)11 b(languages)j(often)g(force)h(the)g(programmer)d(to)i +(giv)o(e)295 2586 y(the)g(v)n(arious)e(parts)h(of)f(a)h(computer)f(program)f +(in)h(a)h(particular)f(order.)19 b(F)m(or)12 b(example,)f(the)j(P)o(as-)295 +2635 y(cal)f(programming)d(language)p Fo([BSI82])i Fr(imp)q(oses)g(the)i +(ordering:)j(constan)o(ts,)d(t)o(yp)q(es,)g(v)n(ariables,)295 +2685 y(pro)q(cedures,)i(co)q(de.)k(P)o(ascal)14 b(also)g(requires)h(that)g +(pro)q(cedures)h(app)q(ear)f(in)f(an)g(order)h(consisten)o(t)295 +2735 y(with)g(the)g(partial)f(ordering)h(imp)q(osed)e(b)o(y)i(the)g(static)g +(call)f(graph)h(\(but)g(forw)o(ard)g(declarations)295 2785 +y(allo)o(w)e(this)i(to)g(b)q(e)g(b)o(ypassed\).)21 b(In)15 +b(con)o(trast,)g(the)h(literate)f(st)o(yle)f(requires)i(that)f(the)g +(program-)295 2835 y(mer)c(b)q(e)i(free)f(to)g(presen)o(t)h(the)f(computer)g +(program)e(in)h(an)o(y)h(order)g(whatso)q(ev)o(er.)19 b(The)12 +b(facilit)o(y)e(to)1042 2940 y(15)p eop +%%Page: 16 17 +16 16 bop 526 789 a Fl(+----------------)o(-----)o(----)o(-----)o(-----)o +(-----)o(-+)526 838 y(|)21 b(File)g(containing)f(the)h(program)g(description) +e(|)526 888 y(|)i(peppered)g(with)g(scraps)f(of)h(program)g(code.)64 +b(|)526 938 y(|)21 b(This)g(is)h(what)f(the)g(programmer)f(works)g(on.)65 +b(|)526 988 y(|)218 b(\(e.g.)20 b(sloth.web\))325 b(|)526 1038 +y(+----------------)o(-----)o(----)o(-----)o(-----)o(-----)o(-+)962 +1087 y(|)962 1137 y(v)657 1187 y(o---------------)o(----)o(-----)o(---o)657 +1237 y(|)21 b(Literate)f(Programming)g(Tool)h(|)657 1287 y(o---------------)o +(----)o(-----)o(---o)962 1336 y(|)526 1386 y(+----------------)o(---+-)o +(----)o(-----)o(-----)o(----+)526 1436 y(|)850 b(|)526 1486 +y(v)g(v)330 1536 y(+---------------)o(---+)236 b(+------------------)o(-----) +o(-----)o(----)o(--+)330 1586 y(|)65 b(Traditional)85 b(|)239 +b(|)22 b(Documentation)d(file)i(suitable)f(for)43 b(|)330 1635 +y(|)21 b(Computer)f(Program)h(|)239 b(|)22 b(input)f(into)g(a)g(typesetting)f +(program)g(|)330 1685 y(|)43 b(\(e.g.)21 b(sloth.c\))42 b(|)239 +b(|)174 b(\(e.g.)21 b(sloth.tex\))216 b(|)330 1735 y(+---------------)o(---+) +236 b(+------------------)o(-----)o(-----)o(----)o(--+)343 +1876 y Fh(Literate)14 b(programming)e(to)q(ols)j(could)g(b)q(e)g(organized)e +(in)j(a)g(n)o(um)o(b)q(er)e(of)h(w)o(a)o(ys.)28 b(Ho)o(w)o(ev)o(er,)17 +b(to)e(\014t)h(in)f(with)281 1926 y(curren)o(t)9 b(\014le)h(and)h(command)d +(line)i(based)g(en)o(vironmen)n(ts,)e(most)i(to)q(ols)g(conform)f(to)h(the)h +(traditional)d(arc)o(hitectur)o(e)281 1976 y(sho)o(wn)g(here)g(in)h(whic)o(h) +g(the)f(user)g(feeds)g(in)h(a)f(\014le)h(con)o(taining)d(a)j(literate)e +(program,)g(and)h(the)g(literate)f(programmin)o(g)281 2026 +y(utilit)o(y)j(generates)f(program)g(\014les)i(and)f(a)i(do)q(cumen)o(ta)o +(tion)c(\014le.)465 2117 y Fo(Figure)15 b(1)p Fr(:)i(T)m(raditional)12 +b(arc)o(hitecture)k(of)d(literate)h(programming)c(to)q(ols.)1042 +2940 y(16)p eop +%%Page: 17 18 +17 17 bop 295 42 a Fr(do)15 b(this)g(is)g(implemen)o(ted)e(in)i(literate)g +(programming)d(to)q(ols)i(b)o(y)h(pro)o(viding)f(text)i Fm(macr)n(os)f +Fr(that)295 91 y(can)f(b)q(e)h(de\014ned)g(and)f(used)g(in)g(an)o(y)f(order.) +295 170 y Fo(T)o(yp)q(eset)h(co)q(de)g(and)g(do)q(cumen)o(tation)o(:)i +Fr(T)m(raditionally)10 b(program)h(listings)h(are)h(dull)f(a\013airs)295 +220 y(consisting)i(of)g(pages)h(of)e(fan-form)f(pap)q(er)j(imprin)o(ted)d +(with)i(meandering)f(coastlines)i(of)f(struc-)295 270 y(tured)k(text)f(in)g +(a)f(b)q(oring)g(fon)o(t.)26 b(In)17 b(con)o(trast,)h(literate)f(programmi)o +(ng)d(systems)j(are)g(capable)295 320 y(of)d(pro)q(ducing)g(do)q(cumen)o +(tation)e(that)i(is)g(sup)q(erior)h(in)e(t)o(w)o(o)h(w)o(a)o(ys.)k(First,)13 +b(b)q(ecause)j(most)d(of)g(the)295 369 y(do)q(cumen)o(tation)i(text)h(is)g +(fed)g(straigh)o(t)f(to)h(the)g(t)o(yp)q(esetter,)j(the)d(programmer)e(can)i +(mak)o(e)e(use)295 419 y(of)k(all)f(the)i(p)q(o)o(w)o(er)f(of)g(the)g +(underlying)g(t)o(yp)q(esetter,)j(resulting)e(in)e(do)q(cumen)o(tation)g +(that)i(has)295 469 y(the)14 b(same)e(presen)o(tation)h(as)g(an)g(ordinary)f +(t)o(yp)q(eset)i(do)q(cumen)o(t.)j(Second,)d(b)q(ecause)g(the)f(literate)295 +519 y(programming)f(utilit)o(y)j(sees)i(all)e(the)h(co)q(de,)h(it)f(can)g +(use)g(its)g(kno)o(wledge)g(of)f(the)h(programming)295 569 +y(language)c(and)g(the)h(features)h(of)d(the)i(t)o(yp)q(esetting)h(language)d +(to)i(t)o(yp)q(eset)h(the)f(program)d(co)q(de)k(as)295 618 +y(if)f(it)h(w)o(ere)h(app)q(earing)e(in)h(a)f(tec)o(hnical)h(journal.)k(It)c +(is)f(the)i(di\013erence)h(b)q(et)o(w)o(een:)264 745 y Fl(while)21 +b(sloth<walrus)e(loop)330 795 y(sloth:=sloth+1;)264 845 y(end)j(loop)295 +971 y Fr(and)281 1098 y Fo(while)12 b Fm(sloth)p Fn(<)p Fm(walrus)h +Fo(lo)q(op)447 1147 y Fm(sloth)p Fq( )p Fm(sloth)p Fr(+1;)281 +1197 y Fo(end)g(lo)q(op)295 1324 y Fr(Unfortunately)m(,)18 +b(while)g(F)m(unnelW)m(eb)f(pro)o(vides)h(full)f(t)o(yp)q(esetting)i(of)e +(the)i(do)q(cumen)o(tation,)e(it)295 1374 y(t)o(yp)q(esets)j(all)d(of)h(its)g +(co)q(de)h(in)e(the)i(st)o(yle)f(of)g(the)h(\014rst)f(of)g(these)h(t)o(w)o(o) +f(examples.)30 b(T)m(o)17 b(t)o(yp)q(eset)295 1423 y(in)e(the)g(st)o(yle)g +(of)f(the)h(second)h(requires)g(kno)o(wledge)e(of)h(the)g(programmi)o(ng)d +(language,)i(and)g(the)295 1473 y(curren)o(t)f(v)o(ersion)d(of)h(F)m(unnelW)m +(eb)f(is)g(programming)d(language)j(indep)q(enden)o(t.)19 b(A)o(t)10 +b(a)h(later)g(stage,)295 1523 y(it)h(is)g(p)q(ossible)h(that)f(F)m(unnelW)m +(eb)g(will)f(b)q(e)i(mo)q(di\014ed)e(to)h(read)h(in)f(a)g(\014le)g(con)o +(taining)g(information)295 1573 y(ab)q(out)j(the)g(target)h(programmi)o(ng)c +(language)i(to)g(b)q(e)i(used)f(to)g(assist)g(in)g(t)o(yp)q(esetting)g(the)h +(co)q(de)295 1623 y(prop)q(erly)m(.)295 1702 y Fo(Cross)h(referencing:)h +Fr(Because)f(the)e(literate)h(to)q(ol)e(sees)i(all)e(the)i(co)q(de)g(and)e +(do)q(cumen)o(tation,)295 1751 y(it)19 b(is)g(able)h(to)f(generate)h +(extensiv)o(e)h(cross)f(referencing)h(information)c(in)i(the)h(t)o(yp)q(eset) +g(do)q(cu-)295 1801 y(men)o(tation.)28 b(This)18 b(mak)o(es)e(the)j(prin)o +(ted)f(program)e(do)q(cumen)o(t)h(more)g(easy)h(to)g(na)o(vigate)f(and)295 +1851 y(partially)g(comp)q(ensates)h(for)g(the)g(lac)o(k)g(of)f(an)h +(automatic)e(searc)o(hing)i(facilit)o(y)e(when)j(reading)295 +1901 y(prin)o(ted)c(do)q(cumen)o(tation.)177 1980 y(In)e(the)h(end,)f(the)g +(details)g(don't)g(matter.)k(The)c(most)f(signi\014can)o(t)g(b)q(ene\014t)i +(that)f(literate)h(programmi)o(ng)c(o\013ers)177 2029 y(is)17 +b Fm(its)h(c)n(ap)n(acity)g(to)g(tr)n(ansform)f(the)h(state)g(of)g(mind)g(of) +g(the)g(pr)n(o)n(gr)n(ammer)p Fr(.)27 b(It)18 b(is)f(no)o(w)g(legend)g(that)h +(the)f(act)177 2079 y(of)d(explaining)g(something)g(can)h(transform)f(one's)h +(understanding)g(of)f(it.)21 b(This)15 b(is)g(one)g(of)f(the)i +(justi\014cations)177 2129 y(b)q(ehind)j(the)h(p)q(o)o(w)o(erful)e(com)o +(bination)e(of)i(researc)o(h)j(and)d(teac)o(hing)h(in)f(univ)o(ersities)p +Fo([Roso)o(vsky90])p Fr(.)33 b(Simi-)177 2179 y(larly)m(,)12 +b(b)o(y)h(constan)o(tly)h(explaining)e(the)i(unfolding)e(program)g(co)q(de)j +(in)e(English)g(to)h(an)f(imaginary)e(reader,)j(the)177 2229 +y(programmer)e(transforms)h(his)h(p)q(erception)h(of)e(the)i(co)q(de,)f(la)o +(ying)e(it)i(op)q(en,)f(prone,)h(to)g(the)h(critical)e(ey)o(e.)177 +2307 y(The)f(result)h(of)e(this)h(exp)q(osure)h(is)e(a)h(higher)f(qualit)o(y) +g(of)g(programmi)o(ng.)j(When)e(exp)q(osed)h(to)e(the)i(harsh)f(ligh)o(t)e +(of)177 2357 y(the)i(literate)g(ey)o(e,)g(bugs)g(cra)o(wl)g(out,)f(sp)q +(ecial)h(cases)h(v)n(anish,)e(and)h(slopp)o(y)f(co)q(de)h(ev)n(ap)q(orates.) +18 b(As)12 b(a)g(rule)g(literate)177 2407 y(programs)18 b(tak)o(e)i(longer)f +(to)g(write)g(than)h(ordinary)f(programs,)g(but)g(the)h(total)f(dev)o +(elopmen)o(t)f(time)g(is)h(the)177 2457 y(same)13 b(or)h(less)g(b)q(ecause)h +(the)f(time)f(tak)o(en)g(to)h(write)g(and)f(do)q(cumen)o(t)h(the)g(program)e +(carefully)h(is)h(comp)q(ensated)177 2507 y(for)i(b)o(y)g(a)g(reduced)j +(debugging)c(and)i(main)o(tenance)e(time.)24 b(Th)o(us)17 b(literate)g +(programmi)o(ng)c(do)q(es)k(not)g(merely)177 2557 y(assist)c(in)f(the)g +(preparation)g(of)g(do)q(cumen)o(tation,)f(but)h(also)g(mak)o(es)f +(signi\014can)o(t)g(con)o(tributes)j(to)e(the)g(pro)q(cess)i(of)177 +2606 y(programming)d(itself.)18 b(In)c(practice)h(this)f(has)g(turned)h(out)f +(to)g(b)q(e)g(a)g(con)o(tribution)g(far)f(more)h(imp)q(ortan)o(t)e(than)177 +2656 y(the)j(mere)e(capacit)o(y)h(to)g(pro)q(duce)h(t)o(yp)q(eset)g(do)q +(cumen)o(tation.)177 2735 y(F)m(or)h(more)f(information)e(on)j(literate)h +(programmi)o(ng,)c(the)k(reader)h(is)e(directed)h(to)f(Kn)o(uth's)h(early)f +(founding)177 2785 y(w)o(ork)10 b Fo([Kn)o(uth83])f Fr(and)h +Fo([Kn)o(uth84])p Fr(.)16 b(F)m(or)10 b(more)f(recen)o(t)j(information)c +(refer)j(to)g Fo([Smith91])p Fr(,)d(whic)o(h)j(pro)o(vides)177 +2835 y(a)j(comprehensiv)o(e)g(bibliograph)o(y)e(up)i(to)f(1990.)1042 +2940 y(17)p eop +%%Page: 18 19 +18 18 bop 177 42 a Fi(1.2)70 b(What)23 b(is)f(F)-6 b(unnelW)g(eb?)177 +160 y Fr(F)m(unnelW)m(eb)10 b(is)h(a)g(particular)f(literate)h(programming)c +(system)k(that)g(is)f(implemen)o(ted)f(b)o(y)h(a)h(single)f(C)h(program.)177 +210 y(F)m(unnelW)m(eb)16 b(tak)o(es)h(as)f(input)h(a)f(single)g +Fl(.fw)g Fo(input)g(\014le)f Fr(and)h(writes)h(one)g(or)f(more)g +Fo(pro)q(duct)h(\014les)e Fr(and)h(a)177 260 y Fo(do)q(cumen)o(tation)c +(\014le)h Fr(\()p Fo(Figure)h(2)p Fr(\).)831 386 y Fl(+-----------+)831 +436 y(|)22 b(sloth.fw)41 b(|)831 485 y(+-----------+)962 535 +y(|)962 585 y(v)744 635 y(o---------------)o(----o)744 685 +y(|)21 b(FUNNELWEB)f(Program)h(|)744 734 y(o---------------)o(----o)962 +784 y(|)526 834 y(+----------------)o(---+-)o(----)o(-----)o(-----)o(-+)526 +884 y(|)784 b(|)526 934 y(v)g(v)221 983 y(+---------------)o(-----)o(-----)o +(----+)84 b(+--------------)o(-----)o(-----)o(-----)o(---+)221 +1033 y(|)21 b(Product)g(File)g(\(e.g.)f(sloth.c\))h(|)87 b(|)21 +b(Documentation)e(File)i(\(sloth.tex\))f(|)221 1083 y(+---------------)o +(-----)o(-----)o(----+)84 b(+--------------)o(-----)o(-----)o(-----)o(---+) +343 1174 y Fh(F)m(unnelW)m(eb)10 b(follo)o(ws)h(the)g(traditiona)o(l)e(arc)o +(hitecture)f(of)j(literate)f(programmin)o(g)f(to)q(ols.)709 +1266 y Fo(Figure)14 b(2)p Fr(:)k(Arc)o(hitecture)e(of)e(F)m(unnelW)m(eb.)177 +1378 y(In)c(literate)f(programming)d(systems,)k(it)g(is)f(usual)g(to)h(refer) +g(to)g(the)g(pro)q(duct)g(\014le)g(as)g(a)f(\\program)e(\014le".)17 +b(Ho)o(w)o(ev)o(er,)177 1427 y(as)i(F)m(unnelW)m(eb)f(is)g(a)g(general)h(to)q +(ol)f(that)g(can)h(b)q(e)g(used)h(to)e(prepare)i(all)d(sorts)i(of)f(text)h +(\014les)g(that)g(are)g(not)177 1477 y(computer)f(programs,)g(the)g(more)g +(generic)h(term)e(\\pro)q(duct)i(\014le")f(w)o(as)g(c)o(hosen.)32 +b(Pro)q(duct)20 b(\014les)e(should)g(b)q(e)177 1527 y(carefully)13 +b(distinguished)g(from)e(the)j(term)e Fo(output)g(\014les)g +Fr(whic)o(h)h(refers)h(to)f(all)f(of)g(the)i(output)f(\014les)h(pro)q(duced) +177 1577 y(b)o(y)g(F)m(unnelW)m(eb.)177 1654 y(F)m(unnelW)m(eb)g(is)f +(distinguished)h(b)o(y)g(the)g(follo)o(wing)e(c)o(haracteristics:)295 +1730 y Fo(Simplici)o(t)o(y:)18 b Fr(A)d(go)o(v)o(erning)g(design)g(goal)f(of) +h(F)m(unnelW)m(eb)f(is)h(to)g(pro)o(vide)g(a)g Fm(simple)g +Fr(to)q(ol)g(that)295 1780 y(could)i(b)q(e)g(easily)f(learn)o(t)h(and)f +(completely)g(mastered.)26 b(This)17 b(man)o(ual)d(is)j(thic)o(k)f(b)q +(ecause)j(it)d(is)295 1830 y(comprehensiv)o(e)h(and)e(lingers)h(on)g(the)h(w) +o(a)o(ys)f(in)f(whic)o(h)h(F)m(unnelW)m(eb)g(can)g(b)q(e)g(used.)26 +b(The)16 b(to)q(ol)295 1880 y(itself)e(is)g(quite)f(simple.)295 +1957 y Fo(Reliabili)o(t)n(y:)22 b Fr(Another)17 b(design)g(goal)f(is)h(to)f +(pro)o(vide)h(a)f(to)q(ol)g(that)h(will)e(protect)j(the)g(user)g(as)295 +2007 y(m)o(uc)o(h)g(as)h(p)q(ossible)g(from)e(silly)h(errors.)34 +b(Macro)19 b(prepro)q(cessors)j(are)e(notorious)e(for)h(causing)295 +2056 y(obscure)j(errors.)38 b(Ev)o(ery)21 b(attempt)e(has)h(b)q(een)i(made)d +(in)g(F)m(unnelW)m(eb)h(to)g(k)o(eep)h(the)g(syn)o(tax)295 +2106 y(robust.)31 b(F)m(or)18 b(example,)f(in)h(F)m(unnelW)m(eb)f(the)i(syn)o +(tax)f(of)f(macro)g(calls)h(has)g(b)q(een)h(purp)q(osely)295 +2156 y(designed)i(to)e(b)q(e)i(highly)e(visible)g(so)h(that)g(the)g(reader)h +(is)f(alw)o(a)o(ys)e(a)o(w)o(are)i(when)g(the)h(macro)295 2206 +y(facilit)o(y)12 b(is)i(b)q(eing)g(in)o(v)o(ok)o(ed.)295 2283 +y Fo(Language)i(and)h(T)o(yp)q(esetter)e(Indep)q(endence:)k +Fr(Unlik)o(e)14 b(Kn)o(uth's)i(original)d(W)m(eb)i(system)295 +2332 y(whic)o(h)h(w)o(as)g(sp)q(eci\014c)h(to)f(the)h(P)o(ascal)f(programmi)o +(ng)d(language)p Fo([BSI82])i Fr(and)h(the)g(T)1667 2341 y(E)1690 +2332 y(X)g(t)o(yp)q(e-)295 2382 y(setting)g(language)p Fo([Kn)o(uth84])p +Fr(,)d(F)m(unnelW)m(eb)h(striv)o(es)j(to)e(b)q(e)h(language)e(and)h(t)o(yp)q +(esetter)j(inde-)295 2432 y(p)q(enden)o(t.)h(The)14 b(curren)o(t)g(v)o +(ersion)f(of)g(F)m(unnelW)m(eb)f(is)h(completely)f(language)g(indep)q(enden)o +(t,)i(but)295 2482 y(is)g(still)f(somewhat)g(dep)q(enden)o(t)j(on)d(the)i(T) +965 2491 y(E)988 2482 y(X)f(t)o(yp)q(esetter)i(language.)295 +2559 y Fo(P)o(ortabili)o(t)n(y:)f Fr(F)m(unnelW)m(eb)10 b(has)g(b)q(een)i +(written)f(in)f(the)h(C)f(programming)d(language)i(with)h(great)295 +2608 y(emphasis)k(on)g(p)q(ortabilit)o(y)m(.)k(F)m(unnelW)m(eb)c(curren)o +(tly)h(runs)h(on)e(the)h(Sun,)f(V)-5 b(AX,)15 b(IBM)g(PC,)f(and)295 +2658 y(Mac.)295 2735 y Fo(Con)o(trollabl)o(e:)h Fr(F)m(unnelW)m(eb)10 +b(is)h(an)f(extremely)h(con)o(trollable)f(to)q(ol.)16 b(T)m(o)11 +b(protect)h(users')g(in)o(v)o(est-)295 2785 y(men)o(t)f(in)h(source)h +(\014les)g(constructed)h(in)e(the)g(F)m(unnelW)m(eb)g(macro)f(language,)g +(the)h(C)g(source)i(co)q(de)295 2835 y(to)h(F)m(unnelW)m(eb)f(has)h(b)q(een)h +(released)g(under)g(GNU)e(license.)22 b(This)14 b(means)g(that)h(it)f(will)g +(alw)o(a)o(ys)1042 2940 y(18)p eop +%%Page: 19 20 +19 19 bop 295 42 a Fr(b)q(e)17 b(a)o(v)n(ailable)c(to)j(ev)o(ery)o(one.)24 +b(F)m(urthermore,)16 b(license)h(has)e(b)q(een)i(gran)o(ted)f(for)g(the)g(F)m +(unnelW)m(eb)295 91 y(User's)h(Man)o(ual)e(and)h(F)m(unnelW)m(eb)f(Hac)o(k)o +(er's)i(Man)o(ual)e(to)g(b)q(e)i(copied)f(freely)g(so)g(long)f(as)h(they)295 +141 y(are)e(not)f(mo)q(di\014ed.)j(All)c(this)h(means)g(that)g(F)m(unnelW)m +(eb)f(is)h(not)g(going)f(to)h(disapp)q(ear)g(suddenly)m(.)295 +217 y Fo(A)18 b(Pro)q(duction)c(T)l(o)q(ol:)20 b Fr(Ab)q(o)o(v)o(e)c(all,)d +(F)m(unnelW)m(eb)i(has)g(b)q(een)h(designed)g(to)f(b)q(e)h(a)e(pro)q(duction) +295 267 y(to)q(ol)e(and)h(ev)o(ery)g(e\013ort)g(has)g(b)q(een)h(made)d(to)h +(ensure)j(that)d(it)g(will)f(op)q(erate)j(e\013ectiv)o(ely)f(in)g(a)f(pro-) +295 317 y(fessional)h(en)o(vironmen)o(t.)j(F)m(unnelW)m(eb)d(is)g(\\op)q(en") +g(and)g(p)q(ortable.)18 b(There)c(is)f(a)f(comprehensiv)o(e)295 +367 y(user)18 b(man)o(ual.)24 b(Its)17 b(error)g(messages)g(are)g +(comprehensiv)o(e.)26 b(It)17 b(is)f(fast.)26 b(Finally)m(,)15 +b(it)h(has)h(b)q(een)295 417 y(designed)e(with)e(the)i(exp)q(erience)h(of)d +(three)i(y)o(ears)g(of)e(using)h(F)m(unnelW)m(eb)f(V1.)177 +493 y(F)m(or)c(more)g(information)e(on)i(the)h(history)g(and)f(design)h(of)f +(F)m(unnelW)m(eb,)g(see)i(the)f Fm(F)m(unnelWeb)i(Hacker's)e(Manual)p +Fr(.)177 660 y Fi(1.3)70 b(The)22 b(Name)g(F)-6 b(unnelW)g(eb)177 +779 y Fr(The)16 b(name)e(\\F)m(unnelW)m(eb")g(w)o(as)h(c)o(hosen)i(b)q +(ecause)g(it)d(con)o(tains)i(the)g(name)e(\\WEB",)g(whic)o(h)h(is)g(the)h +(name)e(of)177 828 y(Kn)o(uth's)g(system.)k(It)c(w)o(as)g(also)f(c)o(hosen)i +(b)q(ecause)h(it)d(has)h(a)g(distinctly)f(Australian)h(\015a)o(v)o(our.)177 +905 y(F)m(unnel-w)o(eb)j(spiders)g(are)g(found)f(in)g(Northern)i(and)e +(Eastern)i(Australia.)26 b(They)16 b(are)h(ab)q(out)g(three)h(to)e(four)177 +955 y(cen)o(timetres)c(long)e(and)g(are)i(v)o(ery)f(p)q(oisonous.)17 +b(The)11 b(Sydney)g(F)m(unnel-w)o(eb)g(spider)h(\()p Fm(A)o(tr)n(ax)g(r)n +(obustus)p Fr(\),)f(common)177 1004 y(in)k(Sydney)m(,)g(has)h(caused)g(the)g +(most)e(trouble)i(and)f(has)h(b)q(een)g(resp)q(onsible)h(for)e(sev)o(eral)h +(deaths.)23 b(F)m(unnel-w)o(eb)177 1054 y(spiders)16 b(lo)o(v)o(e)f(to)g(cra) +o(wl)f(in)o(to)h(temp)q(orarily)e(discarded)j(sho)q(es)g(where)h(they)e +(later)g(react)h(in)f(a)g(hostile)g(manner)177 1104 y(to)h(an)g(unsusp)q +(ecting)h(fo)q(ot.)24 b(They)17 b(are)f(kno)o(wn)g(to)f(hang)h(on)g(once)g +(they)h(sink)f(their)g(fangs)g(in.)24 b(F)m(unnel-w)o(eb)177 +1154 y(spiders)17 b(deriv)o(e)f(their)h(name)e(from)f(the)i(shap)q(e)h(of)e +(their)h(w)o(ebs)h(whic)o(h)f(are)g(horizon)o(tally-aligned)e(narro)o(wing) +177 1204 y(tub)q(es,)h(op)q(en)f(at)g(one)g(end)p Fo([ANZE])p +Fr(.)177 1280 y(The)j(F)m(unnel-w)o(eb)f(spider,)g(lik)o(e)g(the)g(tiger)h +(snak)o(e)f(and)g(the)h(white)f(p)q(oin)o(ter)g(shark,)g(is)g(secretly)i +(regarded)f(b)o(y)177 1330 y(Australians)d(as)g(a)g(kind)f(of)g(national)g +(treasure.)281 1450 y Fo(F)h Fr(is)g(for)f(F)m(unnel-w)o(eb)281 +1500 y(Our)h(furry-legged)g(fo)q(e.)281 1550 y(He)g(sleeps)h(in)f(y)o(our)g +(slipp)q(er)281 1599 y(And)g(breakfasts)h(on)e(to)q(e.)281 +1649 y(|)g(One)i(v)o(erse)g(from)d Fm(A)j(Me)n(gastar's)f(Mantr)n(as:)19 +b(Things)c(that)g(Me)n(an)h(a)f(L)n(ot)g(to)f(Me)p Fr(,)378 +1699 y(b)o(y)f(Dame)g(Edna)h(Ev)o(erage)p Fo([Humphries91])p +Fr(.)177 1866 y Fi(1.4)70 b(A)23 b(F)-6 b(unnelW)g(eb)22 b(T)-6 +b(utorial)177 1985 y Fr(The)19 b(remainder)f(of)g(this)h(c)o(hapter)h +(consists)g(of)e(an)g(in)o(tro)q(ductory)h(tutorial)f(on)g(F)m(unnelW)m(eb.) +32 b(Ideally)18 b(y)o(ou)177 2034 y(should)13 b(ha)o(v)o(e)f(a)h(w)o(orking)e +(v)o(ersion)i(of)f(F)m(unnelW)m(eb)g(in)h(fron)o(t)f(of)g(y)o(ou)g(when)i +(reading)e(this)h(c)o(hapter)h(so)e(that)h(y)o(ou)177 2084 +y(can)h(try)g(out)f(the)h(examples)f(y)o(ourself.)k(There)e(is)e(no)g(need)i +(to)e(try)h(all)e(the)i(examples)f(so)g(long)g(as)g(y)o(ou)g(t)o(yp)q(e)h(in) +177 2134 y(enough)i(to)f(feel)g(comfortable)f(with)h(what)g(y)o(ou)g(are)h +(reading.)22 b(There)16 b(is)f(no)g(harm)f(in)h(reading)g(this)h(c)o(hapter) +177 2184 y(o\017ine)d(to)q(o,)h(so)f(long)g(as)h(y)o(ou)g(get)g(to)g(the)g +(computer)g(within)f(a)g(couple)h(of)g(da)o(ys)f(to)h(reinforce)h(what)f(y)o +(ou)f(ha)o(v)o(e)177 2234 y(read.)177 2310 y(F)m(or)g(b)q(est)i(e\013ect,)g +(y)o(ou)e(should)g(create)i(a)e(new,)g(temp)q(orary)m(,)f(empt)o(y)h +(directory)h(in)f(whic)o(h)g(to)h(exp)q(erimen)o(t)f(with)177 +2360 y(F)m(unnelW)m(eb.)21 b(That)15 b(w)o(a)o(y)m(,)f(it)h(will)e(b)q(e)j +(more)e(ob)o(vious)g(when)i(F)m(unnelW)m(eb)e(creates)j(an)e(output)g +(\014le.)22 b(Y)m(ou)15 b(can)177 2410 y(either)f(t)o(yp)q(e)f(in)f(the)h +(examples)e(in)h(this)h(c)o(hapter)g(directly)m(,)f(or)h(cop)o(y)f(and)h +(paste)g(them)f(from)e(the)k(L)1727 2405 y Fk(a)1746 2410 y +Fr(T)1769 2422 y(E)1792 2410 y(X)e(source)177 2459 y(\014le)f(for)g(this)h(c) +o(hapter)g(or)f(the)h(F)m(unnelW)m(eb)f(test)h(suite.)18 b(The)12 +b(source)g(\014le)f(for)g(this)h(c)o(hapter)g(should)f(b)q(e)h(a)o(v)n +(ailable)177 2509 y(in)i(a)g(\014le)g(suc)o(h)h(as)f Fl(/fwdir/userman/c)o +(h1.te)o(x)p Fr(.)i(The)e(test)i(suite)e(should)g(b)q(e)h(a)o(v)n(ailable)d +(in)h(a)h(directory)h(suc)o(h)177 2559 y(as)i Fl(/fwdir/tests/)p +Fr(.)23 b(The)16 b(test)i(\014les)f(called)f Fl(ex01.fw)f Fr(through)h +Fl(ex16.fw)f Fr(con)o(tain)h(the)h(examples)f(in)g(this)177 +2609 y(c)o(hapter.)j(The)14 b(test)g(\014les)g(called)f Fl(hi01.fw)f +Fr(through)h Fl(hi10.fw)f Fr(con)o(tain)h(the)h(examples)f(in)f(the)i(next)g +(c)o(hapter.)177 2685 y(If)h(y)o(ou)f(do)g(not)h(y)o(et)g(ha)o(v)o(e)g(an)f +(installed)h(cop)o(y)f(of)h(F)m(unnelW)m(eb,)f(refer)h(to)g(Chapter)h(4)e +(for)g(full)g(details)h(on)f(ho)o(w)177 2735 y(to)h(obtain)g(and)g(install)f +(a)h(cop)o(y)g(of)f(F)m(unnelW)m(eb.)22 b(If)15 b(y)o(ou)f(are)i(not)f(sure)h +(if)f(y)o(ou)f(ha)o(v)o(e)h(an)g(installed)g(cop)o(y)m(,)g(try)177 +2785 y(in)o(v)o(oking)e(F)m(unnelW)m(eb)i(b)o(y)f(giving)g(the)i(command)c +(\\)p Fl(fw)p Fr(".)20 b(If)15 b(this)g(yields)f(an)h(error)h(suc)o(h)g(as)f +(\\command)d(not)177 2835 y(found")h(then)i(y)o(ou)e(do)h(not)g(ha)o(v)o(e)g +(a)f(prop)q(erly)h(installed)g(v)o(ersion)g(of)f(F)m(unnelW)m(eb.)1042 +2940 y(19)p eop +%%Page: 20 21 +20 20 bop 177 42 a Fi(1.5)70 b(A)23 b(Hello)d(W)-6 b(orld)24 +b(Do)r(cumen)n(t)177 153 y Fr(Just)c(as)f(one)g(starts)i(the)e(pro)q(cess)i +(of)d(learning)h(a)g(new)g(programming)d(language)i(with)g(a)h(\\Hello)f(W)m +(orld")177 202 y(program,)c(when)i(learning)e(F)m(unnelW)m(eb,)h(y)o(ou)g +(can)h(start)g(with)f(a)g(\\Hello)f(W)m(orld")g(do)q(cumen)o(t!)22 +b(And)16 b(here)g(it)177 252 y(is!)k(Edit)14 b(a)g(text)h(\014le)g(called)f +Fl(hello.fw)e Fr(and)j(put)f(the)h(follo)o(wing)d(text)j(in)f(it.)19 +b(\(Note:)h(The)15 b(second)g(c)o(haracter)177 302 y(is)f(the)g(letter)h +(\\Oh",)e(not)h(the)h(digit)e(\\Zero"\).)177 402 y Fl(@O@<hello.txt@>@{H)o +(ello)18 b(World@+@})177 502 y Fr(T)m(o)13 b(\\run")h(this)g(\\program",)d +(in)o(v)o(ok)o(e)i(F)m(unnelW)m(eb)h(using)f(the)i(\\)p Fl(fw)p +Fr(")e(command)e(as)j(follo)o(ws.)177 602 y Fl(fw)22 b(hello)177 +701 y Fm(If)c(this)g(c)n(ommand)h(do)n(esn)l('t)f(work,)g(then)h(chanc)n(es)g +(ar)n(e)f(that)g(F)m(unnelWeb)i(has)e(not)h(b)n(e)n(en)f(instal)r(le)n(d)g +(on)h(your)177 751 y(machine.)h(R)n(efer)14 b(to)h(Chapter)g(4)g(for)f(ful)r +(l)g(details)h(on)g(how)g(to)g(obtain)g(and)h(instal)r(l)e(a)h(c)n(opy)g(of)g +(F)m(unnelWeb.)177 821 y Fr(There)j(should)e(b)q(e)h(no)f(errors.)28 +b(If)16 b(there)h(are,)h(ha)o(v)o(e)e(a)g(lo)q(ok)g(at)g(the)h(listing)e +(\014le)i Fl(hello.lis)p Fr(,)e(whic)o(h)h(should)177 871 y(con)o(tain)c(an)g +(explanation)f(of)h(the)g(error,)h(and)f(compare)g(the)h(area)f(in)g(the)h +(\014le)f(where)h(the)g(error)g(o)q(ccurred)h(with)177 921 +y(the)h(text)f(ab)q(o)o(v)o(e.)k(If)13 b(there)j(are)e(no)g(errors,)g(y)o(ou) +g(will)e(\014nd)i(that)g(the)h(follo)o(wing)c(t)o(w)o(o)i(\014les)h(ha)o(v)o +(e)g(b)q(een)h(created.)177 1021 y Fl(hello.lis)64 b(-)21 b(The)g(LISTING)g +(file.)177 1071 y(hello.txt)64 b(-)21 b(The)g(PRODUCT)g(file.)177 +1170 y Fr(T)m(ak)o(e)14 b(a)h(lo)q(ok)f(at)g Fl(hello.txt)p +Fr(.)19 b(It)c(should)f(con)o(tain)h(a)f(single)h(line)f(with)g(the)i(text)f +Fl(Hello)21 b(World)p Fr(.)f(Let's)15 b(tak)o(e)177 1220 y(another)f(lo)q(ok) +f(at)h(the)h(input)e(\014le.)177 1320 y Fl(@O@<hello.txt@>@{H)o(ello)18 +b(World@+@})177 1420 y Fr(The)f(whole)g(structure)i(of)d(the)h(input)g +(\014le)g(is)f(con)o(trolled)h(b)o(y)f(\\)p Fl(@)p Fr(",)h(called)f(the)h +Fo(sp)q(ecial)h(c)o(haracter)p Fr(,)e(whic)o(h)177 1470 y(in)o(tro)q(duces)f +Fo(sp)q(ecial)g(sequence)p Fr(s.)i(A)d(scanner's-ey)o(e)h(view)f(of)f(the)i +(command)c(line)i(lo)q(oks)h(lik)o(e)f(this:)177 1570 y Fl(@O)43 +b(@<)h("hello.txt")d(@>)i(@{)g("Hello)21 b(World")42 b(@+)h(@})177 +1669 y Fr(The)11 b Fl(@)f Fr(c)o(haracter)h(con)o(trols)f(ev)o(erything.)17 +b(In)10 b(this)h(\014le)f(w)o(e)g(ha)o(v)o(e)g(six)g(di\013eren)o(t)h(sp)q +(ecial)f(sequences)j(that)d(together)177 1719 y(form)i(a)i(single)f(macro)g +(de\014nition.)18 b(The)c Fl(@<)g Fr(and)f Fl(@>)h Fr(delimit)d(the)k(name)e +(of)g(the)h(macro.)j(The)e Fl(@O)e Fr(signals)g(the)177 1769 +y(start)g(of)f(the)h(macro)e(de\014nition)h(and)g(indicates)h(that)f(the)h +(macro)e(is)i(to)f(b)q(e)h(connected)h(to)e(a)g(pro)q(duct)i(\014le)e(with) +177 1819 y(the)j(same)e(name)g(as)h(the)g(macro)f(\(This)h(is)g(is)g(wh)o(y)f +(w)o(e)i(got)e(a)h(pro)q(duct)h(\014le)f(when)g(w)o(e)g(ran)g(F)m(unnelW)m +(eb\).)k(The)177 1869 y Fl(@)p Fq(f)e Fr(and)f Fl(@)p Fq(g)h +Fr(delimit)e(the)i(b)q(o)q(dy)g(of)g(the)g(macro.)23 b(Finally)m(,)14 +b(the)j Fl(@+)e Fr(instructs)j(that)e(an)f(end)i(of)e(line)h(sequence)177 +1918 y(should)e(b)q(e)g(inserted)i(at)d(that)h(p)q(oin)o(t)g(in)f(the)i(pro)q +(duct)f(\014le.)177 1988 y(If)c(y)o(ou)g(think)f(this)h(syn)o(tax)g(lo)q(oks) +g(messy)m(,)g(then)g(y)o(ou're)g(righ)o(t.)17 b(It)10 b Fm(is)g +Fr(messy)m(.)15 b(F)m(unnelW)m(eb)10 b Fm(c)n(ould)g Fr(ha)o(v)o(e)g(emplo)o +(y)o(ed)177 2038 y(a)k(\\simpler")e(notation)h(in)g(whic)o(h)h(more)f(of)g +(the)i Fl(@)e Fr(sequences)k(w)o(ere)e(eliminated.)h(F)m(or)d(example:)177 +2138 y Fl(Warning:)20 b(This)h(example)g(is)g(NOT)g(legal)g(FunnelWeb.)177 +2238 y(#hello.txt{Hello)e(World+})177 2338 y Fr(Ho)o(w)o(ev)o(er,)14 +b(if)f(suc)o(h)h(a)f(syn)o(tax)h(w)o(ere)h(used,)f(the)g(user)h(\(y)o(ou!\))j +(w)o(ould)12 b(ha)o(v)o(e)i(to)f(remem)o(b)q(er)g(that)h Fl(#)f +Fr(starts)i(a)e(new)177 2387 y(macro.)18 b(Y)m(ou)c(w)o(ould)g(also)f(ha)o(v) +o(e)i(to)f(remem)o(b)q(er)f(that)i(the)g(c)o(haracters)h Fq(g)e +Fr(and)g Fl(+)g Fr(cannot)h(b)q(e)g(used)g(in)f(a)g(macro)177 +2437 y(b)q(o)q(dy)j(without)f(a)h(fuss.)27 b(And)17 b(so)g(on.)27 +b(F)m(unnelW)m(eb)16 b(is)h(messier,)g(but)g(pro)o(vides)g(one)g(simple)e +(rule:)25 b Fm(Nothing)177 2487 y(sp)n(e)n(cial)15 b(happ)n(ens)h(unless)f +(the)g(sp)n(e)n(cial)f(char)n(acter)h Fl(@)f Fm(app)n(e)n(ars.)177 +2557 y Fr(This)f(means)g(that)g(in)g(F)m(unnelW)m(eb,)g(y)o(ou)g(can)g(lo)q +(ok)g(at)g(large)g(blo)q(c)o(ks)g(of)g(text)h(in)f(the)h(con\014dence)h(that) +e(\(unlik)o(e)177 2607 y(for)g(the)g(C)g(pre-pro)q(cessor\))j(there)e(are)f +(no)g(macro)f(calls)g(hidden)h(in)g(there.)19 b(If)12 b(there)j(w)o(ere,)e +(there)h(w)o(ould)e(b)q(e)i(an)177 2657 y Fl(@)g Fr(c)o(haracter!)391 +2642 y Fg(1)177 2727 y Fr(Let's)g(tak)o(e)g(another)h(lo)q(ok)e(at)g(the)i +(hello)e(w)o(orld)g(program.)p 177 2757 709 2 v 223 2783 a +Ff(1)241 2795 y Fh(The)e(only)g(exception)e(to)i(this)g(rule)f(o)q(ccurs)h +(where)g(the)f(user)h(has)g(explicitly)e(c)o(hanged)g(the)i(sp)q(ecial)f(c)o +(haracter)f(using)i(the)g Fe(@=)177 2835 y Fh(sp)q(ecial)f(sequence.)1042 +2940 y Fr(20)p eop +%%Page: 21 22 +21 21 bop 177 42 a Fl(@O@<hello.txt@>@{H)o(ello)18 b(World@+@})177 +177 y Fr(In)c(its)f(curren)o(t)j(form,)11 b(it)i(consists)i(of)e(a)g(single)g +(macro)g(de\014nition.)k(This)d(de\014nition,)f(while)g(completely)f(v)n +(alid)177 226 y(on)i(its)g(o)o(wn,)f(only)g(represen)o(ts)j(half)d(the)i(p)q +(o)o(w)o(er)f(of)f(F)m(unnelW)m(eb.)k(In)d(fact)g(y)o(ou)g(could)f(sa)o(y)h +(that)g(it)f(is)h(a)g(\\Hello)177 276 y(Northern)h(Hemisphere)f(Program".)i +(T)m(o)d(turn)h(it)f(in)o(to)g(a)g(prop)q(er)i(F)m(unnelW)m(eb)e(\\Hello)g(W) +m(orld")f(program,)g(w)o(e)177 326 y(need)j(to)f(add)f(some)g(do)q(cumen)o +(tation!)177 408 y(A)k(F)m(unnelW)m(eb)g(input)f(\014le)h(consists)h(of)f(a)f +(sequence)j(of)e(macro)e(de\014nitions)i(surrounded)h(b)o(y)f(a)g(sea)g(of)g +(do)q(c-)177 458 y(umen)o(tation)e(whic)o(h)h(is)h(just)g(ordinary)f(text.)26 +b(Mo)q(dify)16 b(y)o(our)g(hello)g(w)o(orld)g(do)q(cumen)o(t)g(so)h(that)f +(it)h(lo)q(oks)f(lik)o(e)177 508 y(this:)177 643 y Fl(This)21 +b(hello)g(world)g(document)f(was)h(created)f(by)i(-insert)e(your)h(name)g +(here-.)177 743 y(@O@<hello.txt@>@{H)o(ello)d(World@+@})177 +842 y(It)k(writes)e(out)h(a)h(file)f(called)f(hello.txt)g(containing)g(the)h +(string)g(``Hello)f(World''.)177 977 y Fr(No)o(w)14 b(run)g(it)f(through)h(F) +m(unnelW)m(eb,)f(but)h(this)g(time,)e(add)i(a)g Fl(+t)f Fr(to)h(the)g +(command)d(line.)177 1113 y Fl(fw)22 b(hello)e(+t)177 1248 +y Fr(If)14 b(all)e(go)q(es)j(w)o(ell,)d(y)o(ou)i(should)f(\014nd)h(that)g(y)o +(ou)g(no)o(w)f(ha)o(v)o(e)177 1383 y Fl(hello.lis)64 b(-)21 +b(A)h(LISTING)151 b(file.)177 1433 y(hello.tex)64 b(-)21 b(A)h(DOCUMENTATION) +d(file)i(\(in)g(TeX)g(format\).)177 1482 y(hello.txt)64 b(-)21 +b(A)h(PRODUCT)151 b(file.)177 1618 y Fr(T)m(ak)o(e)13 b(a)g(lo)q(ok)g(at)g +Fl(hello.txt)p Fr(.)j(Y)m(ou)d(will)f(\014nd)i(that)f(it)g(is)g(iden)o(tical) +g(to)h(the)g Fl(hello.txt)d Fr(of)i(the)h(previous)g(run.)177 +1667 y(Only)g(macro)f(de\014nitions)i(a\013ect)g(the)g(pro)q(duct)g(\014les)g +(that)f(F)m(unnelW)m(eb)g(pro)q(duces)i(\(as)e(a)g(result)h(of)f +Fl(@O)g Fr(macro)177 1717 y(de\014nitions\).)23 b(The)16 b(surrounding)f(do)q +(cumen)o(tation)f(has)i Fm(no)g Fr(e\013ect.)24 b(In)16 b(con)o(trast,)g(the) +g(new)f(\014le,)h Fl(hello.tex)177 1767 y Fr(\(ha)o(v)o(e)i(a)g(lo)q(ok)e(at) +i(it)g(no)o(w\))f(whic)o(h)h(w)o(as)g(created)h(as)f(a)g(result)g(of)g(y)o +(our)f(adding)g(the)i Fl(+t)e Fr(option)g(con)o(tains)h(a)177 +1817 y(fairly)d(full)g(represen)o(tation)j(of)d(the)i(input)f(\014le.)25 +b(Whereas)18 b Fl(hello.txt)c Fr(is)i(the)h Fm(pr)n(o)n(duct)g(\014le)f +Fr(of)g(F)m(unnelW)m(eb,)177 1867 y Fl(hello.tex)e Fr(is)h(the)i +Fm(do)n(cumentation)g(\014le)p Fr(.)24 b(T)m(ry)15 b(t)o(yp)q(esetting)h(the) +h(do)q(cumen)o(tation)d(\014le)i(no)o(w)f(using)g(the)i(T)1895 +1876 y(E)1918 1867 y(X)177 1916 y(t)o(yp)q(esetting)k(program.)36 +b(Then)20 b(prin)o(t)g(it.)37 b(The)21 b(follo)o(wing)c(commands)h(are)j(an)e +(example)g(of)h(the)h(sort)f(of)177 1966 y(commands)12 b(y)o(ou)h(will)f(ha)o +(v)o(e)i(to)g(giv)o(e)f(to)h(do)g(this.)177 2101 y Fl(tex)21 +b(hello)392 b(!)21 b(Typeset)g(the)g(documentation.)177 2151 +y(lpr)g(-Pcslw)g(-d)g(hello.dvi)86 b(!)21 b(Print)g(the)g(typeset)f +(documentation.)177 2286 y Fr(The)14 b(result)g(should)f(b)q(e)g(a)g(single)g +(page)g(con)o(taining)f(the)i(t)o(w)o(o)e(lines)h(of)g(do)q(cumen)o(tation)f +(along)g(with)g(a)h(t)o(yp)q(eset)177 2336 y(represen)o(tation)g(of)e(the)i +(macro.)j(A)o(t)11 b(this)h(p)q(oin)o(t,)f(y)o(ou)g(ha)o(v)o(e)h(exercised)h +(the)g(t)o(w)o(o)e(main)e(asp)q(ects)14 b(of)d(F)m(unnelW)m(eb.)177 +2386 y(Starting)h(with)g(an)g(input)g(\014le)g(con)o(taining)g(macros)f(\(or) +h(in)g(this)h(case)g(macro\))e(and)h(do)q(cumen)o(tation,)f(y)o(ou)h(ha)o(v)o +(e)177 2436 y(successfully)j(generated)g(a)f(pro)q(duct)g(\014le)g(based)g +(on)g(the)g(macros,)f(and)g(a)h(do)q(cumen)o(tation)e(\014le,)h(based)i(on)e +(the)177 2486 y(en)o(tire)i(do)q(cumen)o(t.)i(Congratulations!)177 +2568 y(The)11 b(remainder)e(of)g(this)h(tutorial)f(is)h(divided)f(in)o(to)h +(t)o(w)o(o)f(parts,)i(whic)o(h)f(fo)q(cus)g(on)g(F)m(unnelW)m(eb's)f(macro)g +(facilities)177 2618 y(and)15 b(its)h(t)o(yp)q(esetting)g(facilities.)22 +b(By)16 b(tradition,)e(the)i(generation)g(of)f(program)f(\014les)h(from)f(a)h +(literate)h(text)g(is)177 2667 y(called)e Fo(T)l(angling)p +Fr(,)d(and)j(the)g(generation)g(of)f(t)o(yp)q(eset)j(do)q(cumen)o(tation)c +(is)i(called)g Fo(W)l(ea)o(ving)p Fr(.)1681 2652 y Fg(2)p 177 +2717 709 2 v 223 2744 a Ff(2)241 2756 y Fh(In)8 b(F)m(unnelW)m(eb,)f(these)h +(t)o(w)o(o)h(functions)d(are)j(asp)q(ects)e(of)h(a)h(single)e(computer)g +(program.)12 b(Ho)o(w)o(ev)o(er,)c(in)h(Kn)o(uth's)e(WEB)j(system,)177 +2795 y(the)g(t)o(w)o(o)i(functions)c(are)j(em)o(b)q(o)q(died)d(in)i(t)o(w)o +(o)i(separate)d(computer)f(programs)g(called)i(T)m(angle)g(and)g(W)m(ea)o(v)o +(e,)g(presumably)e(b)q(ecause,)177 2835 y(as)j(ev)o(ery)o(one)f(kno)o(ws,)g +(\\it)h(tak)o(es)g(t)o(w)o(o)g(to)g(T)m(angle".)1042 2940 y +Fr(21)p eop +%%Page: 22 23 +22 22 bop 177 42 a Fi(1.6)70 b(Macro)24 b(F)-6 b(aciliti)o(es)177 +154 y Fr(The)13 b(hello)e(w)o(orld)h(program)f(of)g(the)i(previous)g(section) +g(exercised)h(b)q(oth)f(the)f(macro)g(expansion)g(\(pro)q(duct-\014le\))177 +204 y(asp)q(ect)i(of)e(F)m(unnelW)m(eb,)g(and)h(the)h(t)o(yp)q(esetting)f +(\(do)q(cumen)o(tation)f(\014le\))h(asp)q(ect)h(of)e(F)m(unnelW)m(eb.)17 +b(This)c(section)177 254 y(con)o(tains)h(an)g(exp)q(osition)g(of)f(the)i +(macro)e(facilities,)f(and)i(totally)f(ignores)h(the)h(do)q(cumen)o(tation)e +(side.)19 b(This)14 b(is)177 303 y(partly)e(to)g(increase)h(the)g(fo)q(cus)g +(of)e(the)i(tutorial,)e(and)h(partly)g(b)q(ecause)i(do)q(cumen)o(tation)d(is) +h(usually)f(bulky)h(and)177 353 y(w)o(ould)h(tak)o(e)h(to)q(o)g(long)f(for)g +(the)i(reader)g(to)f(t)o(yp)q(e)g(in)f(to)h(mak)o(e)f(the)h(tutorial)f +(e\013ectiv)o(e.)177 490 y Fd(1.6.1)55 b(Simple)17 b(Macros)177 +588 y Fr(The)d(original)f(\\Hello)g(W)m(orld")f(program)g(consisted)j(of)e(a) +h(single)g(macro)e(de\014nition.)177 692 y Fl(@O@<hello.txt@>@{H)o(ello)18 +b(World@+@})177 797 y Fr(In)e(fact,)g(this)g(is)g(a)g(rather)h(exceptional)f +(macro,)f(as)h(it)g(causes)h(its)f(expansion)g(to)g(b)q(e)h(written)f(to)g(a) +g(pro)q(duct)177 847 y(\014le.)28 b(The)17 b Fl(@O)g Fr(\(for)g +Fo(O)p Fr(utput\))h(signals)e(this.)28 b(In)17 b(F)m(unnelW)m(eb,)g(most)f +(macros)g(are)i(de\014ned)g(using)f Fl(@$)p Fr(.)27 b(This)177 +897 y(results)16 b(in)e(a)g(macro)f(that)i(do)q(es)g(not)f(generate)i(a)e +(pro)q(duct)h(\014le,)g(but)f(whic)o(h)h(can)f(b)q(e)h(called)g(in)f(other)h +(macros)177 947 y(\(including)e Fl(@O)h Fr(macros\).)j(Let)d(us)h(expand)f +(the)g(hello)f(w)o(orld)h(program)e(to)i(include)g(some)f(other)h(macros.)177 +1051 y Fl(@O@<hello.txt@>@{@)o(<Gree)o(tings)o(@>@+@)o(})177 +1151 y(@$@<H@>==@{Hello@})177 1201 y(@$@<W@>==@{World@})177 +1300 y(@$@<Greetings@>==@)o({@<H@)o(>)19 b(@<W@>@})177 1405 +y Fr(T)o(yp)q(e)14 b(in)g(the)g(\014le)g(and)g(run)g(it)g(through)g(F)m +(unnelW)m(eb)f(using)h(the)g(command:)177 1510 y Fl(fw)22 b(hello)177 +1614 y Fr(The)14 b(pro)q(duct)h(\014le)f(\(result.out\))h(should)e(lo)q(ok)g +(lik)o(e)g(this:)177 1719 y Fl(Hello)21 b(World)177 1823 y +Fr(This)16 b(short)h(program)e(illustrates)h(some)g(of)f(the)i(features)h(of) +d(ordinary)h(macros)g(in)g(F)m(unnelW)m(eb.)24 b(Consider)177 +1873 y(the)15 b Fl(@O)e Fr(macro.)k(Instead)d(of)g(con)o(taining)e(straigh)o +(t)i(text)h(\(\\Hello)e(W)m(orld"\),)f(it)h(no)o(w)h(con)o(tains)f(the)i +(macro)e(call)177 1923 y Fl(@<Greetings@>)p Fr(.)20 b(A)c(F)m(unnelW)m(eb)f +(macro)f(can)h(b)q(e)i(called)e(from)e(within)i(the)h(b)q(o)q(dy)g(of)e +(another)i(macro)f(just)177 1973 y(b)o(y)f(giving)e(the)j(macro)d(name)h +(delimited)f(in)i Fl(@<)f Fr(and)h Fl(@>)p Fr(.)177 2044 y(A)o(t)e(the)h(b)q +(ottom)d(of)i(the)g(\014le)g(is)g(the)h(de\014nition)e(of)h(the)g +Fl(@<Greetings@>)d Fr(macro.)17 b(The)12 b(de\014nition)g(is)f(similar)f(to) +177 2094 y(the)k(de\014nition)e(of)g Fl(hello.txt)f Fr(except)j(that)f(it)g +(starts)h(with)e Fl(@$)g Fr(to)h(indicate)g(that)g(no)f(pro)q(duct)i(\014le)f +(is)g(desired)177 2144 y(from)f(this)i(macro)f(\(directly\).)18 +b(It)c(also)f(emplo)o(ys)g(the)h(optional)e Fl(==)i Fr(syn)o(tax)g(whic)o(h)f +(has)h(no)g(seman)o(tic)f(impact,)177 2194 y(but)k(can)f(b)q(e)h(used)g(to)f +(mak)o(e)f(de\014nitions)h(clearer.)27 b(The)17 b(b)q(o)q(dy)f(of)g(the)g +Fl(@<Greetings@>)e Fr(macro)h(consists)i(of)177 2244 y(calls)d(to)f(the)i +Fl(H)e Fr(and)h Fl(W)g Fr(macros)f(whic)o(h)h(are)g(de\014ned)h(immedia)o +(tely)c(ab)q(o)o(v)o(e.)177 2315 y(Note)k(that)g(the)g(macros)f(are)h(not)g +(constrained)g(to)g(b)q(e)g(de\014ned)g(in)g(an)o(y)f(particular)g(order.)21 +b(One)16 b(of)e(the)h(main)177 2365 y(features)h(of)e(literate)h(programmi)o +(ng)d(to)q(ols)i(is)h(that)f(they)i(allo)o(w)d(the)i(di\013eren)o(t)g(parts)h +(of)e(the)h(text)g(do)q(cumen)o(t)177 2415 y(b)q(eing)f(dev)o(elop)q(ed)h +(\(usually)e(a)g(computer)h(program\))e(to)i(b)q(e)h(la)o(y)o(ed)e(out)h(in)f +(an)o(y)h(order.)k(So)c(long)f(as)h(there)h(is)f(a)177 2464 +y(de\014nition)g(somewhere)g(in)f(the)i(input)e(\014le)h(for)g(ev)o(ery)h +(macro)d(call,)h(F)m(unnelW)m(eb)g(will)g(sort)h(it)f(all)g(out.)177 +2536 y(In)h(fact,)g(F)m(unnelW)m(eb's)g(macro)f(facilit)o(y)f(is)i(v)o(ery)h +(simple.)i(Unlik)o(e)d(man)o(y)e(macro)h(prepro)q(cessors)k(whic)o(h)d(allo)o +(w)177 2586 y(macros)d(to)g(de\014ne)i(other)f(macros,)f(F)m(unnelW)m(eb)g +(completely)f(\014nishes)i(parsing)g(and)f(analysing)f(the)j(macros)d(in)177 +2635 y(the)k(input)e(\014le)h(b)q(efore)g(it)g(starts)h(expanding)e(them)g +(in)o(to)g(pro)q(duct)i(\014les.)k(Other)c(prepro)q(cessors)h(allo)o(w)d +(macros)177 2685 y(to)j(b)q(e)h(rede\014ned)g(lik)o(e)f(v)n(ariables)f(\(as)h +(in,)g(sa)o(y)m(,)f(T)950 2694 y(E)973 2685 y(X\))h(taking)f(on)h(man)o(y)e +(di\013eren)o(t)j(v)n(alues)f(as)g(the)g(macro)f(pre-)177 2735 +y(pro)q(cessor)f(tra)o(v)o(els)e(through)g(the)g(input)g(\014le.)17 +b(In)10 b(con)o(trast,)i(F)m(unnelW)m(eb)e(has)h(no)g(concept)h(of)e +(\\di\013eren)o(t)i(times")177 2785 y(and)h(treats)h(the)f(input)f(as)h(one)g +(h)o(uge)g(static)g(orderless,)h(timeless,)e(collection)g(of)g +(de\014nitions.)18 b(In)13 b(F)m(unnelW)m(eb,)177 2835 y(there)i(is)f(only)f +(ev)o(er)i(one)f(time,)e(and)i(so)g(there)h(can)f(only)f(ev)o(er)i(b)q(e)f +(one)h(v)n(alue/de\014nition)d(for)i(eac)o(h)g(macro.)1042 +2940 y(22)p eop +%%Page: 23 24 +23 23 bop 177 42 a Fd(1.6.2)55 b(Num)n(b)r(er)17 b(of)i(Times)e(Called)177 +140 y Fr(So)e(far)g(w)o(e)g(ha)o(v)o(e)g(seen)i(only)d(tin)o(y)m(,)g +(degenerate)j(input)e(\014les.)22 b(The)16 b(next)g(example)e(mo)o(v)o(es)f +(up)j(to)f(the)h(lev)o(el)e(of)177 190 y(\\trivial",)c(but)h(starts)i(to)e +(con)o(v)o(ey)g(the)h(\015a)o(v)o(our)f(of)g(the)h(w)o(a)o(y)f(F)m(unnelW)m +(eb)f(can)i(b)q(e)g(used)g(in)f(practice.)18 b(Normally)m(,)177 +240 y(there)f(w)o(ould)d(b)q(e)i(do)q(cumen)o(tation)e(text)i(app)q(earing)f +(b)q(et)o(w)o(een)i(the)f(macros,)e(but)i(this)f(has)g(b)q(een)i(omitted)d +(so)177 289 y(as)i(to)f(k)o(eep)i(the)f(fo)q(cus)g(on)g(the)g(macros)f +(themselv)o(es.)23 b(Although)15 b(the)i(next)f(example)e(is)i(m)o(uc)o(h)e +(longer)i(than)177 339 y(the)h(previous)g(example,)f(the)h(only)f(new)h +(construct)h(is)e Fl(@-)h Fr(whic)o(h)f(can)h(app)q(ear)g(only)f(at)g(the)h +(end)g(of)f(a)h(line,)177 389 y(and)d(suppresses)j(it,)c(prev)o(en)o(ting)h +(it)g(from)e(app)q(earing)i(in)g(the)g(text.)19 b(The)c Fl(@-)e +Fr(construct)j(allo)o(ws)c(the)j(text)g(of)e(a)177 439 y(macro)g(to)g(b)q(e)h +(aligned)f(at)h(the)g(left)g(margin,)d(rather)j(than)g(ha)o(ving)e(the)j +(\014rst)f(line)f(hanging)g(at)h(the)g(end)g(of)f(the)177 489 +y Fl(@)p Fq(f)p Fr(.)20 b(F)m(unnelW)m(eb)14 b(could)h(ha)o(v)o(e)f(b)q(een)i +(set)g(up)f(so)f(that)h(this)g(end)g(of)f(line)g(mark)o(er)g(w)o(as)h +(suppressed.)23 b(Ho)o(w)o(ev)o(er,)177 538 y(it)14 b(w)o(ould)g(ha)o(v)o(e)g +(b)q(een)i(a)e(sp)q(ecial)h(case)g(that)f(w)o(ould)g(ha)o(v)o(e)g(brok)o(en)h +(the)g(v)o(ery)g(memorable)d(rule)i(\\the)h(text)g(of)f(a)177 +588 y(macro)f(is)h(the)g(text)h(app)q(earing)e(b)q(et)o(w)o(een)i(the)g +Fl(@)p Fq(f)e Fr(and)h Fl(@)p Fq(g)p Fr(".)177 660 y(T)o(yp)q(e)i(the)g +(follo)o(wing)e(text)i(in)o(to)f(the)h(\014le)g Fl(hello.fw)e +Fr(and)h(run)h(it)f(through)h(F)m(unnelW)m(eb.)23 b(The)16 +b(\014le)g(con)o(tains)177 710 y(some)9 b(in)o(ten)o(tional)g(errors)j(so)e +(b)q(e)h(sure)g(to)f(t)o(yp)q(e)g(it)g(in)g(exactly)g(and)g(w)o(orry)g(only)g +(if)f(F)m(unnelW)m(eb)g Fm(do)n(esn)l('t)h Fr(generate)177 +759 y(some)j(errors.)177 865 y Fl(@O@<hello.c@>==@{@)o(-)177 +914 y(@<Include)20 b(Files@>)177 964 y(@<Include)g(Files@>)177 +1014 y(@<Main)h(Program@>)177 1064 y(@})177 1163 y(@$@<Main)f +(Program@>==@{@-)177 1213 y(main\(\))177 1263 y({)199 1313 +y(doit\(\);)177 1363 y(})177 1413 y(@})177 1512 y(@$@<Subroutine@>==)o(@{@-) +177 1562 y(void)h(doit\(\))177 1612 y({)199 1662 y(int)g(i;)199 +1711 y(for)g(\(i=0;i<10;i++\))243 1761 y({)264 1811 y(@<Print@>)264 +1861 y(@<Print@>)243 1911 y(})177 1960 y(}@})177 2060 y(@$@<Print@>==@{@-)177 +2110 y(printf\("Hello)e(World!"\);)177 2160 y(printf\("\\n"\);@})177 +2259 y(@$@<Scan@>==@{scan)o(f@})177 2359 y(@$@<Include)h(Files@>==@{@-)177 +2409 y(#include)g(<stdio.h>)177 2459 y(#include)g(<stdlib.h>@})177 +2564 y Fr(What)14 b(happ)q(ened?)21 b(W)m(ell,)13 b(if)g(y)o(ou)h(ha)o(v)o +(en't)g(t)o(yp)q(ed)i(the)f(\014le)f(in)g(prop)q(erly)m(,)g(y)o(ou)g(ma)o(y)f +(get)h(some)g(miscellaneous)177 2614 y(syn)o(tax)e(errors.)18 +b(Fix)12 b(these)h(b)q(efore)f(con)o(tin)o(uing.)k(If)c(the)g(\014le)g(has)g +(b)q(een)g(correctly)h(t)o(yp)q(ed,)f(y)o(ou)g(should)f(b)q(e)h(faced)177 +2663 y(with)i(some)f(error)i(messages)f(to)f(do)h(with)f(the)i(n)o(um)o(b)q +(er)e(of)g(times)g(some)g(of)h(the)g(macros)f(are)h(called.)177 +2735 y(By)h(default,)f(F)m(unnelW)m(eb)g(insists)h(that)g(eac)o(h)g(macro)e +(de\014ned)j(is)e(in)o(v)o(ok)o(ed)g(exactly)h(once.)21 b(Ho)o(w)o(ev)o(er,) +15 b(the)g(\014le)177 2785 y(ab)q(o)o(v)o(e)h(de\014nes)i(macros)d(that)h +(are)h(used)g(more)e(than)h(once)h(and)f(a)g(macro)f(that)i(is)f(not)g(used)h +(at)f(all.)24 b(Let)16 b(us)177 2835 y(examine)d(the)h(errors.)1042 +2940 y(23)p eop +%%Page: 24 25 +24 24 bop 177 42 a Fr(First,)15 b(w)o(e)g(see)h(that)e(F)m(unnelW)m(eb)g(has) +h(alerted)g(us)g(to)g(the)g(fact)g(that)f(the)i Fl(Include)k(Files)13 +b Fr(macro)h(has)h(b)q(een)177 91 y(called)d(t)o(wice.)18 b(Once)c(alerted)f +(to)g(this,)f(a)g(quic)o(k)h(lo)q(ok)e(at)i(the)g(program)e(con)o(vinces)i +(us)g(that)g(calling)e(the)i(macro)177 141 y(t)o(wice)h(is)g(a)g(mistak)o(e,) +e(and)h(that)h(one)g(of)g(the)g(calls)g(should)f(b)q(e)i(eliminated.)177 +217 y(Second,)d(w)o(e)e(note)h(that)f(F)m(unnelW)m(eb)g(has)h(alerted)g(us)g +(to)f(the)h(fact)f(that)h(the)g Fl(@<subroutine@>)c Fr(macro)j(is)g(nev)o(er) +177 267 y(called.)18 b(Again,)12 b(a)h(quic)o(k)g(lo)q(ok)g(at)g(the)h +(program)e(tells)h(us)h(that)f(this)h(is)f(a)g(mistak)o(e)f(\(and)h(a)g(v)o +(ery)h(common)d(one)177 317 y(in)k(the)h(use)h(of)e(F)m(unnelW)m(eb\),)g(and) +g(that)h(a)f(call)g(to)g(the)h Fl(@<subroutine@>)d Fr(macro)h(should)i(b)q(e) +g(inserted)h(just)177 367 y(ab)q(o)o(v)o(e)d(the)g(call)f(to)h(the)h +Fl(@<Main)20 b(Program@>)12 b Fr(macro)h(in)g(the)i(de\014nition)e(of)g +Fl(@<hello.c@>)p Fr(.)177 443 y(These)g(t)o(w)o(o)f(cases)h(demonstrate)f(wh) +o(y)g(these)h(c)o(hec)o(ks)h(ha)o(v)o(e)d(b)q(een)i(placed)g(in)e(F)m(unnelW) +m(eb.)17 b(It)12 b(is)g(nearly)g(alw)o(a)o(ys)177 492 y(acceptable)k(for)f(a) +f(macro)g(to)h(b)q(e)g(called)g(once.)22 b(Ho)o(w)o(ev)o(er,)15 +b(if)f(a)h(macro)f(is)g(not)h(called)g(at)g(all,)e(or)i(called)g(more)177 +542 y(than)f(once,)g(this)g(is)g(often)g(a)f(sign)h(that)g(the)g(user)h(has)f +(made)f(a)h(mistak)o(e.)177 618 y(These)19 b(c)o(hec)o(ks)g(ha)o(v)o(e)e(a)g +(dark)g(side)h(to)q(o.)28 b(In)18 b(addition)e(to)h(the)h(errors)h(men)o +(tioned)d(ab)q(o)o(v)o(e,)i(F)m(unnelW)m(eb)f(has)177 668 y(generated)e(t)o +(w)o(o)f(similar)d(errors)k(that)f(do)g(not)g(help)g(us.)177 +744 y(First,)h(w)o(e)f(are)h(alerted)g(to)f(the)h(fact)f(that)h(the)g +Fl(@<print@>)d Fr(macro)h(has)i(b)q(een)g(called)f(t)o(wice.)20 +b(Clearly)m(,)13 b(in)h(this)177 794 y(case,)h(this)f(is)f(not)h(a)g +(problem,)e(and)h(so)h(here)h(F)m(unnelW)m(eb's)f(fussiness)h(is)f(a)f(n)o +(uisance.)177 870 y(Second,)22 b(w)o(e)e(are)g(alerted)g(to)g(the)g(fact)g +(that)g(the)g Fl(@<scan@>)e Fr(macro)h(has)h(nev)o(er)g(b)q(een)h(called.)36 +b(Lik)o(e)19 b(the)177 920 y Fl(@<print@>)e Fr(macro,)h(this)g(macro)f(w)o +(as)i(de\014ned)g(as)g(a)f(notational)f(con)o(v)o(enience,)j(and)e(clearly)h +(it)f(do)q(es)h(not)177 969 y(matter)13 b(here)i(if)e(it)h(is)g(not)g(used.)k +(Again,)13 b(F)m(unnelW)m(eb)g(is)h(b)q(eing)g(a)g(n)o(uisance.)177 +1045 y(The)19 b(four)f(cases)i(ab)q(o)o(v)o(e)e(demonstrate)h(the)g(ligh)o(t) +e(and)h(dark)h(side)f(of)g(F)m(unnelW)m(eb's)g(insistence)i(that)e(eac)o(h) +177 1095 y(macro)10 b(b)q(e)i(called)f(exactly)h(once.)17 b(T)m(o)11 +b(resolv)o(e)h(the)g(con\015ict)f(without)g(reducing)h(the)g(strength)g(of)f +(the)h(c)o(hec)o(king,)177 1145 y(F)m(unnelW)m(eb)i(pro)o(vides)g(t)o(w)o(o)f +(sp)q(ecial)h(sequences)j Fl(@Z)c Fr(\(for)h Fo(Z)p Fr(ero\))h(and)e +Fl(@M)h Fr(\(for)g Fo(M)p Fr(an)o(y\))f(that)h(can)h(b)q(e)f(attac)o(hed)177 +1195 y(to)h(macro)e(de\014nitions.)20 b(Presence)e(of)c(the)h +Fl(@Z)f Fr(tag)g(allo)o(ws)g(the)h(designated)g(macro)f(to)g(b)q(e)h(called)g +(zero)g(times.)177 1245 y(Presence)j(of)c(the)i Fl(@M)e Fr(tag)h(allo)o(ws)e +(the)j(designated)f(macro)f(to)h(b)q(e)g(called)g(more)f(than)h(once.)21 +b(A)15 b(single)g(macro)177 1294 y(ma)o(y)d(carry)j(b)q(oth)f(tags.)k(It)c +(is)f(alw)o(a)o(ys)g(true)i(that)f(all)e(macros)i(are)g(allo)o(w)o(ed)e(to)i +(b)q(e)h(called)e(exactly)h(once.)177 1370 y(Here)20 b(is)e(the)h(revised)g +(program)e(with)h(the)h(errors)g(\014xed,)h(b)o(y)e(eliminating)d(or)k +(adding)e(macro)g(calls,)i(or)f(b)o(y)177 1420 y(adding)13 +b(tags.)18 b(T)m(ry)c(pro)q(cessing)h(the)f(\014le)g(no)o(w.)k(There)d +(should)f(b)q(e)g(no)g(errors.)177 1540 y Fl(@O@<hello.c@>==@{@)o(-)177 +1589 y(@<Include)20 b(Files@>)177 1639 y(@<Function@>)177 1689 +y(@<Main)h(Program@>)177 1739 y(@})177 1838 y(@$@<Main)f(Program@>==@{@-)177 +1888 y(main\(\))177 1938 y({)199 1988 y(doit\(\);)177 2038 +y(})177 2087 y(@})177 2187 y(@$@<Function@>==@{)o(@-)177 2237 +y(void)h(doit\(\))177 2287 y({)199 2337 y(int)g(i;)199 2386 +y(for)g(\(i=0;i<10;i++\))243 2436 y({)264 2486 y(@<Print@>)264 +2536 y(@<Print@>)243 2586 y(})177 2635 y(}@})177 2735 y(@$@<Print@>@M==@{@)o +(-)177 2785 y(printf\("Hello)e(World!"\);)177 2835 y(printf\("\\n"\);@})1042 +2940 y Fr(24)p eop +%%Page: 25 26 +25 25 bop 177 91 a Fl(@$@<Scan@>@Z==@{sc)o(anf@})177 191 y(@$@<Include)20 +b(Files@>==@{@-)177 241 y(#include)g(<stdio.h>)177 291 y(#include)g +(<stdlib.h>@})177 450 y Fd(1.6.3)55 b(Inden)n(tation)177 560 +y Fr(The)14 b(b)q(o)q(dy)g(of)f(the)i Fl(print)d Fr(macro)h(of)g(the)h +(previous)g(example)f(con)o(tains)g(t)o(w)o(o)g(lines)h(of)f(text.)19 +b(A)14 b(literal)e(substi-)177 610 y(tution)i(of)f(this)h(macro's)e(b)q(o)q +(dy)i(in)g(its)g(con)o(text)g(w)o(ould)f(result)i(in:)243 741 +y Fl({)264 791 y(printf\("Hello)k(World!"\);)177 841 y(printf\("\\n"\);)264 +891 y(printf\("Hello)g(World!"\);)177 941 y(printf\("\\n"\);)243 +990 y(})177 1121 y Fr(But)c(instead,)e(it)h(comes)f(out)h(as)g(\(ha)o(v)o(e)g +(a)g(lo)q(ok)e(at)i(this)g(part)g(of)f Fl(hello.c)g Fr(no)o(w\):)243 +1252 y Fl({)264 1302 y(printf\("Hello)19 b(World!"\);)264 1352 +y(printf\("\\n"\);)264 1402 y(printf\("Hello)g(World!"\);)264 +1452 y(printf\("\\n"\);)243 1502 y(})177 1633 y Fr(The)12 b(explanation)e(is) +g(that)h(F)m(unnelW)m(eb)g(inden)o(ts)g(eac)o(h)h(line)e(of)h(m)o(ultili)o +(ne)e(macros)h(b)o(y)h(the)g(lev)o(el)g(of)f(inden)o(tation)177 +1682 y(at)i(the)h(p)q(oin)o(t)e(of)g(call.)17 b(This)12 b(means)f(that,)h(as) +g(in)f(the)i(case)g(ab)q(o)o(v)o(e,)e(program)g(texts,)i(whic)o(h)e(are)i +(usually)e(highly)177 1732 y(inden)o(ted,)j(come)f(out)h(lo)q(oking)e(\\righ) +o(t".)177 1813 y(In)i(other)h(circumstances,)g(where)g(the)g(mo)q(del)e(of)g +(the)i(text)g(is)f(one)g(dimensional,)e(F)m(unnelW)m(eb's)h(inden)o(tation) +177 1863 y(could)g(b)q(ecome)h(an)f(imp)q(edimen)o(t)e(or)i(ev)o(en)i(a)e +(danger.)18 b(In)13 b(these)i(cases,)g(it)e(can)h(b)q(e)g(switc)o(hed)g +(o\013)g(b)o(y)f(including)177 1912 y(the)i(F)m(unnelW)m(eb)e +Fo(pragma)g Fr(line)177 2044 y Fl(@p)22 b(indentation)d(=)j(none)177 +2175 y Fr(an)o(ywhere)15 b(in)e(the)i(input)e(\014le.)177 2255 +y(One)19 b(of)f(the)h(design)f(goals)g(of)f(F)m(unnelW)m(eb)h(is)g(to)g(allo) +o(w)f(the)i(user)g(total)f(con)o(trol)g(o)o(v)o(er)g(the)h(pro)q(duct)g +(\014les.)177 2305 y(This)13 b(con)o(trasts)h(with)f(the)h(approac)o(h)f(of)g +(Kn)o(uth's)g(WEB)g(system)g Fo([Kn)o(uth83])f Fr(\(up)q(on)h(whic)o(h)g(F)m +(unnelW)m(eb)g(is)177 2355 y(based\),)18 b(whic)o(h)e(mangles)f(the)i(input)f +(text)h(at)f(the)h(P)o(ascal)g(program)d(syn)o(tax)j(lev)o(el,)f(truncating)h +(iden)o(ti\014ers,)177 2405 y(con)o(v)o(erting)e(the)g(text)g(to)f(upp)q(er)i +(case,)f(and)f(paragraphing)g(text.)20 b(Here)c(is)e(an)g(example)f(of)h +(part)h(of)f(a)g(P)o(ascal)177 2455 y(program)e(pro)q(duced)k(b)o(y)d(WEB)h +(\(from)f(page)h(14)f(of)g Fo([Kn)o(uth83])p Fr(\):)177 2586 +y Fl(IF)22 b(R=0)f(THEN)g(XREF[P]:=XREFPTR)d(ELSE)j(XMEM[R].XLINKFIELD)o +(:=XRE)o(FPTR;)o(END;{)o(:51})177 2635 y({58:}FUNCTION)e +(IDLOOKUP\(T:EIGHTBIT)o(S\):NA)o(MEPO)o(INTER)o(;LABE)o(L)g(31;)177 +2685 y(VAR)i(I:0..LONGBUFSIZE;H:)o(0..HA)o(SHSIZ)o(E;K:0)o(..MA)o(XBYTE)o +(S;W:0)o(..1;)177 2735 y(L:0..LONGBUFSIZE;P)o(:NAME)o(POINT)o(ER;BE)o(GIN)e +(L:=IDLOC-IDFIRS)o(T;{59)o(:})177 2785 y(H:=BUFFER[IDFIRST])o(;I=ID)o(FIRST)o +(+1;)177 2835 y(WHILE)i(I<IDLOC)f(DO)i(BEGIN)e(H:=\(H+H+BUFFER[I]\)M)o(OD)f +(HASHSIZE;I=I+1;EN)o(D{:59)o(};)1042 2940 y Fr(25)p eop +%%Page: 26 27 +26 26 bop 177 42 a Fr(Kn)o(uth's)13 b(theory)g(is)f(that)g(the)h(program)e +(generated)i(b)o(y)f(a)g(literate)h(programmi)o(ng)c(system)k(should)f(b)q(e) +h(treated)177 91 y(as)20 b(ob)r(ject)h(co)q(de)g(and)f(hence)h(should)f(lo)q +(ok)f(lik)o(e)g(ob)r(ject)i(co)q(de)f(to)q(o.)36 b(While)20 +b(this)g(ma)o(y)e(b)q(e)i(an)g(admirable)177 141 y(approac)o(h)d(in)g(the)h +(long)f(run,)h(the)f(presen)o(t)i(programming)14 b(en)o(vironmen)o(t)i(is)h +(one)h(of)f(fault)o(y)f(compilers)g(and)177 191 y(buggy)c(to)q(ols.)18 +b(The)13 b(F)m(unnelW)m(eb)f(view)h(is)g(that,)f(in)g(this)h(en)o(vironmen)o +(t,)f(the)h(programmer)e(needs)j(all)d(the)j(help)177 241 y(he)j(can)g(get)g +(and)f(that)h(therefore)h(he)f(should)f(b)q(e)h(allo)o(w)o(ed)f(total)f(con)o +(trol)i(o)o(v)o(er)f(the)h(pro)q(duct)h(\014le.)26 b(Another)177 +291 y(reason)12 b(for)g(F)m(unnelW)m(eb's)f(pro)o(viding)f(total)h(con)o +(trol)g(o)o(v)o(er)h(the)g(pro)q(duct)h(\014le,)e(is)h(that)g(F)m(unnelW)m +(eb)f(is)g(in)o(tended)177 340 y(to)17 b(b)q(e)i(target)e(language)g(indep)q +(enden)o(t,)i(and)e(so)h(ev)o(en)g(if)f(Kn)o(uth's)g(view)h(w)o(ere)g +(adopted,)g(it)f(w)o(ould)g(not)g(b)q(e)177 390 y(clear)d(what)g(a)g +(legitimate)e(transformation)g(of)h(the)h(text)h(could)e(b)q(e.)177 +529 y Fd(1.6.4)55 b(Additiv)n(e)18 b(Macros)177 629 y Fr(Sometimes)c(it)i(is) +h(con)o(v)o(enien)o(t)f(to)h(build)e(up)i(the)g(de\014nition)f(of)f(a)h +(macro)g(in)f(stages)j(throughout)e(the)h(input)177 679 y(\014le.)h(In)13 +b(F)m(unnelW)m(eb,)g(this)g(can)g(b)q(e)h(done)g(using)f(an)g +Fo(additiv)o(e)f(macro)p Fr(.)17 b(An)d(additiv)o(e)e(macro)g(is)h(iden)o +(tical)g(to)177 728 y(an)h(ordinary)f(macro)g(except)i(that)228 +839 y(1.)20 b(It)14 b(has)g Fl(+=)f Fr(instead)i(of)e Fl(==)p +Fr(.)228 920 y(2.)20 b(It)13 b(can)g(b)q(e)g(de\014ned)h(in)e(one)h(or)f +(more)g(parts)h(throughout)g(the)g(input)g(\014le.)k(The)c(de\014nition)g(of) +f(the)h(macro)281 970 y(is)h(the)g(concatenation)g(of)g(all)e(the)j(parts)f +(in)g(the)g(order)h(in)e(whic)o(h)h(they)g(app)q(ear.)177 1080 +y(The)f(follo)o(wing)c(example)h(sho)o(ws)j(ho)o(w)e(additiv)o(e)g(macros)g +(can)h(b)q(e)h(used)g(to)f(scatter)h(and)f(regroup)g(information,)177 +1130 y(in)k(this)h(case)g(assisting)g(in)f(the)h(lucid)f(construction)h(of)f +(a)g(data)g(abstraction)h(in)f(a)g(language)g(\(P)o(ascal\))h(that)177 +1180 y(do)q(es)e(not)f(supp)q(ort)g(them)f(explicitly)m(.)177 +1290 y Fl(@!****************)o(*****)o(*****)o(****)177 1390 +y(@O@<prog.pas@>==@{)o(@-)177 1440 y(program)21 b(adt\(input,outpu)o(t\);)177 +1490 y(@<Types@>)177 1540 y(@<Variables@>)177 1589 y(@<Procedures@>)177 +1639 y(begin)g(startproc;)f(end.)177 1689 y(@})177 1789 y(@!****************) +o(*****)o(*****)o(****)177 1888 y(@$@<Types@>+=@{@-)177 1938 +y(type)h(buffer_type)f(=)243 1988 y(record)243 2038 y(length)g(:)i(integer;) +243 2087 y(buf)f(:)g(array[1..100])e(of)j(char;)243 2137 y(end;)177 +2187 y(@})177 2287 y(@$@<Variables@>+=@)o({@-)177 2337 y(bigbuf)f(:)g +(buffer_type;)177 2386 y(@})177 2486 y(@$@<Procedures@>+=)o(@{@-)177 +2536 y(procedure)f(buf_init)g(\(var)h(b)h(:)f(buffer_type)325 +b(\))22 b({Body)e(of)i(buf_init})177 2586 y(procedure)e(buf_add)42 +b(\(var)21 b(b)h(:)f(buffer_type;)107 b(ch)21 b(:)h(char\))f({Body)f(of)i +(buf_add})177 2635 y(procedure)e(buf_get)42 b(\(var)21 b(b)h(:)f +(buffer_type;)f(var)h(ch)g(:)h(char\))f({Body)f(of)i(buf_get})177 +2685 y(@})177 2785 y(@!****************)o(*****)o(*****)o(****)1042 +2940 y Fr(26)p eop +%%Page: 27 28 +27 27 bop 177 42 a Fl(@$@<Types@>+=@{@-)177 91 y(type)21 b(complex_type)e(=)j +(record)f(r,i)g(:)g(real;)g(end;)177 141 y(@})177 241 y(@$@<Procedures@>+=)o +(@{@-)177 291 y(procedure)f(cm_set)h(\(var)g(c:)g(complex_type;)e(a,b:)i +(real\))195 b({Body)21 b(of)g(cm_set})177 340 y(procedure)f(cm_add)h(\(a,b:)f +(complex_type;)g(var)h(c:)g(complex_type\))e({Body)i(of)g(cm_add})177 +390 y({Other)g(procedures)e(and)j(functions})177 440 y(@})177 +540 y(@!****************)o(*****)o(*****)o(****)177 639 y({...more)e(pieces)h +(of)g(program...})177 739 y(@!****************)o(*****)o(*****)o(****)177 +853 y Fr(It)d(is)f(imp)q(ortan)o(t)f(to)h(remem)o(b)q(er)g(that)g(the)h +(de\014nition)f(of)g(eac)o(h)h(macro)e(do)q(es)j(not)e(c)o(hange)h +(throughout)f(the)177 903 y(input)c(\014le.)18 b(F)m(unnelW)m(eb)13 +b(parses)i(the)f(en)o(tire)g(input)f(\014le)h(and)f(assem)o(bles)g(all)f(the) +i(macro)f(de\014nitions)g(b)q(efore)h(it)177 953 y(ev)o(en)h(starts)g(to)f +(expand)h(macros.)j(As)d(a)f(result,)h(eac)o(h)f(additiv)o(e)g(macro)f(can)h +(only)g(ha)o(v)o(e)g(one)g(de\014nition,)g(and)177 1003 y(that)g +(de\014nition)g(is)f(the)i(concatenation)f(of)f(all)g(its)h(parts.)177 +1077 y(The)19 b(example)d(ab)q(o)o(v)o(e)i(sho)o(ws)g(ho)o(w)g(additiv)o(e)f +(macros)g(can)h(b)q(e)h(used)g(to)e(rearrange)i(the)g(presen)o(tation)g(of)e +(a)177 1126 y(computer)h(program)e(in)i(the)g(order)h(in)e(whic)o(h)h(the)g +(user)h(wishes)g(to)f(discuss)h(it)e(rather)i(than)f(the)h(order)f(in)177 +1176 y(whic)o(h)h(the)h(compiler)d(requires)j(that)f(it)g(b)q(e)g(consumed.) +33 b(It)19 b(is)g(easy)m(,)h(ho)o(w)o(ev)o(er,)g(to)f(abuse)g(the)h(feature)f +(of)177 1226 y(additiv)o(e)c(macros.)24 b(In)15 b(man)o(y)f(cases,)k(the)e +(same)f(e\013ect)j(can)e(b)q(e)h(obtained)e(more)g(clearly)h(b)o(y)g +(replacing)f(eac)o(h)177 1276 y(part)d(of)e(an)h(additiv)o(e)g(macro)f +(in-situ)h(using)g(uniquely)f(named)g(non-additiv)o(e)h(macros,)f(and)h(then) +h(collect)g(them)177 1326 y(together)j(as)e(a)h(group)f(at)h(the)g(p)q(oin)o +(t)f(where)i(the)f(additiv)o(e)f(macro)f(is)h(called.)18 b(Doing)12 +b(this)i(is)f(more)g(w)o(ork,)g(and)177 1376 y(is)i(more)e(error)j(prone,)e +(but)h(can)g(result)g(in)f(a)h(clearer)g(exp)q(osition.)20 +b(The)15 b(follo)o(wing)d(program)h(illustrates)i(this)177 +1425 y(alternativ)o(e)f(approac)o(h.)177 1540 y Fl(@!****************)o +(*****)o(*****)o(****)177 1639 y(@O@<prog.pas@>==@{)o(@-)177 +1689 y(program)21 b(adt\(input,outpu)o(t\);)177 1739 y(@<Types@>)177 +1789 y(@<Variables@>)177 1838 y(@<Procedures@>)177 1888 y(begin)g(startproc;) +f(end.)177 1938 y(@})177 2038 y(@$@<Types@>==@{@-)177 2087 +y(@<Buffer)g(type@>)177 2137 y(@<Complex)g(type@>)177 2187 +y(@})177 2287 y(@$@<Variables@>==@)o({@-)177 2337 y(@<Buffer)g(variable@>)177 +2386 y(@})177 2486 y(@$@<Procedures@>==)o(@{@-)177 2536 y(@<Buffer)g +(procedures@>)177 2586 y(@<Complex)g(procedures@>)177 2635 +y(@})177 2735 y(@!****************)o(*****)o(*****)o(****)177 +2835 y(@$@<Buffer)g(type@>==@{@-)1042 2940 y Fr(27)p eop +%%Page: 28 29 +28 28 bop 177 42 a Fl(type)21 b(buffer_type)f(=)h(record)591 +91 y(length)g(:)g(integer;)591 141 y(buf)g(:)h(array[1..100])d(of)i(char;)591 +191 y(end;)177 241 y(@})177 340 y(@$@<Buffer)f(variable@>==@{@-)177 +390 y(bigbuf)h(:)g(buffer_type;)177 440 y(@})177 540 y(@$@<Buffer)f +(procedures@>==@{@)o(-)177 589 y(procedure)g(buf_init\(var)f(b)j(:)g +(buffer_type\))d({Body)i(of)g(buf_init})177 639 y(procedure)f(buf_add\(var)g +(b)h(:)h(buffer_type;)d(ch)i(:)h(char\))f({Body)g(of)g(buf_add})177 +689 y(procedure)f(buf_get\(var)g(b)h(:)h(buffer_type;)d(var)i(ch)h(:)f +(char\))g({Body)g(of)g(buf_get})177 739 y(@})177 839 y(@!****************)o +(*****)o(*****)o(****)177 938 y(@$@<Complex)f(type@>==@{@-)177 +988 y(type)h(complex_type)e(=)j(record)f(r,i)g(:)g(real;)g(end;)177 +1038 y(@})177 1137 y(@$@<Complex)f(procedures@>+=@{)o(@-)177 +1187 y(procedure)g(cm_set\(var)g(c:)h(complex_type;)e(a,b)i(:)h(real\))43 +b({Body)20 b(of)i(cm_set})177 1237 y(procedure)e(cm_add\(a,b)g(:)h +(complex_type;)f(var)h(c:)g(complex_type\))e({Body)i(of)g(cm_add})177 +1287 y({Other)g(procedures)e(and)j(functions})177 1337 y(@})177 +1436 y(@!****************)o(*****)o(*****)o(****)177 1536 y({...more)e +(pieces)h(of)g(program...})177 1636 y(@!****************)o(*****)o(*****)o +(****)177 1745 y Fr(One)16 b(of)e(adv)n(an)o(tages)g(of)g(F)m(unnelW)m(eb)g +(\(and)h(literate)g(programmi)o(ng)d(in)i(general\))h(is)g(that)f(\(as)h(sho) +o(wn)g(ab)q(o)o(v)o(e\))177 1794 y(it)d(allo)o(ws)f(the)i(user)g(to)f(la)o(y) +f(out)h(the)h(program)e(in)g(whatev)o(er)i(order)g(is)f(desired)i(with)d +(near)i(total)f(indep)q(endence)177 1844 y(from)g(the)j(ordering)f +(requiremen)o(ts)g(of)f(the)i(target)f(programming)c(language.)177 +1917 y(Additiv)o(e)15 b(macros)f(are)h(allo)o(w)o(ed)f(to)h(b)q(e)h(tagged)f +(with)f Fl(@Z)h Fr(and)g Fl(@M)g Fr(just)g(as)g(other)h(macros)e(can,)h(but)g +(the)h(tags)177 1967 y(m)o(ust)9 b(app)q(ear)i(only)e(on)h(the)h(\014rst)g +(de\014nition)f(of)g(the)g(macro.)16 b(Additiv)o(e)10 b(macros)f(cannot)i(b)q +(e)f(connected)i(directly)177 2017 y(to)i(pro)q(duct)h(\014les.)177 +2155 y Fd(1.6.5)55 b(P)n(arameterized)17 b(Macros)177 2254 +y Fr(No)c(self-resp)q(ecting)i(macro)d(prepro)q(cessor)k(w)o(ould)c(b)q(e)i +(complete)e(without)h(some)f(form)g(of)g(macro)g(parameter-)177 +2304 y(ization,)h(and)h(F)m(unnelW)m(eb)g(is)g(no)g(exception.)20 +b(F)m(unnelW)m(eb)14 b(allo)o(ws)f(eac)o(h)i(macro)e(to)h(ha)o(v)o(e)g(from)e +(zero)k(to)e(nine)177 2354 y(formal)e(parameters)i(named)e +Fl(@1)p Fr(,)h Fl(@2)p Fr(,)g Fl(@3)p Fr(,)g Fl(@4)p Fr(,)g +Fl(@5)p Fr(,)g Fl(@6)p Fr(,)g Fl(@7)p Fr(,)g Fl(@8)p Fr(,)g(and)h +Fl(@9)p Fr(.)177 2427 y(T)m(o)d(de\014ne)i(a)f(macro)f(with)h(one)g(or)g +(more)f(parameters,)h(insert)g(a)g(formal)e(parameter)h(list)h(just)g(after)g +(the)h(macro)177 2476 y(name)g(in)h(the)h(macro)f(de\014nition.)19 +b(Because)d(macro)e(parameters)g(ha)o(v)o(e)g(\014xed)h(names)f(\()p +Fl(@1)p Fn(:)7 b(:)g(:)n Fl(@9)p Fr(\),)14 b(there)i(is)e(no)177 +2526 y(need)19 b(to)e(sp)q(ecify)h(the)g(names)e(of)h(formal)e(parameters)j +(in)f(the)h(formal)d(parameter)i(list.)28 b(All)16 b(that)i(need)g(b)q(e)177 +2576 y(con)o(v)o(ey)o(ed)c(is)g(ho)o(w)f(man)o(y)f(parameters)i(the)g(macro)e +(has.)19 b(Here)c(is)e(an)h(example)e(of)h(the)h(de\014nition)g(of)f(a)g +(macro)177 2626 y(ha)o(ving)g(three)i(parameters:)177 2735 +y Fl(@$@<While)20 b(loop@>@\(@3@\)@M==@{)o(@-)177 2785 y(@1)177 +2835 y(while)h(\(@2\))1042 2940 y Fr(28)p eop +%%Page: 29 30 +29 29 bop 221 42 a Fl({)243 91 y(@3)221 141 y(})177 191 y(@})177 +310 y Fr(T)m(o)11 b(call)g(a)g(parameterized)h(macro,)e(an)i(actual)f +(parameter)g(list)h(m)o(ust)e(b)q(e)i(supplied)g(that)g(con)o(tains)f +(exactly)h(the)177 360 y(same)j(n)o(um)o(b)q(er)g(of)f(actual)i(parameters)f +(as)h(there)g(are)g(formal)d(parameters)j(in)f(the)h(de\014nition)f(of)g(the) +h(macro)177 410 y(b)q(eing)h(called.)26 b(An)16 b(actual)h(parameter)f(list)g +(is)h(delimited)d(b)o(y)j Fl(@\()f Fr(and)g Fl(@\))p Fr(,)h(and)f(parameters) +h(are)g Fm(sep)n(ar)n(ate)n(d)177 459 y Fr(b)o(y)c(\\)p Fl(@,)p +Fr(".)k(The)c(actual)g(parameters)g(themselv)o(es)h(are)f(general)h(F)m +(unnelW)m(eb)e(expressions)j(\(see)f(Chapter)g(3)f(for)177 +509 y(the)g(exact)g(syn)o(tax\))f(and)h(can)f(b)q(e)h(inserted)h(in)o(to)d +(the)i(list)f(directly)g(or)h(can)f(b)q(e)h(delimited)e(b)o(y)h +Fl(@")g Fr(so)g(as)g(to)g(allo)o(w)177 559 y(some)j(white)g(space)h(to)f +(assist)h(in)f(formatting)e(the)j(actual)e(parameters.)23 b(Here)16 +b(are)g(some)e(examples)h(of)f(calls)177 609 y(of)f(the)i Fl(While)21 +b(loop)13 b Fr(macro)f(de\014ned)j(ab)q(o)o(v)o(e.)177 728 +y Fl(@!)22 b(First)e(form)h(of)h(actual)e(parameters)g(without)g(whitespace)g +(and)h(double)g(quotes.)177 778 y(@<While)g(loop@>@\(x=1;@,x)o(<=10@)o(,prin) +o(tf\("X)o(=\045u\\)o(n",x\))o(;@\))177 877 y(@!)h(Second)e(form)h(of)g +(actual)g(parameters.)f(The)h(double)f(quotes)h(allow)g(non-active)177 +927 y(@!)h(whitespace)d(that)i(helps)g(to)g(lay)h(out)f(the)g(actual)f +(parameters)g(neatly.)177 977 y(@!)i(This)f(call)f(is)i(functionally)d +(identical)h(to)h(the)h(one)f(above.)177 1027 y(@<While)g(loop@>@\()243 +1076 y(@"x:=1;@")e(@,)243 1126 y(@"x<=10@")g(@,)243 1176 y +(@"printf\("X=\045u\\)o(n",x\))o(;@")g(@\))177 1276 y(@!)j(The)f(two)g(forms) +g(can)g(be)g(mixed)g(in)g(a)h(single)e(call.)177 1325 y(@<While)h +(loop@>@\(x=1;@,x)o(<=10@)o(,)482 1375 y(@"printf\("X=\045u\\n",x)o(\);@")d +(@\))177 1494 y Fr(A)h(few)g(rules)g(ab)q(out)f(parameterized)h(macros)f(are) +h(w)o(orth)g(men)o(tioning.)30 b(Macros)19 b(that)g(do)f(not)h(ha)o(v)o(e)f +(an)o(y)177 1544 y(parameters)c(m)o(ust)f(ha)o(v)o(e)g(no)h(formal)d(or)j +(actual)g(parameter)f(lists.)18 b(Additiv)o(e)c(macros)f(can)h(ha)o(v)o(e)f +(parameters,)177 1594 y(but)h(the)h(formal)c(parameter)j(list)f(m)o(ust)g +(app)q(ear)h(in)g(the)g(\014rst)h(de\014nition)e(part)h(only)m(.)177 +1670 y(Here)k(is)f(another)g(example)e(of)h(the)h(use)h(of)e(parameterized)g +(macros.)26 b(This)16 b(time,)g(parameters)h(and)f(macro)177 +1719 y(calls)g(are)g(used)g(in)g(a)f(F)m(unnelW)m(eb)g(input)h(\014le)g(that) +g(constructs)h(an)f Fn(O)q Fr(\()p Fn(n)p Fr(\))g(represen)o(tation)h(of)e(a) +h(song)f(whose)177 1769 y(full)e(size)h(is)g Fn(O)q Fr(\()p +Fn(n)444 1754 y Fg(2)463 1769 y Fr(\))g(in)f(the)i(n)o(um)o(b)q(er)e +Fn(n)h Fr(of)f(unique)h(lines.)177 1938 y Fl(@O@<Twelve_bugs.tx)o(t@>==)o +(@{@-)177 1988 y(The)21 b(Twelve)g(Bugs)g(of)g(Christmas)177 +2038 y(------------------)o(-----)o(-----)177 2087 y(@<Verse@>@\(@"first)o +(@")84 b(@,@<1@>@\))177 2137 y(@<Verse@>@\(@"secon)o(d@")62 +b(@,@<2@>@\))177 2187 y(@<Verse@>@\(@"third)o(@")84 b(@,@<3@>@\))177 +2237 y(@<Verse@>@\(@"fourt)o(h@")62 b(@,@<4@>@\))177 2287 y +(@<Verse@>@\(@"fifth)o(@")84 b(@,@<5@>@\))177 2337 y(@<Verse@>@\(@"sixth)o +(@")g(@,@<6@>@\))177 2386 y(@<Verse@>@\(@"seven)o(th@")40 b(@,@<7@>@\))177 +2436 y(@<Verse@>@\(@"eight)o(h@")62 b(@,@<8@>@\))177 2486 y +(@<Verse@>@\(@"ninth)o(@")84 b(@,@<9@>@\))177 2536 y(@<Verse@>@\(@"tenth)o +(@")g(@,@<A@>@\))177 2586 y(@<Verse@>@\(@"eleve)o(nth@")18 +b(@,@<B@>@\))177 2635 y(@<Verse@>@\(@"twelf)o(th@")40 b(@,@<C@>@\))177 +2735 y(This)21 b(song)g(appeared)f(in)i(the)f(internet)f(newsgroup)g +(rec.humor.funny)f(on)i(24-Dec-1991.)177 2785 y(It)h(was)f(contributed)e(by)j +(Pat)f(Scannell)f(\(scannell@@darkst)o(ar.ma)o(30.bu)o(ll.co)o(m\).)177 +2835 y(@})1042 2940 y Fr(29)p eop +%%Page: 30 31 +30 30 bop 177 91 a Fl(@$@<Verse@>@\(@2@\)@)o(M==@{)o(@-)177 +141 y(For)21 b(the)h(@1)f(bug)g(of)g(Christmas,)f(my)i(manager)e(said)h(to)g +(me)286 191 y(@2)177 241 y(@})177 340 y(@$@<1@>@M==@{See)e(if)i(they)g(can)g +(do)h(it)f(again.@})177 390 y(@$@<2@>@M==@{Ask)e(them)i(how)g(they)g(did)g +(it)g(and@+@<1@>@})177 440 y(@$@<3@>@M==@{Try)e(to)i(reproduce)f(it@+@<2@>@}) +177 490 y(@$@<4@>@M==@{Run)f(with)i(the)g(debugger@+@<3@>@)o(})177 +540 y(@$@<5@>@M==@{Ask)e(for)i(a)g(dump@+@<4@>@})177 589 y +(@$@<6@>@M==@{Reins)o(tall)d(the)k(software@+@<5@>)o(@})177 +639 y(@$@<7@>@M==@{Say)d(they)i(need)g(an)g(upgrade@+@<6@>@})177 +689 y(@$@<8@>@M==@{Find)d(a)k(way)f(around)g(it@+@<7@>@})177 +739 y(@$@<9@>@M==@{Blame)d(it)k(on)f(the)g(hardware@+@<8@>@})177 +789 y(@$@<A@>@M==@{Chang)o(e)e(the)i(documentation@+@<9)o(@>@})177 +839 y(@$@<B@>@M==@{Say)e(it's)i(not)g(supported@+@<A@>)o(@})177 +888 y(@$@<C@>@M==@{Tell)d(them)j(it's)g(a)h(feature@+@<B@>@})177 +1028 y Fd(1.6.6)55 b(Macro)19 b(Expansion)177 1128 y Fr(One)g(of)f(the)g +(strengths)i(of)d(F)m(unnelW)m(eb)h(is)g(that,)h(when)f(writing)g(pro)q(duct) +h(\014les,)g(it)f(do)q(es)h(not)f(attempt)f(to)177 1178 y(ev)n(aluate)g(an)o +(y)f(text)h(expression)h(\(e.g.)e(text)h(blo)q(c)o(k,)g(parameter,)g(macro)e +(call\))h(in)g(memory)f(and)h(then)h(write)177 1228 y(the)f(result)f(out.)22 +b(Instead,)15 b(it)g(alw)o(a)o(ys)f(writes)h(out)g(what)g(it)g(is)f +(expanding)h(dynamically)d(and)j(directly)m(.)21 b(This)177 +1277 y(means)13 b(that)h(the)h(user)f(need)h(not)f(fear)g(de\014ning)g +(macros)f(that)h(expand)g(to)f(h)o(uge)h(amoun)o(ts)f(of)g(text)h(and)g(then) +177 1327 y(calling)d(those)i(macros)e(in)g(other)i(macros,)e(or)h(passing)g +(those)h(h)o(uge)f(macros)f(as)h(parameters)h(to)e(other)i(macros.)177 +1377 y(In)f(all)e(cases,)i(F)m(unnelW)m(eb)f(expands)h(directly)g(to)f(the)h +(pro)q(duct)g(\014le,)g(and)f(there)i(can)e(b)q(e)h(no)f(danger)h(in)f +(running)177 1427 y(out)i(of)f(memory)f(during)i(expansion)f(\(except)j(for)e +(running)f(out)h(of)f(stac)o(k)i(space)g(and)f(other)g(marginally)d(used)177 +1477 y(resources)16 b(in)e(pathological)e(cases\).)177 1550 +y(The)17 b(only)e(thing)h(to)f(remem)o(b)q(er)h(in)f(this)h(regard)h(is)f +(that)g(F)m(unnelW)m(eb)g(alw)o(a)o(ys)f(stores)i(the)g(en)o(tire)f +Fm(input)h Fr(\014le)177 1600 y(and)d(all)f(included)h(\014les,)f(in)h(their) +g(en)o(tiret)o(y)h(in)e(memory)m(,)d(for)k(the)g(duration)g(of)f(the)i(run.) +177 1674 y(Here)g(is)f(an)g(example,)e(that)i(illustrates)g(ho)o(w)f(robust)i +(F)m(unnelW)m(eb)e(is:)177 1786 y Fl(@!)22 b(FunnelWeb)d(copes)i(well)g(with) +g(the)g(following)f(macro)h(definitions.)177 1835 y(@!)h(\(Providing)d(that)i +(it)h(has)f(a)g(little)g(over)g(ten)g(megabytes)f(of)h(memory\).)177 +1935 y(@O@<woppa.txt@>==@)o({@<Qu)o(ote@>)o(@\(@<H)o(umung)o(eous)o(@>@\)@)o +(+@})177 2035 y(@$@<Quote@>@\(@1@\)=)o(=@{"@)o(1"@})177 2134 +y(@$@<Humungeous@>==)o(@{@-)177 2184 y(...Ten)g(Megabytes)f(of)h(Text...)177 +2234 y(@})177 2373 y Fd(1.6.7)55 b(Include)18 b(Files)177 2474 +y Fr(F)m(unnelW)m(eb)i(pro)o(vides)g(a)g(nested)i(include)e(\014le)h(facilit) +o(y)d(that)i(can)h(b)q(e)g(used)g(for)f(a)g(n)o(um)o(b)q(er)f(of)h(purp)q +(oses.)177 2523 y(When)c(F)m(unnelW)m(eb)f(runs)h(in)o(to)f(a)h(single)f +(line)g(con)o(taining)f(the)j(sp)q(ecial)e(sequence)j Fl(@i)d +Fr(follo)o(w)o(ed)f(b)o(y)i(a)f(blank,)177 2573 y(follo)o(w)o(ed)10 +b(b)o(y)g(a)h(\014le)g(name,)f(it)g(reads)i(in)f(the)g(designated)h(\014le)f +(and)g(replaces)h(the)g(line)e(con)o(taining)g(the)i(command)177 +2623 y(\(including)h(the)g(end)h(of)f(line)f(mark)o(er)h(at)g(the)h(end)f(of) +g(the)h(line\))f(with)g(the)g(en)o(tire)h(con)o(ten)o(ts)h(of)d(the)i +(designated)177 2673 y(\014le.)k(F)m(or)c(example,)e(if)h(there)i(w)o(as)f(a) +f(\014le)h(called)g Fl(camera.txt)e Fr(con)o(taining)g(the)j(t)o(w)o(o)e +(lines:)177 2785 y Fl('Cos)21 b(I)h(shoot)e(with)h(a)h(camera)f(instead)f(of) +h(a)h(gun.)177 2835 y(The)f(animals)g(flock)f(to)i(be)f(petted)g(and)g(fed,) +1042 2940 y Fr(30)p eop +%%Page: 31 32 +31 31 bop 177 42 a Fr(and)14 b(another)g(\014le)g(called)g +Fl(poem.fw)e Fr(con)o(taining)h(the)h(follo)o(wing)e(four)h(lines)177 +152 y Fl(I)22 b(like)f(to)g(go)g(shooting,)f(it's)h(a)h(whole)f(lot)g(of)g +(fun,)177 202 y(@i)h(camera.txt)177 251 y(Cos)f(they)g(know)g(my)h(camera)e +(isn't)h(loaded)g(with)f(lead.)177 301 y(-)i(RNW,)f(04-Jan-1991.)177 +412 y Fr(Then,)14 b(if)f(F)m(unnelW)m(eb)g(w)o(ere)i(to)f(pro)q(cess)i +Fl(poem.fw)p Fr(,)c(the)i(result)h(w)o(ould)e(b)q(e)h(as)g(if)f(F)m(unnelW)m +(eb)h(had)f(read)i(in:)177 522 y Fl(I)22 b(like)f(to)g(go)g(shooting,)f(it's) +h(a)h(whole)f(lot)g(of)g(fun,)177 572 y('Cos)g(I)h(shoot)e(with)h(a)h(camera) +f(instead)f(of)h(a)h(gun.)177 621 y(The)f(animals)g(flock)f(to)i(be)f(petted) +g(and)g(fed,)177 671 y('Cos)g(they)g(know)g(my)g(camera)g(isn't)g(loaded)f +(with)h(lead.)177 721 y(-)h(RNW,)f(04-Jan-1991.)177 831 y Fr(F)m(unnelW)m(eb) +11 b(expands)g(include)g(\014les)h(b)q(efore)f(it)g(starts)h(scanning)f(and)g +(parsing)f(the)i(included)f(text.)18 b(The)11 b(result)177 +881 y(is)17 b(that)f(include)h(\014les)g(can)g(con)o(tain)f(an)o(ything)g +(that)g(can)h(b)q(e)g(found)g(in)f(a)g(F)m(unnelW)m(eb)g(\014le.)26 +b(The)17 b(follo)o(wing)177 931 y(example)c(illustrates)h(the)g(lev)o(el)g +(at)g(whic)o(h)f(the)i(include)f(mec)o(hanism)d(op)q(erates.)20 +b(If)13 b Fl(main.fw)g Fr(con)o(tains)177 1041 y Fl(@O@<output.dat@>==)o +(@{@-)177 1091 y(@i)22 b(inc.fw)177 1141 y(This)f(is)h(the)f(text)g(of)g(the) +g(sloth)g(macro.)177 1191 y(@})177 1301 y Fr(and)14 b(inc.fw)f(con)o(tains) +177 1411 y Fl(@<Sloth@>)177 1461 y(@})177 1561 y(@$@<Sloth@>==@{@-)177 +1671 y Fr(Then)i(if)e(F)m(unnelW)m(eb)g(w)o(ere)i(applied)e(to)h +Fl(main.fw)p Fr(,)e(it)h(w)o(ould)g(see:)177 1781 y Fl(@O@<output.dat@>==)o +(@{@-)177 1831 y(@<Sloth@>)177 1881 y(@})177 1981 y(@$@<Sloth@>==@{@-)177 +2030 y(This)21 b(is)h(the)f(text)g(of)g(the)g(sloth)g(macro.)177 +2080 y(@})177 2190 y Fr(whic)o(h)c(it)g(w)o(ould)f(pro)q(cess)j(in)e(the)h +(normal)d(manner.)27 b(The)18 b(only)e(sp)q(ecial)h(sequence)j(pro)q(cessing) +e(that)f(tak)o(es)177 2240 y(place)12 b(at)g(a)f(lev)o(el)h(lo)o(w)o(er)f +(than)h(include)g(\014les)g(is)g(the)g(pro)q(cessing)h(of)e(the)h +Fl(<special>=<newspecia)o(l>)d Fr(sequence)177 2290 y(whic)o(h)14 +b(c)o(hanges)h(the)f(sp)q(ecial)g(c)o(haracter.)177 2363 y(A)g(few)f(other)h +(facts)g(ab)q(out)f(include)g(\014les)h(are)g(w)o(orth)f(men)o(tioning)e +(here.)19 b(Include)14 b(\014les)g(inherit)f(the)h(directory)177 +2413 y(sp)q(eci\014cation)k(supplied)g(using)f(the)h Fl(+I)f +Fr(command)e(line)i(option.)28 b(The)17 b(sp)q(ecial)h(c)o(haracter)h(is)e +(sa)o(v)o(ed)h(at)f(the)177 2463 y(start)e(of)e(eac)o(h)h(include)g(\014le)g +(and)g(restored)i(to)d(its)h(previous)h(v)n(alue)e(at)h(the)g(end)g(of)g(eac) +o(h)g(include)g(\014le.)k(Include)177 2513 y(\014les)c(can)g(b)q(e)g(nested)h +(up)f(to)f(ten)i(lev)o(els.)i(Recursiv)o(e)e(included)f(\014les)g(will)e(alw) +o(a)o(ys)g(cause)j(an)e(in\014nite)h(recursion)177 2562 y(as)f(there)h(is)e +(no)g(b)q(ottoming)f(out)h(mec)o(hanism)e(a)o(v)n(ailable.)16 +b(Include)d(\014les)g(m)o(ust)e(con)o(tain)h(an)h(in)o(teger)g(n)o(um)o(b)q +(er)e(of)177 2612 y(lines)i(\(i.e.)g(the)h(last)f(line)g(m)o(ust)f(b)q(e)i +(terminated)e(with)h(an)g(end)h(of)f(line)g(mark)o(er\).)k(Once)d(F)m(unnelW) +m(eb)f(has)g(seen)177 2662 y(\\)p Fl(@i)21 b Fr(")14 b(at)g(the)h(start)f(of) +g(a)f(line,)h(it)f(will)g(grab)h(the)g(rest)i(of)d(the)i(line)e(ra)o(w)h(and) +g(treat)h(it)e(as)h(a)g(\014le)g(name.)k(There)177 2712 y(is)c(no)g(place)g +(on)f(the)i(line)e(for)h(things)f(lik)o(e)h(F)m(unnelW)m(eb)f(commen)o(ts)f +(\(see)j(later\))f(or)g(extraneous)h(text.)177 2785 y(Include)21 +b(\014les)f(can)h(b)q(e)f(used)h(for)f(man)o(y)e(purp)q(oses,)23 +b(but)d(are)g(particularly)g(useful)g(for)g(hauling)e(in)i(macro)177 +2835 y(libraries.)1042 2940 y(31)p eop +%%Page: 32 33 +32 32 bop 177 42 a Fi(1.7)70 b(T)n(yp)r(esetting)21 b(F)-6 +b(acilitie)o(s)177 158 y Fr(The)14 b(\014rst)g(half)e(of)g(this)h(tutorial)f +(fo)q(cuses)j(solely)d(on)h(the)h(macro)e(facilities)g(of)g(F)m(unnelW)m(eb)h +(\(whic)o(h)g(it)g(more)f(or)177 208 y(less)j(co)o(v)o(ers)g(completely\).)i +(As)e(a)e(result,)i(the)f(example)f(do)q(cumen)o(ts)h(y)o(ou)f(ha)o(v)o(e)h +(seen)i(so)e(far)f(ha)o(v)o(e)h(b)q(een)h(gross)177 257 y(distortions)k(of)g +(\\normal")e(F)m(unnelW)m(eb)h(do)q(cumen)o(ts)h(whic)o(h)g(often)h(con)o +(tain)e(as)i(m)o(uc)o(h)e(do)q(cumen)o(tation)g(as)177 307 +y(co)q(de.)270 292 y Fg(3)307 307 y Fr(While)12 b(there)j(are)e(applications) +f(where)i(F)m(unnelW)m(eb)e(can)i(b)q(e)f(used)h(solely)e(as)h(a)g(macro)f +(prepro)q(cessor,)177 357 y(most)h(applications)g(will)f(use)j(its)f(t)o(yp)q +(esetting)h(facilities)d(as)i(w)o(ell.)177 432 y(This)g(section)h(restores)g +(the)g(balance)f(in)f(this)h(tutorial)f(b)o(y)h(presen)o(ting)h(F)m(unnelW)m +(eb's)e(t)o(yp)q(esetting)i(facilities.)177 574 y Fd(1.7.1)55 +b(Ov)n(erview)177 676 y Fr(The)12 b(macro)e(de\014nitions)h(discussed)h(in)f +(the)h(macro)e(tutorial)g(completely)g(de\014ne)i(the)g(con)o(ten)o(ts)g(of)e +(the)i(pro)q(duct)177 726 y(\014les)19 b(that)f(F)m(unnelW)m(eb)f(will)g +(generate.)32 b(These)19 b(macro)e(de\014nitions)h(can)g(b)q(e)h(arranged)f +(in)g(an)o(y)f(order)i(and)177 776 y(nothing)14 b(external)g(to)g(them)f(can) +i(a\013ect)g(the)g(con)o(ten)o(ts)g(of)e(the)i(pro)q(duct)g(\014les.)k(The)c +(macros)e(can)h(b)q(e)h(though)o(t)177 826 y(of)e(as)h(a)g(group)g(of)f +(self-con)o(tained)h(islands.)177 901 y(Although)f(F)m(unnelW)m(eb)f(will)g +(can)i(pro)q(cess)h(the)e(macros)g(all)f(on)h(their)g(o)o(wn,)g(the)g(full)f +(p)q(o)o(w)o(er)i(of)e(F)m(unnelW)m(eb)h(is)177 950 y(realized)i(only)f(when) +i(the)f(macros)f(are)i(surrounded)g(b)o(y)e(a)h(sea)g(of)f(do)q(cumen)o +(tation.)20 b(This)15 b(sea)g(can)g(tak)o(e)g(t)o(w)o(o)177 +1000 y(forms:)j(directiv)o(es)d(and)f(free)h(text.)20 b(Some)13 +b(of)h(the)h(directiv)o(es)g(con)o(trol)f(things)g(suc)o(h)h(as)g(the)g +(maxim)n(um)10 b(input)177 1050 y(line)f(length.)17 b(Ho)o(w)o(ev)o(er,)10 +b(most)f(of)f(them)h(are)h(t)o(yp)q(esetting)h(directiv)o(es)f(that)g +(a\013ect)g(the)h(prin)o(ted)e(do)q(cumen)o(tation.)177 1100 +y(Th)o(us)j(a)g(F)m(unnelW)m(eb)g(do)q(cumen)o(t)f(can)h(b)q(e)h(view)o(ed)f +(as)g(a)g(sequence)i(of)d Fo(macro)j(de\014niti)o(ons)o Fr(,)9 +b Fo(directiv)o(es)p Fr(,)g(and)177 1150 y Fo(free)15 b(text)p +Fr(.)177 1225 y(Unlik)o(e)10 b(the)i(pro)q(duct)f(\014les)g(whic)o(h)g +(consist)g(of)g(unscram)o(bled)f(macro)f(calls,)i(the)g(do)q(cumen)o(tation)f +(\014le)g(is)h(more)f(or)177 1274 y(less)g(a)f(direct)h(represen)o(tation)h +(of)e(the)h(input)f(\014le.)17 b(Eac)o(h)9 b(part)h(of)f(the)h(input)f +(\014le)g(app)q(ears)h(in)f(the)h(do)q(cumen)o(tation)177 1324 +y(\014le)h(in)f(the)h(order)h(in)e(whic)o(h)h(it)f(app)q(ears)i(in)e(the)h +(input)g(\014le.)17 b(Ho)o(w)o(ev)o(er,)11 b(eac)o(h)g(di\013eren)o(t)h(kind) +e(of)g(part)h(is)g(t)o(yp)q(eset)1929 1309 y Fg(4)177 1374 +y Fr(in)i(a)g(di\013eren)o(t)i(manner.)i(Macros)d(are)g(t)o(yp)q(eset)h(in)e +(a)g(particular)g(st)o(yle,)h(with)f(the)h(macro)e(b)q(o)q(dy)i(app)q(earing) +f(in)177 1424 y Fl(tt)22 b(font)11 b Fr(\(see)i(some)e(F)m(unnelW)m(eb)h +(prin)o(ted)g(do)q(cumen)o(tation)f(for)h(an)f(example\).)17 +b(T)o(yp)q(esetter)d(directiv)o(es)f(ha)o(v)o(e)177 1474 y(sp)q(eci\014c)j +(de\014ned)f(e\013ects)h(\(more)d(later\).)18 b(F)m(ree)d(text)f(is)g(t)o(yp) +q(eset)h(exactly)f(as)g(it)g(is,)f(except)i(that)f(eac)o(h)h(blo)q(c)o(k)e +(of)177 1524 y(text)i(b)q(et)o(w)o(een)g(blank)e(lines)h(is)g(\014lled)f(and) +h(justi\014ed)g(as)g(a)g(paragraph.)177 1599 y(The)f(follo)o(wing)d(example)i +(demonstrates)h(ho)o(w)f(all)f(this)i(w)o(orks.)k(T)o(yp)q(e)c(in)g(the)g +(follo)o(wing)d(as)i Fl(example.fw)f Fr(and)177 1648 y(run)k(it)g(through)f +(F)m(unnelW)m(eb)g(with)h(the)g(command)d(\\)p Fl(fw)21 b(example)g(+t)p +Fr(".)e(The)c(\\)p Fl(+t)p Fr(")f(instructs)i(F)m(unnelW)m(eb)177 +1698 y(to)j(generate)h(a)f(do)q(cumen)o(tation)f(\014le)h(called)g +Fl(example.tex)p Fr(.)31 b(Run)19 b(the)g(\014le)g(through)h(T)1643 +1707 y(E)1666 1698 y(X)f(and)g(prin)o(t)g(it.)177 1748 y(Examine)13 +b(the)h(\014les)g Fl(example.out)e Fr(and)i Fl(example.tex)p +Fr(.)177 1865 y Fl(You)21 b(are)h(reading)e(some)h(free)g(text)g(before)f +(the)h(macro.)g(Free)g(text)g(can)g(consist)177 1915 y(of)h(any)f(text)g +(\(not)g(containing)e(the)j(FunnelWeb)d(special)i(character\))f(including)177 +1965 y(typesetter)g(commands)177 2014 y(such)h(as)h($,)f(\045,)g(#,)h(and)f +(\\TeX{})f(which)177 2064 y(will)h(be)h(typeset)e(to)h(appear)g(exactly)f(as) +i(they)e(do)i(in)f(the)g(input)g(file!)177 2114 y(Look)g(out!)g(Here)g(comes) +g(a)g(macro!)177 2214 y(@O@<example.out@>=)o(=@{@-)177 2263 +y(This)g(text)g(is)g(part)g(of)177 2313 y(a)h(macro)f(definition.)177 +2363 y(@})177 2463 y(This)g(is)h(free)e(text)h(following)f(the)i(macro.)e +(This)h(sentence)f(contains)177 2513 y(two)h(@{inline@})f(typesetter)g +(@/directives@/.)177 2562 y(Now)h(here)g(is)h(a)f(non-inline)f(typesetting)g +(directive.)p 177 2599 709 2 v 223 2626 a Ff(3)241 2637 y Fh(As)12 +b(an)f(example,)e(the)h(author)g(used)h(F)m(unnelW)m(eb)e(to)i(dev)o(elop)f +(a)h(largish)f(computer)f(program)g(and)i(found)f(that)g(on)h(a)o(v)o(erage) +177 2677 y(his)g(st)o(yle)g(of)g(using)f(F)m(unnelW)m(eb)g(resulted)f(in)j +(ab)q(out)d(30\045)j(do)q(cumen)o(ta)o(tion)c(and)j(70\045)g(macros)f(\(co)q +(de\))g(\(measured)e(b)o(y)j(n)o(um)o(b)q(ers)177 2716 y(of)g(lines\).)223 +2744 y Ff(4)241 2756 y Fh(Here)i(the)h(term)e(\\t)o(yp)q(eset")g(is)i(used)f +(lo)q(osely)f(to)i(refer)e(to)i(F)m(unnelW)m(eb's)e(generation)f(of)i(t)o(yp) +q(esetter)f(commands)f(for)i(eac)o(h)177 2795 y(construct)e(in)h(the)g(input) +g(\014le.)18 b(Strictly)m(,)11 b(the)h(term)g(should)f(b)q(e)i(used)f(only)f +(to)i(describ)q(e)e(the)h(actions)f(of)h(a)h(t)o(yp)q(esetter)d(program)177 +2835 y(\(e.g.)h(T)275 2842 y(E)295 2835 y(X\).)1042 2940 y +Fr(32)p eop +%%Page: 33 34 +33 33 bop 177 91 a Fl(@t)22 b(new_page)177 191 y(This)f(sentence)f(will)h +(appear)g(on)g(the)g(next)g(page.)177 312 y Fr(A)o(t)12 b(the)h(top)e(of)h +(the)g Fl(example.tex)d Fr(do)q(cumen)o(tation)i(\014le)h(will)e(b)q(e)j(a)e +(set)i(of)e(T)1383 321 y(E)1406 312 y(X)h(macro)f(de\014nitions.)17 +b(The)c(T)1895 321 y(E)1918 312 y(X)177 362 y(co)q(de)g(corresp)q(onding)h +(to)e(the)h(input)f(ab)q(o)o(v)o(e)g(app)q(ears)h(at)f(the)h(end)g(of)f(the)h +(\014le.)18 b(It)12 b(should)g(lo)q(ok)g(something)f(lik)o(e)177 +412 y(this.)177 533 y Fl(You)21 b(are)h(reading)e(some)h(free)g(text)g +(before)f(the)h(macro.)g(Free)g(text)g(can)g(consist)177 583 +y(of)h(any)f(text)g(\(not)g(containing)e(the)j(FunnelWeb)d(special)i +(character\))f(including)177 632 y(typesetter)g(commands)177 +682 y(such)h(as)h(\\$,)f(\\\045,)g(\\#,)g(and)g($\\backslash$TeX$\\{)o +($$\\}$)d(which)177 732 y(will)j(be)h(typeset)e(to)h(appear)g(exactly)f(as)i +(they)e(do)i(in)f(the)g(input)g(file!)177 782 y(Look)g(out!)g(Here)g(comes)g +(a)g(macro!)177 882 y(\\fwbeginmacro)177 931 y(\\fwfilename{exampl)o(e.out)o +(}{1}\\)o(fwequ)o(als)e(\\fwodef)h(\\fwbtx[This)f(text)i(is)h(part)f(of)177 +981 y(a)h(macro)f(definition.)177 1031 y(]fwetx=\045)177 1081 +y(\\fwcdef)177 1131 y(\\fwbeginmacronotes)177 1180 y(\\fwisafile{This)e +(macro)i(is)g(attached)f(to)i(an)f(output)f(file.})177 1230 +y(\\fwendmacronotes)177 1280 y(\\fwendmacro)177 1380 y(This)h(is)h(free)e +(text)h(following)f(the)i(macro.)e(This)h(sentence)f(contains)177 +1430 y(two)h(\\fwlit{inline})e(typesetter)h(\\fwemp{directives)o(}.)177 +1479 y(Now)h(here)g(is)h(a)f(non-inline)f(typesetting)g(directive.)177 +1579 y(\\fwnewpage)177 1679 y(This)h(sentence)f(will)h(appear)g(on)g(the)g +(next)g(page.)177 1800 y Fr(The)14 b(follo)o(wing)e(p)q(oin)o(ts)i(explain)f +(the)h Fl(example.tex)e Fr(\014le.)295 1876 y Fo(Y)l(ou)f(don't)e(ha)o(v)o(e) +h(to)g(kno)o(w)h(T)l(eX:)f Fr(If)f(y)o(ou)g(don't)g(kno)o(w)g(T)1238 +1885 y(E)1261 1876 y(X,)g(don't)g(pa)o(y)g(to)q(o)h(m)o(uc)o(h)e(atten)o +(tion)295 1926 y(to)14 b(this)g(section.)19 b(Y)m(ou)13 b(don't)g(need)i(to)f +(kno)o(w)f(T)1054 1935 y(E)1078 1926 y(X)g(to)h(use)h(F)m(unnelW)m(eb.)295 +2003 y Fo(In)h(order:)h Fr(F)m(unnelW)m(eb)c(has)h(merely)g(transformed)f +(the)h(input.)k(It)c(hasn't)g(rearranged)h(it.)295 2080 y Fo(F)l(ree)i(text:) +22 b Fr(Most)15 b(of)g(the)h(free)h(text)f(has)f(b)q(een)i(simply)c(copied)j +(o)o(v)o(er.)23 b(The)16 b(T)1580 2089 y(E)1603 2080 y(X)f(t)o(yp)q(esetter) +295 2129 y(justi\014es)f(and)f(\014lls)g(all)e(paragraphs)j(fed)f(to)g(it)g +(b)o(y)f(default,)h(so)g(most)f(of)h(the)g(text)h(has)f(just)h(b)q(een)295 +2179 y(copied)g(v)o(erbatim.)295 2256 y Fo(T)l(eX)20 b(co)q(des:)25 +b Fr(The)17 b(c)o(haracters)i(and)e(sequences)i(whic)o(h)e(T)1263 +2265 y(E)1286 2256 y(X)g(treats)h(as)f(sp)q(ecial)h(ha)o(v)o(e)f(b)q(een)295 +2306 y(neutralized)12 b(in)e(the)i(do)q(cumen)o(tation)d(\014le.)17 +b(F)m(or)11 b(example,)e(\\)p Fl($)p Fr(")i(has)g(b)q(ecome)f(\\)p +Fl(\\$)p Fr(".)16 b(By)11 b(default,)295 2356 y(F)m(unnelW)m(eb)h(allo)o(ws)f +(the)i(user)g(to)f(write)g(an)o(y)g(text)h(as)f(free)h(text)g(and)f(not)g(ha) +o(v)o(e)g(to)g(w)o(orry)g(ab)q(out)295 2405 y(acciden)o(tally)i(in)o(v)o +(oking)e(t)o(yp)q(esetter)k(features.)295 2482 y Fo(fw)h(sequences:)j +Fr(The)15 b Fl(fw)f Fr(sequences)j(\(e.g.)e Fl(\\fwbeginmacro)p +Fr(\))d(in)o(v)o(ok)o(e)i(T)1491 2491 y(E)1514 2482 y(X)h(macros)f(de\014ned) +295 2532 y(earlier)g(in)g(the)g(do)q(cumen)o(tation)f(\014le)h(\(and)g(not)f +(sho)o(wn)h(here\).)295 2609 y Fo(The)19 b(macro:)24 b Fr(The)17 +b(macro)e(is)i(t)o(yp)q(eset)h(using)e(a)g(set)i(of)e(prede\014ned)i(T)1460 +2617 y(E)1484 2609 y(X)e(macros.)26 b(See)17 b(the)295 2658 +y(prin)o(ted)e(do)q(cumen)o(tation)d(to)i(see)h(what)f(this)g(lo)q(oks)f(lik) +o(e)g(on)h(pap)q(er.)295 2735 y Fo(T)o(yp)q(esetter)i(directiv)o(es:)k +Fr(Unlik)o(e)15 b(the)h(T)1002 2744 y(E)1025 2735 y(X)g(command)d(sequences) +18 b(\(whic)o(h)e(w)o(ere)h(neutral-)295 2785 y(ized\),)f(the)g(F)m(unnelW)m +(eb)f(t)o(yp)q(esetter)i(directiv)o(es)f(turn)g(in)o(to)e(T)1286 +2794 y(E)1310 2785 y(X)h(macro)f(calls.)22 b(F)m(or)14 b(example,)295 +2835 y(\\)p Fl(@)p Fq(f)p Fl(inline@)p Fq(g)p Fr(")d(b)q(ecame)j(\\)p +Fl(\\fwlit)p Fq(f)p Fl(inline)p Fq(g)p Fr(".)1042 2940 y(33)p +eop +%%Page: 34 35 +34 34 bop 177 42 a Fr(In)16 b(summary)m(,)c(F)m(unnelW)m(eb)j(pro)q(duces)i +(t)o(yp)q(eset)g(do)q(cumen)o(tation)d(that)h(transforms,)g(but)g(do)q(es)h +(not)g(reorder,)177 91 y(the)e(input)f(\014le.)18 b(Macros)c(are)g(t)o(yp)q +(eset)h(in)e(a)g(sp)q(eci\014c)i(st)o(yle.)j(F)m(unnelW)m(eb)13 +b(t)o(yp)q(esetter)j(directiv)o(es)f(ha)o(v)o(e)e(partic-)177 +141 y(ular)i(w)o(ell-de\014ned)g(e\013ects.)23 b(F)m(ree)16 +b(text)g(is)f(\014lled)f(and)h(justi\014ed,)g(but)g(will)f(otherwise)i(app)q +(ear)f(in)g(the)g(prin)o(ted)177 191 y(do)q(cumen)o(tation)e(exactly)h(as)g +(it)f(app)q(ears)i(in)e(the)i(input)f(\014le.)177 333 y Fd(1.7.2)55 +b(T)n(yp)r(esetter)17 b(Indep)r(endence)177 436 y Fr(Although)f(the)h(curren) +o(t)h(v)o(ersion)e(of)g(F)m(unnelW)m(eb)f(can)i(only)e(generate)j(do)q(cumen) +o(tation)d(\014les)i(in)f(T)1783 444 y(E)1806 436 y(X)g(form,)177 +485 y(it)i(encourages)i(t)o(yp)q(esetter)h(indep)q(endence)g(b)o(y)d +(neutralizing)g(all)f(T)1280 494 y(E)1303 485 y(X)i(con)o(trol)f(sequences)j +(b)q(efore)f(writing)177 535 y(them)f(out.)34 b(The)20 b(result)g(is)f(that)h +(y)o(ou)f(don't)f(ha)o(v)o(e)i(w)o(orry)f(ab)q(out)g(upsetting)h(or)f(dep)q +(ending)h(on)f(T)1831 544 y(E)1855 535 y(X)g(b)o(y)177 585 +y(acciden)o(tally)11 b(including)g(some)g(sp)q(ecial)h(c)o(haracter)h(or)f +(sequence.)19 b(By)12 b(default)g(y)o(our)f(input)h(\014le)g(is)f +Fo(t)o(yp)q(esetter)177 635 y(indep)q(enden)n(t)p Fr(.)177 +710 y(This)i(sc)o(heme)g(di\013ers)h(from)d(other)i(literate)g(programming)d +(to)q(ols,)i(including)g(all)f(earlier)j(v)o(ersions)f(of)f(F)m(unnel-)177 +760 y(W)m(eb,)h(whic)o(h)g(cop)o(y)g(their)h(free)g(text)g(directly)f(to)g +(the)h(do)q(cumen)o(tation)e(\014le,)h(the)h(justi\014cation)f(b)q(eing)g +(that)g(the)177 810 y(programmer)d(can)j(use)g(the)g(full)e(p)q(o)o(w)o(er)h +(of)g(the)h(t)o(yp)q(esetter)h(language)e(to)g(describ)q(e)i(the)f(program.)i +(The)e(disad-)177 859 y(v)n(an)o(tages)h(of)f(doing)g(this)h(are)g(\014rst)h +(that)f(the)g(programmer)e(is)i(required)g(to)g(kno)o(w)f(the)i(t)o(yp)q +(esetting)g(language)177 909 y(and)h(second)h(that)f(the)g(input)g(\014le)g +(b)q(ecomes)g(t)o(yp)q(esetter)i(dep)q(enden)o(t.)25 b(F)m(unnelW)m(eb)16 +b(a)o(v)o(oids)e(these)k(problems)177 959 y(b)o(y)c(knobbling)e(the)j(free)g +(text)f(b)q(e)h(default.)177 1034 y(Ho)o(w)o(ev)o(er,)e(F)m(unnelW)m(eb)g(do) +q(es)h(pro)o(vide)f(a)f(trap)q(do)q(or)i(for)e(those)i(who)f(w)o(an)o(t)g +(their)g(free)h(text)g(to)f(b)q(e)g(fed)g(directly)177 1084 +y(to)h(T)251 1093 y(E)274 1084 y(X.)f(T)m(o)h(op)q(en)g(the)g(trap)q(do)q +(or,)g(simply)e(include)i(the)g(follo)o(wing)d(pragma)h(somewhere)j(in)e(y)o +(our)h(input)f(\014le.)177 1201 y Fl(@p)22 b(typesetter)d(=)j(tex)177 +1319 y Fr(See)15 b(Section)f(3.11.2)e(for)i(more)f(information.)177 +1394 y(F)m(unnelW)m(eb)d(lea)o(v)o(es)h(the)h(degree)g(to)e(whic)o(h)h(the)g +(user)h(wishes)g(to)e(bind)h(a)f(particular)h(do)q(cumen)o(t)f(to)h(a)f +(particular)177 1444 y(t)o(yp)q(esetter)15 b(up)e(to)f(the)i(user.)k(In)13 +b(some)f(cases,)h(the)h(extra)f(t)o(yp)q(esetting)g(p)q(o)o(w)o(er)g(ma)o(y)e +(comp)q(ensate)i(for)f(the)h(lac)o(k)177 1493 y(of)h(p)q(ortabilit)o(y)m(.)k +(Ho)o(w)o(ev)o(er,)d(as)f(a)g(rule,)h(it)f(is)g(b)q(est)i(to)e(a)o(v)o(oid)f +(t)o(yp)q(esetter-sp)q(ec)q(i\014c)k(commands,)12 b(so)j(as)f(to)g(allo)o(w) +177 1543 y(y)o(our)j(input)g(\014les)h(to)f(b)q(e)g(formatted)f(at)h(a)g +(later)h(date)f(for)g(di\013eren)o(t)h(t)o(yp)q(esetters.)31 +b(F)m(unnelW)m(eb)16 b(includes)i(a)177 1593 y(n)o(um)o(b)q(er)c(of)g(its)g +(o)o(wn)h(t)o(yp)q(esetter)h(commands)d(so)h(as)h(to)f(supp)q(ort)i(t)o(yp)q +(esetter-indep)q(enden)o(t)i(input)c(\014les.)20 b(The)177 +1643 y(follo)o(wing)12 b(sections)k(describ)q(e)g(some)d(of)h(these)i +(commands.)h(In)e(particular,)e(the)j(next)e(section)i(describ)q(es)g(the)177 +1693 y(most)f(p)q(o)o(w)o(erful)g(F)m(unnelW)m(eb)g(t)o(yp)q(esetting)h +(directiv)o(es)h(whic)o(h)e(allo)o(w)f(the)i(user)h(to)e(structure)j(the)e +(do)q(cumen)o(t)177 1742 y(hierarc)o(hically)m(.)177 1885 y +Fd(1.7.3)55 b(Hierarc)n(hical)18 b(Structure)177 1987 y Fr(The)h(tree)h +(structure)g(is)f(one)f(of)g(the)h(most)e(e\013ectiv)o(e)j(structuring)g(to)q +(ols)e(that)g(exists,)i(deriving)e(its)g(p)q(o)o(w)o(er)177 +2037 y(from)13 b(the)i(principal)f(of)g(divide)h(and)f(conquor.)21 +b(So)14 b(e\013ectiv)o(e)i(is)f(it)f(that)h(the)g(in)o(ternal)f(organization) +g(of)g(most)177 2087 y(tec)o(hnical)j(b)q(o)q(oks)g(are)h(tree)g(structures)h +(whic)o(h)e(are)h(concisely)f(summarized)e(in)i(the)g(table)g(of)f(con)o(ten) +o(ts.)29 b(In)177 2136 y(con)o(trast,)14 b(computer)e(programs)g(are)i +(usually)e(presen)o(ted)j(as)e(\015at)g(sequences)j(of)c(text)i(to)f(b)q(e)g +(consumed)g(b)o(y)g(an)177 2186 y(anon)o(ymous)f(compiler.)177 +2261 y(In)20 b(order)h(to)e(bring)h(program)e(do)q(cumen)o(tation)h(up)h(to)f +(the)i(structural)g(sophistication)e(commonplace)e(in)177 2311 +y(tec)o(hnical)12 b(b)q(o)q(oks,)g(F)m(unnelW)m(eb)f(pro)o(vides)g(\014v)o(e) +h(lev)o(els)g(of)e(section)j(headings)e(implemen)o(ted)e(b)o(y)j(the)g(\014v) +o(e)g(sp)q(ecial)177 2361 y(sequences)j Fl(@A)p Fr(,)c Fl(@B)p +Fr(,)g Fl(@C)p Fr(,)g Fl(@D)p Fr(,)h(and)g Fl(@E)p Fr(.)f(These)i(m)o(ust)e +(alw)o(a)o(ys)h(app)q(ear)g(at)g(the)h(start)g(of)e(a)h(line.)17 +b Fl(@A)12 b Fr(is)g(the)g(highest)177 2411 y(lev)o(el)21 b(section)g(\(e.g.) +f(lik)o(e)g(L)617 2406 y Fk(a)636 2411 y Fr(T)659 2423 y(E)683 +2411 y(X's)g Fl(\\chapter)p Fr(\))g(and)g Fl(@E)h Fr(is)f(the)i(lo)o(w)o(est) +e(lev)o(el)h(section)g(\(e.g.)f(lik)o(e)g(L)1824 2406 y Fk(a)1843 +2411 y Fr(T)1866 2423 y(E)1890 2411 y(X's)177 2461 y Fl(\\subsubsubsection)p +Fr(\).)30 b(Section)19 b(headings)g(can)g(app)q(ear)g(an)o(ywhere)h(in)e(the) +h(free)h(text)g(of)e(a)g(F)m(unnelW)m(eb)177 2510 y(input)c(\014le)g(\(i.e.)f +(an)o(ywhere)h(except)i(inside)e(a)f(macro)g(de\014nition\).)177 +2586 y(Eac)o(h)j(section)g(heading)f(in)g(a)g(F)m(unnelW)m(eb)g(do)q(cumen)o +(t)f(has)i(an)f(asso)q(ciated)h(name.)21 b(The)16 b(name)e(of)h(a)g(section) +177 2635 y(can)i(b)q(e)f(pro)o(vided)h(explicitly)e(b)o(y)h(supplying)f(it)h +(delimited)f(b)o(y)h Fl(@<)f Fr(and)h Fl(@>)g Fr(immediately)d(after)j(the)h +(section)177 2685 y(sequence)e(\(e.g.)e Fl(@A)p Fr(\),)f(or)h(implicitly)d(b) +o(y)i(not)h(pro)o(viding)f(an)h(explicit)f(name,)g(in)g(whic)o(h)h(case)h +(the)g(section)f(tak)o(es)177 2735 y(the)e(name)f(of)g(the)h(\014rst)g(macro) +f(de\014ned)h(b)q(et)o(w)o(een)h(the)g(section)f(header)g(in)g(question)f +(and)h(the)g(follo)o(wing)d(section)177 2785 y(header.)18 b(An)12 +b(error)h(is)e(generated)i(if)e(a)g(section)h(has)g(not)f(b)q(een)i(giv)o(en) +e(an)h(explicit)f(name)f(and)h(do)q(es)i(not)e(con)o(tain)177 +2835 y(an)o(y)j(macro)e(de\014nitions.)18 b(Here)d(are)g(some)e(example)f +(headings:)1042 2940 y(34)p eop +%%Page: 35 36 +35 35 bop 177 42 a Fl(@A@<Feed)20 b(the)h(Penguins)g(and)g(Save)g(the)g +(World@>)177 91 y(@B@<Feed)f(the)h(Penguins@>)177 141 y(@C@<Feed)f(the)h +(little)g(penguins@>)177 191 y(@C@<Feed)f(the)h(big)h(penguins@>)177 +241 y(@B@<Save)e(the)h(World@>)177 291 y(@C@<Save)f(Europe@>)177 +340 y(@C@<Save)g(Africa@>)177 440 y(@C)i(This)f(heading)f(hasn't)g(been)h +(given)g(an)h(explicit)e(name,)g(but)i(will)f(inherit)f(the)177 +490 y(name)h(\\p{Save)f(the)i(rest)f(of)g(the)g(world})g(from)g(the)g(macro)g +(definition)e(below.)177 589 y(@$@<Save)h(the)h(rest)g(of)h(the)f +(world@>@Z==@{...@)o(})177 706 y Fr(The)16 b(feature)h(of)e(ha)o(ving)g +(unnamed)f(sections)j(inherit)f(the)g(name)f(of)g(the)h(\014rst)h(macro)e +(de\014ned)h(within)f(their)177 756 y(scop)q(e)f(is)f(presen)o(t)h(b)q +(ecause)g(a)f(common)c(st)o(yle)k(of)f(writing)g(in)g(F)m(unnelW)m(eb)h(is)f +(to)h(ha)o(v)o(e)f(one)h(section)g(p)q(er)h(macro)177 806 y(de\014nition.)26 +b(Because,)19 b(under)e(this)g(st)o(yle,)g(eac)o(h)g(section)g(describ)q(es)i +(a)d(single)h(macro,)e(it)i(usually)e(turns)j(out)177 855 y(that)12 +b(the)h(macro)e(name)g(mak)o(es)g(a)h(go)q(o)q(d)g(name)f(for)h(the)h +(section)g(to)q(o.)k(The)c(inheritance)g(mec)o(hanism)c(prev)o(en)o(ts)177 +905 y(duplication)k(of)g(the)i(name.)177 980 y(Apart)d(from)e(the)i +(requiremen)o(t)g(that)g(eac)o(h)g(section)g(ha)o(v)o(e)g(an)f(explicit)g(or) +h(implicit)d(name)i(and)g(that)h(its)g(sp)q(ecial)177 1030 +y(sequence)21 b(app)q(ear)e(at)f(the)h(start)g(of)f(a)g(line,)h(the)g(only)f +(other)h(restriction)g(on)g(section)g(headings)f(is)h(that)f(a)177 +1080 y(section)c(heading)e(at)h(lev)o(el)f Fn(n)h Fr(cannot)g(app)q(ear)g +(immediately)c(after)k(a)g(section)g(heading)g(at)g(lev)o(el)f +Fn(n)7 b Fq(\000)g Fr(1)13 b(or)g(less.)177 1129 y(In)k(other)g(w)o(ords,)f +(the)h(hierarc)o(h)o(y)g(cannot)g(b)q(e)g(brok)o(en.)26 b(F)m(or)16 +b(example,)f(an)h Fl(@C)g Fr(cannot)h(app)q(ear)f(after)h(an)f +Fl(@A)177 1179 y Fr(heading)e(unless)g(there)i(is)d(an)h(in)o(terv)o(ening)g +Fl(@B)f Fr(heading.)177 1296 y Fl(@A@<The)21 b(Top)g(Heading@>)177 +1346 y(@C@<Level)f(C)i(here)f(is)g(not)g(allowed)g(after)f(an)i(A)f(and)g +(will)g(cause)g(an)h(error@>)177 1462 y Fr(This)14 b(rule)g(extends)i(to)e +(the)h(start)f(of)g(the)g(\014le;)g(if)f(there)j(are)e(an)o(y)g(headings)g +(at)g(all,)e(the)j(\014rst)g(one)f(m)o(ust)f(b)q(e)i(an)177 +1512 y Fl(@A)f Fr(heading.)j(The)e(follo)o(wing)c(\014le,)i(while)h(short,)g +(is)f(in)h(error.)177 1628 y Fl(This)21 b(FunnelWeb)f(input)h(file)g(is)g(in) +h(error)e(because)h(its)g(first)g(section)f(heading)177 1678 +y(is)i(at)f(level)g(C)g(rather)g(than)g(level)g(A.)177 1728 +y(@C@<2@>)177 1869 y Fd(1.7.4)55 b(Understanding)19 b(the)f(Prin)n(ted)h(Do)r +(cumen)n(tation)177 1971 y Fr(T)o(yp)q(e)g(in)f(the)h(follo)o(wing)c(\014le,) +k(and)g(use)g(F)m(unnelW)m(eb)f(and)g(T)1173 1980 y(E)1196 +1971 y(X)g(to)h(generate)g(the)g(corresp)q(onding)g(prin)o(ted)177 +2021 y(do)q(cumen)o(tation.)177 2137 y Fl(@A@<Table)h(of)h(Contents@>)177 +2237 y(@t)h(table_of_conten)o(ts)177 2337 y(@A@<Macros)e(for)h(Moral)g +(Support@>)177 2436 y(The)g(following)f(macro)h(contain)f(comments)h(that)f +(provide)h(moral)g(support)f(in)h(the)177 2486 y(output)g(code.)177 +2586 y(@$@<Programmer's)e(Cheer@>@M==@{)177 2635 y(--)j(Shift)e(to)i(the)f +(left!)177 2685 y(--)h(Shift)e(to)i(the)f(right!)177 2735 y(--)h(Pop)f(up,)g +(push)g(down!)177 2785 y(--)h(Byte!)e(Byte!)h(Byte!)177 2835 +y(--)h(\(From)e("The)h(New)g(Hacker's)g(Dictionary"\).)1042 +2940 y Fr(35)p eop +%%Page: 36 37 +36 36 bop 177 42 a Fl(@})177 141 y(The)21 b(next)g(macro)g(is)g(similar)g +(but)g(is)g(distributed)f(throughout)g(the)h(program.)177 191 +y(@$@<Hacker's)e(Cheer@>+=@{@+--)g(Pointer)i(to)g(the)g(left@+@})177 +291 y(@A@<An)g(Extremely)f(Imperative)f(Stack)i(Abstraction@>)177 +390 y(@B@<Define)f(the)h(Stack@>)177 440 y(@$@<Hacker's)e(Cheer@>+=@{--)h +(Pointer)g(to)h(the)g(right@+@})177 490 y(@$@<Stack)f(Type@>@Z==@{type)f +(stack)h(=)i(record)e(...)i(end;@})177 589 y(@B@<Push)e(the)h(Stack@>)177 +639 y(@$@<Hacker's)e(Cheer@>+=@{--)h(Hack)h(that)g(code@+@})177 +689 y(@$@<Push)f(Procedure@>@Z==@{@-)177 739 y(procedure)g(push\(var)g +(b:stack;)g(v:value\);)g(@<Programmer's)f(Cheer@>)i({...}@})177 +839 y(@B@<Pop)g(the)g(Stack@>)177 888 y(@$@<Hacker's)e(Cheer@>+=@{--)h +(Tight!)g(Tight!)h(Tight!@+@})177 938 y(@$@<Pop)g(Procedure@>@Z==)o(@{@-)177 +988 y(procedure)f(pop\(var)g(b:stack\);)g(@<Programmer's)f(Cheer@>)i({...}@}) +177 1088 y(@B@<Rough)f(the)h(Stack)g(Up)g(a)h(Bit@>)177 1137 +y(@$@<Hacker's)d(Cheer@>+=@{--)h(\(RNW,)g(04-Jan-1991\).@+@})177 +1187 y(@$@<Rough)g(Procedure@>@Z==@{@)o(-)177 1237 y(procedure)g(rough\(var)g +(b:stack\);)g(@<Hacker's)g(Cheer@>)g({...}@})177 1337 y(@O@<dummy.txt@>==@)o +({dumm)o(y@+@})177 1525 y Fr(An)15 b(examination)e(of)h(the)i(prin)o(ted)f +(do)q(cumen)o(tation)f(rev)o(eals)i(a)f(lot)f(ab)q(out)h(ho)o(w)g(F)m(unnelW) +m(eb's)f(presen)o(tation)177 1574 y(w)o(orks.)177 1678 y(First,)f(notice)g +(ho)o(w)g(the)g Fl(@t)g Fr(t)o(yp)q(esetter)i(directiv)o(e)f(at)e(the)i(top)f +(of)f(the)h(\014le)g(has)g(caused)h(a)f(table)g(of)f(con)o(ten)o(ts)i(to)177 +1728 y(app)q(ear.)24 b(This)15 b(is)h(one)f(of)g(F)m(unnelW)m(eb's)g(t)o(yp)q +(esetting)i(features)f(and)g(is)f(discussed)j(in)d(a)g(later)h(section.)23 +b(The)177 1777 y(table)14 b(of)f(con)o(ten)o(ts)i(sho)o(ws)f(that)g(the)h +(sections)g(ha)o(v)o(e)f(b)q(een)h(n)o(um)o(b)q(ered)e(hierarc)o(hically)m(.) +177 1881 y(No)o(w)18 b(tak)o(e)h(a)f(lo)q(ok)g(at)g(the)h(t)o(yp)q(eset)i +(macro)c(de\014nitions.)32 b(Most)19 b(imp)q(ortan)o(t)e(are)i(the)g(n)o(um)o +(b)q(ers)f(in)g(square)177 1931 y(brac)o(k)o(ets)h(that)f(follo)o(w)e(eac)o +(h)i(macro)f(name.)28 b(As)19 b(w)o(ell)e(as)h(n)o(um)o(b)q(ering)e(the)i +(headings)g Fm(hier)n(ar)n(chic)n(al)r(ly)p Fr(,)f(F)m(un-)177 +1980 y(nelW)m(eb)e Fm(indep)n(endently)h Fr(n)o(um)o(b)q(ers)f(the)g(macro)f +(de\014nitions)h Fm(se)n(quential)r(ly)p Fr(.)21 b(The)16 b(\014rst)g(macro)d +(de\014nition)i(\(for)177 2030 y(\\Programmer's)h(Cheer"\))j(is)e(n)o(um)o(b) +q(ered)h(1.)30 b(The)19 b(second)g(\(for)e(\\Hac)o(k)o(er's)i(Cheer"\))g(is)f +(n)o(um)o(b)q(ered)f(2)h(and)177 2080 y(so)f(on.)27 b(Note)17 +b(that)g(it)f(is)h(not)f(macros)g(that)h(are)g(n)o(um)o(b)q(ered,)g(but)g +(macro)f(de\014nitions.)26 b(The)18 b(distinction)e(is)177 +2130 y(necessary)e(b)q(ecause)g(some)d(macros)g(\(suc)o(h)i(as)f(the)h(\\Hac) +o(k)o(er's)f(Cheer")h(macro\))e(are)h(additiv)o(e.)17 b(It)12 +b(is)g(imp)q(ortan)o(t)177 2180 y(to)k(realize)g(that)f(there)i(is)f(no)f +(relationship)g(b)q(et)o(w)o(een)i(the)f(n)o(um)o(b)q(ers)g(of)f(the)h +(headings)f(and)h(the)g(n)o(um)o(b)q(ers)f(of)177 2229 y(the)g(macro)d +(de\014nitions.)177 2333 y(No)o(w)h(tak)o(e)g(a)f(lo)q(ok)g(at)h(the)g(notes) +h(b)q(eneath)f(the)h(b)q(o)q(dy)f(of)f(eac)o(h)h(macro)f(de\014nition.)17 +b(All)12 b(macro)g(de\014nitions)g(are)177 2383 y(follo)o(w)o(ed)i(b)o(y)i(a) +f(note)h(indicating)e(the)j(de\014nitions)e(in)g(whic)o(h)h(the)g(macro)e(is) +i(called.)23 b(Additiv)o(e)15 b(macros)g(ha)o(v)o(e)177 2432 +y(an)f(additional)e(list,)h(listing)g(the)h(de\014nitions)g(in)f(whic)o(h)h +(they)h(are)f(de\014ned.)177 2536 y(Finally)m(,)20 b(tak)o(e)g(a)g(lo)q(ok)f +(at)i(the)g(macro)e Fm(c)n(al)r(l)h Fr(of)f(\\Programmer's)f(Cheer")j(in)f +(section)h(3.2)f(of)f(the)i(prin)o(ted)177 2586 y(do)q(cumen)o(tation.)d +(Macro)d(calls)f(are)g(set)h(in)f(slan)o(ted)h(roman)d(\(so)j(that)f(they)h +(can)g(b)q(e)f(distinguished)h(from)d(the)177 2635 y Fl(tt)22 +b(font)13 b Fr(co)q(de\))j(and)e(are)h(follo)o(w)o(ed)e(b)o(y)h(the)h(n)o(um) +o(b)q(er)f(of)g(the)h(de\014ning)g(macro)e(de\014nition.)20 +b(In)14 b(this)h(case,)g(the)177 2685 y(macro)d(w)o(as)h(de\014ned)h(in)e +(de\014nition)h(1.)k(F)m(urther)d(do)o(wn,)e(the)i(call)e(to)h(the)h(\\Hac)o +(k)o(er's)f(Cheer")h(macro)d(indicates)177 2735 y(that)h(the)h(macro)e(w)o +(as)h(de\014ned)h(in)f(de\014nition)f(2.)18 b(In)12 b(fact)g(the)g(macro)f +(is)h(additiv)o(e)g(and)f(de\014nition)h(2)g(is)g(just)g(the)177 +2785 y(\014rst)g(of)e(man)o(y)f(de\014nitions.)17 b(T)m(o)10 +b(list)h(all)f(de\014nitions)g(in)h(a)f(call)h(to)f(an)h(additiv)o(e)f(macro) +g(w)o(ould)g(b)q(e)i(unnecessarily)177 2835 y(messy)m(.)1042 +2940 y(36)p eop +%%Page: 37 38 +37 37 bop 177 42 a Fd(1.7.5)55 b(Literals)17 b(and)j(Emphasis)177 +144 y Fr(When)d(writing)f(ab)q(out)h(program)e(co)q(de,)j(it)f(is)g(often)g +(desirable)g(to)g(b)q(e)g(able)g(to)g(indicate)f(that)h(a)g(particular)177 +194 y(w)o(ord)11 b(or)g(phrase)h(b)q(e)g(t)o(yp)q(eset)h(in)d(the)i(same)e +(manner)g(as)h(the)h(co)q(de)g(b)q(eing)f(discussed.)19 b(F)m(or)11 +b(example,)f(one)h(migh)o(t)177 244 y(talk)16 b(ab)q(out)h(the)g(v)n(ariable) +e Fl(topval)h Fr(or)g(the)i(pro)q(cedure)g Fl(stack)p 1202 +244 14 2 v 15 w(pop)e Fr(and)g(wish)h(for)f(them)g(to)g(b)q(e)i(t)o(yp)q +(eset)g(as)177 294 y(they)d(are)f(in)f(this)i(sen)o(tence.)20 +b(This,)13 b(of)h(course,)h(is)e(simple)g(to)h(do)f(using)h(T)1355 +302 y(E)1378 294 y(X)g(macros,)f(but)h(use)h(of)e(the)i(\(more)177 +343 y(general\))h(F)m(unnelW)m(eb)f(t)o(yp)q(esetting)h(directiv)o(es)g(to)g +(do)f(the)h(same)e(w)o(ork)h(has)h(the)g(added)f(b)q(ene\014t)i(of)e(k)o +(eeping)177 393 y(the)g(do)q(cumen)o(t)e(p)q(ortable)h(to)g(other)g(t)o(yp)q +(esetters.)177 469 y(F)m(unnelW)m(eb)g(pro)o(vides)h(t)o(w)o(o)f(in-text)g(t) +o(yp)q(e)h(mo)q(di\014cation)e(constructs:)21 b Fl(@)p Fq(f)p +Fl(...@)p Fq(g)13 b Fr(and)h Fl(@/...@/)f Fr(where)j Fn(:)7 +b(:)g(:)13 b Fr(is)177 518 y(ra)o(w)i(text.)20 b(The)15 b Fl(@)p +Fq(f)p Fl(...@)p Fq(g)e Fr(construct)j(sets)g(the)g(enclosed)f(text)g(in)f +(the)i(same)d(manner)h(as)h(the)g(text)g(of)f(macro)177 568 +y(de\014nitions)c(is)g(set.)18 b(The)11 b Fl(@/...@/)d Fr(construct)k +(emphasises)e(its)h(enclosed)g(text)g(in)e(some)h(t)o(yp)q(esetter-dep)q +(ende)q(n)o(t)177 618 y(fashion.)17 b(T)o(ypically)c(the)h(emphasised)g(text) +g(is)g(set)h(in)e(italics.)177 693 y(Here)i(is)f(an)g(example)e(of)i(ho)o(w)f +(these)i(constructs)h(migh)o(t)c(b)q(e)j(used:)177 812 y Fl(The)21 +b(following)f(procedure)g(@{put_sloth@})f(writes)i(the)g(@{sloth@})f +(variable)g(to)177 861 y(the)h(output)g(file.)g(Note:)f(@/The)h(output)g +(file)g(must)g(be)g(opened)g(for)g(writing)177 911 y(at)h(this)f(point)f(or)i +(the)f(program)f(will)h(crash!@/)177 1055 y Fd(1.7.6)55 b(Adding)19 +b(a)g(Header)f(P)n(age)177 1157 y Fr(F)m(unnelW)m(eb)h(pro)o(vides)h(a)f(few) +h(t)o(yp)q(esetter-indep)q(enden)o(t)j(t)o(yp)q(esetting)e(constructs)g(whic) +o(h)f(are)g(sp)q(eci\014cally)177 1207 y(designed)14 b(for)f(the)g +(construction)i(of)d(header)i(pages.)k(These)d(constructs)g(are)e(usually)g +(b)q(est)h(placed)f(at)g(the)h(top)177 1257 y(of)e(y)o(our)f(input)h(\014le,) +g(but)h(can)f(b)q(e)h(placed)f(an)o(ywhere)h(the)f(do)q(cumen)o(t)g(if)f +(desired)i(to)f(create)i(header)f(pages)f(righ)o(t)177 1307 +y(through.)24 b(The)16 b(t)o(w)o(o)f(main)f(restrictions)j(on)e(these)i +(constructs)h(is)e(that)g(the)g Fl(@t)f Fr(m)o(ust)g(start)h(at)g(the)g +(start)g(of)177 1356 y(a)h(line)f(\(whic)o(h)h(cannot)g(con)o(tain)f(commen)o +(ts\),)f(and)i(that)g(the)g(constructs)i(cannot)e(app)q(ear)g(inside)g(a)f +(macro)177 1406 y(de\014nition.)i(Here)d(is)f(what)f(the)i(top)f(of)f(an)h +(input)f(\014le)h(migh)o(t)e(lo)q(ok)h(lik)o(e:)177 1524 y +Fl(@t)22 b(vskip)e(40)i(mm)177 1574 y(@t)g(title)e(titlefont)g(centre)h +("Hairy)f(Wombat")177 1624 y(@t)i(title)e(titlefont)g(centre)h("Simulation") +177 1674 y(@t)h(vskip)e(10)i(mm)177 1723 y(@t)g(title)e(smalltitlefont)f +(centre)i("A)g(Program)f(in)i(Six)f(Parts")177 1773 y(@t)h(title)e +(smalltitlefont)f(centre)i("Simulating)e(the)i(Life)g(of)h(Some)f(Hairy)g +(Wombats")177 1823 y(@t)h(vskip)e(20)i(mm)177 1873 y(@t)g(title)e(normalfont) +g(left)h("By)g(Zqitzypbuswapzra)e(Ypongtatoslrtzz")177 1923 +y(@t)j(new_page)177 1973 y(@t)g(table_of_conten)o(ts)177 2022 +y(@t)g(new_page)177 2140 y Fr(The)14 b Fl(@t)e Fr(at)h(the)h(start)g(of)e +(eac)o(h)i(line)e(indicates)i(that)f(eac)o(h)g(en)o(tire)h(line)f(is)g(a)g(t) +o(yp)q(esetter)i(directiv)o(e.)j(The)c Fl(vskip)177 2190 y +Fr(directiv)o(e)i(instructs)h(F)m(unnelW)m(eb)e(to)h(skip)f(some)g(v)o +(ertical)g(space)i(\(measured)f(in)f(milli)o(m)o(etres\).)22 +b(The)16 b Fl(title)177 2240 y Fr(directiv)o(e)f(instructs)h(F)m(unnelW)m(eb) +e(to)h(p)q(osition)f(a)g(string)g(of)g(text)i(on)e(a)g(single)g(line)g(of)g +(its)h(o)o(wn.)20 b(Options)14 b(are)177 2290 y(pro)o(vided)i(for)g(fon)o(t)f +(and)h(alignmen)o(t.)23 b(The)16 b(\014rst)h(w)o(ord)f(after)g +Fl(title)f Fr(is)h(the)h(fon)o(t)e(whic)o(h)h(can)h(b)q(e)f(one)h(of)e(\(in) +177 2340 y(decreasing)j(order)f(of)e(size\))j Fl(titlefont)p +Fr(,)c Fl(smalltitlefont)p Fr(,)g(and)i Fl(normalfont)p Fr(.)23 +b(The)17 b(second)g(w)o(ord)g(after)177 2389 y Fl(title)d Fr(is)i(the)g +(desired)g(alignmen)o(t)d(of)i(the)h(text.)23 b(The)16 b(options)f(here)h +(are)g Fl(left)p Fr(,)f Fl(right)p Fr(,)f(and)h Fl(centre)p +Fr(.)21 b(The)177 2439 y Fl(new)p 246 2439 V 15 w(page)16 b +Fr(directiv)o(e)g(instructs)i(F)m(unnelW)m(eb)d(to)h(skip)g(to)g(a)g(new)h +(page.)25 b(Finally)m(,)14 b(the)j Fl(table)p 1704 2439 V 14 +w(of)p 1762 2439 V 15 w(contents)177 2489 y Fr(directiv)o(e)e(instructs)g(F)m +(unnelW)m(eb)e(to)h(insert)h(a)e(table)h(of)f(con)o(ten)o(ts)i(at)f(that)g(p) +q(oin)o(t)f(in)h(the)g(text.)177 2632 y Fd(1.7.7)55 b(Commen)n(ts)177 +2735 y Fr(A)14 b(F)m(unnelW)m(eb)g(commen)o(t)d(commences)i(with)h(the)h +Fl(@!)j Fr(sequence)e(and)d(con)o(tin)o(ues)i(up)f(to,)f(but)h(not)g +(including,)177 2785 y(the)h(end)f(of)g(line)g(mark)o(er)f(at)h(the)g(end)h +(of)e(the)i(line)f(that)g(the)h(commen)o(t)c(sequence)17 b(is)d(on.)k(Commen) +o(ts)12 b(can)i(b)q(e)177 2835 y(placed)g(on)g(an)o(y)f(line)h(except)h +Fl(@i)f Fr(include,)f Fl(@p)g Fr(pragma,)f(and)i Fl(@t)f Fr(t)o(yp)q(esetter) +j(directiv)o(e)f(lines.)1042 2940 y(37)p eop +%%Page: 38 39 +38 38 bop 177 42 a Fr(The)17 b(text)f(follo)o(wing)e(the)j(F)m(unnelW)m(eb)e +(commen)o(t)f(sequence)k Fl(@!)25 b Fr(will)15 b(not)h(app)q(ear)g(in)g(the)g +(pro)q(duct)h(\014les)g(or)177 91 y(the)c(do)q(cumen)o(tation)e(\014le.)17 +b(It)12 b(is)g(only)g(for)f(the)i(ey)o(es)g(of)f(those)h(who)e(b)q(other)i +(to)f(lo)q(ok)g(at)g(the)g(original)f Fl(.fw)g Fr(input)177 +141 y(\014le.)18 b(T)o(ypically)12 b(F)m(unnelW)m(eb)i(commen)o(ts)e(are)i +(used)h(to)e(describ)q(e)j(the)e(w)o(a)o(y)g(in)f(whic)o(h)h(particular)f(F)m +(unnelW)m(eb)177 191 y(constructs)j(are)e(b)q(eing)g(used.)19 +b(Example:)177 304 y Fl(@!)j(This)f(macro)f(is)i(really)e(revolting.)g +(Please)g(forgive)h(me.)g(I)h(had)f(to)g(do)h(it!)177 354 y(@$@<Revolt)e +(Me@>==@{@-)177 404 y(@#X@\(@#Y@\(@#Z@,@"@)o(#Z@"@)o(\)=6@,)o(Teapo)o(t@,@")o +(@#Q@)o(\(45@\))o(@"@,T)o(iger@)o(\)@})177 564 y Fi(1.8)70 +b(A)23 b(Complete)d(Example)177 679 y Fr(T)m(o)c(\014nish)h(o\013)f(the)h(c)o +(hapter,)h(a)e(complete)g(example)f(of)h(a)h(F)m(unnelW)m(eb)f(input)g +(\014le)h(is)f(presen)o(ted.)28 b(Although)177 729 y(unrealistically)13 +b(short,)h(it)f(giv)o(es)h(a)g(b)q(etter)h(idea)f(of)f(what)h(a)f(t)o(ypical) +g(F)m(unnelW)m(eb)h Fl(.fw)f Fr(\014le)h(lo)q(oks)f(lik)o(e.)177 +842 y Fl(@!----------------)o(-----)o(-----)o(-----)o(-----)o(---!)177 +892 y(@!)43 b(Start)21 b(of)g(FunnelWeb)f(Example)h(.fw)g(File)43 +b(!)177 942 y(@!----------------)o(-----)o(-----)o(-----)o(-----)o(---!)177 +1041 y(@t)22 b(vskip)e(40)i(mm)177 1091 y(@t)g(title)e(titlefont)g(centre)h +("Powers:")177 1141 y(@t)h(title)e(titlefont)g(centre)h("An)g(Example)f(of") +177 1191 y(@t)i(title)e(titlefont)g(centre)h("A)g(Short")177 +1241 y(@t)h(title)e(titlefont)g(centre)h("FunnelWeb)f(.fw)h(File")177 +1290 y(@t)h(vskip)e(10)i(mm)177 1340 y(@t)g(title)e(smalltitlefont)f(centre)i +("by)g(Ross)g(Williams")177 1390 y(@t)h(title)e(smalltitlefont)f(centre)i +("26)g(January)f(1992")177 1440 y(@t)i(vskip)e(20)i(mm)177 +1490 y(@t)g(table_of_conten)o(ts)177 1589 y(@A@<FunnelWeb)d(Example)i +(Program@>)177 1689 y(This)43 b(program)20 b(writes)43 b(out)21 +b(each)43 b(of)21 b(the)43 b(first)21 b(@{p@})42 b(powers)21 +b(of)43 b(the)21 b(first)43 b(@{n@})177 1739 y(integers.)20 +b(These)43 b(constant)20 b(parameters)g(are)h(located)42 b(here)21 +b(so)g(that)g(they)43 b(are)21 b(easy)g(to)177 1789 y(change.)177 +1888 y(@$@<Constants@>==@)o({@-)177 1938 y(n)h(:)f(constant)f(natural)h(:=)g +(10;)109 b(--)21 b(How)g(many)g(numbers?)f(\(Ans:)h([1,n]\).)177 +1988 y(p)h(:)f(constant)f(natural)h(:=)43 b(5;)109 b(--)21 +b(How)g(many)g(powers?)42 b(\(Ans:)21 b([1,p]\).@})177 2087 +y(@B)h(Here)f(is)43 b(the)21 b(outline)f(of)i(the)43 b(program.)20 +b(This)h(FunnelWeb)f(file)42 b(generates)20 b(a)i(single)177 +2137 y(Ada)f(output)g(file)43 b(called)20 b(@{Power.ada@}.)f(The)i(main)g +(program)g(consists)42 b(of)21 b(a)g(loop)g(that)177 2187 y(iterates)f(once)h +(for)g(each)g(number)g(to)g(be)h(written)e(out.)177 2287 y +(@O@<Power.ada@>==@)o({@-)177 2337 y(@<Pull)h(in)g(packages@>)177 +2436 y(procedure)f(example)g(is)243 2486 y(@<Constants@>)177 +2536 y(begin)h(--)g(example)243 2586 y(for)g(i)g(in)h(1..n)f(loop)308 +2635 y(@<Write)f(out)h(the)h(first)e(p)i(powers)f(of)g(i)g(on)h(a)f(single)g +(line@>)243 2685 y(end)g(loop;)177 2735 y(end)g(example;)177 +2785 y(@})1042 2940 y Fr(38)p eop +%%Page: 39 40 +39 39 bop 177 42 a Fl(@B)22 b(In)f(this)g(section,)42 b(we)21 +b(pull)g(in)h(the)f(packages)f(that)h(this)g(program)42 b(needs)21 +b(to)g(run.)g(In)177 91 y(fact,)g(all)g(we)g(need)g(is)h(the)f(IO)g(package)g +(so)g(that)g(we)g(can)h(write)e(out)i(the)f(results.)f(To)h(use)177 +141 y(the)g(IO)h(package,)e(we)h(first)g(of)g(all)h(need)42 +b(to)22 b(haul)f(it)g(in)g(\(@{with)g(text_io@}\))e(and)j(then)177 +191 y(we)g(need)f(to)g(make)g(all)g(its)g(identifiers)f(visible)g(at)h(the)h +(top)f(level)g(\(@{use)f(text_io@}\).)177 291 y(@$@<Pull)g(in)i +(packages@>==@{wi)o(th)d(text_io;)h(use)h(text_io;@})177 390 +y(@B)h(Here)f(is)43 b(the)21 b(bit)g(that)g(writes)g(out)43 +b(the)21 b(first)f(@{p@})h(powers)g(of)43 b(@{i@}.)20 b(The)i(power)177 +440 y(values)43 b(are)f(calculated)g(incrementally)f(in)i(@{ip@})f(to)i +(avoid)e(the)h(use)g(of)g(the)177 490 y(exponentiation)19 b(operator.)177 +589 y(@$@<Write)h(out)h(the)g(first)g(p)h(powers)e(of)i(i)f(on)h(a)f(single)g +(line@>==@{@-)177 639 y(declare)243 689 y(ip)g(:)h(natural)e(:=)h(1;)177 +739 y(begin)243 789 y(for)g(power)f(in)i(1..p)f(loop)308 839 +y(ip:=ip*i;)308 888 y(put\(natural'image)o(\(ip\))d(&)k(")g("\);)243 +938 y(end)f(loop;)243 988 y(new_line;)177 1038 y(end;@})177 +1137 y(@!----------------)o(-----)o(-----)o(-----)o(-----)o(---!)177 +1187 y(@!)65 b(End)21 b(of)h(FunnelWeb)e(Example)g(.fw)h(File)65 +b(!)177 1237 y(@!----------------)o(-----)o(-----)o(-----)o(-----)o(---!)177 +1399 y Fi(1.9)70 b(Summary)177 1515 y Fr(This)17 b(c)o(hapter)h(has)f(pro)o +(vided)g(an)g(in)o(tro)q(duction)g(to)g(F)m(unnelW)m(eb)f(and)h(a)g(tutorial) +f(that)i(co)o(v)o(ers)f(most)f(of)h(its)177 1565 y(features.)h(F)m(unnelW)m +(eb's)11 b(functionalit)o(y)f(can)h(b)q(e)h(split)f(in)o(to)g(t)o(w)o(o)g +(parts:)17 b(a)11 b(macro)f(prepro)q(cessor,)k(and)d(supp)q(ort)177 +1615 y(for)h(t)o(yp)q(esetting.)18 b(The)13 b(reader)g(should)f(b)q(e)g(a)o +(w)o(are)g(that)g(the)h(examples)e(in)g(this)h(c)o(hapter,)h(constructed)h +(as)e(they)177 1664 y(w)o(ere)h(to)e(demonstrate)g(particular)g(features)i +(of)e(F)m(unnelW)m(eb,)g(do)g(not)g(presen)o(t)i(a)e(realistic)h(picture)g +(of)f(the)h(b)q(est)177 1714 y(use)j(of)f(the)h(to)q(ol.)k(Only)14 +b(the)h(\014nal)f(example)f(of)h(this)h(c)o(hapter)g(comes)f(close.)20 +b(The)15 b(reader)h(should)e(study)h(this)177 1764 y(last)g(example)f +(carefully)h(and)g(then)h(write)f(some)f(real)h(programs)f(using)h(F)m +(unnelW)m(eb)g(b)q(efore)h(pro)q(ceeding)g(to)177 1814 y(Chapter)c(2)f(whic)o +(h)g(pro)o(vides)g(more)f(adv)n(anced)h(information.)k(A)o(t)c(this)g(stage)h +(it)e(do)q(es)i(not)f(particularly)f(matter)177 1864 y(exactly)i(ho)o(w)e(y)o +(ou)h(use)h(F)m(unnelw)o(eb,)g(as)f(ev)o(ery)o(one)h(dev)o(elops)g(their)f(o) +o(wn)g(st)o(yle)h(an)o(yw)o(a)o(y)m(.)j(The)d(imp)q(ortan)o(t)d(thing)177 +1914 y(is)14 b(to)g(try)g(it.)1042 2940 y(39)p eop +%%Page: 40 41 +40 40 bop 1042 2940 a Fr(40)p eop +%%Page: 41 42 +41 41 bop 177 373 a Fj(Chapter)34 b(2)177 602 y Fp(F)-10 b(unnelW)g(eb)41 +b(Hin)m(ts)177 838 y Fr(Whereas)12 b(Chapter)f(1)g(pro)o(vides)g(an)f(in)o +(tro)q(duction)h(to)g(F)m(unnelW)m(eb)f(and)g(Chapter)i(3)e(a)h +(de\014nition,)f Fm(this)h Fr(c)o(hapter)177 888 y(con)o(tains)i(hin)o(ts)g +(ab)q(out)f(ho)o(w)g(F)m(unnelW)m(eb)h(can)g(b)q(e)g(used.)19 +b(This)12 b(c)o(hapter)i(probably)e(should)g(not)h(b)q(e)g(read)h(un)o(til) +177 938 y(the)j(reader)g(has)f(already)g(commenced)f(using)h(F)m(unnelW)m +(eb,)g(or)g(at)f(the)i(v)o(ery)g(least,)f(tried)g(out)g(some)g(of)f(the)177 +987 y(examples)f(in)h(Chapter)h(1.)21 b(Those)15 b(who)g(\014nd)g(themselv)o +(es)h(using)e(F)m(unnelW)m(eb)h(frequen)o(tly)g(should)g(read)h(this)177 +1037 y(c)o(hapter)f(at)f(some)f(stage)h(so)g(as)g(to)g(ensure)h(that)f(they)h +(are)f(getting)g(the)g(most)f(out)h(of)f(it.)177 1108 y(Most)19 +b(of)f(the)h(examples)f(in)g(this)h(c)o(hapter)h(ha)o(v)o(e)e(b)q(een)i +(placed)f(in)f(the)h(F)m(unnelW)m(eb)g(regression)h(test)f(suite)177 +1157 y(whic)o(h)14 b(should)g(b)q(e)g(a)o(v)n(ailable)e(in)h(a)h(directory)g +(called)g Fl(/fwdir/tests/)p Fr(.)h(The)f(\014les)h(to)e(examine)g(are)h +Fl(hi01.fw)177 1207 y Fr(through)g Fl(hi10.fw)p Fr(.)177 1363 +y Fi(2.1)70 b(Macro)24 b(Names)177 1475 y Fr(When)17 b(using)f(F)m(unnelW)m +(eb,)g(the)h(c)o(hoice)g(of)f(macro)f(names)h(can)g(b)q(e)h(as)g(imp)q(ortan) +o(t)e(to)h(the)h(readabilit)o(y)e(of)h(a)177 1525 y(program)d(as)h(the)h(c)o +(hoice)g(of)f(program)f(iden)o(ti\014ers,)h(and)g(it)g(is)h(imp)q(ortan)o(t)d +(that)j(the)g(user)g(kno)o(w)f(the)h(range)f(of)177 1574 y(options)g(a)o(v)n +(ailable.)295 1645 y Fo(Names)i(are)f(case)h(sensitiv)o(e)d(and)i(exact)g +(matc)o(hing:)i Fr(Macro)c(names)g(are)h(case)h(sensitiv)o(e)295 +1695 y(and)e(are)f(matc)o(hed)g(exactly)m(.)17 b(The)c(strings)g(used)g(as)g +(a)f(macro)f(name)g(at)h(the)h(p)q(oin)o(t)f(of)g(de\014nition)295 +1744 y(and)i(call)f(m)o(ust)g(b)q(e)h Fm(identic)n(al)g Fr(for)g(the)g +(connection)h(to)e(b)q(e)i(made.)295 1815 y Fo(Names)e(can)f(con)o(tain)f(an) +o(y)h(prin)o(tabl)o(e)e(c)o(haracter:)16 b Fr(F)m(unnelW)m(eb)10 +b(is)h(less)h(restrictiv)o(e)g(ab)q(out)295 1865 y(its)19 b(macro)d(names)i +(than)g(most)f(programming)e(languages)i(are)i(ab)q(out)f(their)h(iden)o +(ti\014ers.)32 b(A)295 1914 y(F)m(unnelW)m(eb)15 b(macro)e(name)h(can)h(con)o +(tain)g(an)o(y)f(sequence)j(of)e(prin)o(table)f(c)o(haracters,)j(including) +295 1964 y(blanks)12 b(and)f(punctuation.)18 b(Names)11 b(can)h(start)g(and)g +(end)g(with)f(an)o(y)h(c)o(haracter.)18 b(Names)11 b(cannot)295 +2014 y(cross)k(line)f(b)q(oundaries.)k(The)d(follo)o(wing)c(are)j(all)f +(legal)g(macro)f(names:)352 2115 y Fl(@<This)20 b(macro)h(expands)f(to)i +(some)f(really)f(bad)h(code@>)352 2165 y(@<@>)352 2215 y(@<453)f(#$)i(\045&#) +f(--===~~1">>>@>)352 2265 y(@<<@>)352 2314 y(@<<>@>)352 2364 +y(@<a)g(b)g(c)h(d)f(e)h(f)g(g@>)352 2414 y(@<)152 b(!)108 b(@>)352 +2464 y(@<??)20 b(...@>)352 2514 y(@<"Who's)g(been)h(hacking)f(MY)h(program")f +(said)h(Father)g(Bear.@>)352 2564 y(@<Update)f(the)h(maximum)f(and)h(return)g +(for)g(more)g(data@>)295 2665 y Fo(Names)16 b(m)o(ust)d(b)q(e)i(no)g(more)f +(than)g(a)i(maxim)o(um)d(limit)g(in)h(length:)i Fr(Names)c(can)i(b)q(e)g(no) +295 2714 y(longer)e(than)h(a)f(prede\014ned)i(maxim)o(um)8 +b(length.)17 b(Curren)o(tly)c(this)f(length)h(cannot)f(b)q(e)i(mo)q +(di\014ed.)177 2785 y(T)o(ypically)m(,)8 b(macro)h(names)g(will)f(consist)j +(of)e(a)h(short)g(English)g(phrase)g(or)g(sen)o(tence)i(that)e(describ)q(es)i +(the)f(con)o(ten)o(ts)177 2835 y(of)i(the)i(macro.)1042 2940 +y(41)p eop +%%Page: 42 43 +42 42 bop 177 42 a Fi(2.2)70 b(Quic)n(k)22 b(Names)177 157 +y Fr(Sometimes)14 b(a)i(particular)g(macro)g(m)o(ust)f(b)q(e)i(used)g +(extremely)f(often.)25 b(When)17 b(this)f(happ)q(ens)h(it)f(is)g(desirable) +177 207 y(to)e(mak)o(e)f(the)i(macro's)e(name)g(as)h(short)h(as)f(p)q +(ossible.)20 b(The)15 b(shortest)g(ordinary)f(F)m(unnelW)m(eb)g(macro)f(name) +g(is)177 257 y(the)h(empt)o(y)f(name)g(\\)p Fl(@<@>)p Fr(",)f(whic)o(h)h(is)h +(four)f(c)o(haracters)j(long.)h(Single-c)o(haracter)d(names)f(are)h(\014v)o +(e)g(c)o(haracters)177 307 y(long.)177 381 y(T)m(o)h(cater)i(for)e(the)h +(cases)h(where)g(really)e(short)h(names)f(are)h(needed,)h(F)m(unnelW)m(eb)e +(pro)o(vides)h(a)f Fo(quic)o(k)i(name)177 431 y Fr(syn)o(tax)c(that)h(allo)o +(ws)e(one-c)o(haracter)i(macro)e(names)h(to)g(b)q(e)h(sp)q(eci\014ed)g(in)f +(t)o(w)o(o)g(less)h(c)o(haracters.)19 b(Quic)o(k)14 b(names)177 +481 y(tak)o(e)20 b(the)h(form)d(of)i(the)h(sp)q(ecial)f(c)o(haracter,)i +(follo)o(w)o(ed)d(b)o(y)h(a)g(hash)g(\()p Fl(#)p Fr(\))g(follo)o(w)o(ed)e(b)o +(y)i(a)g(single)g(c)o(haracter.)177 531 y(Examples:)177 647 +y Fl(@#A)109 b(@#|)f(@#&)g(@#m)177 763 y Fr(This)17 b(form)d(of)i(macro)f +(name)h(has)g(the)h(same)f(syn)o(tactic)h(functionalit)o(y)e(as)i(an)f +(ordinary)g(name)f(and)h(can)h(b)q(e)177 813 y(substituted)g(wherev)o(er)g +(an)f(ordinary)f(name)g(can)g(b)q(e.)24 b(In)16 b(fact)g(quic)o(k)f(names)g +(liv)o(e)g(in)g(the)h(same)f(namespace)177 863 y(as)g(ordinary)g(macro)e +(names.)21 b(F)m(or)15 b(example)e(the)j(quic)o(kname)d Fl(@#A)i +Fr(is)f(the)i Fm(same)g(name)g Fr(\(refers)g(to)f(the)h(same)177 +913 y(macro\))d(as)h(the)g(ordinary)g(name)f Fl(@<A@>)p Fr(.)177 +988 y(Because)g(quic)o(k)d(names)g(lo)q(ok)g(syn)o(tactically)g(\\op)q(en")h +(\(i.e.)f(they)h(do)g(not)f(ha)o(v)o(e)h(a)g(closing)p Fl(@>)e +Fr(as)i(ordinary)g(names)177 1037 y(do\),)i(it)h(is)g(b)q(est)h(to)f(a)o(v)o +(oid)e(them)h(except)i(where)g(a)f(macro)f(m)o(ust)g(b)q(e)h(called)g(v)o +(ery)g(often.)177 1200 y Fi(2.3)70 b(F)-6 b(unnelW)g(eb)22 +b(the)h(Martinet)177 1315 y Fr(There)13 b(are)g(man)o(y)d(w)o(a)o(ys)i(in)g +(whic)o(h)g(a)g(macro)f(prepro)q(cessor)j(can)f(cause)g(unexp)q(ected)h +(di\016culties.)j(F)m(unnelW)m(eb)177 1365 y(seeks)g(to)d(a)o(v)o(oid)g(man)o +(y)f(of)h(these)j(problems)d(b)o(y)g(p)q(erforming)g(a)g(n)o(um)o(b)q(er)g +(of)h(c)o(hec)o(ks.)22 b(This)15 b(section)h(describ)q(es)177 +1415 y(some)d(of)g(the)i(c)o(hec)o(ks)g(that)f(F)m(unnelW)m(eb)f(p)q +(erforms.)295 1490 y Fo(T)l(railing)h(blanks)h(in)g(the)h(input)e(\014le:)k +Fr(T)m(railing)12 b(blanks)i(are)h(usually)f(not)g(dangerous,)g(but)295 +1540 y(F)m(unnelW)m(eb)19 b(disallo)o(ws)e(them)i(an)o(yw)o(a)o(y)m(.)31 +b(All)18 b(trailing)g(blanks)g(in)h(the)g Fm(input)h Fr(\()p +Fl(.fw)e Fr(\014le\))h(are)295 1589 y(\015agged)d(as)h(errors)g(b)o(y)f(F)m +(unnelW)m(eb.)25 b(F)m(unnelW)m(eb)15 b(do)q(es)i(not)f(\015ag)g(trailing)f +(blanks)h(in)g(an)o(y)f(of)295 1639 y(its)f(output)g(\014les.)295 +1714 y Fo(Input)19 b(line)f(length:)24 b Fr(F)m(unnelW)m(eb)17 +b(has)g(a)h(maxim)n(um)13 b(input)18 b(line)f(length.)29 b(If)17 +b(F)m(unnelW)m(eb)295 1764 y(reads)h(an)e(input)h(line)f(longer)g(than)h +(this)f(length,)h(it)f(\015ags)h(the)g(line)f(with)g(an)h(error)g(message.) +295 1813 y(The)e(maxim)n(um)9 b(length)14 b(can)g(b)q(e)h(c)o(hanged)f(using) +g(a)f(pragma)f(\(see)k(Chapter)e(3\).)295 1888 y Fo(Pro)q(duct)k(\014le)h +(line)f(length:)23 b Fr(F)m(unnelW)m(eb)16 b(w)o(atc)o(hes)i(the)g(length)g +(of)e(output)i(lines)f(and)g(all)295 1938 y(output)h(lines)f(longer)g(than)h +(the)g(limit)c(are)k(\015agged)f(with)g(error)h(messages.)29 +b(The)18 b(maxim)n(um)295 1988 y(length)h(can)g(b)q(e)g(c)o(hanged)h(using)e +(a)h(pragma)d(\(see)21 b(Chapter)e(3\).)33 b(That)18 b(F)m(unnelW)m(eb)g(p)q +(olices)295 2038 y(output)c(lines)f(is)h(v)o(ery)f(imp)q(ortan)o(t.)j(Some)d +(programs)f(can)i(b)q(eha)o(v)o(e)f(v)o(ery)h(strangely)g(if)e(they)i(get)295 +2087 y(an)i(input)g(line)g(that)g(is)h(to)q(o)f(long)f(\(e.g.)h(F)m(ortran)g +(compilers)f(can)h(simply)f(ignore)h(text)g(past)h(a)295 2137 +y(certain)e(column!\))i(and)d(once)h(F)m(unnelW)m(eb)e(starts)i(expanding)f +(macros)f(using)h(inden)o(tation,)f(it)295 2187 y(is)h(sometimes)e(not)i(ob)o +(vious)f(ho)o(w)h(wide)f(the)i(pro)q(duct)g(\014le)f(will)e(b)q(e.)295 +2262 y Fo(Con)o(trol)j(c)o(haracters:)20 b Fr(The)c(presence)h(of)e(con)o +(trol)g(c)o(haracters)i(in)d(a)h(text)h(\014le)f(can)g(result)h(in)295 +2312 y(some)11 b(confusing)g(b)q(eha)o(viour)h(do)o(wnstream)f(when)h(the)g +(\014le)g(is)f(presen)o(ted)j(to)d(v)n(arious)g(programs.)295 +2361 y(Unfortunately)m(,)i(some)f(text)i(editors)g(allo)o(w)e(con)o(trol)h(c) +o(haracters)i(to)f(b)q(e)g(inserted)g(in)o(to)f(the)h(text)295 +2411 y(rather)i(to)q(o)g(easily)m(,)e(and)h(it)g(is)g(all)f(to)q(o)h(easy)h +(to)f(b)q(e)h(tripp)q(ed)g(up.)23 b(F)m(unnelW)m(eb)15 b(prev)o(en)o(ts)h +(these)295 2461 y(problems)e(b)o(y)g(\015agging)f(with)i(diagnostics)f(all)f +(non-end-of-line)h(con)o(trol)g(c)o(haracters)j(detected)295 +2511 y(in)f(the)h(input)f(\()p Fl(.fw)p Fr(\))g(\014le)h(\(ev)o(en)g(T)m +(ABs\).)26 b(The)17 b(result)g(is)f(that)h(the)g(user)g(is)g(guaran)o(teed)g +(that)295 2561 y(pro)q(duct)e(\014les)f(generated)h(from)d(F)m(unnelW)m(eb)h +(con)o(tain)h(no)f(unin)o(ten)o(tional)g(con)o(trol)g(c)o(haracters.)295 +2610 y(This)g(said,)g(F)m(unnelW)m(eb)f(do)q(es)i(allo)o(w)d(the)j(insertion) +f(of)g(con)o(trol)f(c)o(haracters)j(in)e(the)g(output)h(\014le)295 +2660 y(b)o(y)g(explicitly)f(sp)q(ecifying)h(them)f(in)g(the)i(text)f(using)g +(a)f Fl(@^)h Fr(con)o(trol)f(sequence.)295 2735 y Fo(Num)o(b)q(er)j(of)g(in)o +(v)o(o)q(cations:)h Fr(F)m(unnelW)m(eb)d(c)o(hec)o(ks)i(the)f(n)o(um)o(b)q +(er)f(of)g(times)f(that)i(eac)o(h)g(macro)295 2785 y(is)j(called)f(and)g +(issues)i(an)e(error)i(if)d(the)j(total)d(is)i(not)f(one.)29 +b(The)18 b Fl(@Z)g Fr(\(for)f(zero\))h(and)g Fl(@M)f Fr(\(for)295 +2835 y(man)o(y\))12 b(macro)h(attributes)i(can)f(b)q(e)g(used)h(to)f(b)o +(ypass)g(these)h(c)o(hec)o(ks.)1042 2940 y(42)p eop +%%Page: 43 44 +43 43 bop 295 42 a Fo(Recursion:)28 b Fr(Because)21 b(F)m(unnelW)m(eb)e(do)q +(es)h(not)g(pro)o(vide)f(an)o(y)g(conditional)f(constructs,)23 +b(all)295 91 y(recursiv)o(ely)17 b(de\014ned)g(macros)e(m)o(ust,)g(b)o(y)g +(de\014nition,)h(expand)g(in\014nitely)m(,)1483 76 y Fg(1)1516 +91 y Fr(and)g(are)g(therefore)295 141 y(unacceptable.)37 b(F)m(unnelW)m(eb)20 +b(p)q(erforms)f Fm(static)h Fr(c)o(hec)o(ks)h(to)f(detect)h(recursion,)h +(detecting)f(it)295 191 y(b)q(efore)13 b(macro)d(expansion)i(commences.)k +(The)d(user)f(need)h(not)f(fear)g(that)g(F)m(unnelW)m(eb)f(will)f(lo)q(c)o(k) +295 241 y(up)k(or)g(sp)q(ew)h(forth)f(if)f(a)g(recursiv)o(e)j(macro)c(is)i +(acciden)o(tally)f(sp)q(eci\014ed.)177 399 y Fi(2.4)70 b(Fiddling)21 +b(With)h(End)i(of)f(Lines)177 512 y Fr(One)13 b(of)f(the)h(\014ddly)f(asp)q +(ects)j(of)c(programming)e(with)j(F)m(unnelW)m(eb)g(is)h(coping)f(with)g(end) +h(of)f(lines.)17 b(If)12 b(y)o(ou)g(w)o(an)o(t)177 562 y(y)o(our)17 +b(pro)q(duct)h(\014le)e(to)h(b)q(e)h(w)o(ell)e(inden)o(ted)h(without)g(m)o +(ultiple)d(blank)i(lines)h(or)g(co)q(de)g(run-ons,)h(y)o(ou)e(ha)o(v)o(e)h +(to)177 612 y(sp)q(end)e(a)f(little)f(time)f(w)o(orking)h(out)h(ho)o(w)g(the) +g(end)h(of)e(line)g(mark)o(ers)h(get)g(mo)o(v)o(ed)e(around.)177 +684 y(The)k(rule)g(to)f(remem)o(b)q(er)g(is)g(that,)g(disregarding)h(the)g +(e\013ects)h(of)e(sp)q(ecial)h(sequences)i(within)c(a)h(macro)g(b)q(o)q(dy)m +(,)177 733 y Fm(the)i(b)n(o)n(dy)g(of)g(a)g(macr)n(o)f(c)n(onsists)h(of)g +(exactly)g(the)f(text)h(b)n(etwe)n(en)g(the)f(op)n(ening)i +Fl(@)p Fq(f)e Fm(and)i(the)f(closing)f Fl(@)p Fq(g)p Fr(.)24 +b(This)177 783 y(text)15 b(includes)f(end)g(of)g(line)f(mark)o(ers.)177 +855 y(If)h(for)f(example)g(y)o(ou)g(call)g(a)h(macro)f(in)g(a)h(sequence)i +(of)d(co)q(de)p Fn(:)7 b(:)g(:)177 961 y Fl(while)21 b(the_walrus_is_sle)o +(epy)e(do)243 1011 y(begin)243 1061 y(writeln\('zzzzzz)o(z'\);)243 +1111 y(@<Wake)h(up)h(the)h(walrus@>)243 1161 y(writeln\('Umphar)o(umpha)o +(...'\))o(;)243 1211 y(end;)177 1317 y Fr(where)15 b Fl(<wake)21 +b(up)g(the)h(walrus>)12 b Fr(is)i(de\014ned)h(as)f(follo)o(ws)177 +1423 y Fl(@$@<Wake)20 b(up)i(the)f(walrus@>==@{)177 1473 y +(wake_up_the_walrus)o(\(the_)o(walru)o(s\);)177 1523 y(@})177 +1629 y Fr(then)15 b(when)f Fl(<Wake)21 b(up)g(the)g(walrus>)13 +b Fr(is)h(expanded)g(y)o(ou)g(will)e(get)177 1736 y Fl(while)21 +b(the_walrus_is_sle)o(epy)e(do)243 1786 y(begin)243 1835 y(writeln\("zzzzzz)o +(z"\);)243 1935 y(wake_up_the_wal)o(rus\(t)o(he_wa)o(lrus\))o(;)243 +2035 y(writeln\("Umphar)o(umpha)o(..."\))o(;)243 2085 y(end;)177 +2191 y Fr(The)13 b(blank)f(lines)h(w)o(ere)g(in)o(tro)q(duced)h(b)o(y)e(the)i +(end)f(on)f(line)h(mark)o(ers)f(included)h(in)f(the)h(de\014nition)f(of)g +Fl(<Wake)21 b(up)177 2241 y(the)g(walrus>)p Fr(.)e(A)c(go)q(o)q(d)f(solution) +f(to)i(this)g(problem)e(is)h(to)h(suppress)h(the)f(end)g(of)f(line)h(mark)o +(ers)e(b)o(y)i(de\014ning)177 2291 y(the)g(macro)d(as)i(follo)o(ws)177 +2397 y Fl(@$@<Wake)20 b(up)i(the)f(walrus@>==@{@-)177 2447 +y(wake_up_the_walrus)o(\(the_)o(walru)o(s\);@})177 2553 y Fr(This)14 +b(is)g(the)g(usual)g(form)e(of)h(macro)g(de\014nitions)h(in)f(F)m(unnelW)m +(eb)h(\014les.)177 2625 y(In)g(additiv)o(e)f(macros,)g(this)h(format)e(do)q +(es)j(not)f(w)o(ork)f(prop)q(erly)i(b)q(ecause)g(the)g(end)g(of)e(line)g +(that)h(is)g(suppressed)177 2675 y(b)o(y)f(the)h(trailing)d +Fl(@)p Fq(g)i Fr(do)q(es)h(not)f(get)g(replaced)i(b)o(y)d(the)i(end)g(of)e +(line)h(at)g(the)h(end)f(of)g(the)h(macro)e(in)o(v)o(o)q(cation.)k(F)m(or)177 +2725 y(example)d(the)h(de\014nition)p 177 2757 709 2 v 223 +2783 a Ff(1)241 2795 y Fh(A)f(sp)q(ecial)f(case)g(exists)g(where)h(there)e +(is)i(recursion)e(but)h(no)h(con)o(ten)o(t.)18 b(In)12 b(this)h(case,)f(the)h +(expansion)d(is)j(\014nite)f(\(the)g(empt)o(y)177 2835 y(string\))e(ev)o(en)g +(though)g(the)h(op)q(eration)e(of)i(expanding)d(is)k(in\014nite.)h(F)m +(unnelW)m(eb)d(do)q(es)g(not)h(treat)f(this)h(case)g(sp)q(ecially)m(.)1042 +2940 y Fr(43)p eop +%%Page: 44 45 +44 44 bop 177 42 a Fl(@$@<Wake)20 b(up)i(the)f(walrus@>+=@{@-)177 +91 y(wake_up_the_walrus)o(_once)o(\(the_)o(walru)o(s\);@})177 +205 y Fr(later)14 b(follo)o(w)o(ed)e(b)o(y)177 318 y Fl(@$@<Wake)20 +b(up)i(the)f(walrus@>+=@{@-)177 368 y(wake_up_the_walrus)o(_agai)o(n\(the)o +(_walr)o(us\);@)o(})177 482 y Fr(is)14 b(equiv)n(alen)o(t)f(to)h(the)g +(single)g(de\014nition)177 595 y Fl(@$@<Wake)20 b(up)i(the)f(walrus@>==@{@-) +177 645 y(wake_up_the_walrus)o(_once)o(\(the_)o(walru)o(s\);wa)o(ke_u)o +(p_the)o(_walr)o(us_ag)o(ain\(t)o(he_wa)o(lrus)o(\);@})177 +759 y Fr(Putting)14 b(the)h(trailing)e Fl(@)p Fq(g)h Fr(on)g(a)g(new)h(line)f +(at)g(the)h(end)g(of)f(the)g(macro)g(\(except)h(for)f(the)h(last)g +(de\014nition)e(part\))177 809 y(solv)o(es)h(the)h(problem.)177 +922 y Fl(@$@<Wake)20 b(up)i(the)f(walrus@>+=@{@-)177 972 y +(wake_up_the_walrus)o(_once)o(\(the_)o(walru)o(s\);)177 1022 +y(@})177 1135 y Fr(later)14 b(follo)o(w)o(ed)e(b)o(y)177 1249 +y Fl(@$@<Wake)20 b(up)i(the)f(walrus@>+=@{@-)177 1299 y(wake_up_the_walrus)o +(_agai)o(n\(the)o(_walr)o(us\);@)o(})177 1412 y Fr(is)14 b(equiv)n(alen)o(t)f +(to)h(the)g(single)g(de\014nition)177 1526 y Fl(@$@<Wake)20 +b(up)i(the)f(walrus@>==@{@-)177 1576 y(wake_up_the_walrus)o(_once)o(\(the_)o +(walru)o(s\);)177 1625 y(wake_up_the_walrus)o(_agai)o(n\(the)o(_walr)o +(us\);@)o(})177 1739 y Fr(Managing)12 b(end)i(of)f(line)g(mark)o(ers)g(is)g +(tric)o(ky)m(,)g(but)h(once)g(y)o(ou)f(establish)g(a)h(con)o(v)o(en)o(tion)f +(for)g(coping)g(with)g(them,)177 1789 y(the)i(problem)d(disapp)q(ears)j(in)o +(to)e(the)i(bac)o(kground.)177 1950 y Fi(2.5)70 b(F)-6 b(udging)24 +b(Conditionals)177 2065 y Fr(As)13 b(a)g(macro)e(prepro)q(cessor,)k(the)e +(facilit)o(y)e(that)i(F)m(unnelW)m(eb)f(most)g(ob)o(viously)f(lac)o(ks)h(is)h +(a)f(conditional)f(facilit)o(y)177 2115 y(\(suc)o(h)19 b(as)e(C's)h +Fl(#ifdef)p Fr(\).)28 b(It)18 b(migh)o(t,)e(therefore,)k(come)c(as)i(a)f +(surprise)i(to)f(kno)o(w)f(that)h(the)g(\014rst)h(v)o(ersion)e(of)177 +2164 y(F)m(unnelW)m(eb)g(actually)g(had)g(a)g(built)g(in)g(conditional)g +(facilit)o(y)m(.)26 b(The)18 b(facilit)o(y)e(allo)o(w)o(ed)h(the)h +(programmer)d(to)177 2214 y(sp)q(ecify)f(a)e(construct)i(that)f(w)o(ould)f +(select)i(from)d(one)i(of)g(a)f(n)o(um)o(b)q(er)g(of)g(macro)g(expressions)i +(dep)q(ending)g(on)e(the)177 2264 y(v)n(alue)h(of)h(a)f(con)o(trolling)g +(macro)f(expression.)177 2338 y(In)i(three)h(y)o(ears)g(the)f(construct)i(w)o +(as)e(nev)o(er)g(used.)177 2412 y(The)f(reason)g(w)o(as)f(that)h(conditional) +e(constructs)j(could)e(b)q(e)i(fudged)e(nearly)g(as)h(easily)f(as)g(they)h +(could)f(b)q(e)h(used.)177 2462 y(Because)j(of)e(this,)f(the)i(in)o(built)e +(conditional)f(feature)j(w)o(as)f(remo)o(v)o(ed)f(in)h(the)h(curren)o(t)g(v)o +(ersion)f(of)g(F)m(unnelW)m(eb.)177 2512 y(Not)e(only)e(did)h(this)h +(simplify)c(the)k(program,)e(but)h(is)h(also)e(allo)o(w)o(ed)h(recursiv)o(e)h +(macros)f(to)g(b)q(e)h(detected)i(through)177 2561 y(static)g(analysis)g +(rather)g(than)g(during)g(macro)e(expansion.)177 2635 y(There)18 +b(are)g(t)o(w)o(o)e(basic)h(w)o(a)o(ys)g(to)g(fudge)g(a)f(conditional.)26 +b(First,)18 b(the)f(commen)o(t)e(facilit)o(y)h(of)g(the)h(target)h(pro-)177 +2685 y(gramming)11 b(language)i(ma)o(y)f(b)q(e)j(emplo)o(y)o(ed.)i(F)m(or)c +(example,)g(in)g(Ada,)h(commen)o(ts)e(commence)h(with)h(\\)p +Fl(--)p Fr(")f(and)177 2735 y(terminate)g(at)h(the)h(end)f(of)g(the)g(line.)k +(Using)c(this)g(fact,)g(it)f(is)h(easy)h(to)e(construct)j(macros)d(that)h +(can)g(b)q(e)h(called)177 2785 y(at)d(the)g(start)h(of)e(eac)o(h)h(target)g +(line)g(and)f(whic)o(h)h(turn)g(on)g(and)f(o\013)h(the)g(lines)g(so)g(mark)o +(ed)e(b)o(y)i(de\014ning)g(the)g(macro)177 2835 y(to)i(b)q(e)g(the)h(empt)o +(y)e(string)h(\(ON\))g(or)g(the)h(commen)o(t)c(sym)o(b)q(ol)h(\()p +Fl(--)p Fr(\))i(\(OFF\).)g(F)m(or)g(example:)1042 2940 y(44)p +eop +%%Page: 45 46 +45 45 bop 177 42 a Fl(@A@<Debug)20 b(Macro@>)177 141 y(The)h(following)f +(macro)h(determines)f(whether)g(debug)h(code)g(will)g(be)g(included)f(in)i +(the)177 191 y(program.)e(All)h(lines)g(of)h(debug)e(code)h(commence)f(with)h +(a)h(call)f(to)g(this)g(macro)g(and)g(so)177 241 y(we)h(can)f(turn)g(all)g +(that)g(code)g(on)g(or)h(off)f(here)g(by)g(defining)f(this)h(macro)g(to)g(be) +h(either)177 291 y(empty)f(or)g(the)g(single-line)f(comment)g(symbol)h +(\(\\p{--}\).)f(Note)h(the)g(use)g(of)h(a)177 340 y(quick)f(macro)g(name.)177 +440 y(@$@#D@M==@{@})106 b(@!)22 b(Turns)f(the)g(debug)g(code)f(ON.)177 +490 y(@!)i(Use)f(this)g(definition)e(to)j(turn)f(the)g(debug)g(code)g(OFF:)g +(@$@#D==@{--@})177 589 y(...)g(then)g(later)g(in)g(the)h(file...)177 +689 y(@$@<Sloth)e(incrementing)f(loop@>==@{@-)177 739 y(while)i(sloth<walrus) +e(loop)243 789 y(@#D)i(assert\(sloth<wal)o(rus,")o(AWK!)d +(sloth>=walrus!!!!!!)o(!"\);)243 839 y(@#D)j(assert\(timer<tim)o(ermax)o +(,"AWK)o(!)e(timer>=timermax!!)o(!"\);)243 888 y(inc\(sloth\);)177 +938 y(end)i(loop@})177 1051 y Fr(The)16 b(other)f(w)o(a)o(y)f(to)h(fudge)g(a) +f(conditional)g(is)h(to)g(de\014ne)g(a)g(macro)f(with)g(a)h(single)g +(parameter.)20 b(A)15 b(call)f(to)h(the)177 1101 y(macro)g(is)g(then)i(wrapp) +q(ed)g(around)e(all)g(the)h(conditional)f(co)q(de)i(in)e(the)h(program.)23 +b(The)16 b(macro)f(can)h(then)g(b)q(e)177 1151 y(de\014ned)f(to)f(presen)o(t) +h(or)f(ignore)g(the)g(co)q(de)h(of)e(its)h(argumen)o(t.)j(F)m(or)d(example:) +177 1263 y Fl(@A@<Debug)20 b(Macro@>)177 1363 y(The)h(following)f(macro)h +(determines)f(whether)g(debug)h(code)g(will)g(be)g(included)f(in)i(the)177 +1413 y(program.)e(All)h(debug)g(code)g(is)h(wrapped)e(by)h(a)h(call)f(to)g +(this)g(macro)g(and)g(so)177 1463 y(we)h(can)f(turn)g(all)g(the)g(debug)g +(code)g(on)g(or)h(off)f(here)g(by)g(defining)f(this)h(macro)g(to)g(be)177 +1513 y(either)g(empty)f(or)i(its)f(parameter.)177 1612 y +(@$@#D@\(@1@\)@M==@{@)o(1@})106 b(@!)21 b(Turns)g(the)g(debug)g(code)g(ON.) +177 1662 y(@!)h(Use)f(this)g(definition)e(to)j(turn)f(the)g(debug)g(code)g +(OFF:)g(@$@#D@\(@1@\)==@{@)o(})177 1762 y(...)g(then)g(later)g(in)g(the)h +(file...)177 1861 y(@$@<Sloth)e(incrementing)f(loop@>==@{@-)177 +1911 y(while)i(sloth<walrus)e(loop)243 1961 y(@#D@\(assert\(slo)o(th<wa)o +(lrus,)o("AWK!)f(sloth>=walrus!!!!!)o(!!"\);)352 2011 y(assert\(timer<ti)o +(merma)o(x,"AW)o(K!)h(timer>=timermax!)o(!!"\);)o(@\))243 2060 +y(inc\(sloth\);)177 2110 y(end)i(loop@})177 2223 y Fr(In)16 +b(languages)g(that)g(allo)o(w)f(m)o(ulti-li)o(ne)f(commen)o(ts)g(\(e.g.)i(C)g +(with)g Fl(/*)f Fr(and)h Fl(*/)p Fr(\),)g(commen)o(ts)f(can)h(b)q(e)h(used)g +(to)177 2273 y(eliminate)12 b(the)j(conditioned)e(co)q(de)i(rather)g(than)f +(absence.)19 b(F)m(or)14 b(example:)177 2386 y Fl(@$@#D@\(@1@\)@M==@{/)o(*)19 +b(@1)i(*/@})87 b(@!)21 b(Comments)f(out)h(the)h(debug)e(code)177 +2499 y Fr(\(Note:)i(If)15 b(this)h(example)e(w)o(ere)j(ev)o(er)f(actually)f +(used,)h(the)h(programmer)c(w)o(ould)i(ha)o(v)o(e)g(to)g(b)q(e)i(careful)e +(not)h(to)177 2548 y(place)e(commen)o(ts)e(in)i(the)g(argumen)o(t)f(co)q(de.) +19 b(Nested)c(commen)o(ts)d(in)i(C)g(are)g(non-p)q(ortable.\))177 +2622 y(The)f(parameterized)f(macro)f(idea)g(can)i(b)q(e)f(generalized)h(to)f +(supp)q(ort)h(the)f(c)o(hoice)h(of)e(more)g(than)h(one)g(m)o(utually)177 +2672 y(exclusiv)o(e)j(alternativ)o(e.)i(F)m(or)d(example:)177 +2785 y Fl(@A)22 b(This)f(module)f(contains)g(non-portable)g(code)g(that)h +(must)g(execute)g(on)g(Hewlett)177 2835 y(Packard,)f(Sun,)h(and)g(DEC)h +(workstations.)d(The)i(following)f(FunnelWeb)g(macro)h(is)1042 +2940 y Fr(45)p eop +%%Page: 46 47 +46 46 bop 177 42 a Fl(defined)21 b(to)g(choose)f(between)h(these)g(three.)f +(The)h(first)g(parameter)f(is)h(the)h(HP)f(code,)177 91 y(the)g(second)g(is)g +(the)g(Sun)h(code,)e(and)i(the)f(third)f(is)i(the)f(DEC)g(code.)g(Whichever) +177 141 y(parameter)f(constitutes)g(the)h(body)g(of)g(this)g(macro)g +(determines)f(which)177 191 y(machine)h(the)g(code)g(is)g(being)g +(targeted\\note{Di)o(ction)o(ary)e(says)i(only)g(one)g(t)177 +241 y(in)h(targeted.})d(for.)177 340 y(@$@<Machine)h(specific)g +(code@>@\(@3@\)@M==@)o({@1@)o(})41 b(@!)21 b(Configure)f(for)h(HP.)177 +440 y(...then)g(later)f(in)i(the)f(file...)177 540 y(@<Machine)f(specific)g +(code@>@\()177 589 y(@"get_command_line)o(\(coml)o(ine\)@)o(")237 +b(@,)21 b(@!)h(HP.)177 639 y(@"scan_command_lin)o(e\(128)o(,coml)o(ine\);)o +(@")106 b(@,)21 b(@!)h(Sun.)177 689 y(@"dcl_get_command_)o(line\()o(comli)o +(ne,25)o(6\);@")40 b(@\))21 b(@!)h(DEC.)177 793 y Fr(Of)13 +b(course,)g(this)g(could)f(also)g(b)q(e)h(p)q(erformed)f(using)h(three)h +(separate)f(macros.)k(The)c(main)d(adv)n(an)o(tage)i(of)g(using)177 +842 y(a)j(single)g(macro)g(is)g(that)g(the)i(m)o(utual)c(exclusivit)o(y)i(is) +g(enforced.)24 b(Also,)15 b(b)q(ecause)i(F)m(unnelW)m(eb)e(ensures)j(that)177 +892 y(the)d(n)o(um)o(b)q(er)f(of)g(formal)e(and)j(actual)f(parameters)h(are)g +(the)g(same,)e(this)i(metho)q(d)f(lessens)i(the)f(c)o(hance)g(that)g(a)177 +942 y(mac)o(hine)e(will)f(b)q(e)j(forgotten)f(in)f(some)g(places.)177 +1099 y Fi(2.6)70 b(Changing)23 b(the)f(Strength)i(of)f(Headings)177 +1211 y Fr(F)m(unnelW)m(eb)18 b(pro)o(vides)g(\014v)o(e)g(heading)g(lev)o +(els:)26 b Fl(@A)p Fr(,)17 b Fl(@B)p Fr(,)g Fl(@C)p Fr(,)g +Fl(@D)p Fr(,)h(and)f Fl(@E)h Fr(to)g(whic)o(h)g(it)f(binds)i(\014v)o(e)f +(di\013eren)o(t)177 1261 y(t)o(yp)q(ographical)e(strengths.)28 +b(These)17 b(bindings)f(are)h(static;)h(a)f(lev)o(el)f Fl(@A)g +Fr(heading)g(will)f(alw)o(a)o(ys)h(b)q(e)h(t)o(yp)q(eset)h(in)177 +1311 y(a)e(particular)g(fon)o(t)g(size)h(regardless)h(of)e(the)g(size)i(of)d +(the)i(do)q(cumen)o(t.)25 b(The)17 b(fon)o(t)f(sizes)h(ha)o(v)o(e)f(b)q(een)i +(preset)g(to)177 1361 y(b)q(e)f(\\reasonable")e(for)h(a)f(range)h(of)f(do)q +(cumen)o(t)h(sizes,)h(but)f(ma)o(y)d(b)q(e)k(inappropriate)e(for)h(v)o(ery)g +(small)d(or)j(large)177 1410 y(do)q(cumen)o(ts.)177 1482 y(F)m(unnelW)m(eb)d +(do)q(es)h(not)f(curren)o(tly)h(pro)o(vide)g(an)f(\\o\016cial")e(w)o(a)o(y)i +(\(e.g.)f(a)h(pragma\))f(to)h(c)o(hange)h(the)g(t)o(yp)q(esetting)177 +1531 y(strength)f(of)f(headings.)17 b(This)12 b(feature)g(migh)o(t)e(b)q(e)j +(added)f(in)f(later)h(v)o(ersions.)18 b(Mean)o(while,)12 b(a)f(hac)o(k)h(is)g +(a)o(v)n(ailable)177 1581 y(that)17 b(will)e(do)h(the)i(job,)e(pro)o(viding)f +(that)i(y)o(ou)f(do)h(not)f(mind)f(the)i(hac)o(k)g(b)q(eing)g(T)1490 +1590 y(E)1513 1581 y(X-sp)q(eci\014c)h(and)e(probably)177 1631 +y(F)m(unnelW)m(eb-v)o(ersion)e(sp)q(eci\014c.)177 1702 y(Inside)g(the)h(set)f +(of)f(T)504 1711 y(E)528 1702 y(X)g(macro)g(de\014nitions)g(that)h(F)m +(unnelW)m(eb)f(writes)i(at)e(the)i(top)e(of)h(ev)o(ery)g(do)q(cumen)o(tation) +177 1752 y(\014le)d(are)h(\014v)o(e)f(\\library")f(de\014nitions)h +Fl(fwliba)p Fn(:)c(:)g(:)m Fl(fwlibe)j Fr(whic)o(h)h(pro)o(vide)g(\014v)o(e)g +(di\013eren)o(t)h(t)o(yp)q(esetting)g(strengths)177 1802 y(for)j(headings.)23 +b(Near)16 b(the)h(end)f(of)f(the)h(set)g(of)f(de\014nitions,)h(F)m(unnelW)m +(eb)f(binds)g(these)i(macros)e(to)g(\014v)o(e)h(other)177 1851 +y(macros)i Fl(fwseca)p Fn(:)7 b(:)g(:)n Fl(fwsece)17 b Fr(whic)o(h)i(are)h +(in)o(v)o(ok)o(ed)e(directly)i(in)e(the)i(generated)g(T)1511 +1860 y(E)1535 1851 y(X)f(co)q(de)h(to)f(t)o(yp)q(eset)h(the)177 +1901 y(headings.)177 2005 y Fl(\\def\\fwseca#1#2{\\f)o(wliba)o({#1}{)o(#2}}) +177 2055 y(\\def\\fwsecb#1#2{\\f)o(wlibb)o({#1}{)o(#2}})177 +2104 y(\\def\\fwsecc#1#2{\\f)o(wlibc)o({#1}{)o(#2}})177 2154 +y(\\def\\fwsecd#1#2{\\f)o(wlibd)o({#1}{)o(#2}})177 2204 y +(\\def\\fwsece#1#2{\\f)o(wlibe)o({#1}{)o(#2}})177 2308 y Fr(This)10 +b(means)g(that)h(the)g(t)o(yp)q(esetting)g(strength)h(of)d(the)i(headings)g +(in)f(a)g(F)m(unnelW)m(eb)g(do)q(cumen)o(t)g(can)g(b)q(e)h(c)o(hanged)177 +2357 y(b)o(y)j(rede\014ning)g(these)i(macros)d(at)g(the)i(top)f(of)f(a)h(F)m +(unnelW)m(eb)f(do)q(cumen)o(t.)k(F)m(or)d(example:)177 2461 +y Fl(@p)22 b(typesetter)d(=)j(tex)177 2511 y(\\def\\fwseca#1#2{\\f)o(wlibc)o +({#1}{)o(#2}})177 2614 y Fr(w)o(ould)10 b(set)h Fl(@A)f Fr(headings)g(at)h +(the)f(same)g(strength)i(as)e(the)h(default)f(strength)i(of)d +Fl(@C)h Fr(headings.)17 b(The)11 b Fl(typesetter)177 2664 y +Fr(directiv)o(e)k(is)e(necessary)j(to)e(ensure)h(that)f(the)g(T)935 +2673 y(E)958 2664 y(X)g(con)o(trol)g(sequences)i(get)e(through)g(to)g(the)g +(do)q(cumen)o(tation)177 2714 y(\014le)g(un\014ltered.)177 +2785 y(The)g(follo)o(wing)d(will)h(tone)i(do)o(wn)f(all)f(headings)h(b)o(y)g +(t)o(w)o(o)g(lev)o(els)h(\(with)f(the)h Fl(@D)f Fr(and)g Fl(@E)g +Fr(lev)o(els)h(b)q(eing)f(allo)q(cated)177 2835 y(the)i(default)e +Fl(@E)h Fr(t)o(yp)q(esetting)g(strength)i(b)q(ecause)f(there)g(is)f(nothing)f +(w)o(eak)o(er\).)1042 2940 y(46)p eop +%%Page: 47 48 +47 47 bop 177 42 a Fl(@p)22 b(typesetter)d(=)j(tex)177 91 y +(\\def\\fwseca#1#2{\\f)o(wlibc)o({#1}{)o(#2}})177 141 y +(\\def\\fwsecb#1#2{\\f)o(wlibd)o({#1}{)o(#2}})177 191 y +(\\def\\fwsecc#1#2{\\f)o(wlibe)o({#1}{)o(#2}})177 241 y +(\\def\\fwsecd#1#2{\\f)o(wlibe)o({#1}{)o(#2}})177 291 y +(\\def\\fwsece#1#2{\\f)o(wlibe)o({#1}{)o(#2}})177 408 y Fr(These)17 +b(de\014nitions)f(a\013ect)g(only)f(the)h(headings)f(that)h(follo)o(w)e +(them,)g(and)i(so)f(they)h(should)g(b)q(e)g(placed)g(at)f(the)177 +458 y(top)f(of)f(the)i(F)m(unnelW)m(eb)e(input)h(\014le.)177 +622 y Fi(2.7)70 b(E\016ciency)21 b(Notes)177 739 y Fr(The)14 +b(follo)o(wing)e(notes)i(are)h(w)o(orth)f(k)o(eeping)f(in)h(mind)e(when)i +(using)g(F)m(unnelW)m(eb.)295 814 y Fo(Memory:)j Fr(When)12 +b(F)m(unnelW)m(eb)f(pro)q(cesses)j(an)d(input)g(\014le,)g(it)g(reads)h(the)g +(en)o(tire)g(input)f(\014le,)h(and)295 864 y(all)i(the)h(included)g(\014les)g +(in)o(to)g(memory)m(.)920 849 y Fg(2)957 864 y Fr(This)g(organization)e(do)q +(es)j(not)f(p)q(ose)g(a)g(constrain)o(t)g(on)295 914 y(mac)o(hines)e(with)h +(large)f(memories,)e(but)j(could)g(presen)o(t)h(a)f(problem)e(on)i(the)g +(smaller)f(mac)o(hines)295 964 y(suc)o(h)i(as)f(the)g(PC.)295 +1039 y Fo(Sp)q(eed:)j Fr(F)m(unnelW)m(eb)12 b(is)g(not)g(a)g(slo)o(w)g +(program.)k(Ho)o(w)o(ev)o(er,)c(it)g(is)g(not)h(particularly)e(fast)h +(either.)295 1089 y(If)17 b(the)g(sp)q(eed)h(at)f(whic)o(h)g(F)m(unnelW)m(eb) +f(runs)h(is)g(imp)q(ortan)o(t)e(to)i(y)o(ou,)f(then)i(the)f(thing)f(to)h(k)o +(eep)295 1138 y(in)e(mind)d(is)j(that)g(F)m(unnelW)m(eb)f(has)h(b)q(een)h +(optimized)d(to)i(deal)f(e\016cien)o(tly)h(with)f(large)g(slabs)h(of)295 +1188 y(text.)23 b(F)m(unnelW)m(eb)15 b(treats)h(input)f(\014les)g(as)h(a)f +(sequence)i(of)e(text)g(slabs)h(and)f(sp)q(ecial)g(sequences)295 +1238 y(\(e.g.)i Fl(@+)p Fr(\))h(and)f(whenev)o(er)i(it)e(hits)h(a)g(sp)q +(ecial)g(sequence,)i(it)d(has)h(to)f(stop)h(and)g(think.)29 +b(Th)o(us,)295 1288 y(while)19 b(a)f(ten)h(megab)o(yte)f(text)i(slab)e(w)o +(ould)g(b)q(e)h(manipulated)e(as)i(a)g(single)f(tok)o(en,)i(in)e(a)h(few)295 +1338 y(milliseconds,)11 b(a)i(similar)e(ten)j(megab)o(yte)e(c)o(h)o(unk)h +(\014lled)g(with)f(sp)q(ecial)i(sequences)h(w)o(ould)e(tak)o(e)g(a)295 +1388 y(lot)j(longer.)25 b(If)16 b(F)m(unnelW)m(eb)f(is)h(running)g(slo)o(wly) +m(,)f(lo)q(ok)g(to)h(see)i(if)d(the)i(input)f(con)o(tains)g(a)g(high)295 +1437 y(densit)o(y)e(of)f(sp)q(ecial)h(sequences.)21 b(This)13 +b(can)h(sometimes)e(happ)q(en)i(if)f(F)m(unnelW)m(eb)g(is)g(b)q(eing)h(used) +295 1487 y(as)f(a)f(bac)o(k)o(end)h(macro)e(pro)q(cessor)j(and)f(its)f(input) +g(is)h(b)q(eing)f(generated)i(automatically)9 b(b)o(y)k(some)295 +1537 y(other)i(program.)295 1612 y Fo(Macro)i(expansion:)h +Fr(When)d(tangling)e(\(expanding)i(macros\),)e(F)m(unnelW)m(eb)h(nev)o(er)i +(expands)295 1662 y(a)11 b(macro)f(expression)i(in)o(to)e(memory;)f(it)h(alw) +o(a)o(ys)g(writes)i(it)f(to)f(the)i(pro)q(duct)g(\014le)f(as)g(it)f(go)q(es.) +18 b(This)295 1712 y(is)10 b(a)h(p)q(o)o(w)o(erful)e(fact,)i(b)q(ecause)h(it) +e(means)f(that)i(y)o(ou)f(can)g(write)h(macros)e(con)o(taining)h(an)g +(unlimited)295 1762 y(amoun)o(t)h(of)h(text,)h(and)f(pass)h(suc)o(h)g(macros) +f(as)h(parameters)f(to)h(other)g(macros)e(without)h(b)q(ecom-)295 +1812 y(ing)j(concerned)j(ab)q(out)e(o)o(v)o(er\015o)o(wing)f(some)g(kind)g +(of)h(bu\013er)h(memory)m(.)k(In)16 b(short,)g(F)m(unnelW)m(eb)295 +1861 y(do)q(es)f(not)f(imp)q(ose)e(an)o(y)i(limits)d(on)j(the)h(size)f(of)f +(macro)g(b)q(o)q(dies)h(or)g(their)h(expansions.)177 2025 y +Fi(2.8)70 b(In)n(teractiv)n(e)21 b(Mo)r(de)177 2142 y Fr(As)15 +b(w)o(ell)e(as)i(ha)o(ving)e(a)h(command)d(line)j(in)o(terface)h(with)f(lots) +g(of)g(options,)f(F)m(unnelW)m(eb)h(also)g(pro)o(vides)g(a)g(com-)177 +2192 y(mand)c(language)h(and)g(a)h(mo)q(de)e(\(\\in)o(teractiv)o(e)i(mo)q +(de"\))e(in)i(whic)o(h)f(commands)e(in)i(the)i(language)d(can)i(b)q(e)g(t)o +(yp)q(ed)177 2242 y(in)o(teractiv)o(ely)m(.)26 b(The)17 b(F)m(unnelW)m(eb)f +(command)e(in)o(terpreter)19 b(w)o(as)d(created)i(primarily)d(to)h(supp)q +(ort)i(regression)177 2292 y(testing,)c(but)g(can)g(also)f(b)q(e)i(useful)f +(to)g(F)m(unnelW)m(eb)f(users.)177 2367 y(F)m(unnelW)m(eb's)d(command)d(in)o +(terpreter)12 b(reads)f(one)f(command)d(p)q(er)k(line)f(and)g(can)g(read)g(a) +g(stream)g(of)f(commands)177 2417 y(either)j(from)e(a)h(text)h(\014le,)f(or)h +(from)d(the)j(console.)18 b(The)12 b(in)o(terpreter)h(can)e(understand)i(o)o +(v)o(er)e(t)o(w)o(en)o(t)o(y)h(commands.)177 2466 y(See)17 +b(Chapter)f(3)f(for)g(a)g(full)f(list.)22 b(Ho)o(w)o(ev)o(er,)16 +b(most)e(of)h(them)g(w)o(ere)h(designed)g(to)f(supp)q(ort)i(regression)f +(testing)177 2516 y(and)e(will)e(not)i(b)q(e)h(of)e(use)i(to)e(the)i(casual)f +(user.)177 2592 y(The)g(commands)e(that)i(are)g(of)f(greatest)j(use)e(to)g +(the)h(casual)e(user)i(are:)286 2709 y Fl(!)327 b(-)21 b(Comment.)g(Ignores)f +(the)h(whole)g(line.)286 2759 y(EXECUTE)f(fn)131 b(-)21 b(Execute)g(the)g +(specified)f(file.)p 177 2796 709 2 v 223 2823 a Ff(2)241 2835 +y Fh(If)11 b(a)g(\014le)g(is)h(included)d Fc(n)j Fh(times,)e(F)m(unnelW)m(eb) +g(k)o(eeps)g Fc(n)i Fh(copies)e(in)h(memory)m(.)1042 2940 y +Fr(47)p eop +%%Page: 48 49 +48 48 bop 286 42 a Fl(FW)22 b(options)129 b(-)21 b(Invoke)g(FunnelWeb-proper) +d(once.)286 91 y(SET)j(options)108 b(-)21 b(Sets)g(options.)286 +141 y(SHOW)261 b(-)21 b(Displays)g(currently)e(active)i(options.)286 +191 y(TRACE)g(ON)174 b(-)21 b(Turns)g(command)g(tracing)f(ON.)286 +241 y(QUIT)261 b(-)21 b(Quits)g(FunnelWeb.)177 373 y Fr(T)m(o)16 +b(distinguish)h(here)h(b)q(et)o(w)o(een)g(in)o(v)o(o)q(cations)e(of)g(the)i +(F)m(unnelW)m(eb)e(program)f(and)i(F)m(unnelW)m(eb)f(runs)i(inside)177 +423 y(the)c(shell,)g(w)o(e)g(call)f(the)h(latter)g Fo(F)l(unnelW)l(eb)f(prop) +q(er)p Fr(.)k(The)d(\\)p Fl(FW)p Fr(")e(command)f(in)o(v)o(ok)o(es)j(F)m +(unnelW)m(eb)f(prop)q(er)177 473 y(with)h(the)g(sp)q(eci\014ed)h(options)f +(whic)o(h)f(tak)o(e)h(the)h(same)d(syn)o(tax)i(as)g(they)g(do)g(on)f(the)i +(command)c(line.)17 b(The)e(only)177 523 y(restriction)g(is)f(that)g(none)g +(of)g(the)g(action)g(options)f(can)i(b)q(e)f(turned)h(on)f(except)h(\\)p +Fl(+F)p Fr(")e(whic)o(h)h(m)o(ust)f(b)q(e)i(turned)177 572 +y(on.)177 654 y(The)e(\\)p Fl(SET)p Fr(")f(command)e(has)j(the)h(same)e(syn)o +(tax)g(as)h(the)h(\\)p Fl(FW)p Fr(")e(command)e(except)k(that)f(it)g(do)q(es) +g(not)g(allo)o(w)e Fm(any)177 703 y Fr(action)i(options)g(to)g(b)q(e)h(sp)q +(eci\014ed.)19 b(It's)14 b(sole)f(e\013ect)i(is)e(to)g(set)i(default)d +(option)h(v)n(alues)g(for)g(the)h(rest)g(of)f(the)h(run.)177 +785 y(The)g(\\)p Fl(SHOW)p Fr(")f(command)e(displa)o(ys)i(the)i(curren)o(t)g +(default)f(options.)177 866 y(By)e(default,)g(F)m(unnelW)m(eb)f(do)q(es)i +(not)f(ec)o(ho)h(the)f(commands)e(that)i(it)f(pro)q(cesses)k(in)d(a)f +(script.)19 b(The)12 b(\\)p Fl(TRACE)20 b(ON)p Fr(")177 916 +y(command)11 b(turns)k(on)f(suc)o(h)g(tracing.)177 997 y(These)j(commands)12 +b(can)k(b)q(e)f(com)o(bined)f(to)h(streamline)f(the)i(use)g(of)f(F)m(unnelW)m +(eb.)21 b(F)m(or)15 b(example,)e(y)o(ou)i(migh)o(t)177 1047 +y(wish)f(to)g(create)h(a)f(script)g(called)g Fl(typeset.fws)d +Fr(to)j(pro)q(cess)i(a)d(whole)h(group)g(of)f(\014les.)177 +1179 y Fl(trace)21 b(on)177 1229 y(!This)g(script)f(typesets)h(the)g(whole)g +(program.)177 1279 y(!)h(Set)f(no)g(listing)g(file,)f(no)i(product)e(files,)h +(but)g(specify)f(a)i(documentation)d(file)177 1328 y(!)j(and)f(specify)f(the) +h(directory)f(into)h(which)g(it)g(should)g(be)g(placed.)177 +1378 y(set)g(-L)h(-O)f(+T/usr/ross/typese)o(t/)177 1428 y(fw)h(prog1)177 +1478 y(fw)g(prog2)177 1528 y(fw)g(prog3)177 1578 y(fw)g(prog4)177 +1710 y Fr(There)12 b(are)e(a)g(few)h(w)o(a)o(ys)f(in)f(whic)o(h)i(this)f +(script)h(can)g(b)q(e)f(run.)18 b(The)10 b(simplest)g(is)g(simply)e(to)i(sp)q +(ecify)h(it)f(in)g(the)h(\\)p Fl(+X)p Fr(")177 1760 y(option)g(of)f(a)h(F)m +(unnelW)m(eb)g(in)o(v)o(o)q(cation.)16 b(F)m(unnelW)m(eb)11 +b(shellscripts)h(default)f(to)g(\\)p Fl(<current)p 1621 1760 +14 2 v 14 w(directory>)p Fr(")e(and)177 1810 y(\\)p Fl(.fws)p +Fr(".)177 1942 y Fl(fw)22 b(+xtypeset)177 2074 y Fr(The)14 +b(second)h(alternativ)o(e)f(is)g(to)g(en)o(ter)h(in)o(teractiv)o(e)f(mo)q +(de.)177 2207 y Fl(fw)22 b(+k)177 2339 y Fr(F)m(rom)12 b(there,)j(y)o(ou)e +(can)h(execute)i(the)f(script)f(using:)177 2472 y Fl(execute)21 +b(typeset)177 2604 y Fr(In)o(teractiv)o(e)13 b(mo)q(de)e(could)h(b)q(e)h(v)o +(ery)f(useful)g(to)g(those)h(with)f(m)o(ultiple-windo)o(w)d(w)o(orkstations.) +17 b(The)c(user)g(could)177 2654 y(create)f(a)f(windo)o(w)e(con)o(taining)h +(an)g(in)o(teractiv)o(e)h(session)h(of)e(F)m(unnelW)m(eb,)g(and)g(then)i +(switc)o(h)f(b)q(et)o(w)o(een)h(windo)o(ws,)177 2704 y(editing,)h(and)h +(executing)g(F)m(unnelW)m(eb)g(prop)q(er)h(and)e(other)i(programs.)177 +2785 y(If)c(y)o(ou)f(\014nd)i(y)o(ourself)f(using)f(the)i(command)c(in)o +(terpreter)13 b(a)e(lot,)g(b)q(e)g(sure)h(to)f(read)h(ab)q(out)f(the)g(other) +h(commands)177 2835 y(that)i(are)g(a)o(v)n(ailable)e(in)h(Chapter)i(3.)1042 +2940 y(48)p eop +%%Page: 49 50 +49 49 bop 177 42 a Fi(2.9)70 b(Setting)21 b(Up)i(Default)f(Options)177 +159 y Fr(If)14 b(y)o(ou)h(do)f(not)h(lik)o(e)f(F)m(unnelW)m(eb's)g(default)g +(settings)i(for)e(its)h(command)d(line)i(options,)g(there)i(are)f(a)f(n)o(um) +o(b)q(er)177 209 y(of)f(w)o(a)o(ys)h(in)f(whic)o(h)h(y)o(ou)g(can)g(c)o +(hange)g(them.)295 284 y Fo(De\014ne)e(an)h(\\alias":)k Fr(Use)12 +b(y)o(our)g(op)q(erating)f(system)h(\\)p Fl(alias)p Fr(")e(facilit)o(y)g(to)i +(create)h(an)e(alias)g(for)295 334 y(F)m(unnelW)m(eb)i(con)o(taining)f(the)h +(desired)i(options.)i(F)m(unnelW)m(eb)12 b(pro)q(cesses)k(options)d(from)e +(left)i(to)295 384 y(righ)o(t,)g(so)h(y)o(ou)g(can)g(o)o(v)o(erride)g(these)h +(defaults)f(later)g(if)f(y)o(ou)h(wish.)295 460 y Fo(Create)k(a)f(script)f +(called)g(\\)p Fl(fwinit.fws)p Fo(":)j Fr(When)d(F)m(unnelW)m(eb)f(starts)h +(up,)f(it)g(executes)j(a)295 510 y(script)12 b(called)e(\\)p +Fl(fwinit.fws)p Fr(")f(if)h(suc)o(h)h(a)g(script)g(exists)h(in)e(the)i +(curren)o(t)g(directory)m(.)17 b(Y)m(ou)11 b(can)g(use)295 +560 y(this)j(fact)f(to)h(set)g(options)f(b)q(efore)i(the)f(run)g(of)f(F)m +(unnelW)m(eb)g(prop)q(er)h(b)o(y)f(creating)h(suc)o(h)h(a)e(script)295 +609 y(and)i(placing)e(a)i(single)f(\\)p Fl(set)p Fr(")f(command)f(in)i(it)h +(con)o(taining)e(the)i(desired)h(options.)k(The)15 b(main)295 +659 y(trouble)f(with)f(this)h(approac)o(h)f(is)g(that)h(the)g(options)f(in)g +(the)h Fl(set)f Fr(command)d(will)i(b)q(e)i(pro)q(cessed)295 +709 y Fm(after)d Fr(the)h(command)d(line)i(options,)g(whic)o(h)h(means)e +(that)i(y)o(ou)f(w)o(on't)g(b)q(e)h(able)f(to)h(o)o(v)o(erride)f(them)295 +759 y(on)j(the)g(command)e(line.)177 835 y(F)m(or)h(example,)f(y)o(ou)h(migh) +o(t)f(b)q(e)i(in)o(v)o(olv)o(ed)e(more)h(with)g(presen)o(ting)h(programs)f +(than)g(with)g(running)h(them,)e(and)177 884 y(w)o(an)o(t)f(F)m(unnelW)m(eb)g +(to)h(generate)h(a)e(do)q(cumen)o(tation)f(\014le)i(b)o(y)f(default,)g(but)h +(not)g(to)f(pro)q(duce)i(listing)d(or)i(pro)q(duct)177 934 +y(\014les)i(b)o(y)g(default.)k(In)c(Unix)f(y)o(ou)h(could)f(do)h(this)g +(with:)177 1053 y Fl(alias)21 b(fw)g(fw)h(-L)f(-O)g(+T)177 +1219 y Fi(2.10)70 b(F)-6 b(unnelW)g(eb)23 b(and)g(Mak)n(e)177 +1336 y Fr(The)11 b(Unix)g Fl(Make)e Fr(program)g(allo)o(ws)h(a)g(set)i(of)e +(dep)q(endencies)j(b)q(et)o(w)o(een)f(a)e(set)i(of)e(\014les)h(to)g(b)q(e)g +(describ)q(ed,)i(and)d(then)177 1386 y(uses)16 b(these)f(dep)q(endencies)i +(to)d(con)o(trol)g(the)h(w)o(a)o(y)f(in)g(whic)o(h)g(the)h(\014les)g(are)f +(created)i(and)e(up)q(dated.)20 b(T)o(ypically)m(,)177 1436 +y Fl(Make)13 b Fr(is)g(used)i(to)e(con)o(trol)g(the)i(pro)q(cess)g(of)e +(transforming)f(a)h(collection)g(of)g(source)i(co)q(de)f(\014les)g(to)f(one)h +(or)g(more)177 1485 y(executable)j(\014les.)24 b(As)16 b(the)g(use)g(of)f(F)m +(unnelW)m(eb)g(implies)f(an)h(extra)h(stage)h(to)e(this)h(pro)q(cess,)h(it)e +(is)h(natural)f(to)177 1535 y(include)e(the)f(transformation)f(of)g +Fl(.fw)h Fr(\014les)h(to)f(source)h(co)q(de)g(\014les)g(as)f(part)h(of)e(the) +i Fl(Make)f Fr(pro)q(cess.)19 b(This)12 b(is)g(easy)177 1585 +y(to)i(do,)f(but)h(the)h(user)g(should)e(b)q(e)i(a)o(w)o(are)f(of)f(one)h +(asp)q(ect)h(of)e(F)m(unnelW)m(eb)h(whic)o(h)g(can)g(cause)h(problems.)177 +1661 y(It)d(is)g(often)h(useful,)f(when)g(using)g(F)m(unnelW)m(eb,)g(to)g +(create)h(a)f(F)m(unnelW)m(eb)g Fl(.fw)f Fr(\014le)i(that)f(generates)i(more) +d(than)177 1711 y(one)j(pro)q(duct)g(\014le.)k(That)13 b(is,)g(a)g(single)g +Fl(.fw)g Fr(\014le)h(ma)o(y)d(ha)o(v)o(e)i(man)o(y)f(macro)g(de\014nitions)h +(connected)j(to)d(pro)q(duct)177 1760 y(\014les)g(so)g(that)f(when)h(the)g(F) +m(unnelW)m(eb)f Fl(.fw)g Fr(\014le)g(is)h(pro)q(cessed)h(b)o(y)f(F)m(unnelW)m +(eb,)e(sev)o(eral)i(\014les)g(are)g(created.)19 b(F)m(or)177 +1810 y(example,)d(this)g(facilit)o(y)f(has)i(b)q(een)g(used)h(to)e(great)h +(e\013ect)h(to)f(place)f(the)h(description)h(of)e(an)g(Ada)g(pac)o(k)n(age's) +177 1860 y(pac)o(k)n(age)e(sp)q(eci\014cation)g(\014le)g(and)g(pac)o(k)n(age) +f(b)q(o)q(dy)h(\014le)g(in)g(the)g(same)f(F)m(unnelW)m(eb)g +Fl(.fw)h Fr(\014le.)177 1936 y(The)j(use)h(of)e(m)o(ultiple)e(pro)q(duct)k +(\014les,)f(ho)o(w)o(ev)o(er,)h(pro)o(v)o(ok)o(es)e(a)h(problem)e(with)h(dep) +q(endencies.)29 b(Supp)q(ose)18 b(for)177 1986 y(example)9 +b(that)h(a)g(F)m(unnelW)m(eb)g Fl(prog.fw)e Fr(pro)q(duces)k(t)o(w)o(o)d(pro) +q(duct)j(\014les)e Fl(proc.spec)e Fr(\(a)i(pac)o(k)n(age)g(sp)q +(eci\014cation\))177 2035 y(and)16 b Fl(prog.body)f Fr(\(a)h(pac)o(k)n(age)f +(b)q(o)q(dy\).)26 b(If)16 b(the)g(pac)o(k)n(age)g(is)g(accessed)j(in)d(the)g +(w)o(a)o(y)g(that)g(pac)o(k)n(ages)g(normally)177 2085 y(are,)j(it)e(will)f +(b)q(e)i(quite)f(common)e(for)i(the)h(programmer)d(to)j(w)o(an)o(t)f(to)g(mo) +q(dify)e(the)j(pac)o(k)n(age)g(b)q(o)q(dy)f(without)177 2135 +y(mo)q(difying)12 b(the)j(program)e(sp)q(eci\014cation.)20 +b(So)14 b(the)i(programmer)c(will)h(edit)h(the)i Fl(prog.fw)d +Fr(\014le)h(to)g(c)o(hange)h(the)177 2185 y(pac)o(k)n(age)c(b)q(o)q(dy)m(.)17 +b(The)12 b(result)g(of)e(running)h(this)h(through)f(F)m(unnelW)m(eb)g(will)f +(b)q(e)i(the)g(desired)g(new)g(pac)o(k)n(age)f(b)q(o)q(dy)177 +2235 y(\014le.)23 b(Ho)o(w)o(ev)o(er,)16 b(F)m(unnelW)m(eb)f(will)f(also)h +(pro)q(duce)i(a)e(new)h(pac)o(k)n(age)f(sp)q(eci\014cation)h(pro)q(duct)h +(\014le)e Fm(even)i(though)177 2285 y(it)d(may)h(b)n(e)f(identic)n(al)g(to)g +(the)h(pr)n(evious)f(version!)k Fr(The)c(result)g(is)f(that)g(the)h(newly)f +(created)i(\(with)e(a)g(recen)o(t)i(\014le)177 2334 y(date\))h(sp)q +(eci\014cation)h(pac)o(k)n(age)e(\014le)g(could)h(pro)o(v)o(ok)o(e)f(a)g(h)o +(uge)h(remak)o(e)f(of)g(m)o(uc)o(h)f(of)h(the)i(program)d(in)h(whic)o(h)g(it) +177 2384 y(resides.)177 2460 y(T)m(o)j(solv)o(e)h(the)g(problem,)f(F)m +(unnelW)m(eb)h(includes)g(a)g(command)d(line)i(option)g(\()p +Fl(D)h Fr(for)f(Delete\),)j(whic)o(h)d(when)177 2510 y(turned)f(on)f(\(using) +g(\\)p Fl(+D)p Fr("\))g(causes)h(F)m(unnelW)m(eb)f(to)g(suppress)i(pro)q +(duct)f(and)f(do)q(cumen)o(tation)f(\014les)h(that)g(are)177 +2560 y(iden)o(tical)c(to)h(the)g(previously)f(existing)h(v)o(ersions)g(of)f +(the)h(same)f(\014les.)18 b(F)m(or)12 b(example,)f(if,)h(during)g(a)g(F)m +(unnelW)m(eb)177 2609 y(run,)h(a)g(macro)e(w)o(as)i(connected)i(to)e(a)f(pro) +q(duct)i(\014le)f(called)f Fl(x.dat)p Fr(,)g(and)h(the)g(macro)f(expanded)h +(to)g Fm(exactly)g Fr(the)177 2659 y(same)g(text)h(as)f(is)h(con)o(tained)f +(in)g Fl(x.dat)f Fr(then)i(F)m(unnelW)m(eb)f(w)o(ould)g(simply)e +Fm(never)k(write)e(the)i(pr)n(o)n(duct)f(\014le)p Fr(,)f(the)177 +2709 y(\014le)h Fl(x.dat)f Fr(w)o(ould)g(b)q(e)h(un)o(touc)o(hed)h(and,)e(as) +h(a)g(result,)g(no)g(further)g Fl(Make)f Fr(propagations)h(w)o(ould)f(tak)o +(e)h(place.)177 2785 y(F)m(unnelW)m(eb)e(implemen)o(ts)f(this)i(feature)g(b)o +(y)g(writing)f(eac)o(h)h(pro)q(duct)h(\014le)f(to)f(a)h(temp)q(orary)f +(\014le)h(with)f(a)h(temp)q(o-)177 2835 y(rary)j(\014le)f(name.)21 +b(It)15 b(then)h(compares)f(the)h(temp)q(orary)e(\014le)h(with)g(the)h +(target)g(\014le.)22 b(If)15 b(the)h(t)o(w)o(o)e(are)i(iden)o(tical,)1042 +2940 y(49)p eop +%%Page: 50 51 +50 50 bop 177 42 a Fr(it)18 b(deletes)h(the)f(temp)q(orary)f(\014le.)30 +b(If)17 b(the)h(t)o(w)o(o)f(are)i(di\013eren)o(t)f(it)g(deletes)h(the)f +(target)g(\014le)g(and)g(renames)f(the)177 91 y(temp)q(orary)c(\014le)h(to)g +(the)g(target)h(\014le.)177 165 y(Use)c(of)f(the)h Fl(D)f Fr(facilit)o(y)e +(means)i(that)g(the)h(programmer)d(need)j(not)f(b)q(e)h(punished)g(\(b)o(y)f +(extra)h Fl(Make)e Fr(propagations\))177 215 y(for)14 b(describing)g(more)f +(than)h(one)g(pro)q(duct)h(\014le)f(in)f(the)i(same)e(F)m(unnelW)m(eb)g +(\014le.)177 376 y Fi(2.11)70 b(The)23 b(Dangers)g(of)g(F)-6 +b(unnelW)g(eb)177 492 y Fr(Lik)o(e)15 b(man)o(y)e(to)q(ols)i(that)g(are)h +(general)f(and)g(\015exible,)g(F)m(unnelW)m(eb)g(can)g(b)q(e)h(used)g(in)f(a) +g(v)n(ariet)o(y)f(of)h(w)o(a)o(ys,)g(b)q(oth)177 541 y(go)q(o)q(d)h(and)h +(bad.)26 b(One)18 b(of)e(the)h(original)e(app)q(eals)i(of)f(the)h(literate)g +(approac)o(h)g(to)f(programming)d(for)k(Kn)o(uth,)177 591 y(the)h(in)o(v)o +(en)o(tor)f(of)f(literate)i(programmi)o(ng,)d(w)o(as)i(that)g(it)g(allo)o(ws) +f(the)i(programmer)d(to)i(describ)q(e)i(the)e(target)177 641 +y(program)12 b(b)q(ottom)g(up,)h(top)g(do)o(wn,)g(size)h(to)f(side,)g(or)h(c) +o(haotically)e(if)g(desired.)19 b(The)14 b(\015exibilit)o(y)e(that)h(this)h +(st)o(yle)177 691 y(of)h(programmi)o(ng)d(lea)o(v)o(es)j(m)o(uc)o(h)f(ro)q +(om)f(for)i(bad)g(do)q(cumen)o(tation)e(as)i(w)o(ell)g(as)g(go)q(o)q(d)f(do)q +(cumen)o(tation.)20 b(Y)m(ears)177 741 y(of)c(exp)q(erience)j(with)e(F)m +(unnelW)m(eb)f(has)h(rev)o(ealed)g(the)h(follo)o(wing)c(st)o(ylistic)i +(pitfalls)g(whic)o(h)g(the)i(exp)q(erienced)177 791 y(F)m(unnelW)m(eb)c(user) +h(should)e(tak)o(e)h(care)h(to)f(a)o(v)o(oid.)952 775 y Fg(3)295 +865 y Fo(Spaghetti)h(organization:)j Fr(By)e(far)f(the)h(w)o(orst)g(problem)e +(that)h(arises)h(in)f(connection)h(with)295 914 y(the)k(literate)e(st)o(yle)h +(o)q(ccurs)h(where)g(the)g(programmer)c(has)j(used)g(the)h(literate)f(to)q +(ol)f(to)g(com-)295 964 y(pletely)f(scram)o(ble)e(the)i(program)d(so)j(that)f +(the)h(program)d(is)i(describ)q(ed)i(and)e(la)o(y)o(ed)g(out)g(in)g(an)295 +1014 y(unordered,)j(undisciplined)e(\\stream)f(of)g(consciousness".)29 +b(In)17 b(suc)o(h)h(cases)g(the)g(programmer)295 1064 y(ma)o(y)11 +b(b)q(e)i(using)g(the)g(literate)g(st)o(yle)f(as)h(a)f(crutc)o(h)i(to)f(a)o +(v)o(oid)e(ha)o(ving)g(to)i(think)f(ab)q(out)h(structuring)295 +1114 y(the)i(presen)o(tation.)295 1188 y Fo(Boring)h(organization:)i +Fr(A)o(t)d(the)h(other)g(extreme,)f(a)g(program)f(ma)o(y)f(b)q(e)j(organized) +f(in)g(suc)o(h)295 1238 y(a)h(strict)g(w)o(a)o(y)g(that)f(it)h(is)g(essen)o +(tially)f(laid)g(out)h(in)f(the)i(order)f(most)f(\\desired")h(b)o(y)g(the)g +(target)295 1287 y(programming)c(language.)21 b(F)m(or)15 b(example,)f(eac)o +(h)i(macro)e(migh)o(t)f(con)o(tain)i(a)g(single)g(pro)q(cedure,)295 +1337 y(with)g(all)e(the)i(macros)f(b)q(eing)h(called)f(b)o(y)h(a)f(macro)g +(connected)i(to)f(a)f(\014le)h(at)f(the)i(top.)k(In)15 b(man)o(y)295 +1387 y(cases)20 b(a)f(b)q(oring)f(structure)j(ma)o(y)c(b)q(e)i(en)o(tirely)g +(appropriate,)h(but)f(the)g(programmer)e(should)295 1437 y(b)q(e)h(w)o(arned) +f(that)f(it)h(is)f(easy)h(to)g(slip)f(in)o(to)g(suc)o(h)i(a)e(normativ)o(e)f +(st)o(yle,)i(largely)f(forgetting)g(the)295 1487 y(descriptiv)o(e)f +(structural)g(p)q(o)o(w)o(er)f(that)g(F)m(unnelW)m(eb)g(pro)o(vides.)295 +1561 y Fo(P)o(o)q(or)h(random)f(access:)k Fr(Using)c(F)m(unnelW)m(eb,)e(it)h +(is)h(quite)f(p)q(ossible)h(to)f(write)h(programs)e(lik)o(e)295 +1611 y(no)o(v)o(els)j(|)f(to)g(b)q(e)h(read)g(from)e(co)o(v)o(er)i(to)f(co)o +(v)o(er.)21 b(Sometimes)13 b(the)i(story)g(is)f(v)o(ery)h(exciting,)f(with) +295 1660 y(data)i(structures)j(making)13 b(dashing)j(triumphs)f(and)h +(optimized)f(co)q(de)i(bringing)e(the)h(story)h(to)295 1710 +y(a)d(satisfying)e(conclusion.)18 b(These)d(programs)e(can)g(b)q(e)i(w)o +(orks)e(of)g(art.)18 b(Unfortunately)m(,)13 b(without)295 1760 +y(careful)e(construction,)h(suc)o(h)f(\\no)o(v)o(el-programs")d(can)j(b)q +(ecome)f(v)o(ery)h(hard)g(to)f(access)j(randomly)295 1810 y(b)o(y)18 +b(\(sa)o(y\))h(a)f(main)o(tenance)f(programmer)g(who)h(wishes)h(only)e(to)i +(div)o(e)f(in)g(and)g(\014x)g(a)g(sp)q(eci\014c)295 1860 y(problem.)f(If)d +(the)g(en)o(tire)h(program)d(is)i(scram)o(bled)f(for)g(sequen)o(tial)h(exp)q +(osition,)f(it)h(can)g(b)q(e)h(hard)295 1909 y(to)f(\014nd)h(the)f(parts)h +(relating)f(to)g(a)g(single)g(function.)k(Someho)o(w)13 b(a)h(balance)g(m)o +(ust)f(b)q(e)i(struc)o(k)g(in)295 1959 y(the)h(do)q(cumen)o(t)f(b)q(et)o(w)o +(een)h(the)g(needs)h(of)d(the)i(sequen)o(tial)f(and)g(of)g(the)h +(random-access)f(reader.)295 2009 y(This)f(balance)g(will)e(dep)q(end)k(on)d +(the)i(in)o(tended)f(use)h(of)e(the)i(program.)295 2083 y Fo(T)l(o)q(o-in)o +(terdep)q(end)o(en)n(t)g(do)q(cumen)o(tati)o(on:)k Fr(Sometimes,)13 +b(when)j(editing)f(a)g(program)f(writ-)295 2133 y(ten)j(using)g(F)m(unnelW)m +(eb,)f(one)h(kno)o(ws)f(ho)o(w)g(to)g(mo)q(dify)f(the)i(program,)e(but)h(one) +h(is)g(unsure)g(of)295 2183 y(ho)o(w)f(to)h(up)q(date)g(the)g(surrounding)f +(do)q(cumen)o(tation!)25 b(The)16 b(do)q(cumen)o(tation)g(ma)o(y)e(b)q(e)j(w) +o(o)o(v)o(en)295 2233 y(in)o(to)e(suc)o(h)g(a)g(net)o(w)o(ork)h(of)e(facts)h +(that)h(it)e(seems)i(that)f(c)o(hanging)f(a)h(small)e(piece)i(of)g(co)q(de)h +(could)295 2282 y(in)o(v)n(alidate)g(man)o(y)f(pieces)k(of)d(do)q(cumen)o +(tation)g(scattered)k(throughout)d(the)h(do)q(cumen)o(t.)27 +b(The)295 2332 y(do)q(cumen)o(tation)12 b(b)q(ecomes)h(a)g(big)g(tar)g(pit)g +(in)f(whic)o(h)h(mo)o(v)o(emen)o(t)e(is)i(imp)q(ossible.)j(F)m(or)c(example,) +295 2382 y(if)18 b(y)o(ou)g(ha)o(v)o(e)g(talk)o(ed)g(ab)q(out)h(a)f +(particular)g(data)g(structure)j(in)o(v)n(arian)o(t)c(throughout)h(a)g(do)q +(cu-)295 2432 y(men)o(t,)f(c)o(hanging)f(that)h(in)o(v)n(arian)o(t)e(in)i(a)f +(small)f(w)o(a)o(y)h(could)h(mean)f(ha)o(ving)g(to)h(up)q(date)g(all)f(the) +295 2482 y(do)q(cumen)o(tation)i(without)g(touc)o(hing)h(m)o(uc)o(h)f(co)q +(de.)33 b(In)19 b(suc)o(h)h(cases,)h(the)e(do)q(cumen)o(tation)f(is)295 +2531 y(to)q(o)c(in)o(terdep)q(enden)o(t.)21 b(This)14 b(could)g(b)q(e)h +(symptomatic)c(of)j(an)f(excessibly)j(in)o(terconnected)g(pro-)295 +2581 y(gram,)g(or)g(of)g(an)h(excessiv)o(ely)h(v)o(erb)q(ose)g(or)e(redundan) +o(t)i(do)q(cumen)o(ting)d(st)o(yle.)27 b(In)17 b(an)o(y)f(case,)i(a)295 +2631 y(balance)13 b(m)o(ust)f(b)q(e)h(struc)o(k)h(b)q(et)o(w)o(een)h(the)e +(con)o(v)o(ersational)f(st)o(yle)h(that)g(encourages)i(redundancy)295 +2681 y(\(b)o(y)c(men)o(tioning)d(things)j(man)o(y)e(times\))h(and)g(the)i +(normalized)d(database)i(approac)o(h)f(where)i(eac)o(h)p 177 +2717 709 2 v 223 2744 a Ff(3)241 2756 y Fh(The)f(fact)g(that)g(these)g +(faults)f(are)h(listed)g(here)g(do)q(es)f(not)h(mean)g(that)g(the)g(author)f +(has)h(eliminated)d(them)j(in)g(his)h(o)o(wn)f(w)o(ork.)177 +2795 y(Rather,)d(it)g(is)g(mainly)f(the)h(author's)e(o)o(wn)i(mistak)o(es)f +(that)g(ha)o(v)o(e)h(resulted)e(in)i(this)g(list)g(b)q(eing)f(compiled.)12 +b(The)c(author)f(immediate)o(ly)177 2835 y(confesses)j(to)h(sev)o(eral)f(of)h +(the)g(faults)f(listed)g(here,)h(most)f(notably)f(that)i(of)g(P)o(a)o(vlo)o +(v)f(do)q(cumen)o(tat)o(ion)o(.)1042 2940 y Fr(50)p eop +%%Page: 51 52 +51 51 bop 295 42 a Fr(fact)17 b(is)f(giv)o(en)g(at)g(only)g(one)g(p)q(oin)o +(t,)g(and)h(the)g(reader)g(is)g(left)f(to)g(\014gure)h(out)f(the)h +(implications)295 91 y(throughout)d(the)h(do)q(cumen)o(t.)295 +164 y Fo(P)o(a)o(vlo)o(v)d(do)q(cumen)o(tation:)i Fr(By)f(placing)e(so)h(m)o +(uc)o(h)f(emphasis)g(on)h(the)g(do)q(cumen)o(tation,)f(F)m(un-)295 +214 y(nelW)m(eb)16 b(naturally)g(pro)o(vides)h(slots)f(where)i(do)q(cumen)o +(tation)d(\\should")h(go.)25 b(F)m(or)17 b(example,)e(a)295 +264 y(F)m(unnelW)m(eb)h(user)i(ma)o(y)d(feel)h(that)h(there)h(ma)o(y)c(b)q(e) +j(a)g(rather)g(unpleasan)o(t)g(gap)f(b)q(et)o(w)o(een)i(a)e +Fl(@C)295 314 y Fr(mark)o(er)g(and)h(the)g(follo)o(wing)d(macro.)25 +b(In)17 b(man)o(y)e(cases)j Fm(no)f Fr(commen)o(tary)e(is)h(needed)i(and)f +(the)295 363 y(zone)c(is)f(b)q(etter)i(left)e(blank)g(rather)h(than)g(b)q +(eing)f(\014lled)g(with)g(the)h(kind)e(of)h(uninformativ)o(e)e(w)o(a\017e)295 +413 y(one)17 b(often)h(\014nds)f(\014lling)e(the)j(slots)f(of)g(structured)i +(do)q(cumen)o(tation)d(written)h(according)g(to)g(a)295 463 +y(military)10 b(standards)k(\(e.g.)e(MIL-STD-2167A\).)1067 +448 y Fg(4)1097 463 y Fr(The)h(lesson)h(is)e(to)h(add)g(do)q(cumen)o(tation)e +(only)295 513 y(when)h(it)e(adds)i(something.)j(The)d(lesson)f(in)g(Strunk)g +(and)g(White)p Fo([Strunk79])e Fr(\(p.)i(23\))f(holds)h(for)295 +563 y(program)i(do)q(cumen)o(tation)f(as)i(it)g(do)q(es)g(for)g(other)g +(writing:)k(\\Vigorous)13 b(writing)g(is)h(concise.)19 b(A)295 +613 y(sen)o(tence)14 b(should)d(con)o(tain)g(no)f(unnecessary)k(w)o(ords,)d +(a)g(paragraph)g(no)g(unnecessary)j(sen)o(tences,)295 662 y(for)h(the)g(same) +f(reason)h(that)f(a)h(dra)o(wing)f(should)g(ha)o(v)o(e)g(no)h(unnecessary)i +(lines)d(and)h(a)f(mac)o(hine)295 712 y(no)g(unnecessary)i(parts.)j(This)13 +b(requires)j(not)d(that)h(the)h(writer)f(mak)o(e)f(all)f(his)i(sen)o(tences)j +(short,)295 762 y(or)d(that)f(he)h(a)o(v)o(oid)f(all)f(detail)h(and)g(treat)i +(his)e(sub)r(jects)j(only)c(in)h(outline,)g(but)h(that)f(ev)o(ery)i(w)o(ord) +295 812 y(tell.".)295 885 y Fo(Duplicate)10 b(do)q(cumen)o(tation)o(:)15 +b Fr(Where)d(the)g(programmer)d(is)i(generating)g(pro)q(duct)h(\014les)g +(that)295 935 y(m)o(ust)17 b(exist)g(on)g(their)h(o)o(wn)f(within)f(the)i(en) +o(tire)g(programming)c(en)o(vironmen)o(t)i(\(e.g.)h(the)h(case)295 +984 y(of)f(a)h(programmer)d(in)j(a)f(team)g(who)h(is)f(using)h(F)m(unnelW)m +(eb)f(for)g(his)h(o)o(wn)g(b)q(ene\014t)h(but)f(m)o(ust)295 +1034 y(generate)c(\(sa)o(y\))f(commen)o(ted)e(Ada)i(sp)q(eci\014cation)g(pac) +o(k)n(age)f(\014les\))i(there)g(is)e(a)h(tendency)h(for)e(the)295 +1084 y(commen)o(ts)k(in)h(the)h(target)f(co)q(de)h(to)g(duplicate)f(the)h +(commen)o(tary)d(in)i(the)h(F)m(unnelW)m(eb)f(text.)295 1134 +y(This)11 b(ma)o(y)e(or)i(ma)o(y)e(not)i(b)q(e)h(a)f(problem,)f(dep)q(ending) +h(on)g(the)h(exact)f(situation.)17 b(Ho)o(w)o(ev)o(er,)11 b(if)g(this)295 +1184 y(is)g(happ)q(ening,)g(it)g(is)f(certainly)h(w)o(orth)g(the)h +(programmer)c(sp)q(ending)k(some)e(time)g(deciding)g(if)g(one)295 +1233 y(or)j(other)g(of)f(the)h(F)m(unnelW)m(eb)f(or)h(inline-comm)o(en)o(t)d +(do)q(cumen)o(tation)i(should)g(b)q(e)h(discarded.)19 b(In)295 +1283 y(man)o(y)11 b(cases,)j(a)e(mixture)g(can)g(b)q(e)i(used,)f(with)f(the)h +(F)m(unnelW)m(eb)f(do)q(cumen)o(tation)g(referring)h(the)295 +1333 y(reader)i(to)f(the)h(inline)e(commen)o(ts)f(where)j(they)f(are)g +(presen)o(t.)20 b(F)m(or)14 b(example:)177 1443 y Fl(@A)22 +b(Here)f(is)g(the)g(header)g(comment)f(for)h(the)g(list)g(package)g +(specification.)177 1493 y(The)g(reader)g(should)f(read)h(these)g(comments)f +(carefully)g(as)i(they)f(define)f(a)i(list.)177 1542 y(There)f(is)g(no)h +(need)f(to)g(duplicate)f(the)h(comments)f(in)i(this)f(text.)177 +1642 y(@$@<Specification)d(package)j(header)f(comments@>==@{@-)177 +1692 y(--)i(LIST)f(PACKAGE)177 1742 y(--)h(============)177 +1792 y(--)g(*)f(A)h(LIST)f(consists)f(of)h(zero)g(or)h(more)f(ITEMS.)177 +1841 y(--)h(*)f(The)g(items)g(are)g(numbered)f(1)i(to)f(N)h(where)f(N)g(is)h +(the)f(number)f(of)i(items)f(in)g(the)g(list.)177 1891 y(--)h(*)f(If)h(the)f +(list)g(is)g(non-empty,)f(item)h(1)g(is)h(called)e(the)h(HEAD)g(of)h(the)f +(list.)177 1941 y(--)h(*)f(If)h(the)f(list)g(is)g(non-empty,)f(item)h(N)g(is) +h(called)e(the)h(TAIL)g(of)h(the)f(list.)177 1991 y(--)h(...)177 +2041 y(@})295 2150 y Fo(Ov)o(erdo)q(cumen)o(tin)o(g:)c Fr(Another)e(evil)f +(that)g(can)g(arise)h(when)f(using)g(F)m(unnelW)m(eb)g(is)g(to)g(o)o(v)o(er-) +295 2200 y(do)q(cumen)o(t)j(the)h(target)g(program.)29 b(In)19 +b(some)e(of)h(Kn)o(uth's)g(earlier)h(\(e.g.)e(1984\))h(examples)f(of)295 +2250 y(literate)11 b(programming,)d(eac)o(h)j(v)n(ariable)f(is)h(giv)o(en)f +(its)h(o)o(wn)f(description)i(and)e(eac)o(h)i(piece)g(of)e(co)q(de)295 +2300 y(has)16 b(a)f(detailed)g(explanation.)22 b(This)16 b(lev)o(el)f(of)g +(analysis,)f(while)h(justi\014ed)h(for)f(tric)o(ky)h(tracts)g(of)295 +2350 y(co)q(de,)d(is)f(probably)g(not)g(w)o(arran)o(ted)h(for)f(most)f(of)h +(the)h(co)q(de)g(that)f(constitutes)i(most)d(programs.)295 +2400 y(Suc)o(h)18 b(o)o(v)o(er-commen)o(ting)d(can)j(ev)o(en)g(ha)o(v)o(e)f +(the)h(detrimen)o(tal)f(a\013ect)h(of)f(obscuring)h(the)g(co)q(de,)295 +2449 y(making)11 b(it)h(hard)h(to)g(understand)h(b)q(ecause)h(it)d(is)h(so)g +(scattered)i(\(see)f(\\spaghetti)f(organization")295 2499 y(earlier\).)18 +b(It)12 b(is)g(up)g(to)g(the)h(user)g(to)f(decide)h(when)f(a)g(stretc)o(h)i +(of)d(just)i(a)e(few)i(lines)f(of)f(co)q(de)i(should)295 2549 +y(b)q(e)i(pulled)e(to)h(bits)g(and)g(analysed)f(and)h(when)h(it)e(is)h +(clearer)h(to)f(lea)o(v)o(e)f(it)h(alone.)295 2622 y(In)i(the)g(case)g(where) +h(there)g(are)e(a)h(few)f(rather)h(tric)o(ky)g(lines)f(of)g(co)q(de,)h(a)f +(detailed)h(explanation)295 2672 y(ma)o(y)10 b(b)q(e)j(appropriate.)k(The)12 +b(follo)o(wing)e(example)g(con)o(tains)i(a)f(solution)g(to)h(a)g(problem)e +(outlined)295 2722 y(in)k(section)g(16.3)f(of)g(the)h(b)q(o)q(ok)g(\\The)g +(Science)h(of)e(Programming")d(b)o(y)k(Da)o(vid)e(Gries)p Fo([Gries81])295 +2771 y Fr(.)p 177 2796 709 2 v 223 2823 a Ff(4)241 2835 y Fh(Note:)j(This)c +(is)h(not)e(a)i(criticism)d(of)i(2167A,)g(only)f(of)i(the)e(w)o(a)o(y)i(it)f +(is)h(sometimes)d(used.)1042 2940 y Fr(51)p eop +%%Page: 52 53 +52 52 bop 177 42 a Fl(@C@<Calculation)19 b(of)i(the)g(longest)g(plateau)f(in) +h(array)g(b@>)177 141 y(This)g(section)f(contains)h(a)g(solution)f(to)i(a)f +(problem)g(outlined)f(in)h(section)g(16.3)f(of)177 191 y(the)h(book)g(@/The)g +(Science)f(of)i(Programming@/)d(by)i(David)g(Gries[Gries81].)177 +291 y(@D)h(Given)e(a)i(sorted)e(array)h(@{b[1..N]@})f(of)h(integers,)f(we)h +(wish)g(to)h(determine)e(the)177 340 y(@/length@/)g(of)h(the)g(longest)g(run) +g(of)g(identically)f(valued)g(elements)h(in)g(the)g(array.)177 +390 y(This)g(problem)f(is)i(defined)e(by)i(the)f(following)f(precondition)f +(and)i(postcondition.)177 490 y(@$@<Precondition@>)o(==@{/)o(*)e(Pre:)i +(sorted\(b\).)f(*/@})177 540 y(@$@<Postcondition@)o(>==@{)o(@-)177 +589 y(/*)i(Post:)e(sorted\(b\))g(and)h(p)h(is)f(the)h(length)e(of)h(the)h +(longest)e(run)h(in)h(b[1..N].)e(*/@})177 689 y(@D)i(We)f(approach)f(a)i +(solution)e(to)h(the)g(problem)g(by)g(deciding)f(to)i(try)f(the)g(approach)f +(of)177 739 y(scanning)g(through)h(the)g(array)g(one)g(element)f(at)h(a)h +(time)f(maintaining)f(a)h(useful)177 789 y(invariant)f(through)g(each)h +(iteration.)f(A)i(loop)f(variable)177 839 y(array)g(index)g(@{i@})f(is)i +(created)e(for)h(this)g(purpose.)f(The)i(bound)e(function)h(is)177 +888 y(@{N-i@}.)f(Here)h(is)h(the)f(invariant.)177 988 y(@$@<Invariant@>==@)o +({@-)177 1038 y(/*)h(Invariant:)d(sorted\(b\))h(and)h(1<=i<=N)g(and)239 +b(*/)177 1088 y(/*)261 b(p)22 b(is)f(len)g(of)h(longest)e(run)h(in)h +(b[1..i].)e(*/@})177 1187 y(@D)i(Establishing)d(the)i(invariant)f(above)h(in) +g(the)g(initial,)f(degenerate)g(case)h(is)g(easy.)177 1287 +y(@$@<Establish)e(the)i(plateau)g(loop)g(invariant)f(initially@>==@{i)o(=1;)f +(p=1;@})177 1386 y(@D)j(At)f(this)g(stage,)f(we)i(have)f(the)g(following)f +(loop)h(structure.)f(Note)h(that)g(when)f(both)177 1436 y(the)h(invariant)f +(and)h(@{i)h(!=)f(N@})g(are)g(true,)g(the)g(postcondition)e(holds)i(and)g +(the)g(loop)177 1486 y(can)g(terminate.)177 1586 y(@$@<Set)g(p)g(to)g(the)h +(length)e(of)i(the)f(longest)f(plateau)g(in)i(sorted)e(array)h +(b[1..N]@>==@{@-)177 1636 y(@<Precondition@>)177 1685 y(@<Establish)f(the)h +(plateau)f(loop)h(invariant)f(initially@>)177 1735 y(while)h(\(i)g(!=)h(N\)) +221 1785 y({)243 1835 y(@<Invariant@>)243 1885 y(@<Loop)e(body@>)221 +1934 y(})177 1984 y(@<Postcondition@>)177 2034 y(@})177 2134 +y(@D)i(Now)f(there)f(remains)h(only)g(the)g(loop)g(body)g(whose)g(sole)g +(task)g(is)g(to)g(increase)f(@{i@})177 2183 y(\(and)h(so)h(decrease)e(the)h +(value)g(of)g(the)g(bound)g(function\))f(while)h(maintaining)e(the)177 +2233 y(invariant.)h(If)h(@{p@})g(is)g(the)h(length)e(of)i(the)f(longest)f +(run)177 2283 y(seen)h(so)h(far)f(\(i.e.)f(in)i(b[1..i]\),)e(then,)h(because) +f(the)h(array)g(is)g(sorted,)177 2333 y(the)g(extension)f(of)i(our)f(array)g +(range)f(to)177 2383 y(@{b[1..i+1]@})f(can)i(only)g(result)g(in)g(an)h +(increase)e(in)h(@{p@})g(if)g(the)h(new)f(element)177 2433 +y(terminates)f(a)h(run)h(of)f(length)g(@{p+1@}.)f(The)h(increase)f(can)h(be)h +(at)f(most)g(1.)g(Because)177 2482 y(the)g(array)g(is)g(sorted,)g(we)g(need) +177 2532 y(only)g(compare)f(the)i(endpoints)e(of)h(this)g(possible)f(run)h +(to)h(see)f(if)g(it)h(exists.)e(This)177 2582 y(is)i(performed)d(as)j(shown)f +(below.)177 2682 y(@$@<Loop)f(body@>==@{i++;)f(if)j(\(b[i])e(!=)i(b[i-p]\))e +(p++;@})295 2827 y Fr(Where)15 b(the)f(co)q(de)h(is)f(more)f(ob)o(vious,)f +(it)i(is)g(often)g(b)q(etter)h(to)f(let)g(the)g(co)q(de)h(sp)q(eak)g(for)e +(itself.)1042 2940 y(52)p eop +%%Page: 53 54 +53 53 bop 177 42 a Fl(@C)22 b(The)f(following)f(function)g(compares)g(two)h +(C~strings)f(and)h(returns)g(TRUE)g(iff)g(they)177 91 y(are)g(identical.)177 +191 y(@$@<Function)e(comp@>==@{@-)177 241 y(bool)i(comp\(p,q\))177 +291 y(char)g(*p,*q;)177 340 y({)199 390 y(while)g(\(TRUE\))243 +440 y({)264 490 y(if)h(\(*p)f(!=)g(*q)43 b(\))22 b(return)f(FALSE;)264 +540 y(if)h(\(*p)f(==)g('\\0'\))g(return)g(TRUE;)264 589 y(p++;)g(q++;)243 +639 y(})177 689 y(})177 739 y(@})177 932 y Fi(2.12)70 b(Wholistic)20 +b(Debugging)177 1062 y Fr(Surprising)f(though)f(it)g(ma)o(y)e(b)q(e,)k(F)m +(unnelW)m(eb)e(has)g(a)h(k)o(ey)f(role)g(to)h(pla)o(y)e(in)h(the)h +Fm(debugging)h Fr(of)d(programs.)177 1112 y(Long)12 b(exp)q(erience)i(in)e +(programming)d(has)k(led)f(me)f(to)h(the)h(concept)h(of)e Fo(wholistic)f +(debugging)p Fr(.)j(When)f(most)177 1162 y(programmers)g(detect)j(a)e(bug,)g +(their)g(\014rst)h(reaction)g(seems)g(to)f(b)q(e)h(to)f(jump)f(in)o(to)h(the) +h(debugger)g(where)g(they)177 1212 y(often)f(sp)q(end)h(man)o(y)e(hours)h +(stepping)h(through)f(endless)h(stretc)o(hes)i(of)c(co)q(de)i(and)f +(generally)g(w)o(asting)f(a)h(lot)f(of)177 1261 y(time.)177 +1346 y(In)j(con)o(trast,)g(m)o(y)d(\014rst)j(reaction)g(when)g(I)f(detect)i +(a)e(bug)h(is)f(to)g(realize)h(that)f Fm(the)h(c)n(o)n(de)h(must)f(not)h(b)n +(e)f(in)g(go)n(o)n(d)177 1396 y(enough)j(shap)n(e)g(if)f(such)g(a)g(bug)h(c)n +(an)f(arise.)28 b Fr(The)18 b(presence)i(of)d(the)h(bug)f(is)g(tak)o(en)g(as) +h(symptomatic)c(of)j(the)177 1446 y(lac)o(k)g(of)f(general)i(health)f(of)f +(the)i(co)q(de.)29 b(If)17 b(that)g(bug)g(o)q(ccurred,)i(wh)o(y)e(not)g +(another?)28 b(In)18 b(resp)q(onse)h(to)e(this)177 1495 y(realization,)12 +b(m)o(y)f(reaction)i(is)g(not)g(to)g(en)o(ter)h(the)f(debugger,)g(but)h +(rather)f(to)g(return)h(to)f(the)g(original)e(co)q(de)j(and)177 +1545 y(tend)k(it)e(lik)o(e)h(a)f(garden,)i(adding)e(more)g(commen)o(ts,)f +(rew)o(orking)i(the)h(grott)o(y)e(bits,)i(adding)e(assertions,)i(and)177 +1595 y(lo)q(oking)d(for)h(faults.)26 b(In)16 b(man)o(y)f(cases,)j(the)f +(searc)o(h)h(for)e(faults)g(do)q(es)h(not)f(ev)o(en)h(cen)o(tre)i(on)d(the)h +(sp)q(eci\014c)h(bug)177 1645 y(that)c(arose,)g(but)g(do)q(es)h(tend)f(to)g +(fo)q(cus)g(on)g(the)h(area)f(of)f(co)q(de)i(where)g(the)f(bug)g(is)g(lik)o +(ely)e(to)i(b)q(e.)177 1729 y(The)h(result)g(is)f(often)g(that)h(the)g +(original)d(bug)i(is)h(lo)q(cated)f(more)f(quic)o(kly)h(than)g(it)g(w)o(ould) +f(ha)o(v)o(e)i(b)q(een)g(had)f(the)177 1779 y(debugger)i(b)q(een)h(in)o(v)o +(olv)o(ed.)k(But)16 b(ev)o(en)f(if)g(it)g(isn't,)g(there)h(are)g(other)g(b)q +(ene\014ts.)24 b(A)15 b(programmer)e(who)i(en)o(ters)177 1829 +y(the)g(debugger)f(ma)o(y)e(sta)o(y)i(there)i(for)d(hours)h(and)g(still)f +(not)h(\014nd)g(the)h(bug.)j(The)c(result)h(is)e(frustration)h(and)g(no)177 +1879 y(p)q(ositiv)o(e)c(gain)g(at)g(all.)15 b(In)c(con)o(trast,)g(b)o(y)f +(tending)g(to)g(the)h(co)q(de,)h(the)f(programmer)d(is)i(making)e(forw)o(ard) +i(progress)177 1929 y(at)15 b(all)f(times)h(\(the)h(co)q(de)g(is)f(constan)o +(tly)g(impro)o(ving\))e(ev)o(en)j(if)f(the)h(bug)f(is)g(not)g(immediately)d +(found.)22 b(A)o(t)15 b(the)177 1979 y(end)i(of)e(ten)i(hours,)g(the)g +(programmer)d(can)i(at)g(least)g(feel)h(that)f(the)h(co)q(de)g(is)f(\\ten)g +(hours)h(b)q(etter",)g(whereas)177 2028 y(the)e(debugger)h(freak)e(will)f +(lik)o(ely)g(feel)i(defeated.)21 b(All)13 b(this)i(mak)o(es)e(co)q(de)i +(tending)g(b)q(etter)h(psyc)o(hologically)d(as)177 2078 y(w)o(ell)g(as)h(a)g +(more)f(e\016cien)o(t)h(approac)o(h)g(to)g(debugging.)177 2163 +y(I)19 b(call)f(this)h(tec)o(hnique)g(wholistic)f(debugging,)h(for)f(it)h(is) +f(lik)o(e)g(the)i(di\013erence)g(b)q(et)o(w)o(een)g(con)o(v)o(en)o(tional)e +(and)177 2213 y(wholistic)d(medicine.)20 b(Go)15 b(to)g(a)f(con)o(v)o(en)o +(tional)g(do)q(ctor)i(with)f(a)f(headac)o(he)i(and)f(he)h(migh)o(t)d(send)j +(o\013)f(for)f(head)177 2262 y(X-ra)o(ys,)20 b(p)q(erform)e(allergy)g(tests)i +(and)f(p)q(erform)f(man)o(y)f(other)i(debugging)f(activities.)33 +b(Go)18 b(to)h(a)f(wholistic)177 2312 y(do)q(ctor)e(with)f(the)g(same)f +(problem)g(and)h(he)h(migh)o(t)d(lo)q(ok)h(to)h(see)h(if)e(y)o(ou)h(are)g +(\014t,)g(assess)i(y)o(our)e(men)o(tal)e(health,)177 2362 y(and)i(ask)h(y)o +(ou)f(if)f(y)o(our)i(marriage)d(is)j(w)o(orking.)21 b(Both)16 +b(approac)o(hes)g(are)g(appropriate)f(at)h(di\013eren)o(t)g(times.)22 +b(In)177 2412 y(programming,)10 b(the)k(wholistic)g(approac)o(h)f(is)h(not)g +(used)h(enough.)177 2605 y Fi(2.13)70 b(Examples)22 b(of)h(F)-6 +b(unnelW)g(eb)23 b(Applications)177 2735 y Fr(Despite)16 b(\(or)g(p)q(erhaps) +g(b)q(ecause)i(of)s(\))d(its)g(\015exibilit)o(y)f(and)h(simplicit)o(y)m(,)e +(F)m(unnelW)m(eb)i(can)g(b)q(e)i(applied)d(to)i(quite)177 2785 +y(a)f(n)o(um)o(b)q(er)f(of)h(di\013eren)o(t)h(text)g(pro)q(cessing)g(and)f +(do)q(cumen)o(ting)f(problems.)21 b(This)15 b(section)h(describ)q(es)h(some)d +(of)177 2835 y(the)h(more)e(in)o(teresting)h(real)g(problems)f(that)h(F)m +(unnelW)m(eb)f(has)h(solv)o(ed.)1042 2940 y(53)p eop +%%Page: 54 55 +54 54 bop 177 42 a Fd(2.13.1)55 b(Analyzing)19 b(the)f(Monster)g(P)n +(ostscript)h(Header)f(File)177 141 y Fr(During)c(m)o(y)e(Ph.D.)h +(candidature,)h(I)g(determined)g(at)g(one)g(p)q(oin)o(t)g(that)g(it)g(w)o +(ould)f(b)q(e)i(v)o(ery)f(desirable)g(to)g(auto-)177 191 y(matically)f +(insert)j(diagrams)d(from)h(the)i Fm(MacDr)n(aw)g Fr(program)e(on)h(m)o(y)f +(Macin)o(tosh)h(in)o(to)g(T)1627 200 y(E)1650 191 y(X)g Fl(insert)p +Fr(ions)f(in)177 240 y(m)o(y)e(thesis.)20 b(This)14 b(w)o(ould)f(allo)o(w)f +(diagrams)g(to)i(\015oat)f(around)h(with)g(the)h(text)f(and)g(b)q(e)h(prin)o +(ted)f(automatically)177 290 y(rather)k(than)f(ha)o(ving)g(to)g(b)q(e)g(prin) +o(ted)h(separately)g(and)f(stuc)o(k)h(in)f(with)g(real)g(glue.)27 +b(On)18 b(the)g(face)f(of)g(it,)g(the)177 340 y(problem)c(seemed)i(inheren)o +(tly)g(solv)n(able)e(as)i(the)g(Macin)o(tosh)g(could)f(generate)i(P)o +(ostScript)f(for)f(eac)o(h)h(diagram)177 390 y(and)f(this)g(P)o(ostScript)h +(could)e(presumably)g(b)q(e)i(inserted)g(in)o(to)e(the)h(P)o(ostScript)h +(generated)g(using)f(T)1768 399 y(E)1791 390 y(X.)177 462 y(The)19 +b(only)e(trouble)h(w)o(as)g(that)g(the)h(Macin)o(tosh)f(P)o(ostScript)h(co)q +(de)g(for)f(the)g(diagrams)f(relied)h(on)g(an)g(Apple)177 512 +y(P)o(ostScript)d(header)f(\014le.)k(This)c(mean)o(t)f(that)g(the)i(header)g +(\014le)e(had)h(to)f(b)q(e)i(included)f(at)f(the)i(start)f(of)f(the)i(T)1895 +521 y(E)1918 512 y(X)177 562 y(P)o(ostScript)d(if)d(the)j(inserted)g(P)o +(ostScript)f(for)f(the)h(diagrams)e(w)o(as)i(to)f(w)o(ork.)17 +b(Unfortunately)m(,)10 b(merely)g(including)177 612 y(the)17 +b(header)g(\014le)f(at)g(the)g(top)g(didn't)f(w)o(ork,)h(and)g(it)g(turned)h +(out)e(that)i(a)e(rather)i(detailed)f(analysis)f(of)h(some)177 +662 y(parts)d(of)e(the)h(Apple)g(header)h(\014le)f(w)o(as)g(required)h(in)e +(order)i(to)e(p)q(erform)g(the)i(necessary)h(surgery)f(on)e(the)i(header)177 +712 y(\014le)h(to)f(mak)o(e)f(it)h(w)o(ork.)18 b(This)13 b(analysis)g(w)o(as) +g(sev)o(erely)i(aggra)o(v)n(ated)e(b)o(y)g(the)h(fact)g(that)f(the)h(P)o +(ostScript)h(header)177 761 y(\014le)f(w)o(as)g(virtually)e(unreadable.)18 +b(Basically)13 b(it)h(w)o(as)f(ab)q(out)h(50K)g(of)f(in)o(terw)o(o)o(v)o(en)g +(de\014nitions,)h(that)g(lo)q(ok)o(ed)f(as)177 811 y(if)f(it)g(had)g(b)q(een) +i(run)f(through)f(a)g(w)o(ord)h(pro)q(cessor.)19 b(There)14 +b(w)o(as)e(no)g(w)o(a)o(y)g(that)h(the)g(co)q(de)g(could)f(b)q(e)i(understo)q +(o)q(d)177 861 y(clearly)g(without)f(some)g(kind)g(of)h(reformatting.)i(Tw)o +(o)d(other)i(asp)q(ects)g(of)e(the)i(problem)d(further)j(complicated)177 +911 y(the)g(analysis:)239 1019 y Fq(\017)21 b Fr(The)12 b(de\014nitions)h(of) +e(in)o(terest)i(\(i.e.)f(the)g(ones)h(causing)f(the)h(problems\))e(w)o(ere)i +(scattered)h(throughout)e(the)281 1069 y(\014le.)239 1150 y +Fq(\017)21 b Fr(Man)o(y)c(de\014nitions)h(could)g(not)g(b)q(e)h(mo)o(v)o(ed.) +28 b(F)m(or)18 b(one)g(or)g(more)f(reasons)i(\(e.g.)e(to)h(k)o(eep)h(a)e +(de\014nition)281 1200 y(within)e(the)h(activ)n(ation)f(of)g(a)h(particular)f +(dictionary)h Fl(begin)e Fr(and)i Fl(end)p Fr(\))f(it)h(w)o(ould)f(ha)o(v)o +(e)h(b)q(een)h(un)o(wise)281 1250 y(to)d(mo)o(v)o(e)e(the)i(de\014nitions)g +(of)g(in)o(terest)h(to)e(the)i(same)e(p)q(oin)o(t)g(in)h(the)g(\014le.)177 +1358 y(In)f(fact)g(the)h(\014le)f(w)o(as)g(so)g(messy)g(and)g(complicated)f +(that,)g(as)i(a)e(rule,)h(it)g(had)g(to)g(b)q(e)h(handled)f(with)f(kid)h(glo) +o(v)o(es.)177 1408 y(It)h(w)o(ould)f(ha)o(v)o(e)h(b)q(een)h(un)o(wise)f(to)g +(re-arrange)g(the)h(de\014nitions)f(or)g(to)f(insert)i(commen)o(ts.)177 +1481 y(T)m(o)j(m)o(y)f(surprise,)k(F)m(unnelW)m(eb)d(pro)o(vided)g(an)h +(unexp)q(ected)i(solution)c(to)i(the)g(problem.)31 b(First)19 +b(I)g(replaced)177 1531 y(all)e(o)q(ccurrences)j(of)d(the)i +Fl(@)e Fr(in)g(the)h(header)h(\014le)f(with)f Fl(@@)p Fr(.)29 +b(Second,)19 b(I)e(placed)h(the)g(en)o(tire)h(header)f(\014le)g(in)f(a)177 +1580 y(F)m(unnelW)m(eb)d(macro)f(de\014nition)h(connected)j(to)d(a)g(pro)q +(duct)h(\014le.)20 b(I)14 b(then)i(pro)q(cessed)g(the)f(\014le)g(and)f(c)o +(hec)o(k)o(ed)i(to)177 1630 y(mak)o(e)f(sure)i(that)g(the)f(pro)q(duct)i +(\014le)e(w)o(as)g(iden)o(tical)g(to)g(the)h(original)d(\014le.)25 +b(By)17 b(doing)e(all)g(this)h(I)g(had)h(placed)177 1680 y(the)f(header)g +(\014le)g(under)g(F)m(unnelW)m(eb)e(con)o(trol.)22 b(I)16 b(then)f(left)g +(the)h(macro)e(de\014nition)h(largely)g(un)o(touc)o(hed,)h(but)177 +1730 y(replaced)21 b(the)f(P)o(ostScript)g(de\014nitions)f(of)g(in)o(terest)i +(with)e(F)m(unnelW)m(eb)g(macro)f(calls,)i(mo)o(ving)d(the)j(actual)177 +1780 y(P)o(ostScript)15 b(de\014nitions)f(in)o(to)f(F)m(unnelW)m(eb)g(macro)g +(de\014nitions)h(at)g(the)g(end)g(of)g(the)g(F)m(unnelW)m(eb)g(\014le.)177 +1888 y Fl(@O@<LaserHeader.ps)o(@>==@)o({@-)177 1938 y(Unreadable)20 +b(Postscript)g(code)177 1988 y(@<Print)h(routine@>)177 2038 +y(Unreadable)f(Postscript)g(code)177 2087 y(@<Zap)h(routine@>)177 +2137 y(Unreadable)f(Postscript)g(code)177 2187 y(@})177 2287 +y(@A)i(This)f(routine)f(looks)h(as)g(if)g(it)h(does)f(this,)f(but)i(really)e +(is)i(does)f(that,)177 2337 y(blah,)g(blah)g(blah.)177 2436 +y(@$@<Print)f(routine@>==@{@-)177 2486 y(/print)h({)g(push)g(pop)g(pop)h +(push)f(turn)g(around)f(and)h(jump)g(up)h(and)f(down)g(and)g(print)g(it})g +(def)177 2536 y(@})177 2635 y(@A)h(This)f(routine)f(zaps)h(the...)177 +2735 y(@$@<Zap)g(routine@>==@{@-)177 2785 y(/zap)g({)h(push)f(pop)g(pop)g +(push)g(turn)g(around)g(and)g(jump)g(up)g(and)g(down)g(and)g(print)g(it})g +(def)177 2835 y(@})1042 2940 y Fr(54)p eop +%%Page: 55 56 +55 55 bop 177 42 a Fr(Use)19 b(of)f(F)m(unnelW)m(eb)g(mean)o(t)f(that)h(I)g +(w)o(as)h(able)f(to)g(pluc)o(k)g(out)g(the)h(de\014nitions)f(of)g(in)o +(terest)h(\(a)f(v)o(ery)h(small)177 91 y(part)g(of)e(the)i(whole)g(\014le\))f +(and)g(collect)h(them)f(as)g(a)g(group)g(at)h(the)g(end)f(of)g(the)h(\014le)g +(where)g(they)g(could)f(b)q(e)177 141 y(studied.)g(Because)13 +b(eac)o(h)f(de\014nition)e(w)o(as)i(safely)e(con)o(tained)i(in)e(a)h(macro,)f +(it)h(w)o(as)g(p)q(ossible)g(to)g(write)h(a)f(detailed)177 +191 y(commen)o(tary)i(of)i(eac)o(h)g(routine)h(without)e(fear)i(of)e +(a\013ecting)i(the)f(\014nal)g(P)o(ostScript)h(co)q(de)g(in)e(an)o(y)h(w)o(a) +o(y)f(at)h(all.)177 241 y(Once)h(this)f(analysis)e(w)o(as)i(completed,)f(it)g +(w)o(as)g(p)q(ossible)h(to)g(p)q(erform)e(surgery)j(on)e(the)i(o\013ending)e +(P)o(ostScript)177 291 y(de\014nitions)k(in)f(an)h(extremely)f(con)o(trolled) +h(w)o(a)o(y)m(.)28 b(In)18 b(particular,)g(the)h(F)m(unnelW)m(eb)e(input)g +(\014le)h(serv)o(ed)h(as)f(a)177 340 y(rep)q(ository)f(for)g(all)e(the)i +(di\013eren)o(t)h(v)o(ersions)f(of)f(particular)g(routines)h(that)g(w)o(ere)g +(tried)g(in)g(order)g(to)f(get)h(the)177 390 y(de\014nitions)g(to)g(w)o(ork.) +27 b(A)17 b(new)g(\()p Fo(Z)p Fr(ero\))h(macro)d(w)o(as)i(created)i(for)d +(eac)o(h)i(v)o(ersion)f(of)f(eac)o(h)i(de\014nition,)e(and)h(a)177 +440 y(commen)o(tary)12 b(of)h(ho)o(w)h(it)f(p)q(erformed)h(added)g(ab)q(o)o +(v)o(e)f(it.)177 516 y(This)e(case)g(demonstrates)h(that)e(F)m(unnelW)m(eb)g +(is)h(an)g(extremely)f(p)q(o)o(w)o(erful)g(to)q(ol)g(for)g(dissecting)i(and)e +(do)q(cumen)o(t-)177 566 y(ing)15 b(cryptic)h(text)g(\014les.)22 +b(Through)16 b(the)g(use)g(of)e(macros,)h(particular)g(parts)h(of)e(the)i +(\014le)g(can)f(b)q(e)h(isolated)f(and)177 616 y(discussed)i(without)e +(a\013ecting)g(the)h(\014nal)f(pro)q(duct)h(\014le)f(in)g(an)o(y)f(w)o(a)o(y) +m(.)21 b(In)15 b(the)h(example)e(ab)q(o)o(v)o(e,)h(only)f(a)h(small)177 +665 y(part)d(of)f(the)i(\014le)e(w)o(as)h(analysed,)f(the)i(rest)g(b)q(eing)e +(left)h(as)g(a)f(blob,)g(but)h(in)g(the)g(general)g(case,)h(a)e(cryptic)h +(text)h(\014le)177 715 y(could)i(b)q(e)g(inserted)h(in)o(to)e(F)m(unnelW)m +(eb)g(and)h(then)g(incremen)o(tally)e(dissected)k(\(and)e(p)q(ossibly)f(mo)q +(di\014ed\))g(un)o(til)177 765 y(the)k(result)g(is)g(a)f(fully)f(do)q(cumen)o +(ted)h(literate)h(program.)27 b(That)17 b(this)g(can)h(b)q(e)g(done)f +(without)g(a\013ecting)h(the)177 815 y(actual)c(pro)q(duct)g(\014le)g +(demonstrates)h(the)f(high)f(degree)j(of)d(descriptiv)o(e)i(con)o(trol)e +(that)h(F)m(unnelW)m(eb)g(pro)o(vides.)177 960 y Fd(2.13.2)55 +b(Making)19 b(Ada)g(ADTs)g(more)e(A)177 1063 y Fr(Lik)o(e)c(man)o(y)f(mo)q +(dern)g(programming)e(languages,)j(Ada)g(pro)o(vides)h(mec)o(hanisms)d(for)i +(hiding)f(information)f(and)177 1113 y(structure.)25 b(In)16 +b(particular,)f(Ada)g(pro)o(vides)h(a)f Fo(pac)o(k)m(age)h +Fr(facilit)o(y)d(that)j(allo)o(ws)e(the)i(programmer)e(to)h(declare)177 +1163 y(ob)r(jects)g(in)e(a)g(pac)o(k)n(age)h(de\014nition)f(and)g(de\014ne)i +(them)e(in)g(a)g(corresp)q(onding)i(pac)o(k)n(age)e(b)q(o)q(dy)m(.)k(This)d +(w)o(orks)f(w)o(ell)177 1213 y(for)h(functions)g(and)g(pro)q(cedures.)20 +b(Ho)o(w)o(ev)o(er,)14 b(in)g(the)g(case)h(of)f(t)o(yp)q(es,)g(implemen)o +(tation)d(issues)k(\(in)e(particular,)177 1262 y(the)h(need)h(to)e(kno)o(w)g +(the)h(size)h(of)e(exp)q(orted)h(t)o(yp)q(es\))h(ha)o(v)o(e)e(led)h(the)g +(designers)h(of)d(Ada)i(to)f(force)h(the)g(placemen)o(t)177 +1312 y(of)f(priv)n(ate)g(t)o(yp)q(e)g(de\014nitions)g(in)g(the)h +(de\014nition)e(pac)o(k)n(age)h(rather)h(than)f(the)h(implemen)o(tatio)o(n)c +(pac)o(k)n(age.)18 b(This)177 1362 y(means)12 b(that)h(some)g(implem)o(en)o +(tation)d(details)j(are)g(presen)o(t)i(in)d(the)i(pac)o(k)n(age)f +(de\014nition)f(for)h(all)f(to)h(see.)19 b(While)177 1412 y(not)i(actually)e +(dangerous)i(\(the)h(user)g(of)d(the)j(pac)o(k)n(age)e(cannot)h(mak)o(e)e +(use)i(of)f(the)h(information)d(without)177 1462 y(recourse)d(to)d(\\Chapter) +h(13")f(of)g(the)i(Ada)e(Language)g(Reference)j(Man)o(ual)p +Fo([DOD83])p Fr(\),)c(this)h(asp)q(ect)i(of)e(Ada)h(is)177 +1512 y(certainly)h(unpleasan)o(t.)177 1588 y(During)9 b(the)i(dev)o(elopmen)o +(t)e(of)h(some)f(Ada)h(programs,)f(F)m(unnelW)m(eb)g(w)o(as)h(used)h(to)f +(solv)o(e)g(this)g(problem.)15 b(Instead)177 1637 y(of)j(creating)i(a)e +(separate)i(\014le)f(for)g(the)g(pac)o(k)n(age)g(sp)q(eci\014cation)h(and)e +(pac)o(k)n(age)h(b)q(o)q(dy)m(,)g(a)g(single)f(F)m(unnelW)m(eb)177 +1687 y(\014le)h(w)o(as)f(created)i(con)o(taining)d(t)o(w)o(o)h(sections,)i +(one)f(for)f(the)h(eac)o(h)g(pac)o(k)n(age)f(part.)31 b(The)19 +b(\\priv)n(ate")f(part)g(of)177 1737 y(the)h(pac)o(k)n(age)f(sp)q +(eci\014cation)h(w)o(as)f(then)g(mo)o(v)o(ed)f(\(using)h(a)g(F)m(unnelW)m(eb) +f(macro)g(de\014nition\))h(to)g(the)h(section)177 1787 y(describing)f(the)h +(pac)o(k)n(age)e(b)q(o)q(dy)m(.)29 b(Readers)18 b(who)g(wished)g(only)e(to)i +(read)g(the)g(pac)o(k)n(age)g(sp)q(eci\014cation)g(could)177 +1837 y(read)13 b(only)e(the)i(\014rst)g(part,)f(whic)o(h)g(con)o(tained)g(a)g +(fully)e(do)q(cumen)o(ted)j(description)f(not)g(con)o(taining)f(the)i(priv)n +(ate)177 1886 y(de\014nition.)177 2031 y Fd(2.13.3)55 b(Multiple)18 +b(Language)g(Systems)177 2135 y Fr(With)10 b(the)h(prev)n(alence)h(of)e(op)q +(en)h(systems)g(and)f(m)o(ulti-v)o(endor)f(computing,)g(it)h(is)g(often)h +(necessary)i(to)d(construct)177 2185 y(systems)20 b(consisting)g(of)f +(programs)f(written)i(in)g(a)f(n)o(um)o(b)q(er)g(of)g(di\013eren)o(t)i +(programmi)o(ng)c(languages)i(for)g(a)177 2234 y(n)o(um)o(b)q(er)c(of)f +(di\013eren)o(t)j(systems.)22 b(F)m(or)15 b(example,)f(a)h(particular)g +(functionalit)o(y)f(migh)o(t)f(b)q(e)j(implemen)o(ted)d(b)o(y)i(a)177 +2284 y(shellscript)k(\(in)o(v)o(ok)o(ed)e(b)o(y)g(the)h(user\))h(that)f +(calls)f(a)h(C)f(program)f(that)i(mak)o(es)f(a)g(net)o(w)o(ork)h(connection)h +(to)e(a)177 2334 y(P)o(ascal)e(program)f(that)h(queries)h(a)f(database.)23 +b(Quite)15 b(often)h(all)e(these)i(programs)e(m)o(ust)h(conspire)h(closely)f +(to)177 2384 y(execute)k(their)e(function.)25 b(In)17 b(the)g(normal)d(case,) +k(they)f(m)o(ust)f(b)q(e)h(written)g(separately)m(.)26 b(F)m(unnelW)m(eb)16 +b(allo)o(ws)177 2434 y(them)d(to)h(b)q(e)g(written)h(as)f(a)f(whole.)177 +2510 y(By)19 b(creating)f(a)g(single)g(F)m(unnelW)m(eb)g(\014le)g(that)g +(creates)i(man)o(y)c(pro)q(duct)j(\014les)g(in)f(di\013eren)o(t)h(languages,) +f(the)177 2559 y(programmer)c(can)i(describ)q(e)i(the)e(in)o(teraction)g(b)q +(et)o(w)o(een)i(the)e(di\013eren)o(t)h(programs)e(in)g(an)o(y)h(manner)f +(desired.)177 2609 y(F)m(urthermore,)f(b)q(ecause)i(the)e(di\013eren)o(t)h +(pro)q(duct)g(\014les)g(are)g(all)d(created)k(in)e(the)g(same)g(\\text)g +(space")h(\(i.e.)e(in)h(a)177 2659 y(single)g(F)m(unnelW)m(eb)f(\014le\),)h +(it)f(is)h(easy)g(for)g(them)f(to)h(share)g(information.)177 +2735 y(F)m(or)h(example,)e(in)i(one)g(real)g(application)e(F)m(unnelW)m(eb)i +(w)o(as)g(used)g(to)g(create)i(a)d(system)h(for)g(prin)o(ting)f(\014les)h(on) +177 2785 y(a)i(laser)h(prin)o(ter)g(connected)i(to)d(a)g(remote)g(V)m(ax)g +(Unix)g(mac)o(hine)g(from)e(a)j(lo)q(cal)e(V)m(ax)h(VMS)h(mac)o(hine.)27 +b(The)177 2835 y(system)18 b(consisted)h(of)f(t)o(w)o(o)g(\014les:)27 +b(a)18 b(VMS)g(DCL)g(command)d(pro)q(cedure)20 b(to)e(run)h(on)f(the)g(lo)q +(cal)g(no)q(de,)h(and)1042 2940 y(55)p eop +%%Page: 56 57 +56 56 bop 177 42 a Fr(a)16 b(Unix)h(shellscript)g(to)f(run)h(on)g(the)g +(remote)f(no)q(de.)27 b(The)17 b(user,)h(b)o(y)e(giving)f(the)i(prin)o(t)g +(command,)d(in)o(v)o(ok)o(ed)177 91 y(the)h(lo)q(cal)f(VMS)h(command)d(pro)q +(cedure,)17 b(whic)o(h)d(in)g(turn)i(\014red)f(up)g(the)g(remote)g(Unix)f +(shellscript.)21 b(The)15 b(t)o(w)o(o)177 141 y(scripts)g(then)g(co)q(op)q +(erated)g(to)f(transfer)h(the)f(\014les)g(to)g(b)q(e)h(prin)o(ted)f(and)g +(prin)o(t)f(them.)177 215 y(In)e(addition)f(to)h(its)g(usual)f(do)q(cumen)o +(tation)g(p)q(o)o(w)o(ers,)i(F)m(unnelW)m(eb)e(assisted)i(in)e(the)i +(creation)f(of)g(this)g(system)f(in)177 265 y(t)o(w)o(o)i(sp)q(ecial)g(w)o(a) +o(ys.)17 b(First,)c(it)e(allo)o(w)o(ed)g(pieces)i(of)f(co)q(de)h(from)d(the)j +(t)o(w)o(o)e(di\013eren)o(t)j(command)9 b(pro)q(cedures)14 +b(to)e(b)q(e)177 315 y(partially)g(in)o(terw)o(o)o(v)o(en)h(in)g(a)g +(description)h(of)f(their)g(in)o(teraction.)18 b(This)13 b(is)h(just)f(not)g +(p)q(ossible)h(with)f(commen)o(ts.)177 364 y(Second,)19 b(it)e(facilitated)g +(the)h(use)h(of)e(shared)i(information.)26 b(F)m(or)17 b(example,)g(under)i +(some)d(conditions,)i(eac)o(h)177 414 y(\014le)d(to)f(b)q(e)h(prin)o(ted)g(w) +o(ould)f(b)q(e)h(renamed)f(and)h(copied)f(to)h(the)g(remote)f(system)g(using) +h(a)f(particular)g(constan)o(t)177 464 y(\014lename)h(\(e.g.)g(\\)p +Fl(printfile.tmp)p Fr("\).)20 b(F)m(unnelW)m(eb)15 b(allo)o(w)o(ed)g(this)g +(constan)o(t)i(\014lename)d(to)i(b)q(e)g(included)g(in)f(a)177 +514 y(single)i(macro)e(de\014nition)i(whic)o(h)g(w)o(as)g(in)o(v)o(ok)o(ed)f +(in)g(the)i(de\014nition)e(of)h(eac)o(h)g(of)f(the)i(scripts.)28 +b(This)17 b(ensured)177 564 y(that)d(the)h(t)o(w)o(o)e(scripts)i(used)g(the)f +(same)f(name.)177 677 y Fl(@A)22 b(The)f(following)f(macro)g(contains)h(the)g +(temporary)f(file)h(name)g(used)g(to)g(allow)g(the)177 726 +y(two)g(shellscripts)f(to)h(transfer)f(each)h(file)g(to)g(be)h(printed.)177 +826 y(@$@<printfile@>@M=)o(=@{pr)o(intme)o(.txt@)o(})177 926 +y(@A)g(Here)f(are)g(the)g(scripts)f(for)h(the)h(local)e(VMS)h(node)g(and)h +(the)f(remote)f(UNIX)h(node.)177 1025 y(@O@<vmscommandproc)o(edure)o(.com@)o +(>==@{)o(@-)177 1075 y(DCL)g(commands)177 1125 y(copy)g(@<printfile@>)e +(unixnode::)177 1175 y(DCL)i(commands)177 1225 y(@})177 1324 +y(@O@<unixshellscrip)o(t@>==)o(@{@-)177 1374 y(unix)g(commands)177 +1424 y(print)g(@<printfile@>)177 1474 y(unix)g(commands)177 +1523 y(@})177 1636 y Fr(In)13 b(the)h(case)g(of)e(the)i(prin)o(ting)e +(system,)h(the)h(en)o(tire)f(system)g(w)o(as)g(describ)q(ed)i(and)e +(de\014ned)h(in)f(a)f(single)h(F)m(unnel-)177 1686 y(W)m(eb)h +Fl(.fw)g Fr(\014le.)19 b(In)c(larger)f(systems)g(con)o(taining)g(man)o(y)e(F) +m(unnelW)m(eb)i Fl(.fw)f Fr(\014les)i(for)f(man)o(y)f(di\013eren)o(t)i(mo)q +(dules)177 1736 y(in)e(man)o(y)e(di\013eren)o(t)i(languages,)g(the)g(same)f +(tric)o(k)h(can)g(b)q(e)h(pulled)e(b)o(y)h(placing)f(F)m(unnelW)m(eb)g(macro) +g(de\014nitions)177 1786 y(for)g(shared)h(v)n(alues)e(in)o(to)h(F)m(unnelW)m +(eb)f(include)h(\014les.)18 b(F)m(or)11 b(example,)g(a)h(suite)g(of)f +(implemen)o(tations)e(of)j(net)o(w)o(ork)177 1836 y(no)q(des,)18 +b(with)f(eac)o(h)h(implem)o(en)o(tation)c(b)q(eing)j(in)g(a)g(di\013eren)o(t) +h(programmi)o(ng)c(language)i(for)h(a)g(di\013eren)o(t)h(tar-)177 +1885 y(get)d(mac)o(hine,)e(could)i(all)e(share)i(a)g(table)f(of)g +(con\014guration)h(constan)o(ts)g(de\014ned)h(in)e(macros)g(in)g(a)g(F)m +(unnelW)m(eb)177 1935 y(include)g(\014le.)177 2009 y(In)h(summary)m(,)c(F)m +(unnelW)m(eb's)k(macro)e(and)i(include)g(\014le)f(mec)o(hanisms)f(pro)o(vide) +i(a)f(simple)g(w)o(a)o(y)g(for)g(programs)177 2059 y(written)f(in)f +(di\013eren)o(t)i(languages)e(to)g(share)h(information.)i(This)d(reduces)j +(redundancy)f(b)q(et)o(w)o(een)f(the)h(systems)177 2109 y(and)g(hence)h(the)g +(c)o(hance)g(of)e(inconsistencies)i(arising.)177 2248 y Fd(2.13.4)55 +b(The)19 b(Case)g(of)g(the)f(Small)f(F)-5 b(unction)177 2349 +y Fr(Often,)14 b(when)f(programming,)d(there)k(is)f(a)g(need)h(for)f(a)g(co)q +(de)h(abstraction)g(facilit)o(y)d(that)j(op)q(erates)g(at)f(the)h(text)177 +2399 y(lev)o(el.)26 b(If)17 b(the)g(statemen)o(t)g(\\)p Fl(a:=3;)p +Fr(")f(o)q(ccurs)j(often,)e(it)f(ma)o(y)f(b)q(e)i(b)q(est)h(simply)d(to)h +(rep)q(eat)i(it)f(v)o(erbatim.)25 b(If)16 b(a)177 2449 y(sequence)e(of)d(one) +g(h)o(undred)h(statemen)o(ts)g(is)f(rep)q(eated)j(often,)d(it)g(is)g(normal)f +(to)h(remo)o(v)o(e)f(the)i(co)q(de)h(to)e(a)g(function)177 +2498 y(and)j(replace)h(the)g(o)q(ccurrences)i(b)o(y)c(a)h(function)g(call.)j +(Ho)o(w)o(ev)o(er,)d(in)g(b)q(et)o(w)o(een)h(these)h(t)o(w)o(o)d(extremes)i +(are)f(cases)177 2548 y(where)i(a)f(particular)f(sequence)k(of)c(co)q(de)i +(is)e(long)g(enough)h(and)g(app)q(ears)h(often)f(enough)g(to)f(b)q(e)i +(troublesome,)177 2598 y(but)e(whic)o(h)g(is)g(b)q(ound)g(so)g(messily)e(to)i +(its)g(en)o(vironmen)o(t)f(as)h(to)f(mak)o(e)g(a)g(function)h(call)f(cum)o(b) +q(ersome.)177 2672 y(F)m(or)d(example,)g(the)h(follo)o(wing)d(line)i(of)h +(statemen)o(ts)f(\(referring)i(to)e(\014v)o(e)h(v)n(ariables)f(declared)i +Fm(lo)n(c)n(al)e Fr(to)h(a)f(function\))177 2722 y(migh)o(t)i(app)q(ear)i +(ten)h(times)e(in)g(a)h(function:)177 2835 y Fl(a=b*3.14159;)19 +b(c=d)j(\045)f(256;)g(e=e+1;)1042 2940 y Fr(56)p eop +%%Page: 57 58 +57 57 bop 177 42 a Fr(No)o(w)11 b(the)h(\\normal")d(rule)j(of)f(programmi)o +(ng)e(sa)o(ys)i(that)h(these)h(statemen)o(ts)f(should)f(b)q(e)h(placed)g(in)f +(a)g(pro)q(cedure)177 91 y(\(also)h(called)h(a)f(\\function")g(in)h(the)g(C)g +(programmi)o(ng)d(language)i(used)h(in)g(this)f(example\),)g(but)h(here)h +(\014v)o(e)f(lo)q(cal)177 141 y(v)n(ariables)j(are)h(used.)27 +b(Use)17 b(of)f(a)g(pro)q(cedure)i(\(function\))f(w)o(ould)e(result)j(in)e(a) +g(pro)q(cedure)i(de\014nition)e(lo)q(oking)177 191 y(something)d(lik)o(e:)177 +284 y Fl(void)21 b(frobit\(a,b,c,d,e\))177 334 y(float)g(*a,b;)177 +384 y(int)g(*c,d;)177 434 y(unsigned)f(*e;)177 484 y({*a=b)h(<<)g(8;)h(*c=d)f +(\045)g(256;)g(*e=*e+1;})177 577 y Fr(and)14 b(a)f(pro)q(cedure)j(call)d +(something)g(lik)o(e)177 671 y Fl(frobit\(&a,b,&c,d,&)o(e\);)177 +764 y Fr(This)h(migh)o(t)d(b)q(e)j(w)o(ork)n(able)f(in)g(a)g(language)f(that) +i(allo)o(w)o(ed)e(formal)f(parameters)j(to)f(b)q(e)h(sp)q(eci\014ed)h(to)f(b) +q(e)g(b)q(ound)177 814 y(only)d(to)h(particular)f(v)n(ariables.)17 +b(Similarl)o(y)m(,)8 b(it)k(migh)o(t)d(b)q(e)k(p)q(ossible)e(to)h(a)o(v)o +(oid)e(the)j(parameter)e(list)g(in)g(languages)177 864 y(that)17 +b(supp)q(ort)h(lo)q(cal)e(pro)q(cedures)j(that)e(can)g(access)i(non-lo)q(cal) +d(v)n(ariables)g(\(suc)o(h)i(as)e(P)o(ascal\).)28 b(Ho)o(w)o(ev)o(er,)17 +b(in)177 914 y(our)12 b(example)f(here,)i(in)e(the)i(C)f(programmi)o(ng)d +(language,)i(these)i(options)f(are)g(not)g(a)o(v)n(ailable,)e(and)i(so)g(w)o +(e)g(m)o(ust)177 964 y(either)i(create)h(a)d(function)h(with)g(\014v)o(e)g +(parameters,)g(or)g(use)h(the)f(C)g(macro)f(prepro)q(cessor)k(\(the)e(b)q +(est)g(solution\).)177 1013 y(F)m(unnelW)m(eb)d(pro)o(vides)g(the)h(same)f +(macro)f(facilit)o(y)f(for)i(languages)g(that)g(do)g(not)h(ha)o(v)o(e)f(a)g +(built-in)f(prepro)q(cessor.)177 1082 y(In)j(particularly)g(sp)q(eed-stresse) +q(d)j(applications,)c(the)i(programmer)d(ma)o(y)g(b)q(e)j(reluctan)o(t)g(to)f +(remo)o(v)o(e)g(co)q(de)h(to)f(a)177 1131 y(pro)q(cedure)j(b)q(ecause)g(of)d +(the)h(pro)q(cedure-call)h(o)o(v)o(erhead.)k(F)m(unnelW)m(eb)13 +b(macros)g(can)h(help)g(there)h(to)q(o.)177 1200 y(In)e(summary)m(,)d(there)k +(sometimes)d(arises)j(in)f(programmi)o(ng)d(situations)j(where)h(the)f(cost)h +(of)e(de\014ning)h(a)g(pro)q(ce-)177 1249 y(dure)f(is)e(higher)h(than)g(the)h +(b)q(ene\014ts)g(it)f(will)e(b)q(esto)o(w.)18 b(Commo)o(n)8 +b(reasons)k(for)f(this)f(are)i(the)f(run-time)f(pro)q(cedure)177 +1299 y(o)o(v)o(erhead)j(and)g(the)g(messy)f(binding)g(problems)f(caused)j(b)o +(y)f(remo)o(ving)d(target)j(co)q(de)h(from)d(its)h(target)i(con)o(text.)177 +1349 y(F)m(unnelW)m(eb)g(can)g(help)g(in)g(these)h(situations)f(b)o(y)g(allo) +o(wing)e(the)i(programmer)e(to)i(de\014ne)h(a)f(text)h(macro.)i(This)177 +1399 y(a)o(v)o(oids)e(all)g(the)h(problems)f(and)g(pro)o(vides)h(an)g +(additional)e(incen)o(tiv)o(e)i(for)f(the)i(programmer)c(to)j(describ)q(e)h +(the)177 1449 y(piece)e(of)e(co)q(de)i(so)f(isolated.)177 1580 +y Fd(2.13.5)55 b(When)19 b(Commen)n(ts)d(are)j(Bad)177 1676 +y Fr(In)d(the)h(\\go)q(o)q(d)f(old)f(da)o(ys")h(of)g(small)e(mac)o(hine)h +(memories)f(and)i(in)o(terpreted)i(BASIC,)e(programmers)f(w)o(ould)177 +1725 y(eliminate)f(the)i(\\)p Fl(REM)p Fr(")e(statemen)o(ts)h(\(commen)o +(ts\))f(from)g(their)i(BASIC)g(programs)e(so)h(as)h(to)f(sa)o(v)o(e)h(space)g +(and)177 1775 y(increase)e(execution)g(sp)q(eed.)19 b(Whilst)13 +b(this)g(w)o(as)g(ob)o(viously)e(an)i(appalling)e(programming)f(practice,)j +(the)h(small)177 1825 y(memories)e(and)i(slo)o(w)f(micropro)q(cessors)i +(often)f(made)e(this)i(tempting,)e(if)h(not)h(necessary)m(.)177 +1893 y(Thankfully)m(,)9 b(times)h(ha)o(v)o(e)h(c)o(hanged)h(since)f(then,)h +(and)f(most)f(co)q(de)i(is)f(no)o(w)f(compiled)g(rather)i(than)f(in)o +(terpreted.)177 1943 y(Ho)o(w)o(ev)o(er,)19 b(from)e(time)f(to)i(time)f(one)h +(still)f(runs)i(in)o(to)f(an)f(en)o(vironmen)o(t)g(or)h(situation,)g(or)h(sp) +q(ecial-purp)q(ose)177 1993 y(language,)i(where)h(commen)o(ts)d(are)i(either) +g(una)o(v)n(ailable)e(\(no)h(commen)o(t)f(feature\))i(or)g(undesirable.)39 +b(Here)177 2043 y(F)m(unnelW)m(eb)12 b(can)h(b)q(e)g(used)g(to)g(fully)e(do)q +(cumen)o(t)h(the)h(co)q(de)g(without)f(resulting)h(in)f(an)o(y)g(commen)o(ts) +e(in)i(the)h(\014nal)177 2092 y(co)q(de)i(at)f(all.)i(F)m(or)e(example:)239 +2186 y Fq(\017)21 b Fr(Commen)o(ts)15 b(in)h(frequen)o(tly)i(used)g +Fl(.h)e Fr(header)i(\014les)g(in)e(C)h(programs)f(can)h(ha)o(v)o(e)g(a)g +(signi\014can)o(t)f(impact)281 2236 y(on)f(compilation)d(sp)q(eed.)23 +b(Often)16 b(suc)o(h)f(header)i(\014les)e(are)g(fairly)f(cryptic)i(and)f +(really)f(ough)o(t)h(to)g(b)q(e)g(w)o(ell)281 2286 y(commen)o(ted,)d(but)i +(their)g(authors)g(are)h(reluctan)o(t)f(to.)239 2362 y Fq(\017)21 +b Fr(Commen)o(ts)16 b(are)k(undesirable)f(in)f(P)o(ostScript)i(header)g +(\014les)f(that)g(m)o(ust)f(b)q(e)h(transferred)i(rep)q(eatedly)281 +2412 y(along)13 b(comm)o(unicati)o(ons)e(c)o(hannels)k(\(e.g.)e(the)i(Apple)f +(Macin)o(tosh)g(LaserW)m(riter)g(header)h(\014le\).)239 2488 +y Fq(\017)21 b Fr(In)o(terpreted)16 b(programs)d(in)g(em)o(b)q(edded)h +(systems.)239 2565 y Fq(\017)21 b Fr(Hand)14 b(written)g(mac)o(hine)f(co)q +(de)h(in)g(hex)g(dump)f(form)f(could)i(b)q(e)g(commen)o(ted.)239 +2642 y Fq(\017)21 b Fr(A)16 b(programmer)d(ma)o(y)g(wish)j(to)f(annotate)g(a) +h(text)g(data)f(\014le)g(con)o(taining)g(lists)g(of)g(n)o(um)o(b)q(ers)g +(that)h(is)f(to)281 2691 y(b)q(e)e(fed)f(in)o(to)g(a)f(statistical)h(program) +f(that)h(do)q(es)h(not)f(pro)o(vide)g(an)o(y)g(commen)o(t)e(facilit)o(y)g +(for)i(its)g(input)g(\014le.)177 2785 y(In)g(all)f(these)i(situations,)e(F)m +(unnelW)m(eb)h(allo)o(ws)e(full)h(in)o(tegrated)h(do)q(cumen)o(tation)e +(without)i(an)o(y)f(impact)g(on)g(the)177 2835 y(\014nal)i(co)q(de.)1042 +2940 y(57)p eop +%%Page: 58 59 +58 58 bop 177 42 a Fd(2.13.6)55 b(Do)r(cumen)n(ts)17 b(That)i(Share)g(T)-5 +b(ext)177 144 y Fr(F)m(unnelW)m(eb)13 b(is)g(v)o(ery)h(useful)g(when)g +(preparing)f(m)o(ultiple)f(do)q(cumen)o(ts)h(that)h(m)o(ust)e(share)i(large)f +(slabs)h(of)f(iden-)177 194 y(tical)g(text)i(that)f(are)g(b)q(eing)g(constan) +o(tly)g(mo)q(di\014ed.)177 270 y(F)m(or)g(example)e(someone)h(preparing)h(t)o +(w)o(o)g(sligh)o(tly)e(di\013eren)o(t)j(user)g(man)o(uals)d(for)h(t)o(w)o(o)g +(sligh)o(tly)g(di\013eren)o(t)i(audi-)177 319 y(ences)h(migh)o(t)c(w)o(an)o +(t)h(the)h(man)o(uals)e(to)i(share)h(large)e(slabs)h(of)f(text,)h(while)g +(still)f(allo)o(wing)e(di\013erences)16 b(b)q(et)o(w)o(een)177 +369 y(them.)i(The)d(follo)o(wing)c(example)i(sho)o(ws)h(ho)o(w)g(this)g(can)h +(b)q(e)f(done.)20 b(The)14 b(co)q(de)h(is)f(cluttered,)h(but)g(this)f +(clutter)177 419 y(w)o(ould)f(not)h(b)q(e)h(a)e(problem)g(if)g(the)h(lumps)f +(of)g(text)h(w)o(ere)h(mo)q(derately)e(large.)177 537 y Fl +(@O@<manual1.txt@>=)o(=@{@<)o(M1@>@)o(+@})177 587 y(@O@<manual2.txt@>=)o +(=@{@<)o(M2@>@)o(+@})177 687 y(@$@<M1@>+=@{@<T1@>)o(@})177 +736 y(@$@<M2@>+=@{@<T1@>)o(@})177 786 y(@$@<T1@>@M==@{Firs)o(t)19 +b(lump)i(of)g(text)g(shared)g(by)g(both)g(documents.@+@})177 +886 y(@$@<M1@>+=@{Text)e(for)i(first)g(document@+@})177 936 +y(@$@<M2@>+=@{Text)e(for)i(second)f(document@+@})177 1035 y +(@$@<M1@>+=@{@<T2@>)o(@})177 1085 y(@$@<M2@>+=@{@<T2@>)o(@})177 +1135 y(@$@<T2@>@M==@{Seco)o(nd)f(lump)i(of)g(text)g(shared)g(by)g(both)g +(documents.@+@})177 1253 y Fr(An)16 b(alternativ)o(e)g(approac)o(h,)f(whic)o +(h)h(migh)o(t)e(w)o(ork)h(b)q(etter)i(in)f(situations)f(where)i(there)g(are)f +(man)o(y)e(small)g(dif-)177 1303 y(ferences)k(b)q(et)o(w)o(een)f(the)f(t)o(w) +o(o)f(do)q(cumen)o(ts)h(rather)g(than)g(a)f(few)h(large)f(ones,)i(is)e(to)h +(de\014ne)g(a)g(macro)e(with)h(t)o(w)o(o)177 1353 y(argumen)o(ts,)c(one)h +(for)f(eac)o(h)h(pro)q(duct)g(\014le)g(do)q(cumen)o(t.)17 b(W)m(rite)11 +b(the)h(do)q(cumen)o(t)f(from)f(top)h(to)h(b)q(ottom,)e(but)i(place)177 +1403 y(all)h(stretc)o(hes)j(that)e(di\013er)g(b)q(et)o(w)o(een)i(the)e(t)o(w) +o(o)g(do)q(cumen)o(ts)f(in)h(a)f(macro)g(call.)177 1521 y Fl(@!)22 +b(Set)f(the)g(definition)f(of)h(@#D)g(to)177 1571 y(@!)87 b(@1)21 +b(to)h(create)e(the)h(shareholders)f(report.)177 1621 y(@!)87 +b(@2)21 b(to)h(create)e(the)h(customers)f(report.)177 1670 +y(@$@#D@\(@2@\)@M==@{@)o(1@})177 1770 y(@O@<report.txt@>==)o(@{@-)177 +1820 y(1992)h(ANNUAL)g(REPORT)f(TO)i(@#D@\(Shareholder)o(s@,C)o(ustom)o +(ers@\))177 1870 y(==================)o(====@)o(#D@\(=)o(=====)o(=====)o +(=@,=)o(=====)o(===@\))177 1919 y(This)f(has)g(been)g(a)h(very)f(good)g(year) +g(for)g(The)g(Very)g(Big)g(Corporation)f(of)h(America.)177 +1969 y(With)g(your)g(help,)g(we)g(have)g(been)g(able)g(to)h(successfully)177 +2019 y(@#D@\(@"screw)d(the)j(customers)e(for)h(every)g(cent)f(they)h +(have@"@,)286 2069 y(@"knock)f(the)i(shareholders)d(into)i(submission)f(to)h +(bring)g(you)g(lower)g(prices@"@\).)177 2119 y(With)g(gross)g(earnings)f +(approaching)g(six)h(trillion)f(dollars,)g(we)h(have)g(been)g(able)g(to)177 +2168 y(@#D@\(@"increase)e(dividends@"@,)286 2218 y(@"lower)h(prices@"@\).)177 +2268 y(We)i(expect)e(to)h(have)g(an)h(even)f(better)f(year)h(next)g(year.)177 +2318 y(@})177 2436 y Fr(One)c(application)f(where)h(text)g(sharing)g(can)f(b) +q(e)i(particularly)d(useful)i(is)f(in)g(the)i(preparation)e(of)g(computer)177 +2486 y(do)q(cumen)o(tation)10 b(con)o(taining)g(examples.)17 +b(F)m(or)11 b(example,)f(a)h(b)q(o)q(ok)g(describing)g(a)g(new)h(programming) +c(language)177 2536 y(migh)o(t)j(b)q(e)j(full)d(of)i(examples)f(of)g(small)f +(programs)h(written)h(in)g(the)h(language)e(whic)o(h)h(the)g(user)h(migh)o(t) +d(w)o(an)o(t)i(to)177 2586 y(try)g(without)g(ha)o(ving)f(to)h(t)o(yp)q(e)g +(them)f(all)g(in.)17 b(The)d(\\default")e(approac)o(h)h(of)f(k)o(eeping)h(a)g +(cop)o(y)g(of)f(the)i(examples)177 2635 y(in)f(the)h(text)g(of)e(the)i(b)q(o) +q(ok)f(and)g(another)h(cop)o(y)f(in)g(separate)h(\014les)g(is)f(cum)o(b)q +(ersome)f(and)h(error)i(prone,)e(b)q(ecause)177 2685 y(b)q(oth)h(\014les)g +(ha)o(v)o(e)g(to)g(b)q(e)g(up)q(dated)h(whenev)o(er)g(an)e(example)g(is)h(c)o +(hanged.)k(A)c(more)f(sophisticated)h(approac)o(h)g(is)177 +2735 y(to)d(store)g(eac)o(h)g(example)e(in)i(a)f(separate)i(\014le,)e(and)h +(then)g(use)g(the)h(\\include)e(\014le")g(facilit)o(y)f(of)h(the)h(w)o(ord)g +(pro)q(cessor)177 2785 y(to)k(include)g(eac)o(h)h(example)e(in)h(the)g(text.) +23 b(This)15 b(is)g(a)g(b)q(etter)h(solution,)e(but)i(su\013ers)h(from)c(a)i +(few)g(dra)o(wbac)o(ks.)177 2835 y(First,)i(when)f(editing)g(the)h(b)q(o)q +(ok)f(in)g(a)f(w)o(ord)h(pro)q(cessor,)j(the)d(examples)g(in)f(the)i(b)q(o)q +(ok)f(will)f(not)h(b)q(e)g(directly)1042 2940 y(58)p eop +%%Page: 59 60 +59 59 bop 177 42 a Fr(accessible)19 b(or)f(visible.)29 b(T)m(o)17 +b(see)i(an)e(example,)g(the)h(writer)g(w)o(ould)f(ha)o(v)o(e)h(to)f(op)q(en)i +(the)f(\014le)g(con)o(taining)e(the)177 91 y(example)11 b(in)g(a)h(separate)h +(windo)o(w.)k(This)12 b(could)f(b)q(ecome)h(tedious)g(if)g(the)g(text)h(con)o +(tained)f(man)o(y)e(examples,)h(as)177 141 y(man)o(y)h(texts)j(do.)i(F)m +(urthermore,)c(there)i(is)f(a)f(risk)h(that)f(some)g(example)f(\014les)i +(will)f(b)q(e)h(included)g(in)f(the)h(wrong)177 191 y(place.)k(Second,)12 +b(b)q(ecause)i(the)e(b)q(o)q(ok)g(is)f(dep)q(enden)o(t)j(on)d(the)i(included) +e(\014les,)i(the)f(b)q(o)q(ok)f(will)g(end)h(up)g(consisting)177 +241 y(of)h(a)h(directory)h(of)e(a)h(h)o(undred)g(or)g(more)f(\014les)h +(instead)g(of)g(just)g(a)f(few.)177 316 y(An)g(alternativ)o(e)f(solution)g +(is)g(to)h(construct)h(a)e(single)h(F)m(unnelW)m(eb)f Fl(.fw)f +Fr(\014le)i(that,)f(when)h(pro)q(cessed,)i(pro)q(duces)177 +366 y(b)q(oth)h(the)g(b)q(o)q(ok)g(\014le)g(and)f(the)i(example)d(\014les.)24 +b(This)16 b(solution)f(assumes)g(that)h(the)g(b)q(o)q(ok)g(consists)h(of)e(a) +g(text)177 416 y(\014le)f(con)o(taining)f(commands)e(for)j(a)f(t)o(yp)q +(esetter)k(suc)o(h)d(as)g(T)1112 425 y(E)1135 416 y(X.)177 +534 y Fl(@O@<Book.tex@>==@{)o(@#B@})177 633 y(@$@#B+=@{@-)177 +683 y(The)21 b(first)g(step)g(to)g(learning)g(the)g(object)f(oriented)g +(AdaCgol++)g(language)h(is)g(to)g(examine)177 733 y(a)h(hello)f(world)f +(program.)177 832 y(\\start{verbatim})177 882 y(@<Ex1@>)177 +932 y(\\finish{verbatim})177 982 y(@})177 1081 y(@$@<Ex1@>==@{read)e +(iopack@+Enter)i(!World~!)g(!Hello~!)g(ex)h(pr)h(flu)f(X[1]@})177 +1131 y(@O@<Ex1.c@>==@{@<E)o(x1@>@)o(})177 1231 y(@$@#B+=@{@-)177 +1281 y(To)h(understand)d(the)i(program,)g(think)f(of)i(the)f(execution)f +(state)h(as)g(a)h(plate)e(of)i(cheese...)177 1331 y(@})177 +1448 y Fr(Most)12 b(of)f(the)h(\014le)f(will)f(consist)i(of)f(part)h +(de\014nitions)f(of)g(the)h(additiv)o(e)f(macro)f Fl(@#B)p +Fr(.)h(The)h(de\014nition)f(is)g(\\brok)o(en")177 1498 y(to)j(allo)o(w)e(a)i +(macro)e(de\014nition,)h(wherev)o(er)j(an)e(example)e(app)q(ears.)177 +1573 y(The)e(example)f(ab)q(o)o(v)o(e)g(is)g(a)h(little)f(messy)g(b)q(ecause) +i(F)m(unnelW)m(eb)e(do)q(es)i(not)e(allo)o(w)f(macros)h(connected)i(to)f(pro) +q(duct)177 1623 y(\014les)18 b(to)f(b)q(e)h(called,)f(and)g(it)g(do)q(es)h +(not)f(ha)o(v)o(e)g(text)h(expressions)h(that)e(write)g(to)h(an)f(pro)q(duct) +h(\014le)f(as)g(w)o(ell)g(as)177 1673 y(ev)n(aluating)d(to)h(text.)22 +b(Nev)o(ertheless,)17 b(it)e(presen)o(ts)i(a)e(fairly)f(clean)h(solution)f +(to)h(the)h(problem)e(of)g(k)o(eeping)h(the)177 1723 y(example)e(programs)f +(in)i(a)f(computing)g(text)h(up)g(to)g(date.)177 1866 y Fd(2.13.7)55 +b(Generics)177 1968 y Fr(It)13 b(is)g(w)o(ell)f(kno)o(wn)h(that)g(generics)h +(in)f(programmi)o(ng)d(languages)i(are)i(closely)f(aligned)f(with)g(textual)h +(substitu-)177 2018 y(tion.)j(In)11 b(fact,)f(a)g(go)q(o)q(d)g(w)o(a)o(y)g +(to)g(understand)i(the)f(generic)g(facilit)o(y)e(of)g(a)h(new)h(programming)c +(language)i(is)i(to)f(ask)177 2068 y(oneself)15 b(the)g(question)g(\\In)f +(what)g(w)o(a)o(y)g(do)q(es)h(this)g(generic)g(facilit)o(y)e(di\013er)i(from) +d(simple)h(text)i(substitution?")177 2118 y(The)j(di\013erences,)j(if)16 +b(an)o(y)m(,)h(t)o(ypically)g(ha)o(v)o(e)g(to)g(do)h(with)f(the)h +(di\013erence)i(in)d(scoping)g(b)q(et)o(w)o(een)i(textual)f(and)177 +2168 y(in)o(telligen)o(t)d(substitution)g(and)h(whether)h(the)f(generic)g(co) +q(de)h(is)e(shared)i(or)e(copied)h(b)o(y)g(the)g(implemen)o(tati)o(on.)177 +2217 y(In)e(most)f(cases)i(the)f(di\013erences)j(are)d(quite)g(minor.)177 +2293 y(Because)h(generic)g(facilities)d(are)h(so)h(closely)f(aligned)f(with)h +(text)h(substitution,)f(it)g(is)g(p)q(ossible)h(to)f(use)h(F)m(unnel-)177 +2343 y(W)m(eb's)i(parameterized)g(macros)g(to)g(pro)o(vide)g(generics)h(in)f +(programmi)o(ng)d(languages)j(that)g(do)g(not)g(supp)q(ort)177 +2392 y(generics.)27 b(Simply)14 b(write)j(a)f(F)m(unnelW)m(eb)f(macro)h +(whose)h(parameters)f(are)h(the)g(parameters)f(of)g(the)h(generic)177 +2442 y(and)d(whose)g(b)q(o)q(dy)g(is)g(the)h(generic)f(ob)r(ject.)177 +2518 y(The)i(follo)o(wing)d(F)m(unnelW)m(eb)j(\014le)f(giv)o(es)h(an)f +(example)g(of)g(a)g(fully)g(w)o(ork)o(ed)g(V)m(ax)g(P)o(ascal)h(generic)h +(set)f(pac)o(k)n(age)177 2567 y(implemen)o(ted)d(using)i(F)m(unnelW)m(eb)f +(parameterized)h(macros.)21 b(The)15 b(pac)o(k)n(age)g(w)o(as)g(written)g(b)o +(y)g(Barry)h(Dwy)o(er)177 2617 y(of)c(the)i(Computer)d(Science)k(Departmen)o +(t)d(of)g(the)h(Univ)o(ersit)o(y)g(of)f(Adelaide)g(in)h(1987)e(and)i(w)o(as)f +(emailed)f(to)i(me)177 2667 y(on)j(11)f(No)o(v)o(em)o(b)q(er)f(1987.)23 +b(The)16 b(generic)g(pac)o(k)n(age)f(pro)o(vides)h(a)f(set)i(abstraction)f +(implemen)o(ted)d(using)i(link)o(ed)177 2717 y(lists.)j(Note)c(the)h(clev)o +(er)g(use)f(of)g(the)g(instan)o(tiation)f(parameters)h(in)f(t)o(yp)q(e,)h +(function,)f(and)h(pro)q(cedure)i(names.)177 2835 y Fl(@$@<Generic)k(Set)h +(Module@>@\(@2@\)==@)o({@-)1042 2940 y Fr(59)p eop +%%Page: 60 61 +60 60 bop 177 42 a Fl(@!)22 b(@1)f(is)g(the)g(base)g(type,)g(@2)h(is)f(the)g +(set)g(type.)177 91 y([inherit)f(\('@1'\),)h(environment)e(\('@2'\)])177 +191 y(module)i(@2;)177 291 y(type)43 b(@2)21 b(=)h(^@2Record;)308 +340 y(@2Record)e(=)i(record)373 390 y(Member:)f(@1;)373 440 +y(Next:)g(@2;)373 490 y(end;)177 589 y(procedure)f(Null@2)h(\(var)g(Result:)f +(@2\);)177 639 y(begin)h(new)g(\(Result\);)177 689 y(Result^.Member)e(:=)i +(\(-)h(MaxInt\)::@1;)177 739 y(Result^.Next)d(:=)j(nil)f(end;)177 +839 y(function)f(IsNull@2)g(\(S:)i(@2\):)f(boolean;)177 888 +y(begin)g(IsNull@2)f(:=)h(S^.Member::integer)e(=)i(-)h(MaxInt)e(end;)177 +988 y(procedure)g(ForEach@1)g(\(S:)h(@2;)g(procedure)f(DoIt)h(\(i:)g(@1\)\);) +177 1038 y(var)65 b(ThisS,)20 b(NextS:)h(@2;)177 1088 y(begin)g(ThisS)g(:=)g +(S;)177 1137 y(while)g(ThisS^.Member::in)o(teger)d(<>)k(-)f(MaxInt)g(do)243 +1187 y(begin)f(NextS)h(:=)g(ThisS^.Next;)243 1237 y(DoIt)g(\(ThisS^.Member\)) +o(;)243 1287 y(ThisS)f(:=)i(NextS)e(end;)177 1337 y(end;)177 +1436 y(function)g(First@1)h(\(S:)g(@2\):)g(@1;)177 1486 y(begin)g(First@1)f +(:=)i(S^.Member)e(end;)177 1586 y(function)g(Is@1InSet)g(\(i:)h(@1;)h(S:)f +(@2\):)g(boolean;)243 1636 y(procedure)e(TestEquals)h(\(j:)h(@1\);)243 +1685 y(begin)f(if)i(Equal@1)e(\(i,)h(j\))h(then)f(Is@1InSet)e(:=)j(true;)f +(end;)177 1735 y(begin)g(Is@1InSet)f(:=)h(false;)g(ForEach@1)f(\(S,)h +(TestEquals\);)e(end;)177 1835 y(function)h(Includes@2)g(\(S1,)h(S2:)g(@2\):) +g(boolean;)177 1885 y(var)g(Result:)g(boolean;)243 1934 y(procedure)e +(TestIfInS1)h(\(i:)h(@1\);)243 1984 y(begin)f(if)i(Result)e(then)h(if)h(not)f +(Is@1InSet)f(\(i,)h(S1\))g(then)g(Result)g(:=)g(false;)f(end;)177 +2034 y(begin)h(Result)f(:=)i(true;)177 2084 y(ForEach@1)e(\(S2,)h +(TestIfInS1\);)177 2134 y(Includes@2)f(:=)h(Result)g(end;)177 +2233 y(function)f(Disjoint@2s)g(\(S1,)h(S2:)g(@2\):)g(boolean;)177 +2283 y(var)g(Result:)g(boolean;)243 2333 y(procedure)e(TestIfInS1)h(\(i:)h +(@1\);)243 2383 y(begin)f(if)i(Result)e(then)h(if)h(Is@1InSet)e(\(i,)h(S1\))g +(then)g(Result)f(:=)i(false;)e(end;)177 2433 y(begin)h(Result)f(:=)i(true;) +177 2482 y(ForEach@1)e(\(S2,)h(TestIfInS1\);)177 2532 y(Disjoint@2s)f(:=)h +(Result)g(end;)177 2632 y(function)f(Equal@2)h(\(S1,)g(S2:)g(@2\):)g +(boolean;)177 2682 y(begin)177 2731 y(Equal@2)g(:=)g(Includes@2)f(\(S1,)h +(S2\))g(and)g(Includes@2)f(\(S2,)h(S1\);)177 2781 y(end;)1042 +2940 y Fr(60)p eop +%%Page: 61 62 +61 61 bop 177 42 a Fl(procedure)20 b(Insert@1)g(\(i:)h(@1;)h(var)f(S:)g +(@2\);)177 91 y(var)65 b(This,)21 b(Pred,)f(Succ:)h(@2;)177 +141 y(begin)177 191 y(if)h(not)f(Is@1InSet)f(\(i,)h(S\))g(then)243 +241 y(begin)243 291 y(Pred)g(:=)g(nil;)g(Succ)g(:=)g(S;)243 +340 y(while)f(Succ^.Member::integ)o(er)f(>)i(i::integer)f(do)h(begin)308 +390 y(Pred)g(:=)g(Succ;)g(Succ)g(:=)g(Succ^.Next)f(end;)243 +440 y(if)h(Succ^.Member::int)o(eger)d(<)k(i::integer)e(then)h(begin)308 +490 y(new)g(\(This\);)f(This^.Next)g(:=)i(Succ;)e(This^.Member)g(:=)h(i;)308 +540 y(if)g(Pred)g(<>)h(nil)f(then)g(Pred^.Next)f(:=)h(This)g(else)g(S)g(:=)h +(This;)308 589 y(end;)243 639 y(end;)177 689 y(end;)177 789 +y(procedure)e(Insert@1s)g(\(S1:)h(@2;)g(var)g(S2:)h(@2\);)177 +839 y(var)65 b(This,)21 b(Pred,)f(Succ:)h(@2;)243 888 y(procedure)e(Add@1)i +(\(i:)g(@1\);)243 938 y(begin)f(Insert@1)g(\(i,)i(S2\))f(end;)177 +988 y(begin)177 1038 y(ForEach@1)f(\(S1,)h(Add@1\);)177 1088 +y(end;)177 1187 y(procedure)f(Remove@1)g(\(i:)h(@1;)h(var)f(S:)g(@2\);)177 +1237 y(var)65 b(Pred,)21 b(This:)f(@2;)177 1287 y(begin)177 +1337 y(Pred)h(:=)h(nil;)e(This)h(:=)h(S;)177 1386 y(while)f(not)g(Equal@1)f +(\(This^.Member,)f(i\))j(do)f(begin)243 1436 y(Pred)g(:=)g(This;)g(This)g(:=) +g(This^.Next)f(end;)177 1486 y(if)i(Pred)f(<>)g(nil)g(then)g(Pred^.Next)f(:=) +h(This^.Next)f(else)h(S)g(:=)h(This^.Next;)177 1536 y(Dispose)f(\(This\);)177 +1586 y(end;)177 1685 y(procedure)f(Dispose@2)g(\(var)h(S:)g(@2\);)177 +1735 y(var)65 b(Old:)21 b(@2;)177 1785 y(begin)177 1835 y(while)g(S)h(<>)f +(nil)g(do)g(begin)g(Old)g(:=)h(S;)f(S)h(:=)f(S^.Next;)f(Dispose)h(\(Old\))f +(end;)177 1885 y(end;)177 1984 y(end.)177 2034 y(@})177 2134 +y(@O@<NaryTreeSet.pa)o(s@>==)o(@{@-)221 2183 y(@<Generic)g(Set)h +(Module@>@\(@"NaryT)o(ree@")o(@,@")o(NaryT)o(reeSe)o(t@"@\))o(@})177 +2233 y(@O@<NaryTreeSetSet)o(.pas@)o(>==@{)o(@-)221 2283 y(@<Generic)f(Set)h +(Module@>@\(@"NaryT)o(reeSe)o(t@"@)o(,@"Na)o(ryTre)o(eSetS)o(et@"@)o(\)@})177 +2408 y Fr(A)12 b(great)h(adv)n(an)o(tage)e(of)g(the)i(approac)o(h)f +(re\015ected)i(in)e(the)g(ab)q(o)o(v)o(e)g(example)f(is)h(that)g(it)g(allo)o +(ws)e(the)j(programmer)177 2458 y(to)f(construct)i(a)d(generic)i(ob)r(ject)g +(in)f(a)f(language)h(that)g(do)q(es)g(not)g(supply)g(generics,)h +Fm(with)g(c)n(omplete)g(typ)n(esafety.)177 2507 y Fr(This)g(con)o(trasts)h +(to)e(the)i(approac)o(h)e(that)h(migh)o(t)e(b)q(e)i(used)h(in)e(a)h(language) +f(suc)o(h)h(as)g(C)g(where)h(the)f(programmer)177 2557 y(migh)o(t)e(c)o(ho)q +(ose)i(to)g(construct)h(a)e(\\generic")h(pac)o(k)n(age)f(b)o(y)h +(parameterizing)f(a)g(pac)o(k)n(age)g(with)g(p)q(oin)o(ters)i(to)e +Fl(void)p Fr(.)177 2607 y(The)i(resulting)f(pac)o(k)n(age)g(is)g(p)q(o)o(w)o +(erful)g(but)g(extremely)g(un)o(t)o(yp)q(esafe.)18 b(Suc)o(h)c(a)f(generic)h +(list)e(pac)o(k)n(age)h(is)g(used)h(in)177 2657 y(the)f(co)q(de)h(of)e(F)m +(unnelW)m(eb)g(itself)g(and)h(caused)h(no)e(end)h(of)f(problems,)g(as)g(the)i +(compiler)d(had)h(no)h(w)o(a)o(y)f(of)g(telling)177 2707 y(if)19 +b(p)q(oin)o(ters)h(to)f(the)h(correctly)h(t)o(yp)q(ed)f(ob)r(ject)g(w)o(ere)h +(b)q(eing)e(handed)h(to)g(the)g(correct)h(list-ob)r(ject/function)177 +2757 y(com)o(bination.)177 2835 y(The)e(ma)r(jor)f(disadv)n(an)o(tage)g(of)g +(the)h(text)h(generic)g(approac)o(h)e(is)h(that)g(it)g(causes)h(the)f(co)q +(de)h(of)e(the)i(generic)1042 2940 y(61)p eop +%%Page: 62 63 +62 62 bop 177 42 a Fr(ob)r(ject)19 b(to)f(b)q(e)h(duplicated)f(once)h(for)e +(eac)o(h)i(instan)o(tiation.)29 b(Dep)q(ending)19 b(on)f(the)g(n)o(um)o(b)q +(er)g(and)g(size)h(of)e(the)177 91 y(instan)o(tiations,)c(this)h(ma)o(y)d(or) +j(ma)o(y)e(not)i(b)q(e)h(acceptable.)177 166 y(Where)22 b(the)f(duplication)f +(of)g(co)q(de)h(is)g(unacceptable,)i(a)d(h)o(ybrid)h(approac)o(h)f(ma)o(y)f +(b)q(e)i(tak)o(en.)39 b(As)21 b(in)f(the)177 216 y(C)c(example,)e(the)i +(programmer)d(could)i(write)h(a)f(single)g(generic)h(pac)o(k)n(age)f(using)g +(p)q(oin)o(ters)h(to)g Fl(void)e Fr(or)i(some)177 266 y(other)g(un)o(t)o(yp)q +(esafe)g(mec)o(hanism.)j(Then)d(the)g(programmer)d(creates)k(a)e(F)m(unnelW)m +(eb)f(generic)i(pac)o(k)n(age)f(whose)177 315 y(functions)g(do)f(nothing)f +(more)h(than)g(call)g(the)h(functions)f(of)g(the)h(un)o(t)o(yp)q(esafe)g(pac) +o(k)n(age,)f(and)g(whose)h(t)o(yp)q(es)g(do)177 365 y(nothing)f(more)g(than)g +(con)o(tain)g(the)h(t)o(yp)q(es)h(of)d(the)j(un)o(t)o(yp)q(esafe)f(pac)o(k)n +(age.)k(This)c(solution)e(in)o(v)o(olv)o(es)h(the)h(use)g(of)177 +415 y(un)o(t)o(yp)q(esafe)i(programmi)o(ng,)c(but)j(this)g(is)g(a)g +(one-o\013)g(and)g(if)f(done)h(carefully)g(and)g(correctly)m(,)g(the)h +(result)g(can)177 465 y(b)q(e)e(a)e(t)o(yp)q(esafe)i(generic)g(pac)o(k)n(age) +e(in)o(v)o(olving)f(minim)o(al)e(co)q(de)15 b(duplication.)177 +627 y Fi(2.14)70 b(Summary)177 743 y Fr(This)16 b(c)o(hapter)h(has)f(describ) +q(ed)i(some)d(of)h(the)g(\014ner)h(asp)q(ects)h(of)d(the)i(use)g(of)e(F)m +(unnelW)m(eb.)24 b(Throughout,)16 b(the)177 793 y(p)q(o)o(w)o(er)f(and)f +(danger)g(of)g(F)m(unnelW)m(eb)f(as)h(a)g(general)h(text-rearranging)f +(prepro)q(cessor)j(has)d(b)q(een)i(emphasised.)177 843 y(F)m(unnelW)m(eb)g +(can)g(b)q(e)h(used)g(b)q(oth)f(to)g(mak)o(e)e(programs)h(more)g(readable)h +(or)g(more)f(obscure.)26 b(It)16 b(is)g(up)g(to)g(the)177 892 +y(programmer)c(to)h(ensure)j(that)e(F)m(unnelW)m(eb)f(is)h(used)h(prop)q +(erly)m(.)1042 2940 y(62)p eop +%%Page: 63 64 +63 63 bop 177 372 a Fj(Chapter)34 b(3)177 598 y Fp(F)-10 b(unnelW)g(eb)41 +b(De\014nition)177 858 y Fi(3.1)70 b(In)n(tro)r(duction)177 +968 y Fr(This)15 b(purp)q(ose)h(of)e(this)h(c)o(hapter)g(is)g(to)g(pro)o +(vide)f(a)h(complete)f(and)g(consisten)o(t)i(de\014nition)f(of)f(the)h(F)m +(unnelW)m(eb)177 1018 y(input)h(language)e(and)i(the)g(b)q(eha)o(viour)f(of)g +(the)h(F)m(unnelW)m(eb)f(program.)22 b(Usually)m(,)14 b(a)i(c)o(hapter)g(suc) +o(h)h(as)e(this)h(is)177 1068 y(called)c(a)g(\\reference)i(man)o(ual",)9 +b(but)j(this)g(c)o(hapter)h(is)f(in)o(tended)g(to)g(go)g(further)g(b)o(y)g +(actually)f(de\014ning)h(the)h(lan-)177 1118 y(guage)f(and)f(program.)16 +b(This)c(c)o(hapter)g(tak)o(es)g(precedence)j(o)o(v)o(er)d(all)e(other)j(c)o +(hapters)g(and)e(all)g(implemen)o(tatio)o(ns)177 1167 y(of)i(F)m(unnelW)m +(eb.)18 b(If)13 b(an)h(implemen)o(tation)c(con)o(tradicts)15 +b(this)f(c)o(hapter,)g(then)h(the)g(implem)o(en)o(tation)c(is)j(wrong.)177 +1236 y(This)j(is)g(the)h(c)o(hapter)h(that)e(y)o(ou)g(should)g(turn)g(if)g(y) +o(ou)g(\014nd)g(y)o(ourself)g(asking)g(a)g(sp)q(eci\014c)h(question)g(ab)q +(out)f(a)177 1286 y(sp)q(eci\014c)g(asp)q(ect)f(of)f(F)m(unnelW)m(eb.)21 +b(In)15 b(man)o(y)e(cases)k(it)e(will)e(b)q(e)j(con)o(v)o(enien)o(t)g(to)e +(access)j(this)f(c)o(hapter)g(through)177 1336 y(the)f(index.)177 +1490 y Fi(3.2)70 b(Notation)177 1600 y Fr(A)17 b(particular)g(v)n(arian)o(t)f +(of)g(EBNF)i(\(Extended)g(Bac)o(h)o(us)g(Naur)f(F)m(orm\))e(will)h(b)q(e)h +(used)h(to)f(describ)q(e)i(the)e(F)m(un-)177 1649 y(nelW)m(eb)h(syn)o(tax.)32 +b(In)18 b(this)g(v)n(arian)o(t,)g(literal)g(strings)g(are)h(delimited)e(b)o +(y)h(double)g(quotes)h(\(e.g.)f Fl("string")p Fr(\),)177 1699 +y(optional)d(constructs)j(b)o(y)f(square)g(brac)o(k)o(ets)g(\(e.g.)f +Fl([optional])p Fr(\),)e(and)j(constructs)h(rep)q(eated)g(zero)f(or)g(more) +177 1749 y(times)i(b)o(y)g(braces)i(\(e.g.)e Fq(f)p Fl(zeroormore)p +Fq(g)p Fr(\).)33 b(Constructs)21 b(to)e(b)q(e)h(rep)q(eated)i(a)d(\014xed)h +(n)o(um)o(b)q(er)f(of)g(times)f(are)177 1799 y(enclosed)g(in)e(braces)h +(follo)o(w)o(ed)e(b)o(y)i(a)f(decimal)e(n)o(um)o(b)q(er)i(indicating)g(the)h +(n)o(um)o(b)q(er)e(of)h(times)g(to)g(b)q(e)h(rep)q(eated)177 +1849 y(\(e.g.)d Fq(f)p Fl(sixtimes)p Fq(g)p Fl(6)p Fr(\).)19 +b(Constructs)e(to)e(b)q(e)g(rep)q(eated)i(one)e(or)g(more)f(times)g(are)h +(enclosed)h(in)f(braces)h(and)f(fol-)177 1899 y(lo)o(w)o(ed)e(b)o(y)h(a)f +Fl(+)h Fr(\(e.g.)f Fq(f)p Fl(oneormore)p Fq(g)p Fl(+)p Fr(\).)j(The)e +(traditional)e(BNF)j(\\)p Fl(::=)p Fr(")d(is)i(replaced)h(b)o(y)e(the)i +(visually)d(simpler)177 1948 y(\\)p Fl(=)p Fr(".)17 b(The)e(traditional)d +(BNF)j(angle)e(brac)o(k)o(ets)i(are)f(abandoned.)177 2017 y(Although)c(F)m +(unnelW)m(eb)g(allo)o(ws)f(the)i(sp)q(ecial)g(c)o(haracter)g(to)g(b)q(e)g(c)o +(hanged)f(using)h(the)g(construct)h(\\)p Fn(<)p Fr(sp)q(ecial)p +Fn(>)p Fr(=",)177 2067 y(use)19 b(of)f(\\)p Fn(<)p Fr(sp)q(ecial)p +Fn(>)p Fr(")h(to)f(refer)h(to)g(F)m(unnelW)m(eb's)e(sp)q(ecial)i(c)o +(haracter)h(is)e(cum)o(b)q(ersome)f(and)h(abstract.)33 b(T)m(o)177 +2117 y(simplify)17 b(the)i(presen)o(tation,)i(the)f(default)f(sp)q(ecial)g(c) +o(haracter)i(\\)p Fl(@)p Fr(")d(is)h(used)h(throughout)g(this)f(c)o(hapter)h +(to)177 2167 y(represen)o(t)c(the)f(sp)q(ecial)f(c)o(haracter.)177 +2320 y Fi(3.3)70 b(T)-6 b(erminology)177 2430 y Fr(A)14 b(sp)q(eci\014c)i +(terminology)c(has)i(arisen)h(for)f(dealing)f(with)h(F)m(unnelW)m(eb.)k(Some) +13 b(particularly)g(useful)i(examples)177 2480 y(are:)295 2549 +y Fo(Journal)10 b(\014le:)16 b Fr(An)11 b(output)g(\014le)g(con)o(taining)f +(a)g(cop)o(y)h(of)f(the)i(output)f(sen)o(t)g(to)g(the)h(user's)f(console)295 +2599 y(during)j(an)h(in)o(v)o(o)q(cation)e(of)h(F)m(unnelW)m(eb.)19 +b(In)c(other)g(systems,)f(this)h(\014le)g(is)f(sometimes)f(called)h(a)295 +2649 y(\\log)f(\014le".)295 2718 y Fo(Pro)q(duct)19 b(\014le:)24 +b Fr(An)18 b(output)g(\014le,)g(generated)h(b)o(y)e(the)h(T)m(angle)f(comp)q +(onen)o(t)g(of)g(F)m(unnelW)m(eb,)295 2767 y(that)d(con)o(tains)g(the)h +(expansion)e(of)h(the)g(macros)f(in)h(the)g(input)g(\014le.)1368 +2752 y Fg(1)p 177 2796 709 2 v 223 2823 a Ff(1)241 2835 y Fh(Other)d(names)f +(considered)e(for)j(this)g(w)o(ere:)k(generated)9 b(\014le,)i(expanded)d +(\014le,)j(result)f(\014le,)h(program)e(\014le,)i(and)f(tangle)g(\014le.)1042 +2940 y Fr(63)p eop +%%Page: 64 65 +64 64 bop 177 42 a Fr(A)14 b(complete)f(list)g(of)g(all)f(the)j(sp)q(ecial)f +(F)m(unnelW)m(eb)f(terminology)e(app)q(ears)k(in)e(the)h(glossary)m(.)j(Be)e +(sure)f(to)g(refer)177 91 y(to)g(it)f(if)g(an)o(y)h(of)f(the)i(terms)e(used)i +(are)f(unclear.)177 250 y Fi(3.4)70 b(An)23 b(Arc)n(hitectural)d(Ov)n(erview) +177 363 y Fr(An)e(understanding)f(of)g(the)h(in)o(ternals)f(of)g(F)m(unnelW)m +(eb)f(assists)j(with)d(understanding)i(its)f(op)q(eration)h(\()p +Fo(Fig-)177 413 y(ure)d(3)p Fr(\).)177 485 y(During)h(a)h(single)g(run,)g(F)m +(unnelW)m(eb)g(reads)h(and)e(pro)q(cesses)k(a)d(single)f(input)h(\014le)g +(called)g(the)g Fo(input)g(\014le)f Fr(or)177 535 y(the)e Fo(F)l(unnelW)l(eb) +f(\014le)p Fr(.)k(The)d(\014le)g(is)f(pro)q(cessed)j(b)o(y)d(passing)h(it)f +(through)h(a)f(series)i(of)e(stages)h(called)g Fo(phases)p +Fr(.)177 585 y(The)19 b(result)f(is)g(that)g(some)g Fo(output)g(\014les)e +Fr(are)j(generated.)32 b(A)18 b Fo(journal)g(\014le)f Fr(is)h(generated)h +(con)o(taining)e(a)177 635 y(cop)o(y)h(of)g(the)g(messages)g(that)h(app)q +(ear)f(on)g(the)h(console)f(during)g(the)g(F)m(unnelW)m(eb)g(run.)31 +b(A)18 b Fo(listing)f(\014le)g Fr(is)177 685 y(created)d(con)o(taining)e(a)h +(summary)d(of)i(the)i(run,)f(including)e(an)o(y)i(error)g(messages.)18 +b(A)13 b Fo(do)q(cumen)o(tation)c Fr(\014le)k(is)177 734 y(generated)j(con)o +(taining)d(t)o(yp)q(esetter)j(commands)c(that)j(when)f(fed)h(in)o(to)e(a)h(t) +o(yp)q(esetter)j(program)12 b(will)h(result)i(in)177 784 y(prin)o(ted)f(do)q +(cumen)o(tation.)i(Finally)m(,)11 b(one)j(or)f(more)f Fo(pro)q(duct)h +(\014les)f Fr(are)i(generated)g(con)o(taining)f(the)g(result)h(of)177 +834 y(unscram)o(bling)e(the)j(macro)d(de\014nitions)i(of)g(the)g(input)g +(\014le.)177 906 y(These)h(\014les)g(need)g(not)f(all)f(b)q(e)h(generated)i +(on)d(an)o(y)h(particular)g(F)m(unnelW)m(eb)f(run.)19 b(Whether)c(eac)o(h)g +(output)f(\014le)177 956 y(app)q(ears)h(is)f(con)o(trolled)f(b)o(y)h(command) +d(line)i(options.)373 1103 y Fl(.fw)21 b(Input)g(File)g(\(FunnelWeb)f(file\)) +635 1153 y(V)526 1202 y(+---------+)390 b(\\)526 1252 y(|)21 +b(Scanner)g(|)392 b(|)526 1302 y(+---------+)e(|)635 1352 y(V)501 +b(|)526 1402 y(+--------+)412 b(|)526 1451 y(|)21 b(Parser)g(|)414 +b(|)526 1501 y(+--------+)e(|)635 1551 y(V)501 b(|)526 1601 +y(+----------+)368 b(>-------+--------)o(----+)526 1651 y(|)21 +b(Analyser)g(|)370 b(|)152 b(|)262 b(|)526 1701 y(+----------+)368 +b(|)152 b(|)262 b(|)635 1750 y(V)501 b(|)152 b(|)262 b(|)373 +1800 y(+-----------+------)o(-----)o(-+)215 b(|)152 b(V)262 +b(V)373 1850 y(V)523 b(V)218 b(|)152 b(|)262 b(|)286 1900 y(+--------+)325 +b(+-------+)129 b(|)152 b(|)262 b(|)286 1950 y(|)22 b(Tangle)e(|)327 +b(|)22 b(Weave)e(|)131 b(|)152 b(|)262 b(|)286 1999 y(+--------+)325 +b(+-------+)129 b(/)152 b(|)262 b(|)373 2049 y(|)523 b(|)392 +b(|)262 b(|)373 2099 y(V)523 b(V)392 b(V)262 b(V)243 2149 y(Product)20 +b(Files)195 b(Documentation)19 b(File)86 b(Listing)21 b(File)43 +b(Journal)20 b(File)343 2290 y Fh(F)m(unnelW)m(eb)9 b(pro)q(cesses)g(eac)o(h) +g(input)g(\014le)h(in)h(a)f(sequence)e(of)j(phases.)i(If)e(an)f(error)f(o)q +(ccurs)g(during)g(a)i(phase,)e(no)281 2340 y(subsequen)o(t)g(phases)h(are)h +(executed.)673 2431 y Fo(Figure)j(3)p Fr(:)k(F)m(unnelW)m(eb's)13 +b(pro)q(cessing)i(phases.)177 2541 y(The)f(phases)h(are)g(brie\015y)f +(describ)q(ed)i(b)q(elo)o(w.)295 2613 y Fo(The)e(Scanner)c +Fr(reads)j(the)g(input)f(\014le,)g(expands)h(and)f(reads)h(in)e(include)i +(\014les,)f(scans)h(the)g(input)295 2663 y(stream,)k(pro)q(cesses)i(pragmas)d +(and)g(t)o(yp)q(esetter)j(directiv)o(es,)f(and)f(parses)h(all)e(the)h(F)m +(unnelW)m(eb)295 2713 y(sp)q(ecial)d(sequences.)21 b(The)14 +b(result)h(is)f(a)f(list)h(of)f(tok)o(ens)h(that)g(is)g(handed)g(to)g(the)h +(parser.)295 2785 y Fo(The)k(P)o(arser)d Fr(reads)i(the)g(scanner's)g(tok)o +(en)f(list)g(and)g(parses)h(it,)f(constructing)h(a)f(do)q(cumen)o(t)295 +2835 y(list)d(and)f(a)h(macro)f(table.)18 b(whic)o(h)13 b(are)i(passed)g(to)e +(later)h(phases.)1042 2940 y(64)p eop +%%Page: 65 66 +65 65 bop 295 42 a Fo(The)20 b(Analyser)c Fr(examines)g(the)i(macro)e(table)i +(generated)g(b)o(y)f(the)h(parser)h(and)e(p)q(erforms)g(a)295 +91 y(n)o(um)o(b)q(er)12 b(of)f(c)o(hec)o(ks)j(of)d(the)i(macro)e(structures)k +(that)d(the)h(parser)g(could)f(not)g(mak)o(e)f(on)h(its)g(single)295 +141 y(pass.)17 b(F)m(or)10 b(example,)f(the)h(analyser)g(detects)i(and)e +(\015ags)g(un)o(used)h(macros)e(and)h(recursiv)o(e)h(macros.)295 +191 y(The)k(analyser)f(forms)e(the)j(\014nal)e(stage)h(of)f(F)m(unnelW)m +(eb's)h(fron)o(t-end)g(pro)q(cessing.)295 260 y Fo(T)l(angle)g +Fr(expands)g(certain)h(macros)f(in)g(the)h(macro)e(table)h(to)g(generate)i +(one)e(or)g(more)g(pro)q(duct)295 309 y(\014les.)295 378 y +Fo(W)l(ea)o(v)o(e)g Fr(uses)h(the)g(do)q(cumen)o(t)e(list)g(to)h(generate)h +(a)f(do)q(cumen)o(tation)f(\014le.)177 447 y(A)i(single)g(run)h(through)f +(these)i(phases)f(constitutes)h(a)e(single)g(in)o(v)o(o)q(cation)e(of)i +Fo(F)l(unnelW)l(eb)g(prop)q(er)p Fr(.)20 b(Most)177 496 y(in)o(v)o(o)q +(cations)d(of)h(the)h Fo(F)l(unnelW)l(eb)f(program)e Fr(will)h(consist)i +(only)e(of)g(a)h(single)g(execution)h(of)e(F)m(unnelW)m(eb)177 +546 y(prop)q(er.)h(Ho)o(w)o(ev)o(er,)12 b(F)m(unnelW)m(eb)f(also)g(pro)o +(vides)g(a)g(command)e(shell)i(that)g(pro)o(vides)h(man)o(y)d(useful)j +(commands,)177 596 y(including)j(a)g(command)f(to)h(in)o(v)o(ok)o(e)g(F)m +(unnelW)m(eb)g(prop)q(er.)25 b(Discussion)16 b(of)f(the)i(command)c(shell)i +(is)h(deferred)177 646 y(un)o(til)d(Section)h(3.15.)177 799 +y Fi(3.5)70 b(Diagnostics)177 909 y Fr(During)16 b(execution,)h(F)m(unnelW)m +(eb)f(pro)q(ceeds)j(cautiously)d(with)g(eac)o(h)h(of)f(its)g(phases,)i(only)e +(pro)q(ceeding)h(with)177 959 y(the)i(next)g(phase)f(if)g(the)g(previous)h +(phase)g(has)f(b)q(een)h(successful.)33 b(This)18 b(means)f(that,)i(when)f +(debugging)g(a)177 1009 y(F)m(unnelW)m(eb)d(\014le,)h(y)o(ou)f(ma)o(y)e +(\014nd)j(that)g(the)g(n)o(um)o(b)q(er)f(of)g(errors)i Fm(incr)n(e)n(ases)e +Fr(after)h(y)o(ou)f(\014x)g(some)g(of)g(them,)g(as)177 1059 +y(y)o(ou)f(will)e(b)q(e)i(exp)q(osing)g(y)o(ourself)g(to)g(the)g(next)h(F)m +(unnelW)m(eb)e(phase.)177 1127 y(F)m(unnelW)m(eb)i(emplo)o(ys)g(\014v)o(e)h +(lev)o(els)g(of)f(diagnostics)h(at)f(di\013eren)o(t)i(lev)o(els)f(of)f(sev)o +(erit)o(y)m(.)24 b(Sev)o(erit)o(y)17 b(is)e(de\014ned)i(in)177 +1177 y(terms)d(of)f(the)i(lev)o(el)e(of)g(activit)o(y)g(at)h(whic)o(h)g(the)g +(diagnostic)g(causes)h(F)m(unnelW)m(eb)e(to)h(ab)q(ort.)295 +1246 y Fo(W)l(arning:)i Fr(A)c(w)o(arning)f(do)q(es)h(not)g(cause)h(F)m +(unnelW)m(eb)e(to)g(terminate)g(or)h(curtail)f(its)h(op)q(eration)295 +1295 y(in)h(an)o(y)f(w)o(a)o(y)m(,)f(but)i(serv)o(es)h(merely)e(to)h(w)o(arn) +f(the)i(user)g(of)e(particular)g(conditions)h(that)f(migh)o(t)f(b)q(e)295 +1345 y(symptomatic)g(of)j(deep)q(er)h(problems.)295 1414 y +Fo(Error:)k Fr(An)c(error)h(causes)f(F)m(unnelW)m(eb)f(to)h(terminate)f(pro)q +(cessing)h(of)f(the)h(curren)o(t)h(input)f(\014le)295 1464 +y(at)d(the)g(end)g(of)f(the)h(curren)o(t)h(phase.)18 b(F)m(or)11 +b(example,)g(if)f(an)i(error)g(o)q(ccurs)h(during)f(scanning,)f(F)m(un-)295 +1514 y(nelW)m(eb)k(will)f(con)o(tin)o(ue)i(scanning)f(\(and)g(p)q(ossibly)g +(generate)i(further)f(scanning)f(diagnostics\),)295 1563 y(but)f(will)f(not)h +(in)o(v)o(ok)o(e)f(the)h(parser.)295 1632 y Fo(Sev)o(ere)h(Error:)k +Fr(A)c(sev)o(ere)h(error)f(\(or)f(\\sev)o(ere")i(for)e(short\))h(is)f(the)h +(same)e(as)i(an)f(error)h(except)295 1682 y(that)f(F)m(unnelW)m(eb)g +(terminates)f(the)i(curren)o(t)g(phase)g(imm)o(ediately)m(.)295 +1750 y Fo(F)l(atal)d(Error:)k Fr(A)11 b(fatal)e(error)j(causes)g(F)m(unnelW)m +(eb)e(not)h(only)f(to)g(terminate)h(the)g(curren)o(t)h(phase)295 +1800 y(and)h(run)g(imm)o(ediately)m(,)c(but)k(also)f(to)g(terminate)g(total)g +(F)m(unnelW)m(eb)g(pro)q(cessing)i(immediately)l(.)295 1850 +y(A)g(sev)o(ere)i(error)f(will)d(not)i(cause)h(a)e(F)m(unnelW)m(eb)g(script)i +(to)f(terminate,)f(but)h(a)f(fatal)g(error)i(will.)295 1900 +y(A)f(fatal)f(error)i(causes)g(F)m(unnelW)m(eb)e(to)h(return)h(con)o(trol)f +(to)g(the)g(op)q(erating)g(system.)295 1969 y Fo(Assertion)e(Error:)17 +b Fr(An)c(assertion)g(error)h(o)q(ccurs)g(if)e(F)m(unnelW)m(eb)g(detects)i +(an)f(in)o(ternal)f(incon-)295 2018 y(sistency)m(,)h(in)f(whic)o(h)g(case)h +(F)m(unnelW)m(eb)e(terminates)h(immediately)d(and)j(ungracefully)m(.)k(Suc)o +(h)d(an)295 2068 y(error)j(can)g(o)q(ccur)g(only)e(if)h(there)h(are)g(bugs)f +(in)g(F)m(unnelW)m(eb.)22 b(With)14 b(luc)o(k,)h(suc)o(h)h(errors)g(will)e(b) +q(e)295 2118 y(extremely)g(rare.)177 2187 y(F)m(unnelW)m(eb)c(indicates)g +(the)h(lev)o(el)e(of)h(sev)o(erit)o(y)h(of)e(eac)o(h)i(diagnostic)e(that)h +(it)g(issues)h(b)o(y)f(starting)g(eac)o(h)g(diagnostic)177 +2236 y(either)h(with)f(the)h(full)e(name)g(of)h(the)h(sev)o(erit)o(y)f(lev)o +(el)g(or)h(with)f(just)g(the)h(\014rst)g(letter)g(of)f(the)h(sev)o(erit)o(y)f +(lev)o(el)g(follo)o(w)o(ed)177 2286 y(b)o(y)k(a)f(colon.)177 +2355 y(F)m(unnelW)m(eb)f(con)o(v)o(eys)h(the)f(presence)j(or)d(absence)i(of)d +(diagnostics)h(at)g(the)h(op)q(erating)f(system)g(lev)o(el)g(b)o(y)g(return-) +177 2405 y(ing)g Fl(EXIT)p 336 2405 14 2 v 15 w(SUCCESS)f Fr(status)i(if)f +(no)g(diagnostics)g(o)q(ccurred)i(during)f(the)g(run)f(and)h +Fl(EXIT)p 1552 2405 V 15 w(FAILURE)e Fr(status)i(if)f(one)177 +2454 y(or)i(more)f(diagnostics)h(\(including)f(w)o(arnings\))g(o)q(ccurred)j +(during)d(the)i(run.)1378 2439 y Fg(2)177 2608 y Fi(3.6)70 +b(T)n(yp)r(esetter)21 b(Indep)r(endence)177 2718 y Fr(One)16 +b(of)f(the)g(design)h(goals)e(of)g(F)m(unnelW)m(eb)h(w)o(as)g(to)g(pro)o +(vide)g(a)g Fm(tar)n(get-language)g Fr(indep)q(enden)o(t)i(literate)e(pro-) +177 2768 y(gramming)9 b(system.)18 b(This)12 b(goal)g(has)h(b)q(een)h(ac)o +(hiev)o(ed)f(simply)e(b)o(y)i(treating)f(the)i(text)f(written)h(to)e(the)i +(pro)q(duct)p 177 2796 709 2 v 223 2823 a Ff(2)241 2835 y Fh(F)m(rom)c(the)h +(sym)o(b)q(ols)f(of)h(the)g(ANSI)h(standard)d(C)j(library)e +Fe(stdlib.h)p Fh(.)i(See)f Fb([Kernighan88])p Fh(,)g(p.252.)1042 +2940 y Fr(65)p eop +%%Page: 66 67 +66 66 bop 177 42 a Fr(\014le)15 b(as)g(homogeneous)f(and)h(t)o(yp)q(esetting) +h(it)f(in)g Fl(tt)21 b(font)p Fr(.)g(A)15 b(secondary)h(goal)e(w)o(as)h(to)g +(pro)o(vide)g(a)f Fm(typ)n(esetter)177 91 y Fr(indep)q(enden)o(t)i(literate)f +(programming)d(system.)21 b(By)15 b(this)g(is)f(mean)o(t)g(that)h(it)f(b)q(e) +i(p)q(ossible)f(to)g(create)h(F)m(unnel-)177 141 y(W)m(eb)d(input)g(\014les)h +(that)f(do)g(not)h(con)o(tain)e(t)o(yp)q(esetter-sp)q(e)q(ci\014c)k +(commands.)g(T)m(o)c(a)h(lesser)i(exten)o(t)f(this)g(goal)e(has)177 +191 y(also)h(b)q(een)i(ac)o(hiev)o(ed.)177 272 y(The)h(di\016cult)o(y)f(with) +h(pro)o(viding)f(t)o(yp)q(esetter-indep)q(enden)o(t)k(t)o(yp)q(esetting)e(is) +f(that)f(eac)o(h)i(desired)g(t)o(yp)q(esetting)177 322 y(feature)d(m)o(ust)e +(b)q(e)h(recreated)j(in)c(a)h(t)o(yp)q(esetter-indep)q(enden)o(t)j(F)m +(unnelW)m(eb)d(t)o(yp)q(esetting)h(construct)g(that)f(F)m(un-)177 +372 y(nelW)m(eb)f(can)f(translate)i(in)o(to)e(whatev)o(er)h(t)o(yp)q +(esetting)h(language)d(is)i(b)q(eing)g(targeted)g(b)o(y)g(W)m(ea)o(v)o(e.)k +(T)m(ak)o(en)c(to)f(the)177 422 y(extreme,)j(this)g(w)o(ould)g(result)h(in)e +(F)m(unnelW)m(eb)h(pro)o(viding)f(the)i(full)e(syn)o(tactic)i(and)f(seman)o +(tic)f(p)q(o)o(w)o(er)h(of)g(T)1883 431 y(E)1906 422 y(X,)177 +472 y(but)k(with)e(a)h(more)f(generic,)j(F)m(unnelW)m(eb-sp)q(eci\014c)f(syn) +o(tax.)27 b(This)17 b(w)o(as)g(unfeasible)g(in)g(the)h(time)d(a)o(v)n +(ailable,)177 521 y(and)f(undesirable)g(as)g(w)o(ell.)177 603 +y(The)22 b(compromise)e(struc)o(k)i(in)g(the)g(F)m(unnelW)m(eb)f(design)h(is) +f(to)h(pro)o(vide)f(a)h(set)g(of)f(primitiv)o(e)f(t)o(yp)q(esetter-)177 +653 y(indep)q(enden)o(t)15 b(t)o(yp)q(esetting)f(features)h(that)f(are)g +(implem)o(en)o(ted)e(b)o(y)h(F)m(unnelW)m(eb.)k(These)e(are)f(the)g +Fo(t)o(yp)q(esetter)177 702 y(directiv)o(es)p Fr(.)32 b(If)20 +b(the)g(user)h(is)e(prepared)i(to)f(restrict)h(to)e(these)i(directiv)o(es,)h +(then)e(the)h(user's)f(F)m(unnelW)m(eb)177 752 y(do)q(cumen)o(t)c(will)f(b)q +(e)h(b)q(oth)h(target-language)e(and)h(t)o(yp)q(esetter)j(indep)q(enden)o(t.) +26 b(Ho)o(w)o(ev)o(er,)17 b(if)e(the)i(user)g(wishes)177 802 +y(to)f(use)h(the)f(more)f(sophisticated)i(features)g(of)e(the)i(target)f(t)o +(yp)q(esetting)h(system,)f(the)g(user)h(can)g(sp)q(ecify)f(the)177 +852 y(t)o(yp)q(esetter)g(in)d(a)h(\\)p Fl(typesetter)p Fr(")d(pragma)h(and)h +(then)i(place)e(t)o(yp)q(esetter)k(commands)11 b(in)i(the)h(free)h(text)f(of) +f(the)177 902 y(F)m(unnelW)m(eb)i(do)q(cumen)o(t)g(where)i(they)f(will)e(b)q +(e)i(passed)g(v)o(erbatim)e(to)h(the)h(do)q(cumen)o(tation)f(\014le.)22 +b(The)16 b(c)o(hoice)177 952 y(of)d(the)i(trade-o\013)f(b)q(et)o(w)o(een)i(t) +o(yp)q(esetter)g(indep)q(endence)g(and)e(t)o(yp)q(esetting)g(p)q(o)o(w)o(er)h +(is)e(left)h(to)g(the)g(user.)177 1033 y(This)g(said,)f(exp)q(erience)k(with) +c(F)m(unnelW)m(eb)h(V1)g(o)o(v)o(er)g(a)f(three)j(y)o(ear)e(p)q(erio)q(d,)g +(indicates)g(that)g(the)h(t)o(yp)q(esetting)177 1083 y(facilities)e(pro)o +(vided)h(b)o(y)f(F)m(unnelW)m(eb)h(are)g(su\016cien)o(t)g(for)g(most)f(do)q +(cumen)o(tation.)177 1266 y Fi(3.7)70 b(Command)22 b(Line)g(In)n(terface)177 +1400 y Fd(3.7.1)55 b(In)n(v)n(oking)19 b(F)-5 b(unnelW)g(eb)177 +1511 y Fr(When)14 b(a)f(user)i(in)o(v)o(ok)o(es)e(F)m(unnelW)m(eb)g(at)g(the) +h(op)q(erating)g(system)f(command)e(lev)o(el,)h(the)j(user)f(m)o(ust)f(pro)o +(vide)g(a)177 1561 y(command)g(line)j(instructing)g(F)m(unnelW)m(eb)g(what)g +(to)g(do.)24 b(T)o(ypically)14 b(an)i(op)q(erating)g(system)g(command)d(line) +177 1610 y(consists)h(of)e(a)h Fm(verb)g Fr(indicating)e(that)i(a)g +(particular)g(program)e(should)i(b)q(e)g(run,)g(follo)o(w)o(ed)f(b)o(y)g(a)h +(list)f(of)h(options.)177 1660 y(F)m(or)h(example:)177 1793 +y Fl($)22 b(rename)e(file1)h(file2)177 1926 y Fr(In)f(this)f(case,)j(the)e(v) +o(erb)g(is)f Fl(rename)f Fr(and)i(the)g(command)c(line)k(options)f(are)h +Fl(file1)g(file2)p Fr(.)34 b(The)20 b(en)o(tire)177 1976 y(command)11 +b(line)j(b)q(egins)g(with)f(the)i Fl($)f Fr(and)f(ends)i(with)f(the)g +Fl(2)p Fr(.)177 2057 y(Op)q(erating)d(systems)g(di\013er)g(greatly)f(in)g +(the)h(depth)g(with)g(whic)o(h)f(they)h(pro)q(cess)h(their)f(command)d +(lines,)j(ranging)177 2107 y(from)d(systems)i(that)g(simply)d(pass)j(the)h +(en)o(tire)f(command)d(line)i(string)h(to)f(the)i(in)o(v)o(ok)o(ed)d(program) +g(\(e.g.)i(MSDOS\))177 2157 y(through)k(to)g(systems)g(that)f(p)q(erform)g +(complete)h(command)d(line)i(parsing)g(\(e.g.)h(VMS\).)f(Syn)o(tax)h(con)o(v) +o(en)o(tions)177 2207 y(v)n(ary)g(considerably)m(.)177 2288 +y(So)k(as)g(to)g(ac)o(hiev)o(e)h(maxim)n(um)13 b(p)q(ortabilit)o(y)k(and)h +(consistency)i(of)d(in)o(v)o(o)q(cation)g(across)i(di\013eren)o(t)g +(platforms,)177 2338 y(F)m(unnelW)m(eb)g(reads)h(its)f(command)e(line)h(as)i +(a)f(ra)o(w)g(string)g(and)g(p)q(erforms)g(all)f(its)h(o)o(wn)g(parsing.)34 +b(This)19 b(is)177 2388 y(p)q(ortable)12 b(b)q(ecause,)i(at)d(the)i(v)o(ery)f +(least,)g(all)f(op)q(erating)g(systems)h(allo)o(w)f(in)o(v)o(ok)o(ed)g +(programs)f(access)k(to)e(the)g(ra)o(w)177 2438 y(command)f(line.)177 +2519 y(The)j(command)e(v)o(erb)i(used)h(to)e(in)o(v)o(ok)o(e)g(F)m(unnelW)m +(eb)h(should)g(b)q(e)g(\\)p Fl(fw)p Fr(".)177 2652 y Fl(FunnelWeb_verb)19 +b(=)43 b("fw")177 2785 y Fr(If)14 b(this)g(v)o(erb)h(is)f(not)g(a)o(v)n +(ailable,)d(some)i(alternativ)o(es)h(are)h(\\)p Fl(funweb)p +Fr(",)d(\\)p Fl(fun)p Fr(",)g(and)i(\\)p Fl(funnelweb)p Fr(".)i(The)f(v)o +(erbs)177 2835 y Fl(web)e Fr(or)h Fl(fweb)f Fr(should)h(b)q(e)g(a)o(v)o +(oided)f(as)h(they)h(are)f(the)h(names)e(of)g(other)h(literate)h(programmi)o +(ng)c(systems.)1042 2940 y(66)p eop +%%Page: 67 68 +67 67 bop 177 42 a Fd(3.7.2)55 b(Command)17 b(Line)h(Argumen)n(ts)177 +158 y Fr(F)m(ollo)o(wing)c(the)j(v)o(erb)g(is)g(the)g(b)q(o)q(dy)g(of)f(the)h +(command)d(line)i(whic)o(h)g(F)m(unnelW)m(eb)g(parses)i(in)o(to)e(zero)h(or)g +(more)177 208 y Fo(argumen)o(ts)12 b Fr(separated)j(b)o(y)e(runs)i(of)e(one)h +(or)g(more)f(blanks.)177 350 y Fl(FunnelWeb_command_)o(line)18 +b(=)k(FunnelWeb_verb)d({{")i("}+)g(argument})177 493 y Fr(Because)e(some)c +(op)q(erating)h(systems)h(con)o(v)o(ert)g(their)g(command)d(line)i(to)g(upp)q +(er)h(case)h(b)q(efore)f(handing)f(it)g(to)177 543 y(the)h(in)o(v)o(ok)o(ed)f +(program,)f(F)m(unnelW)m(eb)h(has)h(b)q(een)h(constructed)g(so)f(as)g(to)f(b) +q(e)h Fm(insensitive)g Fr(to)f(the)h(case)h(of)e(its)177 593 +y(command)9 b(line)i(argumen)o(ts.)16 b(Ho)o(w)o(ev)o(er,)c(when)g(dealing)f +(in)o(ternally)f(with)i(argumen)o(ts,)e(F)m(unnelW)m(eb)h Fm(pr)n(eserves)177 +642 y Fr(the)k(case)h(of)e(its)h(command)c(line)k(argumen)o(ts)e(so)i(that)g +(it)f(will)f(b)q(e)i(able)g(to)f(op)q(erate)i(with)e(op)q(erating)h(systems) +177 692 y(\(suc)o(h)g(as)f(Unix\))g(whose)g(\014le)g(names)f(are)h(case)h +(dep)q(enden)o(t.)177 777 y(A)d(v)n(alid)d(F)m(unnelW)m(eb)i(argumen)o(t)f +(consists)j(of)d(a)h Fo(sign)p Fr(,)f(an)h(iden)o(tifying)f +Fo(letter)p Fr(,)f(and)i(an)g(optional)f Fo(string)f Fr(with)177 +827 y(no)14 b(spaces)h(separating)f(them.)177 970 y Fl(argument)42 +b(=)22 b(sign)f(id_letter)f([non_blank_stri)o(ng])177 1020 +y(sign)130 b(=)22 b("+")f(|)g("-")h(|)f("=")177 1069 y(id_letter)f(=)i("B")f +(|)g("C")h(|)f("D")g(|)h("F")f(|)h("H")f(|"I")g(|)g("J")h(|)f("K")g(|)439 +1119 y("L")g(|)g("O")h(|)f("Q")g(|)h("S")f(|)h("T")f(|)g("W")h(|)f("X")177 +1262 y Fr(In)14 b(addition)f(there)i(is)f(a)f(sp)q(ecial)h(form)f(of)g +(argumen)o(t)g(that)h(do)q(es)g(not)g(b)q(egin)g(with)f(a)h(sign.)177 +1404 y Fl(argument)20 b(=)i(non_blank_string_)o(not_b)o(eginn)o(ing_)o(with_) +o(+_=_o)o(r_-)177 1547 y Fr(This)14 b(form)e(is)i(exactly)g(equiv)n(alen)o(t) +f(to)h(the)g(same)f(string)h(with)g(\\)p Fl(+F)p Fr(")f(prep)q(ended)j(to)d +(it.)177 1632 y(The)e(seman)o(tic)f(e\013ect)i(of)e(these)i(argumen)o(ts)d +(is)i(de\014ned)g(in)f(terms)g(of)g Fo(options)e Fr(whic)o(h)j(are)f(the)h +(in)o(ternal)g(param-)177 1682 y(eters)17 b(of)e(F)m(unnelW)m(eb)g(and)g +(whic)o(h)g(corresp)q(ond)i(closely)f(with)f(the)h(set)g(of)f(legal)f +(command)f(line)i(argumen)o(ts.)177 1732 y(F)m(unnelW)m(eb)g(has)g(a)g +(prede\014ned)i(set)f(of)e(options)h(eac)o(h)g(iden)o(ti\014ed)g(b)o(y)g(an)g +(iden)o(tifying)f(letter)i(ha)o(ving)e(t)o(w)o(o)g(at-)177 +1781 y(tributes:)22 b(a)14 b Fm(string)p Fr(,)h(and)g(a)f Fm(b)n(o)n(ole)n +(an)p Fr(.)23 b(The)15 b(b)q(o)q(olean)g(determines)g(whether)i(an)e(option)f +(is)h(turned)h Fm(on)g Fr(or)f Fm(o\013)p Fr(.)177 1831 y(The)f(string)g(con) +o(tains)g(additional)e(information)f(dep)q(ending)k(on)e(the)i(option.)177 +1916 y(When)e(F)m(unnelW)m(eb)f(starts)i(up,)e(its)h(options)g(ha)o(v)o(e)f +(prede\014ned)j(default)d(v)n(alues.)17 b(F)m(unnelW)m(eb)12 +b(then)i(parses)g(its)177 1966 y(command)g(line)i(sequen)o(tially)g(from)e +(left)i(to)h(righ)o(t)f(executing)h(the)g(e\013ect)h(of)e(eac)o(h)h(argumen)o +(t)e(on)h(the)h(argu-)177 2016 y(men)o(t's)d(corresp)q(onding)h(option.)20 +b(The)15 b(sign)f(and)h(the)g(string)f(comp)q(onen)o(ts)h(of)f(the)h(argumen) +o(t)e(are)i(pro)q(cessed)177 2066 y Fm(indep)n(endently)p Fr(.)31 +b(A)18 b(sign)f(of)h Fl(+)f Fr(turns)i(the)f(option)f(on.)30 +b(A)18 b(sign)f(of)g Fl(-)h Fr(turns)g(the)h(option)e(o\013.)29 +b(A)18 b(sign)g(of)f Fl(=)177 2116 y Fr(lea)o(v)o(es)f(the)h(option's)e(b)q +(o)q(olean)h(attribute)g(unc)o(hanged.)25 b(The)16 b(argumen)o(t)f(string)h +(replaces)h(the)g(string)f(of)f(the)177 2166 y(corresp)q(onding)h(option,)e +(unless)h(the)h(argumen)o(t)d(string)i(is)g(empt)o(y)m(,)e(in)h(whic)o(h)h +(case)h(the)f(option)f(string)h(is)g(not)177 2215 y(c)o(hanged.)177 +2301 y(Because)20 b(F)m(unnelW)m(eb)d(pro)q(cesses)j(its)e(command)d(line)j +(argumen)o(ts)f(from)f(left)h(to)h(righ)o(t,)g(a)f(later)h(argumen)o(t)177 +2350 y(can)e(cancel)h(the)g(e\013ect)h(of)d(an)h(earlier)g(one.)25 +b(F)m(or)16 b(example)f Fl(fw)21 b(+t)g(-t)16 b Fr(will)f(result)h(in)g(the)h +Fl(t)f Fr(option)f(ending)177 2400 y(up)k Fm(o\013)p Fr(.)32 +b(This)18 b(allo)o(ws)f(users)j(to)e(set)h(up)f(their)h(o)o(wn)f(default)g +(argumen)o(ts)g(b)o(y)g(de\014ning)g(a)g(sym)o(b)q(ol)f(in)g(their)177 +2450 y(op)q(erating)c(system's)g(command)d(language.)17 b(F)m(or)c(example,)e +(a)i(Unix)f(user)j(who)d(w)o(an)o(ts)h(F)m(unnelW)m(eb)g(to)g(delete)177 +2500 y(all)e(iden)o(tical)h(output)g(\014les)g(and)g(create)i(a)e(do)q(cumen) +o(tation)f(\014le)h(on)g(eac)o(h)h(run)f(with)g(a)g(default)g +Fl(.typ)f Fr(extension)177 2550 y(could)j(simply)e(place)i(the)g(follo)o +(wing)e(de\014nition)h(in)g(their)i(\\)p Fl(.login)p Fr(")d(\014le.)177 +2692 y Fl(alias)21 b(fw)g(fw)h(+d)f(+t.typ)177 2835 y Fr(These)15 +b(default)f(options)f(can)h(then)h(later)f(b)q(e)g(easily)g(o)o(v)o(erridden) +g(on)g(the)g(command)d(line.)1042 2940 y(67)p eop +%%Page: 68 69 +68 68 bop 177 42 a Fd(3.7.3)55 b(Options)177 146 y Fr(F)m(unnelW)m(eb's)14 +b(options)h(are)g(in)o(ternal)f(parameters)h(whic)o(h)g(can)g(b)q(e)g(mo)q +(di\014ed)e(b)o(y)i(corresp)q(onding)h(argumen)o(ts)177 196 +y(on)e(F)m(unnelW)m(eb's)f(command)e(line.)18 b(A)c(description)g(of)g(eac)o +(h)g(argumen)o(t)f(and)g(option)h(follo)o(ws.)295 273 y Fo(B1)p +Fn(:)7 b(:)g(:)o Fo(B6:)36 b(T)l(racedumps:)31 b Fr(These)22 +b(six)e(options)h(ha)o(v)o(e)f(b)q(een)i(pro)o(vided)e(to)h(assist)g(in)f +(the)295 323 y(debugging)e(and)h(testing)g(of)f(F)m(unnelW)m(eb.)32 +b(They)19 b(determine)g(whic)o(h)f(of)g(six)h(p)q(ossible)g(trace)295 +373 y(dumps)g(are)h(to)f(b)q(e)h(written)g(to)f(the)i(listing)d(\014le.)35 +b(Only)19 b(the)h(b)q(o)q(olean)f(attributes)h(of)f(these)295 +423 y(options)14 b(are)g(ev)o(er)h(used.)k(The)14 b(six)g(dumps)f(are)h(iden) +o(ti\014ed)g(b)o(y)g(the)g(digits)f Fl(1..6)g Fr(as)h(follo)o(ws:)228 +545 y(1.)20 b(Dump)12 b(a)i(hexdump)f(of)g(eac)o(h)i(mapp)q(ed)d(input)i(and) +g(include)g(\014le.)228 632 y(2.)20 b(Dump)12 b(the)j(global)d(line)h(list)h +(created)h(b)o(y)f(the)g(scanner.)228 720 y(3.)20 b(Dump)12 +b(the)j(tok)o(en)f(list)f(created)j(b)o(y)d(the)i(scanner.)228 +807 y(4.)20 b(Dump)12 b(the)j(macro)d(table)i(created)i(b)o(y)d(the)i +(parser.)228 895 y(5.)20 b(Dump)12 b(the)j(do)q(cumen)o(t)e(list)h(created)h +(b)o(y)f(the)g(parser.)228 983 y(6.)20 b(Dump)12 b(a)i(table)g(summarizing)c +(CPU)15 b(and)e(real)h(time)f(usage.)295 1105 y(Because)18 +b(these)e(options)f(are)h(so)g(closely)f(related,)h(a)f(hac)o(k)g(has)h(b)q +(een)h(pulled)e(to)g(enable)g(them)295 1154 y(to)h(all)g(to)g(b)q(e)h(con)o +(trolled)f(b)o(y)g(the)h Fl(B)f Fr(argumen)o(t.)24 b(The)17 +b(string)f(argumen)o(t)g(to)g(the)h Fl(B)f Fr(argumen)o(t)295 +1204 y(determines)f(whic)o(h)f(of)f(the)i(six)f(options)g(are)g(to)g(b)q(e)h +(a\013ected)g(b)o(y)f(the)h(sign.)j(Examples:)g Fl(+B134)295 +1254 y Fr(turns)d(on)f(options)f Fl(B1)p Fr(,)g Fl(B3)p Fr(,)g(and)h +Fl(B4)p Fr(.)j Fl(-B1)d Fr(turns)g(o\013)g(option)f Fl(B1)p +Fr(.)18 b Fl(Default:)i(-B123456)p Fr(.)295 1331 y Fo(B7:)h(Determini)o(sm:) +15 b Fr(If)d(the)h Fl(B7)f Fr(option)g(is)g(turned)h(on,)f(F)m(unnelW)m(eb)g +(suppresses)j(the)e(output)295 1381 y(of)g(an)o(ything)g(non-deterministic,)g +(or)h(mac)o(hine)e(dep)q(enden)o(t.)20 b(This)14 b(assists)g(in)g(regression) +h(test-)295 1431 y(ing.)23 b(Only)16 b(the)g(b)q(o)q(olean)f(attribute)h(is)g +(used)h(in)e(this)h(option.)22 b(This)16 b(option)f(is)g(con)o(trolled)h(b)o +(y)295 1481 y(the)e Fl(B7)f Fr(argumen)o(t)g(whic)o(h)g(falls)f(under)i(the)g +(same)f(argumen)o(t)f(syn)o(tax)i(as)f(the)h(other)g Fl(B)f +Fr(options.)295 1530 y(Examples:)k Fl(+B7)p Fr(,)c Fl(-B7)p +Fr(.)k Fl(Default:)j(-B7)p Fr(.)295 1607 y Fo(C:)e(Listing)13 +b(File)i(Con)o(text:)k Fr(The)c Fl(C)f Fr(option)g(is)g(alw)o(a)o(ys)g +(turned)h(on)g(and)f(cannot)h(b)q(e)g(turned)295 1657 y(o\013.)24 +b(Its)16 b(only)f(attribute)h(is)g(a)g(n)o(um)o(b)q(er)f(whic)o(h)g +(determines)h(the)h(n)o(um)o(b)q(er)e(of)g(lines)h(of)f(con)o(text)295 +1707 y(that)j(the)g(lister)g(will)e(place)h(around)h(lines)f(\015agged)g +(with)g(diagnostics)g(in)g(the)i(listing)d(\014le)h(\(if)295 +1757 y(a)f(listing)e(\014le)i(is)g(written\).)24 b(A)16 b(v)n(alue)f(of)h +(100)f(indicates)h(in\014nite)f(con)o(text)i(whic)o(h)f(means)f(that)295 +1807 y(the)j(en)o(tire)f(listing)e(\014le)i(will)e(b)q(e)i(written)h(out)e +(if)g(a)g(single)g(diagnostic)g(o)q(ccurs.)28 b(The)17 b(v)n(alue)f(of)295 +1856 y(this)g(n)o(um)o(b)q(er)f(can)h(b)q(e)g(sp)q(eci\014ed)i(b)o(y)d(sp)q +(ecifying)h(it)f(as)h(a)f(string)h(of)f(decimal)f(digits)h(to)h(the)g +Fl(+C)295 1906 y Fr(argumen)o(t.)h(Examples:)g Fl(+C100)p Fr(,)12 +b Fl(+C10)p Fr(.)18 b Fl(Default:)i(+C2)p Fr(.)295 1983 y Fo(D:)f(Delete)e +(Iden)o(tical)f(Output)h(Files:)22 b Fr(Only)16 b(the)h(b)q(o)q(olean)g +(attribute)g(of)e(this)i(option)f(is)295 2033 y(used.)23 b(When)15 +b(turned)h(on,)f(the)h(option)e(causes)i(the)g(suppression)h(\(deletion\))e +(of)f(pro)q(duct)i(\014les)295 2083 y(and)j(do)q(cumen)o(tation)f(\014les)i +(\(but)g(not)f(listing)f(or)h(journal)g(\014les\))g(that)h(are)f(iden)o +(tical)g(to)g(the)295 2133 y(curren)o(tly)14 b(existing)f(\014les)h(of)f(the) +g(same)g(name.)j(F)m(or)d(example,)f(if)g(F)m(unnelW)m(eb)h(is)g(instructed)i +(to)295 2182 y(generate)d Fl(stack.h)e Fr(as)h(an)g(pro)q(duct)h(\014le,)f +(and)f(the)i(text)f(to)g(b)q(e)h(written)f(to)g Fl(stack.h)f +Fr(is)g(iden)o(tical)295 2232 y(to)i(the)h(curren)o(tly)g(existing)f +Fl(stack.h)p Fr(,)f(then)i(F)m(unnelW)m(eb)e(will)g(simply)f(not)i(write)h +(an)o(y)f(pro)q(duct)295 2282 y(\014le,)h(lea)o(ving)e(the)i(curren)o(tly)h +(existing)e Fl(stack.h)f Fr(as)i(it)f(is)h(\(and)g(in)f(particular)g(lea)o +(ving)g(the)h(\014le's)295 2332 y(date)e(attribute)g(the)g(same\).)17 +b(This)10 b(prev)o(en)o(ts)i(unnecessary)h Fl(make)c Fr(propagations.)16 +b(F)m(or)10 b(example,)295 2382 y(in)16 b(a)f(C)h(program,)e(if)h +Fl(stack.fw)f Fr(is)i(a)f(F)m(unnelW)m(eb)h(input)f(\014le)h(that)g +(generates)i Fl(stack.h)c Fr(and)295 2432 y Fl(stack.c)p Fr(,)9 +b(a)h(mo)q(di\014cation)d(to)j Fl(stack.fw)e Fr(that)i(a\013ects)h +Fl(stack.c)e Fr(but)h(do)q(es)h(not)e(a\013ect)i Fl(stack.h)295 +2481 y Fr(will)f(not)i(pro)o(v)o(ok)o(e)f(the)i(recompilation)c(of)i(mo)q +(dules)g(that)h Fl(#include)20 b(stack.h)p Fr(,)10 b(so)i(long)e(as)i(the)295 +2531 y(in)o(terv)o(ening)i(F)m(unnelW)m(eb)f(run)i(has)f Fl(+D)f +Fr(set.)19 b(Examples:)e Fl(-D)p Fr(,)c Fl(+D)p Fr(.)g Fl(Default:)20 +b(-D)p Fr(.)295 2608 y Fo(F:)f(F)l(unnelW)l(eb)d(Input)h(File:)22 +b Fr(If)16 b(this)g(option)g(is)g(turned)h(on,)f(F)m(unnelW)m(eb)g(pro)q +(cesses)j(the)295 2658 y(input)h(\014le)h(whose)f(name)f(is)h(sp)q(eci\014ed) +i(b)o(y)e(the)h(option)f(string.)37 b(Examples:)29 b Fl(+Fsloth.fw)p +Fr(,)295 2708 y Fl(+Fwalrus)p Fr(,)12 b Fl(-F)p Fr(.)h Fl(Default:)20 +b(-F)p Fr(.)295 2785 y Fo(H:)h(Displa)o(y)c(Help)i(Message:)26 +b Fr(If)17 b(this)g(option)g(is)g(turned)i(on,)e(F)m(unnelW)m(eb)g(displa)o +(ys)g(the)295 2835 y(message)d(sp)q(eci\014ed)h(b)o(y)e(the)h(argumen)o(t)e +(string.)18 b(Eac)o(h)c(message)g(has)f(a)g(name.)k(The)d(main)e(help)1042 +2940 y(68)p eop +%%Page: 69 70 +69 69 bop 295 42 a Fr(message)16 b(is)g(called)f(\\)p Fl(menu)p +Fr(")g(and)h(con)o(tains)g(a)f(list)h(of)f(the)h(other)h(help)f(messages.)24 +b(Examples:)295 91 y Fl(+Hregistration)p Fr(,)11 b Fl(+Hoptions)p +Fr(.)16 b Fl(Default:)k(-Hmenu)p Fr(.)295 165 y Fo(I:)c(Include)e(default)g +(\014le)g(sp)q(eci\014cation:)i Fr(This)e(option)f(is)h(alw)o(a)o(ys)e +(turned)j(on)f(and)f(cannot)295 215 y(b)q(e)j(turned)g(o\013.)22 +b(Its)16 b(string)f(attribute)h(is)f(used)h(as)f(the)h(default)f(\014le)g(sp) +q(eci\014cation)h(for)f(include)295 265 y(\014les.)j(Usually)12 +b(this)g(option)g(is)g(used)h(to)f(sp)q(ecify)h(a)f(directory)h(from)e(whic)o +(h)h(include)g(\014les)h(should)295 315 y(b)q(e)i(obtained.)j(Examples:)e +Fl(=I/usr/dave/includes)o(/)p Fr(.)f Fl(Default:)20 b(+I)p +Fr(.)295 388 y Fo(J:)d(Journal)d(File:)19 b Fr(If)14 b(this)g(option)g(is)g +(turned)i(on,)e(F)m(unnelW)m(eb)g(generates)i(a)e(journal)g(\014le.)20 +b(A)295 438 y(journal)15 b(\014le)h(con)o(tains)g(a)g(log)f(of)g(all)g(the)i +(console)f(input)g(and)g(output)g(to)g(F)m(unnelW)m(eb)f(during)295 +488 y(a)h(single)g(in)o(v)o(o)q(cation)f(of)h(the)h(F)m(unnelW)m(eb)f +(program)f(\(Note:)23 b(The)17 b Fl(Q)f Fr(option)f(do)q(es)i(not)g(a\013ect) +295 538 y(this.\).)23 b(The)16 b(journal)f(\014le)g(is)h(particularly)f +(useful)g(for)g(examining)f(what)h(happ)q(ened)i(during)e(a)295 +588 y(F)m(unnelW)m(eb)e(shell)h(run.)k(The)d(string)e(attribute)i(is)e(the)i +(name)d(of)h(the)h(journal)f(\014le.)18 b(Examples:)295 638 +y Fl(+Jjournfile)p Fr(,)11 b Fl(-J)p Fr(.)i Fl(Default:)20 +b(-J)p Fr(.)295 711 y Fo(K:)g(Keyb)q(oard:)k Fr(If)16 b(this)h(option)f(is)g +(turned)i(on,)e(F)m(unnelW)m(eb)g(en)o(ters)i(an)f(in)o(teractiv)o(e)g(mo)q +(de)295 761 y(in)i(whic)o(h)g(the)h(user)h(can)e(en)o(ter)h(F)m(unnelW)m(eb)f +(shell)g(commands)e(in)o(teractiv)o(ely)m(.)34 b(The)20 b(string)295 +811 y(attribute)15 b(is)e(un)o(used.)19 b(Examples:)e Fl(+K)p +Fr(,)c Fl(-K)p Fr(.)g Fl(Default:)20 b(-K)p Fr(.)295 885 y +Fo(L:)d(Listing)d(File:)k Fr(If)c(this)h(option)e(is)i(turned)g(on,)f(F)m +(unnelW)m(eb)g(generates)i(a)f(listing)e(\014le)i(con-)295 +935 y(taining)e(a)g(summary)e(of)i(a)h(run)g(on)f(F)m(unnelW)m(eb)h(prop)q +(er.)k(The)d(string)e(argumen)o(t)g(is)h(the)g(name)295 985 +y(of)g(the)g(listing)f(\014le)h(to)f(b)q(e)i(created.)k(Examples:)e +Fl(+L)p Fr(,)c Fl(-L)p Fr(,)g Fl(+Llisting.lis)p Fr(.)j Fl(Default:)k(-L)p +Fr(.)295 1058 y Fo(O:)e(Pro)q(duct)d(Files:)k Fr(If)c(this)g(option)f(is)h +(turned)h(on,)e(F)m(unnelW)m(eb)h(generates)h(a)f(pro)q(duct)h(\014le)295 +1108 y(for)e(eac)o(h)h(macro)e(in)g(the)i(input)f(\014le)g(that)g(is)g(b)q +(ound)g(to)g(an)g(output)h(\014le.)j(The)d(string)f(attribute)295 +1158 y(con)o(tributes)22 b(to)e(the)h(name)e(of)h(the)h(pro)q(duct)g +(\014les.)38 b(This)20 b(option)g(is)g(con)o(trolled)g(b)o(y)g(the)h +Fl(O)295 1208 y Fr(argumen)o(t)d(b)q(ecause)j(pro)q(duct)e(\014les)g(used)h +(to)f(b)q(e)g(called)g(\\)p Fo(O)p Fr(utput)g(\014les"\).)33 +b(Examples:)27 b Fl(-O)p Fr(,)295 1258 y Fl(+O/usr/dave/product)o(/)p +Fr(.)15 b Fl(Default:)20 b(+O)p Fr(.)295 1332 y Fo(Q:)15 b(Quiet:)h +Fr(If)c(this)g(option)g(is)g(turned)i(on,)e(F)m(unnelW)m(eb)f(suppresses)16 +b(all)11 b(output)h(to)h(the)g(screen)295 1381 y(\(standard)k(output\))f +(unless)g(one)g(or)g(more)f(errors)i(o)q(ccur,)g(in)e(whic)o(h)h(case)h(a)e +(single)h(line)f(sum-)295 1431 y(marizing)d(the)i(errors)h(is)e(sen)o(t)i(to) +e(standard)h(output)g(at)f(the)i(end)f(of)f(the)h(run.)k(If)13 +b(this)h(option)f(is)295 1481 y(turned)j(o\013,)e(F)m(unnelW)m(eb)g(writes)h +(to)g(the)g(console)g(in)f(its)g(normal)f(garrulous)h(w)o(a)o(y)m(.)19 +b(The)c(string)295 1531 y(attribute)g(is)e(un)o(used)i(in)f(this)g(option.)j +(Examples:)g Fl(-Q)p Fr(,)c Fl(+Q)p Fr(.)g Fl(Default:)20 b(-Q)p +Fr(.)295 1605 y Fo(S:)13 b(Screen:)k Fr(If)11 b(this)h(option)f(is)g(turned)i +(on,)e(F)m(unnelW)m(eb)h(writes)g(all)e(diagnostics)i(to)f(the)i(screen)295 +1654 y(\(standard)i(output\))g(as)g(w)o(ell)f(as)g(to)h(the)g(listing)f +(\014le.)20 b(By)14 b(default,)g(they)h(are)g(sen)o(t)h(only)e(to)g(the)295 +1704 y(listing)i(\014le.)28 b(This)17 b(option)g(has)g(a)g(single)f(n)o +(umerical)g(attribute)i(that)f(can)g(b)q(e)h(sp)q(eci\014ed)h(as)e(a)295 +1754 y(decimal)10 b(string)i(in)g(the)g(string)g(comp)q(onen)o(t)f(of)g(the)h +Fl(S)g Fr(argumen)o(t.)k(The)c(n)o(um)o(b)q(er)f(is)h(the)g(n)o(um)o(b)q(er) +295 1804 y(of)g(lines)f(of)h(con)o(text)g(that)g(should)g(surround)g(eac)o(h) +h(diagnostic)e(sen)o(t)i(to)e(the)i(screen.)19 b(Examples:)295 +1854 y Fl(-S)p Fr(,)13 b Fl(+S6)p Fr(,)g Fl(+S0)p Fr(.)k Fl(Default:)j(-S)p +Fr(.)295 1928 y Fo(T:)e(Do)q(cumen)o(tation)c(\014le:)20 b +Fr(If)14 b(this)i(option)1034 1913 y Fg(3)1067 1928 y Fr(is)e(turned)j(on,)d +(F)m(unnelW)m(eb)h(generates)i(a)d(do)q(c-)295 1977 y(umen)o(tation)f(\014le) +i(in)g(T)657 1986 y(E)680 1977 y(X)g(format.)k(The)c(string)g(argumen)o(t)f +(con)o(tributes)i(to)f(the)g(name)f(of)g(the)295 2027 y(do)q(cumen)o(tation)g +(\014le)h(to)g(b)q(e)g(created.)23 b(By)15 b(default)f(this)h(option)f(is)h +(turned)h(o\013,)f(as)f(exp)q(erience)295 2077 y(has)h(sho)o(wn)f(that)g +(most)f(F)m(unnelW)m(eb)h(runs)g(are)h(made)e(during)h(program)e(dev)o +(elopmen)o(t;)h(do)q(cu-)295 2127 y(men)o(tation)f(runs)j(o)q(ccur)g(far)f +(more)e(rarely)m(.)18 b(Examples:)f Fl(-T)p Fr(,)c Fl(+Tsloth.tex)p +Fr(.)j Fl(Default:)k(-T)p Fr(.)295 2201 y Fo(W:)e(Width)e(of)g(Pro)q(duct)g +(Files:)j Fr(If)c(this)g(option)f(is)h(turned)h(on,)f(a)g(limit)d(is)j +(placed)g(on)g(the)295 2250 y(length)f(of)g(lines)g(in)g(pro)q(duct)h +(\014les)g(generated)g(during)f(the)h(run.)20 b(Lines)14 b(that)g(breac)o(h)i +(the)e(limit)295 2300 y(are)k(\015agged)f(with)g(error)h(messages.)28 +b(This)17 b(option)g(has)g(a)g(single)g(n)o(umerical)f(attribute)i(that)295 +2350 y(can)c(b)q(e)h(sp)q(eci\014ed)h(as)e(a)f(decimal)g(string)h(in)f(the)i +(string)f(comp)q(onen)o(t)f(of)h(the)g Fl(W)g Fr(argumen)o(t.)j(The)295 +2400 y(n)o(um)o(b)q(er)f(is)h(the)h(sp)q(eci\014ed)g(maxim)n(um)13 +b(width.)26 b(This)17 b(option)f(is)h(one)g(of)f(t)o(w)o(o)h(limits)d(that)j +(are)295 2450 y(placed)i(on)f(the)h(width)f(of)f(pro)q(duct)i(\014les.)32 +b(The)18 b(other)h(limit)d(is)i(an)g(attribute)g(of)g(the)h(input)295 +2500 y(\014le)c(that)f(defaults)h(to)g(80)f(c)o(haracters,)i(but)e(can)h(b)q +(e)g(raised)g(or)g(lo)o(w)o(ered)g(using)f(an)g(output)h(line)295 +2549 y(length)f(pragma.)i(The)d(width)h(that)f(is)g(enforced)i(is)e(the)h(lo) +o(w)o(er)f(of)g(this)g(v)n(alue)g(and)g(the)i(v)n(alue)d(of)295 +2599 y(the)j Fl(W)e Fr(option)h(\(if)f(turned)i(on\).)j(Examples:)e +Fl(-W)p Fr(,)d Fl(+W100)p Fr(.)k Fl(Default:)j(-W80)p Fr(.)295 +2673 y Fo(X:)f(Execute:)i Fr(If)16 b(this)f(option)g(is)h(turned)g(on,)g(F)m +(unnelW)m(eb)f(executes)i(the)g(F)m(unnelW)m(eb)e(shell)295 +2723 y(script)g(\014le)f(sp)q(eci\014ed)h(b)o(y)f(the)g(string)g(attribute.) +19 b(Examples:)e Fl(+Xmaster)p Fr(,)11 b Fl(-X)p Fr(.)i Fl(Default:)21 +b(-X)p Fr(.)p 177 2757 709 2 v 223 2783 a Ff(3)241 2795 y Fh(This)c(option)f +(is)h(con)o(trolled)d(b)o(y)j(the)f Fe(T)i Fh(command)c(line)i(argumen)o(t)f +(b)q(ecause)g(do)q(cumen)o(tati)o(on)f(\014les)j(used)f(to)h(b)q(e)g(called) +177 2835 y(t)o(yp)q(esetter)9 b(\014les.)1042 2940 y Fr(69)p +eop +%%Page: 70 71 +70 70 bop 177 42 a Fi(3.8)70 b(File)21 b(Name)h(Inheritance)177 +157 y Fr(During)10 b(a)h(single)f(run)h(of)f(F)m(unnelW)m(eb,)g(F)m(unnelW)m +(eb)h(can)g(pro)q(duce)g(man)o(y)e(di\013eren)o(t)j(output)f(\014les.)17 +b(As)11 b(it)g(w)o(ould)177 207 y(b)q(e)i(v)o(ery)g(tedious)g(to)f(ha)o(v)o +(e)g(to)g(sp)q(ecify)h(the)g(name)f(of)f(eac)o(h)i(of)f(these)i(\014les)f +(explicitly)e(eac)o(h)i(time)e(F)m(unnelW)m(eb)h(is)177 257 +y(run,)g(F)m(unnelW)m(eb)e(pro)o(vides)i(a)f(system)g(of)f(defaults)h(that)g +(allo)o(ws)f(the)i(user)g(to)f(sp)q(ecify)h(the)g(minim)n(um)7 +b(required)177 306 y(to)15 b(successfully)i(complete)d(the)i(run.)23 +b(T)m(o)14 b(do)h(this)h(F)m(unnelW)m(eb)e(allo)o(ws)g(\014le)i(sp)q +(eci\014cations)g(to)f(inherit)g(\014elds)177 356 y(from)d(one)i(another.)177 +430 y(F)m(unnelW)m(eb)k(structures)j(\014lenames)d(in)o(to)g(three)i +(\014elds)f(whic)o(h)f(are)h(inherited)g(indep)q(enden)o(tly)m(.)32 +b(The)19 b(\014elds)177 480 y(are:)f Fo(directory)p Fr(,)11 +b Fo(name)p Fr(,)h(and)h Fo(extension)p Fr(.)i(On)e(systems)g(ha)o(ving)f +(other)i(\014elds)f(\(e.g.)g Fm(network)g(no)n(de)p Fr(,)h +Fm(devic)n(e)177 530 y(name)p Fr(\),)d(the)g(extra)g(\014elds)g(are)g +(considered)g(to)f(b)q(e)h(part)g(of)e(the)i(directory)g(\014eld.)17 +b(V)m(ersion)11 b(n)o(um)o(b)q(ers)f(are)g(ignored.)177 580 +y(A)k(\014eld)g(can)g(inherit)g(a)g(v)n(alue)f(if)g(its)h(curren)o(t)h(v)n +(alue)e(is)h(the)h(empt)o(y)d(string.)177 654 y(The)i(follo)o(wing)e(table)i +(giv)o(es)f(the)i(full)d(inheritance)j(sc)o(heme)f(used)h(in)e(F)m(unnelW)m +(eb.)p 402 733 1323 2 v 401 783 2 50 v 427 768 a(Script)p 579 +783 V 70 w(Input)p 743 783 V 64 w(Include)p 925 783 V 50 w(Journal)p +1112 783 V 50 w(List)p 1290 783 V 108 w(Do)q(cumen)o(t)p 1526 +783 V 49 w(Pro)q(duct)p 1723 783 V 402 785 1323 2 v 401 834 +2 50 v 579 834 V 743 834 V 769 819 a Fl(@i)p 925 834 V 1112 +834 V 1290 834 V 1526 834 V 739 w(@o)p 1723 834 V 401 884 V +427 869 a(+x)p 579 884 V 134 w(+f)p 743 884 V 120 w(+i)p 925 +884 V 138 w(+j)p 1112 884 V 143 w(+l)p 1290 884 V 134 w(+t)p +1526 884 V 192 w(+o)p 1723 884 V 401 934 V 427 919 a Fr(\\)p +Fl(.fws)p Fr(")p 579 934 V 48 w(\\)p Fl(.fw)p Fr(")p 743 934 +V 56 w(\\)p Fl(.fwi)p Fr(")p 925 934 V 52 w(\\)p Fl(.jrn)p +Fr(")p 1112 934 V 57 w(\\)p Fl(.lis)p Fr(")p 1290 934 V 48 +w(\\)p Fl(.tex)p Fr(")p 1526 934 V 1723 934 V 401 984 V 579 +984 V 743 984 V 769 969 a Fl(+f)p 925 984 V 138 w(+f)p 1112 +984 V 143 w(+f)p 1290 984 V 134 w(+f)p 1526 984 V 1723 984 +V 401 1034 V 427 1019 a Fr(DefDir)p 579 1034 V 55 w(Defdir)p +743 1034 V 50 w(Defdir)p 925 1034 V 68 w(Defdir)p 1112 1034 +V 73 w(Defdir)p 1290 1034 V 64 w(Defdir)p 1526 1034 V 122 w(Defdir)p +1723 1034 V 402 1035 1323 2 v 177 1133 a(The)g(table)g(is)f(arranged)h(with)f +(items)g(of)g(highest)g(priorit)o(y)g(at)h(the)g(top.)k(The)c(\\)p +Fl(+<letter>)p Fr(")d(cells)j(refer)h(to)e(the)177 1183 y(\014le)h(sp)q +(eci\014cation)h(supplied)g(in)e(the)i(giv)o(en)f(command)d(line)j(argumen)o +(t.)k(\\)p Fl(+F)p Fr(")12 b(is)h(the)h(name)e(of)g(the)i(input)f(\014le.)177 +1233 y(\\Defdir")k(refers)i(to)f(the)g(default)f(directory)i(sp)q +(eci\014cation)f(pro)o(vided)g(b)o(y)f(the)h(op)q(erating)g(system.)29 +b(Empt)o(y)177 1283 y(cells)14 b(do)g(not)g(con)o(tribute.)177 +1357 y(The)g(follo)o(wing)d(example)i(sho)o(ws)h(ho)o(w)f(the)h(table)g(is)f +(used.)19 b(Supp)q(ose)c(that)f(the)g(user)h(in)o(v)o(ok)o(ed)e(F)m(unnelW)m +(eb)g(as)177 1407 y(follo)o(ws:)177 1522 y Fl(fw)22 b(/usr/ross/work/)o +(sloth)o(.fw)d(+twalrus)177 1636 y Fr(T)m(o)g(w)o(ork)g(out)g(what)h(the)g +(do)q(cumen)o(tation)e(\014le)i(should)f(b)q(e)h(called,)g(F)m(unnelW)m(eb)f +(starts)i(with)e(the)h(empt)o(y)177 1686 y(string)d(and)g(then)h(w)o(orks)f +(do)o(wn)g(the)h(Do)q(cumen)o(t)e(column)f(of)i(the)h(table.)27 +b(The)18 b(top)f(en)o(try)g(is)g(empt)o(y)f(so)i(w)o(e)177 +1736 y(ignore)g(it)f(and)g(pro)q(ceed)j(to)d(the)i(second)f(en)o(try)h(whic)o +(h)e(consists)i(of)e(\\)p Fl(+T)p Fr(".)f(The)i(user)h(sp)q(eci\014ed)g(the)g +(string)177 1786 y(\\)p Fl(walrus)p Fr(")d(as)i(the)g(v)n(alue)f(of)g(this)h +(option,)f(and)h(as)g(our)f(curren)o(t)i(\(empt)o(y\))e(string)h(do)q(es)h +(not)e(ha)o(v)o(e)h(a)f(name)177 1836 y(\014eld,)d(w)o(e)g(insert)h(the)g +(string)f(\\)p Fl(walrus)p Fr(")e(in)o(to)i(the)h(name)d(\014eld,)i +(resulting)g(in)g(the)h(string)f(\\)p Fl(walrus)p Fr(".)j(Mo)o(ving)177 +1886 y(do)o(wn)d(to)g(the)h(next)f(ro)o(w,)g(w)o(e)g(encoun)o(ter)i(the)f +(constan)o(t)f(string)h(\\)p Fl(.tex)p Fr(".)i(This)d(string)g(consists)h(of) +f(an)g(empt)o(y)177 1935 y(directory)j(and)e(name)g(\014eld,)h(but)g(a)f(\\)p +Fl(.tex)p Fr(")g(\014le)h(extension.)24 b(As)16 b(our)g(curren)o(t)h(string)f +(\\)p Fl(walrus)p Fr(",)e(do)q(es)j(not)177 1985 y(already)f(ha)o(v)o(e)g(a)g +(\014le)h(extension)g(\(i.e.)e(the)i(\014le)f(extension)h(\014eld)g(of)e(our) +i(curren)o(t)g(string)g(is)f(empt)o(y\),)f(w)o(e)i(add)177 +2035 y(in)f(\\)p Fl(.tex)p Fr(",)f(resulting)h(in)g(the)h(string)f(\\)p +Fl(walrus.tex)p Fr(".)22 b(Next)17 b(w)o(e)f(encoun)o(ter)i(the)f(\\)p +Fl(+F)p Fr(")e(\014eld)h(whic)o(h)g(is)g(the)177 2085 y(input)c(\014lename)f +(\\)p Fl(/usr/ross/work/slo)o(th.fw)o Fr(")e(consisting)k(of)e(a)h(directory) +h(\014eld)g(\\)p Fl(/usr/ross/work)o(/)p Fr(",)c(a)177 2135 +y(name)k(\014eld)i(\\)p Fl(sloth)p Fr(",)d(and)j(a)f(\014le)g(extension)h +(\014eld)g(\\)p Fl(.fw)p Fr(".)j(Our)d(\\)p Fl(walrus.tex)p +Fr(")d(string)i(already)g(has)h(name)177 2184 y(and)f(\014le)g(extension)h +(\014elds,)e(but)i(its)f(directory)g(\014eld)g(is)g(empt)o(y)m(,)e(and)i(so)g +(w)o(e)g(add)g(in)f(the)i(directory)g(\014eld)f(from)177 2234 +y(the)f(input)g(\014le)g(sp)q(eci\014cation,)g(resulting)g(in)f(the)h(string) +g(\\)p Fl(/usr/ross/work/w)o(alrus)o(.tex)o Fr(".)i(Finally)m(,)10 +b(w)o(e)j(hit)177 2284 y(the)i(default)f(directory)i(sp)q(eci\014cation,)f +(whic)o(h)f(is)h(\(sa)o(y\))f(\\)p Fl(/usr/ross/play/)p Fr(".)j(Ho)o(w)o(ev)o +(er,)d(as)h(the)g(directory)177 2334 y(\014eld)f(of)f(our)h(w)o(alrus)g +(string)g(is)g(already)f(full,)f(it)i(has)g(no)g(e\013ect.)177 +2408 y(In)j(general,)f(there)i(is)f(no)f(need)h(to)g(remem)o(b)q(er)e(the)i +(exact)g(details)g(of)e(F)m(unnelW)m(eb's)h(\014lename)g(inheritance.)177 +2458 y(The)e(imp)q(ortan)o(t)f(thing)g(is)h(to)g(kno)o(w)f(that)h(it)f +(exists,)h(and)g(to)g(use)h(it.)177 2620 y Fi(3.9)70 b(F)-6 +b(unnelW)g(eb)22 b(Startup)177 2735 y Fr(F)m(unnelW)m(eb's)c(command)d(line)j +(options)f(can)i(b)q(e)f(divided)g(in)o(to)f(t)o(w)o(o)h(groups.)31 +b Fo(Action)19 b(options)d Fr(instruct)177 2785 y(F)m(unnelW)m(eb)j(to)g(p)q +(erforms)g(some)g(sort)h(of)f(indep)q(enden)o(t)i(action)e(suc)o(h)h(as)f +(pro)q(cessing)i(a)e(\014le.)35 b Fo(Ordinary)177 2835 y(options)11 +b Fr(merely)i(mo)q(dify)f(the)i(w)o(a)o(y)g(in)f(whic)o(h)h(F)m(unnelW)m(eb)f +(executes)j(the)f(actions.)1042 2940 y(70)p eop +%%Page: 71 72 +71 71 bop 177 42 a Fr(The)13 b(four)e(action)h(options)g(are:)17 +b Fl(+F)p Fr(,)11 b Fl(+K)p Fr(,)h Fl(+X)p Fr(,)f(and)g Fl(+H)p +Fr(.)h(F)m(or)f(F)m(unnelW)m(eb)h(to)g(b)q(e)g(successfully)i(in)o(v)o(ok)o +(ed,)d(at)h(least)177 91 y(one)17 b(action)f(option)g(m)o(ust)g(b)q(e)h(sp)q +(eci\014ed.)28 b(If)16 b(zero)i(action)e(options)g(are)i(sp)q(eci\014ed,)g(F) +m(unnelW)m(eb)e(terminates)177 141 y(with)e(failure)f(status.)19 +b(If)14 b(more)f(than)h(one)g(action)g(option)f(is)h(sp)q(eci\014ed,)h(F)m +(unnelW)m(eb)e(p)q(erforms)h(the)g(sp)q(eci\014ed)177 191 y(actions)g(in)g(a) +f(prede\014ned)j(order.)177 259 y(Assuming)e(that)h(the)g(user)h(has)f(sp)q +(eci\014ed)h(at)f(least)g(one)g(action,)f(the)h(order)h(in)e(whic)o(h)h +(actions)g(are)g(executed)177 309 y(is)f(as)g(follo)o(ws:)295 +377 y Fo(Initializati)o(on)i(script:)24 b Fr(F)m(unnelW)m(eb)17 +b(starts)h(b)o(y)f(lo)q(oking)f(in)h(the)h(curren)o(t)h(directory)f(for)f(a) +295 427 y(\014le)e(called)g(\\)p Fl(fwinit.fws)p Fr(".)k(If)14 +b(it)h(do)q(esn't)g(\014nd)h(one,)f(it)f(do)q(esn't)i(raise)f(an)o(y)f +(error.)23 b(If)14 b(it)h(do)q(es)295 477 y(\014nd)e(one,)g(it)f(executes)j +(it)d(as)h(a)f(F)m(unnelW)m(eb)h(shellscript.)18 b(Initialization)10 +b(scripts)k(are)f(useful)g(for)295 527 y(setting)g(up)e(F)m(unnelW)m(eb)h +(options)f(\(e.g.)g(using)h(the)g(\\)p Fl(set)p Fr(")f(command)e(without)j +(ha)o(ving)e(to)i(t)o(yp)q(e)295 577 y(them)h(eac)o(h)i(time\).)295 +645 y Fo(Execute)e(argumen)o(t)e(script:)k Fr(If)c(a)g(shellscript)h(has)g(b) +q(een)g(sp)q(eci\014ed)h(using)e(the)h(\\)p Fl(+X)p Fr(")f(option,)295 +695 y(F)m(unnelW)m(eb)j(executes)i(it.)295 763 y Fo(Pro)q(cess)k(input)d +(\014le:)25 b Fr(If)17 b(the)i(user)f(has)g(sp)q(eci\014ed)h(an)f(input)f +(\014le)h(using)f(the)h(\\)p Fl(+F)p Fr(")f(option,)295 813 +y(then)e(this)f(is)g(pro)q(cessed)i(next)e(\(b)o(y)g(F)m(unnelW)m(eb)f(prop)q +(er\).)295 881 y Fo(Displa)o(y)k(help)g(message:)24 b Fr(If)16 +b(the)h(user)h(requested,)h(using)d(the)i(\\)p Fl(+H)p Fr(")d(option,)i(that) +f(a)h(help)295 931 y(message)d(b)q(e)g(displa)o(y)o(ed,)f(the)i(message)e(is) +h(displa)o(y)o(ed)f(at)h(this)g(time.)295 999 y Fo(In)o(teractiv)o(e)f(mo)q +(de:)18 b Fr(If)13 b(the)g(user)i(sp)q(eci\014ed)g(the)e(\\)p +Fl(+K)p Fr(")g(option,)f(F)m(unnelW)m(eb)h(en)o(ters)h(in)o(terac-)295 +1049 y(tiv)o(e)g(\(k)o(eyb)q(oard\))g(mo)q(de.)177 1117 y(F)m(unnelW)m(eb)e +(pro)q(cesses)j(these)f(actions)e(in)g(the)h(ab)q(o)o(v)o(e)f(order)i +(regardless)f(of)f(the)h(order)g(in)f(whic)o(h)g(they)h(app)q(ear)177 +1167 y(on)h(the)g(command)d(line.)177 1236 y(It)17 b(ma)o(y)e(b)q(e)i(hard)g +(to)g(see)g(ho)o(w)g(some)f(of)g(these)i(actions)f(migh)o(t)d(b)q(e)k(com)o +(bined.)25 b(Nev)o(ertheless,)19 b(F)m(unnelW)m(eb)177 1285 +y(allo)o(ws)e(this.)31 b(F)m(or)18 b(example,)g(a)g(user)h(migh)o(t)d(wish)i +(to)g(pro)q(cess)i(a)e(batc)o(h)h(of)f(\014les)g(as)g(sp)q(eci\014ed)i(in)e +(a)g(script)177 1335 y(\(\\)p Fl(+Xscript.fws)p Fr("\),)13 +b(b)q(e)j(reminded)f(of)g(the)h(in)o(teractiv)o(e)f(commands)e(a)o(v)n +(ailable)h(\(\\)p Fl(+Hcommand)p Fr("\),)f(and)i(then)177 1385 +y(en)o(ter)d(in)o(teractiv)o(e)g(mo)q(de)e(so)h(as)g(to)g(b)q(e)h(able)e(to)h +(repro)q(cess)j(\014les)d(for)g(whic)o(h)g(F)m(unnelW)m(eb)f(rep)q(orted)j +(errors)f(\(after)177 1435 y(correcting)j(the)g(errors)g(in)e(a)h(di\013eren) +o(t)h(w)o(orkstation)e(windo)o(w\).)177 1588 y Fi(3.10)70 b(Scanner)177 +1697 y Fr(The)16 b(scanner)h(reads)f(in)f(the)h(input)f(\014le)g(and)g(pro)q +(duces)i(a)e(list)g(of)g(tok)o(ens)h(whic)o(h)f(it)g(hands)g(on)o(to)g(the)h +(parser.)177 1747 y(In)c(addition,)f(some)h(input)g(constructs)i(ma)o(y)d +(cause)i(the)g(scanner)h(to)e(mo)q(dify)e(some)h(of)h(F)m(unnelW)m(eb's)g +(options.)177 1879 y Fd(3.10.1)55 b(Basic)19 b(Input)g(File)e(Pro)r(cessing) +177 1974 y Fr(In)d(order)h(to)f(read)h(in)f(an)g(input)g(\014le)g(or)g +(include)h(\014le,)f(the)g(scanner)i(calls)e(a)g(submo)q(dule)f(called)h(the) +h Fo(mapp)q(er)177 2024 y Fr(that)d(reads)g(a)f(\014le)h(in)f(and)g(creates)j +(a)d(con)o(tiguous)g(cop)o(y)h(of)f(it)g(in)g(memory)m(.)j(The)e(scanner)h +(then)f(p)q(erforms)f(three)177 2074 y(c)o(hec)o(ks)18 b(on)e(the)h(\014le,)g +(the)g(\014rst)g(\(\014le)g(termination\))e(of)h(whic)o(h)g(is)g(p)q +(erformed)g(b)q(efore)i(scanning)e(commences,)177 2124 y(and)e(the)g(other)h +(t)o(w)o(o)e(of)h(whic)o(h)f(tak)o(e)h(place)g(during)g(scanning)g(b)q(efore) +g(eac)o(h)h(line)e(is)h(scanned.)295 2192 y Fo(File)c(T)l(ermination)o(:)k +Fr(The)c(\014rst)g(c)o(hec)o(k)h(the)f(scanner)h(mak)o(es)d(is)h(whether)i +(the)f(\014le)g(is)f(terminated)295 2242 y(prop)q(erly)m(.)19 +b(A)14 b(\014le)g(is)g(considered)i(to)e(b)q(e)g(prop)q(erly)h(terminated)e +(if)h(it)f(either)i(con)o(tains)f(no)g(lines,)295 2291 y(or)j(if)f(the)h +(last)g(line)f(in)g(the)i(\014le)e(is)h(terminated)f(b)o(y)h(an)f +(end-of-line)g(mark)o(er.)26 b(If)16 b(the)h(scanner)295 2341 +y(detects)i(that)e(an)f(input)g(\014le)h(is)g(not)f(prop)q(erly)h +(terminated,)f(it)h(adds)f(an)h(end-of-line)f(mark)o(er)295 +2391 y(itself)e(\(to)g(the)g(cop)o(y)g(in)f(memory)f(only\).)295 +2459 y Fo(Unprin)o(tab)o(le)i(Characters:)21 b Fr(The)16 b(second)h(c)o(hec)o +(k)f(the)g(scanner)h(mak)o(es)d(is)i(for)f(unprin)o(table)295 +2509 y(c)o(haracters)j(\(ASCI)q(I)f(0{31)e(and)h(127{255)f(\(except)j(for)e +(EOL\(10\)\)\))h(whic)o(h)f(it)g(\015ags)g(as)g(errors)295 +2559 y(and)e(replaces)h(b)o(y)f(question)g(marks.)295 2627 +y Fo(Line)22 b(Lengths:)31 b Fr(The)21 b(third)g(c)o(hec)o(k)g(the)h(scanner) +g(mak)o(es)d(is)i(input)g(line)f(length.)38 b(When)295 2677 +y(F)m(unnelW)m(eb)18 b(starts)g(up,)h(a)e(default)h(maxim)n(um)c(input)j +(line)h(length)g(of)f(80)g(is)h(set.)31 b(This)17 b(can)295 +2727 y(b)q(e)22 b(c)o(hanged)f(dynamically)d(during)i(scanning)h(using)f(a)h +Fl(@p)g(maximum)p 1461 2727 14 2 v 14 w(input)p 1585 2727 V +15 w(line)p 1688 2727 V 15 w(length)295 2777 y Fr(pragma.)c(If)c(the)i(n)o +(um)o(b)q(er)e(of)g(c)o(haracters)j(on)e(a)f(line)h(\(not)g(including)f(the)h +(end)h(of)e(line)g(mark)o(er\))295 2827 y(exceeds)j(this)e(limit,)d(F)m +(unnelW)m(eb)i(generates)j(an)d(error.)1042 2940 y(71)p eop +%%Page: 72 73 +72 72 bop 177 42 a Fd(3.10.2)55 b(Sp)r(ecial)18 b(Sequences)177 +144 y Fr(The)11 b(scanner)g(scans)g(the)g(input)e(\014le)h(from)f(top)h(to)g +(b)q(ottom,)e(left)i(to)g(righ)o(t,)g(treating)g(the)h(input)f(as)g(ordinary) +f(text)177 194 y(\(to)14 b(b)q(e)g(handed)g(directly)f(to)h(the)g(parser)g +(as)g(a)f(text)h(tok)o(en\))g(unless)g(it)f(encoun)o(ters)i(the)f +Fo(sp)q(ecial)g(c)o(haracter)1931 179 y Fg(4)177 244 y Fr(whic)o(h)i(in)o +(tro)q(duces)h(a)f Fo(sp)q(ecial)h(sequence)p Fr(.)23 b(Th)o(us,)17 +b(the)f(scanner)i(partitions)d(the)i(input)f(\014le)g(in)o(to)f(ordinary)177 +293 y(text)g(and)e(sp)q(ecial)i(sequences.)177 411 y Fl(input_file)20 +b(=)h({ordinary_text)e(|)j(special_sequence})177 529 y Fr(Up)q(on)11 +b(startup,)g(the)g(sp)q(ecial)g(c)o(haracter)h(is)e Fl(@)p +Fr(,)h(but)g(it)f(can)g(b)q(e)i(c)o(hanged)e(using)h(the)g +Fn(<)p Fr(sp)q(ecial)p Fn(>)p Fl(=)p Fn(<)p Fr(new)p 1781 529 +13 2 v 16 w(sp)q(ecial)p Fn(>)177 579 y Fr(sp)q(ecial)k(sequence.)22 +b(Rather)15 b(than)g(using)f Fn(<)p Fr(sp)q(ecial)p Fn(>)i +Fr(whenev)o(er)g(the)f(sp)q(ecial)g(c)o(haracter)h(app)q(ears,)f(this)g(do)q +(c-)177 629 y(umen)o(t)j(uses)j(the)f(default)e(sp)q(ecial)i(c)o(haracter)g +(\\)p Fl(@)p Fr(")f(to)g(represen)o(t)i(the)f(curren)o(t)h(sp)q(ecial)e(c)o +(haracter.)35 b(More)177 679 y(imp)q(ortan)o(tly)m(,)13 b(F)m(unnelW)m(eb's)i +(error)h(messages)g(all)e(use)i(the)g(default)g(sp)q(ecial)f(c)o(haracter)i +(in)e(their)h(error)h(mes-)177 728 y(sages)e(ev)o(en)f(if)f(the)i(sp)q(ecial) +f(c)o(haracter)h(has)f(b)q(een)h(c)o(hanged.)177 804 y(An)i(o)q(ccurrence)i +(of)c(the)i(sp)q(ecial)g(c)o(haracter)g(in)f(the)h(input)f(\014le)g(in)o(tro) +q(duces)i(a)e(sp)q(ecial)g(sequence.)28 b(The)16 b(kind)177 +853 y(of)e(sp)q(ecial)g(sequence)i(is)e(determined)g(b)o(y)g(the)h(c)o +(haracter)h(follo)o(wing)11 b(the)k(sp)q(ecial)f(c)o(haracter.)20 +b(Only)14 b(prin)o(table)177 903 y(c)o(haracters)i(can)e(follo)o(w)e(the)i +(sp)q(ecial)g(c)o(haracter.)177 979 y(The)j(follo)o(wing)c(list)j(giv)o(es)g +(all)e(the)j(p)q(ossible)f(c)o(haracters)i(that)e(can)h(follo)o(w)d(the)i(sp) +q(ecial)h(c)o(haracter,)g(and)f(the)177 1028 y(legalit)o(y)c(of)g(eac)o(h)i +(sequence.)20 b(The)13 b(\014rst)h(column)e(giv)o(es)g(the)i(ASCI)q(I)f(n)o +(um)o(b)q(er)g(of)f(eac)o(h)i(ASCI)q(I)f(c)o(haracter.)19 b(The)177 +1078 y(second)12 b(column)e(giv)o(es)g(the)i(sp)q(ecial)f(sequence)i(for)e +(that)g(c)o(haracter.)19 b(The)11 b(next)h(column)d(con)o(tains)i(one)g(of)f +(three)177 1128 y(c)o(haracters:)25 b(\\)p Fl(-)p Fr(")16 b(means)g(that)h +(the)g(sequence)i(is)d(illegal.)24 b(\\)p Fl(S)p Fr(")16 b(indicates)h(that)g +(the)g(sequence)i(is)d(a)g Fo(simple)177 1178 y(sequence)i +Fr(\(with)i(no)f(attributes)h(or)g(side)f(e\013ects\))j(that)d(app)q(ears)i +(exactly)e(as)h(sho)o(wn)f(and)g(is)h(con)o(v)o(erted)177 1228 +y(directly)f(in)o(to)e(a)h(tok)o(en)h(and)f(fed)g(to)g(the)h(parser.)33 +b(Finally)m(,)17 b(\\)p Fl(C)p Fr(")g(indicates)i(that)f(the)h(sp)q(ecial)f +(sequence)j(is)177 1278 y(complex,)12 b(p)q(ossibly)i(ha)o(ving)f(a)g(follo)o +(wing)e(syn)o(tax)j(or)g(pro)q(ducing)g(funn)o(y)g(side)g(e\013ects.)177 +1395 y Fl(ASC)43 b(SEQ)g(COMMENT)177 1445 y(-----------------)177 +1495 y(000)152 b(\\)177 1545 y(016)174 b(|)21 b(Unprintable)f(characters)g +(and)h(hence)g(illegal)f(specials.)177 1595 y(031)152 b(/)177 +1644 y(032)43 b(@)87 b(-)22 b(Illegal)e(\(space\).)177 1694 +y(033)43 b(@!)65 b(C)22 b(Comment.)177 1744 y(034)43 b(@")65 +b(S)22 b(Parameter)e(delimeter.)177 1794 y(035)43 b(@#)65 b(C)22 +b(Short)e(name)h(sequence.)177 1844 y(036)43 b(@$)65 b(S)22 +b(Start)e(of)i(macro)f(definition.)177 1894 y(037)43 b(@\045)65 +b(-)22 b(Illegal.)177 1943 y(038)43 b(@&)65 b(-)22 b(Illegal.)177 +1993 y(039)43 b(@')65 b(-)22 b(Illegal.)177 2043 y(040)43 b(@\()65 +b(S)22 b(Open)f(parameter)f(list.)177 2093 y(041)43 b(@\))65 +b(S)22 b(Close)e(parameter)g(list.)177 2143 y(042)43 b(@*)65 +b(-)22 b(Illegal.)177 2192 y(043)43 b(@+)65 b(C)22 b(Insert)e(newline.)177 +2242 y(044)43 b(@,)65 b(S)22 b(Parameter)e(separator.)177 2292 +y(045)43 b(@-)65 b(C)22 b(Suppress)e(end)h(of)g(line)g(marker.)177 +2342 y(046)43 b(@.)65 b(-)22 b(Illegal.)177 2392 y(047)43 b(@/)65 +b(S)22 b(Open)f(or)g(close)g(emphasised)f(text.)177 2441 y(048)43 +b(@0)65 b(-)22 b(Illegal.)177 2491 y(049)43 b(@1)65 b(S)22 +b(Formal)e(parameter)g(1.)177 2541 y(050)43 b(@2)65 b(S)22 +b(Formal)e(parameter)g(2.)177 2591 y(051)43 b(@3)65 b(S)22 +b(Formal)e(parameter)g(3.)177 2641 y(052)43 b(@4)65 b(S)22 +b(Formal)e(parameter)g(4.)p 177 2678 709 2 v 223 2705 a Ff(4)241 +2716 y Fh(This)10 b(sort)g(of)h(c)o(haracter)d(is)j(often)e(referred)g(to)h +(as)h(the)f(\\escap)q(e)f(c)o(haracter")e(or)k(the)f(\\con)o(trol)e(c)o +(haracter")g(in)i(other)g(systems.)177 2756 y(Ho)o(w)o(ev)o(er,)15 +b(as)f(there)g(is)g(great)g(p)q(oten)o(tial)e(to)i(confuse)f(these)g(names)g +(with)i(the)e(\\escap)q(e")g(c)o(haracter)f(\(ASCI)q(I)i(27\))g(and)g(ASCI)q +(I)177 2795 y(\\con)o(trol")d(c)o(haracters,)g(the)h(term)g(\\sp)q(ecial")f +(has)i(b)q(een)f(c)o(hosen)g(instead.)18 b(This)c(results)e(in)g(the)h(terms) +f Fa(sp)n(e)n(cial)k(char)n(acter)f Fh(and)177 2835 y Fa(sp)n(e)n(cial)f(se)n +(quenc)n(e)p Fh(.)1042 2940 y Fr(72)p eop +%%Page: 73 74 +73 73 bop 177 42 a Fl(053)43 b(@5)65 b(S)22 b(Formal)e(parameter)g(5.)177 +91 y(054)43 b(@6)65 b(S)22 b(Formal)e(parameter)g(6.)177 141 +y(055)43 b(@7)65 b(S)22 b(Formal)e(parameter)g(7.)177 191 y(056)43 +b(@8)65 b(S)22 b(Formal)e(parameter)g(8.)177 241 y(057)43 b(@9)65 +b(S)22 b(Formal)e(parameter)g(9.)177 291 y(058)43 b(@:)65 b(-)22 +b(Illegal.)177 340 y(059)43 b(@;)65 b(-)22 b(Illegal.)177 390 +y(060)43 b(@<)65 b(S)22 b(Open)f(macro)f(name.)177 440 y(061)43 +b(@=)65 b(C)22 b(Set)f(special)f(character.)177 490 y(062)43 +b(@>)65 b(S)22 b(Close)e(macro)h(name.)177 540 y(063)43 b(@?)65 +b(-)22 b(Illegal.)e(Reserved)g(for)h(future)g(use.)177 589 +y(064)43 b(@@)65 b(C)22 b(Insert)e(special)h(character)f(into)g(text.)177 +639 y(065)43 b(@A)65 b(S)22 b(New)f(section)f(\(level)h(1\).)177 +689 y(066)43 b(@B)65 b(S)22 b(New)f(section)f(\(level)h(2\).)177 +739 y(067)43 b(@C)65 b(S)22 b(New)f(section)f(\(level)h(3\).)177 +789 y(068)43 b(@D)65 b(S)22 b(New)f(section)f(\(level)h(4\).)177 +839 y(069)43 b(@E)65 b(S)22 b(New)f(section)f(\(level)h(5\).)177 +888 y(070)43 b(@F)65 b(-)22 b(Illegal.)177 938 y(071)43 b(@G)65 +b(-)22 b(Illegal.)177 988 y(072)43 b(@H)65 b(-)22 b(Illegal.)177 +1038 y(073)43 b(@I)65 b(C)22 b(Include)e(file.)177 1088 y(074)43 +b(@J)65 b(-)22 b(Illegal.)177 1137 y(075)43 b(@K)65 b(-)22 +b(Illegal.)177 1187 y(076)43 b(@L)65 b(-)22 b(Illegal.)177 +1237 y(077)43 b(@M)65 b(S)22 b(Tag)f(macro)g(as)g(being)g(allowed)f(to)h(be)h +(called)e(many)h(times.)177 1287 y(078)43 b(@N)65 b(-)22 b(Illegal.)177 +1337 y(079)43 b(@O)65 b(S)22 b(New)f(macro)g(attached)f(to)h(product)f(file.) +h(Has)g(to)h(be)f(at)h(start)e(of)i(line.)177 1386 y(080)43 +b(@P)65 b(C)22 b(Pragma.)177 1436 y(081)43 b(@Q)65 b(-)22 b(Illegal.)177 +1486 y(082)43 b(@R)65 b(-)22 b(Illegal.)177 1536 y(083)43 b(@S)65 +b(-)22 b(Illegal.)177 1586 y(084)43 b(@T)65 b(C)22 b(Typesetter)d(directive.) +177 1636 y(085)43 b(@U)65 b(-)22 b(Illegal.)177 1685 y(086)43 +b(@V)65 b(-)22 b(Illegal.)177 1735 y(087)43 b(@W)65 b(-)22 +b(Illegal.)177 1785 y(088)43 b(@X)65 b(-)22 b(Illegal.)177 +1835 y(089)43 b(@Y)65 b(-)22 b(Illegal.)177 1885 y(090)43 b(@Z)65 +b(S)22 b(Tags)f(macro)f(as)i(being)f(allowed)f(to)h(be)h(called)e(zero)h +(times.)177 1934 y(091)43 b(@[)65 b(-)22 b(Illegal.)e(Reserved)g(for)h +(future)g(use.)177 1984 y(092)43 b(@\\)65 b(-)22 b(Illegal.)177 +2034 y(093)43 b(@])65 b(-)22 b(Illegal.)e(Reserved)g(for)h(future)g(use.)177 +2084 y(094)43 b(@^)65 b(C)22 b(Insert)e(control)h(character)f(into)g(text)177 +2134 y(095)43 b(@_)65 b(-)22 b(Illegal.)177 2183 y(096)43 b(@`)65 +b(-)22 b(Illegal.)177 2233 y(097)43 b(@a)65 b(\\)177 2283 y(109)43 +b(@m)87 b(|)21 b(Identical)f(to)i(@A..@Z.)177 2333 y(122)43 +b(@z)65 b(/)177 2383 y(123)43 b(@{)65 b(S)22 b(Open)f(macro)f(body/Open)g +(literal)h(directive.)177 2433 y(124)43 b(@|)65 b(-)22 b(Illegal.)177 +2482 y(125)43 b(@})65 b(S)22 b(Close)e(macro)h(body/Close)f(literal)g +(directive.)177 2532 y(126)43 b(@~)65 b(-)22 b(Illegal.)177 +2582 y(127)f(to)h(255)f(are)g(not)g(standard)f(printable)g(ASCII)h +(characters)f(and)h(are)g(illegal.)177 2685 y Fr(The)11 b(most)e(imp)q(ortan) +o(t)f(thing)i(to)g(remem)o(b)q(er)g(ab)q(out)g(the)h(scanner)g(is)f(that)h +Fm(nothing)h(happ)n(ens)h(unless)f(the)f(sp)n(e)n(cial)177 +2735 y(char)n(acter)17 b(is)g(se)n(en.)27 b Fr(There)18 b(are)e(no)h(funn)o +(y)f(sequences)j(that)e(will)e(cause)i(strange)h(things)e(to)h(happ)q(en.)26 +b(The)177 2785 y(b)q(est)16 b(w)o(a)o(y)e(to)g(view)h(a)f(F)m(unnelW)m(eb)g +(do)q(cumen)o(t)g(at)h(the)g(scanner)h(lev)o(el)e(is)g(as)h(a)f(b)q(o)q(dy)h +(of)f(text)h(punctuated)h(b)o(y)177 2835 y(sp)q(ecial)e(sequences)j(that)d +(serv)o(e)h(to)f(structure)i(the)e(text)h(at)e(a)h(higher)g(lev)o(el.)1042 +2940 y(73)p eop +%%Page: 74 75 +74 74 bop 177 42 a Fr(The)18 b(remaining)d(description)j(of)f(the)h(scanner)h +(consists)f(of)f(a)g(detailed)g(description)h(of)f(the)h(e\013ect)h(of)d(eac) +o(h)177 91 y(complex)d(sp)q(ecial)h(sequence.)177 243 y Fd(3.10.3)55 +b(Setting)18 b(the)g(Sp)r(ecial)g(Character)177 349 y Fr(The)e(sp)q(ecial)f +(c)o(haracter)h(can)f(b)q(e)h(set)f(using)g(the)h(sequence)h +Fn(<)p Fr(sp)q(ecial)p Fn(>)p Fl(=)p Fn(<)p Fr(newsp)q(ecialc)o(har)p +Fn(>)p Fr(.)23 b(F)m(or)15 b(example,)177 399 y Fl(@=#)e Fr(w)o(ould)g(c)o +(hange)i(the)f(sp)q(ecial)g(c)o(haracter)h(to)f(a)g(hash)g(\()p +Fl(#)p Fr(\))f(c)o(haracter.)20 b(The)14 b(sp)q(ecial)g(c)o(haracter)h(ma)o +(y)d(b)q(e)j(set)177 449 y(to)d(an)o(y)f(prin)o(table)g(ASCI)q(I)h(c)o +(haracter)h(except)g(the)g(blank)e(c)o(haracter)i(\(i.e.)e(an)o(y)g(c)o +(haracter)i(in)e(the)i(ASCI)q(I)f(range)177 498 y([33)p Fn(;)7 +b Fr(126]\).)15 b(In)d(normal)f(use,)i(it)f(should)g(not)g(b)q(e)h(necessary) +i(to)d(c)o(hange)h(the)g(sp)q(ecial)f(c)o(haracter)i(of)e(F)m(unnelW)m(eb,) +177 548 y(and)17 b(it)f(is)h(probably)f(b)q(est)i(to)e(a)o(v)o(oid)g(c)o +(hanging)g(the)h(sp)q(ecial)g(c)o(haracter)h(so)f(as)g(not)f(to)h(confuse)g +(F)m(unnelW)m(eb)177 598 y(readers)g(conditioned)f(to)f(the)i +Fl(@)e Fr(c)o(haracter.)25 b(Ho)o(w)o(ev)o(er,)16 b(the)h(feature)f(is)g(v)o +(ery)g(useful)f(where)i(the)g(text)f(b)q(eing)177 648 y(prepared)f(con)o +(tains)f(man)o(y)e Fl(@)i Fr(c)o(haracters)h(\(e.g.)f(a)f(list)h(of)f(in)o +(ternet)i(electronic)g(mail)c(addresses\).)177 799 y Fd(3.10.4)55 +b(Inserting)18 b(the)g(Sp)r(ecial)g(Character)h(in)n(to)f(the)g(T)-5 +b(ext)177 905 y Fr(The)13 b(sp)q(ecial)f(sequence)j Fn(<)p +Fr(sp)q(ecial)p Fn(>)p Fl(@)e Fr(inserts)g(the)g(sp)q(ecial)g(c)o(haracter)g +(in)o(to)f(the)h(text)f(as)h(if)e(it)h(w)o(ere)h(not)g(sp)q(ecial)177 +955 y(at)h(all.)k(The)c Fl(@)g Fr(of)f(this)i(sequence)h(has)e(nothing)g(to)f +(do)h(with)g(the)h(curren)o(t)g(sp)q(ecial)g(c)o(haracter.)20 +b(If)14 b(the)g(curren)o(t)177 1005 y(sp)q(ecial)e(c)o(haracter)h(is)e +Fl(P)h Fr(then)g(the)g(sequence)i Fl(P@)d Fr(will)f(insert)j(a)e +Fl(P)g Fr(in)o(to)g(the)h(text.)18 b(Example:)e Fl(@@#@=#@#@#=@@@)177 +1055 y Fr(translates)f(to)f Fl(@#@#@)p Fr(.)177 1206 y Fd(3.10.5)55 +b(Inserting)18 b(Arbitrary)g(Characters)h(in)n(to)g(the)f(T)-5 +b(ext)177 1313 y Fr(While)13 b(F)m(unnelW)m(eb)h(do)q(es)h(not)f(tolerate)g +(unprin)o(table)g(c)o(haracters)i(in)d(the)i(input)f(\014le)g(\(except)h(for) +f(the)h(end)f(of)177 1362 y(line)f(c)o(haracter\),)h(it)e(do)q(es)i(allo)o(w) +d(the)i(user)h(to)f(sp)q(ecify)h(that)e(unprin)o(table)h(c)o(haracters)i(app) +q(ear)e(in)f(the)i(pro)q(duct)177 1412 y(\014le.)k(The)c Fl(@^)f +Fr(sequence)j(inserts)f(a)e(single)g(c)o(haracter)i(of)e(the)i(user's)f(c)o +(ho)q(osing)g(in)o(to)f(the)h(text.)k(The)c(c)o(haracter)177 +1462 y(can)19 b(b)q(e)g(sp)q(eci\014ed)i(b)o(y)d(giving)f(its)i(ASCI)q(I)g(n) +o(um)o(b)q(er)f(in)g(one)h(of)f(four)h(bases:)28 b(binary)m(,)19 +b(o)q(ctal,)g(decimal,)f(and)177 1512 y(hexadecimal.)f(Here)e(is)f(the)g(syn) +o(tax:)177 1636 y Fl(control_sequence)19 b(=)i("@^")g(char_spec)177 +1686 y(char_spec)173 b(=)21 b(binary)g(|)g(octal)g(|)h(decimal)e(|)i +(hexadecimal)177 1736 y(binary)239 b(=)21 b(\("b")g(|)h("B"\))282 +b("\(")21 b({binary_digit}8)41 b("\)")177 1786 y(octal)261 +b(=)21 b(\("o")g(|)h("O")f(|)h("q")f(|)g("Q"\))g("\(")g({octal_digit}3)63 +b("\)")177 1835 y(decimal)217 b(=)21 b(\("d")g(|)h("D"\))282 +b("\(")21 b({decimal_digit}3)e("\)")177 1885 y(hexadecimal)129 +b(=)21 b(\("h")g(|)h("H")f(|)h("x")f(|)g("X"\))g("\(")g({hex_digit}2)107 +b("\)")177 1935 y(binary_digit)g(=)21 b("0")g(|)h("1")177 1985 +y(octal_digit)129 b(=)21 b(binary_digit)f(|)h("2")g(|)h("3")f(|)h("4")f(|)g +("5")h(|)f("6")g(|)h("7")177 2035 y(decimal_digit)85 b(=)21 +b(octal_digit)f(|)h("8")h(|)f("9")177 2085 y(hex_digit)173 +b(=)21 b(decimal_digit)e(|)j("A")f(|)h("B")f(|)g("C")h(|)f("D")g(|)h("E")f(|) +h("F")896 2134 y(|)g("a")f(|)h("b")f(|)g("c")h(|)f("d")g(|)h("e")f(|)h("f") +177 2259 y Fr(Example:)177 2383 y Fl(@!)g(Unix)f(Make)f(requires)h(that)g +(productions)e(commence)h(with)h(tab)g(characters.)177 2433 +y(@^D\(009\)prog.o)e(<-)i(prog.c)177 2557 y Fr(Note)16 b(that)g(the)g +(decimal)e(\\)p Fl(9)p Fr(")h(is)g(expressed)j(with)d(leading)g(zeros)i(as)e +(\\)p Fl(009)p Fr(".)22 b(F)m(unnelW)m(eb)15 b(requires)i(a)e(\014xed)177 +2607 y(n)o(um)o(b)q(er)e(of)g(digits)g(for)g(eac)o(h)h(base.)19 +b(Eigh)o(t)13 b(digits)g(for)g(base)h(t)o(w)o(o,)f(three)i(digits)e(for)g +(base)h(ten,)g(three)h(digits)e(for)177 2657 y(base)i(eigh)o(t)e(and)h(t)o(w) +o(o)f(digits)h(for)f(base)i(sixteen.)177 2735 y(F)m(unnelW)m(eb)h(treats)h +(the)g(c)o(haracter)g(resulting)f(from)e(a)i Fl(@^)g Fr(sequence)i(as)e +(ordinary)g(text)g(in)g(ev)o(ery)h(sense.)26 b(If)177 2785 +y(y)o(our)13 b(input)h(\014le)f(con)o(tains)h(man)o(y)d(instances)k(of)e(a)g +(particular)h(con)o(trol)f(c)o(haracter,)h(y)o(ou)g(can)f(pac)o(k)n(age)g(it) +h(up)f(in)177 2835 y(a)h(macro)e(lik)o(e)i(an)o(y)f(other)h(text.)19 +b(In)14 b(particular,)f(quic)o(k)h(names)f(can)h(b)q(e)g(used)h(to)f(great)g +(e\013ect:)1042 2940 y(74)p eop +%%Page: 75 76 +75 75 bop 177 42 a Fl(@!)22 b(Unix)f("Make")f(requires)g(that)h(productions)f +(commence)g(with)h(tab)g(characters.)177 91 y(@!)h(So)f(we)g(define)g(a)g +(macro)g(with)g(a)h(quick)f(name)f(as)i(a)f(tab)h(character.)177 +141 y($@#T@{@^D\(009\)@})177 191 y(@!)g(And)f(use)g(it)g(in)h(our)f +(productions.)177 241 y(@#Tprog.o)f(<-)h(prog.c)177 291 y(@#Ta.out)f(<-)i +(prog.o)177 399 y Fr(W)m(arning:)c(If)c(y)o(ou)f(insert)j(a)e(Unix)g(newline) +g(c)o(haracter)i(\(decimal)c(10\))i(in)o(to)g(the)h(text,)f(F)m(unnelW)m(eb)g +(will)f(treat)177 448 y(this)i(as)f(an)h(end)g(of)f(line)g(sequence)j +(regardless)f(of)e(what)g(the)h(c)o(haracter)h(sequence)h(for)d(end)h(of)f +(line)g(is)h(on)f(the)177 498 y(mac)o(hine)h(up)q(on)i(whic)o(h)f(it)h(is)f +(running.)26 b(Unix)16 b(EOL)h(is)f(F)m(unnelW)m(eb's)g(in)o(ternal)g +(represen)o(tation)i(for)e(end)h(of)177 548 y(line.)h(Th)o(us,)13 +b(in)h(the)g(curren)o(t)h(v)o(ersion)f(of)g(F)m(unnelW)m(eb,)e(inserting)i(c) +o(haracter)i(10)d(in)o(to)g(the)h(text)h(is)e(imp)q(ossible)177 +598 y(unless)h(this)f(also)f(happ)q(ens)i(to)f(b)q(e)h(the)f(c)o(haracter)h +(used)g(b)o(y)f(the)h(op)q(erating)e(system)h(to)g(mark)e(the)j(end)f(of)g +(line.)177 736 y Fd(3.10.6)55 b(Commen)n(ts)177 835 y Fr(When)17 +b(F)m(unnelW)m(eb)f(encoun)o(ters)i(the)g Fl(@!)26 b Fr(sequence)18 +b(during)f(its)f(left-to-righ)o(t)g(scan)h(of)f(the)h(line,)f(it)g(thro)o(ws) +177 885 y(a)o(w)o(a)o(y)c(the)i(rest)h(of)e(the)h(line)f(\(including)f(the)i +(EOL\))g(without)f(analysing)f(it)h(further.)19 b(Commen)o(ts)11 +b(can)i(app)q(ear)177 934 y(in)h(an)o(y)f(line)g(except)j(\\)p +Fl(@i)p Fr(",)c(\\)p Fl(@t)p Fr(",)h(and)g(\\)p Fl(@p)p Fr(")g(lines.)177 +1007 y(F)m(unnelW)m(eb)f(commen)o(ts)f(can)i(b)q(e)g(used)h(to)e(insert)i +(commen)o(ts)d(in)o(to)g(y)o(our)i(input)f(\014le)h(that)g(will)e(neither)i +(app)q(ear)177 1057 y(in)f(the)h(pro)q(duct)g(\014les)f(nor)g(in)g(the)h(do)q +(cumen)o(tation)e(\014le,)h(but)g(will)f(b)q(e)i(solely)e(for)h(the)h(b)q +(ene\014t)g(of)f(those)h(reading)177 1106 y(and)h(editing)f(the)i(input)e +(\014le)h(directly)m(.)k(Example:)177 1215 y Fl(@!)k(I)f(have)g(used)g(a)h +(quick)e(macro)h(for)g(this)g(definition)f(as)h(it)h(will)f(be)g(used)g +(often.)177 1264 y(@$@#C@{--@})177 1372 y Fr(Because)d(commen)o(ts)d(are)i +(de\014ned)g(to)g(include)f(the)h(end-of-line)f(mark)o(er,)f(care)i(m)o(ust)f +(b)q(e)h(tak)o(en)f(when)h(they)177 1422 y(are)d(b)q(eing)g(added)h(or)e +(remo)o(v)o(ed)g(within)h(the)g(text)h(of)e(macro)f(b)q(o)q(dies.)19 +b(F)m(or)13 b(example)g(the)i(text)f(fragmen)o(t)177 1530 y +Fl(for)21 b(\(i=0;i<MAXVAL;i++\))127 b(@!)22 b(Print)f(out)g(a[0..MAXVAL-1].) +243 1580 y(printf\("\045u\\n",a)o([i]\);)177 1688 y Fr(will)13 +b(expand)h(to)177 1796 y Fl(for)21 b(\(i=0;i<MAXVAL;i++\))193 +b(printf\("\045u\\n",a[)o(i]\);)177 1904 y Fr(This)19 b(problem)f(really)g +(has)i(no)e(solution;)j(if)d(F)m(unnelW)m(eb)h(commen)o(ts)e(w)o(ere)j +(de\014ned)g(to)f(omit)e(the)j(end)f(of)177 1954 y(line)14 +b(mark)o(er,)g(the)h(expanded)h(text)f(w)o(ould)f(con)o(tain)g(trailing)f +(blanks!)20 b(As)c(it)e(is,)g(F)m(unnelW)m(eb)g(commen)o(ts)f(are)177 +2004 y(designed)18 b(to)f(supp)q(ort)h(single)f(line)g(commen)o(ts)f(whic)o +(h)h(can)g(b)q(e)h(inserted)h(and)e(remo)o(v)o(ed)f(as)h(a)g(line)g(without) +177 2054 y(causing)d(trouble.)k(F)m(or)c(example:)177 2162 +y Fl(@!)22 b(Print)e(out)h(a[0..MAXVAL-1].)177 2212 y(for)g +(\(i=0;i<MAXVAL;i++\))243 2261 y(printf\("\045u\\n",a)o([i]\);)177 +2369 y Fr(If)13 b(y)o(ou)g(w)o(an)o(t)g(a)g(commen)o(t)f(construct)j(that)e +(do)q(es)h(not)g(enclose)g(the)g(end)g(of)f(line)g(mark)o(er,)f(com)o(bine)g +(the)i(insert)177 2419 y(end)h(of)e(line)g(construct)j Fl(@+)d +Fr(with)h(the)g(commen)o(t)e(construct)k Fl(@!)i Fr(as)c(in)177 +2527 y Fl(for)21 b(\(i=0;i<MAXVAL;i++\))127 b(@+@!)21 b(Print)g(out)g +(a[0..MAXVAL-1].)243 2577 y(printf\("\045u\\n",a)o([i]\);)177 +2685 y Fr(F)m(unnelW)m(eb)d(commen)o(ts)f(should)h(really)g(only)g(b)q(e)h +(used)g(to)g(commen)o(t)d(the)j(F)m(unnelW)m(eb)f(constructs)j(b)q(eing)177 +2735 y(used)d(in)e(the)h(input)f(\014le.)26 b(Commen)o(ts)14 +b(on)j(the)g(target)g(co)q(de)g(are)g(b)q(est)h(placed)e(in)g(commen)o(ts)f +(in)h(the)h(target)177 2785 y(language)d(or)h(in)f(the)h(do)q(cumen)o(ting)f +(text)i(surrounding)f(the)g(macro)e(de\014nitions.)21 b(In)15 +b(the)g(example)f(ab)q(o)o(v)o(e,)g(a)177 2835 y(C)g(commen)o(t)e(w)o(ould)h +(ha)o(v)o(e)g(b)q(een)j(more)c(appropriate.)1042 2940 y(75)p +eop +%%Page: 76 77 +76 76 bop 177 42 a Fd(3.10.7)55 b(Quic)n(k)19 b(Names)177 148 +y Fr(F)m(unnelW)m(eb)13 b(pro)o(vides)g(a)f Fo(quic)o(k)i(name)e +Fr(syn)o(tax)h(as)g(an)g(alternativ)o(e,)f(for)h(macros)f(whose)h(name)f +(consists)i(of)e(a)177 198 y(single)f(c)o(haracter,)h(to)e(the)i(angle)e +(brac)o(k)o(et)h(syn)o(tax)g(usually)f(used)i(\(e.g.)e Fl(@<Sloth@>)p +Fr(\).)15 b(A)c(quic)o(k)f(name)g(sequence)177 248 y(consists)15 +b(of)e Fl(@#)p Fn(x)g Fr(where)j Fn(x)p Fr(,)d(the)h(name)f(of)g(the)i +(macro,)d(can)i(b)q(e)g(an)o(y)g(prin)o(table)f(c)o(haracter)j(except)f +(space.)177 374 y Fl(quick_name)20 b(=)h("@#")g(non_space_printable)177 +499 y Fr(The)14 b(result)g(is)f(iden)o(tical)f(to)h(the)h(equiv)n(alen)o(t)e +(ordinary)h(name)f(syn)o(tax,)h(but)g(is)g(shorter.)19 b(F)m(or)13 +b(example,)e Fl(@#X)i Fr(is)177 549 y(equiv)n(alen)o(t)i(to)h +Fl(@<X@>)p Fr(.)22 b(This)16 b(shorter)h(w)o(a)o(y)e(of)g(writing)g(one-c)o +(haracter)j(macro)c(names)h(is)h(more)e(con)o(v)o(enien)o(t)177 +599 y(where)g(a)f(macro)f(m)o(ust)g(b)q(e)h(used)h(v)o(ery)f(often.)18 +b(F)m(or)12 b(example,)g(the)h(macro)f(calls)h(in)f(the)i(follo)o(wing)c +(fragmen)o(t)h(of)177 649 y(an)j(Ada)g(program)e(are)i(a)g(little)f(clumsy)m +(.)177 775 y Fl(@!)22 b(Define)e(@<D@>)h(as)g("")h(to)f(turn)g(on)g(debug)g +(code)g(and)g("--")g(to)h(turn)f(it)g(off.)177 824 y(@$@<D@>@{--@})177 +874 y(@<D@>assert\(b>3\);)177 924 y(@<D@>if)g(x>7)g(then)g(write\("error"\))e +(end)i(if)177 1050 y Fr(The)14 b(calls)g(can)g(b)q(e)h(shortened)g(using)f +(the)g(alternativ)o(e)g(syn)o(tax.)177 1175 y Fl(@!)22 b(Define)e(@#|)h(as)h +("")f(to)g(turn)g(on)h(debug)f(code)f(and)i("--")f(to)g(turn)g(it)g(off.)177 +1225 y(@$@#|@{--@})177 1275 y(@#|assert\(b>3\);)177 1325 y(@#|if)g(x>7)g +(then)g(write\("error"\))e(end)i(if)177 1478 y Fd(3.10.8)55 +b(Inserting)18 b(End)h(of)g(Line)e(Mark)n(ers)177 1585 y Fr(An)11 +b(end)g(of)f(line)g(mark)o(er/c)o(haracter)h(can)g(b)q(e)g(inserted)h(in)o +(to)e(the)h(text)h(using)e(the)h Fl(@+)g Fr(sequence.)19 b(This)10 +b(is)h(exactly)177 1635 y(equiv)n(alen)o(t)k(to)h(a)g(real)g(end)g(of)g(line) +f(in)h(the)g(text)h(at)e(the)i(p)q(oin)o(t)e(where)j(it)d(o)q(ccurs.)26 +b(While)15 b(this)h(feature)h(ma)o(y)177 1684 y(sound)12 b(rather)h(useless,) +h(it)d(is)h(v)o(ery)h(useful)f(for)g(la)o(ying)e(out)i(the)g(input)g(\014le.) +18 b(F)m(or)11 b(example,)g(the)i(follo)o(wing)c(input)177 +1734 y(data)14 b(for)f(a)h(database)g(program)177 1860 y Fl(Animal)21 +b(=)g(Kangaroo)177 1910 y(Size)65 b(=)21 b(Medium)177 1959 +y(Speed)43 b(=)21 b(Fast)177 2059 y(Animal)g(=)g(Sloth)177 +2109 y(Size)65 b(=)21 b(Medium)177 2159 y(Speed)43 b(=)21 b(Slow)177 +2258 y(Animal)g(=)g(Walrus)177 2308 y(Size)65 b(=)21 b(Big)177 +2358 y(Speed)43 b(=)21 b(Medium)177 2484 y Fr(can)14 b(b)q(e)h(con)o(v)o +(erted)g(in)o(to)177 2609 y Fl(Animal)21 b(=)g(Kangaroo)42 +b(@+Size)21 b(=)g(Medium)43 b(@+Speed)20 b(=)i(Fast)86 b(@+)177 +2659 y(Animal)21 b(=)g(Sloth)108 b(@+Size)21 b(=)g(Medium)43 +b(@+Speed)20 b(=)i(Slow)86 b(@+)177 2709 y(Animal)21 b(=)g(Walrus)86 +b(@+Size)21 b(=)g(Big)109 b(@+Speed)20 b(=)i(Medium)42 b(@+)177 +2835 y Fr(whic)o(h)14 b(is)g(easier)g(to)g(read,)g(and)g(more)f(easily)g +(allo)o(ws)g(comparisons)f(b)q(et)o(w)o(een)k(records.)1042 +2940 y(76)p eop +%%Page: 77 78 +77 77 bop 177 42 a Fd(3.10.9)55 b(Suppressing)19 b(End)g(of)g(Line)e(Mark)n +(ers)177 137 y Fr(End)e(of)g(line)f(mark)o(ers)h(can)g(b)q(e)g(suppressed)j +(b)o(y)c(the)i Fl(@-)e Fr(sequence.)24 b(A)15 b(single)f(o)q(ccurrence)k(of)c +(a)h Fl(@-)g Fr(sequence)177 187 y(serv)o(es)20 b(to)e(suppress)i(only)e(the) +g(end)h(of)f(line)f(mark)o(er)h(follo)o(wing)d(it)j(and)g(m)o(ust)f(app)q +(ear)i Fm(exactly)f Fr(b)q(efore)h(the)177 237 y(end)e(of)f(line)h(mark)o(er) +e(to)i(b)q(e)g(suppressed.)29 b(No)17 b(trailing)e(spaces,)j +Fl(@!)27 b Fr(commen)o(ts,)15 b(or)h(an)o(y)h(other)g(c)o(haracters)177 +287 y(are)e(p)q(ermitted)g(b)q(et)o(w)o(een)h(a)e Fl(@-)g Fr(sequence)j(and)d +(the)h(end)g(of)f(line)g(that)h(it)f(is)h(supp)q(osed)h(to)e(suppress.)22 +b(The)15 b Fl(@-)177 337 y Fr(sequence)i(is)d(useful)g(for)g(constructing)h +(long)f(output)g(lines)g(without)g(them)g(ha)o(ving)f(to)h(app)q(ear)h(in)f +(the)g(input.)177 386 y(It)e(can)h(also)e(b)q(e)i(used)g(in)e(the)i(same)e(w) +o(a)o(y)h(as)g(the)g Fl(@+)g Fr(w)o(as)g(used)h(in)f(the)g(previous)h +(section)g(to)f(assist)g(in)g(exp)q(osing)177 436 y(the)17 +b(structure)i(of)c(output)i(text)g(without)e(a\013ecting)i(the)g(output)f +(text)h(itself.)25 b(Finally)m(,)15 b(it)h(is)g(in)o(v)n(aluable)e(for)177 +486 y(suppressing)h(the)g(EOL)f(after)g(the)h(op)q(ening)e(macro)g(text)i +Fl(@)p Fq(f)e Fr(construct.)20 b(F)m(or)13 b(example:)177 583 +y Fl(@$@<Walrus@>@{@-)177 633 y(I)22 b(am)f(the)g(walrus!@})177 +729 y Fr(is)14 b(equiv)n(alen)o(t)f(to)177 826 y Fl(@$@<Walrus@>@{I)19 +b(am)i(the)g(walrus!@})177 922 y Fr(The)14 b(commen)o(t)d(construct)k(\()p +Fl(@!)p Fr(\))j(can)13 b(also)g(b)q(e)g(used)h(to)f(suppress)i(end)f(of)f +(lines.)k(Ho)o(w)o(ev)o(er,)d(the)f Fl(@-)g Fr(construct)177 +972 y(should)i(b)q(e)g(preferred)i(for)d(this)h(purp)q(ose)h(as)e(it)h(mak)o +(es)e(explicit)i(the)g(programmer's)d(in)o(ten)o(t)j(to)f(suppress)j(the)177 +1022 y(end)e(of)e(line.)177 1155 y Fd(3.10.10)55 b(Include)18 +b(Files)177 1251 y Fr(F)m(unnelW)m(eb)12 b(pro)o(vides)h(an)g(include)g +(\014le)f(facilit)o(y)f(with)i(a)f(maxim)o(um)c(depth)13 b(of)f(10.)18 +b(When)13 b(F)m(unnelW)m(eb)f(sees)i(a)177 1301 y(line)g(of)f(the)i(form)d +Fl(@i)21 b(<filename>)p Fr(,)12 b(it)i(replaces)h(the)g(en)o(tire)f(line)g +(\(including)f(the)i(EOL\))f(with)g(the)h(con)o(ten)o(ts)177 +1350 y(of)c(the)h(sp)q(eci\014ed)h(include)f(\014le.)17 b(F)m(unnelW)m(eb's) +11 b(include)g(\014le)h(facilit)o(y)e(is)h(in)o(tended)h(to)g(op)q(erate)g +(at)f(the)i(line)e(lev)o(el.)177 1400 y(If)k(the)h(last)f(line)g(of)f(the)i +(include)g(\014le)f(is)g(not)g(terminated)g(b)o(y)g(an)g(EOL,)g(F)m(unnelW)m +(eb)g(issues)h(a)f(w)o(arning)g(and)177 1450 y(in)o(terts)g(one)f(\(in)f(the) +i(cop)o(y)f(in)f(memory\).)177 1519 y(The)g Fl(@i)g Fr(construct)h(is)f +(illegal)e(if)h(it)g(app)q(ears)i(an)o(ywhere)f(except)i(at)d(the)i(start)f +(of)f(a)h(line.)k(The)c(construct)i(m)o(ust)177 1569 y(b)q(e)e(follo)o(w)o +(ed)e(b)o(y)h(a)g(single)g(blank.)17 b(The)c(\014le)f(name)f(is)h(de\014ned)i +(to)e(b)q(e)h(ev)o(erything)g(b)q(et)o(w)o(een)g(the)g(blank)f(and)g(the)177 +1619 y(end)j(of)e(the)h(line)g(\(no)g(commen)o(ts)e(\()p Fl(@!)p +Fr(\))18 b(please!\).)g(Example:)f(If)c(the)i(input)e(\014le)h(is)177 +1715 y Fl("Uh)21 b(Oh,)h(It's)e(the)i(Fuzz.)e(We're)h(busted!")f(said)h(Baby) +g(Bear.)177 1765 y(@i)h(mr_plod.txt)177 1815 y("Quick!)f(Flush)f(the)h(stash) +g(down)g(the)g(dunny)g(and)g(let's)g(split.")f(said)h(Father)g(Bear.)177 +1912 y Fr(and)14 b(there)h(is)f(a)f(\014le)h(called)g Fl(mr)p +672 1912 14 2 v 15 w(plod.txt)e Fr(con)o(taining)177 2008 y +Fl("'Ello,)21 b('Ello,)f('Ello!)h(What's)f(all)h(this)g('ere)g(then?")g(Mr)g +(Plod)g(exclaimed.)177 2105 y Fr(then)15 b(the)f(scanner)h(translates)g(the)g +(input)e(\014le)h(in)o(to)177 2201 y Fl("Uh)21 b(Oh,)h(It's)e(the)i(Fuzz.)e +(We're)h(busted!")f(said)h(Baby)g(Bear.)177 2251 y("'Ello,)g('Ello,)f('Ello!) +h(What's)f(all)h(this)g('ere)g(then?")g(Mr)g(Plod)g(exclaimed.)177 +2301 y("Quick!)g(Flush)f(the)h(stash)g(down)g(the)g(dunny)g(and)g(let's)g +(split.")f(said)h(Father)g(Bear.)177 2398 y Fr(As)14 b(a)g(p)q(oin)o(t)f(of)g +(terminology)m(,)d(F)m(unnelW)m(eb)k(calls)f(the)h(original)e(input)i(\014le) +f(the)i Fo(input)e(\014le)f Fr(and)h(calls)h(include)177 2447 +y(\014les)g(and)g(their)g(included)g(\014les)h Fo(include)e(\014les)p +Fr(.)177 2516 y(The)g(include)f(\014le)g(construct)i(op)q(erates)g(at)e(a)g +(v)o(ery)g(lo)o(w)g(lev)o(el.)17 b(An)12 b(include)h(line)e(can)i(app)q(ear)f +(an)o(ywhere)h(in)f(the)177 2566 y(input)i(\014le)g(regardless)h(of)e(the)i +(con)o(text)f(of)f(the)i(surrounding)f(lines.)177 2635 y(F)m(unnelW)m(eb)d +(sets)i(the)g(sp)q(ecial)f(c)o(haracter)h(to)e(the)i(default)e(\()p +Fl(@)p Fr(\))h(at)g(the)g(start)g(of)f(eac)o(h)i(include)e(\014le)h(and)g +(restores)177 2685 y(it)h(to)g(its)f(previous)i(v)n(alue)e(at)h(the)g(end)h +(of)e(the)i(include)f(\014le.)k(This)c(allo)o(ws)f(macro)g(libraries)g(to)h +(b)q(e)h(constructed)177 2735 y(and)e(included)f(that)h(are)g(indep)q(enden)o +(t)h(of)e(the)h(prev)n(ailing)e(sp)q(ecial)h(c)o(haracter)i(at)f(the)g(p)q +(oin)o(t)f(of)g(inclusion.)16 b(The)177 2785 y(same)g(go)q(es)h(for)f(the)h +(input)f(line)g(length)g(limit)e(whic)o(h)i(is)h(reset)h(to)e(the)h(default)f +(v)n(alue)g(at)g(the)h(start)g(of)f(eac)o(h)177 2835 y(include)e(\014le)g +(and)g(restored)h(to)f(its)g(previous)g(v)n(alue)f(afterw)o(ards.)1042 +2940 y(77)p eop +%%Page: 78 79 +78 78 bop 177 42 a Fd(3.10.11)55 b(Pragmas)177 143 y Fr(Most)19 +b(to)q(ols)g(ha)o(v)o(e)f(to)h(supp)q(ort)g(some)f(essen)o(tial,)i(but)f +(rather)h(inelegan)o(t)e(features.)33 b(In)19 b(F)m(unnelW)m(eb)f(these)177 +193 y(messy)c(bits)g(ha)o(v)o(e)f(all)g(b)q(een)i(stu\013ed)g(in)o(to)e(the)i +(scanner's)g Fo(pragma)e Fr(\(for)h Fm(pr)n(agma)p Fr(tic\))g(construct.)177 +268 y(A)h(pragma)e(consists)j(of)e(a)h(single)f(line)g(of)g(input)h +(\(including)f(the)h(EOL\))h(commencing)c(with)j Fl(@p)p Fr(.)20 +b(This)15 b(m)o(ust)177 318 y(b)q(e)g(follo)o(w)o(ed)e(b)o(y)h(a)g(single)g +(space,)g(and)g(then)h(the)g(pragma)e(v)o(erb.)19 b(This)14 +b(m)o(ust)g(b)q(e)g(follo)o(w)o(ed)f(b)o(y)h(a)g(sequence)i(of)177 +368 y(zero)f(or)f(more)f(argumen)o(ts)g(separated)i(b)o(y)f(one)g(or)g(more)e +(spaces.)20 b(F)m(our)13 b(pragmas)g(are)h(a)o(v)n(ailable)177 +485 y Fl(pragma)21 b(=)g(pragma_ident)f(|)h(pragma_mill)f(|)h(pragma_moll)f +(|)h(pragma_typesetter)177 602 y Fr(The)14 b(follo)o(wing)e(syn)o(tax)i +(de\014nitions)f(assist)i(in)e(de\014ning)h(the)h(pragmas.)177 +719 y Fl(s)174 b(=)22 b({")f("}+)177 768 y(ps)152 b(=)22 b(\("@p")f(|)g +("@P"\))g(")h(")177 818 y(number)64 b(=)22 b({)f(decimal_digit)f(}+)177 +868 y(numorinf)g(=)i(number)e(|)i("infinity")177 985 y Fr(The)14 +b(argumen)o(ts)g(to)f(pragmas)g(are)h(case-sensitiv)o(e)h(and)f(m)o(ust)f(b)q +(e)h(sp)q(eci\014ed)i(in)d(lo)o(w)o(er)h(case.)177 1060 y(Pragmas)f(are)h +(pro)q(cessed)i(and)d(consumed)h(en)o(tirely)g(b)o(y)f(the)i(scanner.)k(The) +14 b(parser)h(nev)o(er)g(sees)g(them)e(and)h(so)177 1110 y(they)i(can)f(pla)o +(y)f(no)h(part)h(in)e(the)i(parser)g(lev)o(el)f(syn)o(tax.)22 +b(As)15 b(a)g(result,)h(pragma)d(lines)i(can)g(app)q(ear)h(an)o(ywhere)177 +1160 y(in)g(the)g(en)o(tire)g(input)g(\014le)g(regardless)h(of)e(the)h +(surrounding)g(con)o(text)h(\(e.g.)e(ev)o(en)i(in)e(the)h(middle)e(of)h(a)h +(macro)177 1209 y(de\014nition\).)i(The)c(sole)g(e\013ect)i(of)d(a)h(pragma)e +(is)h(to)h(mo)q(dify)e(some)h(in)o(ternal)g(parameter)h(of)f(F)m(unnelW)m +(eb.)177 1284 y(The)h(follo)o(wing)e(sections)j(describ)q(e)g(the)g(four)e(F) +m(unnelW)m(eb)h(pragmas.)177 1418 y Fo(3.10.11.1)48 b(Inden)o(tation)177 +1520 y Fr(When)18 b(F)m(unnelW)m(eb)g(expands)g(a)g(macro,)f(it)g(can)h(do)g +(so)g(in)f(t)o(w)o(o)h(w)o(a)o(ys.)29 b(First)18 b(it)g(can)g(treat)h(the)f +(text)g(it)g(is)177 1570 y(pro)q(cessing)e(as)e(a)g(one-dimensional)e(stream) +i(of)g(text,)h(and)f(merely)f(insert)i(the)g(b)q(o)q(dy)g(of)f(the)h(macro)e +(in)h(place)177 1620 y(of)d(the)g(macro)f(call.)17 b(Second,)12 +b(it)e(can)i(treat)g(the)f(text)h(of)f(the)g(macro)f(as)h(a)g(t)o(w)o(o)g +(dimensional)e(ob)r(ject)j(and)f(inden)o(t)177 1670 y(eac)o(h)k(line)f(of)g +(the)h(macro)f(b)q(o)q(dy)g(b)o(y)g(the)i(amoun)o(t)c(that)j(the)g(macro)e +(call)h(itself)g(w)o(as)h(inden)o(ted.)20 b(Consider)15 b(the)177 +1719 y(follo)o(wing)c(macros.)177 1836 y Fl(@$@<Loop)20 b(Structure@>@{@-)177 +1886 y(i=1;)177 1936 y(while)h(\(i<=N\))243 1986 y(@<Loop)f(body@>)177 +2036 y(endwhile)177 2085 y(@})177 2185 y(@$@<Loop)g(body@>@{@-)177 +2235 y(a[i]:=0;)177 2285 y(i:=i+1;@})177 2402 y Fr(Under)15 +b(the)f(regime)f(of)h Fo(no)h(inden)o(tati)o(on)10 b Fr(the)15 +b(lo)q(op)e(structure)j(macro)c(expands)j(to:)177 2518 y Fl(i=1;)177 +2568 y(while)21 b(\(i<=N\))243 2618 y(a[i]:=0;)177 2668 y(i:=i+1;)177 +2718 y(endwhile)177 2835 y Fr(Under)15 b(the)f(regime)f(of)h +Fo(blank)g(inden)o(tati)o(on)c Fr(the)15 b(lo)q(op)e(structure)j(macro)d +(expands)h(to:)1042 2940 y(78)p eop +%%Page: 79 80 +79 79 bop 177 42 a Fl(i=1;)177 91 y(while)21 b(\(i<=N\))243 +141 y(a[i]:=0;)243 191 y(i:=i+1;)177 241 y(endwhile)177 363 +y Fr(The)11 b Fl(indentation)d Fr(pragma)h(determines)h(whic)o(h)h(of)f +(these)i(t)o(w)o(o)d(regimes)h(will)f(b)q(e)i(used)h(to)e(expand)h(the)g +(macros)177 413 y(when)k(constructing)f(the)h(pro)q(duct)g(\014les.)j(The)c +(syn)o(tax)g(of)g(the)g(pragma)e(is:)177 535 y Fl(pragma_ident)19 +b(=)j(ps)f("indentation")f(s)h("=")g(s)h(\("blank")e(|)i("none"\))177 +658 y Fr(Its)15 b(t)o(w)o(o)e(forms)f(lo)q(ok)h(lik)o(e)g(this:)177 +780 y Fl(@p)22 b(indentation)d(=)j(blank)177 830 y(@p)g(indentation)d(=)j +(none)177 952 y Fr(In)13 b(the)h(curren)o(t)h(v)o(ersion)f(of)e(F)m(unnelW)m +(eb,)h(the)h(inden)o(tation)e(regime)g(is)i(an)f(attribute)g(that)h(is)f +(attac)o(hed)h(to)f(an)177 1002 y(en)o(tire)g(run)g(of)e(T)m(angle;)h(it)g +(is)g(not)g(p)q(ossible)h(to)f(bind)g(it)g(to)g(particular)g(pro)q(duct)h +(\014les)g(or)f(to)g(particular)g(macros.)177 1052 y(As)h(a)e(result,)i(it)e +(do)q(esn't)i(matter)e(where)i(inden)o(tation)f(pragmas)e(o)q(ccur)j(in)f +(the)g(input)g(\014le)g(or)g(ho)o(w)f(man)o(y)f(there)177 1102 +y(are)k(so)g(long)f(as)h(they)h(are)f(all)f(the)h(same.)j(By)d(default)g(F)m +(unnelW)m(eb)f(uses)i(blank)f(inden)o(tation.)177 1242 y Fo(3.10.11.2)48 +b(Maxim)o(um)15 b(Input)f(Line)g(Length)177 1348 y Fr(F)m(unnelW)m(eb)19 +b(generates)i(an)e(error)h(for)f(eac)o(h)h(input)f(line)g(that)g(exceeds)j(a) +d(certain)h(maxim)n(um)15 b(n)o(um)o(b)q(er)j(of)177 1397 y(c)o(haracters.)i +(A)o(t)13 b(the)h(start)g(of)f(the)h(pro)q(cessing)h(of)d(eac)o(h)i(input)f +(\014le)h(and)f(eac)o(h)h(include)f(\014le,)g(this)h(maxim)n(um)9 +b(is)177 1447 y(set)15 b(to)f(a)g(default)g(v)n(alue)g(of)f(80.)19 +b(Ho)o(w)o(ev)o(er,)14 b(the)h(maxim)n(um)10 b(can)15 b(b)q(e)g(c)o(hanged)f +(using)g(a)g(maxim)n(um)c(input)k(line)177 1497 y(length)g(pragma.)177 +1619 y Fl(pragma_mill)20 b(=)h(ps)h("maximum_input_l)o(ine_l)o(engt)o(h")d(s) +i("=")h(s)f(numorinf)177 1742 y Fr(The)15 b(maxim)n(um)10 b(input)k(line)f +(length)i(can)f(b)q(e)h(v)n(aried)f Fm(dynamic)n(al)r(ly)g +Fr(throughout)g(the)h(input)f(\014le.)19 b(Eac)o(h)14 b(maxi-)177 +1792 y(m)o(um)7 b(input)i(line)g(length)h(pragma's)e(scop)q(e)i(co)o(v)o(ers) +h(the)f(line)f(follo)o(wing)e(the)j(pragma)e(through)i(to)f(and)h(including) +177 1841 y(the)17 b(next)g(maxim)n(um)12 b(input)k(line)g(length)h(pragma,)d +(but)j(not)f(co)o(v)o(ering)g(an)o(y)g(in)o(terv)o(ening)g(include)h +(\014les.)26 b(A)o(t)177 1891 y(the)14 b(start)g(of)f(an)g(include)h(\014le,) +f(F)m(unnelW)m(eb)g(resets)i(the)f(maxim)o(um)9 b(input)k(line)g(length)g(to) +h(the)g(default)f(v)n(alue.)177 1941 y(It)h(restores)i(it)e(to)f(its)h +(previous)g(v)n(alue)g(at)f(the)i(end)f(of)g(the)g(include)g(\014le.)177 +2018 y(This)k(pragma)f(is)h(useful)g(for)g(detecting)i(text)f(that)f(has)h +(stra)o(y)o(ed)g(o\013)f(the)h(righ)o(t)f(side)g(of)g(the)h(screen)h(when)177 +2068 y(editing.)25 b(If)16 b(y)o(ou)f(use)i(F)m(unnelW)m(eb,)f(and)g(set)i +(the)e(maxim)o(um)c(input)k(line)f(length)i(to)f(b)q(e)h(the)f(width)g(of)g +(y)o(our)177 2118 y(editing)g(windo)o(w,)g(y)o(ou)g(will)e(nev)o(er)k(b)q(e)f +(caugh)o(t)f(b)o(y)m(,)g(for)g(example,)f(o\013-screen)j(op)q(ening)e(commen) +o(t)f(sym)o(b)q(ols.)177 2168 y(Y)m(ou)d(can)g(also)f(b)q(e)i(sure)g(that)f +(y)o(our)g(source)h(text)f(can)h(b)q(e)f(prin)o(ted)h(ra)o(w,)e(if)g +(necessary)m(,)j(without)d(lines)h(wrapping)177 2218 y(around.)177 +2358 y Fo(3.10.11.3)48 b(Maxim)o(um)15 b(Output)e(File)h(Line)h(Length)177 +2463 y Fr(As)e(w)o(ell)e(as)i(k)o(eeping)f(an)g(ey)o(e)h(on)f(input)g(line)g +(lengths,)g(F)m(unnelW)m(eb)g(also)g(k)o(eeps)h(an)f(ey)o(e)h(on)f(the)h +(line)f(lengths)g(of)177 2513 y(pro)q(duct)f(\014les)f(and)g(\015ags)g(all)f +(lines)h(longer)g(than)g(a)f(certain)i(limit)c(with)j(error)h(messages.)17 +b(Unlik)o(e)9 b(the)i(maxim)n(um)177 2563 y(input)17 b(line)f(length,)h(whic) +o(h)g(can)g(v)n(ary)f(dynamically)e(throughout)j(the)g(input)g(\014le,)g(the) +g(maxim)n(um)c(pro)q(duct)177 2613 y(\014le)18 b(line)e(length)i(remains)e +(\014xed)i(throughout)f(the)h(generation)g(of)f(all)f(the)i(pro)q(duct)g +(\014les.)29 b(The)18 b(maxim)n(um)177 2662 y(pro)q(duct)d(\014le)f(line)f +(length)h(pragma)d(allo)o(ws)i(this)h(v)n(alue)f(to)g(b)q(e)i(set.)k(If)13 +b(there)i(is)f(more)e(than)i(one)g(suc)o(h)h(pragma)177 2712 +y(in)f(an)f(input)h(\014le,)f(the)i(pragmas)d(m)o(ust)h(all)g(sp)q(ecify)h +(the)h(same)e(v)n(alue.)177 2835 y Fl(pragma_moll)20 b(=)h(ps)h +("maximum_output_)o(line_)o(leng)o(th")d(s)i("=")g(s)h(numorinf)1042 +2940 y Fr(79)p eop +%%Page: 80 81 +80 80 bop 177 42 a Fr(The)14 b(default)g(v)n(alue)f(is)h(80)f(c)o(haracters.) +177 126 y(This)h(pragma)f(is)h(only)f(one)i(of)f(t)o(w)o(o)f(constrain)o(ts)i +(on)f(the)h(length)f(of)g(the)h(lines)f(of)g(the)h(pro)q(duct)g(\014les.)20 +b(The)14 b Fl(+W)177 176 y Fr(command)e(line)j(option)f(also)g(con)o +(tributes.)22 b(The)15 b(actual)f(v)n(alue)h(that)f(F)m(unnelW)m(eb)h(uses)h +(is)e(the)i(minim)n(um)10 b(of)177 226 y(the)15 b(limits)c(sp)q(eci\014ed)16 +b(in)d(the)i(command)c(line)i(and)h(pragmas.)177 310 y(F)m(unnelW)m(eb)i(do)q +(es)h(not)f(monitor)e(the)j(length)f(of)g(the)h(lines)f(of)f(its)h(other)h +(output)g(\014les)f(\(journal)g(\014le,)g(listing)177 360 y(\014le,)e(do)q +(cumen)o(tation)e(\014le\).)177 524 y Fo(3.10.11.4)48 b(T)o(yp)q(esetter)177 +639 y Fr(The)22 b Fl(typesetter)d Fr(pragma)g(allo)o(ws)h(the)i(user)h(to)e +(sp)q(ecify)h(whether)g(the)g(input)f(\014le)g(is)g(supp)q(osed)i(to)e(b)q(e) +177 689 y(t)o(yp)q(esetter-indep)q(ende)q(n)o(t,)15 b(or)c(whether)j(it)d +(con)o(tains)h(commands)d(in)j(a)f(particular)h(t)o(yp)q(esetter)i(language.) +i(The)177 739 y(pragma)c(has)i(the)h(follo)o(wing)c(syn)o(tax.)177 +879 y Fl(pragma_typesetter)18 b(=)k(ps)f("typesetter")f(s)h("=")g(s)h +(\("none")e(|)i("tex"\))177 1020 y Fr(The)14 b(t)o(w)o(o)g(forms)e(of)i(the)g +(pragma)e(lo)q(ok)h(lik)o(e)g(this.)177 1161 y Fl(@)22 b(typesetter)d(=)j +(none)177 1210 y(@)g(typesetter)d(=)j(tex)177 1351 y Fr(A)17 +b(source)h(\014le)f(can)g(con)o(tain)f(more)g(than)h(one)g(t)o(yp)q(esetter)i +(pragma,)c(but)i(they)h(m)o(ust)d(all)h(sp)q(ecify)h(the)h(same)177 +1401 y(v)n(alue.)g(The)c(default)f(is)h Fl(none)p Fr(.)j(The)e(t)o(yp)q +(esetter)h(setting)e(a\013ects)h(t)o(w)o(o)f(things:)295 1485 +y Fo(Handling)k(of)h(free)f(text:)25 b Fr(If)17 b(the)g(t)o(yp)q(esetter)j +(is)d(not)g Fl(none)p Fr(,)g(W)m(ea)o(v)o(e)f(writes)i(the)g(free)g(text)295 +1535 y Fm(dir)n(e)n(ctly)c Fr(to)i(the)g(do)q(cumen)o(tation)e(\014le)h +(without)g(c)o(hanging)g(it)f(whatso)q(ev)o(er.)24 b(This)15 +b(means)g(that)295 1585 y(if)d(\(sa)o(y\))g Fl(\\centerline)e +Fr(app)q(ears)j(in)f(the)h(input)f(\014le,)g(it)g(will)f(copied)i(directly)f +(to)g(the)h(do)q(cumen-)295 1635 y(tation)k(\014le.)27 b(If)17 +b(the)h(t)o(yp)q(esetter)h(is)e Fl(none)p Fr(,)f(W)m(ea)o(v)o(e)h(in)o +(tercepts)i(an)o(y)d(c)o(haracters)j(or)e(sequences)295 1685 +y(that)g(migh)o(t)d(ha)o(v)o(e)i(a)g(sp)q(ecial)g(meaning)f(to)h(the)h +(target)f(t)o(yp)q(esetter)j(and)d(replaces)i(them)d(with)295 +1734 y(t)o(yp)q(esetter)h(commands)11 b(to)i(t)o(yp)q(eset)i(the)f(sequences) +i(so)d(that)h(they)g(will)e(app)q(ear)i(as)f(they)h(do)f(in)295 +1784 y(the)k(input.)26 b(F)m(or)16 b(example,)f(if)g(the)i(t)o(yp)q(esetter)i +(is)d Fl(none)g Fr(and)g(the)h(target)g(t)o(yp)q(esetter)i(is)d(T)1765 +1793 y(E)1788 1784 y(X,)295 1834 y(then)h(if)d Fl($)i Fr(\(the)g(T)581 +1843 y(E)604 1834 y(X)g(\\mathematics)d(mo)q(de")h(c)o(haracter\))j(app)q +(ears)g(in)e(the)h(input)f(\014le,)h(it)f(will)295 1884 y(b)q(e)g(b)q(e)f +(written)h(to)e(the)i(do)q(cumen)o(tation)e(\014le)g(as)h Fl(\\$)p +Fr(.)295 1968 y Fo(Restrictions)f(on)j(the)g(target)f(t)o(yp)q(esetter:)i +Fr(A)o(t)e(a)f(later)g(date,)h(di\013eren)o(t)g(w)o(ea)o(v)o(e)g(mo)q(dules) +295 2018 y(migh)o(t)d(b)q(e)j(incorp)q(orated)g(in)o(to)f(F)m(unnelW)m(eb)g +(to)g(cater)h(for)f(a)g(v)n(ariet)o(y)g(of)f(di\013eren)o(t)i(t)o(yp)q +(esetters.)295 2068 y(If)k(this)f(happ)q(ens,)j(it)d(will)g(b)q(e)h(imp)q +(ortan)o(t)e(to)i(ensure)h(that)f(t)o(yp)q(esetter-sp)q(eci\014c)j(source)e +(\014les)295 2118 y(\(i.e.)e Fl(typesetter)e Fq(6)p Fr(=)j +Fl(none)p Fr(\))e(are)i(not)g(pro)q(cessed)h(with)e(di\013eren)o(t)i(target)f +(t)o(yp)q(esetters.)34 b(F)m(or)295 2168 y(example,)18 b(a)g(user)h(migh)o(t) +d(inno)q(cen)o(tly)i(attempt)f(to)h(generate)i(a)e Fl(troff)f +Fr(do)q(cumen)o(tation)g(\014le)295 2217 y(from)f(a)h(F)m(unnelW)m(eb)g +(source)i(\014le)e(con)o(taining)f(a)h Fl(typesetter)j(=)i(tex)16 +b Fr(\(and)i(b)o(y)f(implication)295 2267 y(T)318 2276 y(E)341 +2267 y(X)j(con)o(trol)f(sequences\).)36 b(The)20 b(pragma)d(could)i(also)g(b) +q(e)h(useful)f(for)g(catc)o(hing)g(t)o(yp)q(esetter)295 2317 +y(clashes)12 b(in)f(source)h(and)f(include)g(\014les.)18 b(The)11 +b(setting)h Fl(none)e Fr(is)h(sp)q(ecial)g(b)q(ecause)i(it)d(is)h(guaran)o +(teed)295 2367 y(to)j(w)o(ork)g(with)f(an)o(y)h(future)g(target)g(t)o(yp)q +(esetter.)177 2451 y(The)i(aim)d(of)h(all)g(this)h(is)g(to)g(ensure)h(that)g +(an)o(y)e(t)o(yp)q(esetter)j(dep)q(endency)h(is)d(correctly)h(pro)q(claimed.) +k(Because)177 2501 y Fl(none)12 b Fr(is)h(the)h(default)f(t)o(yp)q(esetter,)i +(a)e(user)h(who)f(creates)i(a)e(source)i(\014le)e(without)g(a)f +Fl(typesetter)20 b(=)i(x)13 b Fr(pragma)177 2551 y(will)d(so)q(on)i(\014nd)g +(that)g(the)h(con)o(trol)e(sequences)j(they)f(are)f(inserting)g(in)o(to)f +(the)h(source)h(do)q(cumen)o(t)f(are)g(app)q(earing)177 2601 +y(v)o(erbatim)i(in)h(the)g(prin)o(ted)h(do)q(cumen)o(tation!)21 +b(In)15 b(order)h(to)f(activ)n(ate)g(these)h(sequences,)i(they)e(will)d(b)q +(e)j(forced)177 2651 y(to)e(add)g(a)f Fl(typesetter)f Fr(pragma,)g(th)o(us)i +(making)d(the)k(dep)q(endency)h(explicit.)177 2735 y(It)f(ma)o(y)d(seem)j +(strange)g(to)f(place)h(the)g Fl(typesetter)d Fr(setting)j(facilit)o(y)e +(within)h(a)g(pragma)f(\()p Fl(@p)p Fr(\))h(when)h(there)h(is)177 +2785 y(a)e(separate)i(t)o(yp)q(esetting)g(construct)g(\()p +Fl(@t)p Fr(\).)k(This)15 b(has)g(b)q(een)g(done)g(to)g(sustain)g(the)g(rule)g +(of)f(th)o(um)o(b)f(that)i(sa)o(ys)177 2835 y(that)f(pragmas)e(do)i(not)g +(participate)g(in)f(the)i(parser-lev)o(el)f(syn)o(tax,)g(but)g(t)o(yp)q +(esetter)i(directiv)o(es)f(do.)1042 2940 y(80)p eop +%%Page: 81 82 +81 81 bop 177 42 a Fd(3.10.12)55 b(F)-5 b(reestanding)19 b(T)n(yp)r(esetter)d +(Directiv)n(es)177 141 y Fr(F)m(unnelW)m(eb)c(pro)o(vides)g(t)o(w)o(o)g +(kinds)g(of)g(t)o(yp)q(esetter)j(directiv)o(e)e(to)f(assist)h(the)f(user)i +(to)e(pro)q(duce)h(do)q(cumen)o(tation.)177 191 y(These)j(are)e +Fo(inline)d Fr(and)j Fo(freestanding)o Fr(.)i(Unlik)o(e)e(pragmas,)e(eac)o(h) +j(of)f(these)h(categories)g(of)f(directiv)o(e)h(partic-)177 +241 y(ipates)g(in)f(the)h(parser-lev)o(el)h(syn)o(tax)e(and)h(can)g(app)q +(ear)g(only)e(in)i(certain)g(con)o(texts)g(\(see)h(the)g(parser)f(section\).) +177 291 y(Inline)f(directiv)o(es)i(are)f(designed)g(to)f(b)q(e)h(used)h +(within)e(paragraphs)g(to)h(alter)f(the)h(lo)q(ok)f(of)g(the)h(enclosed)h +(text.)177 341 y(F)m(reestanding)f(t)o(yp)q(esetter)i(directiv)o(es)f(are)f +(designed)h(to)e(app)q(ear)i(on)e(lines)h(of)f(their)h(o)o(wn)f(and)h(ha)o(v) +o(e)g(a)f(bigger)177 390 y(t)o(yp)q(ographical)f(impact.)177 +463 y(The)18 b(syn)o(tax)f(of)f(freestanding)i(t)o(yp)q(esetter)i(directiv)o +(es)e(is)f(almost)e(iden)o(tical)i(to)g(that)g(of)f(pragmas.)27 +b(All)16 b(the)177 513 y(same)11 b(syn)o(tax)i(rules)f(apply)g(\(except)i +(that)e(the)h(actual)e(k)o(eyw)o(ords)i(are)f(di\013eren)o(t\).)19 +b(The)13 b(follo)o(wing)c(subsections)177 563 y(describ)q(e)16 +b(the)e(four)g(t)o(yp)q(esetter)i(directiv)o(es)f(a)o(v)n(ailable.)177 +673 y Fl(ftd)21 b(=)h(ftd_newpage)d(|)j(ftd_toc)e(|)i(ftd_vskip)e(|)h +(ftd_title)177 723 y(ts)43 b(=)22 b("@t)f(")177 853 y Fo(3.10.12.1)48 +b(New)17 b(P)o(age)177 953 y Fr(The)d(new)h(page)f(pragma)e(is)h(a)h(t)o(yp)q +(esetting)h(pragma)d(with)h(the)i(follo)o(wing)c(syn)o(tax.)177 +1063 y Fl(ftd_newpage)20 b(=)h(ts)h("new_page")177 1174 y Fr(It)14 +b(only)f(form)f(lo)q(oks)i(lik)o(e)f(this.)177 1284 y Fl(@t)22 +b(new_page)177 1394 y Fr(Its)15 b(sole)f(e\013ect)i(is)e(to)g(cause)i(a)e +(\\skip)g(to)g(a)g(new)g(page")g(command)e(to)i(b)q(e)h(inserted)h(in)o(to)d +(the)i(do)q(cumen)o(tation)177 1444 y(\014le.)21 b(The)15 b(new)h(page)e +(command)f(is)h(suc)o(h)i(that)f(if)f(the)h(t)o(yp)q(esetter)i(is)e(already)g +(at)f(the)i(top)e(of)h(a)f(page,)h(it)f(will)177 1494 y(skip)g(to)g(the)g +(top)g(of)f(the)i(next)f(page.)177 1624 y Fo(3.10.12.2)48 b(T)l(able)15 +b(of)g(Con)o(ten)o(ts)177 1724 y Fr(The)f(new)h(page)f(pragma)e(is)h(a)h(t)o +(yp)q(esetting)h(pragma)d(with)h(the)i(follo)o(wing)c(syn)o(tax.)177 +1834 y Fl(ftd_toc)21 b(=)g(ts)g("table_of_contents")177 1944 +y Fr(It)14 b(only)f(form)f(lo)q(oks)i(lik)o(e)f(this.)177 2055 +y Fl(@t)22 b(table_of_conten)o(ts)177 2165 y Fr(Its)16 b(sole)f(e\013ect)h +(is)f(to)g(instruct)h(W)m(ea)o(v)o(e)f(to)f(insert)i(a)f(table)g(of)f(con)o +(ten)o(ts)i(at)f(this)g(p)q(oin)o(t)g(in)f(the)i(prin)o(ted)g(do)q(cu-)177 +2215 y(men)o(tation.)g(This)e(pragma)e(do)q(es)j(not)f(skip)f(to)h(a)g(top)g +(of)f(a)g(new)i(page)f(\014rst.)177 2345 y Fo(3.10.12.3)48 +b(V)l(ertical)14 b(Skip)177 2445 y Fr(The)e(v)o(ertical)f(skip)g(pragma)f(is) +h(a)g(t)o(yp)q(esetting)i(pragma)c(that)j(instructs)g(W)m(ea)o(v)o(e)f(to)g +(insert)i(a)e(sp)q(eci\014ed)i(amoun)o(t)177 2495 y(of)g(v)o(ertical)h(space) +h(in)o(to)e(the)i(do)q(cumen)o(tation.)i(The)d(pragma)e(has)i(the)g(follo)o +(wing)e(syn)o(tax.)177 2605 y Fl(ftd_vskip)20 b(=)i(ts)f("vskip")f(s)i +(number)f(s)g("mm")177 2715 y Fr(F)m(or)14 b(example:)177 2825 +y Fl(@t)22 b(vskip)e(26)i(mm)1042 2940 y Fr(81)p eop +%%Page: 82 83 +82 82 bop 177 42 a Fo(3.10.12.4)48 b(Title)177 147 y Fr(The)14 +b(title)g(pragma)e(is)i(a)f(t)o(yp)q(esetting)i(pragma)d(with)i(the)g(follo)o +(wing)e(syn)o(tax.)177 269 y Fl(ftd_title)20 b(=)i(ts)f("title")f(s)i(font)f +(s)h(alignment)d(text)177 319 y(font)130 b(=)22 b("normalfont")d(|)j +("titlefont")d(|)j("smalltitlefont")177 369 y(alignment)e(=)i("left")e(|)i +("centre")e(|)i("right")177 419 y(text)130 b(=)22 b("""")f({printable_char})d +("""")177 541 y Fr(It's)f(e\013ect)i(is)d(to)h(instruct)h(W)m(ea)o(v)o(e)e +(to)h(insert)h(a)e(single)h(line)f(in)o(to)g(the)i(prin)o(ted)f(do)q(cumen)o +(tation)f(con)o(taining)177 591 y(the)e(sp)q(eci\014ed)i(text)e(set)g(in)f +(the)i(sp)q(eci\014ed)g(fon)o(t)e(and)g(aligned)g(in)g(the)h(sp)q(eci\014ed)i +(manner.)h(The)d(double)f(quotes)177 641 y(delimiting)g(the)j(text)g(are)f +(for)h(sho)o(w)f(only;)g(if)f(y)o(ou)h(w)o(an)o(t)g(to)g(put)h(a)f(double)g +(quote)h(in)f(the)h(string,)f(y)o(ou)g(don't)177 691 y(need)g(to)f(double)g +(them.)177 768 y(Here)h(is)f(an)g(example)e(of)i(the)g(pragma.)177 +890 y Fl(@t)22 b(title)e(smalltitlefont)f(centre)i("How)g(to)g(Flip)g(a)h +(Bit")177 1039 y Fd(3.10.13)55 b(Scanner/P)n(arser)20 b(In)n(terface)177 +1144 y Fr(If)12 b(the)g(scanner)i(terminates)d(without)h(an)o(y)f(errors,)i +(con)o(trol)f(is)g(passed)h(to)f(the)g(parser.)19 b(The)12 +b(parser)h(parses)g(the)177 1194 y(tok)o(en)h(list)f(generated)i(b)o(y)f(the) +g(scanner.)19 b(The)c(tok)o(en)e(list)h(consists)g(of)f(text)i(scraps,)f +(freestanding)g(t)o(yp)q(esetter)177 1244 y(directiv)o(es,)h(and)e(sp)q +(ecial)h(sequence)i(tok)o(ens.)177 1321 y(The)g(user)g(should)f(b)q(ear)h(in) +e(mind)f(that)j Fm(the)g(sc)n(anner)g(\014nishes)h(running)f(b)n(efor)n(e)g +(the)g(p)n(arser)f(starts)g(running.)177 1371 y Fr(This)g(means)g(that)g(the) +g(scanner)i(cannot)e(b)q(e)h(in\015uenced)g(in)f(an)o(y)g(w)o(a)o(y)f(b)o(y)h +(higher)g(order)h(structures)i(suc)o(h)e(as)177 1421 y(the)d(parser)g(migh)o +(t)d(parse.)18 b(F)m(or)12 b(example,)f(it)g(is)h(imp)q(ossible)f(to)h(write) +g(a)g(F)m(unnelW)m(eb)f(macro)g(to)h(include)g(a)g(\014le,)177 +1471 y(or)i(insert)h(a)e Fl(vskip)g Fr(pragma)f(in)o(to)h(the)i(input)e +(text.)177 1641 y Fi(3.11)70 b(P)n(arser)177 1760 y Fr(By)19 +b(the)f(time)f(the)i(parser)g(starts,)h(the)f(scanner)h(has)e(completely)f +(terminated.)30 b(A)o(t)18 b(this)h(p)q(oin)o(t,)f(it)g(is)g(not)177 +1810 y(p)q(ossible)d(for)f(an)o(y)g(more)f(\014les)i(to)f(b)q(e)h(included,)f +(and)h(sp)q(ecial)f(c)o(haracters)j(are)d(no)h(longer)f(presen)o(t)i(to)e +(confuse)177 1860 y(things.)29 b(All)17 b(that)h(remains)e(is)i(a)f(list)g +(of)g Fo(text)j(tok)o(ens)p Fr(,)c Fo(sp)q(ecial)j(tok)o(ens)p +Fr(,)e(and)g Fo(t)o(yp)q(esetter)h(directiv)o(e)177 1910 y(tok)o(ens)p +Fr(.)f(T)m(ext)c(tok)o(ens)i(consist)f(en)o(tirely)g(of)f(sequences)j(of)e +(prin)o(table)f(c)o(haracters)j(and)d(end)h(of)g(line)f(mark)o(ers.)177 +1959 y(Sp)q(ecial)g(tok)o(ens)h(represen)o(t)h(the)f(sp)q(ecial)f(sequences)j +(that)d(the)h(scanner)g(found)f(in)f(the)i(input)f(\014le.)18 +b(T)o(yp)q(esetter)177 2009 y(directiv)o(e)12 b(tok)o(ens)h(represen)o(t)h +(the)e(freestanding)g(t)o(yp)q(esetter)i(directiv)o(es)f(that)f(the)g +(scanner)h(encoun)o(tered.)19 b(The)177 2059 y(parser)13 b(consumes)f(the)g +(tok)o(en)g(list)g(and)f(builds)h(a)f(macro)g(table)g(that)h(is)g(later)g +(used)g(to)g(generate)h(pro)q(duct)g(\014les.)177 2109 y(It)h(also)f +(constructs)j(a)e(do)q(cumen)o(t)f(list)h(that)g(is)f(used)i(to)f(generate)h +(the)g(do)q(cumen)o(tation)d(\014le.)177 2186 y(The)i(syn)o(tax)g(rules)h +(app)q(earing)f(in)f(the)h(follo)o(wing)e(sections)j(refer)g(to)e(the)i(tok)o +(en)f(list.)177 2335 y Fd(3.11.1)55 b(High)19 b(Lev)n(el)e(Structure)177 +2440 y Fr(A)o(t)c(the)g(highest)g(lev)o(el,)f(the)h(F)m(unnelW)m(eb)f(parser) +i(parses)f(the)h(input)e(\014le)g(\(tok)o(en)h(list\))f(in)o(to)g(a)h +(sequence)h(of)e(text)177 2490 y(scraps,)j(macro)d(de\014nitions,)i(and)g(t)o +(yp)q(esetter)i(directiv)o(es.)177 2613 y Fl(input_file)k(=)h({text)g(|)h +(macro)f(|)g(directive})177 2735 y Fr(All)f(three)i(of)e(these)i(kinds)f(of)f +(comp)q(onen)o(ts)g(con)o(tribute)h(to)g(the)g(do)q(cumen)o(tation)e(\014le,) +j(but)f(only)f(macro)177 2785 y(de\014nitions)15 b(con)o(tribute)g(to)f(the)h +(pro)q(duct)h(\014les.)k(If)14 b(all)g(the)h(free)g(text)g(and)g(directiv)o +(es)g(w)o(ere)h(remo)o(v)o(ed)d(from)g(a)177 2835 y(F)m(unnelW)m(eb)h(input)f +(\014le,)h(the)g(pro)q(duct)h(\014les)f(w)o(ould)f(not)h(b)q(e)h(a\013ected.) +1042 2940 y(82)p eop +%%Page: 83 84 +83 83 bop 177 42 a Fd(3.11.2)55 b(F)-5 b(ree)19 b(T)-5 b(ext)177 +142 y Fo(F)l(ree)18 b(text)e Fr(is)g(an)o(y)f(text)i(that)g(is)f(not)g(part)g +(of)g(a)g(macro)f(de\014nition)g(or)i(a)f(directiv)o(e.)25 +b(A)16 b(scrap)i(of)d(free)i(text)177 192 y(consists)j(of)d(a)h(sequence)j +(of)d(items)f(dra)o(wn)h(from)f(the)i(follo)o(wing)d(list:)26 +b(non-sp)q(ecial)18 b(prin)o(table)g(c)o(haracters,)177 241 +y(insert-eol)f(sp)q(ecial)g(sequences,)j(insert)d(sp)q(ecial)g(c)o(haracter)h +(sp)q(ecial)f(sequences,)i(insert)f(arbitrary)e(c)o(haracter)177 +291 y(sp)q(ecial)e(sequence.)177 403 y Fl(free_text)129 b(=)22 +b(ordinary_text)177 452 y(ordinary_text)41 b(=)22 b({ordinary_char)d(|)i(eol) +g(|)h(text_special}+)177 502 y(text_special)63 b(=)22 b("@+")f(|)g("@@")g(|)h +("@^")f(char_spec)177 552 y(ordinary_char)41 b(=)22 b(")f(".."~"-special)177 +664 y Fr(An)14 b(example)f(of)g(some)g(rather)i(messy)e(free)i(text)g(is)e +(as)h(follo)o(ws:)177 775 y Fl(This@@)21 b(is)g(a)h(very@+)e(messy)177 +825 y(@^D\(009\)chunk)f(of)j(text)f(indeed.)177 875 y(But)g(FunnelWeb)f +(still)h(views)g(it)g(as)177 925 y(a)h(single)e(chunk)h(of)g(text.)177 +1036 y Fr(F)m(unnelW)m(eb)16 b(nev)o(er)h(sees)i(t)o(w)o(o)c(text)j(c)o(h)o +(unks)f(next)g(to)f(eac)o(h)h(other)g(in)f(the)h(input;)g(they)g(are)g(alw)o +(a)o(ys)e(merged)177 1086 y(in)o(to)e(a)h(single)f(text)i(tok)o(en.)177 +1159 y(The)j(free)f(text)h(in)f(an)g(input)f(\014le)h(do)q(es)h(not)f +(a\013ect)h(the)g(pro)q(duct)g(\014les.)28 b(Ho)o(w)o(ev)o(er,)17 +b(b)o(y)g(default,)g(it)g(app)q(ears)177 1209 y(in)g(the)g(prin)o(ted)h(do)q +(cumen)o(tation)e(exactly)h(as)g(it)f(is)h(giv)o(en)g(in)f(the)i(input)f +(\014le,)g(except)i(that)e(it)f(is)h(\014lled)g(and)177 1259 +y(justi\014ed)d(in)o(to)g(paragraphs.)177 1332 y(An)o(y)20 +b(prin)o(table)f(c)o(haracter)i(or)e(particular)g(sequence)j(of)d(c)o +(haracters)i(ma)o(y)d(app)q(ear)i(in)f(the)h(free)g(text)g(of)f(a)177 +1382 y(do)q(cumen)o(t.)30 b(F)m(unnelW)m(eb)18 b(ensures)i(that)e(they)g +(will)f(app)q(ear)h(exactly)h(as)f(giv)o(en)f(in)h(the)g(input)g(\014le,)h +(ev)o(en)g(if)177 1432 y(they)c(happ)q(en)g(to)f(b)q(e)g(escap)q(e)i(c)o +(haracters)g(or)e(commands)e(in)i(the)g(target)h(t)o(yp)q(esetter.)21 +b(Ho)o(w)o(ev)o(er,)14 b(F)m(unnelW)m(eb)177 1482 y(also)j(pro)o(vides)h(a)g +(sp)q(ecial)g(mo)q(de)e(that)i(allo)o(ws)f(this)g(censoring)i(to)e(b)q(e)i(o) +o(v)o(erridden.)30 b(See)18 b(Section)g(for)g(more)177 1532 +y(information.)177 1671 y Fd(3.11.3)55 b(T)n(yp)r(esetter)17 +b(Directiv)n(es)177 1771 y Fr(F)m(unnelW)m(eb)e(pro)o(vides)h(a)g(v)n(ariet)o +(y)f(of)g(t)o(yp)q(esetter)j(directiv)o(es)e(to)g(assist)g(the)g(user)h(to)f +(t)o(yp)q(eset)h(the)f(do)q(cumen)o(t)177 1821 y(in)h(a)g(t)o(yp)q +(esetter-indep)q(ende)q(n)o(t)j(w)o(a)o(y)m(.)28 b(These)18 +b(are)g(divided)f(in)o(to)g Fo(freestandin)o(g)g(t)o(yp)q(esetter)h(directiv) +o(es)177 1871 y Fr(\(ftd\))c(and)g Fo(inline)f(t)o(yp)q(esetter)h(directiv)o +(es)d Fr(\(itd\).)18 b(The)d(in)o(ternal)f(syn)o(tax)g(of)f(the)i +(freestanding)f(t)o(yp)q(esetter)177 1920 y(directiv)o(es)g(has)g(already)f +(b)q(een)h(discussed)h(in)e(the)h(scanner)h(section.)j(The)c(follo)o(wing)d +(syn)o(tax)i(rule)g(de\014nes)i(the)177 1970 y(con)o(text)g(in)e(whic)o(h)h +(these)h(constructs)h(can)e(app)q(ear.)177 2082 y Fl(directive)20 +b(=)i(ftd)f(|)g(itd)177 2131 y(itd)152 b(=)22 b(section)e(|)i(literal)e(|)i +(emphasis)177 2243 y Fr(The)14 b(remainder)g(of)f(this)h(section)h(describ)q +(es)h(the)e(inline)f(t)o(yp)q(esetter)j(directiv)o(es.)177 +2374 y Fo(3.11.3.1)48 b(Section)177 2474 y Fr(The)19 b(section)f(directiv)o +(e)h(pro)o(vides)f(a)f(w)o(a)o(y)h(for)f(the)i(user)g(to)e(structure)j(the)f +(program)d(and)i(do)q(cumen)o(tation)177 2524 y(in)o(to)e(a)g(hierarc)o +(hical)h(tree)h(structure,)g(just)f(as)g(in)f(most)f(large)i(do)q(cumen)o +(ts.)26 b(A)16 b(section)i(construct)g(consists)177 2574 y(of)f(a)g +(case-insensitiv)o(e)h(iden)o(tifying)e(letter,)j(whic)o(h)e(determines)h +(the)g(absolute)f(lev)o(el)g(of)g(the)h(section)g(in)f(the)177 +2623 y(do)q(cumen)o(t,)c(and)h(an)f(optional)g(section)i(name,)d(whic)o(h)i +(has)g(exactly)g(the)g(same)f(syn)o(tax)h(as)g(a)f(macro)g(name.)177 +2735 y Fl(section)64 b(=)22 b("@")f(levelchar)f([name])177 +2785 y(levelchar)g(=)i("A")f(|)g("B")h(|)f("C")g(|)h("D")f(|)h("E")f(|)439 +2835 y("a")g(|)g("b")h(|)f("c")g(|)h("d")f(|)h("e")1042 2940 +y Fr(83)p eop +%%Page: 84 85 +84 84 bop 177 42 a Fr(The)15 b(section)f(construct)i(is)e(not)g(quite)g +(\\inline")f(as)h(it)g(m)o(ust)f(app)q(ear)h(only)f(at)h(the)h(start)g(of)e +(a)h(line.)k(Ho)o(w)o(ev)o(er,)177 91 y(unlik)o(e)10 b(the)h(\\)p +Fl(@i)p Fr(",)f(\\)p Fl(@p)p Fr(",)g(and)g(\\)p Fl(@t)p Fr(")g(constructs,)j +(it)d(do)q(es)h(not)g(consume)f(the)h(remainder)f(of)g(the)h(line)g +(\(although)177 141 y(it)j(w)o(ould)f(b)q(e)h(silly)f(to)h(place)g(an)o +(ything)f(on)g(the)i(same)e(line)g(an)o(yw)o(a)o(y\).)177 218 +y(F)m(unnelW)m(eb)d(pro)o(vides)h(\014v)o(e)g(lev)o(els)g(of)f(sections,)i +(ranging)e(from)f(the)i(highest)g(lev)o(el)f(of)h Fl(A)f Fr(\(lik)o(e)g(a)h +(L)1691 213 y Fk(a)1710 218 y Fr(T)1733 231 y(E)1756 218 y(X)g(c)o(hapter\)) +177 268 y(to)k(the)h(lo)o(w)o(est)g(lev)o(el)f(of)g Fl(E)g +Fr(\(lik)o(e)g(a)g(L)752 263 y Fk(a)771 268 y Fr(T)794 281 +y(E)817 268 y(X)h(subsubsubsection\).)25 b(F)m(unnelW)m(eb)14 +b(input)i(\014les)f(need)i(not)e(con)o(tain)177 318 y(an)o(y)e(sections)i(at) +e(all,)f(but)i(if)f(they)h(do,)f(the)h(\014rst)g(section)h(m)o(ust)d(b)q(e)i +(at)g(lev)o(el)f Fl(A)p Fr(,)g(and)g(follo)o(wing)e(sections)k(m)o(ust)177 +368 y(not)i(skip)g(hierarc)o(hical)g(lev)o(els)h(\(e.g.)e(an)h +Fl(@D)g Fr(cannot)g(follo)o(w)f(an)h Fl(@C)p Fr(\).)f(F)m(unnelW)m(eb)h +(generates)i(an)e(error)h(if)e(a)177 418 y(lev)o(el)e(is)f(skipp)q(ed.)177 +495 y(All)c(section)i Fm(must)f Fr(ha)o(v)o(e)g(names)f(asso)q(ciated)i(with) +e(them,)h(but)g(for)g(con)o(v)o(enience,)h(the)g(section)g(name)d(is)i +(optional)177 545 y(if)16 b(the)i(section)g(con)o(tains)f(one)g(or)g(more)g +(macro)e(de\014nitions)j(\(i.e.)e(at)h(least)g(one)g(macro)f(de\014nition)h +(app)q(ears)177 594 y(b)q(et)o(w)o(een)i(the)f(section)g(construct)h(in)e +(question)g(and)h(the)g(next)g(section)g(construct)h(in)e(the)g(input)h +(\014le.\).)28 b(In)177 644 y(this)19 b(case,)g(the)g(section)g +Fm(inherits)f Fr(the)h(name)e(of)h(the)h(\014rst)g(macro)e(de\014ned)i(in)f +(the)h(section.)32 b(This)18 b(feature)177 694 y(streamlines)c(the)g(input)g +(\014le,)f(a)o(v)o(oiding)f(duplicate)i(name)f(inconsistencies.)177 +771 y(An)o(y)g(sequence)i(of)d(prin)o(table)g(c)o(haracters)j(can)e(b)q(e)g +(used)h(in)e(the)i(section)f(name,)e(ev)o(en)j(the)f(target)h(t)o(yp)q +(esetter's)177 821 y(escap)q(e)i(sequence)g(\(e.g.)d(in)g(T)643 +830 y(E)667 821 y(X,)g(\\)p Fl(\\)p Fr("\).)177 898 y(The)h(follo)o(wing)e +(example)g(demonstrates)j(the)f(section)h(construct.)177 1021 +y Fl(@A@<Life)20 b(Simulation@>)177 1120 y(This)h(is)h(the)f(main)g +(simulation)e(module)i(for)g(planet)g(earth,)f(simulated)g(down)h(to)g(the) +177 1170 y(molecular)f(level.)h(This)g(is)g(a)h(REALLY)e(big)h(program.)f(I)i +(mean)f(really)g(big.)g(I)g(mean,)177 1220 y(if)h(you)f(thought)f(the)h +(X-Windows)f(source)h(code)g(was)g(big,)g(you're)f(in)i(for)f(a)h(shock...) +177 1320 y(@B)g(We)f(start)g(by)g(looking)f(at)i(the)f(code)g(for)g(six)g +(legged)g(stick)g(insects)f(as)h(they)177 1370 y(form)g(a)h(good)f(example)f +(of)h(a)h(typical)e(object-oriented)f(animal)i(implementation.)177 +1469 y(@$@<Six)g(Legged)f(Stick)h(Insects@>@{@-)177 1519 y(slsi.creep;)f +(slsi.crawl;)f(slsi.creep;@})177 1641 y Fr(In)c(the)h(ab)q(o)o(v)o(e)f +(example,)e(the)j(name)e(for)g(the)i(lev)o(el)f(A)g(section)h(is)f(pro)o +(vided)g(explicitly)m(,)e(while)i(the)g(name)f(for)177 1691 +y(the)h(lev)o(el)e(B)h(section)h(will)d(b)q(e)j(inherited)f(from)e(the)j +(macro)e(name.)177 1832 y Fo(3.11.3.2)48 b(Literal)13 b(Directiv)o(e)177 +1937 y Fr(Exp)q(erience)j(has)d(sho)o(wn)h(that)g(one)f(of)g(the)h(most)f +(common)e(t)o(yp)q(esetting)j(requiremen)o(t)g(is)f(that)h(of)f(b)q(eing)g +(able)177 1987 y(to)j(t)o(yp)q(eset)h(small)d(program)g(fragmen)o(ts)g(in)i +(the)g(middle)e(of)h(the)i(do)q(cumen)o(ting)d(free)j(text.)24 +b(T)o(ypically)14 b(there)177 2037 y(is)g(a)g(frequen)o(t)h(need)g(to)f +(refer)h(to)f(program)f(iden)o(ti\014ers,)h(and)g(it)g(assists)h(the)g +(reader)g(to)f(ha)o(v)o(e)g(suc)o(h)h(iden)o(ti\014ers)177 +2087 y(t)o(yp)q(eset)g(in)d(the)i(same)e(manner)g(as)h(the)h(program)d(text)j +(in)e(the)i(macro)d(de\014nition.)18 b(F)m(unnelW)m(eb)12 b(V1)h(de\014ned)h +(a)177 2136 y(T)200 2145 y(E)223 2136 y(X)f(macro)f(for)h(this)g(\(called)g +Fl(p)p Fr(\))g(that)g(simply)e(t)o(yp)q(eset)j(its)f(argumen)o(t)f(in)h +Fl(tt)21 b(font)p Fr(.)c(This)c(pro)o(v)o(ed)g(so)g(useful,)177 +2186 y(that)h(the)h(facilit)o(y)d(has)i(b)q(een)h(made)e(t)o(yp)q +(esetter-indep)q(enden)o(t)k(in)c(F)m(unnelW)m(eb)h(V3.)177 +2263 y(T)m(o)f(sp)q(ecify)h(that)f(some)g(text)h(b)q(e)g(t)o(yp)q(eset)h(in)e +Fl(tt)21 b(font)p Fr(,)12 b(enclose)j(the)f(text)g(in)f(curly)g(brace)i(sp)q +(ecial)e(sequences)177 2313 y(as)h(follo)o(ws.)177 2436 y Fl(literal)21 +b(=)g("@{")g(ordinary_text)e("@}")177 2558 y Fr(As)10 b(in)g(macro)e(names,)h +(section)i(names,)e(and)h(macro)e(b)q(o)q(dies,)j(the)f(text)g(con)o(tained)g +(within)f(the)h(literal)f(construct)177 2608 y(is)16 b(protected)j(b)o(y)d(F) +m(unnelW)m(eb)g(from)f(an)o(y)h(non-literal)f(in)o(terpretation)i(b)o(y)f +(the)h(t)o(yp)q(esetter)i(and)d(the)h(user)h(is)177 2658 y(free)d(to)e +(enclose)i Fm(any)f Fr(text)g(co)o(v)o(ered)h(b)o(y)e(the)h(de\014nition)f +Fl(ordinary)p 1252 2658 14 2 v 14 w(text)p Fr(.)k(F)m(unnelW)m(eb)c(guaran)o +(tees)i(that,)e(no)177 2708 y(matter)f(what)h(the)g(text)g(is,)f(it)g(will)g +(b)q(e)h(t)o(yp)q(eset)h(in)e Fl(tt)21 b(font)12 b Fr(exactly)h(as)f(it)h +(app)q(ears.)18 b(Ho)o(w)o(ev)o(er,)13 b(the)g(text)g(will)177 +2757 y(b)q(e)i(\014lled)e(and)h(justi\014ed)g(in)o(to)f(a)h(paragraph)f(as)h +(usual.)177 2835 y(Here)h(is)f(an)g(example)e(of)i(the)g(use)h(of)e(the)i +(construct:)1042 2940 y(84)p eop +%%Page: 85 86 +85 85 bop 177 42 a Fl(@C)22 b(The)f(@{WOMBAT@})e(\(Waste)i(Of)g(Money,)g +(Brains,)f(And)h(Time\))g(function)177 91 y(calls)g(the)g(@{kangaroo@})e +(input)i(function)f(which)h(has)g(been)177 141 y(known)g(to)g(cause)g +(keybounce.)177 191 y(This)g(keybounce)f(can)h(be)h(dampened)e(using)h(the)g +(@{wet_sloth@})e(subsystem.)177 322 y Fo(3.11.3.3)48 b(Emphasis)14 +b(Directiv)o(e)177 422 y Fr(The)g(emphasis)e(directiv)o(e)i(is)f(v)o(ery)h +(similar)d(to)i(the)h(literal)e(directiv)o(e)i(except)h(that)e(it)g(causes)i +(its)e(argumen)o(t)f(to)177 472 y(b)q(e)h(t)o(yp)q(eset)i(in)d(an)g +(emphasised)h(manner)e(\(e.g.)i(italics\).)k(Lik)o(e)12 b(the)h(literal)f +(directiv)o(e,)h(the)g(emphasis)f(directiv)o(e)177 522 y(protects)k(its)e +(text)g(argumen)o(t.)177 633 y Fl(emphasise)20 b(=)i("@/")f(ordinary_text)e +("@/")177 745 y Fr(Example:)177 857 y Fl(@C)j(What)f(you)g(@/really@/)e +(need,)i(of)h(course,)e(is)h(a)h(@/great@/,)e(@/big@/,)177 +906 y(network)h(with)f(packets)h(just)g(flying)f(@/everywhere@/.)177 +956 y(This)h(section)f(implements)g(an)i(interface)177 1006 +y(to)g(such)f(a)g(@/humungeous@/)e(network.)177 1145 y Fd(3.11.4)55 +b(Macros)177 1245 y Fr(The)19 b(third)f(category)h(of)e(construct)j(app)q +(earing)e(at)g(the)h(highest)f(syn)o(tactic)h(lev)o(el)f(in)f(a)h(F)m(unnelW) +m(eb)g(input)177 1295 y(\014le)e(is)f(the)h(macro)e(de\014nition.)23 +b(A)15 b(macro)f(de\014nition)i(binds)f(a)g(unique)h Fo(macro)h(name)e +Fr(to)g(a)h Fo(macro)h(b)q(o)q(dy)177 1345 y Fr(con)o(taining)e(an)g +Fo(expression)e Fr(consisting)j(of)f(text,)h(calls)f(to)h(other)g(macros,)e +(and)i(formal)d(parameters.)23 b(The)177 1395 y(syn)o(tax)14 +b(for)g(a)f(macro)g(de\014nition)g(is)h(as)g(follo)o(ws:)177 +1507 y Fl(macro)21 b(=)h(\("@O")e(|)i("@$"\))f(name)g([formal_paramet)o +(er_li)o(st])352 1556 y(["@Z"])f(["@M"])h(["==")f(|)i("+="])f("@{")g +(expression)e("@}")177 1668 y Fr(The)i(complexit)o(y)d(of)h(the)i(macro)d +(de\014nition)i(syn)o(tax)g(is)g(mostly)e(to)i(enable)g(the)h(user)g(to)e +(attac)o(h)h(v)n(arious)177 1718 y(attributes)d(to)f(the)g(macro.)23 +b(If)16 b(the)g(user)h(c)o(ho)q(oses)g Fl(@O)p Fr(,)e(then)i(the)f(macro)f +(cannot)h(b)q(e)h(called,)f(but)g(is)f(instead)177 1768 y(attac)o(hed)g(to)f +(a)g(pro)q(duct)h(\014le.)k(If)14 b(the)h(user)h(c)o(ho)q(oses)f +Fl(@$)p Fr(,)e(then)i(the)g(macro)e(is)h(an)g(ordinary)g(macro)f +(de\014nition)177 1817 y(that)h(is)g(not)g(attac)o(hed)g(to)g(a)f(\014le.)177 +1891 y(By)g(default,)f(a)g(non-\014le)g(macro)f(m)o(ust)g(b)q(e)i(in)o(v)o +(ok)o(ed)f(exactly)g(once)h(b)o(y)f(one)h(other)g(macro.)j(Macros)d(that)g +(aren't)177 1941 y(are)19 b(\015agged)e(with)h(errors)i(b)o(y)d(the)i(F)m +(unnelW)m(eb)f(analyser.)30 b(Ho)o(w)o(ev)o(er,)19 b(if)e(the)i(user)g(uses)g +(the)g Fl(@Z)f Fr(sequence)177 1990 y(in)f(the)h(macro)e(de\014nition,)h(the) +h(macro)e(is)h(then)h(p)q(ermitted)f(to)g(b)q(e)h(in)o(v)o(ok)o(ed)f(zero)h +(times,)e(as)i(w)o(ell)e(as)i(once.)177 2040 y(Similarly)l(,)13 +b(if)i(the)i(user)g(uses)g(the)g Fl(@M)e Fr(sequence)j(in)e(the)g(macro)f +(de\014nition,)h(the)g(macro)f(is)h(p)q(ermitted)f(to)h(b)q(e)177 +2090 y(called)f(man)o(y)e(times)h(as)h(w)o(ell)f(as)h(once.)22 +b(If)15 b(b)q(oth)g Fl(@Z)f Fr(and)h Fl(@M)g Fr(are)g(presen)o(t)h(then)g +(the)g(macro)d(is)i(p)q(ermitted)g(to)177 2140 y(b)q(e)g(in)o(v)o(ok)o(ed)e +(zero,)h(one,)g(or)f(man)o(y)f(times.)177 2213 y(The)j(purp)q(ose)g(of)e +(enforcing)h(the)h(default)f(\\exactly)g(one)g(call")f(rule)i(is)f(to)f +(\015ag)h(pieces)h(of)f(co)q(de)h(that)f(the)h(user)177 2263 +y(ma)o(y)d(ha)o(v)o(e)i(de\014ned)g(in)g(a)f(macro)g(but)h(not)f(ho)q(ok)o +(ed)h(in)o(to)f(the)h(rest)h(of)e(the)i(program.)h(Exp)q(erience)g(sho)o(ws)e +(that)177 2313 y(this)k(is)f(a)g(common)e(error.)29 b(Similarly)m(,)14 +b(it)j(can)h(b)q(e)g(dangerous)g(to)f(m)o(ultiply)e(in)o(v)o(ok)o(e)i(a)g +(macro)f(in)o(tended)i(to)177 2363 y(b)q(e)h(in)o(v)o(ok)o(ed)e(only)h(once.) +31 b(F)m(or)18 b(example,)g(it)f(ma)o(y)g(b)q(e)h(dangerous)h(to)f(in)o(v)o +(ok)o(e)f(a)h(scrap)h(of)f(non-idemp)q(oten)o(t)177 2413 y(initialization)12 +b(co)q(de)j(in)e(t)o(w)o(o)h(di\013eren)o(t)h(parts)g(of)f(the)g(main)e +(function)i(of)g(a)g(program!)j(Ho)o(w)o(ev)o(er,)d(F)m(unnelW)m(eb)177 +2462 y(will)h(not)i(generate)h(an)f(error)g(if)f(a)h(macro)e(without)h +Fl(@M)h Fr(is)f(called)h(b)o(y)f(another)h(macro)f(that)h(is)f(called)h(more) +177 2512 y(than)d(once.)177 2586 y(If)f(the)h(text)g(string)g +Fl(==)f Fr(\(or)h(nothing\))e(follo)o(ws)g(the)i(macro)f(name,)f(the)i +(expression)g(that)g(follo)o(ws)e(is)h(the)h(en)o(tire)177 +2635 y(text)j(of)e(the)i(macro)e(b)q(o)q(dy)m(.)24 b(If)15 +b(the)i(text)g(string)f Fl(+=)f Fr(follo)o(ws)g(the)h(macro)f(name,)g(then)i +(more)e(than)h(one)g(suc)o(h)177 2685 y(de\014nition)d(is)f(allo)o(w)o(ed)g +(\(but)h(not)g(required\))h(in)e(the)i(do)q(cumen)o(t)e(and)h(the)h(b)q(o)q +(dy)f(of)f(the)h(macro)f(consists)i(of)e(the)177 2735 y(concatenation)17 +b(of)g(all)e(suc)o(h)j(expressions)g(in)e(the)i(order)f(in)g(whic)o(h)f(they) +i(o)q(ccur)g(in)e(the)h(input)g(\014le.)27 b(Suc)o(h)17 b(a)177 +2785 y(macro)12 b(is)g(said)h(to)f(b)q(e)i(additiv)o(e)d(and)i(is)g +Fo(additiv)o(el)o(y)f(de\014ned)p Fr(.)j(Th)o(us)e(a)g(macro)e(b)q(o)q(dy)i +(can)g(either)g(b)q(e)h(de\014ned)177 2835 y(in)g(one)h(place)g(using)f(one)h +(de\014nition)f(\(using)g Fl(==)p Fr(\))g(or)h(it)f(can)h(b)q(e)g +Fm(distribute)n(d)f Fr(throughout)g(the)h(input)g(\014le)f(in)g(a)1042 +2940 y(85)p eop +%%Page: 86 87 +86 86 bop 177 42 a Fr(sequence)15 b(of)c(one)i(or)f(more)f(macro)g +(de\014nitions)h(\(using)g Fl(+=)p Fr(\).)17 b(If)12 b(neither)h +Fl(==)f Fr(and)g Fl(+=)g Fr(are)h(presen)o(t,)g(F)m(unnelW)m(eb)177 +91 y(assumes)h(a)g(default)f(of)g Fl(==)p Fr(.)177 169 y(Macros)g(attac)o +(hed)g(to)f(pro)q(duct)h(\014les)f(cannot)h(b)q(e)f(additiv)o(ely)f +(de\014ned.)19 b(Additiv)o(ely)11 b(de\014ned)i(macros)f(can)g(ha)o(v)o(e)177 +218 y(parameter)h(lists)g(and)f Fl(@Z)h Fr(and)g Fl(@M)f Fr(attributes,)i +(but)f(these)h(m)o(ust)e(b)q(e)i(sp)q(eci\014ed)g(only)e(in)h(the)g(\014rst)h +(de\014nition)e(of)177 268 y(the)j(macro.)h(Ho)o(w)o(ev)o(er,)e +Fl(+=)g Fr(m)o(ust)f(app)q(ear)h(in)f(eac)o(h)i(de\014nition.)177 +409 y Fo(3.11.4.1)48 b(Names)177 514 y Fr(Names)16 b(are)g(used)i(to)e(iden)o +(tify)f(macros)g(and)i(sections.)26 b(A)16 b(name)f(consists)j(of)d(a)h +(sequence)j(of)c(from)g(zero)i(to)177 564 y(80)12 b(prin)o(table)h(c)o +(haracters,)h(including)e(the)h(blank)f(c)o(haracter.)20 b(End)13 +b(of)f(line)g(c)o(haracters)j(are)e(not)g(p)q(ermitted)f(in)177 +613 y(names.)19 b(Names)13 b(are)i(case)g(sensitiv)o(e;)g(t)o(w)o(o)f +(di\013eren)o(t)h(macros)e(are)i(p)q(ermitted)f(to)g(ha)o(v)o(e)h(names)e +(that)h(di\013er)h(in)177 663 y(case)g(only)m(.)h(Lik)o(e)e(free)g(text,)g +(names)e(are)i(t)o(yp)q(eset)h(b)o(y)f(F)m(unnelW)m(eb)f(and)g(are)h(safe)g +(from)e(misin)o(terpretation)g(b)o(y)177 713 y(the)17 b(target)f(t)o(yp)q +(esetter.)27 b(F)m(or)16 b(example,)f(it)h(is)g(quite)g(acceptable)h(to)f +(use)h(the)g(macro)d(name)h Fl(@<\\medskip@>)177 763 y Fr(ev)o(en)g(if)e(the) +h(target)h(t)o(yp)q(esetter)h(is)e(T)764 772 y(E)787 763 y(X.)177 +885 y Fl(name)130 b(=)22 b("@<")f(name_text)f("@>")177 935 +y(name_text)g(=)i({ordinary_char)d(|)i(text_special})177 1076 +y Fo(3.11.4.2)48 b(F)l(ormal)15 b(P)o(arameter)f(Lists)177 +1181 y Fr(F)m(unnelW)m(eb)f(allo)o(ws)e(macros)h(to)h(ha)o(v)o(e)g(up)g(to)g +(nine)g(macro)e(parameters,)i(named)f Fl(@1)p Fr(,)g Fl(@2)p +Fr(,)g Fn(:)7 b(:)g(:)o Fr(,)13 b Fl(@9)p Fr(.)k(If)12 b(a)h(macro)177 +1230 y(do)q(es)f(not)g(ha)o(v)o(e)f(a)g(formal)e(parameter)i(list,)g(it)g(is) +h(de\014ned)g(to)f(ha)o(v)o(e)h(no)f(parameters,)g(and)h(an)f(actual)g +(parameter)177 1280 y(list)k(m)o(ust)g(not)g(app)q(ear)h(at)f(the)h(p)q(oin)o +(t)f(of)g(call.)22 b(If)15 b(a)h(macro)e(has)i(a)f(formal)e(parameter)i +(list,)g(it)g(is)g(de\014ned)i(to)177 1330 y(ha)o(v)o(e)g(one)h(or)f(more)f +(parameters,)h(and)h(a)e(corresp)q(onding)j(actual)d(parameter)h(m)o(ust)f(b) +q(e)i(supplied)f(for)g(eac)o(h)177 1380 y(formal)12 b(parameter,)h(at)g(the)i +(p)q(oin)o(t)e(of)h(call.)177 1457 y(Because)19 b(F)m(unnelW)m(eb)c +(parameters)i(ha)o(v)o(e)f(predictable)h(names,)f(the)h(only)f(information)d +(that)k(a)f(formal)e(pa-)177 1507 y(rameter)e(list)g(need)i(con)o(v)o(ey)e +(is)g Fm(how)i(many)f Fr(parameters)f(a)g(macro)f(has.)18 b(F)m(or)12 +b(this)g(reason)h(a)f(formal)e(parameter)177 1557 y(list)19 +b(tak)o(es)g(the)h(form)d(of)i(the)g(highest)h(n)o(um)o(b)q(ered)e(formal)f +(parameter)i(desired,)i(enclosed)f(in)f(paren)o(theses)177 +1606 y(sequences.)177 1729 y Fl(formal_parameter_l)o(ist)g(=)i("@\(")g +(formal_parameter)e("@\)".)177 1779 y(formal_parameter)g(=)i("@1")g(|)h("@2") +f(|)g("@3")g(|)h("@4")f(|)g("@5")g(|)591 1828 y("@6")g(|)h("@7")f(|)g("@8")g +(|)h("@9")177 1977 y Fd(3.11.5)55 b(Expressions)177 2082 y +Fr(Expressions)19 b(are)e(F)m(unnelW)m(eb's)f(most)g(p)q(o)o(w)o(erful)h +(form)e(of)i(expressing)h(a)e(text)i(string.)28 b(Macro)17 +b(b)q(o)q(dies)g(are)177 2132 y(de\014ned)e(as)f(expressions.)20 +b(Actual)14 b(parameters)g(consist)g(of)f(expressions.)177 +2209 y(An)i(expression)h(consists)g(of)e(a)g(sequence)j(of)d(zero)i(or)e +(more)g(expression)i(elemen)o(ts.)21 b(An)14 b(expression)i(elemen)o(t)177 +2259 y(can)i(b)q(e)g(ordinary)e(text,)j(a)e(macro)f(call,)h(or)g(a)g(formal)e +(parameter)i(of)f(the)i(macro)e Fm(de\014nition)i Fr(in)f(whic)o(h)g(the)177 +2309 y(formal)12 b(parameter)h(o)q(ccurs.)177 2431 y Fl(expression)20 +b(=)h({ordinary_text)e(|)j(macro_call)e(|)h(formal_parameter})177 +2580 y Fd(3.11.6)55 b(Macro)19 b(Calls)177 2685 y Fr(A)d(macro)e(call)h +(consists)i(of)e(a)g(name)g(optionally)e(follo)o(w)o(ed)h(b)o(y)i(an)f +(actual)g(parameter)h(list.)22 b(The)16 b(n)o(um)o(b)q(er)f(of)177 +2735 y(parameters)j(in)f(the)h(actual)g(parameter)f(list)g(m)o(ust)g(b)q(e)h +(the)h(same)d(as)i(the)g(n)o(um)o(b)q(er)f(of)h(formal)d(parameters)177 +2785 y(sp)q(eci\014ed)j(in)d(the)h(de\014nition)g(of)f(the)i(macro.)22 +b(If)16 b(the)g(macro)f(has)h(no)g(formal)d(parameter)i(list,)h(its)g(call)f +(m)o(ust)177 2835 y(ha)o(v)o(e)f(no)g(actual)f(parameter)h(list.)1042 +2940 y(86)p eop +%%Page: 87 88 +87 87 bop 177 42 a Fl(macro_call)260 b(=)21 b(name)g([actual_parameter_)o +(list])177 91 y(actual_parameter_l)o(ist)e(=)i("@\(")g(actpar)g({)g("@,")g +(actpar)g(})g("@\)")177 141 y(actpar)348 b(=)21 b(expression)f(|)700 +191 y(\()i(whitespace)e("@""")g(expression)g("@""")h(whitespace)e(\))177 +241 y(whitespace)260 b(=)21 b({")h(")f(|)h(eol})177 335 y Fr(F)m(unnelW)m(eb) +15 b(allo)o(ws)f(parameters)h(to)h(b)q(e)f(passed)i(directly)m(,)e(or)g +(delimited)f(b)o(y)h(sp)q(ecial)g(double)h(quotes.)22 b(Eac)o(h)177 +385 y(form)15 b(is)h(useful)g(under)h(di\013eren)o(t)g(circumstances.)26 +b(Direct)17 b(sp)q(eci\014cation)g(is)f(useful)g(where)i(the)f(parameters)177 +435 y(are)d(short)g(and)f(can)h(b)q(e)g(all)f(placed)g(on)h(one)f(line.)18 +b(Double)13 b(quoted)h(parameters)f(allo)o(w)f(whitespace)j(on)e(either)177 +485 y(side)19 b(\(that)g(is)g(not)g(considered)h(part)f(of)f(the)i +(parameter\))e(and)h(are)g(useful)g(for)g(la)o(ying)e(out)h(rather)i(messy) +177 535 y(parameters.)e(Here)d(are)g(examples)e(of)g(the)h(t)o(w)o(o)g +(forms.)177 629 y Fl(@<Generic)20 b(Loop@>@\()243 679 y(@"x:=1;@")41 +b(@,)243 729 y(@"x<=10;@")19 b(@,)243 779 y(@"print)h("x=\045u,)g +(x^2=\045u",x,x*x;)243 828 y(x:=x+1;@+@")177 878 y(@\))177 +978 y(@<Colours@>@\(red@,)o(green)o(@,blu)o(e@,ye)o(llow@)o(\))177 +1072 y Fr(As)15 b(sho)o(wn,)e(the)h(t)o(w)o(o)g(forms)e(ma)o(y)g(b)q(e)j +(mixed)d(within)h(the)i(same)e(parameter)g(list.)177 1141 y(Exp)q(erience)j +(has)e(sho)o(wn)g(that)g(the)g(v)n(ast)g(ma)r(jorit)o(y)e(of)h(macros)g(ha)o +(v)o(e)h(no)f(parameters.)177 1273 y Fd(3.11.7)55 b(F)-5 b(ormal)18 +b(P)n(arameters)177 1368 y Fr(F)m(ormal)d(parameters)i(can)h(app)q(ear)g(in)f +(the)h(expressions)h(forming)c(macro)h(b)q(o)q(dies)h(in)g(accordance)i(with) +e(the)177 1418 y(syn)o(tax)k(rules)g(de\014ned)h(ab)q(o)o(v)o(e.)38 +b(A)21 b(formal)d(parameter)j(expands)g(to)g(the)g(text)h(of)e(the)h +(expansion)g(of)f(its)177 1468 y(corresp)q(onding)c(actual)f(parameter.)21 +b(There)16 b(is)f(nothing)f(prev)o(en)o(ting)i(a)f(formal)d(parameter)j(b)q +(eing)g(pro)o(vided)177 1518 y(as)g(part)h(of)e(an)h(expression)h(that)g +(forms)d(an)i(actual)g(parameter.)21 b(In)16 b(that)f(happ)q(ens,)h(the)f +(formal)e(parameter)177 1568 y(is)i(b)q(ound)h(to)f(the)h(actual)f(parameter) +f(of)h(the)h(calling)e(macro,)g(not)h(the)h(called)f(macro.)21 +b(After)16 b(the)f(follo)o(wing)177 1618 y(de\014nitions,)177 +1712 y Fl(@$@<One@>@\(@1@\)=@{)o(A)k(walrus)i(in)g(@1)g(is)h(a)f(walrus)g(in) +g(vain.@})177 1762 y(@$@<Two@>@\(@1@\)=@{)o(@<One)o(@>@\(S)o(@1n@\))o(@})177 +1856 y Fr(the)15 b(call)177 1951 y Fl(@<Two@>@\(pai@\))177 +2045 y Fr(will)e(result)h(in)g(the)g(expansion)177 2140 y Fl(A)22 +b(walrus)e(in)i(Spain)e(is)i(a)f(walrus)g(in)g(vain.)177 2272 +y Fd(3.11.8)55 b(Macros)19 b(are)g(Static)177 2368 y Fr(In)f(F)m(unnelW)m +(eb,)g(the)g(actions)g(of)g Fm(macr)n(o)g(de\014nition)h Fr(and)e +Fm(macr)n(o)i(exp)n(ansion)g Fr(o)q(ccur)g(during)e(t)o(w)o(o)h(separate)177 +2417 y(phases)13 b(\(parser)h(and)e(tangle\))g(and)g(cannot)g(b)q(e)h(in)o +(terlea)o(v)o(ed.)18 b(As)12 b(a)g(result,)h(the)g(F)m(unnelW)m(eb)e(macro)g +(facilit)o(y)g(is)177 2467 y(completely)i(static.)18 b(It)c(is)g(not)g(p)q +(ossible)g(for)f(one)h(macro)f(to)h(de\014ne)h(another)f(while)f(the)i +(\014rst)f(macro)f(is)h(b)q(eing)177 2517 y(expanded;)k(eac)o(h)f(m)o(ust)e +(b)q(e)i(de\014ned)h(statically)m(.)24 b(It)17 b(is)f(not)g(p)q(ossible)h(to) +f(de\014ne)i(a)e(macro)f(to)h(ev)o(en)h(assist)g(in)177 2567 +y(the)g(de\014nition)e(of)g(other)i(macros.)23 b(Because)18 +b(the)e(scanner,)h(parser,)g(analyser,)f(and)g(tangler)g(phases)h(are)f(all) +177 2617 y(in)o(v)o(ok)o(ed)e(sequen)o(tially)m(,)f(there)i(is)f(no)h(ro)q +(om)d(for)i(feedbac)o(k)h(of)f(de\014nitions)g(b)q(et)o(w)o(een)i(di\013eren) +o(t)f(lev)o(els)f(\(e.g.)g(the)177 2666 y(user)h(cannot)f(de\014ne)h(a)f +(macro)e(for)i(the)g Fl(vskip)f Fr(pragma\).)177 2735 y(This)k(lac)o(k)f(of)g +(p)q(o)o(w)o(er)h(is)f(fully)f(in)o(ten)o(tional.)25 b(By)17 +b(totally)e(excluding)i(the)g(more)f(incomprehensible)g(w)o(a)o(ys)g(in)177 +2785 y(whic)o(h)d(a)h(general)f(purp)q(ose)i(macro)d(prepro)q(cessor)k(can)d +(b)q(e)h(used,)g(F)m(unnelW)m(eb)f(pro)o(vides)h(de\014nite)g(guaran)o(tees) +177 2835 y(to)g(the)g(reader)h(of)f(its)g(input)f(\014les:)1042 +2940 y(87)p eop +%%Page: 88 89 +88 88 bop 239 42 a Fq(\017)21 b Fr(F)m(unnelW)m(eb)15 b(guaran)o(tees)h(that) +f(a)g(piece)h(of)e(text)i(do)q(es)g(not)f(con)o(tain)g(a)g(macro)f(call)g +(unless)i(it)f(con)o(tains)281 91 y(the)f(sp)q(ecial)h(c)o(haracter)g(follo)o +(w)o(ed)d(b)o(y)i Fn(<)g Fr(or)g Fl(#)p Fr(.)239 177 y Fq(\017)21 +b Fr(F)m(unnelW)m(eb)13 b(allo)o(ws)g(calls)g(to)h(b)q(e)h(made)d(to)i +(macros)f(that)h(are)g(de\014ned)h(later)f(in)g(the)g(input)g(\014le.)177 +343 y Fi(3.12)70 b(Analyser)177 460 y Fr(The)14 b(e\013ect)g(of)e(the)i +(parser)g(is)f(to)g(construct)h(a)f(macro)e(table)i(con)o(taining)f(a)h +(represen)o(tation)h(of)e(all)g(the)i(macros)177 510 y(de\014ned)19 +b(within)e(the)i(do)q(cumen)o(t,)f(and)f(a)h(do)q(cumen)o(t)f(list)h(whic)o +(h)f(con)o(tains)h(a)g(complete)f(represen)o(tation)i(of)177 +560 y(the)f(en)o(tire)h(do)q(cumen)o(t.)28 b(If)18 b(there)h(are)f(no)f +(error)i(diagnostics)e(\(or)h(w)o(orse\))g(at)g(the)g(end)g(of)f(the)h +(parser)h(run,)177 610 y(F)m(unnelW)m(eb)11 b(in)o(v)o(ok)o(es)h(the)g +(analyser)g(whic)o(h)f(tests)j(for)d(the)h(follo)o(wing)d(conditions)j(and)f +(\015ags)h(them)f(with)g(errors)177 659 y(if)i(they)i(arise.)239 +778 y Fq(\017)21 b Fr(No)14 b(macros)f(de\014ned)i(in)e(the)i(input)e +(\014le.)239 864 y Fq(\017)21 b Fr(No)14 b(macros)f(connected)i(to)f(output)g +(\014les.)239 949 y Fq(\017)21 b Fr(Call)13 b(of)g(an)h(unde\014ned)h(macro.) +239 1035 y Fq(\017)21 b Fr(Call)13 b(ha)o(ving)f(the)j(wrong)e(n)o(um)o(b)q +(er)h(of)f(parameters.)239 1120 y Fq(\017)21 b Fr(Call)13 b(of)g(a)g(macro)g +(that)h(is)g(connected)h(to)f(an)g(output)g(\014le.)239 1205 +y Fq(\017)21 b Fr(No)14 b(calls)f(made)g(to)h(a)f(macro)g(without)g(the)i +Fl(@Z)e Fr(option.)239 1291 y Fq(\017)21 b Fr(More)14 b(than)g(one)g(call)f +(made)g(to)h(a)f(macro)g(without)h(the)g Fl(@M)f Fr(option.)239 +1376 y Fq(\017)21 b Fr(Directly)14 b(or)g(indirectly)f(recursiv)o(ely)i +(de\014ned)g(macros.)239 1461 y Fq(\017)21 b Fr(Unnamed)13 +b(sections)i(that)f(con)o(tain)f(no)h(macro)f(de\014nitions.)177 +1581 y(F)m(unnelW)m(eb)i(p)q(erforms)f(a)h(static)g(analysis)g(to)f(detect)j +(recursion.)23 b(Unfortunately)m(,)14 b(the)i(recursion)g(detection)177 +1630 y(algorithm)i(\015ags)i(all)f(macros)g(that)h(ha)o(v)o(e)g(an)g +(in\014nite)g(expansion)g(rather)h(than)g(just)f(all)f(macros)g(with)h(a)177 +1680 y(recursiv)o(e)15 b(de\014nition.)i(If)c(A)g(calls)g(B,)g(and)g(B)g +(calls)g(C,)g(and)g(C)g(calls)f(B,)h(then)h(F)m(unnelW)m(eb)f(will)e(\015ag)i +(A)g(as)g(w)o(ell)177 1730 y(as)h(B)g(and)g(C.)f(It)h(is)g(hop)q(ed)h(that)e +(this)h(problem)f(will)f(b)q(e)j(\014xed)f(in)g(a)f(later)h(v)o(ersion.)177 +1806 y(Because)j(F)m(unnelW)m(eb)d(do)q(es)h(not)f(pro)o(vide)h(an)o(y)f +(kind)g(of)g(conditional)f(feature,)i(the)g(prev)o(en)o(tion)g(of)f +(recursion)177 1856 y(do)q(es)h(not)f(represen)o(t)i(a)d(curtailmen)o(t)g(of) +g(expressiv)o(e)j(p)q(o)o(w)o(er.)177 1932 y(Macros)f(ma)o(y)d(b)q(e)i(in)o +(v)o(ok)o(ed)f(recursiv)o(ely)m(,)h(but)g(ma)o(y)e(not)i(b)q(e)g(recursiv)o +(e.)20 b(Th)o(us:)177 2051 y Fl(@<Sloth@>@\(@<Sloth)o(@>@\(W)o(alrus)o +(@\)@\))106 b(@!)21 b(LEGAL)64 b(recursive)20 b(invocation.)177 +2150 y(@$@<Teapot@>==@{@<)o(Teapo)o(t@>@})193 b(@!)21 b(ILLEGAL)f(recursive)g +(definition.)177 2316 y Fi(3.13)70 b(T)-6 b(angle)177 2434 +y Fr(If)17 b(the)g(scanner,)i(parser,)f(and)f(analyser)g(ha)o(v)o(e)g +(successfully)h(\(i.e.)e(with)h(no)f(errors,)j(sev)o(ere)f(errors,)h(or)e +(fatal)177 2484 y(errors\))j(completed,)f(and)f(the)h(T)m(angle)f(option)g +(\()p Fl(+O)p Fr(\))g(is)g(turned)i(on)e(\(it)h(is)f(b)o(y)g(default\),)h +(then)h(the)f(T)m(angle)177 2533 y(comp)q(onen)o(t)12 b(of)h(F)m(unnelW)m(eb) +f(is)h(in)o(v)o(ok)o(ed)f(to)g(generate)j(the)e(pro)q(duct)h(\014les)f(sp)q +(eci\014ed)i(in)d(the)h Fl(@O)g Fr(macros)f(of)g(the)177 2583 +y(input)i(\014le.)177 2659 y(The)j(op)q(eration)f(of)f(T)m(angle)g(is)h(v)o +(ery)h(simple.)23 b(Eac)o(h)16 b Fl(@O)g Fr(macro)f(is)h(expanded)g(and)g +(written)h(to)f(a)g(\014le)g(of)f(the)177 2709 y(same)f(name.)20 +b(As)15 b(there)i(are)e(a)f(\014nite)h(n)o(um)o(b)q(er)g(of)f(macros,)g(and)g +(the)i(analyser)f(guaran)o(tees)h(that)f(the)g(macro)177 2759 +y(structure)h(is)e(non-recursiv)o(e,)h(T)m(angle)e(is)g(guaran)o(teed)i(to)e +(terminate.)177 2835 y(Three)i(remaining)d(p)q(oin)o(ts)i(are)g(w)o(orth)g +(discussing.)1042 2940 y(88)p eop +%%Page: 89 90 +89 89 bop 228 42 a Fr(1.)20 b(T)m(angle)12 b(expands)h(macros)g(using)f +(blank)g(inden)o(tation)h(unless)g(the)h(user)g(has)f(sp)q(eci\014ed)i +(otherwise)f(in)e(an)281 91 y(inden)o(tation)h(pragma)f(in)i(the)g(input)g +(\014le)g(\(see)h(Section)f(3.10.11.1\).)228 167 y(2.)20 b(T)m(angle)d(k)o +(eeps)j(trac)o(k)f(of)e(the)i(length)g(of)f(the)h(lines)f(that)g(it)g(is)h +(writing)e(and)i(issues)g(an)f(error)i(if)d(an)o(y)281 217 +y(line)d(of)f(an)o(y)h(pro)q(duct)h(\014le)f(that)g(it)g(generates)i(is)d +(longer)h(than)g(the)h(maxim)n(um)o(.)h(The)e(maxim)n(um)c(is)k(the)281 +266 y(minim)n(um)9 b(of)j(a)h(v)n(alue)g(defaulted)g(or)g(sp)q(eci\014ed)i +(in)d(the)i(input)f(\014le)g(\(Section)h(3.10.11.3\),)c(and)j(the)g(v)n(alue) +281 316 y(\(if)g(an)o(y\))h(pro)o(vided)f(b)o(y)h(the)h Fl(+w)e +Fr(command)e(line)j(argumen)o(t)e(\(Section)j(3.7.3\).)228 +392 y(3.)20 b(It)14 b(is)f(w)o(orth)g(the)i(user)f(obtaining)e(some)h +(understanding)h(of)f(the)h(resources)i(that)e(F)m(unnelW)m(eb)f(requires)281 +441 y(to)h(p)q(erform)f(its)h(task.)177 531 y(When)c(F)m(unnelW)m(eb's)g +(scanner)h(executes,)i(it)c(reads)i(eac)o(h)f(\014le)g(in)o(to)g(memory)d +(where)k(it)f(is)g(k)o(ept)g(for)g(the)g(duration)177 581 y(of)h(the)h(run.) +18 b(Th)o(us,)12 b(there)g(m)o(ust)f(b)q(e)h(ro)q(om)e(in)h(memory)e(for)i +(the)h(en)o(tire)h(input)e(\014le,)g(including)g(all)f(include)i(\014les.)177 +631 y(While)k(this)h(approac)o(h)g(ma)o(y)e(seem)i(exp)q(ensiv)o(e)h(in)e +(memory)m(,)f(it)h(is)h(almost)e(necessary)k(in)e(order)g(to)g(supp)q(ort)177 +680 y(forw)o(ard)c(references.)20 b(T)m(o)12 b(merely)g(scan)h(the)h(input)e +(\014le,)h(recording)g(the)h(macro)d(names,)h(but)h(lea)o(ving)f(the)h(text) +177 730 y(on)h(disk,)f(w)o(ould)g(require)i(man)o(y)d(random)g(access)k(disk) +e(seeks.)177 797 y(In)h(con)o(trast,)h(F)m(unnelW)m(eb)f(nev)o(er)h(builds)e +(an)h(in)o(ternal)g(represen)o(tation)i(of)d(the)i(pro)q(duct)g(\014le.)22 +b(Instead,)15 b(eac)o(h)177 847 y(piece)e(of)e(output)h(is)f(written)h +(immediately)c(to)k(the)g(pro)q(duct)h(\014le.)k(This)11 b(means)g(that)h(as) +g(long)e(as)i(the)g(input)g(\014le)177 897 y(\014ts)j(in)e(memory)m(,)e(the)j +(pro)q(duct)h(\014le)f(can)g(b)q(e)h(arbitrarily)e(large.)18 +b(It)c(also)f(means)h(that)g(users)h(need)g(not)f(fear)g(to)177 +947 y(de\014ne)g(or)f(call)f(macros)g(that)h(they)g(kno)o(w)f(will)g(expand)h +(to)f(megab)o(ytes)g(of)h(text.)18 b(Nor)13 b(need)g(they)h(fear)f(placing) +177 997 y(a)j(call)g(to)g(suc)o(h)h(a)f(macro)f(as)h(part)g(of)g(an)g(actual) +g(parameter.)25 b(F)m(unnelW)m(eb)15 b(do)q(es)i(not)g(ev)o(er)g(expand)f +(actual)177 1046 y(parameters)j(in)o(ternally)m(.)31 b(In)18 +b(fact,)i(it)e(do)q(es)h(not)g(expand)g(them)f(un)o(til)f(it)i(hits)f(the)i +(corresp)q(onding)f(formal)177 1096 y(parameter)13 b(during)g(its)g +(expansion)g(of)g(the)h(called)e(macro.)17 b(A)o(t)c(that)g(p)q(oin)o(t,)g +(it)g(lo)q(oks)f(up)i(the)f Fm(expr)n(ession)h Fr(\(not)177 +1146 y(the)h(expansion)e(of)h(the)g(expression\))h(for)f(the)g(corresp)q +(onding)h(actual)f(parameter,)f(and)h(starts)h(expanding)e(it.)177 +1297 y Fi(3.14)70 b(W)-6 b(ea)n(v)n(e)177 1405 y Fr(If)17 b(the)g(scanner,)i +(parser,)f(and)f(analyser)g(ha)o(v)o(e)g(successfully)h(\(i.e.)e(with)h(no)f +(errors,)j(sev)o(ere)f(errors,)h(or)e(fatal)177 1455 y(errors\))g(completed,) +e(and)g(the)h(W)m(ea)o(v)o(e)f(option)f(\()p Fl(+T)p Fr(\))h(is)h(turned)g +(on)f(\(it)g(is)g Fm(o\013)h Fr(b)o(y)f(default\),)g(then)h(the)g(W)m(ea)o(v) +o(e)177 1505 y(comp)q(onen)o(t)c(of)g(F)m(unnelW)m(eb)f(is)i(in)o(v)o(ok)o +(ed)e(to)h(generate)i(a)e(text)h(\014le)g(in)e(the)i(format)e(of)h(a)g +(particular)g(t)o(yp)q(esetter.)177 1555 y(The)f(result,)h(when)f(fed)g +(through)g(the)h(particular)e(t)o(yp)q(esetter)j(and)e(prin)o(ted,)g(is)g(a)f +(fully)g(t)o(yp)q(eset)i(represen)o(tation)177 1605 y(of)h(the)i(en)o(tire)g +(input)e(\014le)h(complete)f(with)h(cross)h(referencing)g(information.)177 +1735 y Fd(3.14.1)55 b(T)-5 b(arget)19 b(T)n(yp)r(esetter)177 +1829 y Fr(Curren)o(tly)m(,)14 b(F)m(unnelW)m(eb)g(pro)q(duces)i(do)q(cumen)o +(tation)d(\014les)i(in)f(the)h(format)d(of)i(only)g(one)g(t)o(yp)q(esetter)j +(|)d(T)1883 1838 y(E)1906 1829 y(X.)177 1879 y(Ho)o(w)o(ev)o(er,)f(the)h(W)m +(ea)o(v)o(e)e(pac)o(k)n(age)h(of)f(F)m(unnelW)m(eb)g(is)h(fairly)f(small,)e +(and)j(it)f(is)h(hop)q(ed)g(that)g(it)g(can)g(b)q(e)h(rewritten)177 +1928 y(so)f(as)f(to)g(pro)o(vide)g(a)g(collection)g(of)g(t)o(yp)q(esetter)i +(mo)q(dules)d(from)g(whic)o(h)h(the)h(user)g(will)e(b)q(e)i(able)f(to)g(c)o +(ho)q(ose)h(using)177 1978 y(a)h(command)d(line)i(argumen)o(t.)177 +2108 y Fd(3.14.2)55 b(Cross)20 b(Reference)c(Num)n(b)r(ering)177 +2202 y Fr(When)h(F)m(unnelW)m(eb)g(pro)q(duces)i(its)e(t)o(yp)q(eset)h(do)q +(cumen)o(tation,)e(it)h Fm(numb)n(ers)g Fr(eac)o(h)h(section)g(and)e(eac)o(h) +i(macro)177 2252 y(de\014nition)e(and)h(cross)h(references)h(the)f(macro)d +(de\014nitions.)27 b(The)17 b(exact)g(sc)o(heme)g(used)h(has)e(b)q(een)i +(carefully)177 2302 y(though)o(t)c(out.)k(Ho)o(w)o(ev)o(er,)c(as)g(it)f(can)h +(b)q(e)h(a)e(little)g(confusing)h(to)g(the)g(b)q(eginner,)g(it)g(is)g +(explained)f(here)i(in)f(full.)177 2369 y(The)d(most)f(imp)q(ortan)o(t)f +(thing)h(is)h(that)g(there)h(is)e Fm(no)j(r)n(elation)d Fr(b)q(et)o(w)o(een)i +(the)f(macro)f(n)o(um)o(b)q(ering)f(and)i(the)g(section)177 +2419 y(n)o(um)o(b)q(ering.)28 b(In)17 b(Kn)o(uth's)h(W)m(eb)f(there)i(are)f +(only)f(section)h(n)o(um)o(b)q(ers.)29 b(In)18 b(F)m(unnelW)m(eb,)f(the)h(n)o +(um)o(b)q(ering)e(of)177 2469 y(sections)f(and)f(macros)f(is)h(separated.)177 +2536 y(In)h(F)m(unnelW)m(eb,)f Fm(se)n(ctions)h Fr(are)h(n)o(um)o(b)q(ered)e +(hierarc)o(hically)h(in)f(ascending)h(order.)22 b(F)m(or)15 +b(example,)e(the)j(second)177 2586 y(lev)o(el-C)i(section)i(of)e(the)i(third) +e(lev)o(el-B)h(section)h(of)e(the)h(\014rst)h(lev)o(el-A)e(section)i(is)f(n)o +(um)o(b)q(ered)f(\\1.3.2".)31 b(In)177 2635 y(con)o(trast,)17 +b Fm(macr)n(o)f(de\014nitions)h Fr(are)f(n)o(um)o(b)q(ered)g(sequen)o(tially) +f(in)h(ascending)g(order.)24 b(F)m(or)16 b(example,)f(the)h(\014rst)177 +2685 y(macro)c(de\014nition)h(is)g(n)o(um)o(b)q(er)f(1,)g(the)i(second)g(is)f +(n)o(um)o(b)q(er)g(2,)f(and)h(so)g(on.)18 b(Note)13 b(that)g(it)g(is)g +Fm(macr)n(o)h(de\014nitions)177 2735 y Fr(that)k(are)g(n)o(um)o(b)q(ered,)g +(not)f Fm(macr)n(os)p Fr(.)29 b(This)17 b(distinction)h(is)f(necessary)j(b)q +(ecause)f(additiv)o(e)e(macros)f(\(i.e.)h(the)177 2785 y(ones)f(with)e +Fl(+=)p Fr(\))g(can)h(b)q(e)h(de\014ned)g(b)o(y)e(a)h(collection)f(of)g +(partial)g(de\014nitions)h(scattered)i(throughout)e(the)g(input)177 +2835 y(\014le.)j(A)c(single)g(additiv)o(e)f(macro)f(ma)o(y)g(b)q(e)j +(de\014ned)g(in)e(de\014nitions)h(5,)f(67,)g(128,)g(and)h(153.)1042 +2940 y(89)p eop +%%Page: 90 91 +90 90 bop 177 42 a Fi(3.15)70 b(F)-6 b(unnelW)g(eb)23 b(Shell)177 +167 y Fd(3.15.1)55 b(In)n(tro)r(duction)177 269 y Fr(One)19 +b(of)f(the)h(goals)e(of)g(F)m(unnelW)m(eb)h(is)g(that)g(it)g(m)o(ust)f(b)q(e) +i(extremely)f(p)q(ortable.)31 b(Huge)19 b(e\013orts,)h(desp)q(erate)177 +319 y(actions,)e(and)g(great)g(sacri\014ces)h(w)o(ere)f(made)f(in)g(the)h +(name)f(of)g(p)q(ortabilit)o(y)m(.)27 b(F)m(or)17 b(example,)g(F)m(unnelW)m +(eb)g(is)177 369 y(written)e(in)e(C.)177 444 y(An)i(equally)e(imp)q(ortan)o +(t)g(goal)g(w)o(as)i(that)f(of)g(correctness)k(and)c(reliabilit)o(y)m(.)j(T)m +(o)d(this)h(end,)f(it)g(w)o(as)h(determined)177 494 y(that)d(a)f(large)g +(automated)f(suite)i(of)f(test)h(programs)e(b)q(e)i(prepared)h(to)e(assist)h +(in)f(regression)i(testing.)k(Preparing)177 544 y(the)e(test)g(suite)f(w)o +(as)g(tedious,)g(but)g(ac)o(hiev)n(able.)j(Automating)12 b(it)h(p)q(ortably)h +(w)o(as)g(more)f(di\016cult.)177 619 y(The)h(di\016cult)o(y)e(faced)i(w)o(as) +f(that)g(if)f(F)m(unnelW)m(eb)h(w)o(as)g(implemen)o(ted)e(in)i(the)g(form)f +(of)g(a)h(utilit)o(y)f(that)h(could)g(b)q(e)177 669 y(in)o(v)o(ok)o(ed)h +(from)g(the)h(op)q(erating)g(system)g(command)e(language,)h(the)h(only)g(w)o +(a)o(y)f(to)h(set)h(up)f(regression)h(testing)177 719 y(w)o(as)11 +b(in)f(the)h(command)d(language)i(of)g(the)h(op)q(erating)g(system)f(of)g +(the)h(target)g(mac)o(hine)f(\(shellscripts)i(for)e(UNIX,)177 +769 y(DCL)h(for)h(VMS,)f(batc)o(h)h(\014les)g(for)f(MSDOS,)g(and)g +Fm(nothing)i Fr(on)e(the)h(Macin)o(tosh\).)18 b(The)12 b(h)o(uge)f(v)n +(ariation)f(in)h(these)177 819 y(command)i(languages)i(led)g(to)g(the)h +(conclusion)g(that)f(either)h(the)g(automation)d(of)i(regression)i(testing)f +(w)o(ould)177 868 y(ha)o(v)o(e)i(to)h(b)q(e)g(rewritten)h(on)e(eac)o(h)h +(target)g(mac)o(hine,)f(or)g(a)g(small)f(command)e(language)j(w)o(ould)g(ha)o +(v)o(e)g(to)g(b)q(e)177 918 y(created)g(within)d(F)m(unnelW)m(eb.)24 +b(In)17 b(the)f(end,)h(the)g(t)o(win)e(goals)h(of)f(p)q(ortabilit)o(y)g(and)h +(regression)h(testing)g(w)o(ere)177 968 y(considered)g(so)f(imp)q(ortan)o(t)e +(that)i(a)f(small)e(command)g(shell)j(w)o(as)f(constructed)j(inside)e(F)m +(unnelW)m(eb.)22 b(This)16 b(is)177 1018 y(called)e(the)g Fo(F)l(unnelW)l(eb) +g(command)h(shell)p Fr(,)c(or)i(just)i(\\the)f(shell")f(for)h(short.)177 +1093 y(By)i(default,)f(when)i(F)m(unnelW)m(eb)e(is)g(in)o(v)o(ok)o(ed,)g(it)h +(do)q(es)g(not)g(en)o(ter)h(its)e(shell.)24 b(If)15 b(just)h(giv)o(en)f(the)h +(name)f(of)g(an)177 1143 y(input)c(\014le,)f(it)g(will)f(simple)g(pro)q(cess) +k(the)e(input)f(\014le)h(in)f(the)h(normal)e(manner)g(and)i(then)g +(terminate.)16 b(T)m(o)10 b(instruct)177 1193 y(F)m(unnelW)m(eb)g(to)g(in)o +(v)o(ok)o(e)f(its)h(shell,)g(the)g Fl(+K)g Fr(or)g Fl(+X)g +Fr(command)d(line)i(option)h(m)o(ust)f(b)q(e)h(sp)q(eci\014ed)i(when)e(F)m +(unnelW)m(eb)177 1243 y(is)i(in)o(v)o(ok)o(ed)g(from)f(the)i(op)q(erating)f +(system.)17 b(It)c(is)f(also)g(in)o(v)o(ok)o(ed)g(up)q(on)g(startup)h(if)f +(the)h(\014le)f Fl(fwinit.fws)f Fr(exists.)177 1318 y(Most)16 +b(F)m(unnelW)m(eb)f(users)i(will)d(nev)o(er)j(need)g(to)e(use)h(the)h(shell)e +(and)h(need)g(not)g(ev)o(en)g(kno)o(w)f(ab)q(out)h(it.)23 b(There)177 +1368 y(are)14 b(four)g(main)e(uses)j(of)e(the)i(shell:)228 +1486 y(1.)20 b(As)14 b(a)g(to)q(ol)f(to)h(supp)q(ort)g(automated)f +(regression)i(testing.)228 1570 y(2.)20 b(As)d(a)f(dev)o(elopmen)o(t)f(to)q +(ol)g(on)h(mac)o(hines)g(that)g(do)g(not)g(ha)o(v)o(e)g(a)g(built)g(in)g +(shell)g(\(e.g.)f(the)i(Macin)o(tosh\).)281 1620 y(The)d(shell)g(can)g(b)q(e) +h(used)f(to)g(pro)q(cess)i(whole)e(groups)g(of)f(\014les)h(automatically)m(.) +228 1705 y(3.)20 b(As)c(a)f(con)o(v)o(enience.)24 b(A)16 b(user)h(w)o(orking) +d(on)h(a)h(m)o(ulti-tasking,)c(m)o(ulti-windo)o(w)g(w)o(orkstation)j(ma)o(y)f +(wish)281 1754 y(to)g(k)o(eep)h(an)f(in)o(teractiv)o(e)g(session)h(of)f(F)m +(unnelW)m(eb)g(going)f(in)g(one)i(windo)o(w)e(rather)i(than)f(ha)o(ving)f(to) +h(run)281 1804 y(up)g(the)g(utilit)o(y)f(eac)o(h)h(time)f(it)g(is)h +(required.)228 1889 y(4.)20 b(As)15 b(a)g(con)o(v)o(enien)o(t)g(v)o(ehicle)g +(for)g(enclosing)g(utilities.)20 b(The)15 b(F)m(unnelW)m(eb)g(shell)g(con)o +(tains)g(useful)g(general)281 1938 y(purp)q(ose)g(commands)c(suc)o(h)k(as)f +(the)h(di\013erences)h(command)11 b Fl(diff)p Fr(.)177 2082 +y Fd(3.15.2)55 b(Return)18 b(Statuses)177 2184 y Fr(The)g(hierarc)o(h)o(y)f +(of)g(diagnostics)g(describ)q(ed)i(in)d(Section)i(3.5)e(is)h(also)g(used)h +(in)e(the)i(shell)f(commands.)25 b(Eac)o(h)177 2234 y(shell)14 +b(command)d(returns)k(a)f(status)h(whic)o(h)f(can)g(a\013ect)h(further)f(pro) +q(cessing.)295 2309 y Fo(Success)f Fr(status)i(is)f(the)g(normal)e(command)f +(return)k(status.)295 2385 y Fo(W)l(arning)f Fr(status)j(is)e(returned)j(if)d +(some)f(minor)g(problem)h(arose)h(with)f(the)i(execution)f(of)f(the)295 +2435 y(command.)295 2510 y Fo(Error)h Fr(status)h(is)g(returned)h(if)e(a)g +(signi\014can)o(t)h(problem)e(arises)i(during)f(the)i(execution)f(of)f(the) +295 2560 y(command.)23 b(Ho)o(w)o(ev)o(er,)17 b(unlik)o(e)f(a)g(sev)o(ere)j +(error,)e(it)f(do)q(es)h Fm(not)g Fr(cause)h(termination)c(of)i(the)h(en-)295 +2610 y(closing)d(shellscript.)295 2685 y Fo(Sev)o(ere)23 b(error)c +Fr(status)j(is)f(returned)h(if)e(a)g(problem)g(arises)h(during)g(the)g +(execution)h(of)e(the)295 2735 y(command)c(that)j(prev)o(en)o(ts)h(the)f +(command)d(from)h(deliv)o(ering)h(on)g(its)h(\\promise".)30 +b(A)19 b(sev)o(ere)295 2785 y(error)12 b(causes)g(F)m(unnelW)m(eb)e(to)g(ab)q +(ort)h(the)g(script)g(\(and)g(an)o(y)f(stac)o(k)o(ed)h(scripts\))h(to)e(the)h +(in)o(teractiv)o(e)295 2835 y(lev)o(el.)18 b(\(Ho)o(w)o(ev)o(er,)c(the)g +Fl(tolerate)f Fr(command)e(allo)o(ws)h(this)i(to)g(b)q(e)h(temp)q(orarily)d +(o)o(v)o(erridden\).)1042 2940 y(90)p eop +%%Page: 91 92 +91 91 bop 295 42 a Fo(F)l(atal)15 b(error)c Fr(status)j(is)f(returned)i(if)d +(a)h(problem)f(arises)h(that)g(is)g(so)h(serious)f(that)g(execution)h(of)295 +91 y(F)m(unnelW)m(eb)c(cannot)g(con)o(tin)o(ue.)17 b(A)10 b(fatal)f(error)i +(causes)g(F)m(unnelW)m(eb)e(to)h(ab)q(ort)g(to)g(the)h(op)q(erating)295 +141 y(system)j(lev)o(el.)295 219 y Fo(Assertion)i(error)e Fr(status)j(is)f +(nev)o(er)g(returned.)26 b(If)15 b(an)h(assertion)g(error)h(o)q(ccurs,)g(F)m +(unnelW)m(eb)295 269 y(b)q(om)o(bs)d(out)g(ungracefully)g(to)g(the)h(op)q +(erating)g(system.)k(Assertion)d(errors)f(should)g(nev)o(er)g(hap-)295 +319 y(p)q(en.)k(If)13 b(they)i(do,)e(then)i(there)g(is)f(a)f(bug)h(in)f(F)m +(unnelW)m(eb.)177 397 y(T)m(o)k(b)q(e)i(precise,)h(the)f(status)f(returned)i +(b)o(y)e(eac)o(h)g(command)e(is)h(a)h(v)o(ector)h(of)e(n)o(um)o(b)q(ers)h(b)q +(eing)g(the)g(n)o(um)o(b)q(er)177 447 y(of)d(eac)o(h)h(of)f(the)h(di\013eren) +o(t)g(kinds)f(of)g(diagnostic)g(generated)i(b)o(y)e(the)h(command.)k(Usually) +14 b(only)h(one)g(kind)g(of)177 497 y(diagnostic)d(is)g(generated.)19 +b(Ho)o(w)o(ev)o(er,)13 b(the)g Fl(fw)f Fr(command)e(and)i(a)g(few)h(of)f(the) +h(other)g(commands)d(can)i(generate)177 546 y(more)k(than)h(one)g(kind)f(of)h +(diagnostic.)26 b(These)18 b(status)g(v)o(ectors)g(are)f(summed)e(in)o +(ternally)h(where)i(they)g(ma)o(y)177 596 y(later)13 b(b)q(e)h(accessed)h +(using)e(the)g Fl(status)f Fr(command.)j(Ho)o(w)o(ev)o(er,)e(the)h(curren)o +(t)g(diagnostic)e(state)i(ev)n(ap)q(orates)g(as)177 646 y(so)q(on)g(as)g(the) +h(next)f(command)d(is)j(encoun)o(tered.)177 798 y Fd(3.15.3)55 +b(Command)17 b(Line)h(Length)177 904 y Fr(The)c(maxim)o(um)9 +b(length)14 b(of)f(a)h(shell)g(command)d(line)i(is)h(guaran)o(teed)g(to)g(b)q +(e)h(at)e(least)h(300)g(c)o(haracters.)177 1056 y Fd(3.15.4)55 +b(String)19 b(Substitution)177 1162 y Fr(Most)f(command)c(shells)k(pro)o +(vide)f(some)g(form)f(of)g(string)i(substitution)g(so)f(as)h(to)f(pro)o(vide) +g(some)g(degree)h(of)177 1212 y(parameterization.)j(The)16 +b(F)m(unnelW)m(eb)f(shell)g(pro)o(vides)h(36)e(di\013eren)o(t)j(string)e(v)n +(ariables)g(named)f Fl($0..$9)g Fr(and)177 1262 y Fl($A..$Z)i +Fr(\(case)i(insensitiv)o(e\).)28 b(Eac)o(h)17 b(v)n(ariable)f(can)i(hold)e(a) +h(string)g(con)o(taining)f(an)o(y)g(sequence)k(of)c(prin)o(table)177 +1312 y(c)o(haracters)g(and)e(can)g(b)q(e)g(as)g(long)f(as)h(a)g(command)d +(line.)177 1390 y(The)k Fl(define)e Fr(command)e(allo)o(ws)i(the)h(user)i(to) +e(assign)f(a)h(v)n(alue)g(to)g(these)h(v)n(ariables.)j(The)d +Fl(define)e Fr(command)177 1439 y(tak)o(es)i(t)o(w)o(o)e(argumen)o(ts.)18 +b(The)c(\014rst)h(is)f(the)h(digit)e(or)h(letter)h(of)e(the)i(v)n(ariable)e +(to)g(b)q(e)i(de\014ned.)20 b(The)14 b(second)h(is)f(a)177 +1489 y(double)f(quote)h(delimited)e(string)h(b)q(eing)g(the)h(string)g(v)n +(alue)e(to)i(b)q(e)g(assigned)f(to)g(the)h(v)n(ariable.)j(If)c(y)o(ou)g(w)o +(an)o(t)g(to)177 1539 y(include)h(a)g(double)f(quote)i(c)o(haracter)g(within) +e(the)i(string,)e(y)o(ou)g(don't)h(need)h(to)e(double)h(it.)177 +1617 y(Examples:)177 1742 y Fl(define)21 b(3)g("/root/usr/usrs/use)o(rs/us)o +(ers5/)o(this)o(user/)o(workd)o(ir/fw)o(dir/t)o(estdi)o(r")177 +1792 y(define)g(M)g("/user/local/rubbis)o(h/bin)o(/fw")177 +1841 y(define)g(Q)g("You)g(don't)g(need)g(to)g(double")g(double)f(quotes")177 +1966 y Fr(Only)13 b(the)h(iden)o(tifying)d(c)o(haracter)k(of)d(the)i(v)n +(ariable)e(b)q(eing)h(assigned)g(is)g(used)h(in)f(the)g(de\014nition.)18 +b(This)13 b(syn)o(tax)177 2016 y(is)18 b(a)g(simple)f(w)o(a)o(y)g(of)h(prev)o +(en)o(ting)g(the)h(v)n(ariable)e(from)f(b)q(eing)j(substituted)g(b)q(efore)g +(it)f(has)g(a)g(c)o(hance)h(to)f(b)q(e)177 2066 y(de\014ned!)177 +2144 y(The)c(follo)o(wing)e(p)q(oin)o(ts)i(clean)g(up)g(the)g(remaining)e +(seman)o(tic)h(details:)239 2268 y Fq(\017)21 b Fr(There)16 +b(is)f(only)g(one)g(set)h(of)f(v)n(ariables)f(and)h(they)h(are)f(global)f(to) +h(all)f(shellscripts.)23 b(There)16 b(are)g Fm(no)g(lo)n(c)n(al)281 +2318 y(variables)p Fr(.)239 2408 y Fq(\017)21 b Fr(When)f(a)h(shellscript)g +(is)f(in)o(v)o(ok)o(ed)f(using)h(the)h Fl(execute)e Fr(command,)g(the)i +(substitution)f(v)n(ariables)g Fl(0)281 2458 y Fr(through)14 +b Fl(9)g Fr(are)g(a\013ected.)19 b(See)c(Section)f(3.15.7.9)e(for)h(more)g +(details.)239 2547 y Fq(\017)21 b Fr(If)13 b(y)o(ou)h(w)o(an)o(t)f(to)h +(include)g(a)g(dollar)e(sign)i(c)o(haracter)h(in)f(a)f(command)e(use)k(\\)p +Fl($$)p Fr(".)239 2637 y Fq(\017)21 b Fr(F)m(unnelW)m(eb)14 +b(also)g(de\014nes)h(\\)p Fl($/)p Fr(")f(whic)o(h)g(translates)h(to)g(the)g +(c)o(haracter)g(that)g(separates)h(directory)f(and)281 2687 +y(\014le)21 b(name)g(\014elds)g(in)g(\014le)h(names)f(on)g(the)h(host)g(mac)o +(hine.)39 b(F)m(or)21 b(example:)32 b(Sun=\\)p Fl(/)p Fr(",)22 +b(V)m(ax=\\)p Fl(])p Fr(",)281 2737 y(Mac=\\)p Fl(:)p Fr(",)13 +b(PC=\\)p Fl(\\)p Fr(".)239 2827 y Fq(\017)21 b Fr(Substitution)14 +b(is)f(not)h(p)q(erformed)g(recursiv)o(ely)m(.)1042 2940 y(91)p +eop +%%Page: 92 93 +92 92 bop 177 42 a Fd(3.15.5)55 b(Ho)n(w)20 b(a)f(Command)e(Line)g(is)i(Pro)r +(cessed)177 158 y Fr(When)13 b(F)m(unnelW)m(eb)f(reads)i(in)e(a)h(command)d +(line)i(\(from)f(the)j(console)f(or)g(a)f(script)i(\014le\),)f(it)f(pro)q +(cesses)j(it)e(in)f(the)177 208 y(follo)o(wing)f(sequence:)228 +350 y(1.)20 b(The)14 b(command)c(line)j(is)h(c)o(hec)o(k)o(ed)g(for)f +(non-prin)o(table)g(c)o(haracters.)20 b(If)13 b(there)h(are)g(an)o(y)m(,)e +(they)i(are)g(\015agged)281 400 y(with)f(a)h(sev)o(ere)i(error.)228 +504 y(2.)k(All)11 b(dollar)f(string)i(substitution)g(v)n(ariables)f(in)g(the) +i(command)c(line)i(are)h(replaced)h(b)o(y)e(their)h(corresp)q(ond-)281 +554 y(ing)j(string.)25 b(The)17 b(command)c(line)j(is)f(pro)q(cessed)k(from) +14 b(left)i(to)g(righ)o(t.)24 b(Substitutions)17 b(are)f(p)q(erformed)281 +604 y(non)e(recursiv)o(ely)m(.)228 708 y(3.)20 b(A)o(t)9 b(this)h(p)q(oin)o +(t,)f(if)g(the)h(line)f(is)g(empt)o(y)m(,)g(or)g(consists)i(en)o(tirely)e(of) +g(blanks,)h(it)f(is)g(ignored)h(and)f(the)h(in)o(terpreter)281 +757 y(mo)o(v)o(es)j(to)g(the)i(next)f(line.)228 861 y(4.)20 +b(A)14 b(sev)o(ere)h(error)g(is)f(generated)h(if)e(the)i(line)e(at)h(this)g +(stage)g(b)q(egins)g(with)g(a)g(blank.)228 965 y(5.)20 b(If)13 +b(the)i(\014rst)g(c)o(haracter)g(of)e(the)i(line)e(is)h(\\)p +Fl(!)p Fr(",)e(the)j(line)e(is)h(a)g(commen)o(t)d(line)j(and)g(is)f(ignored.) +228 1069 y(6.)20 b(The)e(run)g(of)g(non-blanks)f(commencing)e(at)j(the)h +(start)f(of)f(the)i(line)e(is)h(compared)f(case-insensitiv)o(ely)281 +1119 y(to)e(eac)o(h)h(of)f(the)i(legal)d(command)f(v)o(erbs.)24 +b(If)15 b(the)h(command)d(is)j(illegal,)d(a)j(sev)o(ere)h(error)f(is)g +(generated,)281 1169 y(otherwise)f(the)f(command)d(is)j(pro)q(cessed.)177 +1343 y Fd(3.15.6)55 b(Options)177 1459 y Fr(The)14 b(F)m(unnelW)m(eb)g(shell) +g(main)o(tains)d(three)k(sets)g(of)f(command)d(line)i(options.)228 +1602 y(1.)20 b(The)10 b(set)g(of)f(options)g(resulting)g(from)f(applying)g +(the)i(op)q(erating)f(system)g(lev)o(el)g(command)e(line)i(argumen)o(ts)281 +1652 y(to)14 b(the)g(default)g(option)f(settings.)228 1756 +y(2.)20 b(A)14 b(set)h(of)e(shell)h(options)f(that)h(prev)n(ail)f(during)h +(the)g(shell)g(in)o(v)o(o)q(cation.)228 1860 y(3.)20 b(The)14 +b(set)h(of)e(option)g(v)n(alues)h(activ)o(e)g(during)g(a)f(particular)h(in)o +(v)o(o)q(cation)e(of)i(F)m(unnelW)m(eb)f(prop)q(er.)177 2002 +y(When)i(F)m(unnelW)m(eb)f(is)g(in)o(v)o(ok)o(ed)f(from)g(the)i(op)q(erating) +f(system)g(with)g(just)h Fl(+F)p Fr(,)e(only)h(the)h(\014rst)g(of)f(these)h +(three)177 2052 y(sets)k(comes)e(in)o(to)g(existence.)30 b(If)18 +b(the)g(user)g(in)o(v)o(ok)o(es)f(the)h(F)m(unnelW)m(eb)f(shell,)h(the)g +(shell)g(options)f(come)f(in)o(to)177 2102 y(existence)j(and)e(are)h +(initialized)d(with)i(the)h(v)n(alue)e(of)h(the)h(\014rst)f(set.)29 +b(These)19 b(shell)e(options)f(are)i(used)g(as)f(the)177 2151 +y(default)d(for)g(all)f(subsequen)o(t)j Fl(fw)d Fr(commands.)k(Ho)o(w)o(ev)o +(er,)d(they)h(can)f(b)q(e)h(altered)g(using)f(the)h(script)g(command)177 +2201 y Fl(set)p Fr(.)i(If)11 b(a)h Fl(fw)f Fr(command)e(executed)14 +b(in)d(a)g(shell)h(con)o(tains)g(additional)e(command)f(line)i(options,)g +(these)i(o)o(v)o(erride)177 2251 y(the)i(shell)e(options)h(for)f(that)h(run,) +g(but)g(do)g(not)g(c)o(hange)g(the)g(shell)g(options.)k(An)c(example)f(follo) +o(ws:)177 2393 y Fl($)22 b(fw)f(+k)h(+t)261 b(!)21 b(Original)f(invocation)g +(of)h(FunnelWeb)f(from)h(OS.)657 2443 y(!)g(Shell)g(options)f(are)h(now)h +(default)e(with)h("+t".)177 2493 y(FunnelWeb>fw)e(sloth)87 +b(!)21 b(Equivalent)f(to)h(fw)h(sloth)e(+t.)177 2543 y(FunnelWeb>set)f(-l)131 +b(!)21 b(Change)g(the)g(l)h(shell)e(option.)177 2593 y(FunnelWeb>fw)f(sloth)i +(+q)h(!)f(Equivalent)f(to)h(fw)h(sloth)e(+t)i(-l)f(+q.)177 +2642 y(FunnelWeb>fw)e(sloth)87 b(!)21 b(Equivalent)f(to)h(fw)h(sloth)e(+t)i +(-l.)177 2785 y Fr(The)14 b(existence)h(of)d(the)i(shell)f(option)f(set)i +(means)e(that)h(the)h(user)g(can)f(set)h(up)f(a)g(set)h(of)f(defaults)g(to)g +(b)q(e)g(applied)177 2835 y(to)h(all)f Fl(fw)g Fr(commands)e(issued)k(within) +e(the)i(shell.)1042 2940 y(92)p eop +%%Page: 93 94 +93 93 bop 177 42 a Fd(3.15.7)55 b(Shell)18 b(Commands)177 136 +y Fr(This)c(section)h(describ)q(es)h(eac)o(h)e(of)f(the)i(F)m(unnelW)m(eb)e +(shell)h(commands.)h(The)g(syn)o(tax)f(is:)177 226 y Fl(shell_command)19 +b(=)j(absent)64 b(|)22 b(codify)e(|)i(compare)e(|)i(define)e(|)i(diff)86 +b(|)22 b(diffsummary)d(|)526 276 y(diffzero)h(|)i(eneo)64 b(|)22 +b(execute)e(|)i(exists)e(|)i(fixeols)e(|)i(help)173 b(|)526 +326 y(here)108 b(|)22 b(quit)64 b(|)22 b(set)108 b(|)22 b(show)64 +b(|)22 b(skipto)42 b(|)22 b(status)129 b(|)526 376 y(tolerate)20 +b(|)i(trace)42 b(|)22 b(write)64 b(|)22 b(writeu)177 425 y(s)g(=)f({")h("}+) +177 516 y Fr(As)d(a)e(rule,)i(F)m(unnelW)m(eb)f(shell)g(commands)d(return)20 +b(sev)o(ere)f(status)g(if)e(their)i(argumen)o(ts)e(are)h(syn)o(tactically)177 +566 y(incorrect)d(or)f(if)f(they)i(are)f(unable)g(to)f(successfully)j(op)q +(erate)e(on)g(argumen)o(t)f(\014les.)177 688 y Fo(3.15.7.1)48 +b(Absen)o(t)177 782 y Fr(The)19 b Fl(absent)d Fr(command)g(p)q(erforms)h(no)h +(action)g(except)i(to)d(return)j(a)e(status.)31 b(If)18 b(the)g(\014le)h(sp)q +(eci\014ed)g(in)f(its)177 832 y(argumen)o(t)13 b(do)q(esn't)h(exist)h(it)e +(returns)i(success)i(status,)d(otherwise)h(it)e(returns)j(sev)o(ere)f +(status.)177 922 y Fl(Syntax)21 b(:)g(absent)g(=)g("absent")g(s)g(filename) +177 972 y(Example:)f(absent)h(result.out)177 1062 y Fr(This)16 +b(command)d(is)i(useful)h(in)f(regression)i(testing)f(for)f(making)e(sure)k +(that)f(F)m(unnelW)m(eb)f Fm(hasn)l('t)g Fr(pro)q(duced)i(a)177 +1112 y(particular)d(output)g(\014le.)177 1234 y Fo(3.15.7.2)48 +b(Co)q(dify)177 1329 y Fr(The)14 b Fl(codify)f Fr(command)e(tak)o(es)j(t)o(w) +o(o)f(argumen)o(ts:)k(an)d(input)g(\014le)f(and)h(an)f(output)h(\014le.)k(It) +c(reads)h(eac)o(h)f(line)f(of)177 1378 y(the)g(input)g(\014le)g(and)f(writes) +h(a)g(corresp)q(onding)g(line)g(to)f(the)h(output)g(\014le.)18 +b(The)13 b(corresp)q(onding)h(line)e(consists)h(of)177 1428 +y(a)e(C)g(macro)f(call)g(con)o(taining)g(a)g(string)h(con)o(taining)f(the)i +(input)f(line.)16 b(The)c(command)c(con)o(v)o(erts)k(all)e(bac)o(kslashes)177 +1478 y(in)j(input)h(lines)f(to)g(double)h(bac)o(kslashes)g(so)g(as)f(to)g(a)o +(v)o(oid)g(un)o(w)o(an)o(ted)g(in)o(terpretations)h(b)o(y)g(the)g(C)f +(compiler.)k(It)177 1528 y(also)c(con)o(v)o(erts)i(double)f(quotes)h(in)e +(the)i(line)e(to)h(bac)o(kslashed)g(double)g(quotes.)177 1618 +y Fl(Syntax)21 b(:)g(codify)g(=)g("codify")g(s)g(filename)f(s)i(filename)177 +1668 y(Example:)e(codify)h(header.tex)f(header.c)177 1758 y +Fr(The)14 b(follo)o(wing)e(example)g(demonstrates)j(the)f(transformation.)177 +1849 y Fl(Input)43 b(Line:)20 b(\\def\\par{\\leavevmode)o(\\endg)o(raf})o +(\045)f(A)j("jolly)e(good)h(hack".)177 1899 y(Output)g(Line:)f +(WX\("\\\\def\\\\par{\\\\lea)o(vevmo)o(de\\\\)o(endgr)o(af}\045)e(A)k +(\\"jolly)e(good)h(hack\\"."\);)177 1989 y Fr(The)c Fl(codify)e +Fr(command)f(w)o(as)i(in)o(tro)q(duced)h(to)g(assist)f(in)g(the)h(dev)o +(elopmen)o(t)f(of)g(F)m(unnelW)m(eb.)25 b(It)16 b(is)h(used)g(to)177 +2039 y(con)o(v)o(ert)f(longish)e(text)i(\014les)f(in)o(to)f(C)h(co)q(de)h(to) +f(write)h(them)e(out.)21 b(The)16 b(C)f(co)q(de)h(is)f(then)h(included)f +(within)f(the)177 2089 y(F)m(unnelW)m(eb)h(C)g(program.)20 +b(F)m(or)14 b(example,)g(the)h(set)h(of)f(T)1088 2098 y(E)1111 +2089 y(X)g(de\014nitions)g(that)g(app)q(ears)h(at)f(the)h(top)f(of)f(ev)o +(ery)177 2139 y(do)q(cumen)o(tation)e(\014le)i(w)o(as)f Fl(codif)p +Fr(ied)f(and)i(inserted)g(in)o(to)f(the)h(F)m(unnelW)m(eb)f(co)q(de)h(so)f +(that)h(F)m(unnelW)m(eb)f(w)o(ould)177 2188 y(not)h(ha)o(v)o(e)g(to)f(lo)q +(ok)g(for)h(a)f(\014le)h(con)o(taining)f(the)i(de\014nitions)f(at)f(run)h +(time.)177 2311 y Fo(3.15.7.3)48 b(Compare)177 2405 y Fr(The)17 +b Fl(compare)f Fr(command)d(tak)o(es)18 b(t)o(w)o(o)e(\014lename)f(argumen)o +(ts)h(and)h(p)q(erforms)f(a)h(binary)f(comparison)f(of)h(the)177 +2455 y(t)o(w)o(o)e(\014les.)19 b(If)14 b(the)h(\014les)f(are)h(iden)o(tical,) +e(success)k(status)e(is)f(returned.)20 b(If)14 b(they)h(are)f(di\013eren)o +(t,)h(sev)o(ere)h(status)f(is)177 2504 y(returned.)20 b(No)14 +b(information)d(ab)q(out)i(the)i(manner)e(in)g(whic)o(h)h(the)h(\014les)f +(di\013er)g(is)g(con)o(v)o(ey)o(ed.)177 2595 y Fl(Syntax)21 +b(:)g(compare)g(=)g("compare")f(s)i(filename)e(s)h(filename)177 +2645 y(Example:)f(compare)h(result.txt)e(answer.txt)177 2735 +y Fr(The)14 b Fl(compare)e Fr(command)f(w)o(as)i(created)j(as)d(the)h(main)e +(c)o(hec)o(king)i(mec)o(hanism)d(for)i(regression)i(testing.)j(Ho)o(w-)177 +2785 y(ev)o(er,)12 b(its)e(binary)g(output)h(w)o(as)f(so)q(on)g(found)g(to)h +(b)q(e)g(un)o(w)o(ork)n(able)e(and)i(the)g(more)e(sophisticated)i +Fl(diff)f Fr(command)177 2835 y(w)o(as)k(added)g(so)g(that)g(the)h(actual)e +(di\013erences)j(b)q(et)o(w)o(een)g(the)e(\014les)g(could)g(b)q(e)g +(examined.)1042 2940 y(93)p eop +%%Page: 94 95 +94 94 bop 177 42 a Fo(3.15.7.4)48 b(De\014ne)177 141 y Fr(The)12 +b Fl(define)e Fr(command)e(assigns)k(a)f(v)n(alue)g(to)g(a)g(shell)g(string)g +(substitution)h(v)n(ariable.)k(The)c Fl(define)e Fr(command)177 +191 y(tak)o(es)15 b(t)o(w)o(o)e(argumen)o(ts.)18 b(The)c(\014rst)h(is)f(the)h +(digit)e(or)h(letter)h(of)e(the)i(v)n(ariable)e(to)g(b)q(e)i(de\014ned.)20 +b(The)14 b(second)h(is)f(a)177 241 y(double)f(quote)h(delimited)e(string)h(b) +q(eing)g(the)h(string)g(v)n(alue)e(to)i(b)q(e)g(assigned)f(to)g(the)h(v)n +(ariable.)j(If)c(y)o(ou)g(w)o(an)o(t)g(to)177 291 y(include)h(a)g(double)f +(quote)i(c)o(haracter)g(within)e(the)i(string,)e(y)o(ou)g(don't)h(need)h(to)e +(double)h(it.)177 401 y Fl(Syntax)43 b(:)21 b(define)g(=)g("define")f(s)i +(letter)f(s)g("""")g(text)g("""")177 450 y(Examples:)f(define)h(3)g +("/usr/usrs/thisuser)o(/wor)o(kdir/)o(fwdir)o(/test)o(dir")395 +500 y(define)g(M)g("/user/local/rubbis)o(h/bi)o(n/fw")395 550 +y(define)g(Q)g("You)g(don't)g(need)g(to)g(double")g(double)f(quotes")177 +660 y Fr(The)f(command)d(in)o(terpreter)21 b(expands)e(the)g(command)d(line)i +(b)q(efore)h(it)g(executes)h(the)g Fl(define)d Fr(command.)177 +710 y(This)h(means)f(that)g(y)o(ou)h(can)f(de\014ne)i(string)f(substitution)g +(v)n(ariables)f(in)g(terms)g(of)h(eac)o(h)g(other)g(with)f(static)177 +760 y(binding.)177 833 y(The)d Fl(define)f Fr(command)e(w)o(as)i(in)o(tro)q +(duced)i(to)e(allo)o(w)f(the)j(parameterization)d(of)i(the)g(directories)h +(in)o(v)o(olv)o(ed)d(in)177 882 y(regression)j(testing.)177 +955 y(See)g(Section)f(3.15.4)e(for)i(more)f(details.)177 1086 +y Fo(3.15.7.5)48 b(Di\013)177 1185 y Fr(The)16 b Fl(diff)f +Fr(command)e(reads)k(in)e(t)o(w)o(o)g(text)i(\014les)f(and)f +Fm(app)n(ends)i Fr(a)f(rep)q(ort)g(to)g(a)g(log)e(\014le)i(con)o(taining)f(a) +g(list)g(of)177 1235 y(the)h(di\013erences)h(b)q(et)o(w)o(een)f(the)f(t)o(w)o +(o)g(input)f(\014les.)21 b(If)15 b(the)g(log)f(\014le)h(do)q(es)g(not)g +(already)g(exist,)g(an)f(empt)o(y)g(one)h(is)177 1285 y(created)h(\014rst.) +177 1395 y Fl(Syntax)43 b(:)21 b(diff)g(=)h("diff")e(s)i(filename)e(s)i +(filename)e(s)h(filename)f(s)i(["ABORT"])177 1445 y(Examples:)e(diff)h +(result.tex)f(answer.tex)g(diff.log)395 1494 y(diff)h($Otest23.out)e +($Atest23.out)h($Ldiff.log)f(ABORT)177 1604 y Fr(The)i Fl(diff)f +Fr(command)e(p)q(erforms)i(a)g(full)f(line-based)i(di\013erences)i(op)q +(eration.)37 b(It)21 b(will)e(iden)o(tify)h(di\013eren)o(t)177 +1654 y(sections)15 b(in)f(a)f(\014le,)h(ev)o(en)g(if)f(they)i(are)f(of)f +(di\013ering)h(length.)177 1727 y(The)19 b(implem)o(en)o(tation)c(of)j(the)g +Fl(diff)f Fr(command)f(is)i(quite)g(complicated.)29 b(T)m(o)17 +b(b)q(e)i(sure)g(that)f(it)g(is)g(at)g(least)177 1777 y(getting)e(its)h +(same/di\013eren)o(t)f(pro)q(clamation)e(righ)o(t,)i(the)h +Fl(diff)f Fr(command)d(p)q(erforms)j(a)g(binary)g(comparison)177 +1827 y(as)e(an)g(extra)g(c)o(hec)o(k.)177 1900 y(The)g(follo)o(wing)e(p)q +(oin)o(ts)i(describ)q(e)h(the)g(rules)f(for)g(determining)e(the)j(result)g +(status.)228 2010 y(1.)20 b Fl(diff)13 b Fr(ab)q(orts)h(with)g(a)f(sev)o(ere) +j(error)f(if)e(the)h(log)f(\014le)h(cannot)g(b)q(e)h(op)q(ened)g(or)e +(created)j(for)d(app)q(ending.)228 2091 y(2.)20 b(An)14 b(ordinary)f(error)i +(is)f(generated)h(if)e(either)i(or)f(b)q(oth)g(of)f(the)i(input)e(\014les)i +(cannot)f(b)q(e)g(op)q(ened.)228 2172 y(3.)20 b(If,)15 b(at)h(the)g(end)h(of) +e(the)h(run,)g(the)h(t)o(w)o(o)e(input)g(\014les)i(ha)o(v)o(e)e(not)h(b)q +(een)h(pro)o(v)o(en)f(to)f(b)q(e)i(iden)o(tical,)e(and)g(the)281 +2222 y Fl(ABORT)e Fr(k)o(eyw)o(ord)h(is)f(presen)o(t,)i Fl(diff)e +Fr(returns)j(sev)o(ere)f(status.)228 2303 y(4.)20 b Fl(diff)10 +b Fr(returns)j(success)h(status)e(if)f(none)g(of)g(the)h(ab)q(o)o(v)o(e)f +(conditions)g(\(or)h(similar)c(conditions\))k(o)q(ccur,)g(ev)o(en)281 +2353 y(if)h(the)h(t)o(w)o(o)g(\014les)g(are)g(di\013eren)o(t.)177 +2463 y(The)k Fl(diff)f Fr(command)d Fm(app)n(ends)19 b Fr(its)f +(di\013erences)h(rep)q(ort)g(rather)f(than)g(merely)e(writing)h(it.)28 +b(This)18 b(allo)o(ws)e(a)177 2513 y(regression)f(test)g(script)g(to)f(p)q +(erform)f(a)g(series)j(of)d(regression)i(tests)g(and)f(pro)q(duce)h(a)f(rep)q +(ort)h(for)e(the)i(user.)177 2586 y(The)e Fl(diff)e Fr(command)f(w)o(as)i +(added)h(to)f(the)h(shell)f(after)g(it)g(had)g(b)q(ecome)g(apparen)o(t)h +(that)f(the)h(simpler)e Fl(compare)177 2635 y Fr(command)h(w)o(as)i(not)h +(yielding)e(enough)i(information.)i(Whereas)f(early)e(on,)g(regression)i +(testing)f(w)o(as)g(treated)177 2685 y(mainly)8 b(as)i(a)f(to)q(ol)h(to)g +(ensure)h(that)f(F)m(unnelW)m(eb)g(w)o(as)g(b)q(eing)g(p)q(orted)g(to)g +(other)h(mac)o(hines)e(correctly)m(,)i(it)f(b)q(egan)g(to)177 +2735 y(place)j(an)f(increasing)h(role)g(during)f(dev)o(elopmen)o(t)g(in)g +(iden)o(tifying)f(the)i(e\013ects)i(of)d(c)o(hanges)h(made)f(to)g(the)h(co)q +(de.)177 2785 y(The)j Fl(diff)e Fr(command)f(supp)q(orts)j(this)f +(application)f(of)h(regression)h(testing)g(b)o(y)f(pinp)q(oin)o(ting)f(the)i +(di\013erences)177 2835 y(b)q(et)o(w)o(een)f(nearly-iden)o(tical)e(text)i +(\014les.)1042 2940 y(94)p eop +%%Page: 95 96 +95 95 bop 177 42 a Fo(3.15.7.6)48 b(Di\013summary)177 160 y +Fr(The)16 b Fl(diffsummary)d Fr(command)g(writes)j(a)g(short)g(rep)q(ort)g +(to)g(the)g(console)g(giving)e(the)i(n)o(um)o(b)q(er)f(of)g(di\013erence)177 +209 y(op)q(erations)20 b(that)f(ha)o(v)o(e)h(tak)o(en)f(place)h(and)f(ho)o(w) +g(man)o(y)f(of)h(the)h(pairs)f(of)g(\014les)h(compared)f(w)o(ere)h(iden)o +(tical.)177 259 y(Coun)o(ting)14 b(starts)h(at)f(the)h(most)e(recen)o(t)j +(execution)f(of)f(a)g Fl(diffzero)e Fr(command,)g(or)i(if)f(there)j(has)f(b)q +(een)g(none,)177 309 y(when)g(F)m(unnelW)m(eb)e(started)i(up.)177 +454 y Fl(Syntax)43 b(:)21 b(diffsummary)f(=)h("diffsummary")177 +504 y(Examples:)f(diffsummary)177 649 y Fr(The)15 b Fl(diffsummary)d +Fr(command)g(w)o(as)i(added)h(so)f(as)g(to)h(allo)o(w)d(regression)k(testing) +f(scripts)g(to)f(displa)o(y)g(a)g(sum-)177 699 y(mary)f(of)i(the)g(results)h +(of)e(the)i(test.)22 b(If)14 b(the)i(summary)c(indicates)j(that)g(no)g(pair)f +(of)g(\014les)h(di\013ered,)h(then)f(there)177 749 y(is)f(no)g(need)g(to)g +(lo)q(ok)f(in)h(the)g Fl(diff)f Fr(log)g(\014le.)177 918 y +Fo(3.15.7.7)48 b(Di\013zero)177 1036 y Fr(The)13 b Fl(diffzero)d +Fr(command)g(zeros)j(the)g(di\013eren)o(t)g(summary)d(coun)o(ters)j(used)g(b) +o(y)f(the)h Fl(diff)e Fr(and)h Fl(diffsummary)177 1086 y Fr(commands.)177 +1231 y Fl(Syntax)43 b(:)21 b(diffzero)f(=)i("diffzero")177 +1281 y(Examples:)e(diffzero)177 1426 y Fr(The)g Fl(diffzero)e +Fr(command)f(w)o(as)j(added)g(so)g(as)g(to)f(allo)o(w)f(regression)j(testing) +f(shellscripts)h(to)f(zero)g(their)177 1476 y(di\013erences)c(coun)o(ters)e +(at)f(the)h(start)g(of)e(a)h(run.)18 b(This)13 b(allo)o(ws)f(testers)k(to)d +(in)o(v)o(ok)o(e)f(the)i(same)e(regression)i(testing)177 1526 +y(script)h(t)o(wice)f(in)f(one)i(in)o(teractiv)o(e)f(session)h(without)e +(receiving)h(an)g(in\015ated)g(di\013erences)i(summary)m(.)177 +1695 y Fo(3.15.7.8)48 b(Eneo)177 1814 y Fr(The)15 b Fl(eneo)e +Fr(command)f(tak)o(es)j(one)f(\014lename)g(argumen)o(t.)k(If)c(the)h(\014le)f +(do)q(es)h(not)g(exist,)f(no)g(action)g(is)h(tak)o(en.)k(If)177 +1863 y(the)14 b(\014le)f(do)q(es)h(exist,)f(it)g(is)f(deleted.)19 +b(In)13 b(b)q(oth)h(cases)g(success)i(status)d(is)g(returned.)20 +b(Ho)o(w)o(ev)o(er,)13 b(if)f(the)i(\014le)f(exists)177 1913 +y(and)h(cannot)g(b)q(e)g(deleted,)h Fl(eneo)e Fr(returns)i(sev)o(ere)h +(status.)177 2058 y Fl(Syntax)43 b(:)21 b(eneo)g(=)h("eneo")e(s)i(filename) +177 2108 y(Examples:)e(eneo)h(result.out)177 2253 y Fr(The)e +Fl(eneo)e Fr(command)e(w)o(as)j(added)h(so)f(as)g(to)g(allo)o(w)f(regression) +i(testing)g(scripts)g(to)f(ensure)i(that)e(existing)177 2303 +y(output)h(\014les)g(w)o(ere)h(not)f(presen)o(t)h(b)q(efore)g(pro)q(ceeding)g +(with)e(a)h(test)h(run.)33 b(If)19 b(F)m(unnelW)m(eb)f(w)o(ere)i(to)f(fail)e +(to)177 2353 y(generate)e(an)f(output)g(\014le,)f(it)h(w)o(ould)f(b)q(e)i +(extremely)e(undesirable)h(for)g(the)h(old)e(v)o(ersion)h(to)f(b)q(e)i(used.) +177 2439 y(ENEO)h(stands)h(for)e Fo(E)p Fr(stablish)g(the)h +Fo(N)p Fr(on)g Fo(E)p Fr(xistence)h Fo(O)p Fr(f.)22 b(Most)16 +b(op)q(erating)f(systems)h(pro)o(vide)f(a)h(command)177 2489 +y(to)f(delete)h(\014les.)23 b(T)o(ypically)13 b(these)k(commands)c(are)i(v)o +(erbs)h(suc)o(h)g(as)f(\\delete",)h(\\remo)o(v)o(e",)e(and)h(\\kill".)k(As)d +(a)177 2539 y(consequence,)h(the)f(designers)g(of)e(delete)i(commands)d +(usually)h(consider)i(the)f(command)e(to)h(ha)o(v)o(e)h(failed)f(if)g(it)177 +2589 y(fails)e(to)h(\014nd)g(the)g(\014le)g(to)g(b)q(e)g(deleted.)19 +b(Ho)o(w)o(ev)o(er,)13 b(in)g(m)o(y)e(exp)q(erience,)k(the)e(most)f(common)e +(use)k(for)e(the)i(delete)177 2639 y(command)f(is)j(to)f Fm(establish)i(the)f +(non-existenc)n(e)i(of)e Fr(one)g(or)g(more)e(\014les.)24 b(T)o(ypically)m(,) +14 b(a)i(script)g(is)g(starting)g(up)177 2688 y(and)f(needs)i(to)e(clear)g +(the)h(air)f(b)q(efore)h(getting)f(started.)23 b(If)15 b(the)h(\014les)f(are) +h(there,)g(they)g(should)f(b)q(e)h(deleted;)h(if)177 2738 y(they)e(are)f +(not,)f(then)i(that's)f(OK)g(to)q(o.)787 2723 y Fg(5)p 177 +2796 709 2 v 223 2823 a Ff(5)241 2835 y Fh(As)e(far)f(as)g(I)h(kno)o(w,)e +(the)h Fe(eneo)g Fh(command)d(is)k(original.)1042 2940 y Fr(95)p +eop +%%Page: 96 97 +96 96 bop 177 42 a Fo(3.15.7.9)48 b(Execute)177 138 y Fr(The)20 +b Fl(execute)d Fr(command)f(causes)21 b(a)e(sp)q(eci\014ed)h(text)g(\014le)f +(to)g(b)q(e)g(executed)i(as)e(a)g(F)m(unnelW)m(eb)g(shellscript.)177 +188 y(The)e(\014rst)h(argumen)o(t)d(is)i(the)g(name)f(of)g(the)h(script)g +(\014le.)27 b(The)17 b(remaining)e(argumen)o(ts)h(are)h(assigned)g(to)f(the) +177 237 y(substitution)i(v)n(ariables)f Fl($1)p Fr(,)g Fl($2)p +Fr(,)g Fn(:)7 b(:)g(:)o Fr(,)18 b Fl($9)p Fr(.)28 b(Substitution)17 +b(v)n(ariables)g(in)g(the)h(range)g Fl($1)f Fr(to)g Fl($9)g +Fr(that)h(do)f(not)177 287 y(corresp)q(ond)d(to)e(an)g(argumen)o(t)f(are)i +(set)g(to)f(the)h(empt)o(y)e(string)h Fl("")p Fr(.)17 b Fl($0)12 +b Fr(is)g(set)h(to)f(the)h(empt)o(y)e(string)h(regardless.)177 +337 y(The)k(execute)h(command)12 b(can)k(b)q(e)f(used)h(recursiv)o(ely)m(,)g +(allo)o(wing)d(shell)i(scripts)h(to)f(in)o(v)o(ok)o(e)f(eac)o(h)i(other.)23 +b(A)15 b(\014le)177 387 y(extension)g(default)e(of)h(\\)p Fl(.fws)p +Fr(")e(\(F)m(unnelW)m(eb)i(Script\))g(applies)g(to)f(script)i(\014les.)177 +485 y Fl(Syntax)43 b(:)21 b(execute)f(=)i("execute")e(s)i(filename)e +({argument_string)o(})177 534 y(Examples:)g(execute)g(megatest.fws)g +(/usr/users/ross/)o(fwtes)o(t)f(!)395 584 y(execute)h(sloth)177 +682 y Fr(The)14 b(\014rst)h(example)e(ab)q(o)o(v)o(e)g(will)g(result)h(in)g +(the)g(follo)o(wing)e(substitution)i(v)n(ariable)e(assignmen)o(ts.)177 +780 y Fl($0)22 b(=)f("")177 829 y($1)h(=)f("/usr/users/ross/f)o(wtest)o(")177 +879 y($2)h(=)f("!")177 929 y($3)h(=)f("")177 979 y(...)177 +1029 y($9)h(=)f("")177 1126 y Fr(It)16 b(should)f(b)q(e)g(stressed)j(that)d +(there)i(are)f(no)f(lo)q(cal)f(v)n(ariables)h(in)g(the)g(F)m(unnelW)m(eb)g +(command)e(language;)h(the)177 1176 y(v)n(ariables)f(ab)q(o)o(v)o(e)h(are)g +(globally)e(mo)q(di\014ed.)177 1246 y(The)j Fl(execute)f Fr(command)e(w)o(as) +i(added)h(to)g(allo)o(w)e(the)i(creation)h(of)e(sub-scripts)i(to)f(test)g(F)m +(unnelW)m(eb)g(in)f(par-)177 1296 y(ticular)g(w)o(a)o(ys.)177 +1421 y Fo(3.15.7.10)48 b(Exists)177 1517 y Fr(The)19 b Fl(exists)d +Fr(command)g(p)q(erforms)h(no)h(action)g(except)i(to)d(return)j(a)e(status.) +31 b(If)18 b(the)g(\014le)h(sp)q(eci\014ed)g(in)f(its)177 1567 +y(argumen)o(t)13 b(exists)i(it)e(returns)i(success)i(status,)d(otherwise)h +(it)e(returns)j(sev)o(ere)f(status.)177 1665 y Fl(Syntax)21 +b(:)g(exists)g(=)g("exists")g(s)g(filename)177 1714 y(Example:)f(exists)h +(test6.fw)177 1812 y Fr(This)10 b(command)d(is)j(useful)g(in)g(regression)h +(testing)f(for)g(ensuring)g(that)g(F)m(unnelW)m(eb)g(has)g(pro)q(duced)h(a)f +(particular)177 1862 y(output)k(\014le.)177 1987 y Fo(3.15.7.11)48 +b(Fixeols)177 2083 y Fr(The)13 b Fl(fixeols)f Fr(command)e(tak)o(es)j(t)o(w)o +(o)f(\014lename)g(argumen)o(ts:)k(an)d(input)f(\014le)h(and)g(an)f(output)h +(\014le.)18 b(It)13 b(reads)g(in)177 2133 y(the)f(input)f(\014le)g(and)g +(writes)h(it)e(to)h(the)h(output)f(\014le)g(c)o(hanging)g(all)e(the)j(end)g +(of)e(line)h(con)o(trol)g(c)o(haracter)h(sequences)177 2183 +y(to)k(the)g(lo)q(cal)f(format.)22 b(It)15 b(can)h(also)f(tak)o(e)h(one)g +(\014lename)f(argumen)o(t,)f(in)h(whic)o(h)h(case)h(it)e(replaces)i(the)f +(target)177 2233 y(\014le)e(with)g(its)f(transformation.)177 +2331 y Fl(Syntax)43 b(:)21 b(fixeols)f(=)i("fixeols")e(s)i(filename)e([s)h +(filename])177 2380 y(Examples:)f(fixeols)g(imported.hak)g(result.kln)395 +2430 y(fixeols)g(sloth.dat)177 2528 y Fr(The)12 b Fl(fixeols)e +Fr(command)e(w)o(orks)k(b)o(y)f(parsing)g(the)h(input)f(\014le)g(in)o(to)g +(alternating)f(runs)i(of)f(prin)o(table)g(c)o(haracters)177 +2578 y(\(ASCI)q(I)i(20)f(to)g(ASCI)q(I)h(126\))e(and)i(runs)g(of)e(non-prin)o +(table)h(c)o(haracters)i(\(all)e(the)h(others\).)18 b(It)13 +b(then)g(parses)g(eac)o(h)177 2628 y(run)g(of)f(non-prin)o(table)f(c)o +(haracters)j(from)d(left)h(to)g(righ)o(t)g(in)o(to)f(subruns)j(of)e(non-prin) +o(tables)g(not)g(con)o(taining)f(the)177 2677 y(same)j(c)o(haracter)i(t)o +(wice.)22 b(It)15 b(then)g(replaces)h(eac)o(h)g(subrun)g(with)e(a)h(nativ)o +(e)f(EOL.)1479 2662 y Fg(6)1513 2677 y Fr(F)m(or)g(example,)f(if)i(a)f(nativ) +o(e)177 2727 y(EOL)g(is)g Fl(X)p Fr(,)f(and)h Fl(ABCD)f Fr(are)h(non-prin)o +(table)g(c)o(haracters,)h(and)f(the)g(\014le)g(to)g(b)q(e)g(con)o(v)o(erted)h +(is)p 177 2757 709 2 v 223 2783 a Ff(6)241 2795 y Fh(Note:)j(A)13 +b(nativ)o(e)f(EOL)h(can)g(b)q(e)f(inserted)f(in)o(to)h(a)h(text)f(\014le)g +(in)h(a)g(p)q(ortable)e(manner)f(simply)i(b)o(y)g(writing)g(\\)p +Fe(\\n)p Fh(")g(to)h(the)f(text)177 2835 y(output)e(stream.)1042 +2940 y Fr(96)p eop +%%Page: 97 98 +97 97 bop 177 42 a Fl(thisABisABCDanABAB)o(examp)o(leABC)o(CCof)18 +b(the)k(conversion.)177 173 y Fr(then)15 b Fl(fixeols)d Fr(w)o(ould)h(pro)q +(duce)177 304 y Fl(thisXisXanXXexampl)o(eXXXo)o(f)19 b(the)i(conversion.)177 +435 y Fr(The)c Fl(fixeols)e Fr(command)f(w)o(as)j(devised)g(to)g(solv)o(e)f +(the)i(problem)d(created)j(sometimes)d(when)i(text)g(\014les)g(are)177 +485 y(mo)o(v)o(ed)c(from)f(one)i(mac)o(hine)f(to)h(another)h(\(e.g.)e(with)h +(the)h(k)o(ermit)e(program\))f(using)i(a)g(binary)g(transfer)h(mo)q(de)177 +534 y(rather)j(than)f(a)g(text)h(transfer)g(mo)q(de.)27 b(If)17 +b(suc)o(h)h(a)f(transfer)h(is)f(made,)f(and)h(the)h(text)g(\014le)f(line)g +(termination)177 584 y(con)o(v)o(en)o(tions)f(di\013er)f(on)g(the)h(t)o(w)o +(o)f(mac)o(hines,)f(one)i(can)f(wind)g(up)h(with)f(a)g(set)h(of)f(text)h +(\014les)f(with)g(improp)q(erly)177 634 y(terminated)10 b(lines.)16 +b(This)10 b(can)g(cause)i(problems)d(on)h(a)f(n)o(um)o(b)q(er)h(of)f(fron)o +(ts,)h(but)h(in)e(particular)h(a\013ects)i(regression)177 684 +y(testing)h(whic)o(h)f(relies)h(hea)o(vily)e(on)h(exact)h(comparisons)e(b)q +(et)o(w)o(een)j(\014les.)k(The)12 b Fl(fixeols)f Fr(command)f(pro)o(vides)i +(a)177 734 y(solution)g(to)h(this)g(problem)f(b)o(y)h(pro)o(viding)f(a)h(p)q +(ortable)g(w)o(a)o(y)f(to)h(\\purify")f(text)i(\014les)f(whose)h(end)g(of)e +(lines)h(ha)o(v)o(e)177 783 y(b)q(ecome)h(incorrect.)20 b(The)14 +b(regression)i(testing)e(scripts)h(all)e(apply)h Fl(fixeols)e +Fr(to)i(their)g(input)g(and)g(output)g(\014les)177 833 y(b)q(efore)h(eac)o(h) +f(test.)177 985 y Fo(3.15.7.12)48 b(Fw)177 1095 y Fr(The)12 +b Fl(fw)g Fr(command)d(allo)o(ws)h(F)m(unnelW)m(eb)i(prop)q(er)g(to)g(b)q(e)h +(in)o(v)o(ok)o(ed)e(from)f(a)h(shell)h(script.)18 b(The)12 +b(syn)o(tax)g(is)g(almost)177 1145 y(iden)o(tical)h(to)h(the)h(syn)o(tax)e +(with)h(whic)o(h)g(F)m(unnelW)m(eb)f(is)h(in)o(v)o(ok)o(ed)f(from)f(the)j(op) +q(erating)e(system.)177 1276 y Fl(Syntax)43 b(:)21 b(fw)g(=)h("fw")f(s)h +(ordinary_funnelw)o(eb_c)o(omman)o(d_lin)o(e)177 1325 y(Examples:)e(fw)h +(sloth)g(+t)h(+d)395 1375 y(fw)f(-l)h(walrus)177 1506 y Fr(Some)13 +b(imp)q(ortan)o(t)f(p)q(oin)o(ts)i(ab)q(out)g(this)f Fl(fw)h +Fr(command)d(are:)239 1637 y Fq(\017)21 b Fr(Options)14 b(are)g(inherited)h +(from)d(the)i(default)g(shell)g(options.)239 1732 y Fq(\017)21 +b Fr(The)14 b Fl(F)g Fr(\(input)g(\014le)g(option\))f(m)o(ust)g(b)q(e)h +(turned)h(on.)239 1827 y Fq(\017)21 b Fr(The)14 b Fl(K)p Fr(,)f +Fl(H)p Fr(,)h(and)f Fl(X)h Fr(options)f(m)o(ust)g(b)q(e)i(turned)g(o\013.)239 +1922 y Fq(\017)21 b Fr(The)14 b Fl(J)g Fr(option)f(m)o(ust)g(b)q(e)h(turned)h +(o\013.)239 2017 y Fq(\017)21 b Fr(The)14 b(options)g(sp)q(eci\014ed)h(in)f +(a)f Fl(fw)h Fr(command)d(do)i(not)h(a\013ect)h(the)g(default)e(shell)h +(options.)239 2112 y Fq(\017)21 b Fr(This)14 b(command)d(p)q(erforms)i(no)h +(action)f(in)h(the)g(V)-5 b(AX)15 b(VMS)f(v)o(ersion)g(of)f(F)m(unnelW)m(eb.) +177 2263 y Fo(3.15.7.13)48 b(Help)177 2373 y Fr(The)16 b Fl(help)f +Fr(command)d(pro)o(vides)k(online)f(help)g(from)f(within)g(the)i(F)m(unnelW)m +(eb)f(shell.)23 b(It)15 b(pro)o(vides)h(access)h(to)177 2423 +y(all)c(of)g(the)i(same)e(messages)h(that)f(the)i Fl(+H)e Fr(command)f(line)h +(option)g(do)q(es.)177 2554 y Fl(Syntax)43 b(:)21 b(help)g(=)h("help")e([s)i +(help_message_na)o(me])177 2604 y(Examples:)e(help)395 2654 +y(help)h(commands)177 2785 y Fr(If)14 b(no)h(message)f(name)g(is)g(giv)o(en,) +g(the)h(default)g(message)f(is)h(displa)o(y)o(ed.)k(It)c(con)o(tains)g(a)f +(list)g(of)g(the)h(other)h(help)177 2835 y(messages)e(and)g(their)g(names.)j +(The)e(actual)e(messages)h(themselv)o(es)g(are)g(not)g(listed)g(here.)1042 +2940 y(97)p eop +%%Page: 98 99 +98 98 bop 177 42 a Fo(3.15.7.14)48 b(Here)177 147 y Fr(The)19 +b Fl(here)e Fr(command)e(acts)j(as)g(a)g(target)g(for)g(the)g +Fl(skipto)f Fr(command.)27 b(When)18 b(the)h(shell)f(in)o(terpreter)h(en-)177 +197 y(coun)o(ters)h(a)e Fl(skipto)g Fr(command,)e(it)i(ignores)h(all)e(the)i +(follo)o(wing)d(commands)g(un)o(til)i(it)g(encoun)o(ters)i(a)f +Fl(here)177 247 y Fr(command.)177 371 y Fl(Syntax)i(:)g(here)g(=)h("here")177 +421 y(Example:)e(here)177 545 y Fr(The)14 b Fl(skipto)p Fr(/)p +Fl(here)c Fr(mec)o(hanism)h(w)o(as)i(created)i(to)e(allo)o(w)e(groups)i(of)g +(regression)h(tests)h(to)e(b)q(e)g(skipp)q(ed)h(during)177 +595 y(debugging)f(without)h(ha)o(ving)f(to)h(commen)o(t)d(them)i(out.)18 +b(F)m(or)c(more)f(information,)d(see)15 b(Section)g(3.15.7.18.)177 +737 y Fo(3.15.7.15)48 b(Quit)177 843 y Fr(The)14 b Fl(quit)f +Fr(command)e(terminates)i(F)m(unnelW)m(eb)g(immediately)d(and)k(returns)h +(con)o(trol)e(to)h(the)g(op)q(erating)f(sys-)177 893 y(tem.)k(This)d(applies) +g(regardless)h(of)e(the)i(depth)f(of)f(the)i(script)g(b)q(eing)e(executed.) +177 1017 y Fl(Syntax)21 b(:)g(quit)g(=)h("quit")177 1067 y(Example:)e(quit) +177 1209 y Fo(3.15.7.16)48 b(Set)177 1315 y Fr(The)15 b Fl(set)e +Fr(command)f(mo)q(di\014es)h(the)i(default)f(shell)g(options.)k(F)m(or)c +(example,)f Fl(set)21 b(+t)14 b Fr(sets)h(the)g Fl(+t)f Fr(option)f(for)177 +1365 y(all)g(subsequen)o(t)i(F)m(unnelW)m(eb)f(runs)g(within)g(the)g(shell)g +(un)o(til)f(another)h(set)h(command)c(sets)k Fl(-t)p Fr(.)177 +1489 y Fl(Syntax)43 b(:)21 b(set)g(=)h("set")f(s)g(ordinary_funnelweb)o +(_comm)o(and_l)o(ine)177 1539 y(Examples:)f(set)h(sloth)g(+t)g(+d)395 +1589 y(set)g(-lwalrus)177 1713 y Fr(The)c(restrictions)g(on)f(the)h +Fl(set)e Fr(command)e(are)k(iden)o(tical)e(to)h(those)h(on)f(the)h +Fl(fw)e Fr(command)e(except)18 b(that,)e(in)177 1763 y(addition,)c(the)j +Fl(+F)e Fr(option)g(cannot)i(b)q(e)f(turned)h(on)f(in)f(the)i +Fl(set)e Fr(command.)177 1840 y(The)f(set)h(command)c(is)j(useful)g(for)f +(setting)i(option)e(defaults)h(b)q(efore)g(a)g(long)f(run)h(of)f(regression)i +(tests.)19 b(It)12 b(could)177 1890 y(also)h(b)q(e)g(useful)h(to)f(set)h +(default)f(options)f(in)h(a)g(F)m(unnelW)m(eb)f(shell)h(k)o(ept)h(b)o(y)f(a)g +(user)h(in)f(a)f(w)o(orkstation)h(windo)o(w.)177 2033 y Fo(3.15.7.17)48 +b(Sho)o(w)177 2139 y Fr(The)14 b Fl(show)f Fr(command)e(displa)o(ys)j(the)g +(curren)o(t)h(default)f(shell)f(options.)18 b(These)d(options)f(are)g(the)g +(options)g(that)177 2189 y(subsequen)o(t)i Fl(fw)d Fr(commands)f(will)g +(inherit.)177 2313 y Fl(Syntax)21 b(:)g(show)g(=)h("show")177 +2362 y(Example:)e(show)177 2505 y Fo(3.15.7.18)48 b(Skipto)177 +2611 y Fr(The)14 b Fl(skipto)f Fr(command)e(causes)k(the)g(shell)e(to)h +(ignore)g(all)e(subsequen)o(t)k(commands)11 b(un)o(til)i(a)h +Fl(here)f Fr(command)177 2661 y(is)h(encoun)o(tered.)177 2785 +y Fl(Syntax)43 b(:)21 b(skipto)g(=)g("skipto")177 2835 y(Examples:)f(skipto) +1042 2940 y Fr(98)p eop +%%Page: 99 100 +99 99 bop 177 42 a Fr(The)14 b Fl(skipto)p Fr(/)p Fl(here)c +Fr(mec)o(hanism)h(w)o(as)i(created)i(to)e(allo)o(w)e(groups)i(of)g +(regression)h(tests)h(to)e(b)q(e)g(skipp)q(ed)h(during)177 +91 y(debugging)c(without)f(ha)o(ving)g(to)h(commen)o(t)e(them)h(out.)17 +b(It)10 b(is)g(lik)o(e)f(a)h(cut)g(price)h Fl(goto)p Fr(.)16 +b(F)m(or)10 b(example,)f(supp)q(osing)177 141 y(that)15 b(there)h(w)o(ere)f +(eigh)o(t)g(tests)h(and)e(that)h(y)o(ou)f(had)h(debugged)g(the)g(\014rst)h +(\014v)o(e.)k(Y)m(ou)14 b(migh)o(t)f(w)o(an)o(t)h(to)h(skip)f(the)177 +191 y(\014rst)i(\014v)o(e)f(tests)h(so)g(that)f(y)o(ou)f(can)h(concen)o +(trate)i(on)e(the)g(next)h(three.)22 b(The)16 b(follo)o(wing)c(co)q(de)k(sho) +o(ws)f(ho)o(w)g(this)177 241 y(can)f(b)q(e)h(done.)177 359 +y Fl(skipto)177 409 y(execute)21 b(test)f(infile1)177 459 y(execute)h(test)f +(infile2)177 509 y(execute)h(test)f(infile3)177 559 y(execute)h(test)f +(infile4)177 608 y(execute)h(test)f(infile5)177 658 y(here)177 +708 y(execute)h(test)f(infile6)177 758 y(execute)h(test)f(infile7)177 +808 y(execute)h(test)f(infile8)177 926 y Fr(It)15 b(should)f(b)q(e)h +(stressed)i(that)d(F)m(unnelW)m(eb)g(p)q(erforms)g(full)f(command)f(line)i +(pro)q(cessing)h(including)f(the)h(dollar)177 976 y(substitutions)i(b)q +(efore)g(testing)f(the)h(line)f(to)g(see)h(if)f(it)g(is)g Fl(here)p +Fr(.)24 b(This)16 b(can)g(lead)g(to)g(non-ob)o(vious)f(problems.)177 +1026 y(F)m(or)f(example.)177 1144 y Fl(skipto)177 1194 y(!)22 +b(Test)f(the)g(Parser)177 1244 y(!)h(---------------)177 1294 +y(define)f(X)g("execute)f(parsertest.fws")177 1344 y($X)i(infile1)177 +1393 y($X)g(infile2)177 1443 y($X)g(infile3)177 1493 y($X)g(infile4)177 +1543 y($X)g(infile5)177 1593 y(here)177 1711 y Fr(The)14 b(ab)q(o)o(v)o(e)e +(lo)q(oks)h(correct,)h(but,)f(b)q(ecause)i(the)e Fl(define)f +Fr(command)e(isn't)j(executed)h(\(and)f Fl($X)g Fr(is)g(not)g(de\014ned\))177 +1761 y(the)h(subsequen)o(t)g Fl($X)f Fr(lines)g(result)g(in)g(a)f(leading)g +(blanks)h(error.)18 b(The)c(problem)d(can)j(b)q(e)f(corrected)i(b)o(y)e +(de\014ning)177 1811 y Fl($X)h Fr(b)q(efore)g(the)h Fl(skipto)d +Fr(command.)177 1947 y Fo(3.15.7.19)48 b(Status)177 2050 y +Fr(The)20 b Fl(status)e Fr(command)f(tak)o(es)i(t)o(w)o(o)g(forms.)33 +b(In)20 b(its)f(\014rst)h(form)e(in)h(whic)o(h)g(no)g(argumen)o(ts)g(are)g +(giv)o(en,)h(it)177 2099 y(writes)13 b(out)f(the)h(n)o(um)o(b)q(er)e(of)h(w)o +(arnings,)g(errors)h(and)f(sev)o(ere)i(errors)g(that)e(1\))g(w)o(ere)h +(generated)h(b)o(y)e(the)g(previous)177 2149 y(command)j(and)j(2\))g(ha)o(v)o +(e)f(b)q(een)i(generated)g(during)f(the)g(en)o(tire)h(shell)f(in)o(v)o(o)q +(cation.)28 b(In)18 b(its)g(second)h(form)d(it)177 2199 y(tak)o(es)d(from)d +(one)j(to)f(three)h(argumen)o(ts)f(eac)o(h)g(of)g(whic)o(h)g(sp)q(eci\014es)i +(a)e(diagnostic)g(sev)o(erit)o(y)h(and)f(a)g(n)o(um)o(b)q(er.)k(The)177 +2249 y Fl(status)e Fr(command)e(compares)j(eac)o(h)g(of)g(these)h(n)o(um)o(b) +q(ers)f(with)g(the)g(n)o(um)o(b)q(er)g(of)f(that)h(diagnostic)f(generated)177 +2299 y(b)o(y)g(the)g(previous)h(command)c(and)i(generates)j(a)d(sev)o(ere)j +(error)f(if)e(they)h(di\013er.)177 2417 y Fl(Syntax)43 b(:)21 +b(status)g(=)g("status")f({s)i(\("w"|"e"|"s"\))d(num}0..3)177 +2467 y(Examples:)h(status)395 2517 y(status)h(w1)g(e5)g(s1)395 +2567 y(status)g(w4)395 2616 y(status)g(s1)g(e2)177 2735 y Fr(The)15 +b Fl(status)d Fr(command)g(w)o(as)h(in)o(tro)q(duced)i(to)f(test)h(the)g +(status)f(results)i(of)d(commands)f(during)h(their)i(debug-)177 +2785 y(ging.)i(It)c(is)g(also)f(useful)h(for)g(c)o(hec)o(king)h(to)e(see)j +(that)e(the)g(righ)o(t)g(n)o(um)o(b)q(er)f(of)h(diagnostics)f(ha)o(v)o(e)h(b) +q(een)h(generated)177 2835 y(at)g(particular)g(p)q(oin)o(ts)f(in)h(test)h +(scripts.)1042 2940 y(99)p eop +%%Page: 100 101 +100 100 bop 177 42 a Fo(3.15.7.20)48 b(T)l(olerate)177 141 +y Fr(The)15 b Fl(tolerate)e Fr(command)f(instructs)k(the)f(shell)f(not)g(to)h +(ab)q(ort)f(pro)q(cessing)i(of)e(the)h(script)g(if)f(the)h(next)g(com-)177 +191 y(mand)c(generates)k(one)e(or)g(more)f(w)o(arnings,)g(errors,)i(or)f(sev) +o(ere)h(errors.)19 b(F)m(or)13 b(the)g(purp)q(oses)i(of)d(this)h(command,)177 +241 y(a)g(blank)f(line)h(coun)o(ts)g(as)h(a)e(command,)e(so)j(b)q(e)h(sure)g +(to)f(place)g(the)h Fl(tolerate)d Fr(command)g(imm)o(ediately)f(ab)q(o)o(v)o +(e)177 291 y(the)15 b(command)c(ab)q(out)j(whic)o(h)f(y)o(ou)h(wish)f(to)h(b) +q(e)h(toleran)o(t.)177 401 y Fl(Syntax)21 b(:)g(tolerate)f(=)i("tolerate")177 +451 y(Example:)e(tolerate)177 561 y Fr(The)15 b(tolerate)f(command)d(w)o(as)j +(in)o(tro)q(duced)h(to)e(allo)o(w)g(F)m(unnelW)m(eb)g(\(i.e.)g(the)i +Fl(fw)e Fr(command\))e(to)j(b)q(e)h(tested)g(in)177 611 y(a)f(script)g(under) +h(conditions)f(whic)o(h)f(w)o(ould)h(normally)d(cause)k(it)e(to)h(ab)q(ort)g +(the)g(script.)177 741 y Fo(3.15.7.21)48 b(T)l(race)177 841 +y Fr(The)13 b Fl(trace)e Fr(command)e(turns)k(on)f(or)g(o\013)g(command)d +(tracing)j(during)g(script)h(execution.)18 b(By)12 b(default,)g(tracing)177 +891 y(is)i(turned)h(o\013.)177 1001 y Fl(Syntax)43 b(:)21 b(trace)g(=)g +("trace")g([s)g(\("on")g(|)h("off"\)])177 1051 y(Examples:)e(trace)h(on)395 +1101 y(trace)g(off)177 1211 y Fr(The)14 b Fl(trace)f Fr(command)e(w)o(as)j +(in)o(tro)q(duced)h(to)f(assist)g(in)f(the)i(debugging)e(of)h(regression)h +(test)g(scripts.)177 1342 y Fo(3.15.7.22)48 b(W)l(rite)177 +1441 y Fr(The)15 b Fl(write)e Fr(command)f(accepts)k(a)e(double-quoted)h +(argumen)o(t)e(and)h(writes)i(it)e(follo)o(w)o(ed)f(b)o(y)h(an)g(EOL)h(to)f +(the)177 1491 y(console)k(\(standard)g(output\).)29 b(There)19 +b(is)e(no)g(need)h(to)g(double)f(an)o(y)g(double)g(quotes)h(o)q(ccurring)g +(within)f(the)177 1541 y(string.)177 1651 y Fl(Syntax)43 b(:)21 +b(write)g(=)g("write")g(s)g(string)177 1701 y(Examples:)f(write)h("Now)g +(about)g(to)g(start)g(the)g(next)g(test.")395 1751 y(write)g("You)g(don't)g +(need)g(to)g(")h(double)e(enclosed)g(double)h(quotes.")177 +1861 y Fr(The)13 b Fl(write)f Fr(command)d(w)o(as)k(added)f(so)h(as)g(to)f +(allo)o(w)f(regression)j(testing)e(scripts)i(to)e(inform)f(the)i(user)g(of)f +(their)177 1911 y(progress.)177 2041 y Fo(3.15.7.23)48 b(W)l(riteu)177 +2141 y Fr(The)14 b Fl(writeu)e Fr(command)e(is)j(iden)o(tical)g(to)g(the)h +Fl(write)e Fr(command)e(except)15 b(that)e(it)g(underlines)h(the)g(text)g(on) +f(an)177 2191 y(additional)f(follo)o(wing)f(output)k(line.)177 +2301 y Fl(Syntax)43 b(:)21 b(writeu)g(=)g("writeu")f(s)i(string)177 +2351 y(Examples:)e(writeu)h("Test)f(6")177 2511 y Fi(3.16)70 +b(Concluding)22 b(Remarks)177 2625 y Fr(This)d(c)o(hapter)i(de\014nes)f(the)g +(seman)o(tics)f(of)f(the)i(F)m(unnelW)m(eb)f(program.)32 b(As)20 +b(stated)g(at)f(the)h(start)g(of)f(this)177 2675 y(c)o(hapter,)g(this)f(do)q +(cumen)o(t)f(tak)o(es)h(precedence)i(o)o(v)o(er)e(the)g(F)m(unnelW)m(eb)f +(program.)27 b(While)17 b(the)h(de\014nition)f(of)177 2725 +y(F)m(unnelW)m(eb)12 b(in)h(this)g(c)o(hapter)g(is)g(reasonably)g(solid,)e +(it)i(is)f(far)h(from)e(w)o(atertigh)o(t,)h(and)h(it)f(is)h(hop)q(ed)g(that)g +(it)g(can)177 2774 y(b)q(e)g(tigh)o(tened)g(further)g(in)f(future)h(v)o +(ersions.)18 b(All)12 b(constructiv)o(e)i(criticism)d(will)g(b)q(e)i +(gratefully)e(receiv)o(ed)j(b)o(y)e(the)177 2824 y(author)i(Ross)g(William)o +(s)d(\()p Fl(ross@spam.adelaide.)o(edu.a)o(u)p Fr(\).)1032 +2940 y(100)p eop +%%Page: 101 102 +101 101 bop 177 376 a Fj(Chapter)34 b(4)177 607 y Fp(F)-10 +b(unnelW)g(eb)41 b(Installation)177 846 y Fr(This)14 b(c)o(hapter)h(describ)q +(es)h(ho)o(w)d(to)h(obtain,)f(compile,)e(and)j(install)f(F)m(unnelW)m(eb.)k +(Y)m(ou)d(will)e(need:)239 955 y Fq(\017)21 b Fr(FTP)14 b(access)i(to)e(the)g +(in)o(ternet)h Fm(or)e Fr(a)h(F)m(unnelW)m(eb)f(distribution)h(kit)f(on)h +(disk.)239 1037 y Fq(\017)21 b Fr(A)d(Sun,)h(VMS)g(V)-5 b(AX,)18 +b(Macin)o(tosh,)h(or)f(PC)h Fm(or)f Fr(lots)g(of)f(extra)i(time)e(to)h(p)q +(ort)h(F)m(unnelW)m(eb)e(to)h(a)g(new)281 1086 y(platform.)239 +1168 y Fq(\017)j Fr(Ab)q(out)15 b(four)f(megab)o(ytes)g(of)g(free)h(disk)f +(space.)21 b(Y)m(ou)14 b(migh)o(t)e(b)q(e)j(able)g(to)f(install)f(it)h(with)h +(less,)f(but)h(four)281 1217 y(megab)o(ytes)f(is)h(safe.)21 +b(The)15 b(distribution)f(kit)h(itself)f(is)h(ab)q(out)f(t)o(w)o(o)h(and)f(a) +h(half)f(megab)o(ytes.)20 b(If)14 b(y)o(ou)g(are)281 1267 y(short)d(on)g +(space,)h(y)o(ou)f(can)g(thro)o(w)g(a)o(w)o(a)o(y)f(ev)o(erything)h(after)g +(installation)e(except)k(the)e(binary)g(executable)281 1317 +y(whic)o(h)j(will)e(consume)i(ab)q(out)f(half)g(a)h(megab)o(yte.)239 +1398 y Fq(\017)21 b Fr(A)14 b(C)g(compiler.)239 1479 y Fq(\017)21 +b Fr(An)16 b(acquain)o(tance)h(with)f(the)h(C)f(programming)d(language)j(and) +g(the)h(abilit)o(y)d(to)j(compile)d(and)i(link)g(C)281 1529 +y(programs)d(on)g(y)o(our)h(mac)o(hine.)239 1610 y Fq(\017)21 +b Fr(Elemen)o(tary)13 b(systems)h(programming)c(kno)o(wledege)k(for)g(y)o +(our)g(mac)o(hine.)239 1692 y Fq(\017)21 b Fr(Ab)q(out)14 b(an)g(hour.)177 +1802 y(Y)m(ou)f(will)f Fm(not)i Fr(need)g(an)o(y)f(sort)h(of)f(system)g +(privileges)h(to)f(install)f(F)m(unnelW)m(eb,)h(unless)h(y)o(ou)f(w)o(an)o(t) +g(the)h(F)m(unnel-)177 1851 y(W)m(eb)g(command)d Fl(fw)i Fr(to)h(b)q(e)g +(automatically)d(a)o(v)n(ailable)h(to)i(ev)o(ery)o(one)g(on)g(y)o(our)g(mac)o +(hine)e(as)i(w)o(ell)f(as)h(y)o(ourself.)177 2011 y Fi(4.1)70 +b(Obtaining)22 b(a)h(Cop)n(y)g(of)h(F)-6 b(unnelW)g(eb)177 +2125 y Fr(The)14 b(simplest)f(w)o(a)o(y)h(to)f(obtain)g(a)h(cop)o(y)g(of)f(F) +m(unnelW)m(eb)h(is)f(b)o(y)h(anon)o(ymous)e(FTP)i(from:)243 +2235 y Fl(Machine)63 b(:)22 b(sirius.itd.adelaid)o(e.edu)o(.au)c +([IP=129.127.40.3].)243 2285 y(Directory)h(:)j(~pub/funnelweb/)62 +b(\(or)22 b(a)f(directory)f(of)h(similar)g(name\).)177 2395 +y Fr(It)d(is)f(not)g(clear)h(at)f(the)h(time)e(of)h(writing)g(whether)h(F)m +(unnelW)m(eb)f(will)f(b)q(e)i(presen)o(ted)h(as)f(a)f(\\)p +Fl(.tar)p Fr(")f(\014le,)i(or)177 2444 y(as)e(a)g(directory)h(tree,)g(or)f(b) +q(oth.)25 b(Just)17 b(sni\013)f(around)g(and)g(use)g(y)o(our)g(common)d +(sense.)27 b(Tw)o(o)15 b(p)q(oin)o(ts)h(deserv)o(e)177 2494 +y(atten)o(tion)e(ho)o(w)o(ev)o(er:)228 2604 y(1.)20 b(Be)15 +b(sure)g(to)f(use)h(the)f Fm(text)g Fr(transfer)h(mo)q(de)e(whenev)o(er)j(y)o +(ou)d(transfer)i(ra)o(w)f(F)m(unnelW)m(eb)g(\014les.)19 b(Ho)o(w)o(ev)o(er,) +281 2654 y(y)o(ou)13 b(should)h(use)h Fm(binary)f Fr(mo)q(de)e(for)i(T)m(AR)f +(\014les)h(and)g(other)h(conglomerate)d(represen)o(tations.)228 +2735 y(2.)20 b(If)13 b(y)o(ou)g(ha)o(v)o(e)g(to)g(transfer)i(the)f(\014les)f +(individually)m(,)d(don't)j(lump)f(all)g(the)i(F)m(unnelW)m(eb)f(\014les)g +(in)o(to)g(a)g(single)281 2785 y(directory)m(.)20 b(Refer)14 +b(to)h(the)g(sections)g(that)f(follo)o(w)f(for)h(information)d(on)j(the)h +(directory)g(tree)h(y)o(ou)e(should)281 2835 y(create)h(to)f(receiv)o(e)h +(the)g(F)m(unnelW)m(eb)e(\014les.)1032 2940 y(101)p eop +%%Page: 102 103 +102 102 bop 177 42 a Fr(If)13 b(anon)o(ymous)f(FTP)h(is)g(not)h(a)o(v)n +(ailable)d(to)i(y)o(ou,)f(con)o(tact)i(the)g(author)f(for)g(up-to-date)h +(information)c(on)j(other)177 91 y(c)o(hannels)i(of)e(distribution.)243 +207 y Fl(Name:)42 b(Dr)21 b(Ross)g(N.)h(Williams)243 257 y(Email:)e +(ross@spam.adelaide)o(.edu.)o(au)243 307 y(Snail:)g(16)h(Lerwick)g(Avenue,)f +(Hazelwood)g(Park)h(5066,)g(Australia.)177 468 y Fi(4.2)70 +b(Establishing)21 b(The)i(Directory)f(T)-6 b(ree)177 584 y +Fr(A)o(t)15 b(this)g(stage,)f(w)o(e)h(will)e(assume)h(that)h(y)o(ou)f(ha)o(v) +o(e)h(someho)o(w)e(obtained)h(a)h(set)g(of)f(\014les)h(that)g(are)g(supp)q +(osed)h(to)177 634 y(b)q(e)f(F)m(unnelW)m(eb,)f(and)h(that)f(they)i(are)f +(sitting)f(on)g(a)h(disk)f(on)h(the)g(mac)o(hine)e(on)i(whic)o(h)f(y)o(ou)g +(wish)h(to)f(compile)177 684 y(and)g(install)f(F)m(unnelW)m(eb.)177 +758 y(The)f(\014rst)g(thing)f(y)o(ou)f(ha)o(v)o(e)h(to)g(do)g(is)h(to)f(mak)o +(e)e(sure)k(that)e(the)h(F)m(unnelW)m(eb)e(directory)i(tree)h(has)e(b)q(een)i +(correctly)177 808 y(unpac)o(k)o(ed.)19 b(The)14 b(directory)h(tree)g(should) +e(lo)q(ok)g(lik)o(e)g(this.)243 924 y Fl(fwdir)151 b(-)22 b(Root)f(FunnelWeb) +f(directory.)308 973 y(admin)86 b(-)22 b(Administrative)d(files.)308 +1023 y(answers)42 b(-)22 b(Answers)e(to)h(test)g(suite.)308 +1073 y(hackman)42 b(-)22 b(FunnelWeb)e(Hacker's)g(Manual.)308 +1123 y(results)42 b(-)22 b(For)f(test)g(results.)308 1173 y(scripts)42 +b(-)22 b(Test)f(scripts.)308 1222 y(sources)42 b(-)22 b(Source)e(code.)308 +1272 y(tests)86 b(-)22 b(Test)f(suite.)308 1322 y(userman)42 +b(-)22 b(FunnelWeb)e(User's)g(Manual.)177 1438 y Fr(The)e(follo)o(wing)d +(sections)j(describ)q(e)i(the)e(con)o(ten)o(ts)g(of)f(eac)o(h)h(directory)g +(in)f(alphab)q(etical)g(order.)29 b(Chec)o(k)18 b(the)177 1488 +y(con)o(ten)o(ts)g(to)f(mak)o(e)e(sure)j(that)f(y)o(ou)g(ha)o(v)o(e)f(ev)o +(erything.)28 b(Do)16 b(not)h(b)q(ecome)g(fussed)h(if)e(y)o(our)g +(con\014guration)h(is)177 1537 y(not)d(quite)f(as)h(sp)q(eci\014ed)h(as)e(it) +g(is)h(v)o(ery)g(easy)g(for)f(installation)e(guides)j(suc)o(h)g(as)g(this)f +(one)h(to)g(go)f(out)g(of)g(date)h(as)177 1587 y(minor)g(last)h(min)o(ute)f +(c)o(hanges)i(and)g(up)q(dates)g(are)g(made)f(to)g(the)h(distribution)f(kit.) +22 b(Chec)o(k)17 b(the)f(source)h(from)177 1637 y(whic)o(h)d(y)o(ou)f +(obtained)h(the)g(kit,)f(and)h(if)f(it)h(is)f(di\013eren)o(t)i(to)q(o,)e(pro) +q(ceed.)177 1778 y Fd(4.2.1)55 b(Admin)18 b(Directory)177 1879 +y Fr(The)c Fl(admin)e Fr(directory)i(con)o(tains)f(administrativ)o(e)e +(\014les)j(to)f(do)g(with)g(licensing)g(and)g(suc)o(h.)18 b(It)c(is)f(also)f +(a)h(catc)o(h-)177 1929 y(all)e(directory)i(for)e(\014les)i(that)f(don't)f(b) +q(elong)h(an)o(ywhere)g(else.)18 b(A)o(t)12 b(the)h(time)e(of)g(writing,)g +(it)h(is)f(not)h(clear)h(exactly)177 1979 y(what)h(will)e(b)q(e)j(in)e(the)i +Fl(admin)e Fr(directory)m(.)18 b(Wh)o(y)13 b(not)h(tak)o(e)g(a)g(lo)q(ok?)177 +2120 y Fd(4.2.2)55 b(Answ)n(ers)20 b(Directory)177 2221 y Fr(The)13 +b Fl(answers)f Fr(directory)h(con)o(tains)g(the)g(\\correct)h(answ)o(ers")g +(to)f(all)e(the)j(regression)g(testing)f(input)f(\014les.)18 +b(The)177 2271 y(regression)d(test)g(scripts)g(compare)e(these)j(\014les)e +(to)g(the)g(\014les)g(generated)i(in)d(the)i Fl(results)d Fr(directory)m(.) +177 2386 y Fl(an01.lis)20 b(...)h(an04.lis)177 2436 y(ex01.lis)f(...)h +(ex16.lis)177 2486 y(ex01.out)f(...)h(ex10.out)177 2536 y(ex11.tex)f(...)h +(ex16.tex)177 2586 y(generate.lis)177 2635 y(hi01.lis)f(...)h(hi10.lis)177 +2685 y(hi01.out)f(...)h(hi05.out)177 2735 y(hi06a.out)177 2785 +y(hi06b.out)177 2835 y(hi07a.out)1032 2940 y Fr(102)p eop +%%Page: 103 104 +103 103 bop 177 42 a Fl(hi07b.out)177 91 y(hi08.out)20 b(...)h(hi10.out)177 +141 y(pr01.lis)f(...)h(pr10.lis)177 191 y(sc01.lis)f(...)h(sc29.lis)177 +241 y(tg01.lis)f(...)h(tg09.lis)177 291 y(tg01.out)f(...)h(tg09.out)177 +340 y(wv01.lis)f(...)h(wv06.lis)177 390 y(wv01.tex)f(...)h(wv06.tex)177 +532 y Fd(4.2.3)55 b(Hac)n(kman)18 b(Directory)177 634 y Fr(The)c +Fl(hackman)f Fr(directory)i(con)o(tains)e(the)i Fl(.tex)e Fr(\014les)h(that)g +(mak)o(e)e(up)i(the)h Fm(F)m(unnelWeb)h(Hacker's)e(Manual)p +Fr(.)177 750 y Fl(h_ch0.tex)107 b(-)22 b(Preface,)e(etc.)177 +800 y(h_ch1.tex)107 b(-)22 b(Design.)177 850 y(h_ch2.tex)107 +b(-)22 b(Implementation.)177 900 y(h_ch3.tex)107 b(-)22 b(Modification.)177 +949 y(h_ch4.tex)107 b(-)22 b(Future.)177 999 y(h_cha.tex)107 +b(-)22 b(Appendices.)177 1049 y(h_manual.tex)41 b(-)22 b(Main)f(TeX)g(file.) +177 1166 y Fr(See)15 b(the)f(commen)o(t)e(at)h(the)i(top)e(of)h +Fl(h)p 769 1166 14 2 v 15 w(manual.tex)e Fr(\014le)h(for)h(instructions)g(on) +g(ho)o(w)f(to)h(t)o(yp)q(eset)h(and)f(prin)o(t)f(the)177 1216 +y Fm(F)m(unnelWeb)j(Hacker's)f(Manual)p Fr(.)177 1290 y(There)j(is)e(no)h +(need)g(to)g(read)g(or)g(prin)o(t)f(the)h Fm(F)m(unnelWeb)i(Hacker's)e +(Manual)g Fr(unless)h(y)o(ou)e(in)o(tend)h(to)f(mo)q(dify)177 +1340 y(F)m(unnelW)m(eb.)177 1482 y Fd(4.2.4)55 b(Results)18 +b(Directory)177 1584 y Fr(The)f Fl(results)f Fr(directory)h(exists)g(as)g(a)g +(target)g(directory)g(for)g(the)g(output)g(\014les)g(generated)h(b)o(y)e(F)m +(unnelW)m(eb)177 1633 y(during)d(regression)i(testing.)j(This)13 +b(directory)h(is)g(distributed)f(empt)o(y)g(and)g(should)g(b)q(e)h(empt)o(y)e +(at)h(the)h(start)g(of)177 1683 y(regression)i(testing.)22 +b(Ho)o(w)o(ev)o(er,)15 b(it)f(is)h(p)q(ermissible)f(for)h(the)g +Fl(results)e Fr(directory)j(to)f(con)o(tain)f(\014les)h(generated)177 +1733 y(during)i(a)f(previous)h(test)h(run,)g(as)f(the)g(regression)h(testing) +g(scripts)g(delete)g(sp)q(eci\014c)g(un)o(w)o(an)o(ted)f(\014les)g(b)q(efore) +177 1783 y(eac)o(h)e(test)g(an)o(yw)o(a)o(y)m(.)177 1925 y +Fd(4.2.5)55 b(Scripts)19 b(Directory)177 2026 y Fr(The)h Fl(scripts)e +Fr(directory)i(stores)h(the)f(F)m(unnelW)m(eb)f(command)e(shell)i(scripts)i +(that)e(are)h(used)g(to)g(p)q(erform)177 2076 y(regression)15 +b(testing.)177 2193 y Fl(master.fws)85 b(-)22 b(The)f(master)g(test)g +(script.)f(This)h(is)g(the)g(one)h(you)f(run.)177 2243 y(test_gen.fws)41 +b(-)22 b(Script)e(to)i(generate)e(certain)g(tricky)h(input)g(files.)177 +2292 y(test_l.fws)85 b(-)22 b(Test)f(FunnelWeb)f(with)h(+L.)177 +2342 y(test_ld.fws)63 b(-)22 b(Test)f(FunnelWeb)f(with)h(+L)g(+B...)177 +2392 y(test_lo.fws)63 b(-)22 b(Test)f(FunnelWeb)f(with)h(+L)g(+O.)177 +2442 y(test_lo2.fws)41 b(-)22 b(Test)f(FunnelWeb)f(with)h(+L)g(+O)g(\(two)g +(output)g(files\).)177 2492 y(test_lot.fws)41 b(-)22 b(Test)f(FunnelWeb)f +(with)h(+L)g(+O)g(+T.)177 2541 y(test_lt.fws)63 b(-)22 b(Test)f(FunnelWeb)f +(with)h(+L)g(+T.)177 2683 y Fd(4.2.6)55 b(Sources)19 b(Directory)177 +2785 y Fr(The)g Fl(sources)d Fr(directory)j(con)o(tains)f Fm(al)r(l)f +Fr(of)g(the)i(C)f(source)h(\014les)f(required)h(to)f(build)f(a)h(F)m(unnelW)m +(eb)f(binary)177 2835 y(executable.)i(In)14 b(the)h(follo)o(wing)c(list,)i +(\014les)h(giv)o(en)g(without)f(an)h(extension)g(represen)o(t)j(b)q(oth)d +Fl(.c)f Fr(and)h Fl(.h)f Fr(\014les.)1032 2940 y(103)p eop +%%Page: 104 105 +104 104 bop 177 42 a Fl(analyse)151 b(-)22 b(The)f(analyser.)177 +91 y(as)261 b(-)22 b(Assertions.)177 141 y(clock)195 b(-)22 +b(A)f(clock)g(abstraction.)177 191 y(command)151 b(-)22 b(The)f(shell)g +(command)f(interpreter.)177 241 y(data)217 b(-)22 b(Shared)e(data)h +(structures)f(and)h(global)g(variables.)177 291 y(dump)217 +b(-)22 b(Functions)e(to)h(dump)g(internal)f(data)h(structures.)177 +340 y(environ.h)107 b(-)22 b(Lightweight)d(machine-dependent,)f +(program-independent)g(header.)177 390 y(help)217 b(-)22 b(Module)e(to)i +(write)f(out)g(help)g(messages.)177 440 y(help_gnu)129 b(-)22 +b(Function)e(to)h(write)g(out)g(the)g(GNU)h(license.)177 490 +y(help_gnu.txt)41 b(-)22 b(The)f(GNU)g(license)g(in)g(text)g(form.)177 +540 y(help_gnu.ctx)41 b(-)22 b(The)f(GNU)g(license)g(in)g(C)h(code)e(form.) +177 589 y(list)217 b(-)22 b(A)f(list)g(abstraction.)177 639 +y(lister)173 b(-)22 b(Module)e(to)i(manage)e(the)i(listing)e(file.)177 +689 y(machin)173 b(-)22 b(Module)e(to)i(hold)f(machine-dependen)o(t,)e +(program-dependent)f(stuff.)177 739 y(main.c)173 b(-)22 b(The)f(main\(\))g +(program.)177 789 y(mapper)173 b(-)22 b(Module)e(to)i(read)f(files)g(into)f +(memory.)177 839 y(memory)173 b(-)22 b(Memory)e(management.)177 +888 y(misc)217 b(-)22 b(Miscellaneous)d(functions.)177 938 +y(option)173 b(-)22 b(Command)e(line)h(option)g(processing.)177 +988 y(parser)173 b(-)22 b(The)f(parser.)177 1038 y(scanner)151 +b(-)22 b(The)f(scanner.)177 1088 y(section)151 b(-)22 b(A)f(section)g(number) +f(abstraction.)177 1137 y(style.h)151 b(-)22 b(A)f(machine-independent,)d +(program-independen)o(t)h(header)i(file.)177 1187 y(table)195 +b(-)22 b(A)f(table)g(abstraction.)177 1237 y(tangle)173 b(-)22 +b(The)f(tangler.)177 1287 y(texhead)151 b(-)22 b(Module)e(to)i(write)f(out)g +(TeX)g(header)f(in)i(documentation)d(files.)177 1337 y(texhead.ctx)63 +b(-)22 b(The)f(TeX)g(header)g(in)g(C)h(code)f(form.)177 1386 +y(texhead.tex)63 b(-)22 b(The)f(TeX)g(header)g(in)g(TeX)g(form.)177 +1436 y(weave)195 b(-)22 b(The)f(weaver.)177 1486 y(writfile)129 +b(-)22 b(Output)e(abstraction.)177 1594 y Fr(The)13 b(\\)p +Fl(.txt)p Fr(",)f(and)g(\\)p Fl(.tex)p Fr(")g(\014les)h(do)f(not)h +(participate)g(in)f(the)i(compilation,)c(but)j(are)g(considered)h(part)f(of)f +(the)177 1644 y(source)17 b(co)q(de)g(as)f(they)g(w)o(ere)h(used)f(to)g +(generate)h(the)f(\\)p Fl(.ctx)p Fr(")f(\014les.)24 b(The)16 +b(\\)p Fl(.ctx)p Fr(")e(\014les)j(are)f(included)g(b)o(y)f +Fl(.c)177 1693 y Fr(\014les)f(of)g(the)g(same)f(name.)k(They)d(do)g(not)g +(need)h(to)e(b)q(e)i(compiled)d(themselv)o(es.)177 1831 y Fd(4.2.7)55 +b(T)-5 b(ests)19 b(Directory)177 1930 y Fr(The)13 b Fl(tests)f +Fr(directory)h(stores)h(all)d(the)i(input)f(\014les)h(of)f(the)h(regression)h +(test)g(suite.)k(These)c(come)d(in)h(t)o(w)o(o)g(kinds:)177 +1980 y(F)m(unnelW)m(eb)k(input)g(\014les)h(with)f(extensions)i(of)e(\\)p +Fl(.fw)p Fr(",)f(and)h(F)m(unnelW)m(eb)g(include)h(\014les)g(with)f +(extensions)h(of)177 2030 y(\\)p Fl(.fwi)p Fr(".)177 2137 y +Fl(FunnelWeb)j(Input)h(Files:)243 2187 y(an01.fw)f(...)h(an04.fw)86 +b(-)21 b(Analyser)g(tests.)243 2237 y(ex01.fw)f(...)h(ex16.fw)86 +b(-)21 b(Examples)g(from)f(the)i(tutorial)e(in)h(user)g(manual.)243 +2287 y(generate.fw)259 b(-)21 b(Generates)f(a)i(few)f(other)g(tricky)f(input) +h(files.)243 2337 y(hi01.fw)f(...)h(hi10.fw)86 b(-)21 b(Examples)g(from)f +(the)i(hints)e(chapter)h(in)g(user)g(manual.)243 2386 y(pr01.fw)f(...)h +(pr10.fw)86 b(-)21 b(Parser)g(tests.)243 2436 y(sc01_note.fw)237 +b(-)21 b(A)h(note)f(explaining)f(absence)g(of)h(sc01.fw)243 +2486 y(sc02.fw)f(...)h(sc29.fw)86 b(-)21 b(Scanner)g(tests.)243 +2536 y(tg01.fw)f(...)h(tg09.fw)86 b(-)21 b(Tangler)g(tests.)243 +2586 y(wv01.fw)f(...)h(wv06.fw)86 b(-)21 b(Weaver)g(tests.)177 +2685 y(FunnelWeb)f(Include)g(Files:)243 2735 y(ex09a.fwi)243 +2785 y(sc13a.fwi)f(...)j(sc13f.fwi)243 2835 y(sc15a.fwi)1032 +2940 y Fr(104)p eop +%%Page: 105 106 +105 105 bop 243 42 a Fl(tg08a.fwi)177 180 y Fd(4.2.8)55 b(Userman)18 +b(Directory)177 279 y Fr(The)c Fl(userman)f Fr(directory)i(con)o(tains)e(the) +i Fl(.tex)e Fr(\014les)h(that)g(mak)o(e)e(up)i(the)h Fm(F)m(unnelWeb)h +(User's)e(Manual)p Fr(.)177 388 y Fl(u_ch0.tex)107 b(-)22 b(Preface,)e(etc.) +177 438 y(u_ch1.tex)107 b(-)22 b(Tutorial.)177 488 y(u_ch2.tex)107 +b(-)22 b(Hints.)177 538 y(u_ch3.tex)107 b(-)22 b(Definition.)177 +588 y(u_ch4.tex)107 b(-)22 b(Installation.)177 637 y(u_ch5.tex)107 +b(-)22 b(Administration.)177 687 y(u_cha.tex)107 b(-)22 b(Appendices.)177 +737 y(u_manual.tex)41 b(-)22 b(Main)f(TeX)g(file.)177 846 y +Fr(See)15 b(the)f(commen)o(t)e(at)h(the)i(top)e(of)h Fl(u)p +769 846 14 2 v 15 w(manual.tex)e Fr(\014le)h(for)h(instructions)g(on)g(ho)o +(w)f(to)h(t)o(yp)q(eset)h(and)f(prin)o(t)f(the)177 896 y Fm(F)m(unnelWeb)j +(User's)e(Manual)p Fr(.)177 1055 y Fi(4.3)70 b(Compiling)20 +b(F)-6 b(unnelW)g(eb)177 1169 y Fr(The)17 b(F)m(unnelW)m(eb)g(source)h(co)q +(de)f(is)g(en)o(tirely)g(con)o(tained)g(within)f(the)h Fl(sources)e +Fr(directory)m(.)27 b(Ho)o(w)o(ev)o(er,)18 b(some)177 1219 +y(simple)13 b(script)h(\014les)g(and)g(mak)o(e\014les)f(can)h(b)q(e)h(found)e +(in)g(the)i Fl(admin)e Fr(directory)m(.)177 1292 y(F)m(unnelW)m(eb)j(con)o +(tains)h(some)f(mac)o(hine-dep)q(enden)o(t)h(comp)q(onen)o(ts,)f(so)h(b)q +(efore)g(compiling)d(F)m(unnelW)m(eb,)i(y)o(ou)177 1341 y(need)e(to)e(sp)q +(ecify)h(y)o(our)g(mac)o(hine)e(in)h(the)i(source)g(\014le)e +Fl(environ.h)p Fr(.)k(T)m(o)c(do)g(this,)h(edit)f(the)i Fl(environ.h)c +Fr(\014le)j(and)177 1391 y(set)i(exactly)f(one)g(of)f(the)i(mac)o(hine)d +(name)h Fl(#define)p Fr(s)g(to)h Fl(1)p Fr(.)j(F)m(or)d(example,)e(on)i(the)g +(Sun)g(y)o(ou)g(should)f(set:)177 1500 y Fl(#define)21 b(MAC)g(0)177 +1550 y(#define)g(SUN)g(1)177 1600 y(#define)g(VMS)g(0)177 1650 +y(#define)g(PC)43 b(0)177 1759 y Fr(There)17 b(should)e(b)q(e)h(little)f +(di\016cult)o(y)f(compiling)f(F)m(unnelW)m(eb)i(for)g(an)o(y)g(of)g(these)i +(platforms.)k(If)15 b(the)h(mac)o(hine)177 1809 y(on)g(whic)o(h)g(y)o(ou)g +(are)g(compiling)d(F)m(unnelW)m(eb)j(is)g(not)g(one)g(of)g(the)h(ones)f +(listed)g(in)g(the)h Fl(environ.h)d Fr(\014le,)i(then)177 1859 +y(c)o(ho)q(ose)g(the)h(closest)f(one)g(y)o(ou)f(can.)23 b(T)m(ry)15 +b(the)h Fl(SUN)f Fr(if)g(y)o(ou)g(are)h(running)f(a)g(non-Sun)h(Unix.)22 +b(If)16 b(y)o(ou)f(run)g(in)o(to)177 1908 y(serious)g(di\016culties,)f(y)o +(ou)f(will)g(ha)o(v)o(e)h(to)g(customize)g Fl(machin.h)e Fr(and)i +Fl(machin.c)f Fr(for)h(y)o(our)g(mac)o(hine.)j(See)e(the)177 +1958 y(commen)o(ts)d(in)i(these)h(\014les)f(for)g(instructions)g(on)g(ho)o(w) +g(to)f(do)h(this.)177 2031 y(Once)h(y)o(ou)f(ha)o(v)o(e)f(sp)q(eci\014ed)j(a) +e(target)g(mac)o(hine,)e(compile)g(F)m(unnelW)m(eb)i(b)o(y)f(p)q(oin)o(ting)g +(y)o(our)h(C)g(compiler)e(at)i(all)177 2081 y(the)j(\\)p Fl(.c)p +Fr(")f(\014les)h(in)f(the)h Fl(sources)e Fr(directory)m(.)27 +b(The)17 b(\\)p Fl(.txt)p Fr(",)e(and)h(\\)p Fl(.tex)p Fr(")g(\014les)h(do)f +(not)g(participate)h(in)f(the)177 2131 y(compilation,)11 b(but)j(app)q(ear)h +(in)e(the)i Fl(sources)e Fr(directory)i(b)q(ecause)g(they)g(w)o(ere)g(used)g +(to)f(generate)h(the)g(\\)p Fl(.ctx)p Fr(")177 2180 y(\014les.)21 +b(The)15 b(\\)p Fl(.ctx)p Fr(")e(\014les)i(are)g(included)g(b)o(y)g +Fl(.c)f Fr(\014les)h(of)f(the)h(same)f(name)f(and)i(do)f(not)h(need)h(to)e(b) +q(e)h(compiled)177 2230 y(separately)m(.)j(Link)c(the)g(results.)177 +2303 y(The)g(result)g(of)f(all)f(this)h(should)g(b)q(e)h(a)f(binary)g +(executable)h(called)f Fl(fw)p Fr(,)g(or)g Fl(fw.exe)p Fr(,)f(or)h +Fl(fw.xxx)f Fr(where)i Fl(.xxx)f Fr(is)177 2353 y(whatev)o(er)j(\014le)e +(extension)h(is)g(appropriate)g(on)f(the)h(target)g(mac)o(hine.)k(Clean)c(up) +f(the)h Fl(sources)f Fr(directory)h(b)o(y)177 2403 y(deleting)f(all)f(the)h +(listing)f(and)h(ob)r(ject)g(\014les.)177 2562 y Fi(4.4)70 +b(T)-6 b(esting)22 b(F)-6 b(unnelW)g(eb)177 2676 y Fr(Once)13 +b(y)o(ou)d(ha)o(v)o(e)h(obtained)g(a)g(binary)g(executable,)h(y)o(ou)f +(should)g(test)h(F)m(unnelW)m(eb)f(b)q(efore)h(making)c(it)j(a)o(v)n(ailable) +177 2725 y(to)j(users.)19 b(T)m(o)14 b(do)f(this:)228 2835 +y(1.)20 b(Set)14 b(the)h(default)e(directory)i(to)f(b)q(e)g(the)h +Fl(scripts)d Fr(directory)m(.)1032 2940 y(105)p eop +%%Page: 106 107 +106 106 bop 228 42 a Fr(2.)20 b(Cop)o(y)14 b(the)i(F)m(unnelW)m(eb)e +(executable)i(in)o(to)e(the)i(scripts)g(directory)g(\(or)f(b)q(e)g(able)g(to) +g(in)o(v)o(ok)o(e)f(it)g(from)f(the)281 91 y(scripts)i(directory\).)228 +174 y(3.)20 b(Edit)d(the)h(script)g Fl(master.fws)p Fr(.)27 +b(Lo)q(cate)18 b(the)g(section)g(called)f(\\De\014ne)h(Sym)o(b)q(ol)d(F)m(or) +i(the)h(Ro)q(ot)e(T)m(est)281 224 y(Directory")g(and)g(de\014ne)i(the)e +Fl(R)g Fr(sym)o(b)q(ol)f(to)h(p)q(oin)o(t)g(to)g(the)g(F)m(unnelW)m(eb)g(ro)q +(ot)g(directory)h Fl(fwdir)p Fr(.)24 b(The)281 274 y(examples)13 +b(in)g(the)i(commen)o(ts)d(in)h(the)i(script)f(should)g(mak)o(e)f(it)g(clear) +h(what)g(is)g(required.)228 356 y(4.)20 b(In)o(v)o(ok)o(e)13 +b(F)m(unnelW)m(eb)h(to)f(execute)j(the)f(master)e(test)i(script)g(with)e(the) +i(command)c(line)i Fl(fw)22 b(+xmaster)177 472 y Fr(The)16 +b Fl(master.fws)e Fr(script)j(should)e(run)h(for)g(a)f(few)h(min)o(utes.)23 +b(If)15 b(all)g(go)q(es)h(w)o(ell,)f(y)o(ou)h(will)e(\014nd)i(a)g +(di\013erences)177 521 y(rep)q(ort)g(on)f(y)o(our)g(screen)i(rep)q(orting)f +(zero)g(di\013erences.)24 b(If)14 b(this)h(happ)q(ens,)h(then)g(F)m(unnelW)m +(eb)f(has)g(b)q(een)h(fully)177 571 y(tested)h(and)e(is)h(ready)g(to)f(b)q(e) +h(made)e(a)o(v)n(ailable)f(to)j(users.)24 b(Y)m(ou)15 b(should)g(delete)h +(all)e(the)i(\014les)g(in)f(the)h Fl(results)177 621 y Fr(directory)f(and)f +(pro)q(ceed)h(to)f(the)g(next)h(section)f(on)g(installing)e(F)m(unnelW)m(eb)h +(for)h(users.)177 695 y(If)e(there)i(w)o(ere)f(one)g(or)g(more)e +(di\013erences,)k(y)o(ou)d(can)g(either)i(giv)o(e)e(up)g(and)g(con)o(tact)h +(the)g(author,)g(or)f(attempt)g(to)177 745 y(\014x)j(the)g(co)q(de)h(y)o +(ourself.)21 b(If)14 b(y)o(ou)g(decide)i(to)f(\014x)f(the)i(co)q(de)g(y)o +(ourself,)e(start)h(with)g(the)g(di\013erences)i(log)d(\014le)h(and)177 +795 y(follo)o(w)d(y)o(our)i(nose.)k(Go)q(o)q(d)c(luc)o(k!)177 +957 y Fi(4.5)70 b(Installing)21 b(F)-6 b(unnelW)g(eb)177 1072 +y Fr(A)o(t)15 b(this)g(stage)g(y)o(ou)f(should)h(ha)o(v)o(e)g(a)f +Fl(fwdir)g Fr(directory)h(tree)h(somewhere)f(in)g(y)o(our)f(\014le)h(system.) +20 b(Its)c(con)o(ten)o(ts)177 1122 y(should)g(b)q(e)g(almost)d(iden)o(tical)i +(to)h(the)g(directory)g(con)o(ten)o(ts)h(sp)q(eci\014ed)g(earlier)f(in)f +(this)h(c)o(hapter)g(except)h(there)177 1172 y(should)d(no)o(w)f(b)q(e)i(an)e +(additional)g(binary)g(executable)i(\014le)f(sitting)f(in)h(the)g +Fl(scripts)f Fr(directory)m(.)177 1246 y(T)m(o)g(mak)o(e)g(F)m(unnelW)m(eb)g +(a)o(v)n(ailable)f(to)h(users,)i(y)o(ou)f(should:)228 1361 +y(1.)20 b(Mak)o(e)14 b(the)g(en)o(tire)h(directory)g(tree)g(readable)f(to)g +(all)e(users.)228 1444 y(2.)20 b(Mo)o(v)o(e)15 b(the)h(binary)f(executable)i +(from)d(the)i(scripts)g(directory)g(to)g(the)g Fl(admin)e Fr(directory)i +Fm(or)f Fr(cop)o(y)h(it)f(to)281 1494 y(somewhere)f(con)o(v)o(enien)o(t)g +(suc)o(h)h(as)f(a)g Fl(/bin)f Fr(directory)m(.)228 1577 y(3.)20 +b(Set)d(up)f(a)g(sym)o(b)q(ol,)f(path,)i(or)f(command)e(of)h(some)h(kind)g(b) +o(y)g(the)h(name)e(of)h Fl(fw)g Fr(that)g(\\p)q(oin)o(ts")g(to)g(the)281 +1626 y(binary)h(executable.)30 b(If)18 b(p)q(ossible,)g(set)g(this)g(up)g(so) +f(that)h(the)g Fl(fw)f Fr(sym)o(b)q(ol)f(is)i(a)o(v)n(ailable)d(to)i(all)g +(users.)281 1676 y(Alternativ)o(ely)m(,)j(y)o(ou)f(can)h(inform)d(in)o +(terested)22 b(users)f(of)e(ho)o(w)g(they)h(can)g(add)g(a)f(command)e(to)i +(their)281 1726 y Fl(login)13 b Fr(command)e(\014le)j(to)f(mak)o(e)g(the)h +(command)d(a)o(v)n(ailable)h(to)i(them.)177 1841 y(If)i(y)o(ou)g(are)h(short) +f(of)g(disk)g(space)h(or)g(ha)o(v)o(e)f(a)g(system)g(that)g(is)g(stressed)j +(in)d(some)f(other)i(w)o(a)o(y)m(,)e(it)h(ma)o(y)e(b)q(e)j(of)177 +1891 y(assistance)g(to)f(y)o(ou)f(to)g(kno)o(w)g(that)h(F)m(unnelW)m(eb)f +(has)h(b)q(een)h(constructed)h(so)d(that)h(its)g(binary)f(executable)i(is)177 +1941 y Fm(total)r(ly)d(self)g(c)n(ontaine)n(d)p Fr(.)19 b(The)14 +b(binary)e(executable)j(do)q(es)f(not)g(rely)f(on)g(an)o(y)g(other)i(\014les) +e(to)h(op)q(erate.)k(Nor)c(do)q(es)177 1991 y(it)f(care)h(ab)q(out)f(its)g(p) +q(osition)g(in)g(the)g(\014le)h(system.)j(In)c(fact,)g(all)f(that)h(is)g +(really)g(required)h(to)f(use)h(F)m(unnelW)m(eb)f(is)177 2040 +y(the)g(binary)e(executable)i(and)f(the)h Fm(F)m(unnelWeb)h(User's)e(Manual)p +Fr(.)19 b(Th)o(us,)12 b(if)f(y)o(ou)g(are)i(short)f(of)g(disk)f(space,)i(y)o +(ou)177 2090 y(can)j(mo)o(v)o(e)f(the)i(binary)e(executable)j(to)d(y)o(our)h +(\\)p Fl(/bin)p Fr(")f(directory)i(and)f(delete)h(the)g(en)o(tire)f(F)m +(unnelW)m(eb)g(tree.)177 2140 y(Ho)o(w)o(ev)o(er,)e(making)d(the)k(tree)g(a)o +(v)n(ailable)d(to)h(users)j(is)e(encouraged)g(b)q(ecause:)239 +2255 y Fq(\017)21 b Fr(It)14 b(allo)o(ws)f(users)i(to)f(cop)o(y)f(the)i(tree) +g(and)f(install)f(it)g(on)h(another)g(mac)o(hine)f(without)g(b)q(othering)h +(y)o(ou.)239 2338 y Fq(\017)21 b Fr(It)12 b(allo)o(ws)g(users)h(access)i(to)d +(the)h(T)813 2347 y(E)836 2338 y(X)g(co)q(de)g(for)f(the)h +Fm(F)m(unnelWeb)h(User's)f(Manual)g Fr(and)g(the)g Fm(F)m(unnelWeb)281 +2388 y(Hacker's)h(Manual)p Fr(.)239 2470 y Fq(\017)21 b Fr(It)13 +b(allo)o(ws)e(users)j(access)g(to)e(the)h(regression)h(test)g(suite.)k(This) +12 b(ma)o(y)f(not)h(seem)h(imp)q(ortan)o(t,)d(but)j(it)f(could)281 +2520 y(b)q(e)k(v)o(ery)f(con)o(v)o(enien)o(t)h(for)f(the)h(user)g(as)f(the)h +Fl(ex*)f Fr(and)g Fl(hi*)g Fr(\014les)g(of)g(the)h(regression)g(test)g(suite) +g(con)o(tain)281 2570 y(most)f(of)h(the)g(examples)g(from)e(the)j +Fm(F)m(unnelWeb)h(User's)e(Manual)p Fr(.)26 b(By)16 b(making)e(them)h(a)o(v)n +(ailable)f(y)o(ou)281 2620 y(will)e(sa)o(v)o(e)i(users)i(the)e(trouble)g(of)g +(t)o(yping)f(them)g(in.)177 2735 y(Finally)m(,)i(y)o(ou)h(should)h(\014ll)f +(in)g(and)h(send)g(o\013)g(a)g(F)m(unnelW)m(eb)f(registration)h(form.)24 +b(This)17 b(allo)o(ws)f(me)f(to)i(get)g(a)177 2785 y(handle)g(on)g(the)g +(size)h(and)f(needs)h(of)f(the)g(user)h(base,)g(and)f(y)o(ou)f(to)h(b)q(e)h +(k)o(ept)f(informed)f(of)g(new)h(F)m(unnelW)m(eb)177 2835 y(releases)f +(\(optional\).)h(See)d(Section)h(5.4)d(for)i(more)f(information.)1032 +2940 y(106)p eop +%%Page: 107 108 +107 107 bop 177 42 a Fi(4.6)70 b(Prin)n(ting)22 b(Man)n(uals)177 +157 y Fr(F)m(unnelW)m(eb)d(comes)g(with)g(t)o(w)o(o)g(man)o(uals,)f(a)h +Fm(F)m(unnelWeb)i(User's)e(Manual)h Fr(and)f(a)g Fm(F)m(unnelWeb)i(Hacker's) +177 207 y(Manual)p Fr(.)k(Instructions)17 b(for)f(ho)o(w)f(to)h(t)o(yp)q +(eset)h(and)f(prin)o(t)g(these)h(man)o(uals)d(app)q(ear)i(at)g(the)g(top)g +(of)f(the)i(main)177 257 y(T)200 266 y(E)223 257 y(X)d(\014les)h(for)e(these) +i(man)o(uals)d Fl(u)p 709 257 14 2 v 16 w(manual.tex)f Fr(and)j +Fl(h)p 1059 257 V 16 w(manual.tex)p Fr(.)177 332 y(There)e(is)f(no)g(need)h +(to)f(prin)o(t)g(the)h Fm(F)m(unnelWeb)h(Hacker's)f(Manual)g +Fr(unless)f(y)o(ou)g(in)o(tend)g(to)g(mo)q(dify)e(F)m(unnelW)m(eb.)177 +381 y(Ho)o(w)o(ev)o(er,)k(y)o(ou)g(should)g(mak)o(e)f(a)h(few)g(copies)h(of)f +(the)h Fm(F)m(unnelWeb)h(User's)e(Manual)h Fr(a)o(v)n(ailable)d(for)i(users,) +i(or)e(at)177 431 y(least)i(let)f(them)f(kno)o(w)h(where)h(the)g(T)765 +440 y(E)788 431 y(X)f(source)i(for)e(the)h Fm(F)m(unnelWeb)h(User's)e(Manual) +h Fr(is)f(k)o(ept)h(so)f(that)g(they)177 481 y(can)g(t)o(yp)q(eset)i(and)d +(prin)o(t)h(it)g(themselv)o(es.)177 643 y Fi(4.7)70 b(Installation)21 +b(Problems?)177 759 y Fr(If)e(y)o(ou)g(run)g(in)o(to)g(an)o(y)g(problems)f +(installing)f(F)m(unnelW)m(eb,)j(please)g(write)f(a)g(short)h(rep)q(ort)g +(describing)g(the)177 809 y(problem)14 b(and)i(mail)d(it)i(to)g(the)h(author) +g(Ross)f(Williams)e(\()p Fl(ross@spam.adelai)o(de.ed)o(u.au)o +Fr(\).)21 b(I)15 b(ma)o(y)f(not)h(b)q(e)177 859 y(able)g(to)g(help)g(y)o(ou)f +(with)h(it)f(immediately)l(,)e(but)j(I)g(certainly)g(w)o(an)o(t)g(to)f(kno)o +(w)h(that)g(a)f(problem)g(exists)i(so)f(that)177 909 y(it)f(can)g(b)q(e)g +(corrected)i(in)e(future)g(releases)i(of)d(F)m(unnelW)m(eb.)1032 +2940 y(107)p eop +%%Page: 108 109 +108 108 bop 1032 2940 a Fr(108)p eop +%%Page: 109 110 +109 109 bop 177 379 a Fj(Chapter)34 b(5)177 613 y Fp(F)-10 +b(unnelW)g(eb)41 b(Administration)177 881 y Fi(5.1)70 b(In)n(tro)r(duction) +177 999 y Fr(Whether)21 b(a)e(computer)g(program)f(is)h(useful)h(dep)q(ends)h +(not)f(just)f(on)g(the)i(functionalit)o(y)d(pro)o(vided)h(b)o(y)g(the)177 +1049 y(program,)13 b(but)i(also)g(on)g(the)g(totalit)o(y)f(of)g(the)i +(culture)g(and)e(services)j(surrounding)e(it)g(suc)o(h)g(as)g(license)h +(costs,)177 1098 y(the)j(qualit)o(y)e(of)h(do)q(cumen)o(tation,)f(presence)k +(of)d(a)g(standard)h(and)f(so)g(on.)31 b(This)19 b(c)o(hapter)g(addresses)h +(these)177 1148 y(issues)15 b(from)d(a)i(user)h(p)q(ersp)q(ectiv)o(e.)177 +1315 y Fi(5.2)70 b(The)22 b(User's)h(Commitme)o(n)n(t)d(T)-6 +b(o)24 b(F)-6 b(unnelW)g(eb)177 1434 y Fr(One)20 b(of)f(the)i(problems)d +(that)i(migh)o(t)d(prev)o(en)o(t)k(p)q(oten)o(tial)e(users)i(from)c(using)j +(F)m(unnelW)m(eb)f(is)g(the)h(lev)o(el)f(of)177 1483 y(commitm)o(en)o(t)14 +b(that)j(it)f(requires.)27 b(As)17 b(so)q(on)g(as)g(the)g(user)h(starts)f +(creating)g(F)m(unnelW)m(eb)f Fl(.fw)g Fr(\014les,)h(the)h(user)177 +1533 y(b)q(ecomes)c(dep)q(enden)o(t)h(on)e(the)h(F)m(unnelW)m(eb)f(program,)f +(as)h(the)h(\014les)g(so)f(created)i(will)d(b)q(ecome)i(unmanageable)177 +1583 y(if)i(the)h(F)m(unnelW)m(eb)f(program)f(w)o(ere)i(to)g(b)q(ecome)f(una) +o(v)n(ailable)e(for)j(some)e(reason.)27 b(There)17 b(are)g(a)g(n)o(um)o(b)q +(er)e(of)177 1633 y(w)o(a)o(ys)f(in)g(whic)o(h)h(computer)f(programs)f(can)i +(b)q(ecome)f(una)o(v)n(ailable,)e(including)i(op)q(erating)g(system)h +(upgrades,)177 1683 y(cop)o(yrigh)o(t)d(problems,)f(inabilit)o(y)f(to)h +(\014x)h(bugs,)g(or)g(just)h(the)f(inabilit)o(y)e(of)h(the)i(program)d(to)i +(b)q(e)h(p)q(orted)g(to)f(a)f(new)177 1732 y(target)k(platform.)177 +1809 y(The)j(fact)f(is)g(that)h(F)m(unnelW)m(eb)e(de\014nes)j(an)e(input)g +(language)g(and)g(that)g(curren)o(tly)h(there)h(is)e(only)f(one)i(im-)177 +1859 y(plemen)o(tation)f(of)h(the)i(language.)32 b(Users)20 +b(will)d(only)h(write)i(programs)d(using)i(that)g(language)e(if)h(they)i +(feel)177 1908 y(comfortable)12 b(ab)q(out)i(the)h(a)o(v)n(ailabili)o(t)o(y)c +(of)i(its)h(implemen)o(tatio)o(n.)177 1985 y(I)i(ha)o(v)o(e)g(b)q(een)i +(critically)d(a)o(w)o(are)h(of)g(these)i(issues)f(throughout)f(the)h(dev)o +(elopmen)o(t)e(of)h(F)m(unnelW)m(eb)g(and)g(ha)o(v)o(e)177 +2034 y(tak)o(en)i(ev)o(ery)g(p)q(ossible)g(step)h(to)f(mak)o(e)e(F)m(unnelW)m +(eb)h(a)h(solid)e(base)j(on)o(to)e(whic)o(h)h(to)f(build)g(programs.)28 +b(The)177 2084 y(follo)o(wing)11 b(p)q(oin)o(ts)j(describ)q(e)i(the)e +(actions)g(I)g(ha)o(v)o(e)g(tak)o(en.)295 2161 y Fo(GNU)19 +b(license:)i Fr(F)m(unnelW)m(eb's)16 b(C)g(source)i(co)q(de)f(has)g(b)q(een)g +(released)h(under)f(GNU)g(General)295 2210 y(Public)c(License)h(V)m(ersion)f +(2.)18 b(This)13 b(means)f(that)h(the)h(source)g(co)q(de)g(to)f(F)m(unnelW)m +(eb)f(will)g(alw)o(a)o(ys)295 2260 y(b)q(e)18 b(a)o(v)n(ailable)c(to)j(an)o +(y)o(one)f(who)h(w)o(an)o(ts)g(it.)26 b(The)17 b(F)m(unnelW)m(eb)f(program)f +(can)i(nev)o(er)h(b)q(e)g(tak)o(en)295 2310 y(a)o(w)o(a)o(y)13 +b(from)f(y)o(ou.)295 2386 y Fo(P)o(ortabili)o(t)n(y:)22 b Fr(F)m(unnelW)m(eb) +17 b(has)g(b)q(een)h(designed)f(and)g(written)g(to)g(b)q(e)g(extremely)g(p)q +(ortable.)295 2436 y(First,)g(all)e(F)m(unnelW)m(eb)h(really)g(do)q(es)h(is)f +(read)h(and)g(write)f(text)h(\014les.)26 b(This)17 b(mak)o(es)e(it)h(easy)h +(to)295 2486 y(mak)o(e)9 b(p)q(ortable.)17 b(Second,)11 b(F)m(unnelW)m(eb)f +(is)g(written)g(in)g(the)h(C)f(programmi)o(ng)d(language)p +Fo([ANSI])295 2536 y Fr(with)15 b(p)q(ortabilit)o(y)e(as)i(a)f(ma)r(jor)g +(design)g(goal.)20 b(Third,)14 b(F)m(unnelW)m(eb)h(has)f(already)h(b)q(een)h +(p)q(orted)295 2586 y(to)d(four)h(p)q(opular)e(platforms:)k(SunOS,)e(V)-5 +b(AX)14 b(VMS,)f(PC,)g(and)g(Macin)o(tosh)g(and)h(it)f(should)g(not)295 +2635 y(pro)o(v)o(e)j(hard)g(to)f(mo)o(v)o(e)f(it)h(to)h(others.)24 +b(F)m(ourth,)15 b(F)m(unnelW)m(eb)g(comes)h(with)f(a)g(h)o(uge)h(automated) +295 2685 y(regression)g(test)f(suite.)20 b(This)14 b(mak)o(es)f(it)h(easy)h +(to)f(pinp)q(oin)o(t)f(problems)g(when)i(it)f(is)g(mo)o(v)o(ed)f(to)h(a)295 +2735 y(new)f(platform.)j(P)o(ortabilit)o(y)11 b(is)h(imp)q(ortan)o(t)f(b)q +(ecause,)k(ev)o(en)e(if)f Fm(you)h Fr(are)g(not)g(using)f(F)m(unnelW)m(eb)295 +2785 y(on)17 b(some)e(funn)o(y)h(platform,)f(y)o(ou)h(ma)o(y)e(w)o(an)o(t)j +(to)f(send)h(a)g(computer)f(program)f(written)i(using)295 2835 +y(F)m(unnelW)m(eb)d(to)f(someone)h(who)f(do)q(es.)1032 2940 +y(109)p eop +%%Page: 110 111 +110 110 bop 295 42 a Fo(Qualit)o(y:)27 b Fr(The)20 b(F)m(unnelW)m(eb)e +(source)j(co)q(de)f(is)f(high)f(qualit)o(y)g(co)q(de.)35 b(Although)19 +b(it)f(has)i(not)295 91 y(b)q(een)13 b(formally)c(dev)o(elop)q(ed)j(under)g +(an)o(y)f(particular)h(co)q(ding)f(standard,)h(it)f(is)h(w)o(ell)f(designed)h +(and)295 141 y(do)q(cumen)o(ted.)18 b(Design)c(decisions)g(ha)o(v)o(e)g(not)g +(b)q(een)h(tak)o(en)f(ligh)o(tly)m(.)295 216 y Fo(Do)q(cumen)o(tation:)20 +b Fr(F)m(unnelW)m(eb)c(is)g(w)o(ell)f(do)q(cumen)o(ted)h(b)o(y)g(this)h(man)o +(ual)d(and)i(b)o(y)g(the)g Fm(F)m(un-)295 266 y(nelWeb)j(Hacker's)f(Manual)p +Fr(.)29 b(This)17 b(is)g(imp)q(ortan)o(t)f(b)q(ecause)j(it)e(means)f(that)i +(if)e(y)o(ou)h(w)o(an)o(t)g(to)295 316 y(send)c(someone)e(a)g(program)f +(written)i(using)g(F)m(unnelW)m(eb,)f(y)o(ou)g(can)h(simply)d(p)q(oin)o(t)i +(them)g(to)h(this)295 366 y(man)o(ual)c(rather)k(than)f(ha)o(ving)e(to)h +(explain)g(it)h(all)e(y)o(ourself.)17 b(It)10 b(is)h(also)f(comforting)e(for) +j(managers)295 415 y(who)j(are)h(con)o(trolling)e(source)i(co)q(de)g(to)f +(kno)o(w)g(that)g(the)h(format)d(in)i(whic)o(h)g(the)g(source)i(co)q(de)f(is) +295 465 y(written)g(is)e(w)o(ell-do)q(cumen)o(ted.)295 540 +y Fo(Standardizatio)o(n:)i Fr(Users)g(who)e(create)h(source)h(\014les)e +(using)g(F)m(unnelW)m(eb)g(are)h(not)f(only)f(com-)295 590 +y(mitting)j(to)j(the)g(F)m(unnelW)m(eb)e(program;)h(they)h(are)g(also)f(in)o +(v)o(esting)g(in)g(the)h(F)m(unnelW)m(eb)f(lan-)295 640 y(guage.)22 +b(If)14 b(F)m(unnelW)m(eb's)h(language)f(c)o(hanges)i(radically)d(for)i(some) +f(reason,)i(then)g(this)f(in)o(v)o(est-)295 690 y(men)o(t)f(b)o(y)h(users)h +(will)d(b)q(e)j(undermined.)k(T)m(o)14 b(protect)i(this)f(in)o(v)o(estmen)o +(t,)f(I)h(in)o(tend)g(to)f(main)o(tain)295 740 y(an)g(\\o\016cial")e(v)o +(ersion)j(of)e(F)m(unnelW)m(eb)h(whose)g(language)f(will)g(not)h(c)o(hange)h +(radically)m(,)d(at)h(least)295 789 y(not)h(in)g(a)f(non)h(bac)o(kw)o(ard)g +(compatible)e(manner.)177 864 y(It)17 b(is)f(m)o(y)f(hop)q(e)h(that)h(the)g +(com)o(bination)d(of)i(these)h(factors)g(will)e(alleviate)g(an)o(y)h(fears)h +(that)g(users)h(ma)o(y)c(ha)o(v)o(e)177 914 y(ab)q(out)g(committing)c(their) +15 b(source)g(\014les)f(to)g(F)m(unnelW)m(eb.)177 1077 y Fi(5.3)70 +b(Do)r(cumen)n(tation)177 1194 y Fr(The)14 b(follo)o(wing)e(F)m(unnelW)m(eb)h +(do)q(cumen)o(tation)g(is)h(a)o(v)n(ailable:)264 1311 y Fl("FunnelWeb)20 +b(User's)64 b(Manual":)20 b(Tutorial,)g(Hints,)h(Reference)f(Manual.)264 +1360 y("FunnelWeb)g(Hacker's)g(Manual":)g(Notes)h(on)g(Design)g(and)g +(Implementation.)177 1477 y Fr(Ev)o(ery)o(one)14 b(in)o(v)o(olv)o(ed)e(with)h +(F)m(unnelW)m(eb)f(should)h(read)h(the)g Fm(F)m(unnelWeb)h(User's)e(Manual)p +Fr(.)19 b(It)13 b(con)o(tains)g(ev)o(ery-)177 1527 y(thing)h(y)o(ou)f(need)i +(to)f(kno)o(w)f(ab)q(out)h(ho)o(w)f(to)h(use)h(F)m(unnelW)m(eb.)i(In)d(fact,) +f(y)o(ou)h(are)g(reading)g(it)f(no)o(w!)177 1602 y(The)18 b +Fm(F)m(unnelWeb)h(Hacker's)f(Manual)g Fr(is)f(for)g(those)h(who)f(w)o(an)o(t) +g(to)g(install,)g(mo)q(dify)m(,)e(\014x,)i(\014ddle)h(with,)f(and)177 +1652 y(generally)d(hac)o(k)g(the)g(F)m(unnelW)m(eb)f(C)h(source)h(co)q(de.) +177 1727 y(Both)h(of)e(these)j(man)o(uals)c(are)j(shipp)q(ed)g(with)e(the)i +(F)m(unnelW)m(eb)f(distribution)g(kit,)f(and)h(should)g(b)q(e)h(a)o(v)n +(ailable)177 1777 y(on)g(y)o(our)f(mac)o(hine)f(in)i(the)g(form)e(of)h(LaT)m +(eX)g(text)i(\014les.)23 b(If)16 b(y)o(ou)f(cannot)h(\014nd)g(them,)f(y)o(ou) +g(can)h(obtain)f(them)177 1827 y(from)d(the)j(F)m(unnelW)m(eb)e(FTP)h(arc)o +(hiv)o(e)g(\(see)i(Section)e(5.11\).)177 1990 y Fi(5.4)70 b(Registration)177 +2106 y Fr(If)13 b(y)o(ou)g(install)g(or)g(use)i(F)m(unnelW)m(eb,)d(please)i +(register)h(b)o(y)e(\014lling)f(in)h(and)h(returning)g(the)g(registration)f +(form)f(in)177 2156 y Fo(Figure)i(4)p Fr(.)k(F)m(eel)c(free)h(to)e(expand)i +(the)f(form)e(if)h(there)i(is)f(not)g(enough)g(ro)q(om.)177 +2231 y(Email)h(the)j(form)e(to)h Fl(ross@spam.adelaide)o(.edu.)o(au)p +Fr(,)e(or)i(snail)g(mail)e(it)i(to)g(Ross)g(William)o(s,)f(16)g(Lerwic)o(k) +177 2281 y(Av)o(en)o(ue,)c(Hazelw)o(o)q(o)q(d)f(P)o(ark)g(5066,)f(Australia.) +17 b(Y)m(ou)11 b(ma)o(y)e(wish)i(to)g(mak)o(e)e(a)i(con)o(tribution)g(when)g +(y)o(ou)g(register.)177 2331 y(See)k(Section)f(5.5)f(for)h(more)f +(information.)177 2494 y Fi(5.5)70 b(Supp)r(ort)177 2610 y +Fr(F)m(unnelW)m(eb)13 b(is)h(released)h(\\as)f(is")f(under)i(a)e(GNU)h +(license,)g(and)g(no)f(formal)f(supp)q(ort)i(is)g(a)o(v)n(ailable.)i(Y)m(ou)d +(ha)o(v)o(e)177 2660 y(the)20 b(righ)o(t)e(to)h(mak)o(e)e(c)o(hanges)j(to)f +(F)m(unnelW)m(eb)f(and)h(to)g(use)h(the)f(mo)q(di\014ed)f(v)o(ersions)h +(created)i(b)o(y)d(random)177 2710 y(programmers.)e(Ho)o(w)o(ev)o(er,)e(this) +g(is)g(discouraged)g(\(see)h(Section)g(5.9\).)177 2785 y(In)h(fact)g(the)h +(supp)q(ort)g(that)f(is)g(most)f(needed)i(is)f(y)o(our)g(\014nancial)f(supp)q +(ort)i(for)f(the)g(F)m(unnelW)m(eb)g(dev)o(elop)q(ers!)177 +2835 y(It)h(has)g(tak)o(en)h Fm(months)f Fr(of)g(full-tim)o(e)e +Fm(unp)n(aid)j Fr(w)o(ork)e(to)h(bring)g(F)m(unnelW)m(eb)g(to)f(y)o(ou)h(in)g +(its)g(curren)o(t)h(form.)26 b(I)1032 2940 y(110)p eop +%%Page: 111 112 +111 111 bop 264 602 a Fl(+------------------)o(----F)o(unnel)o(Web)19 +b(Registration)g(Form-------------)o(----)o(-----)o(+)264 652 +y(|)j(1.)f(Date:)1350 b(|)264 702 y(|)1547 b(|)264 751 y(|)22 +b(2.)f(Title)g(and)g(name:)1132 b(|)264 801 y(|)1547 b(|)264 +851 y(|)22 b(3.)f(Internet)f(email)h(address:)957 b(|)264 901 +y(|)1547 b(|)264 951 y(|)22 b(4.)f(Snail)g(mail)g(address:)1044 +b(|)264 1000 y(|)1547 b(|)264 1050 y(|)22 b(5.)f(Work)g(phone)g(number)g +(\(country,area,n)o(umber)o(\):)585 b(|)264 1100 y(|)1547 b(|)264 +1150 y(|)22 b(6.)f(Which)g(category)f(of)i(FunnelWeb)e(user)g(best)h +(describes)f(you?)326 b(|)264 1200 y(|)153 b(Latent)86 b(-)21 +b(Installed)f(FunnelWeb,)g(but)h(don't)g(intend)f(to)i(use)f(it.)86 +b(|)264 1250 y(|)153 b(Beginner)42 b(-)21 b(Haven't)g(used)g(FunnelWeb)e +(much)i(yet;)g(have)g(an)h(open)f(mind.)f(|)264 1299 y(|)153 +b(Casual)86 b(-)21 b(Use)g(FunnelWeb)f(occasionally.)542 b(|)264 +1349 y(|)153 b(Convert)64 b(-)21 b(Use)g(FunnelWeb)f(to)i(do)f(most)g +(programming.)324 b(|)264 1399 y(|)153 b(Fanatic)64 b(-)21 +b(FunnelWeb)f(has)h(become)g(a)g(way)h(of)f(life.)369 b(|)264 +1449 y(|)1547 b(|)264 1499 y(|)22 b(7.)f(What)g(changes)g(or)g(new)g +(features)f(would)h(you)g(like)g(to)h(see)f(in)g(FunnelWeb?)63 +b(|)264 1548 y(|)1547 b(|)264 1598 y(|)g(|)264 1648 y(|)g(|)264 +1698 y(|)g(|)264 1748 y(|)g(|)264 1797 y(|)g(|)264 1847 y(|)22 +b(8.)f(Do)h(you)f(want)g(to)g(be)h(kept)f(informed)f(of)h(new)g(FunnelWeb)f +(developments?)106 b(|)264 1897 y(|)1547 b(|)264 1947 y(+------------------)o +(-----)o(-----)o(-----)o(----)o(-----)o(-----)o(-----)o(-----)o(-----)o(----) +o(-----)o(+)343 2038 y Fh(T)m(o)433 b(register)e(as)h(a)281 +2088 y(F)m(unnelW)m(eb)13 b(user,)i(please)f(\014ll)g(in)h(this)f(form)g(and) +g(email)f(it)i(to)g Fe(ross@spam.)o(ad)o(ela)o(ide)o(.ed)o(u.a)o(u)p +Fh(,)e(or)h(snail)g(mail)281 2138 y(it)f(to)f(Ross)h(Williams,)e(16)i(Lerwic) +o(k)f(Av)o(en)o(ue,)g(Hazelw)o(o)q(o)q(d)f(P)o(ark)h(5066,)g(Australia.)18 +b(Y)m(ou)13 b(ma)o(y)f(wish)g(to)h(mak)o(e)e(a)281 2188 y(con)o(tribution)d +(when)j(y)o(ou)g(register.)i(See)e(Section)e(5.5)i(for)g(more)f(information.) +650 2279 y Fo(Figure)k(4)p Fr(:)k(The)d(F)m(unnelW)m(eb)e(registration)h +(form.)1032 2940 y(111)p eop +%%Page: 112 113 +112 112 bop 177 42 a Fr(don't)15 b(w)o(an)o(t)f(to)h(incon)o(v)o(enience)g +(users)i(who)d(install)g(F)m(unnelW)m(eb,)g(pla)o(y)g(with)g(it,)h(and)f +(then)i(hardly)e(ev)o(er)i(use)177 91 y(it.)i(If)c(y)o(ou)g(are)g(in)g(this)g +(category)m(,)f(please)i(register,)g(but)f(don't)g(b)q(other)h(con)o +(tributing.)j(Ho)o(w)o(ev)o(er,)c(if)f(y)o(ou)h(\014nd)177 +141 y(that)h(F)m(unnelW)m(eb)f(has)h(b)q(ecome)g(a)f(useful)h(programming)c +(to)q(ol,)j(a)g(con)o(tribution)h(of)f(some)g(p)q(ositiv)o(e)g(m)o(ultiple) +177 191 y(of)f(US$50)h(w)o(ould)f(b)q(e)h(appreciated.)177 +266 y(T)m(o)f(mak)o(e)g(a)g(con)o(tribution,)g(send)i(pa)o(ymen)o(t)e(with)g +(a)h(completed)f(registration)h(form)e(\(see)j(Section)g(5.4\))e(to:)243 +382 y Fl(Renaissance)19 b(Software)h(Pty)h(Ltd)243 432 y(Email:)f +(ross@spam.adelaide)o(.edu.)o(au)243 482 y(Snail:)g(16)h(Lerwick)g(Avenue,)f +(Hazelwood)g(Park)h(5066,)g(Australia.)177 598 y Fr(P)o(a)o(ymen)o(t)14 +b(can)h(b)q(e)g(b)o(y)g(p)q(ersonal)g(or)g(bank)g(c)o(heque)h(to)e(an)o(y)h +(bank)g(in)f(the)h(w)o(orld)g(or)g(b)o(y)f(Visa)h(or)g(Mastercard.)177 +648 y(Please)j(giv)o(e)e(the)h(card)g(name,)f(n)o(um)o(b)q(er,)g(expiry)h +(date,)g(and)g(the)g(amoun)o(t)e(to)h(b)q(e)i(paid)e(in)g(US)h(dollars.)26 +b(All)177 698 y(con)o(tributions)16 b(will)f(b)q(e)i(appreciated)g(and)f +(will)f(encourage)i(further)g(F)m(unnelW)m(eb)f(dev)o(elopmen)o(t.)24 +b(Ho)o(w)o(ev)o(er,)177 748 y(no)14 b(undertaking)g(is)f(made)g(whatso)q(ev)o +(er)i(ab)q(out)f(ho)o(w)f(the)i(money)d(will)h(b)q(e)h(used.)177 +910 y Fi(5.6)70 b(Cop)n(yrigh)n(t)177 1026 y Fr(The)14 b(F)m(unnelW)m(eb)g +(program)e(is)i(Cop)o(yrigh)o(t)894 1025 y(c)883 1026 y Fq(\015)f +Fr(1992)g(Ross)h(William)o(s.)177 1101 y(Ho)o(w)o(ev)o(er,)28 +b(F)m(unnelW)m(eb)d(has)g(b)q(een)i(released)f(b)o(y)f(the)h(author)g(and)f +(cop)o(yrigh)o(t)f(o)o(wner)i(Ross)f(William)o(s)177 1151 y(\()p +Fl(ross@spam.adelaide.)o(edu.a)o(u)p Fr(\))16 b(under)k(V)m(ersion)f(2)f(of)g +(the)i(GNU)e(General)h(Public)g(License)h(published)177 1201 +y(b)o(y)14 b(the)g(F)m(ree)h(Soft)o(w)o(are)f(F)m(oundation.)i(Here)f(are)g +(some)e(w)o(a)o(ys)g(that)h(y)o(ou)g(can)g(obtain)f(a)h(cop)o(y)f(of)h(this)g +(license.)239 1317 y Fq(\017)21 b Fr(The)14 b(license)h(app)q(ears)g(as)f(an) +f(app)q(endix)h(in)g(the)g Fm(F)m(unnelWeb)i(Hacker's)f(Manual)p +Fr(.)239 1401 y Fq(\017)21 b Fr(If)13 b(y)o(ou)h(ha)o(v)o(e)g(a)f(w)o(orking) +g(v)o(ersion)h(of)f(F)m(unnelW)m(eb,)g(in)o(v)o(ok)o(e)g(it)h(with)f +Fl(fw)22 b(+hlicense)e(+jlicense.txt)p Fr(.)239 1484 y Fq(\017)h +Fr(Lo)q(ok)13 b(in)h(the)g Fl(help)f Fr(mo)q(dule)g(of)g(the)h(F)m(unnelW)m +(eb)g(source)h(co)q(de.)239 1567 y Fq(\017)21 b Fr(FTP)14 b(the)h(license)f +(from)e Fl(prep.ai.mit.edu)f Fr(in)j Fl(/pub/gnu/COPYIN)o(G-2)p +Fr(.)239 1650 y Fq(\017)21 b Fr(W)m(rite)13 b(to)h(the)h(F)m(ree)f(Soft)o(w)o +(are)g(F)m(oundation,)e(Inc.,)h(675)h(Mass)g(Av)o(e,)g(Cam)o(bridge,)d(MA)j +(02139,)e(USA.)177 1767 y(The)i(license)h(allo)o(ws)d(y)o(ou)i(to)f +(redistribute)i(F)m(unnelW)m(eb)f(and/or)f(mo)q(dify)e(it)j(under)g(certain)h +(conditions.)i(The)177 1817 y(license)e(do)q(es)g(not)f(co)o(v)o(er)h(the)g +Fm(F)m(unnelWeb)h(User's)f(Manual)g Fr(and)f Fm(F)m(unnelWeb)i(Hacker's)f +(Manual)g Fr(whic)o(h)f(are)177 1867 y(distributed)h(under)f(a)g(simpler)f +(license)h(that)g(prohibits)g(c)o(hanges.)177 1941 y(Note:)23 +b(F)m(unnelW)m(eb)15 b(is)h(distributed)g(WITHOUT)g(ANY)g(W)-5 +b(ARRANTY;)15 b(without)h(ev)o(en)g(the)h(implied)c(w)o(ar-)177 +1991 y(ran)o(t)o(y)h(of)f(MER)o(CHANT)m(ABILITY)h(or)g(FITNESS)g(F)o(OR)g(A)g +(P)m(AR)m(TICULAR)f(PURPOSE.)177 2154 y Fi(5.7)70 b(No)n(w)n(arran)n(t)n(y) +177 2270 y Fr(Users)15 b(of)e(F)m(unnelW)m(eb)g(should)g(b)q(e)h(a)o(w)o(are) +f(that)h(F)m(unnelW)m(eb)e(comes)h(with)g(no)h(w)o(arran)o(t)o(y)m(.)j(Here)d +(is)g(an)f(extract)177 2320 y(from)e(the)i(GNU)f(General)g(Public)g(License)i +(V)m(ersion)e(2,)g(under)h(whic)o(h)g(F)m(unnelW)m(eb)e(is)i(distributed.)18 +b(F)m(or)12 b(more)177 2369 y(information)f(see)k(Section)g(5.6.)308 +2486 y Fl(11.)21 b(BECAUSE)f(THE)i(PROGRAM)e(IS)h(LICENSED)f(FREE)h(OF)h +(CHARGE,)e(THERE)h(IS)g(NO)h(WARRANTY)264 2536 y(FOR)g(THE)f(PROGRAM,)f(TO)h +(THE)g(EXTENT)g(PERMITTED)f(BY)h(APPLICABLE)f(LAW.)43 b(EXCEPT)20 +b(WHEN)264 2586 y(OTHERWISE)g(STATED)h(IN)g(WRITING)g(THE)g(COPYRIGHT)f +(HOLDERS)g(AND/OR)h(OTHER)f(PARTIES)264 2635 y(PROVIDE)h(THE)g(PROGRAM)f("AS) +h(IS")h(WITHOUT)e(WARRANTY)g(OF)h(ANY)h(KIND,)e(EITHER)h(EXPRESSED)264 +2685 y(OR)h(IMPLIED,)e(INCLUDING,)g(BUT)h(NOT)g(LIMITED)f(TO,)h(THE)h +(IMPLIED)e(WARRANTIES)g(OF)264 2735 y(MERCHANTABILITY)f(AND)i(FITNESS)g(FOR)g +(A)g(PARTICULAR)f(PURPOSE.)42 b(THE)21 b(ENTIRE)g(RISK)g(AS)264 +2785 y(TO)h(THE)f(QUALITY)f(AND)h(PERFORMANCE)f(OF)h(THE)g(PROGRAM)g(IS)g +(WITH)g(YOU.)43 b(SHOULD)20 b(THE)264 2835 y(PROGRAM)h(PROVE)f(DEFECTIVE,)g +(YOU)h(ASSUME)g(THE)g(COST)g(OF)g(ALL)h(NECESSARY)e(SERVICING,)1032 +2940 y Fr(112)p eop +%%Page: 113 114 +113 113 bop 264 42 a Fl(REPAIR)21 b(OR)g(CORRECTION.)308 141 +y(12.)g(IN)g(NO)h(EVENT)f(UNLESS)f(REQUIRED)g(BY)i(APPLICABLE)d(LAW)j(OR)f +(AGREED)g(TO)g(IN)g(WRITING)264 191 y(WILL)g(ANY)g(COPYRIGHT)f(HOLDER,)h(OR)g +(ANY)g(OTHER)g(PARTY)g(WHO)g(MAY)g(MODIFY)g(AND/OR)264 241 +y(REDISTRIBUTE)f(THE)h(PROGRAM)f(AS)i(PERMITTED)d(ABOVE,)i(BE)g(LIABLE)g(TO)g +(YOU)h(FOR)f(DAMAGES,)264 291 y(INCLUDING)f(ANY)h(GENERAL,)g(SPECIAL,)f +(INCIDENTAL)f(OR)j(CONSEQUENTIAL)d(DAMAGES)h(ARISING)264 340 +y(OUT)i(OF)f(THE)g(USE)g(OR)h(INABILITY)e(TO)h(USE)g(THE)g(PROGRAM)g +(\(INCLUDING)e(BUT)j(NOT)f(LIMITED)264 390 y(TO)h(LOSS)f(OF)g(DATA)g(OR)g +(DATA)g(BEING)g(RENDERED)f(INACCURATE)g(OR)h(LOSSES)g(SUSTAINED)f(BY)264 +440 y(YOU)i(OR)f(THIRD)g(PARTIES)f(OR)h(A)h(FAILURE)e(OF)i(THE)f(PROGRAM)f +(TO)i(OPERATE)e(WITH)h(ANY)g(OTHER)264 490 y(PROGRAMS\),)f(EVEN)h(IF)g(SUCH)g +(HOLDER)g(OR)g(OTHER)g(PARTY)g(HAS)g(BEEN)g(ADVISED)f(OF)i(THE)264 +540 y(POSSIBILITY)e(OF)h(SUCH)g(DAMAGES.)177 726 y Fi(5.8)70 +b(Distribution)177 853 y Fr(Users)15 b(of)d(F)m(unnelW)m(eb)h(should)f(b)q(e) +i(a)o(w)o(are)f(that)g(they)h(can)f(distribute)g(the)h(program)e(freely)m(.) +17 b(The)d(follo)o(wing)c(is)177 903 y(an)h(extract)h(from)e(the)i(GNU)f +(General)g(Public)g(License)h(V)m(ersion)g(2,)f(under)h(whic)o(h)f(F)m +(unnelW)m(eb)g(is)g(distributed.)308 1038 y Fl(1.)21 b(You)g(may)h(copy)f +(and)g(distribute)f(verbatim)g(copies)g(of)i(the)f(Program's)264 +1088 y(source)g(code)g(as)g(you)g(receive)g(it,)g(in)g(any)g(medium,)g +(provided)f(that)h(you)264 1138 y(conspicuously)e(and)j(appropriately)d +(publish)h(on)h(each)g(copy)g(an)h(appropriate)264 1187 y(copyright)e(notice) +h(and)g(disclaimer)f(of)h(warranty;)f(keep)h(intact)g(all)g(the)264 +1237 y(notices)g(that)g(refer)f(to)i(this)f(License)f(and)h(to)h(the)f +(absence)f(of)i(any)f(warranty;)264 1287 y(and)h(give)e(any)i(other)e +(recipients)g(of)i(the)f(Program)f(a)i(copy)f(of)g(this)g(License)264 +1337 y(along)g(with)g(the)g(Program.)264 1436 y(You)h(may)f(charge)f(a)i(fee) +f(for)g(the)g(physical)f(act)i(of)f(transferring)e(a)j(copy,)f(and)264 +1486 y(you)h(may)f(at)g(your)g(option)g(offer)f(warranty)g(protection)g(in)i +(exchange)e(for)h(a)g(fee.)177 1622 y Fr(The)14 b(license)h(also)e(allo)o(ws) +g(y)o(ou)g(other)i(freedoms.)j(F)m(or)13 b(more)g(information)e(see)k +(Section)f(5.6.)177 1808 y Fi(5.9)70 b(Mo)r(di\014cation)177 +1935 y Fr(F)m(unnelW)m(eb)16 b(is)g(distributed)g(under)h(a)f(GNU)g(license,) +h(and)f(y)o(ou)g(are)g(free)h(to)f(mo)q(dify)e(the)j(source)g(co)q(de)g(and) +177 1985 y(distribute)12 b(mo)q(di\014ed)e(copies)i(\(see)h(Section)f(5.6\).) +k(Ho)o(w)o(ev)o(er,)c(there)h(are)e(go)q(o)q(d)g(reasons)i(wh)o(y)e(y)o(ou)g +(should)g(a)o(v)o(oid)177 2034 y(doing)i(this.)228 2170 y(1.)20 +b(If)13 b(y)o(ou)g(distribute)h(mo)q(di\014ed)d(v)o(ersions)j(of)f(F)m +(unnelW)m(eb,)f(y)o(ou)h(run)h(the)g(risk)f(of)g(creating)g(a)g(v)o(ersion)h +(that)281 2220 y(will)e(div)o(erge)i(from)f(the)h(\\o\016cial")e(v)o(ersion)i +(of)f(F)m(unnelW)m(eb)h(that)g(I)f(in)o(tend)h(to)g(main)o(tain.)228 +2318 y(2.)20 b(If)13 b(y)o(ou)f(release)i(a)f(v)o(ersion)g(of)g(F)m(unnelW)m +(eb)f(with)h(a)f(c)o(hanged)i(input)f(language,)e(users)k(of)d(y)o(our)h(mo)q +(di\014ed)281 2368 y(v)o(ersion)g(will)f(create)i(source)g(\014les)g(that)f +(will)e(no)i(longer)g(w)o(ork)g(on)g(other)g(v)o(ersions)h(of)e(F)m(unnelW)m +(eb.)17 b(The)281 2418 y(result)e(w)o(ould)e(b)q(e)h(c)o(haos.)177 +2553 y(F)m(or)d(these)i(reasons)g(I)e(request)j(that)d(y)o(ou)g(do)h(not)f +(distribute)h(mo)q(di\014ed)e(v)o(ersions)j(of)e(F)m(unnelW)m(eb,)g +(particularly)177 2603 y(v)o(ersions)19 b(with)g(a)f(mo)q(di\014ed)g +(language.)31 b(Ho)o(w)o(ev)o(er,)20 b(if)e(y)o(ou)g(m)o(ust)g(distribute)h +(a)f(v)o(ersion)h(with)g(a)f(mo)q(di\014ed)177 2653 y(language,)13 +b Fm(ple)n(ase)j(change)g(its)f(name)g Fr(\(i.e.)e(from)g(\\F)m(unnelW)m(eb") +h(to)g(something)f(else\).)20 b(Please)c(also)d(allo)q(cate)177 +2702 y(a)19 b(new)h(\014le)f(extension)i(to)e(replace)h(\\)p +Fl(.fw)p Fr(")e(as)i(the)g(extension)g(for)f(source)i(\014les)e(written)h(in) +f(the)h(mo)q(di\014ed)177 2752 y(language.)177 2835 y(F)m(or)14 +b(more)f(information,)d(refer)15 b(to)f(the)g Fm(F)m(unnelWeb)i(Hacker's)f +(Manual)p Fr(.)1032 2940 y(113)p eop +%%Page: 114 115 +114 114 bop 177 42 a Fi(5.10)70 b(V)-6 b(ersions)177 157 y +Fr(F)m(unnelW)m(eb)1502 b(w)o(as)177 207 y(created)19 b(in)f(1986)f(and)g(w)o +(as)h(used)g(extensiv)o(ely)h(b)o(y)e(Ross)h(William)o(s)d(\()p +Fl(ross@spam.adelaide.)o(edu.a)o(u)p Fr(\))g(for)177 257 y(three)k(y)o(ears.) +29 b(Ho)o(w)o(ev)o(er,)18 b(V)m(ersion)g(1.0)e(w)o(as)h(written)h(in)f(Ada)h +(and)f(w)o(as)g(not)g(v)o(ery)h(p)q(ortable)g(\(it)f(w)o(as)g(fairly)177 +307 y(V)-5 b(AX/VMS)16 b(sp)q(eci\014c\).)24 b(Da)o(vid)14 +b(Hulse)i(\()p Fl(dave@cs.adelaide.e)o(du.au)o Fr(\))d(to)q(ok)i(the)h +(\014rst)g(step)g(to)o(w)o(ards)f(a)g(re-)177 357 y(lease)j(b)o(y)e +(translating)g(the)i(Ada)e(co)q(de)i(in)o(to)e(C.)h(Ross)f(Williams)e(then)j +(extensiv)o(ely)h(rew)o(ork)o(ed)f(the)h(C)e(co)q(de,)177 406 +y(making)c(it)h(robust)i(and)e(p)q(ortable,)h(adding)f(new)h(features,)h(and) +f(p)q(olishing)e(it)i(to)f(its)h(curren)o(t)i(form.)199 523 +y Fl(Vers)43 b(Lang)f(Created)h(Released)63 b(Author)217 b(Copyright)129 +b(Licensing)199 572 y(----)43 b(----)f(-------)h(--------)63 +b(--------------)41 b(-------------)g(---------)199 622 y(V1.0)i(Ada)64 +b(1986)109 b(Never)129 b(Ross)43 b(Williams)f(Ross)21 b(Williams)199 +672 y(V2.0)43 b(C)108 b(1989)h(Never)129 b(David)21 b(Hulse)108 +b(Public)21 b(domain)42 b(No)21 b(restriction.)199 722 y(V3.0)43 +b(C)108 b(1992)h(May-1992)63 b(Ross)43 b(Williams)f(Ross)21 +b(Williams)42 b(GNU)21 b(release.)177 838 y Fr(This)14 b(man)o(ual)d(w)o(as)j +(released)h(for:)286 954 y Fl(*)22 b(FunnelWeb)150 b(V3.0.)286 +1004 y(*)22 b(User's)e(Manual)64 b(V1.0.)286 1054 y(*)22 b(Hacker's)e(Manual) +g(V1.0.)286 1104 y(*)i(TeX)f(Definitions)e(V1.0.)177 1266 y +Fi(5.11)70 b(FTP)23 b(Arc)n(hiv)n(e)f(and)i(Author)177 1382 +y Fr(The)14 b(F)m(unnelW)m(eb)g(FTP)g(arc)o(hiv)o(e)g(is:)243 +1498 y Fl(Machine)63 b(:)22 b(sirius.itd.adelaid)o(e.edu)o(.au)c +([IP=129.127.40.3].)243 1548 y(Directory)h(:)j(~pub/funnelweb/)62 +b(\(or)22 b(a)f(directory)f(of)h(similar)g(name\).)177 1664 +y Fr(The)14 b(author)g(of)g(F)m(unnelW)m(eb)f(and)h(this)g(man)o(ual)d(is:) +243 1780 y Fl(Name:)42 b(Dr)21 b(Ross)g(N.)h(Williams)243 1830 +y(Email:)e(ross@spam.adelaide)o(.edu.)o(au)243 1880 y(Snail:)g(16)h(Lerwick)g +(Avenue,)f(Hazelwood)g(Park)h(5066,)g(Australia.)177 1996 y +Fr(I)11 b(in)o(tend)g(to)g(main)o(tain)d(an)i(\\o\016cial")f(v)o(ersion)i(of) +f(F)m(unnelW)m(eb)h(whic)o(h)f(I)h(will)f(release)i(under)f(GNU)g(license)h +(from)177 2046 y(time)d(to)h(time.)15 b(I)10 b(am)e(happ)o(y)i(to)g(receiv)o +(e)h(constructiv)o(e)g(criticism)e(ab)q(out)h(F)m(unnelW)m(eb)g(and)f(its)h +(do)q(cumen)o(tation.)177 2121 y(I)k(will)e(alw)o(a)o(ys)g(b)q(e)i(happ)o(y)f +(to)h(receiv)o(e)h(mail)10 b(ab)q(out)k(F)m(unnelW)m(eb,)e(but)i(cannot)g +(guaran)o(tee)g(that)f(I)h(will)e(b)q(e)i(able)177 2171 y(to)g(reply)g(to)g +(it)f(immediately)l(.)1032 2940 y(114)p eop +%%Page: 115 116 +115 115 bop 177 379 a Fj(App)s(endix)34 b(A)177 612 y Fp(Glossary)177 +854 y Fo(Analyser:)20 b Fr(A)15 b(comp)q(onen)o(t)f(of)h(the)g(F)m(unnelW)m +(eb)g(program)e(that)i(c)o(hec)o(ks)i(the)e(macro)f(table)h(created)h(b)o(y)f +(the)177 903 y(parser)g(for)f(errors.)19 b(F)m(or)14 b(example,)e(the)i +(analyser)g(c)o(hec)o(ks)h(to)f(see)h(if)e(an)o(y)h(macro)e(without)i(a)f +Fl(@Z)h Fr(has)g(not)g(b)q(een)177 953 y(called.)177 1029 y +Fo(Argumen)o(t:)h Fr(A)d(string)f(delimited)f(b)o(y)h(blanks)g(app)q(earing)h +(on)f(the)h(F)m(unnelW)m(eb)f(command)d(line.)17 b(Argumen)o(ts)177 +1079 y(are)d(used)h(to)f(con)o(trol)g(options.)177 1154 y Fo(Directiv)o(e:)j +Fr(A)e(F)m(unnelW)m(eb)e(sp)q(ecial)i(sequence)i(or)d(co)q(op)q(erating)h +(group)f(of)g(sp)q(ecial)g(sequences)j(that)e(do)f(not)177 +1204 y(form)e(part)i(of)g(a)f(macro)g(de\014nition.)18 b(A)13 +b(directiv)o(e)i(can)f(tak)o(e)g(the)g(form)f(of)g(a)g(pragma.)177 +1280 y Fo(Do)q(cumen)o(tation:)i Fr(Descriptiv)o(e)g(text.)177 +1355 y Fo(Do)q(cumen)o(tation)i(\014le:)25 b Fr(An)18 b(output)g(\014le,)h +(pro)q(duced)g(b)o(y)f(the)g(W)m(ea)o(v)o(e)f(comp)q(onen)o(t)h(of)f(F)m +(unnelW)m(eb,)h(that)177 1405 y(con)o(tains)c(t)o(yp)q(esetter)i(commands.)g +(When)e(fed)g(in)o(to)f(the)i(appropriate)f(t)o(yp)q(esetter)i(program,)c +(the)j(result)f(is)g(a)177 1455 y(t)o(yp)q(eset)i(image)11 +b(of)j(the)g(input)g(\014le.)177 1531 y Fo(F)l(ree)19 b(text:)24 +b Fr(The)17 b(text)h(in)e(an)h(input)g(\014le)g(that)g(remains)f(if)g(one)h +(w)o(ere)h(to)e(remo)o(v)o(e)g(macro)g(de\014nitions)h(and)177 +1580 y(directiv)o(es.)177 1656 y Fo(F)l(unnelW)l(eb:)27 b Fr(This)19 +b(w)o(ord)f(has)i(a)e(n)o(um)o(b)q(er)g(of)h(di\013eren)o(t)h(meanings)d(all) +h(p)q(ertaining)h(to)g(the)g(F)m(unnelW)m(eb)177 1706 y(system)g(of)g +(programming.)32 b(1\))19 b(The)h(en)o(tire)g(system)g(of)f(programmi)o(ng)d +(as)k(in)f(\\Ma)o(yb)q(e)h(F)m(unnelW)m(eb)f(can)177 1756 y(help.")k(2\))15 +b(The)h(computer)f(program)f(that)i(implem)o(en)o(ts)e(the)i(system)f(as)h +(in)f(\\Run)g(it)g(through)g(F)m(unnelW)m(eb)177 1805 y(and)d(see)h(what)f +(comes)f(out.")17 b(3\))12 b(The)g(language)f(implemen)o(ted)f(b)o(y)h(the)i +(F)m(unnelW)m(eb)e(program)f(as)i(in)g(\\I)f(wrote)177 1855 +y(the)k(program)d(in)h(F)m(unnelW)m(eb.")18 b(or)13 b(\\I)h(wrote)g(the)h +(program)d(in)i(Ada)f(using)h(F)m(unnelW)m(eb.".)177 1931 y +Fo(F)l(unnelW)l(eb)g(\014le:)j Fr(A)d(\014le)g(whose)g(con)o(ten)o(ts)h(are)g +(written)f(in)f(the)i(F)m(unnelW)m(eb)e(language.)177 2006 +y Fo(F)l(unnelW)l(eb)h(language:)j Fr(The)d(language)f(in)g(whic)o(h)h(F)m +(unnelW)m(eb)f(input)h(\014les)g(are)h(written.)177 2082 y +Fo(F)l(unnelW)l(eb)i(prop)q(er:)24 b Fr(Usually)m(,)16 b(when)h(F)m(unnelW)m +(eb)g(is)g(in)o(v)o(ok)o(ed,)f(it)h(pro)q(cesses)j(a)c(single)h(input)g +(\014le)g(and)177 2132 y(then)e(terminates.)i(Ho)o(w)o(ev)o(er,)d(it)f(also)g +(has)h(a)g(command)d(language)i(mo)q(de)f(in)i(whic)o(h)f(it)h(is)f(p)q +(ossible)h(to)g(in)o(v)o(ok)o(e)177 2182 y(\\F)m(unnelW)m(eb")g(man)o(y)e +(times.)19 b(This)14 b(leads)h(to)f(confusion)g(b)q(et)o(w)o(een)i(\\F)m +(unnelW)m(eb")d(the)i(outer)g(program)e(and)177 2232 y(\\F)m(unnelW)m(eb")19 +b(the)h(inner)g(program.)34 b(T)m(o)18 b(a)o(v)o(oid)h(this)g(confusion,)i +(the)f(inner)g(F)m(unnelW)m(eb)f(is)h(sometimes)177 2281 y(referred)c(to)e +(as)g(\\F)m(unnelW)m(eb)f(prop)q(er".)177 2357 y Fo(FW:)i Fr(An)f +(abbreviation)f(for)g(\\F)m(unnelW)m(eb")g(that)h(is)g(used)h(wherev)o(er)g +(appropriate.)177 2433 y Fo(Include)f(\014le:)j Fr(A)d(\014le)g(read)h(in)e +(b)o(y)h(F)m(unnelW)m(eb)f(as)h(the)h(result)f(of)g(an)f(include)h(pragma)e +(\()p Fl(@i)22 b(filename)p Fr(\).)177 2508 y Fo(Input)16 b(\014le:)k +Fr(An)o(y)c(\014le)f(read)h(in)f(b)o(y)g(F)m(unnelW)m(eb.)22 +b(The)16 b(phrase)g(\\the)g(input)f(\014le")g(refers)i(to)f(the)g(ro)q(ot)f +(input)177 2558 y(\014le)f(\(sp)q(eci\014ed)i(using)d(the)i +Fl(+F)e Fr(option\).)177 2634 y Fo(Journal)h(\014le:)k Fr(An)c(output)g +(\014le)g(con)o(taining)f(a)h(cop)o(y)f(of)h(the)g(output)h(sen)o(t)g(to)e +(the)i(user's)g(console)f(during)g(an)177 2683 y(in)o(v)o(o)q(cation)f(of)g +(F)m(unnelW)m(eb.)18 b(In)13 b(other)i(systems,)f(this)g(\014le)f(is)h +(sometimes)e(called)i(a)f(\\log)g(\014le".)177 2759 y Fo(Listing)g(\014le:)k +Fr(An)d(output)h(\014le)e(summarizing)e(the)k(result)f(of)g(pro)q(cessing)h +(an)e(input)h(\014le.)177 2835 y Fo(Macro:)19 b Fr(A)14 b(binding)f(of)g(a)h +(name)f(to)g(a)h(string.)1032 2940 y(115)p eop +%%Page: 116 117 +116 116 bop 177 42 a Fo(Macro)14 b(de\014nition)o(:)h Fr(A)d(construct)i(app) +q(earing)e(in)g(a)g(F)m(unnelW)m(eb)f(\014le)h(that)h(binds)f(a)g(name)f(to)h +(a)f(text)i(string.)177 91 y(A)h(F)m(unnelW)m(eb)f(\014le)h(consists)h(of)f +(a)f(series)i(of)f(macro)e(de\014nitions)i(surrounded)h(b)o(y)f(do)q(cumen)o +(tary)f(text.)177 166 y Fo(Mapp)q(er:)18 b Fr(A)13 b(comp)q(onen)o(t)f(of)g +(the)h(F)m(unnelW)m(eb)f(program)g(that)g(reads)i(in)e(the)i(input)e(\014le)h +(and)g(creates)h(a)f(cop)o(y)177 216 y(of)g(it)h(in)f(memory)m(.)177 +291 y Fo(Option:)j Fr(An)e(parameter)f(in)o(ternal)f(to)i(the)f(F)m(unnelW)m +(eb)g(program)f(whic)o(h)h(can)h(b)q(e)f(con)o(trolled)g(b)o(y)h(command)177 +340 y(line)g(argumen)o(ts)f(or)h(pragmas.)177 415 y Fo(Output)h(\014le:)21 +b Fr(An)o(y)15 b(\014le)g(written)h(b)o(y)f(F)m(unnelW)m(eb.)22 +b(This)16 b(includes)g(listing,)e(journal,)g(pro)q(duct,)i(and)g(do)q(cu-)177 +465 y(men)o(tation)e(\014les.)21 b(\(W)m(arning:)f(During)14 +b(most)g(of)g(F)m(unnelW)m(eb's)h(dev)o(elopmen)o(t)f(the)i(term)e(\\output)h +(\014le")g(w)o(as)177 515 y(also)10 b(used)i(to)f(refer)h(to)f(what)g(are)g +(no)o(w)f(called)h(\\pro)q(duct)h(\014les".)17 b(This)11 b(turned)g(out)g(to) +g(b)q(e)h(extremely)e(confusing)177 565 y(and)j(so)h(the)f(term)g(\\pro)q +(duct)h(\014le")f(w)o(as)g(in)o(v)o(en)o(ted)g(to)h(distinguish)e(the)i +(generic)g(from)e(the)i(sp)q(eci\014c.)19 b(Ho)o(w)o(ev)o(er,)177 +614 y(as)14 b(this)g(w)o(as)g(a)f(late)h(mo)q(di\014cation,)d(y)o(ou)j(ma)o +(y)e(\014nd)i(some)f(o)q(ccurrences)k(of)c(the)i(old)e(use)h(of)g(\\output)g +(\014le".\).)177 689 y Fo(P)o(arser:)20 b Fr(A)15 b(comp)q(onen)o(t)f(of)h +(the)h(F)m(unnelW)m(eb)e(program)g(that)h(pro)q(cesses)i(the)f(tok)o(en)f +(list)g(generated)h(b)o(y)f(the)177 739 y(scanner)i(and)f(pro)q(duces)h(a)f +(macro)e(table)i(and)f(a)h(do)q(cumen)o(t)f(list.)23 b(The)17 +b(parser)g(mainly)c(analyses)j(the)g(input)177 789 y(\014le)e(at)g(the)g(syn) +o(tactic)h(lev)o(el,)e(but)h(also)f(do)q(es)i(some)e(ligh)o(t)o(w)o(eigh)o(t) +f(seman)o(tic)h(c)o(hec)o(king)h(to)q(o.)177 863 y Fo(Pragma:)j +Fr(Single-line)11 b(directiv)o(es)j(that)e(app)q(ears)h(in)f(F)m(unnelW)m(eb) +f(\014les.)18 b(Pragmas)11 b(con)o(trol)h(ev)o(erything)h(from)177 +913 y(maxim)n(um)d(input)k(line)f(length)h(to)g(t)o(yp)q(esetter)i(dep)q +(endence.)k(A)14 b(pragma)e(line)i(starts)h(with)e(\\)p Fl(@p)p +Fr(".)177 988 y Fo(Prin)o(ted)18 b(do)q(cumen)o(tation:)25 +b Fr(Sheets)c(of)d(pap)q(er)i(resulting)e(from)g(actually)g(t)o(yp)q +(esetting)h(and)g(prin)o(ting)f(a)177 1038 y(do)q(cumen)o(tation)13 +b(\014le.)177 1112 y Fo(Pro)q(duct)e(\014le:)k Fr(An)c(output)g(\014le,)g +(generated)h(b)o(y)e(the)i(T)m(angle)d(comp)q(onen)o(t)h(of)g(F)m(unnelW)m +(eb,)h(that)g(con)o(tains)f(the)177 1162 y(expansion)k(of)g(the)h(macros)e +(in)h(the)h(input)f(\014le.)19 b(Note:)g(Other)d(names)d(considered)j(for)d +(this)i(w)o(ere:)k(generated)177 1212 y(\014le,)14 b(expanded)g(\014le,)g +(result)g(\014le,)g(program)e(\014le,)h(and)h(tangle)g(\014le.)177 +1287 y Fo(Scanner:)j Fr(A)d(comp)q(onen)o(t)e(of)h(the)h(F)m(unnelW)m(eb)f +(program)f(that)i(scans)g(a)f(cop)o(y)h(of)e(the)j(input)e(\014le)g(in)g +(memory)177 1337 y(and)h(generates)i(a)e(line)g(list)f(and)h(a)g(tok)o(en)g +(list)g(to)g(b)q(e)h(fed)f(to)g(the)h(parser.)20 b(The)15 b(scanner)g(pro)q +(cesses)i(the)e(input)177 1386 y(at)f(the)g(lexical)f(lev)o(el.)177 +1461 y Fo(Script:)k Fr(A)d(\014le)f(con)o(taining)g(F)m(unnelW)m(eb)h(shell)f +(commands.)177 1536 y Fo(Shell:)i Fr(A)c(command)d(language)i(in)o(terpreter) +j(built)d(in)o(to)g(the)i(F)m(unnelW)m(eb)e(program.)16 b(The)11 +b(in)o(terpreter)i(allo)o(ws)177 1586 y(the)19 b(user)f(to)g(in)o(v)o(ok)o(e) +f(F)m(unnelW)m(eb)g(prop)q(er)i(man)o(y)d(times)h(during)g(a)h(single)f(in)o +(v)o(o)q(cation)g(of)g(the)h(F)m(unnelW)m(eb)177 1636 y(program.)177 +1710 y Fo(Sp)q(ecial)12 b(c)o(haracter:)17 b Fr(A)c(distinguished)f(c)o +(haracter)i(in)d(a)h(F)m(unnelW)m(eb)g(input)g(\014le)h(that)f(in)o(tro)q +(duces)h(a)g(sp)q(ecial)177 1760 y(sequence.)32 b(By)19 b(default)e(the)i(sp) +q(ecial)f(c)o(haracter)h(is)f(\\)p Fl(@)p Fr(".)29 b(Ho)o(w)o(ev)o(er,)19 +b(it)f(can)g(b)q(e)g(c)o(hanged)h(using)e(the)i(\\)p Fl(@=)p +Fr(")177 1810 y(sp)q(ecial)14 b(sequence.)177 1885 y Fo(Sp)q(ecial)f +(sequence:)k Fr(A)12 b(sp)q(ecial)h(sequence)i(is)e(a)f(construct)i(in)o(tro) +q(duced)f(b)o(y)g(the)g(sp)q(ecial)g(c)o(haracter.)19 b(Sp)q(ecial)177 +1934 y(sequences)e(are)e(used)g(to)g(de\014ne)g(a)f(structure)j(in)d(a)g(F)m +(unnelW)m(eb)g(input)g(\014le)g(that)h(exists)g(at)f(a)g(higher)h(lev)o(el)f +(to)177 1984 y(the)k(surrounding)g(text.)29 b(A)17 b(F)m(unnelW)m(eb)g(input) +g(\014le)g(ma)o(y)f(b)q(e)i(considered)h(to)e(b)q(e)h(a)f(sequence)i(of)e +(text)h(and)177 2034 y(sp)q(ecial)c(sequences.)177 2109 y Fo(T)l(angle:)21 +b Fr(This)16 b(is)f(the)h(name)e(for)i(the)g(comp)q(onen)o(t)e(of)h(F)m +(unnelW)m(eb)g(that)h(generates)h(one)f(or)f(more)g(pro)q(duct)177 +2159 y(\014les)f(con)o(taining)f(the)i(expansion)e(of)h(macros)f(in)g(the)i +(input)e(\014le.)177 2233 y Fo(T)o(yp)q(esetting)h(directiv)o(e:)j +Fr(A)e(F)m(unnelW)m(eb)f(directiv)o(e)h(whose)h(sole)e(e\013ect)i(is)f(to)f +(mo)q(dify)f(the)i(w)o(a)o(y)f(in)g(whic)o(h)177 2283 y(the)h(input)e(\014le) +h(is)g(represen)o(ted)j(in)c(the)i(do)q(cumen)o(tation)d(\014le.)177 +2358 y Fo(W)l(ea)o(v)o(e:)23 b Fr(This)16 b(is)f(the)i(name)e(for)g(the)i +(comp)q(onen)o(t)e(of)g(F)m(unnelW)m(eb)h(that)g(generates)h(a)f(do)q(cumen)o +(tation)f(\014le)177 2408 y(con)o(taining)e(t)o(yp)q(esetting)i(commands)c +(represen)o(ting)16 b(the)e(input)g(\014le.)1032 2940 y(116)p +eop +%%Page: 117 118 +117 117 bop 177 378 a Fj(App)s(endix)34 b(B)177 610 y Fp(References)177 +851 y Fo([ANSI])21 b Fr(Australian)f(Standard)h(AS)f(3955-1991,)f +(\\Programming)e(Languages)j(|)g(C",)g(\(ISBN:)g(0-7262-)177 +901 y(6970-0\),)c(12)h(July)g(1991.)27 b(Iden)o(tical)17 b(to:)24 +b(In)o(ternational)17 b(Standard)g(ISO/IEC)h(9899:)23 b(1990)16 +b(Programming)177 951 y(Languages)e(|)f(C.)177 1025 y Fo([ANZE])k +Fr(\\Australia,)f(New)g(Zealand)g(Encyclop)q(edia",)g(En)o(try:)22 +b(\\F)m(unnel-w)o(eb)15 b(spiders",)i(V)m(ol)e(7,)g(pp.)h(564{)177 +1075 y(565,)d(Ba)o(y)h(Bo)q(oks,)f(Sydney)m(,)h(\(ISBN:)g(85835{127{7\),)d +(1975.)177 1150 y Fo([BSI82])f Fr(British)h(Standards)g(Institute,)g(\\Sp)q +(eci\014cation)g(for)f(Computer)g(Programmi)o(ng)e(Language)i(P)o(ascal",)177 +1200 y(Publication)15 b(BS6192:1982,)e(British)j(Standards)g(Institute,)h(P)m +(.O.)e(Bo)o(x)g(372,)g(Milton)f(Keynes,)j(MK146LO,)177 1249 +y(1982.)177 1324 y Fo([Gries81])8 b Fr(Gries)i(D.,)f(\\The)h(Science)h(of)e +(Programming)o(",)e(Springer-V)m(erlag,)j(\(ISBN:)g(0-387-90641-X\),)c(1981.) +177 1399 y Fo([Humphries91])13 b Fr(Humphries)i(B,)g(\\Neglected)h(P)o(o)q +(ems)f(and)g(Other)h(Creatures",)h(Angus)f(and)f(Rob)q(ertson,)177 +1449 y(Sydney)m(,)f(\(ISBN:)g(0-207-17212-9\),)c(1991.)177 +1523 y Fo([Kernighan88])15 b Fr(Kernighan)i(B.W.,)g(Ritc)o(hie)f(D.M.,)g +(\\The)h(C)g(Programming)c(Language",)k(\(second)h(edi-)177 +1573 y(tion,\\ANSI)13 b(C"\),)g(Pren)o(tice)j(Hall,)c(\(ISBN:)i +(0-13-110362-8\),)d(1988.)177 1648 y Fo([Kn)o(uth83])j Fr(Kn)o(uth)h(D.E.,)f +(\\The)h(WEB)g(System)f(of)h(Structured)h(Do)q(cumen)o(tation",)d(\(W)m(eb)i +(User)h(Man)o(ual,)177 1698 y(V)m(ersion)e(2.5,)f(No)o(v)o(em)o(b)q(er,)f +(1983\),)h(Stanford)g(Univ)o(ersit)o(y)m(,)g(1983.)177 1773 +y Fo([Kn)o(uth84])f Fr(Kn)o(uth)j(D.E.,)d(\\The)i(T)767 1781 +y(E)790 1773 y(Xb)q(o)q(ok",)f(Addison-W)m(esley)m(,)g(\(ISBN:)h +(0-201-13448-9\),)d(1984.)177 1847 y Fo([Kn)o(uth84])h Fr(Kn)o(uth)i(D.E.,)e +(\\Literate)i(Programmi)o(ng",)c Fm(The)k(Computer)h(Journal)p +Fr(,)e(V)m(ol.)e(27,)i(No.)g(2,)f(pp.)h(97-)177 1897 y(111,)g(1984.)k(Note:)h +(The)d(author)e(of)h(this)g(man)o(ual)d(has)j(not)g(y)o(et)g(obtained)g(this) +g(pap)q(er.)177 1972 y Fo([Lamp)q(ort86])h Fr(Lamp)q(ort)h(L.,)g(\\L)723 +1967 y Fk(a)742 1972 y Fr(T)765 1984 y(E)788 1972 y(X:)g(A)g(Do)q(cumen)o(t)g +(Preparation)h(System",)f(Addison-W)m(esley)m(,)g(\(ISBN:)177 +2022 y(0-201-15790-X\),)11 b(1986.)177 2096 y Fo([Roso)o(vsky90])16 +b Fr(Roso)o(vsky)f(H.,)h(\\The)g(Univ)o(ersit)o(y:)23 b(An)16 +b(Owner's)h(Man)o(ual",)e(W.W.Norton)f(&)j(Compan)o(y)m(,)177 +2146 y(Inc.,)d(\(ISBN:)g(0-393-02782-1\),)c(1990.)177 2221 +y Fo([Smith91])16 b Fr(Smith)h(L.M.C.,)g(\\An)i(Annotated)f(Bibliograph)o(y)f +(of)h(Literate)h(Programming)o(",)d(A)o(CM)i(SIG-)177 2271 +y(PLAN)c(Notices,)h(V)m(ol.)d(26,)h(No.)g(1,)g(Jan)o(uary)h(1991.)177 +2345 y Fo([Strunk79])d Fr(Strunk)i(W.,)f(White)g(E.B.,)h(\\The)g(Elemen)o(ts) +f(of)g(St)o(yle",)g(Third)h(Edition,)f(MacMillan)f(Publish-)177 +2395 y(ing)i(Compan)o(y)m(,)e(New)k(Y)m(ork,)e(\(ISBN:)h(0-02-418200-1\),)c +(1979.)177 2470 y Fo([USDOD83])17 b Fr(\\The)i(Programming)c(Language)j(Ada)g +(Reference)i(Man)o(ual",)e(American)g(National)f(Stan-)177 +2520 y(dards)e(Institute)f(Inc,)g(ANSI/MIL-STD-1815A-1983,)d(1983.)1032 +2940 y(117)p eop +%%Page: 118 119 +118 118 bop 177 279 a Fp(Index)177 487 y Fr(+=)15 b(tutorial)e(26)177 +537 y(+=)i(85)177 587 y(2167A)e(51)177 637 y(==)i(tutorial)e(26)177 +687 y(==)i(85)177 737 y(@!)f(37)177 787 y(@!)g(75)177 837 y(@")g(29)177 +886 y(@\()g(29)177 936 y(@\))g(29)177 986 y(@+)h(20)177 1036 +y(@+)g(76)177 1086 y(@,)f(29)177 1136 y(@-)g(23)177 1186 y(@-)g(77)177 +1236 y(@1...)f(28)177 1286 y(@1...)g(86)177 1336 y(@<)h(20)177 +1386 y(@=)h(20)177 1436 y(@>)f(20)177 1486 y(@A...)f(34)177 +1536 y(@braces)j(20)177 1586 y(@braces)g(37)177 1636 y(@circum\015ex)e(74)177 +1686 y(@dollar)f(22)177 1736 y(@hash)i(76)177 1786 y(@i)f(30)177 +1836 y(@i)g(77)177 1886 y(@M)g(tutorial)f(24)177 1935 y(@M)h(85)177 +1985 y(@O)h(20)177 2035 y(@O)g(22)177 2085 y(@slash)f(37)177 +2135 y(@Z)h(tutorial)e(24)177 2185 y(@Z)i(85)177 2235 y(absen)o(t)g(command)c +(93)177 2285 y(abstract)k(data)e(t)o(yp)q(e)i(55)177 2335 y(abstraction)f(co) +q(de)h(56)177 2385 y(abstraction)f(data)g(26)177 2435 y(abstraction)g(set)h +(59)177 2485 y(abuse)g(commen)o(ts)d(57)177 2535 y(access)k(random)c(50)177 +2585 y(ac)o(kno)o(wledgemen)o(ts)h(11)177 2635 y(action)h(execution)g(order)h +(71)177 2685 y(Action)f(options)g(70)177 2735 y(actual)g(parameters)g(29)177 +2785 y(Ada)g(11)177 2835 y(Ada)g(44)1136 487 y(Ada)f(49)1136 +537 y(Ada)g(51)1136 587 y(Ada)g(55)1136 637 y(additiv)o(e)g(macros)g(26)1136 +687 y(additiv)o(e)g(macro)f(26)1136 737 y(additiv)o(ely)g(de\014ned)j(85)1136 +787 y(Adelaide)e(Univ)o(ersit)o(y)h(59)1136 837 y(admin)d(directory)k(102) +1136 886 y(administration)c(F)m(unnelW)m(eb)i(109)1136 936 +y(ADT)g(55)1136 986 y(alias)f(49)1136 1036 y(Analyser)i(115)1136 +1086 y(analyser)g(65)1136 1136 y(analyser)g(88)1136 1186 y(analysis)f(static) +h(88)1136 1236 y(Andrew)g(T)m(rev)o(orro)o(w)g(13)1136 1286 +y(animal)d(p)q(o)q(em)i(30)1136 1336 y(ann)o(ual)g(rep)q(ort)h(58)1136 +1386 y(anon)o(ymous)e(ftp)h(101)1136 1436 y(ANSI)h(109)1136 +1486 y(ANSI)g(117)1136 1536 y(answ)o(ers)h(correct)g(102)1136 +1586 y(answ)o(ers)g(directory)f(102)1136 1636 y(ANZE)g(117)1136 +1686 y(ANZE)g(19)1136 1736 y(applications)e(F)m(unnelW)m(eb)i(53)1136 +1786 y(arbitrary)f(c)o(haracters)j(inserting)e(in)o(to)f(text)i(74)1136 +1836 y(arc)o(hitecture)g(seman)o(tic)e(64)1136 1886 y(arc)o(hiv)o(e)h(ftp)f +(114)1136 1935 y(arc)o(hiv)o(e)h(F)m(unnelW)m(eb)f(114)1136 +1985 y(argumen)o(t)f(command)g(line)h(67)1136 2035 y(argumen)o(ts)g(67)1136 +2085 y(Argumen)o(t)g(115)1136 2135 y(assertion)h(sev)o(erit)o(y)h(65)1136 +2185 y(assertion)f(status)h(90)1136 2235 y(A)o(trax)f(robustus)g(19)1136 +2285 y(attributes)g(macro)f(85)1136 2335 y(author)h(con)o(tacting)f(114)1136 +2385 y(B)h(option)f(68)1136 2435 y(Barry)h(Dwy)o(er)g(11)1136 +2485 y(Barry)g(Dwy)o(er)g(59)1136 2535 y(Barry)g(Humphries)f(19)1136 +2585 y(BASIC)h(57)1136 2635 y(Begg)g(Jerem)o(y)g(11)1136 2685 +y(binding)f(problems)f(57)1136 2735 y(bindings)h(macro)g(22)1136 +2785 y(blank)g(inden)o(tation)g(78)1136 2835 y(blank)g(inden)o(tation)g(78) +1032 2940 y(118)p eop +%%Page: 119 120 +119 119 bop 177 42 a Fr(blanks)14 b(trailing)e(42)177 91 y(b)q(oring)i +(organization)e(50)177 141 y(Brissenden)k(Roger)e(11)177 191 +y(BSI82)g(117)177 241 y(BSI82)g(15)177 291 y(BSI82)g(18)177 +341 y(C)g(header)h(57)177 391 y(C)f(option)f(68)177 441 y(C)h(prepro)q +(cessor)i(20)177 490 y(C)e(prepro)q(cessor)i(57)177 540 y(calls)e(macro)e(86) +177 590 y(calls)i(n)o(um)o(b)q(er)f(23)177 640 y(camera)g(p)q(o)q(em)g(30)177 +690 y(case)i(dep)q(endence)i(67)177 740 y(c)o(hanging)c(sp)q(ecial)h(c)o +(haracter)i(31)177 790 y(c)o(haracters)g(con)o(trol)d(42)177 +840 y(c)o(haracters)j(non-prin)o(table)d(96)177 889 y(c)o(haracters)j(unprin) +o(table)d(71)177 939 y(c)o(hec)o(ks)i(macro)e(88)177 989 y(c)o(heer)j(hac)o +(k)o(er's)e(35)177 1039 y(c)o(heer)i(programmer's)11 b(35)177 +1089 y(co)q(de)k(abstraction)f(56)177 1139 y(co)q(de)h(explaining)d(17)177 +1189 y(co)q(de)j(gardening)e(53)177 1239 y(co)q(de)i(vs)f(do)q(cumen)o +(tation)f(32)177 1288 y(co)q(dify)h(command)d(93)177 1338 y(command)g(absen)o +(t)k(93)177 1388 y(command)c(co)q(dify)j(93)177 1438 y(command)d(compare)i +(93)177 1488 y(command)e(de\014ne)k(91)177 1538 y(command)c(de\014ne)k(94)177 +1588 y(command)c(di\013summary)g(95)177 1638 y(command)g(di\013zero)k(95)177 +1687 y(command)c(di\013)j(94)177 1737 y(command)d(eneo)k(95)177 +1787 y(command)c(execute)16 b(96)177 1837 y(command)11 b(exists)k(96)177 +1887 y(command)c(\014xeols)j(96)177 1937 y(command)d(fw)j(97)177 +1987 y(command)d(help)j(97)177 2037 y(command)d(here)k(98)177 +2086 y(command)c(in)o(terpreter)16 b(47)177 2136 y(command)11 +b(length)j(91)177 2186 y(command)d(line)j(argumen)o(t)e(67)177 +2236 y(command)f(line)j(in)o(terface)g(66)177 2286 y(command)d(line)j +(options)f(syn)o(tax)h(67)177 2336 y(command)d(line)j(parsing)f(66)177 +2386 y(command)e(line)j(pro)q(cessing)h(66)177 2436 y(command)c(line)j(pro)q +(cessing)h(92)177 2486 y(command)c(line)j(syn)o(tax)g(67)177 +2535 y(command)d(options)j(92)177 2585 y(command)d(quit)j(98)177 +2635 y(command)d(set)k(48)177 2685 y(command)c(set)k(98)177 +2735 y(command)c(shell)j(F)m(unnelW)m(eb)f(90)177 2785 y(command)e(sho)o(w)j +(48)177 2835 y(command)d(sho)o(w)j(98)1136 42 y(command)d(skipto)i(98)1136 +91 y(command)e(status)j(99)1136 141 y(command)d(tolerate)j(100)1136 +191 y(command)d(trace)k(on)e(48)1136 241 y(command)e(trace)k(100)1136 +291 y(command)c(v)o(erb)j(fw)g(66)1136 341 y(command)d(writeu)j(100)1136 +391 y(command)d(write)j(100)1136 441 y(commands)d(F)m(unnelW)m(eb)i(90)1136 +490 y(commands)e(shell)j(93)1136 540 y(commands)d(useful)j(47)1136 +590 y(commen)o(ts)e(abuse)i(57)1136 640 y(commen)o(ts)e(eliminating)f(57)1136 +690 y(commen)o(ts)h(F)m(unnelW)m(eb)h(75)1136 740 y(commen)o(ts)f(37)1136 +790 y(commitm)n(en)o(t)g(F)m(unnelW)m(eb)h(109)1136 840 y(compare)g(command)e +(93)1136 889 y(compilers)h(F)m(ortran)i(42)1136 939 y(compiling)d(F)m(unnelW) +m(eb)i(105)1136 989 y(complete)g(example)f(38)1136 1039 y(conditionals)g +(fudging)h(44)1136 1089 y(console)h(output)g(suppress)i(69)1136 +1139 y(constructs)g(section)e(83)1136 1189 y(con)o(tacting)f(author)h(114) +1136 1239 y(con)o(ten)o(ts)h(table)e(of)h(81)1136 1288 y(con)o(text)g +(in\014nite)g(68)1136 1338 y(con)o(text)g(listing)f(\014le)h(68)1136 +1388 y(con)o(text)g(69)1136 1438 y(con)o(trol)f(c)o(haracters)j(inserting)e +(in)o(to)f(text)i(74)1136 1488 y(con)o(trol)e(c)o(haracters)j(42)1136 +1538 y(con)o(trollabilit)o(y)11 b(18)1136 1588 y(cop)o(yrigh)o(t)i(F)m +(unnelW)m(eb)g(112)1136 1638 y(cop)o(yrigh)o(t)g(notice)h(1)1136 +1687 y(correct)h(answ)o(ers)g(102)1136 1737 y(cross)g(reference)h(n)o(um)o(b) +q(ering)d(89)1136 1787 y(cross)i(referencing)g(17)1136 1837 +y(cross)g(referencing)g(89)1136 1887 y(cryptic)f(text)h(\014les)f(55)1136 +1937 y(D)f(option)g(49)1136 1987 y(D)g(option)g(68)1136 2037 +y(dangers)h(F)m(unnelW)m(eb)g(50)1136 2086 y(data)f(abstraction)h(26)1136 +2136 y(Da)o(vid)e(Hulse)j(11)1136 2186 y(debugger)f(53)1136 +2236 y(debugging)f(wholistic)g(53)1136 2286 y(default)g(options)h(49)1136 +2336 y(default)f(options)h(92)1136 2386 y(default)f(sp)q(ecial)h(c)o +(haracter)i(72)1136 2436 y(de\014ne)f(command)c(91)1136 2486 +y(de\014ne)k(command)c(94)1136 2535 y(de\014nition)i(F)m(unnelW)m(eb)g(63) +1136 2585 y(de\014nition)g(macro)g(85)1136 2635 y(de\014nition)g(macro)g(87) +1136 2685 y(delete)i(output)f(\014les)g(49)1136 2735 y(delete)h(output)f +(option)f(68)1136 2785 y(delimiting)e(macro)h(parameter)i(87)1136 +2835 y(dep)q(endence)i(case)f(67)1032 2940 y(119)p eop +%%Page: 120 121 +120 120 bop 177 42 a Fr(dep)q(endencies)17 b(\014le)c(49)177 +91 y(dev)o(elopmen)o(t)g(time)g(17)177 141 y(diagnostics)h(lev)o(els)g(of)f +(65)177 191 y(diagnostics)h(65)177 241 y(dictionary)f(hac)o(k)o(er's)i(35)177 +291 y(di\013)f(command)d(94)177 341 y(di\013erences)16 b(\014le)e(94)177 +391 y(di\013summary)d(command)g(95)177 441 y(di\013zero)k(command)c(95)177 +490 y(directiv)o(e)k(emphasis)e(85)177 540 y(directiv)o(e)i(literal)e(84)177 +590 y(directiv)o(e)i(newpage)f(37)177 640 y(directiv)o(e)h(table)e(of)h(con)o +(ten)o(ts)h(37)177 690 y(directiv)o(e)g(title)e(37)177 740 +y(directiv)o(e)i(vskip)e(37)177 790 y(directiv)o(es)i(t)o(yp)q(esetter)h(81) +177 840 y(directiv)o(es)f(32)177 889 y(directiv)o(es)g(83)177 +939 y(Directiv)o(e)f(115)177 989 y(directory)h(admin)d(102)177 +1039 y(directory)j(answ)o(ers)g(102)177 1089 y(directory)g(hac)o(kman)d(103) +177 1139 y(directory)j(results)g(103)177 1189 y(directory)g(scripts)g(103)177 +1239 y(directory)g(sources)g(103)177 1288 y(directory)g(tests)g(104)177 +1338 y(directory)g(tree)g(102)177 1388 y(directory)g(userman)e(105)177 +1438 y(directory)i(70)177 1488 y(Distribution)e(F)m(unnelW)m(eb)h(113)177 +1538 y(do)q(cumen)o(t)g(list)f(dump)g(68)177 1588 y(do)q(cumen)o(t)h(list)f +(64)177 1638 y(do)q(cumen)o(tation)g(duplicate)h(51)177 1687 +y(do)q(cumen)o(tation)f(examples)g(58)177 1737 y(Do)q(cumen)o(tation)f +(\014le)i(115)177 1787 y(do)q(cumen)o(tation)f(\014le)h(18)177 +1837 y(do)q(cumen)o(tation)f(F)m(unnelW)m(eb)g(110)177 1887 +y(do)q(cumen)o(tation)g(in)o(terdep)q(enden)o(t)j(50)177 1937 +y(do)q(cumen)o(tation)d(o)o(v)o(er)h(51)177 1987 y(do)q(cumen)o(tation)f(pa)o +(vlo)o(v)f(51)177 2037 y(do)q(cumen)o(tation)h(vs)h(co)q(de)h(32)177 +2086 y(Do)q(cumen)o(tation)d(115)177 2136 y(do)q(cumen)o(tation)h(64)177 +2186 y(DOD83)g(55)177 2236 y(Donald)g(Kn)o(uth)h(11)177 2286 +y(Donald)f(Kn)o(uth)h(50)177 2336 y(Donald)f(Kn)o(uth)h(9)177 +2386 y(dump)f(do)q(cumen)o(t)g(list)h(68)177 2436 y(dump)f(global)f(line)h +(list)h(68)177 2486 y(dump)f(macro)f(table)i(68)177 2535 y(dump)f(mapp)q(ed)g +(\014le)h(68)177 2585 y(dump)f(option)g(68)177 2635 y(dump)g(times)g(68)177 +2685 y(dump)g(tok)o(en)h(list)f(68)177 2735 y(duplicate)h(do)q(cumen)o +(tation)f(51)177 2785 y(Dwy)o(er)h(Barry)h(11)177 2835 y(Dwy)o(er)f(Barry)h +(59)1136 42 y(EBNF)f(syn)o(tax)g(63)1136 91 y(editors)g(text)h(42)1136 +141 y(Edna)f(Ev)o(erage)g(19)1136 191 y(e\016ciency)g(F)m(unnelW)m(eb)g(47) +1136 241 y(e\016ciency)g(notes)h(47)1136 291 y(eliminating)10 +b(commen)o(ts)j(57)1136 341 y(emphasis)g(construct)i(37)1136 +391 y(emphasis)e(directiv)o(e)h(85)1136 441 y(empt)o(y)e(name)h(42)1136 +490 y(end-of-line)g(\014ddling)g(with)g(43)1136 540 y(eneo)h(command)d(95) +1136 590 y(EOL)j(\014ddling)f(with)g(43)1136 640 y(EOL)h(mark)o(ers)f +(inserting)h(76)1136 690 y(EOL)g(mark)o(ers)f(suppressing)i(77)1136 +740 y(EOL)f(suppression)h(23)1136 790 y(error)f(sev)o(erit)o(y)h(65)1136 +840 y(error)f(status)h(90)1136 889 y(errors)g(shell)f(90)1136 +939 y(Ev)o(erage)g(Edna)g(19)1136 989 y(example)e(applications)h(F)m(unnelW)m +(eb)g(53)1136 1039 y(example)f(complete)h(38)1136 1089 y(example)f +(\014lename)h(inheritance)i(70)1136 1139 y(Example)d(F)m(unnelW)m(eb)h(38) +1136 1189 y(examples)g(do)q(cumen)o(tation)f(58)1136 1239 y(executable)j(F)m +(unnelW)m(eb)e(106)1136 1288 y(execute)i(command)c(96)1136 +1338 y(execute)k(script)g(option)e(69)1136 1388 y(execution)h(phases)h(64) +1136 1438 y(exists)f(command)d(96)1136 1488 y(expansion)i(macro)g(30)1136 +1538 y(expansion)g(macro)g(47)1136 1588 y(expansion)g(macro)g(87)1136 +1638 y(explaining)f(co)q(de)j(17)1136 1687 y(expressions)g(macro)e(86)1136 +1737 y(expression)i(85)1136 1787 y(extension)f(70)1136 1837 +y(F)g(option)f(68)1136 1887 y(fatal)f(sev)o(erit)o(y)j(65)1136 +1937 y(fatal)d(status)j(90)1136 1987 y(\014ddling)e(with)g(end-of-line)g(43) +1136 2037 y(\014ddling)g(with)g(EOL)h(43)1136 2086 y(\014elds)g(\014lename)f +(70)1136 2136 y(\014le)h(dep)q(endencies)i(49)1136 2186 y(\014le)e +(di\013erences)i(94)1136 2236 y(\014le)e(include)f(69)1136 +2286 y(\014le)h(journal)e(69)1136 2336 y(\014le)i(listing)e(69)1136 +2386 y(\014le)i(suppression)h(49)1136 2436 y(\014le)f(termination)e(71)1136 +2486 y(\014le)i(t)o(yp)q(eset)h(69)1136 2535 y(\014lename)d(\014elds)j(70) +1136 2585 y(\014lename)d(inheritance)j(example)e(70)1136 2635 +y(\014lename)f(inheritance)j(70)1136 2685 y(\014les)f(header)h(57)1136 +2735 y(\014les)f(include)g(30)1136 2785 y(\014les)g(include)g(77)1136 +2835 y(\014les)g(input)g(47)1032 2940 y(120)p eop +%%Page: 121 122 +121 121 bop 177 42 a Fr(\014xeols)14 b(command)d(96)177 91 +y(fon)o(t)i(size)i(46)177 141 y(formal)d(parameter)h(lists)h(86)177 +191 y(formal)e(parameters)i(28)177 241 y(formal)e(parameters)i(28)177 +291 y(formal)e(parameters)i(87)177 341 y(F)m(ortran)g(compilers)f(42)177 +391 y(F)m(ree)i(text)f(115)177 441 y(free)h(text)f(32)177 490 +y(F)m(ree)h(text)f(83)177 540 y(free)h(text)f(83)177 590 y(freestanding)h(t)o +(yp)q(esetter)h(directiv)o(es)f(83)177 640 y(freestanding)g(81)177 +690 y(ftp)f(anon)o(ymous)e(101)177 740 y(ftp)i(arc)o(hiv)o(e)g(114)177 +790 y(fudging)f(conditionals)g(44)177 840 y(fudging)g(generics)i(59)177 +889 y(functions)f(small)e(56)177 939 y(F)m(unnel-w)o(eb)i(spider)h(19)177 +989 y(F)m(unnelW)m(eb)f(administration)d(109)177 1039 y(F)m(unnelW)m(eb)j +(applications)e(53)177 1089 y(F)m(unnelW)m(eb)i(arc)o(hiv)o(e)f(114)177 +1139 y(F)m(unnelW)m(eb)h(command)d(shell)i(90)177 1189 y(F)m(unnelW)m(eb)h +(command)d(shell)i(90)177 1239 y(F)m(unnelW)m(eb)h(commands)d(90)177 +1288 y(F)m(unnelW)m(eb)j(commen)o(ts)e(75)177 1338 y(F)m(unnelW)m(eb)i(commi) +o(tm)o(en)o(t)e(109)177 1388 y(F)m(unnelW)m(eb)i(compiling)d(105)177 +1438 y(F)m(unnelW)m(eb)j(cop)o(yrigh)o(t)f(112)177 1488 y(F)m(unnelW)m(eb)h +(dangers)g(50)177 1538 y(F)m(unnelW)m(eb)g(de\014nition)f(63)177 +1588 y(F)m(unnelW)m(eb)h(Distribution)f(113)177 1638 y(F)m(unnelW)m(eb)h(do)q +(cumen)o(tation)e(110)177 1687 y(F)m(unnelW)m(eb)i(e\016ciency)g(47)177 +1737 y(F)m(unnelW)m(eb)g(example)e(applications)h(53)177 1787 +y(F)m(unnelW)m(eb)h(Example)e(38)177 1837 y(F)m(unnelW)m(eb)i(executable)h +(106)177 1887 y(F)m(unnelW)m(eb)f(\014le)f(115)177 1937 y(F)m(unnelW)m(eb)h +(\014le)f(64)177 1987 y(F)m(unnelW)m(eb)h(hin)o(ts)f(41)177 +2037 y(F)m(unnelW)m(eb)h(initialization)d(70)177 2086 y(F)m(unnelW)m(eb)j +(installation)e(101)177 2136 y(F)m(unnelW)m(eb)i(installing)e(106)177 +2186 y(F)m(unnelW)m(eb)i(in)o(v)o(oking)e(66)177 2236 y(F)m(unnelW)m(eb)i +(language)e(115)177 2286 y(F)m(unnelW)m(eb)i(license)g(112)177 +2336 y(F)m(unnelW)m(eb)g(martinet)e(42)177 2386 y(F)m(unnelW)m(eb)i(name)e +(19)177 2436 y(F)m(unnelW)m(eb)i(obtaining)e(101)177 2486 y(F)m(unnelW)m(eb)i +(o)o(v)o(erview)f(18)177 2535 y(F)m(unnelW)m(eb)h(o)o(v)o(erview)f(64)177 +2585 y(F)m(unnelW)m(eb)h(pitfalls)e(50)177 2635 y(F)m(unnelW)m(eb)i(program)e +(65)177 2685 y(F)m(unnelW)m(eb)i(prop)q(er)g(115)177 2735 y(F)m(unnelW)m(eb)g +(prop)q(er)g(48)177 2785 y(F)m(unnelW)m(eb)g(prop)q(er)g(65)177 +2835 y(F)m(unnelW)m(eb)g(registration)f(110)1136 42 y(F)m(unnelW)m(eb)g +(rules)i(42)1136 91 y(F)m(unnelW)m(eb)e(running)h(66)1136 141 +y(F)m(unnelW)m(eb)f(shell)h(90)1136 191 y(F)m(unnelW)m(eb)f(startup)i(70)1136 +241 y(F)m(unnelW)m(eb)e(supp)q(ort)i(110)1136 291 y(F)m(unnelW)m(eb)e +(testing)h(105)1136 341 y(F)m(unnelW)m(eb)f(t)o(w)o(o)g(main)f(asp)q(ects)k +(21)1136 391 y(F)m(unnelW)m(eb)d(v)o(ersions)h(114)1136 441 +y(F)m(unnelW)m(eb)f(115)1136 490 y(fw)g(command)e(v)o(erb)k(66)1136 +540 y(fw)e(command)e(97)1136 590 y(fwinit.fws)h(49)1136 640 +y(fwinit.fws)g(71)1136 690 y(FW)h(115)1136 740 y(gardening)g(co)q(de)i(53) +1136 790 y(generics)g(fudging)e(59)1136 840 y(generics)i(t)o(yp)q(esafe)f(61) +1136 889 y(global)e(line)h(list)h(dump)e(68)1136 939 y(glossary)h(115)1136 +989 y(GNU)g(license)i(112)1136 1039 y(GNU)e(license)i(18)1136 +1089 y(GNU)e(license)i(9)1136 1139 y(go)q(o)q(d)e(old)g(da)o(ys)h(57)1136 +1189 y(Gries81)f(117)1136 1239 y(Gries81)g(51)1136 1288 y(H)h(option)f(68) +1136 1338 y(hac)o(k)o(er's)h(c)o(heer)h(35)1136 1388 y(hac)o(k)o(er's)f +(dictionary)f(35)1136 1438 y(Hac)o(k)o(ett)h(Simon)e(11)1136 +1488 y(hac)o(kman)g(directory)j(103)1136 1538 y(header)g(C)e(57)1136 +1588 y(header)i(\014le)e(p)q(ostscript)j(54)1136 1638 y(header)f(\014les)f +(57)1136 1687 y(header)h(page)e(37)1136 1737 y(headings)h(section)g(34)1136 +1787 y(headings)g(strength)h(46)1136 1837 y(Hello)e(Northern)i(Hemisphere)f +(Program)e(21)1136 1887 y(hello)h(w)o(orld)g(do)q(cumen)o(t)g(20)1136 +1937 y(help)h(command)d(97)1136 1987 y(help)j(option)f(68)1136 +2037 y(here)i(command)c(98)1136 2086 y(hierarc)o(hical)i(structure)j(34)1136 +2136 y(high)d(lev)o(el)g(syn)o(tax)h(82)1136 2186 y(hin)o(ts)f(F)m(unnelW)m +(eb)h(41)1136 2236 y(Hulse)g(Da)o(vid)f(11)1136 2286 y(Humphries)g(Barry)h +(19)1136 2336 y(Humphries91)f(117)1136 2386 y(Humphries91)g(19)1136 +2436 y(h)o(yp)q(ertext)i(15)1136 2486 y(I)e(option)h(69)1136 +2535 y(iden)o(ti\014ers)g(macro)f(41)1136 2585 y(include)h(\014le)f(option)h +(69)1136 2635 y(include)g(\014les)g(recursiv)o(e)h(31)1136 +2685 y(include)f(\014les)g(30)1136 2735 y(include)g(\014les)g(77)1136 +2785 y(include)g(\014les)g(77)1136 2835 y(Include)g(\014le)g(115)1032 +2940 y(121)p eop +%%Page: 122 123 +122 122 bop 177 42 a Fr(include)14 b(\014le)g(69)177 91 y(inden)o(tation)f +(blank)h(78)177 141 y(inden)o(tation)f(macro)g(calls)h(25)177 +191 y(inden)o(tation)f(macro)g(expansion)h(78)177 241 y(inden)o(tation)f +(none)i(78)177 291 y(indep)q(endence)h(language)d(18)177 341 +y(indep)q(endence)j(t)o(yp)q(esetter)h(18)177 391 y(indep)q(endence)f(t)o(yp) +q(esetter)h(34)177 441 y(indep)q(endence)f(t)o(yp)q(esetter)h(65)177 +490 y(indep)q(endence)f(t)o(yp)q(esetter)h(80)177 540 y(in\014nite)d(con)o +(text)g(68)177 590 y(inheritance)h(\014lename)d(70)177 640 +y(inheritance)j(section)f(name)f(35)177 690 y(initialization)e(F)m(unnelW)m +(eb)j(70)177 740 y(initialization)d(script)k(49)177 790 y(initialization)c +(script)k(71)177 840 y(inline)e(t)o(yp)q(esetter)j(directiv)o(es)f(83)177 +889 y(inline)e(81)177 939 y(input)h(\014le)g(option)f(68)177 +989 y(input)h(\014les)g(47)177 1039 y(Input)g(\014le)g(115)177 +1089 y(input)g(\014le)g(18)177 1139 y(input)g(\014le)g(64)177 +1189 y(input)g(\014le)g(77)177 1239 y(input)g(line)f(length)h(maxim)n(um)c +(79)177 1288 y(input)k(line)f(length)h(pragma)e(79)177 1338 +y(input)i(line)f(length)h(42)177 1388 y(input)g(line)f(length)h(79)177 +1438 y(inserting)g(EOL)g(mark)o(ers)g(76)177 1488 y(inserting)g(in)o(to)f +(text)i(arbitrary)f(c)o(haracters)h(74)177 1538 y(inserting)f(in)o(to)f(text) +i(con)o(trol)e(c)o(haracters)j(74)177 1588 y(inserting)e(in)o(to)f(text)i(sp) +q(ecial)f(c)o(haracter)h(74)177 1638 y(installation)d(F)m(unnelW)m(eb)i(101) +177 1687 y(installation)e(problems)h(107)177 1737 y(installing)f(F)m(unnelW)m +(eb)i(106)177 1787 y(in)o(teractiv)o(e)g(mo)q(de)f(47)177 1837 +y(in)o(teractiv)o(e)h(option)g(69)177 1887 y(in)o(terdep)q(enden)o(t)i(do)q +(cumen)o(tation)d(50)177 1937 y(in)o(terface)i(command)c(line)i(66)177 +1987 y(in)o(terpreter)j(command)11 b(47)177 2037 y(in)o(tro)q(duction)j +(tutorial)f(19)177 2086 y(in)o(visible)g(pragmas)f(78)177 2136 +y(in)o(v)o(o)q(cation)h(n)o(um)o(b)q(er)g(23)177 2186 y(in)o(v)o(o)q(cations) +g(n)o(um)o(b)q(er)g(42)177 2236 y(in)o(v)o(oking)f(F)m(unnelW)m(eb)i(20)177 +2286 y(in)o(v)o(oking)e(F)m(unnelW)m(eb)i(66)177 2336 y(J)g(option)f(69)177 +2386 y(Jerem)o(y)h(Begg)g(11)177 2436 y(journal)f(\014le)h(option)f(69)177 +2486 y(Journal)h(\014le)g(115)177 2535 y(journal)f(\014le)h(64)177 +2585 y(journal)f(\014le)h(69)177 2635 y(K)g(option)f(69)177 +2685 y(Kernighan88)h(117)177 2735 y(Kernighan88)g(65)177 2785 +y(k)o(eyb)q(oard)g(mo)q(de)f(47)177 2835 y(k)o(eyb)q(oard)h(option)f(69)1136 +42 y(Kn)o(uth)h(Donald)f(11)1136 91 y(Kn)o(uth)h(Donald)f(50)1136 +141 y(Kn)o(uth)h(Donald)f(9)1136 191 y(Kn)o(uth83)g(117)1136 +241 y(Kn)o(uth83)g(17)1136 291 y(Kn)o(uth83)g(25)1136 341 y(Kn)o(uth83)g(25) +1136 391 y(Kn)o(uth83)g(9)1136 441 y(Kn)o(uth84)g(117)1136 +490 y(Kn)o(uth84)g(117)1136 540 y(Kn)o(uth84)g(13)1136 590 +y(Kn)o(uth84)g(17)1136 640 y(Kn)o(uth84)g(18)1136 690 y(L)g(option)h(69)1136 +740 y(Lamp)q(ort86)e(117)1136 790 y(Lamp)q(ort86)g(13)1136 +840 y(language)h(indep)q(endence)j(18)1136 889 y(languages)d(m)o(ultiple)f +(55)1136 939 y(laser)i(prin)o(ter)g(55)1136 989 y(LaT)m(eX)f(13)1136 +1039 y(LaT)m(eX)g(84)1136 1089 y(la)o(y)o(out)f(program)h(22)1136 +1139 y(la)o(y)o(out)f(program)h(28)1136 1189 y(length)g(command)f(91)1136 +1239 y(length)h(input)h(line)g(42)1136 1288 y(length)f(line)h(71)1136 +1338 y(length)f(output)i(line)e(42)1136 1388 y(letter)h(67)1136 +1438 y(lev)o(els)g(of)f(diagnostics)g(65)1136 1488 y(libraries)g(macro)g(31) +1136 1538 y(license)h(F)m(unnelW)m(eb)g(112)1136 1588 y(license)g(GNU)g(112) +1136 1638 y(license)g(GNU)g(18)1136 1688 y(license)g(GNU)g(9)1136 +1737 y(line)f(length)h(input)g(79)1136 1787 y(line)f(length)h(71)1136 +1837 y(line)f(termination)f(71)1136 1887 y(list)h(do)q(cumen)o(t)g(64)1136 +1937 y(list)g(options)h(68)1136 1987 y(list)f(shell)h(commands)d(93)1136 +2037 y(listing)h(\014le)i(con)o(text)h(68)1136 2087 y(listing)d(\014le)i +(option)f(69)1136 2136 y(Listing)g(\014le)h(115)1136 2186 y(listing)e(\014le) +i(64)1136 2236 y(listing)e(\014le)i(69)1136 2286 y(literal)f(construct)i(37) +1136 2336 y(literal)e(directiv)o(e)h(84)1136 2386 y(literate)g(programmi)o +(ng)d(to)q(ols)i(15)1136 2436 y(literate)h(programmi)o(ng,)c(facilities)j(15) +1136 2486 y(literate)i(programming)o(,)d(most)i(signi\014can)o(t)h(b)q(ene-) +1302 2535 y(\014t)f(17)1136 2585 y(literate)g(programmi)o(ng)d(15)1136 +2635 y(literate)j(programmi)o(ng)d(15)1136 2685 y(literate)j(programmi)o(ng)d +(50)1136 2735 y(MacDra)o(w)i(54)1136 2785 y(Macin)o(tosh)h(13)1136 +2835 y(Macin)o(tosh)g(54)1032 2940 y(122)p eop +%%Page: 123 124 +123 123 bop 177 42 a Fr(macro)13 b(attributes)i(85)177 91 y(macro)e(bindings) +g(22)177 141 y(macro)g(b)q(o)q(dy)h(85)177 191 y(macro)f(calls)g(inden)o +(tation)h(25)177 241 y(macro)f(calls)g(86)177 291 y(macro)g(c)o(hec)o(ks)i +(88)177 341 y(macro)e(de\014nitions)h(32)177 391 y(Macro)g(de\014nition)g +(116)177 441 y(macro)f(de\014nition)g(85)177 490 y(macro)g(de\014nition)g(87) +177 540 y(macro)g(expansion)h(inden)o(tation)f(78)177 590 y(macro)g +(expansion)h(30)177 640 y(macro)f(expansion)h(47)177 690 y(macro)f(expansion) +h(87)177 740 y(macro)f(expressions)i(86)177 790 y(macro)e(facilities)g +(tutorial)g(22)177 840 y(macro)g(iden)o(ti\014ers)h(41)177 +889 y(macro)f(libraries)g(31)177 939 y(macro)g(names)g(41)177 +989 y(macro)g(names)g(86)177 1039 y(macro)g(name)g(85)177 1089 +y(macro)g(parameter)g(delimiting)e(87)177 1139 y(macro)i(recursion)i(43)177 +1189 y(macro)e(recursion)i(88)177 1239 y(macro)e(table)h(dump)e(68)177 +1288 y(macro)h(table)h(64)177 1338 y(macros)f(additiv)o(e)g(26)177 +1388 y(macros)g(parameterized)h(28)177 1438 y(macros)f(simple)g(tutorial)g +(22)177 1488 y(macros)g(static)h(87)177 1538 y(Macro)g(115)177 +1588 y(magic)e(tric)o(k)i(15)177 1638 y(main)o(tenance)f(programmer)f(50)177 +1687 y(mak)o(e)h(utilit)o(y)f(49)177 1737 y(man)o(uals)g(prin)o(ting)h(107) +177 1787 y(mapp)q(ed)g(\014le)h(dump)f(68)177 1837 y(Mapp)q(er)i(116)177 +1887 y(mapp)q(er)e(71)177 1937 y(martinet)g(F)m(unnelW)m(eb)g(42)177 +1987 y(maxim)n(um)d(input)k(line)f(length)h(79)177 2037 y(maxim)n(um)c +(output)k(\014le)g(line)f(length)h(pragma)e(79)177 2086 y(maxim)n(um)e +(output)k(\014le)g(line)f(length)h(79)177 2136 y(maxim)n(um)c(pro)q(duct)15 +b(\014le)f(line)f(length)h(pragma)e(79)177 2186 y(maxim)n(um)e(pro)q(duct)15 +b(\014le)f(line)f(length)h(79)177 2236 y(medicine)f(wholistic)g(53)177 +2286 y(memory)f(use)i(of)g(30)177 2336 y(memory)e(47)177 2386 +y(MIL-STD-2167A)h(51)177 2436 y(monster)h(\014le)g(p)q(ostscript)h(54)177 +2486 y(m)o(ultiple)d(languages)h(55)177 2535 y(name)g(empt)o(y)g(42)177 +2585 y(name)g(F)m(unnelW)m(eb)g(19)177 2635 y(name)g(section)h(34)177 +2685 y(name)f(section)h(84)177 2735 y(names)f(macro)g(41)177 +2785 y(names)g(macro)g(86)177 2835 y(names)g(quic)o(k)h(42)1136 +42 y(names)f(quic)o(k)g(76)1136 91 y(names)g(section)h(86)1136 +141 y(names)f(86)1136 191 y(name)f(70)1136 241 y(new)i(page)g(pragma)e(81) +1136 291 y(new)i(page)g(81)1136 341 y(newpage)g(directiv)o(e)g(37)1136 +391 y(no)f(inden)o(tation)h(78)1136 441 y(non-determinism)d(68)1136 +490 y(non-prin)o(table)i(c)o(haracters)j(96)1136 540 y(none)e(inden)o(tation) +f(78)1136 590 y(notation)g(63)1136 640 y(notes)h(e\016ciency)h(47)1136 +690 y(notice)f(cop)o(yrigh)o(t)f(1)1136 740 y(no)o(v)o(els)g(50)1136 +790 y(n)o(um)o(b)q(er)g(calls)g(23)1136 840 y(n)o(um)o(b)q(er)g(in)o(v)o(o)q +(cations)g(42)1136 889 y(n)o(um)o(b)q(er)g(in)o(v)o(o)q(cation)f(23)1136 +939 y(n)o(um)o(b)q(er)h(of)g(times)g(called)h(23)1136 989 y(n)o(um)o(b)q +(ering)e(cross)j(reference)i(89)1136 1039 y(n)o(um)o(b)q(ering)12 +b(section)j(89)1136 1089 y(ob)r(ject)f(co)q(de)h(26)1136 1139 +y(obtaining)d(F)m(unnelW)m(eb)h(101)1136 1189 y(op)q(en)h(systems)g(55)1136 +1239 y(option)f(B)h(68)1136 1288 y(option)f(C)h(68)1136 1338 +y(option)f(delete)i(output)f(68)1136 1388 y(option)f(dump)f(68)1136 +1438 y(option)h(D)g(49)1136 1488 y(option)g(D)g(68)1136 1538 +y(option)g(execute)j(script)e(69)1136 1588 y(option)f(F)h(68)1136 +1638 y(option)f(help)h(68)1136 1687 y(option)f(H)h(68)1136 +1737 y(option)f(include)h(\014le)g(69)1136 1787 y(option)f(input)g(\014le)h +(68)1136 1837 y(option)f(in)o(teractiv)o(e)h(69)1136 1887 y(option)f(I)h(69) +1136 1937 y(option)f(journal)g(\014le)h(69)1136 1987 y(option)f(J)h(69)1136 +2037 y(option)f(k)o(eyb)q(oard)h(69)1136 2086 y(option)f(K)h(69)1136 +2136 y(option)f(listing)g(\014le)g(69)1136 2186 y(option)g(L)h(69)1136 +2236 y(option)f(quiet)h(69)1136 2286 y(option)f(Q)h(69)1136 +2336 y(option)f(screen)j(69)1136 2386 y(option)d(S)h(69)1136 +2436 y(option)f(t)o(yp)q(eset)i(69)1136 2486 y(option)e(T)h(69)1136 +2535 y(option)f(width)g(69)1136 2585 y(option)g(W)g(69)1136 +2635 y(option)g(X)h(69)1136 2685 y(options)f(command)e(92)1136 +2735 y(options)i(default)h(49)1136 2785 y(options)f(default)h(92)1136 +2835 y(options)f(list)h(68)1032 2940 y(123)p eop +%%Page: 124 125 +124 124 bop 177 42 a Fr(options)14 b(setting)g(defaults)g(49)177 +91 y(options)g(syn)o(tax)g(67)177 141 y(options)g(tracedump)f(68)177 +191 y(options)h(67)177 241 y(options)g(68)177 291 y(Option)g(116)177 +341 y(order)h(action)e(execution)i(71)177 391 y(order)g(program)d(22)177 +441 y(ordering)i(program)e(15)177 490 y(Ordinary)i(options)g(70)177 +540 y(organization)f(b)q(oring)g(50)177 590 y(organization)g(spaghetti)h(50) +177 640 y(output)g(\014le)g(line)g(length)f(maxim)o(um)c(79)177 +690 y(output)14 b(\014les)g(delete)h(49)177 740 y(output)f(\014les)g(18)177 +790 y(output)g(\014les)g(64)177 840 y(Output)h(\014le)f(116)177 +889 y(output)g(line)g(length)f(42)177 939 y(output)h(WEB)g(25)177 +989 y(o)o(v)o(er)g(do)q(cumen)o(tation)f(51)177 1039 y(o)o(v)o(erhead)h(pro)q +(cedure)i(call)d(57)177 1089 y(o)o(v)o(erview)h(F)m(unnelW)m(eb)f(18)177 +1139 y(o)o(v)o(erview)h(F)m(unnelW)m(eb)f(64)177 1189 y(o)o(v)o(erview)h(t)o +(yp)q(esetting)h(32)177 1239 y(OzT)m(eX)g(13)177 1288 y(pac)o(k)n(age)f(55) +177 1338 y(parameter)g(list,)f(absen)o(t)h(29)177 1388 y(parameter)g(lists)g +(formal)d(86)177 1438 y(parameterized)j(macros)f(28)177 1488 +y(parameters)h(actual)g(29)177 1538 y(parameters)g(formal)e(28)177 +1588 y(parameters)i(formal)e(28)177 1638 y(parameters)i(formal)e(87)177 +1687 y(P)o(arser)j(116)177 1737 y(parser)g(64)177 1787 y(parser)g(82)177 +1837 y(parsing)f(command)d(line)i(66)177 1887 y(P)o(ascal)h(15)177 +1937 y(P)o(ascal)g(25)177 1987 y(P)o(ascal)g(26)177 2037 y(P)o(ascal)g(57)177 +2086 y(P)o(ascal)g(59)177 2136 y(P)o(at)g(Scannel)g(29)177 +2186 y(pa)o(vlo)o(v)f(do)q(cumen)o(tation)f(51)177 2236 y(phases)j(execution) +g(64)177 2286 y(phases)g(64)177 2336 y(PhD)f(thesis)h(54)177 +2386 y(pitfalls)e(F)m(unnelW)m(eb)g(50)177 2436 y(p)q(o)q(em)g(animal)e(30) +177 2486 y(p)q(o)q(em)i(camera)g(30)177 2535 y(p)q(ortabilit)o(y)g(18)177 +2585 y(p)q(ostscript)i(header)g(\014le)f(54)177 2635 y(p)q(ostscript)h +(monster)f(\014le)g(54)177 2685 y(P)o(ostScript)h(54)177 2735 +y(p)q(ostscript)g(57)177 2785 y(pragma)d(input)i(line)f(length)h(79)177 +2835 y(pragma)e(maxim)n(um)e(output)k(\014le)g(line)f(length)h(79)1136 +42 y(pragma)e(maxim)n(um)d(pro)q(duct)15 b(\014le)f(line)f(length)h(79)1136 +91 y(pragma)e(new)i(page)g(81)1136 141 y(pragma)e(table)h(of)h(con)o(ten)o +(ts)h(81)1136 191 y(pragma)d(title)h(82)1136 241 y(pragma)f(t)o(yp)q(esetter) +k(80)1136 291 y(pragma)c(vskip)h(81)1136 341 y(pragmas)f(in)o(visible)h(78) +1136 391 y(pragmas)f(visible)h(78)1136 441 y(pragmas)f(78)1136 +490 y(Pragma)g(116)1136 540 y(pragma)g(25)1136 590 y(pragma)g(78)1136 +640 y(preface)j(9)1136 690 y(prepro)q(cessor)h(C)e(20)1136 +740 y(prepro)q(cessor)i(C)e(57)1136 790 y(presen)o(tation)g(notes)h(13)1136 +840 y(Prin)o(ted)f(do)q(cumen)o(tation)f(116)1136 889 y(prin)o(ter)h(laser)g +(55)1136 939 y(prin)o(ting)f(man)o(uals)f(107)1136 989 y(prin)o(ting)h +(system)g(55)1136 1039 y(problems)g(binding)f(57)1136 1089 +y(problems)h(installation)f(107)1136 1139 y(pro)q(cedure)j(call)f(o)o(v)o +(erhead)g(57)1136 1189 y(pro)q(cessing)h(command)c(line)i(66)1136 +1239 y(pro)q(cessing)i(command)c(line)i(92)1136 1288 y(pro)q(duct)h(\014le)g +(line)g(length)g(maxim)n(um)9 b(79)1136 1338 y(pro)q(duct)14 +b(\014le)g(width)g(69)1136 1388 y(pro)q(duct)g(\014les)h(18)1136 +1438 y(pro)q(duct)f(\014les)h(64)1136 1488 y(Pro)q(duct)g(\014le)e(116)1136 +1538 y(pro)q(duction)h(to)q(ol)f(19)1136 1588 y(program)f(la)o(y)o(out)h(22) +1136 1638 y(program)f(la)o(y)o(out)h(28)1136 1687 y(program)f(ordering)i(15) +1136 1737 y(program)e(order)j(22)1136 1787 y(programmer)c(main)o(tenance)i +(50)1136 1837 y(programmer's)e(c)o(heer)k(35)1136 1887 y(programmi)o(ng)c +(literate)j(50)1136 1937 y(Q)g(option)f(69)1136 1987 y(quic)o(k)g(names)g(42) +1136 2037 y(quic)o(k)g(names)g(76)1136 2086 y(quic)o(k)g(name)g(42)1136 +2136 y(quic)o(k)g(name)g(76)1136 2186 y(quiet)h(option)f(69)1136 +2236 y(quit)g(command)e(98)1136 2286 y(random)h(access)k(50)1136 +2336 y(rec.h)o(umor.funn)o(y)c(29)1136 2386 y(recursion)j(macro)d(43)1136 +2436 y(recursion)j(macro)d(88)1136 2486 y(recursiv)o(e)j(include)f(\014les)g +(31)1136 2535 y(references)i(117)1136 2585 y(referencing)f(cross)g(89)1136 +2635 y(registration)e(F)m(unnelW)m(eb)h(110)1136 2685 y(regression)h(testing) +f(103)1136 2735 y(regression)h(testing)f(47)1136 2785 y(reliabilit)o(y)e(18) +1136 2835 y(REM)h(statemen)o(t)h(57)1032 2940 y(124)p eop +%%Page: 125 126 +125 125 bop 177 42 a Fr(rep)q(ort)15 b(ann)o(ual)e(58)177 91 +y(results)i(directory)g(103)177 141 y(return)g(status)g(65)177 +191 y(Roger)f(Brissenden)i(11)177 241 y(Roso)o(vsky90)d(117)177 +291 y(Roso)o(vsky90)g(17)177 341 y(Ross)h(William)o(s)d(1)177 +391 y(rule)j(simple)f(20)177 441 y(rules)i(F)m(unnelW)m(eb)e(42)177 +490 y(running)h(F)m(unnelW)m(eb)f(66)177 540 y(S)h(option)f(69)177 +590 y(Scannel)h(P)o(at)g(29)177 640 y(Scanner)h(116)177 690 +y(scanner)g(64)177 740 y(scanner)g(71)177 790 y(screen)h(option)d(69)177 +840 y(script)i(initialization)c(49)177 889 y(script)k(initialization)c(71)177 +939 y(script)k(startup)f(49)177 989 y(scripts)h(directory)g(103)177 +1039 y(Script)g(116)177 1089 y(section)g(constructs)h(83)177 +1139 y(section)f(headings)f(34)177 1189 y(section)h(name)d(inheritance)j(35) +177 1239 y(section)g(names)e(86)177 1288 y(section)i(name)d(34)177 +1338 y(section)j(name)d(84)177 1388 y(section)j(n)o(um)o(b)q(ering)d(89)177 +1438 y(section)j(strength)g(46)177 1488 y(seman)o(tic)e(arc)o(hitecture)j(64) +177 1538 y(sequences)h(sp)q(ecial)d(72)177 1588 y(set)h(abstraction)f(59)177 +1638 y(set)h(command)c(48)177 1687 y(set)k(command)c(98)177 +1737 y(setting)j(defaults)g(options)g(49)177 1787 y(setting)g(sp)q(ecial)h(c) +o(haracter)g(74)177 1837 y(sev)o(ere)h(sev)o(erit)o(y)e(65)177 +1887 y(sev)o(ere)i(status)e(90)177 1937 y(sev)o(erit)o(y)h(assertion)f(65)177 +1987 y(sev)o(erit)o(y)h(error)g(65)177 2037 y(sev)o(erit)o(y)g(fatal)d(65)177 +2086 y(sev)o(erit)o(y)j(sev)o(ere)g(65)177 2136 y(sev)o(erit)o(y)g(w)o +(arning)e(65)177 2186 y(sev)o(erit)o(y)i(65)177 2236 y(sharing)f(information) +d(56)177 2286 y(sharing)j(text)g(58)177 2336 y(shark)g(white)g(p)q(oin)o(ter) +g(19)177 2386 y(shell)g(commands)d(list)j(93)177 2436 y(shell)g(commands)d +(93)177 2486 y(shell)j(errors)h(90)177 2535 y(shell)f(F)m(unnelW)m(eb)f(90) +177 2585 y(shell)h(uses)h(90)177 2635 y(Shell)f(116)177 2685 +y(sho)q(oting)g(31)177 2735 y(sho)o(w)g(command)d(48)177 2785 +y(sho)o(w)j(command)d(98)177 2835 y(sign)j(67)1136 42 y(Simon)d(Hac)o(k)o +(ett)k(11)1136 91 y(simple)d(macros)h(tutorial)g(22)1136 141 +y(simple)f(rule)i(20)1136 191 y(simple)e(sequence)k(72)1136 +241 y(simplicit)o(y)11 b(18)1136 291 y(size)j(fon)o(t)g(46)1136 +341 y(skip)f(v)o(ertical)h(81)1136 391 y(skipto)f(command)e(98)1136 +441 y(small)g(functions)j(56)1136 490 y(Smith91)d(117)1136 +540 y(Smith91)g(17)1136 590 y(snak)o(e)j(tiger)g(19)1136 640 +y(song)f(29)1136 690 y(sources)i(directory)g(103)1136 740 y(spacing)e(43)1136 +790 y(spaghetti)h(organization)e(50)1136 840 y(sp)q(ecial)i(c)o(haracter)h(c) +o(hanging)e(31)1136 889 y(sp)q(ecial)h(c)o(haracter)h(default)f(72)1136 +939 y(sp)q(ecial)g(c)o(haracter)h(inserting)f(in)o(to)f(text)i(74)1136 +989 y(sp)q(ecial)f(c)o(haracter)h(setting)f(74)1136 1039 y(Sp)q(ecial)f(c)o +(haracter)j(116)1136 1089 y(sp)q(ecial)e(c)o(haracter)h(20)1136 +1139 y(sp)q(ecial)f(c)o(haracter)h(72)1136 1189 y(sp)q(ecial)f(sequences)i +(72)1136 1239 y(Sp)q(ecial)d(sequence)k(116)1136 1288 y(sp)q(ecial)d +(sequence)i(20)1136 1338 y(sp)q(ecial)e(sequence)i(72)1136 +1388 y(sp)q(ecial)e(tok)o(ens)g(82)1136 1438 y(sp)q(eed)h(47)1136 +1488 y(spider)f(F)m(unnel-w)o(eb)g(19)1136 1538 y(startup)g(F)m(unnelW)m(eb)g +(70)1136 1588 y(startup)g(script)h(49)1136 1638 y(statemen)o(t)e(REM)h(57) +1136 1687 y(static)g(analysis)f(88)1136 1737 y(static)h(macros)f(87)1136 +1787 y(status)h(assertion)h(90)1136 1837 y(status)f(command)d(99)1136 +1887 y(status)j(error)h(90)1136 1937 y(status)f(fatal)f(90)1136 +1987 y(status)h(return)h(65)1136 2037 y(status)f(sev)o(ere)i(90)1136 +2086 y(status)e(success)j(90)1136 2136 y(status)d(w)o(arning)f(90)1136 +2186 y(stream)g(of)g(consciousness)j(50)1136 2236 y(strength)f(headings)f(46) +1136 2286 y(strength)h(section)f(46)1136 2336 y(strength)h(t)o(yp)q(esetting) +g(46)1136 2386 y(string)f(substitution)g(91)1136 2436 y(string)g +(substitution)g(94)1136 2486 y(string)g(67)1136 2535 y(structure)i(hierarc)o +(hical)d(34)1136 2585 y(structure)j(tree)f(83)1136 2635 y(Strunk79)e(117)1136 +2685 y(Strunk79)g(51)1136 2735 y(substitution)h(string)g(91)1136 +2785 y(substitution)g(string)g(94)1136 2835 y(success)i(status)f(90)1032 +2940 y(125)p eop +%%Page: 126 127 +126 126 bop 177 42 a Fr(supp)q(ort)15 b(F)m(unnelW)m(eb)e(110)177 +91 y(suppress)j(console)e(output)g(69)177 141 y(suppressing)h(EOL)g(mark)o +(ers)e(77)177 191 y(suppression)i(EOL)g(23)177 241 y(suppression)g(\014le)f +(49)177 291 y(Sydney)g(19)177 341 y(syn)o(tax)g(command)d(line)j(options)f +(67)177 391 y(syn)o(tax)h(command)d(line)j(67)177 441 y(syn)o(tax)g(EBNF)h +(63)177 490 y(syn)o(tax)f(high)f(lev)o(el)h(82)177 540 y(syn)o(tax)g(options) +g(67)177 590 y(system)g(prin)o(ting)f(55)177 640 y(T)h(option)f(69)177 +690 y(table)h(macro)f(64)177 740 y(table)h(of)f(con)o(ten)o(ts)i(directiv)o +(e)g(37)177 790 y(table)f(of)f(con)o(ten)o(ts)i(pragma)d(81)177 +840 y(table)i(of)f(con)o(ten)o(ts)i(81)177 889 y(tabs)f(42)177 +939 y(T)m(angle)f(116)177 989 y(tangle)h(65)177 1039 y(tangle)g(88)177 +1089 y(T)m(angling)e(21)177 1139 y(target)j(t)o(yp)q(esetter)h(89)177 +1189 y(termination)c(\014le)i(71)177 1239 y(termination)e(line)i(71)177 +1288 y(terminology)e(63)177 1338 y(testing)i(F)m(unnelW)m(eb)g(105)177 +1388 y(testing)g(regression)i(103)177 1438 y(testing)e(regression)i(47)177 +1488 y(tests)f(directory)g(104)177 1538 y(text)g(editors)f(42)177 +1588 y(text)h(\014les)f(cryptic)h(55)177 1638 y(text)g(free)f(83)177 +1687 y(text)h(sharing)e(58)177 1737 y(text)i(tok)o(ens)f(82)177 +1787 y(T)m(eX)g(13)177 1837 y(T)m(eX)g(18)177 1887 y(T)m(eX)g(22)177 +1937 y(T)m(eX)g(54)177 1987 y(thesis)h(PhD)f(54)177 2037 y(tiger)g(snak)o(e)g +(19)177 2086 y(time)f(dev)o(elopmen)o(t)g(17)177 2136 y(times)g(dump)g(68)177 +2186 y(title)h(directiv)o(e)g(37)177 2236 y(title)g(pragma)e(82)177 +2286 y(title)i(82)177 2336 y(tok)o(en)g(list)g(dump)e(68)177 +2386 y(tolerate)i(command)e(100)177 2436 y(to)q(ols)i(literate)g(programmi)o +(ng)d(15)177 2486 y(trace)k(command)c(100)177 2535 y(trace)k(on)f(command)d +(48)177 2585 y(tracedump)j(options)f(68)177 2635 y(trailing)g(blanks)g(42)177 +2685 y(tree)i(directory)g(102)177 2735 y(tree)g(structure)h(83)177 +2785 y(T)m(rev)o(orro)o(w)e(Andrew)h(13)177 2835 y(tutorial)e(+=)i(26)1136 +42 y(tutorial)e(==)h(26)1136 91 y(tutorial)f(@M)h(24)1136 141 +y(tutorial)f(@Z)h(24)1136 191 y(tutorial)f(in)o(tro)q(duction)g(19)1136 +241 y(tutorial)g(macro)f(facilities)h(22)1136 291 y(tutorial)g(macros)g +(simple)f(22)1136 341 y(tutorial)h(simple)f(macros)h(22)1136 +391 y(tutorial)g(t)o(yp)q(esetting)i(32)1136 441 y(tutorial)e(15)1136 +490 y(tutorial)g(19)1136 540 y(t)o(w)o(elv)o(e)g(bugs)i(of)e(c)o(hristmas)g +(29)1136 590 y(t)o(w)o(o)g(main)f(asp)q(ects)j(F)m(unnelW)m(eb)f(21)1136 +640 y(t)o(yp)q(esafe)g(generics)h(61)1136 690 y(t)o(yp)q(eset)g(\014le)f(69) +1136 740 y(t)o(yp)q(eset)h(option)e(69)1136 790 y(t)o(yp)q(esetter)j +(directiv)o(e)e(tok)o(ens)h(82)1136 840 y(t)o(yp)q(esetter)h(directiv)o(es)f +(66)1136 889 y(t)o(yp)q(esetter)h(directiv)o(es)f(81)1136 939 +y(t)o(yp)q(esetter)h(indep)q(endence)g(18)1136 989 y(t)o(yp)q(esetter)g +(indep)q(endence)g(34)1136 1039 y(t)o(yp)q(esetter)g(indep)q(endence)g(65) +1136 1089 y(t)o(yp)q(esetter)g(indep)q(endence)g(80)1136 1139 +y(t)o(yp)q(esetter)g(indep)q(enden)o(t)f(34)1136 1189 y(t)o(yp)q(esetter)h +(pragma)c(80)1136 1239 y(t)o(yp)q(esetter)k(target)e(89)1136 +1288 y(T)o(yp)q(esetting)g(directiv)o(e)h(116)1136 1338 y(t)o(yp)q(esetting)f +(o)o(v)o(erview)g(32)1136 1388 y(t)o(yp)q(esetting)g(strength)i(46)1136 +1438 y(t)o(yp)q(esetting)e(tutorial)g(32)1136 1488 y(t)o(yp)q(esetting)g(13) +1136 1538 y(t)o(yp)q(esetting)g(89)1136 1588 y(univ)o(ersities)g(17)1136 +1638 y(Univ)o(ersit)o(y)f(Adelaide)h(59)1136 1687 y(Unix)f(newline)h(75)1136 +1737 y(Unix)f(67)1136 1787 y(unprin)o(table)g(c)o(haracters)j(71)1136 +1837 y(USDOD83)d(117)1136 1887 y(use)h(of)g(memory)d(30)1136 +1937 y(useful)j(commands)d(47)1136 1987 y(userman)i(directory)i(105)1136 +2037 y(uses)g(shell)f(90)1136 2086 y(v)o(ersions)g(F)m(unnelW)m(eb)f(114)1136 +2136 y(v)o(ertical)g(skip)h(81)1136 2186 y(visible)f(pragmas)f(78)1136 +2236 y(vskip)h(directiv)o(e)i(37)1136 2286 y(vskip)e(pragma)f(81)1136 +2336 y(W)h(option)g(69)1136 2386 y(w)o(arning)g(sev)o(erit)o(y)h(65)1136 +2436 y(w)o(arning)f(status)h(90)1136 2486 y(w)o(arran)o(t)o(y)f(112)1136 +2535 y(W)m(ea)o(v)o(e)g(116)1136 2585 y(w)o(ea)o(v)o(e)h(65)1136 +2635 y(w)o(ea)o(v)o(e)g(89)1136 2685 y(W)m(ea)o(ving)e(21)1136 +2735 y(WEB)i(output)g(25)1136 2785 y(WEB)g(21)1136 2835 y(WEB)g(25)1032 +2940 y(126)p eop +%%Page: 127 128 +127 127 bop 177 42 a Fr(W)m(eb)14 b(9)177 91 y(white)g(p)q(oin)o(ter)g(shark) +g(19)177 141 y(wholistic)f(debugging)h(53)177 191 y(wholistic)f(debugging)h +(53)177 241 y(wholistic)f(medicine)g(53)177 291 y(width)h(option)f(69)177 +340 y(width)h(pro)q(duct)h(\014le)e(69)177 390 y(William)o(s)f(Ross)h(1)177 +440 y(w)o(orkstations)h(48)177 490 y(w)o(orkstation)g(90)177 +540 y(write)g(command)d(100)177 589 y(writeu)j(command)e(100)177 +639 y(X)i(option)f(69)1032 2940 y(127)p eop +%%Trailer +end +userdict /end-hook known{end-hook}if +%%EOF diff --git a/web/funnelAC/userman/u_manual.sin b/web/funnelAC/userman/u_manual.sin new file mode 100644 index 0000000000..abee6744ad --- /dev/null +++ b/web/funnelAC/userman/u_manual.sin @@ -0,0 +1,1020 @@ +\indexentry{+= tutorial}{26} +\indexentry{+=}{85} +\indexentry{2167A}{51} +\indexentry{== tutorial}{26} +\indexentry{==}{85} +\indexentry{@!}{37} +\indexentry{@!}{75} +\indexentry{@"}{29} +\indexentry{@(}{29} +\indexentry{@)}{29} +\indexentry{@+}{20} +\indexentry{@+}{76} +\indexentry{@,}{29} +\indexentry{@-}{23} +\indexentry{@-}{77} +\indexentry{@1...}{28} +\indexentry{@1...}{86} +\indexentry{@<}{20} +\indexentry{@=}{20} +\indexentry{@>}{20} +\indexentry{@A...}{34} +\indexentry{@braces}{20} +\indexentry{@braces}{37} +\indexentry{@circumflex}{74} +\indexentry{@dollar}{22} +\indexentry{@hash}{76} +\indexentry{@i}{30} +\indexentry{@i}{77} +\indexentry{@M tutorial}{24} +\indexentry{@M}{85} +\indexentry{@O}{20} +\indexentry{@O}{22} +\indexentry{@slash}{37} +\indexentry{@Z tutorial}{24} +\indexentry{@Z}{85} +\indexentry{absent command}{93} +\indexentry{abstract data type}{55} +\indexentry{abstraction code}{56} +\indexentry{abstraction data}{26} +\indexentry{abstraction set}{59} +\indexentry{abuse comments}{57} +\indexentry{access random}{50} +\indexentry{acknowledgements}{11} +\indexentry{action execution order}{71} +\indexentry{Action options}{70} +\indexentry{actual parameters}{29} +\indexentry{Ada}{11} +\indexentry{Ada}{44} +\indexentry{Ada}{49} +\indexentry{Ada}{51} +\indexentry{Ada}{55} +\indexentry{additive macros}{26} +\indexentry{additive macro}{26} +\indexentry{additively defined}{85} +\indexentry{Adelaide University}{59} +\indexentry{admin directory}{102} +\indexentry{administration FunnelWeb}{109} +\indexentry{ADT}{55} +\indexentry{alias}{49} +\indexentry{Analyser}{115} +\indexentry{analyser}{65} +\indexentry{analyser}{88} +\indexentry{analysis static}{88} +\indexentry{Andrew Trevorrow}{13} +\indexentry{animal poem}{30} +\indexentry{annual report}{58} +\indexentry{anonymous ftp}{101} +\indexentry{ANSI}{109} +\indexentry{ANSI}{117} +\indexentry{answers correct}{102} +\indexentry{answers directory}{102} +\indexentry{ANZE}{117} +\indexentry{ANZE}{19} +\indexentry{applications FunnelWeb}{53} +\indexentry{arbitrary characters inserting into text}{74} +\indexentry{architecture semantic}{64} +\indexentry{archive ftp}{114} +\indexentry{archive FunnelWeb}{114} +\indexentry{argument command line}{67} +\indexentry{arguments}{67} +\indexentry{Argument}{115} +\indexentry{assertion severity}{65} +\indexentry{assertion status}{90} +\indexentry{Atrax robustus}{19} +\indexentry{attributes macro}{85} +\indexentry{author contacting}{114} +\indexentry{B option}{68} +\indexentry{Barry Dwyer}{11} +\indexentry{Barry Dwyer}{59} +\indexentry{Barry Humphries}{19} +\indexentry{BASIC}{57} +\indexentry{Begg Jeremy}{11} +\indexentry{binding problems}{57} +\indexentry{bindings macro}{22} +\indexentry{blank indentation}{78} +\indexentry{blank indentation}{78} +\indexentry{blanks trailing}{42} +\indexentry{boring organization}{50} +\indexentry{Brissenden Roger}{11} +\indexentry{BSI82}{117} +\indexentry{BSI82}{15} +\indexentry{BSI82}{18} +\indexentry{C header}{57} +\indexentry{C option}{68} +\indexentry{C preprocessor}{20} +\indexentry{C preprocessor}{57} +\indexentry{calls macro}{86} +\indexentry{calls number}{23} +\indexentry{camera poem}{30} +\indexentry{case dependence}{67} +\indexentry{changing special character}{31} +\indexentry{characters control}{42} +\indexentry{characters non-printable}{96} +\indexentry{characters unprintable}{71} +\indexentry{checks macro}{88} +\indexentry{cheer hacker's}{35} +\indexentry{cheer programmer's}{35} +\indexentry{code abstraction}{56} +\indexentry{code explaining}{17} +\indexentry{code gardening}{53} +\indexentry{code vs documentation}{32} +\indexentry{codify command}{93} +\indexentry{command absent}{93} +\indexentry{command codify}{93} +\indexentry{command compare}{93} +\indexentry{command define}{91} +\indexentry{command define}{94} +\indexentry{command diffsummary}{95} +\indexentry{command diffzero}{95} +\indexentry{command diff}{94} +\indexentry{command eneo}{95} +\indexentry{command execute}{96} +\indexentry{command exists}{96} +\indexentry{command fixeols}{96} +\indexentry{command fw}{97} +\indexentry{command help}{97} +\indexentry{command here}{98} +\indexentry{command interpreter}{47} +\indexentry{command length}{91} +\indexentry{command line argument}{67} +\indexentry{command line interface}{66} +\indexentry{command line options syntax}{67} +\indexentry{command line parsing}{66} +\indexentry{command line processing}{66} +\indexentry{command line processing}{92} +\indexentry{command line syntax}{67} +\indexentry{command options}{92} +\indexentry{command quit}{98} +\indexentry{command set}{48} +\indexentry{command set}{98} +\indexentry{command shell FunnelWeb}{90} +\indexentry{command show}{48} +\indexentry{command show}{98} +\indexentry{command skipto}{98} +\indexentry{command status}{99} +\indexentry{command tolerate}{100} +\indexentry{command trace on}{48} +\indexentry{command trace}{100} +\indexentry{command verb fw}{66} +\indexentry{command writeu}{100} +\indexentry{command write}{100} +\indexentry{commands FunnelWeb}{90} +\indexentry{commands shell}{93} +\indexentry{commands useful}{47} +\indexentry{comments abuse}{57} +\indexentry{comments eliminating}{57} +\indexentry{comments FunnelWeb}{75} +\indexentry{comments}{37} +\indexentry{commitment FunnelWeb}{109} +\indexentry{compare command}{93} +\indexentry{compilers Fortran}{42} +\indexentry{compiling FunnelWeb}{105} +\indexentry{complete example}{38} +\indexentry{conditionals fudging}{44} +\indexentry{console output suppress}{69} +\indexentry{constructs section}{83} +\indexentry{contacting author}{114} +\indexentry{contents table of}{81} +\indexentry{context infinite}{68} +\indexentry{context listing file}{68} +\indexentry{context}{69} +\indexentry{control characters inserting into text}{74} +\indexentry{control characters}{42} +\indexentry{controllability}{18} +\indexentry{copyright FunnelWeb}{112} +\indexentry{copyright notice}{1} +\indexentry{correct answers}{102} +\indexentry{cross reference numbering}{89} +\indexentry{cross referencing}{17} +\indexentry{cross referencing}{89} +\indexentry{cryptic text files}{55} +\indexentry{D option}{49} +\indexentry{D option}{68} +\indexentry{dangers FunnelWeb}{50} +\indexentry{data abstraction}{26} +\indexentry{David Hulse}{11} +\indexentry{debugger}{53} +\indexentry{debugging wholistic}{53} +\indexentry{default options}{49} +\indexentry{default options}{92} +\indexentry{default special character}{72} +\indexentry{define command}{91} +\indexentry{define command}{94} +\indexentry{definition FunnelWeb}{63} +\indexentry{definition macro}{85} +\indexentry{definition macro}{87} +\indexentry{delete output files}{49} +\indexentry{delete output option}{68} +\indexentry{delimiting macro parameter}{87} +\indexentry{dependence case}{67} +\indexentry{dependencies file}{49} +\indexentry{development time}{17} +\indexentry{diagnostics levels of}{65} +\indexentry{diagnostics}{65} +\indexentry{dictionary hacker's}{35} +\indexentry{diff command}{94} +\indexentry{differences file}{94} +\indexentry{diffsummary command}{95} +\indexentry{diffzero command}{95} +\indexentry{directive emphasis}{85} +\indexentry{directive literal}{84} +\indexentry{directive newpage}{37} +\indexentry{directive table of contents}{37} +\indexentry{directive title}{37} +\indexentry{directive vskip}{37} +\indexentry{directives typesetter}{81} +\indexentry{directives}{32} +\indexentry{directives}{83} +\indexentry{Directive}{115} +\indexentry{directory admin}{102} +\indexentry{directory answers}{102} +\indexentry{directory hackman}{103} +\indexentry{directory results}{103} +\indexentry{directory scripts}{103} +\indexentry{directory sources}{103} +\indexentry{directory tests}{104} +\indexentry{directory tree}{102} +\indexentry{directory userman}{105} +\indexentry{directory}{70} +\indexentry{Distribution FunnelWeb}{113} +\indexentry{document list dump}{68} +\indexentry{document list}{64} +\indexentry{documentation duplicate}{51} +\indexentry{documentation examples}{58} +\indexentry{Documentation file}{115} +\indexentry{documentation file}{18} +\indexentry{documentation FunnelWeb}{110} +\indexentry{documentation interdependent}{50} +\indexentry{documentation over}{51} +\indexentry{documentation pavlov}{51} +\indexentry{documentation vs code}{32} +\indexentry{Documentation}{115} +\indexentry{documentation}{64} +\indexentry{DOD83}{55} +\indexentry{Donald Knuth}{11} +\indexentry{Donald Knuth}{50} +\indexentry{Donald Knuth}{9} +\indexentry{dump document list}{68} +\indexentry{dump global line list}{68} +\indexentry{dump macro table}{68} +\indexentry{dump mapped file}{68} +\indexentry{dump option}{68} +\indexentry{dump times}{68} +\indexentry{dump token list}{68} +\indexentry{duplicate documentation}{51} +\indexentry{Dwyer Barry}{11} +\indexentry{Dwyer Barry}{59} +\indexentry{EBNF syntax}{63} +\indexentry{editors text}{42} +\indexentry{Edna Everage}{19} +\indexentry{efficiency FunnelWeb}{47} +\indexentry{efficiency notes}{47} +\indexentry{eliminating comments}{57} +\indexentry{emphasis construct}{37} +\indexentry{emphasis directive}{85} +\indexentry{empty name}{42} +\indexentry{end-of-line fiddling with}{43} +\indexentry{eneo command}{95} +\indexentry{EOL fiddling with}{43} +\indexentry{EOL markers inserting}{76} +\indexentry{EOL markers suppressing}{77} +\indexentry{EOL suppression}{23} +\indexentry{error severity}{65} +\indexentry{error status}{90} +\indexentry{errors shell}{90} +\indexentry{Everage Edna}{19} +\indexentry{example applications FunnelWeb}{53} +\indexentry{example complete}{38} +\indexentry{example filename inheritance}{70} +\indexentry{Example FunnelWeb}{38} +\indexentry{examples documentation}{58} +\indexentry{executable FunnelWeb}{106} +\indexentry{execute command}{96} +\indexentry{execute script option}{69} +\indexentry{execution phases}{64} +\indexentry{exists command}{96} +\indexentry{expansion macro}{30} +\indexentry{expansion macro}{47} +\indexentry{expansion macro}{87} +\indexentry{explaining code}{17} +\indexentry{expressions macro}{86} +\indexentry{expression}{85} +\indexentry{extension}{70} +\indexentry{F option}{68} +\indexentry{fatal severity}{65} +\indexentry{fatal status}{90} +\indexentry{fiddling with end-of-line}{43} +\indexentry{fiddling with EOL}{43} +\indexentry{fields filename}{70} +\indexentry{file dependencies}{49} +\indexentry{file differences}{94} +\indexentry{file include}{69} +\indexentry{file journal}{69} +\indexentry{file listing}{69} +\indexentry{file suppression}{49} +\indexentry{file termination}{71} +\indexentry{file typeset}{69} +\indexentry{filename fields}{70} +\indexentry{filename inheritance example}{70} +\indexentry{filename inheritance}{70} +\indexentry{files header}{57} +\indexentry{files include}{30} +\indexentry{files include}{77} +\indexentry{files input}{47} +\indexentry{fixeols command}{96} +\indexentry{font size}{46} +\indexentry{formal parameter lists}{86} +\indexentry{formal parameters}{28} +\indexentry{formal parameters}{28} +\indexentry{formal parameters}{87} +\indexentry{Fortran compilers}{42} +\indexentry{Free text}{115} +\indexentry{free text}{32} +\indexentry{Free text}{83} +\indexentry{free text}{83} +\indexentry{freestanding typesetter directives}{83} +\indexentry{freestanding}{81} +\indexentry{ftp anonymous}{101} +\indexentry{ftp archive}{114} +\indexentry{fudging conditionals}{44} +\indexentry{fudging generics}{59} +\indexentry{functions small}{56} +\indexentry{Funnel-web spider}{19} +\indexentry{FunnelWeb administration}{109} +\indexentry{FunnelWeb applications}{53} +\indexentry{FunnelWeb archive}{114} +\indexentry{FunnelWeb command shell}{90} +\indexentry{FunnelWeb command shell}{90} +\indexentry{FunnelWeb commands}{90} +\indexentry{FunnelWeb comments}{75} +\indexentry{FunnelWeb commitment}{109} +\indexentry{FunnelWeb compiling}{105} +\indexentry{FunnelWeb copyright}{112} +\indexentry{FunnelWeb dangers}{50} +\indexentry{FunnelWeb definition}{63} +\indexentry{FunnelWeb Distribution}{113} +\indexentry{FunnelWeb documentation}{110} +\indexentry{FunnelWeb efficiency}{47} +\indexentry{FunnelWeb example applications}{53} +\indexentry{FunnelWeb Example}{38} +\indexentry{FunnelWeb executable}{106} +\indexentry{FunnelWeb file}{115} +\indexentry{FunnelWeb file}{64} +\indexentry{FunnelWeb hints}{41} +\indexentry{FunnelWeb initialization}{70} +\indexentry{FunnelWeb installation}{101} +\indexentry{FunnelWeb installing}{106} +\indexentry{FunnelWeb invoking}{66} +\indexentry{FunnelWeb language}{115} +\indexentry{FunnelWeb license}{112} +\indexentry{FunnelWeb martinet}{42} +\indexentry{FunnelWeb name}{19} +\indexentry{FunnelWeb obtaining}{101} +\indexentry{FunnelWeb overview}{18} +\indexentry{FunnelWeb overview}{64} +\indexentry{FunnelWeb pitfalls}{50} +\indexentry{FunnelWeb program}{65} +\indexentry{FunnelWeb proper}{115} +\indexentry{FunnelWeb proper}{48} +\indexentry{FunnelWeb proper}{65} +\indexentry{FunnelWeb registration}{110} +\indexentry{FunnelWeb rules}{42} +\indexentry{FunnelWeb running}{66} +\indexentry{FunnelWeb shell}{90} +\indexentry{FunnelWeb startup}{70} +\indexentry{FunnelWeb support}{110} +\indexentry{FunnelWeb testing}{105} +\indexentry{FunnelWeb two main aspects}{21} +\indexentry{FunnelWeb versions}{114} +\indexentry{FunnelWeb}{115} +\indexentry{fw command verb}{66} +\indexentry{fw command}{97} +\indexentry{fwinit.fws}{49} +\indexentry{fwinit.fws}{71} +\indexentry{FW}{115} +\indexentry{gardening code}{53} +\indexentry{generics fudging}{59} +\indexentry{generics typesafe}{61} +\indexentry{global line list dump}{68} +\indexentry{glossary}{115} +\indexentry{GNU license}{112} +\indexentry{GNU license}{18} +\indexentry{GNU license}{9} +\indexentry{good old days}{57} +\indexentry{Gries81}{117} +\indexentry{Gries81}{51} +\indexentry{H option}{68} +\indexentry{hacker's cheer}{35} +\indexentry{hacker's dictionary}{35} +\indexentry{Hackett Simon}{11} +\indexentry{hackman directory}{103} +\indexentry{header C}{57} +\indexentry{header file postscript}{54} +\indexentry{header files}{57} +\indexentry{header page}{37} +\indexentry{headings section}{34} +\indexentry{headings strength}{46} +\indexentry{Hello Northern Hemisphere Program}{21} +\indexentry{hello world document}{20} +\indexentry{help command}{97} +\indexentry{help option}{68} +\indexentry{here command}{98} +\indexentry{hierarchical structure}{34} +\indexentry{high level syntax}{82} +\indexentry{hints FunnelWeb}{41} +\indexentry{Hulse David}{11} +\indexentry{Humphries Barry}{19} +\indexentry{Humphries91}{117} +\indexentry{Humphries91}{19} +\indexentry{hypertext}{15} +\indexentry{I option}{69} +\indexentry{identifiers macro}{41} +\indexentry{include file option}{69} +\indexentry{include files recursive}{31} +\indexentry{include files}{30} +\indexentry{include files}{77} +\indexentry{include files}{77} +\indexentry{Include file}{115} +\indexentry{include file}{69} +\indexentry{indentation blank}{78} +\indexentry{indentation macro calls}{25} +\indexentry{indentation macro expansion}{78} +\indexentry{indentation none}{78} +\indexentry{independence language}{18} +\indexentry{independence typesetter}{18} +\indexentry{independence typesetter}{34} +\indexentry{independence typesetter}{65} +\indexentry{independence typesetter}{80} +\indexentry{infinite context}{68} +\indexentry{inheritance filename}{70} +\indexentry{inheritance section name}{35} +\indexentry{initialization FunnelWeb}{70} +\indexentry{initialization script}{49} +\indexentry{initialization script}{71} +\indexentry{inline typesetter directives}{83} +\indexentry{inline}{81} +\indexentry{input file option}{68} +\indexentry{input files}{47} +\indexentry{Input file}{115} +\indexentry{input file}{18} +\indexentry{input file}{64} +\indexentry{input file}{77} +\indexentry{input line length maximum}{79} +\indexentry{input line length pragma}{79} +\indexentry{input line length}{42} +\indexentry{input line length}{79} +\indexentry{inserting EOL markers}{76} +\indexentry{inserting into text arbitrary characters}{74} +\indexentry{inserting into text control characters}{74} +\indexentry{inserting into text special character}{74} +\indexentry{installation FunnelWeb}{101} +\indexentry{installation problems}{107} +\indexentry{installing FunnelWeb}{106} +\indexentry{interactive mode}{47} +\indexentry{interactive option}{69} +\indexentry{interdependent documentation}{50} +\indexentry{interface command line}{66} +\indexentry{interpreter command}{47} +\indexentry{introduction tutorial}{19} +\indexentry{invisible pragmas}{78} +\indexentry{invocation number}{23} +\indexentry{invocations number}{42} +\indexentry{invoking FunnelWeb}{20} +\indexentry{invoking FunnelWeb}{66} +\indexentry{J option}{69} +\indexentry{Jeremy Begg}{11} +\indexentry{journal file option}{69} +\indexentry{Journal file}{115} +\indexentry{journal file}{64} +\indexentry{journal file}{69} +\indexentry{K option}{69} +\indexentry{Kernighan88}{117} +\indexentry{Kernighan88}{65} +\indexentry{keyboard mode}{47} +\indexentry{keyboard option}{69} +\indexentry{Knuth Donald}{11} +\indexentry{Knuth Donald}{50} +\indexentry{Knuth Donald}{9} +\indexentry{Knuth83}{117} +\indexentry{Knuth83}{17} +\indexentry{Knuth83}{25} +\indexentry{Knuth83}{25} +\indexentry{Knuth83}{9} +\indexentry{Knuth84}{117} +\indexentry{Knuth84}{117} +\indexentry{Knuth84}{13} +\indexentry{Knuth84}{17} +\indexentry{Knuth84}{18} +\indexentry{L option}{69} +\indexentry{Lamport86}{117} +\indexentry{Lamport86}{13} +\indexentry{language independence}{18} +\indexentry{languages multiple}{55} +\indexentry{laser printer}{55} +\indexentry{LaTeX}{13} +\indexentry{LaTeX}{84} +\indexentry{layout program}{22} +\indexentry{layout program}{28} +\indexentry{length command}{91} +\indexentry{length input line}{42} +\indexentry{length line}{71} +\indexentry{length output line}{42} +\indexentry{letter}{67} +\indexentry{levels of diagnostics}{65} +\indexentry{libraries macro}{31} +\indexentry{license FunnelWeb}{112} +\indexentry{license GNU}{112} +\indexentry{license GNU}{18} +\indexentry{license GNU}{9} +\indexentry{line length input}{79} +\indexentry{line length}{71} +\indexentry{line termination}{71} +\indexentry{list document}{64} +\indexentry{list options}{68} +\indexentry{list shell commands}{93} +\indexentry{listing file context}{68} +\indexentry{listing file option}{69} +\indexentry{Listing file}{115} +\indexentry{listing file}{64} +\indexentry{listing file}{69} +\indexentry{literal construct}{37} +\indexentry{literal directive}{84} +\indexentry{literate programming tools}{15} +\indexentry{literate programming, facilities}{15} +\indexentry{literate programming, most significant benefit}{17} +\indexentry{literate programming}{15} +\indexentry{literate programming}{15} +\indexentry{literate programming}{50} +\indexentry{MacDraw}{54} +\indexentry{Macintosh}{13} +\indexentry{Macintosh}{54} +\indexentry{macro attributes}{85} +\indexentry{macro bindings}{22} +\indexentry{macro body}{85} +\indexentry{macro calls indentation}{25} +\indexentry{macro calls}{86} +\indexentry{macro checks}{88} +\indexentry{macro definitions}{32} +\indexentry{Macro definition}{116} +\indexentry{macro definition}{85} +\indexentry{macro definition}{87} +\indexentry{macro expansion indentation}{78} +\indexentry{macro expansion}{30} +\indexentry{macro expansion}{47} +\indexentry{macro expansion}{87} +\indexentry{macro expressions}{86} +\indexentry{macro facilities tutorial}{22} +\indexentry{macro identifiers}{41} +\indexentry{macro libraries}{31} +\indexentry{macro names}{41} +\indexentry{macro names}{86} +\indexentry{macro name}{85} +\indexentry{macro parameter delimiting}{87} +\indexentry{macro recursion}{43} +\indexentry{macro recursion}{88} +\indexentry{macro table dump}{68} +\indexentry{macro table}{64} +\indexentry{macros additive}{26} +\indexentry{macros parameterized}{28} +\indexentry{macros simple tutorial}{22} +\indexentry{macros static}{87} +\indexentry{Macro}{115} +\indexentry{magic trick}{15} +\indexentry{maintenance programmer}{50} +\indexentry{make utility}{49} +\indexentry{manuals printing}{107} +\indexentry{mapped file dump}{68} +\indexentry{Mapper}{116} +\indexentry{mapper}{71} +\indexentry{martinet FunnelWeb}{42} +\indexentry{maximum input line length}{79} +\indexentry{maximum output file line length pragma}{79} +\indexentry{maximum output file line length}{79} +\indexentry{maximum product file line length pragma}{79} +\indexentry{maximum product file line length}{79} +\indexentry{medicine wholistic}{53} +\indexentry{memory use of}{30} +\indexentry{memory}{47} +\indexentry{MIL-STD-2167A}{51} +\indexentry{monster file postscript}{54} +\indexentry{multiple languages}{55} +\indexentry{name empty}{42} +\indexentry{name FunnelWeb}{19} +\indexentry{name section}{34} +\indexentry{name section}{84} +\indexentry{names macro}{41} +\indexentry{names macro}{86} +\indexentry{names quick}{42} +\indexentry{names quick}{76} +\indexentry{names section}{86} +\indexentry{names}{86} +\indexentry{name}{70} +\indexentry{new page pragma}{81} +\indexentry{new page}{81} +\indexentry{newpage directive}{37} +\indexentry{no indentation}{78} +\indexentry{non-determinism}{68} +\indexentry{non-printable characters}{96} +\indexentry{none indentation}{78} +\indexentry{notation}{63} +\indexentry{notes efficiency}{47} +\indexentry{notice copyright}{1} +\indexentry{novels}{50} +\indexentry{number calls}{23} +\indexentry{number invocations}{42} +\indexentry{number invocation}{23} +\indexentry{number of times called}{23} +\indexentry{numbering cross reference}{89} +\indexentry{numbering section}{89} +\indexentry{object code}{26} +\indexentry{obtaining FunnelWeb}{101} +\indexentry{open systems}{55} +\indexentry{option B}{68} +\indexentry{option C}{68} +\indexentry{option delete output}{68} +\indexentry{option dump}{68} +\indexentry{option D}{49} +\indexentry{option D}{68} +\indexentry{option execute script}{69} +\indexentry{option F}{68} +\indexentry{option help}{68} +\indexentry{option H}{68} +\indexentry{option include file}{69} +\indexentry{option input file}{68} +\indexentry{option interactive}{69} +\indexentry{option I}{69} +\indexentry{option journal file}{69} +\indexentry{option J}{69} +\indexentry{option keyboard}{69} +\indexentry{option K}{69} +\indexentry{option listing file}{69} +\indexentry{option L}{69} +\indexentry{option quiet}{69} +\indexentry{option Q}{69} +\indexentry{option screen}{69} +\indexentry{option S}{69} +\indexentry{option typeset}{69} +\indexentry{option T}{69} +\indexentry{option width}{69} +\indexentry{option W}{69} +\indexentry{option X}{69} +\indexentry{options command}{92} +\indexentry{options default}{49} +\indexentry{options default}{92} +\indexentry{options list}{68} +\indexentry{options setting defaults}{49} +\indexentry{options syntax}{67} +\indexentry{options tracedump}{68} +\indexentry{options}{67} +\indexentry{options}{68} +\indexentry{Option}{116} +\indexentry{order action execution}{71} +\indexentry{order program}{22} +\indexentry{ordering program}{15} +\indexentry{Ordinary options}{70} +\indexentry{organization boring}{50} +\indexentry{organization spaghetti}{50} +\indexentry{output file line length maximum}{79} +\indexentry{output files delete}{49} +\indexentry{output files}{18} +\indexentry{output files}{64} +\indexentry{Output file}{116} +\indexentry{output line length}{42} +\indexentry{output WEB}{25} +\indexentry{over documentation}{51} +\indexentry{overhead procedure call}{57} +\indexentry{overview FunnelWeb}{18} +\indexentry{overview FunnelWeb}{64} +\indexentry{overview typesetting}{32} +\indexentry{OzTeX}{13} +\indexentry{package}{55} +\indexentry{parameter list, absent}{29} +\indexentry{parameter lists formal}{86} +\indexentry{parameterized macros}{28} +\indexentry{parameters actual}{29} +\indexentry{parameters formal}{28} +\indexentry{parameters formal}{28} +\indexentry{parameters formal}{87} +\indexentry{Parser}{116} +\indexentry{parser}{64} +\indexentry{parser}{82} +\indexentry{parsing command line}{66} +\indexentry{Pascal}{15} +\indexentry{Pascal}{25} +\indexentry{Pascal}{26} +\indexentry{Pascal}{57} +\indexentry{Pascal}{59} +\indexentry{Pat Scannel}{29} +\indexentry{pavlov documentation}{51} +\indexentry{phases execution}{64} +\indexentry{phases}{64} +\indexentry{PhD thesis}{54} +\indexentry{pitfalls FunnelWeb}{50} +\indexentry{poem animal}{30} +\indexentry{poem camera}{30} +\indexentry{portability}{18} +\indexentry{postscript header file}{54} +\indexentry{postscript monster file}{54} +\indexentry{PostScript}{54} +\indexentry{postscript}{57} +\indexentry{pragma input line length}{79} +\indexentry{pragma maximum output file line length}{79} +\indexentry{pragma maximum product file line length}{79} +\indexentry{pragma new page}{81} +\indexentry{pragma table of contents}{81} +\indexentry{pragma title}{82} +\indexentry{pragma typesetter}{80} +\indexentry{pragma vskip}{81} +\indexentry{pragmas invisible}{78} +\indexentry{pragmas visible}{78} +\indexentry{pragmas}{78} +\indexentry{Pragma}{116} +\indexentry{pragma}{25} +\indexentry{pragma}{78} +\indexentry{preface}{9} +\indexentry{preprocessor C}{20} +\indexentry{preprocessor C}{57} +\indexentry{presentation notes}{13} +\indexentry{Printed documentation}{116} +\indexentry{printer laser}{55} +\indexentry{printing manuals}{107} +\indexentry{printing system}{55} +\indexentry{problems binding}{57} +\indexentry{problems installation}{107} +\indexentry{procedure call overhead}{57} +\indexentry{processing command line}{66} +\indexentry{processing command line}{92} +\indexentry{product file line length maximum}{79} +\indexentry{product file width}{69} +\indexentry{product files}{18} +\indexentry{product files}{64} +\indexentry{Product file}{116} +\indexentry{production tool}{19} +\indexentry{program layout}{22} +\indexentry{program layout}{28} +\indexentry{program ordering}{15} +\indexentry{program order}{22} +\indexentry{programmer maintenance}{50} +\indexentry{programmer's cheer}{35} +\indexentry{programming literate}{50} +\indexentry{Q option}{69} +\indexentry{quick names}{42} +\indexentry{quick names}{76} +\indexentry{quick name}{42} +\indexentry{quick name}{76} +\indexentry{quiet option}{69} +\indexentry{quit command}{98} +\indexentry{random access}{50} +\indexentry{rec.humor.funny}{29} +\indexentry{recursion macro}{43} +\indexentry{recursion macro}{88} +\indexentry{recursive include files}{31} +\indexentry{references}{117} +\indexentry{referencing cross}{89} +\indexentry{registration FunnelWeb}{110} +\indexentry{regression testing}{103} +\indexentry{regression testing}{47} +\indexentry{reliability}{18} +\indexentry{REM statement}{57} +\indexentry{report annual}{58} +\indexentry{results directory}{103} +\indexentry{return status}{65} +\indexentry{Roger Brissenden}{11} +\indexentry{Rosovsky90}{117} +\indexentry{Rosovsky90}{17} +\indexentry{Ross Williams}{1} +\indexentry{rule simple}{20} +\indexentry{rules FunnelWeb}{42} +\indexentry{running FunnelWeb}{66} +\indexentry{S option}{69} +\indexentry{Scannel Pat}{29} +\indexentry{Scanner}{116} +\indexentry{scanner}{64} +\indexentry{scanner}{71} +\indexentry{screen option}{69} +\indexentry{script initialization}{49} +\indexentry{script initialization}{71} +\indexentry{script startup}{49} +\indexentry{scripts directory}{103} +\indexentry{Script}{116} +\indexentry{section constructs}{83} +\indexentry{section headings}{34} +\indexentry{section name inheritance}{35} +\indexentry{section names}{86} +\indexentry{section name}{34} +\indexentry{section name}{84} +\indexentry{section numbering}{89} +\indexentry{section strength}{46} +\indexentry{semantic architecture}{64} +\indexentry{sequences special}{72} +\indexentry{set abstraction}{59} +\indexentry{set command}{48} +\indexentry{set command}{98} +\indexentry{setting defaults options}{49} +\indexentry{setting special character}{74} +\indexentry{severe severity}{65} +\indexentry{severe status}{90} +\indexentry{severity assertion}{65} +\indexentry{severity error}{65} +\indexentry{severity fatal}{65} +\indexentry{severity severe}{65} +\indexentry{severity warning}{65} +\indexentry{severity}{65} +\indexentry{sharing information}{56} +\indexentry{sharing text}{58} +\indexentry{shark white pointer}{19} +\indexentry{shell commands list}{93} +\indexentry{shell commands}{93} +\indexentry{shell errors}{90} +\indexentry{shell FunnelWeb}{90} +\indexentry{shell uses}{90} +\indexentry{Shell}{116} +\indexentry{shooting}{31} +\indexentry{show command}{48} +\indexentry{show command}{98} +\indexentry{sign}{67} +\indexentry{Simon Hackett}{11} +\indexentry{simple macros tutorial}{22} +\indexentry{simple rule}{20} +\indexentry{simple sequence}{72} +\indexentry{simplicity}{18} +\indexentry{size font}{46} +\indexentry{skip vertical}{81} +\indexentry{skipto command}{98} +\indexentry{small functions}{56} +\indexentry{Smith91}{117} +\indexentry{Smith91}{17} +\indexentry{snake tiger}{19} +\indexentry{song}{29} +\indexentry{sources directory}{103} +\indexentry{spacing}{43} +\indexentry{spaghetti organization}{50} +\indexentry{special character changing}{31} +\indexentry{special character default}{72} +\indexentry{special character inserting into text}{74} +\indexentry{special character setting}{74} +\indexentry{Special character}{116} +\indexentry{special character}{20} +\indexentry{special character}{72} +\indexentry{special sequences}{72} +\indexentry{Special sequence}{116} +\indexentry{special sequence}{20} +\indexentry{special sequence}{72} +\indexentry{special tokens}{82} +\indexentry{speed}{47} +\indexentry{spider Funnel-web}{19} +\indexentry{startup FunnelWeb}{70} +\indexentry{startup script}{49} +\indexentry{statement REM}{57} +\indexentry{static analysis}{88} +\indexentry{static macros}{87} +\indexentry{status assertion}{90} +\indexentry{status command}{99} +\indexentry{status error}{90} +\indexentry{status fatal}{90} +\indexentry{status return}{65} +\indexentry{status severe}{90} +\indexentry{status success}{90} +\indexentry{status warning}{90} +\indexentry{stream of consciousness}{50} +\indexentry{strength headings}{46} +\indexentry{strength section}{46} +\indexentry{strength typesetting}{46} +\indexentry{string substitution}{91} +\indexentry{string substitution}{94} +\indexentry{string}{67} +\indexentry{structure hierarchical}{34} +\indexentry{structure tree}{83} +\indexentry{Strunk79}{117} +\indexentry{Strunk79}{51} +\indexentry{substitution string}{91} +\indexentry{substitution string}{94} +\indexentry{success status}{90} +\indexentry{support FunnelWeb}{110} +\indexentry{suppress console output}{69} +\indexentry{suppressing EOL markers}{77} +\indexentry{suppression EOL}{23} +\indexentry{suppression file}{49} +\indexentry{Sydney}{19} +\indexentry{syntax command line options}{67} +\indexentry{syntax command line}{67} +\indexentry{syntax EBNF}{63} +\indexentry{syntax high level}{82} +\indexentry{syntax options}{67} +\indexentry{system printing}{55} +\indexentry{T option}{69} +\indexentry{table macro}{64} +\indexentry{table of contents directive}{37} +\indexentry{table of contents pragma}{81} +\indexentry{table of contents}{81} +\indexentry{tabs}{42} +\indexentry{Tangle}{116} +\indexentry{tangle}{65} +\indexentry{tangle}{88} +\indexentry{Tangling}{21} +\indexentry{target typesetter}{89} +\indexentry{termination file}{71} +\indexentry{termination line}{71} +\indexentry{terminology}{63} +\indexentry{testing FunnelWeb}{105} +\indexentry{testing regression}{103} +\indexentry{testing regression}{47} +\indexentry{tests directory}{104} +\indexentry{text editors}{42} +\indexentry{text files cryptic}{55} +\indexentry{text free}{83} +\indexentry{text sharing}{58} +\indexentry{text tokens}{82} +\indexentry{TeX}{13} +\indexentry{TeX}{18} +\indexentry{TeX}{22} +\indexentry{TeX}{54} +\indexentry{thesis PhD}{54} +\indexentry{tiger snake}{19} +\indexentry{time development}{17} +\indexentry{times dump}{68} +\indexentry{title directive}{37} +\indexentry{title pragma}{82} +\indexentry{title}{82} +\indexentry{token list dump}{68} +\indexentry{tolerate command}{100} +\indexentry{tools literate programming}{15} +\indexentry{trace command}{100} +\indexentry{trace on command}{48} +\indexentry{tracedump options}{68} +\indexentry{trailing blanks}{42} +\indexentry{tree directory}{102} +\indexentry{tree structure}{83} +\indexentry{Trevorrow Andrew}{13} +\indexentry{tutorial +=}{26} +\indexentry{tutorial ==}{26} +\indexentry{tutorial @M}{24} +\indexentry{tutorial @Z}{24} +\indexentry{tutorial introduction}{19} +\indexentry{tutorial macro facilities}{22} +\indexentry{tutorial macros simple}{22} +\indexentry{tutorial simple macros}{22} +\indexentry{tutorial typesetting}{32} +\indexentry{tutorial}{15} +\indexentry{tutorial}{19} +\indexentry{twelve bugs of christmas}{29} +\indexentry{two main aspects FunnelWeb}{21} +\indexentry{typesafe generics}{61} +\indexentry{typeset file}{69} +\indexentry{typeset option}{69} +\indexentry{typesetter directive tokens}{82} +\indexentry{typesetter directives}{66} +\indexentry{typesetter directives}{81} +\indexentry{typesetter independence}{18} +\indexentry{typesetter independence}{34} +\indexentry{typesetter independence}{65} +\indexentry{typesetter independence}{80} +\indexentry{typesetter independent}{34} +\indexentry{typesetter pragma}{80} +\indexentry{typesetter target}{89} +\indexentry{Typesetting directive}{116} +\indexentry{typesetting overview}{32} +\indexentry{typesetting strength}{46} +\indexentry{typesetting tutorial}{32} +\indexentry{typesetting}{13} +\indexentry{typesetting}{89} +\indexentry{universities}{17} +\indexentry{University Adelaide}{59} +\indexentry{Unix newline}{75} +\indexentry{Unix}{67} +\indexentry{unprintable characters}{71} +\indexentry{USDOD83}{117} +\indexentry{use of memory}{30} +\indexentry{useful commands}{47} +\indexentry{userman directory}{105} +\indexentry{uses shell}{90} +\indexentry{versions FunnelWeb}{114} +\indexentry{vertical skip}{81} +\indexentry{visible pragmas}{78} +\indexentry{vskip directive}{37} +\indexentry{vskip pragma}{81} +\indexentry{W option}{69} +\indexentry{warning severity}{65} +\indexentry{warning status}{90} +\indexentry{warranty}{112} +\indexentry{Weave}{116} +\indexentry{weave}{65} +\indexentry{weave}{89} +\indexentry{Weaving}{21} +\indexentry{WEB output}{25} +\indexentry{WEB}{21} +\indexentry{WEB}{25} +\indexentry{Web}{9} +\indexentry{white pointer shark}{19} +\indexentry{wholistic debugging}{53} +\indexentry{wholistic debugging}{53} +\indexentry{wholistic medicine}{53} +\indexentry{width option}{69} +\indexentry{width product file}{69} +\indexentry{Williams Ross}{1} +\indexentry{workstations}{48} +\indexentry{workstation}{90} +\indexentry{write command}{100} +\indexentry{writeu command}{100} +\indexentry{X option}{69} diff --git a/web/funnelAC/userman/u_manual.tex b/web/funnelAC/userman/u_manual.tex new file mode 100644 index 0000000000..41d06b00dc --- /dev/null +++ b/web/funnelAC/userman/u_manual.tex @@ -0,0 +1,290 @@ +%==============================================================================% +% FUNNELWEB USER'S MANUAL % +%==============================================================================% +% +% Summary +% ------- +% This is the main .tex file of the FunnelWeb User's Manual. +% +% For a list of the other files that contribute to this document, +% see the list of files given in \input lines at the end of this file. +% +% See the TeX comments below to find out how to typeset this document. +% +% +% Copyright +% --------- +% Copyright (C) 1992 Ross N. Williams. +% +% Permission is granted to make and distribute verbatim copies of this manual +% provided that the copyright notice and this permission notice are preserved +% on all copies. +% +% +% Version +% ------- +% Date : May 1992. +% Version : 1.0. +% +% +% Author +% ------ +% Name : Ross Williams. +% Email : ross@spam.adelaide.edu.au +% Snail : 16 Lerwick Avenue, Hazelwood Park 5066, Australia. +% +% +% How to Typeset This Document +% ---------------------------- +% This document is written in a format suitable for processing by the LaTeX +% typesetting system which can be found on many machines around the world. +% The document is an entirely self contained LaTeX document. To assist in +% the electronic distribution of this document, all diagrams have been +% constructing using ASCII text from within LaTeX. This means that all you +% need to print this document is a LaTeX typesetting system. +% +% To print this document using LaTeX, give a command sequence that looks +% something like this: +% +% latex manual +% latex manual +% sort -f <manual.idx >manual.sin +% % Start here if manual.aux, manual.toc, and manual.sin already exist. +% latex manual +% print manual +% +% The commands must be given three times so as to allow the cross +% referencing information to be correctly assembled. +% The "sort" command should perform a case insensitive sort of the lines of +% its input, but should not alter the lines it is sorting. In the example +% about, the "-f" option specifies that the sort should be case insensitive. +% The "print" command should print the .dvi file generated by LaTeX. +% The details of the typesetting sequence above may vary on your computer +% system. +% +%=============================================================================% + + +% Basic Document Style +% -------------------- +% The default font size is 10pt which is what I want. +% titlepage - Instructs LaTeX to produce a title page at the front. +% book - Use the "book" built in format. +\documentstyle[titlepage]{book} + +% The following pagestyle command instructs LaTeX to set each page with just +% a page number at the middle of the bottom of each page. +\pagestyle{plain} + +% By default, the "book" style sets even and odd pages differently on the +% assumption that the result is to be used in a two-sided printing process. +% However, most people printing this will print it single sided. +% To suppress double sided mode, we need to give the \onecolumn command. +\onecolumn + + +% Page Size and Position +% ---------------------- +% The following sets the size of the text box and its position on the page. +% It works OK on A4 paper. I suppose I should test it on American paper too. +\textwidth 15cm +\textheight 24cm +\topmargin 0cm +\oddsidemargin 1.5cm +\evensidemargin 1.5cm +\headheight 0cm +\headsep 0cm + + +% Table of Contents +% ----------------- +% Specify that all headings be numbered and appear in the Table of Contents. +\setcounter{secnumdepth}{100} +\setcounter{tocdepth}{100} + +% LaTeX lets you create an unnumbered chapter, but it doesn't put it in +% the table of contents. So we have to do it manually. +\def\pseudochapter#1{% +\chapter*{#1} +\addcontentsline{toc}{chapter}{#1} +} + +% Paragraph Separation and Indentation +% ------------------------------------ +% The default LaTeX format is to have paragraphs jammed up against each other +% with indentation of text on the first line of each paragraph used to +% highlight the start of each paragraph. I prefer to identify paragraphs +% by separating them with space and eliminating the indentation. +\parskip \medskipamount +\parindent 0pt + + +% Quick Style Macros +% ------------------ +% Use of the following macros is much neater and safer than opening a group +% and setting a mode (e.g. {\bf sloth}) as these macros will cause TeX to +% scream if they span more than one paragraph whereas the group method +% can cause half the document to be set in a funny mode. +% Other little macros here serve the same neatening normalizing purposes. +\def\i#1{{\it #1}} % Italics. +\def\b#1{{\bf #1}} % Bold. +\def\p#1{{\tt #1}} % Program text. +\def\sq#1{`#1'} % Single quotes. +\def\dq#1{``#1''} % Double quotes. +\def\dqp#1{\dq{\p{#1}}} % Double quoted program text. +\def\fix#1{\footnote{$\bullet$ #1}} % Fix it up footnote. +\def\softfix#1{} % Marks opportunity for improvement. +\def\eg{e.g.~} % Spacing regulated "e.g.". +\def\ie{i.e.~} % Spacing regulated "i.e.". +\def\til{\char`\~} % For tilde ("~") character. +\def\circumflex{\char`\^} % Circumflex. +\def\bs{{\tt\char`\\}} % Backslash. + +% Point Making +% ------------ +% LaTeX provides some useful environment for listing points. However, it does +% not seem to provide what I want which is a paragraph of text led in by +% a label set in bold. +\def\thing#1{{\bf #1}} +\def\firstthing#1{\thing{#1}} +\def\narrowthing#1#2{{%From defintion of \narrower +\advance\leftskip1cm% +\advance\rightskip1cm% +{\bf #1} #2\vskip0pt}} +\def\narrowtext#1{{%From defintion of \narrower +\advance\leftskip1cm% +\advance\rightskip1cm% +#1\vskip0pt}} +\def\summary{\b{Summary:}\ } + +% Invisible Annotations +% --------------------- +% Sometimes it is convenient to be able to annotate the LaTeX code without +% causing text to appear in the document. +% Here, the \checked{} macro can be placed next to any quotation or +% fact, or other externally dependent material that has to be checked +% before publication. The \note{} macro can be used to add a note. +% Both macros are safer than "%" in a paragraph where the text may be +% continually being rearranged across lines. +\def\checked#1{} +\def\note#1{} + + +% Wide Verbatim Text +% ------------------ +% This document was originally set in 12pt and the result was that many of +% the verbatim examples wouldn't fit. To solve this, I created two macros +% to reduce and increase the size of the text, and wrapped the longer +% verbatim texts in calls to the macros. Later, the document was reset in +% 10pt eliminating the original problem, so I redefined the macros to empty. +%\def\beginsmall{\scriptsize} +%\def\endsmall{\normalsize} +\def\beginsmall{} +\def\endsmall{} + + +% The Index +% --------- +% LaTeX provides a single command (\index) for adding index entries to the +% index. We shorten it and refine it a little with a few definitions. +\def\newterm#1{{\bf #1}\x{#1}} % Special terminology. +\def\x#1{\index{#1}} % Normal index entry. +\def\xx#1#2{\index{#1 #2}\index{#2 #1}} % Symmetric index entry. +\def\xn#1#2{\xx{#1}{#2}} % For a person's name. +\def\xs#1#2{\index{#1, #2}} % For an entry with a subclause. + + +% References +% ---------- +\def\paper#1{{\bf [#1]}\x{#1}\linebreak[1]{}} + + +% Figures and Tables +% ------------------ +% LaTeX numbers figures by chapter and doesn't position captions where I +% want them and so I have decided to do it all manually. I haven't got +% time for fancy stuff so I am using manual macros. +\def\mylabel#1#2{% +\begin{quotation} +\footnotesize\baselineskip=12pt #2 +\end{quotation} +\centerline{#1} +\smallskip} + +\def\figfor#1{{\bf Figure~#1}} +\def\tabfor#1{{\bf Table~#1}} + +\def\figarchitecture{\figfor{1}} +\def\figfunarch{\figfor{2}} +\def\figphases{\figfor{3}} +\def\figregform{\figfor{4}} + +%\def\tabone{\tabfor{1}} +%\def\tabtwo{\tabfor{2}} + + +% Glossary +% -------- +\def\gloss#1{\thing{#1:}\x{#1}} + + +% Random Leftover Stuff +% --------------------- +\def\topicbreak{\bigskip\centerline{--- $\S$ ---}\bigskip} + + + +%------------------------------------------------------------------------------ + +\makeindex + +\begin{document} + +% Title Page +% ---------- +% Although the title should really be in the ch0.tex file, LaTeX forces us to +% put it here. +\begin{titlepage} +\vspace*{3cm} +\begin{center} +\Huge +\vspace{2cm} +FunnelWeb User's Manual\\ +\vspace{2cm} +\LARGE +Ross~N.~Williams\\ +\vspace{1cm} +\Large +V1.0 for FunnelWeb V3.0\\ +\vspace{1cm} +May 1992\\ +\normalsize +\end{center} +\end{titlepage} + +% Note: LaTeX sometimes puts a blank page before chapters so as to +% start each chapter on an odd-numbered page. There is nothing that I +% can do about this. This is part of the cost of using LaTeX instead +% of TeX. + +%\makeindex % original position + +%------------------------------------------------------------------------------- + +%\begin{document} % original position +\sloppy +\nonstopmode + +\input u_ch0 % Table of contents etc. +\input u_ch1 % A Tutorial Introduction +\input u_ch2 % FunnelWeb Hints +\input u_ch3 % FunnelWeb Definition +\input u_ch4 % FunnelWeb Installation. +\input u_ch5 % FunnelWeb Administration. +\input u_cha % Appendices + +\end{document} + +%==============================================================================% +% End of Main .TeX File of FunnelWeb User's Manual % +%==============================================================================% diff --git a/web/funnelAC/userman/u_manual.toc b/web/funnelAC/userman/u_manual.toc new file mode 100644 index 0000000000..b359e8fa3e --- /dev/null +++ b/web/funnelAC/userman/u_manual.toc @@ -0,0 +1,166 @@ +\contentsline {chapter}{Preface}{9} +\contentsline {chapter}{Acknowledgements}{11} +\contentsline {chapter}{Presentation Notes}{13} +\contentsline {chapter}{\numberline {1}A Tutorial Introduction}{15} +\contentsline {section}{\numberline {1.1}What is Literate Programming?}{15} +\contentsline {section}{\numberline {1.2}What is FunnelWeb?}{18} +\contentsline {section}{\numberline {1.3}The Name FunnelWeb}{19} +\contentsline {section}{\numberline {1.4}A FunnelWeb Tutorial}{19} +\contentsline {section}{\numberline {1.5}A Hello World Document}{20} +\contentsline {section}{\numberline {1.6}Macro Facilities}{22} +\contentsline {subsection}{\numberline {1.6.1}Simple Macros}{22} +\contentsline {subsection}{\numberline {1.6.2}Number of Times Called}{23} +\contentsline {subsection}{\numberline {1.6.3}Indentation}{25} +\contentsline {subsection}{\numberline {1.6.4}Additive Macros}{26} +\contentsline {subsection}{\numberline {1.6.5}Parameterized Macros}{28} +\contentsline {subsection}{\numberline {1.6.6}Macro Expansion}{30} +\contentsline {subsection}{\numberline {1.6.7}Include Files}{30} +\contentsline {section}{\numberline {1.7}Typesetting Facilities}{32} +\contentsline {subsection}{\numberline {1.7.1}Overview}{32} +\contentsline {subsection}{\numberline {1.7.2}Typesetter Independence}{34} +\contentsline {subsection}{\numberline {1.7.3}Hierarchical Structure}{34} +\contentsline {subsection}{\numberline {1.7.4}Understanding the Printed Documentation}{35} +\contentsline {subsection}{\numberline {1.7.5}Literals and Emphasis}{37} +\contentsline {subsection}{\numberline {1.7.6}Adding a Header Page}{37} +\contentsline {subsection}{\numberline {1.7.7}Comments}{37} +\contentsline {section}{\numberline {1.8}A Complete Example}{38} +\contentsline {section}{\numberline {1.9}Summary}{39} +\contentsline {chapter}{\numberline {2}FunnelWeb Hints}{41} +\contentsline {section}{\numberline {2.1}Macro Names}{41} +\contentsline {section}{\numberline {2.2}Quick Names}{42} +\contentsline {section}{\numberline {2.3}FunnelWeb the Martinet}{42} +\contentsline {section}{\numberline {2.4}Fiddling With End of Lines}{43} +\contentsline {section}{\numberline {2.5}Fudging Conditionals}{44} +\contentsline {section}{\numberline {2.6}Changing the Strength of Headings}{46} +\contentsline {section}{\numberline {2.7}Efficiency Notes}{47} +\contentsline {section}{\numberline {2.8}Interactive Mode}{47} +\contentsline {section}{\numberline {2.9}Setting Up Default Options}{49} +\contentsline {section}{\numberline {2.10}FunnelWeb and Make}{49} +\contentsline {section}{\numberline {2.11}The Dangers of FunnelWeb}{50} +\contentsline {section}{\numberline {2.12}Wholistic Debugging}{53} +\contentsline {section}{\numberline {2.13}Examples of FunnelWeb Applications}{53} +\contentsline {subsection}{\numberline {2.13.1}Analyzing the Monster Postscript Header File}{54} +\contentsline {subsection}{\numberline {2.13.2}Making Ada ADTs more A}{55} +\contentsline {subsection}{\numberline {2.13.3}Multiple Language Systems}{55} +\contentsline {subsection}{\numberline {2.13.4}The Case of the Small Function}{56} +\contentsline {subsection}{\numberline {2.13.5}When Comments are Bad}{57} +\contentsline {subsection}{\numberline {2.13.6}Documents That Share Text}{58} +\contentsline {subsection}{\numberline {2.13.7}Generics}{59} +\contentsline {section}{\numberline {2.14}Summary}{62} +\contentsline {chapter}{\numberline {3}FunnelWeb Definition}{63} +\contentsline {section}{\numberline {3.1}Introduction}{63} +\contentsline {section}{\numberline {3.2}Notation}{63} +\contentsline {section}{\numberline {3.3}Terminology}{63} +\contentsline {section}{\numberline {3.4}An Architectural Overview}{64} +\contentsline {section}{\numberline {3.5}Diagnostics}{65} +\contentsline {section}{\numberline {3.6}Typesetter Independence}{65} +\contentsline {section}{\numberline {3.7}Command Line Interface}{66} +\contentsline {subsection}{\numberline {3.7.1}Invoking FunnelWeb}{66} +\contentsline {subsection}{\numberline {3.7.2}Command Line Arguments}{67} +\contentsline {subsection}{\numberline {3.7.3}Options}{68} +\contentsline {section}{\numberline {3.8}File Name Inheritance}{70} +\contentsline {section}{\numberline {3.9}FunnelWeb Startup}{70} +\contentsline {section}{\numberline {3.10}Scanner}{71} +\contentsline {subsection}{\numberline {3.10.1}Basic Input File Processing}{71} +\contentsline {subsection}{\numberline {3.10.2}Special Sequences}{72} +\contentsline {subsection}{\numberline {3.10.3}Setting the Special Character}{74} +\contentsline {subsection}{\numberline {3.10.4}Inserting the Special Character into the Text}{74} +\contentsline {subsection}{\numberline {3.10.5}Inserting Arbitrary Characters into the Text}{74} +\contentsline {subsection}{\numberline {3.10.6}Comments}{75} +\contentsline {subsection}{\numberline {3.10.7}Quick Names}{76} +\contentsline {subsection}{\numberline {3.10.8}Inserting End of Line Markers}{76} +\contentsline {subsection}{\numberline {3.10.9}Suppressing End of Line Markers}{77} +\contentsline {subsection}{\numberline {3.10.10}Include Files}{77} +\contentsline {subsection}{\numberline {3.10.11}Pragmas}{78} +\contentsline {subsubsection}{\numberline {3.10.11.1}Indentation}{78} +\contentsline {subsubsection}{\numberline {3.10.11.2}Maximum Input Line Length}{79} +\contentsline {subsubsection}{\numberline {3.10.11.3}Maximum Output File Line Length}{79} +\contentsline {subsubsection}{\numberline {3.10.11.4}Typesetter}{80} +\contentsline {subsection}{\numberline {3.10.12}Freestanding Typesetter Directives}{81} +\contentsline {subsubsection}{\numberline {3.10.12.1}New Page}{81} +\contentsline {subsubsection}{\numberline {3.10.12.2}Table of Contents}{81} +\contentsline {subsubsection}{\numberline {3.10.12.3}Vertical Skip}{81} +\contentsline {subsubsection}{\numberline {3.10.12.4}Title}{82} +\contentsline {subsection}{\numberline {3.10.13}Scanner/Parser Interface}{82} +\contentsline {section}{\numberline {3.11}Parser}{82} +\contentsline {subsection}{\numberline {3.11.1}High Level Structure}{82} +\contentsline {subsection}{\numberline {3.11.2}Free Text}{83} +\contentsline {subsection}{\numberline {3.11.3}Typesetter Directives}{83} +\contentsline {subsubsection}{\numberline {3.11.3.1}Section}{83} +\contentsline {subsubsection}{\numberline {3.11.3.2}Literal Directive}{84} +\contentsline {subsubsection}{\numberline {3.11.3.3}Emphasis Directive}{85} +\contentsline {subsection}{\numberline {3.11.4}Macros}{85} +\contentsline {subsubsection}{\numberline {3.11.4.1}Names}{86} +\contentsline {subsubsection}{\numberline {3.11.4.2}Formal Parameter Lists}{86} +\contentsline {subsection}{\numberline {3.11.5}Expressions}{86} +\contentsline {subsection}{\numberline {3.11.6}Macro Calls}{86} +\contentsline {subsection}{\numberline {3.11.7}Formal Parameters}{87} +\contentsline {subsection}{\numberline {3.11.8}Macros are Static}{87} +\contentsline {section}{\numberline {3.12}Analyser}{88} +\contentsline {section}{\numberline {3.13}Tangle}{88} +\contentsline {section}{\numberline {3.14}Weave}{89} +\contentsline {subsection}{\numberline {3.14.1}Target Typesetter}{89} +\contentsline {subsection}{\numberline {3.14.2}Cross Reference Numbering}{89} +\contentsline {section}{\numberline {3.15}FunnelWeb Shell}{90} +\contentsline {subsection}{\numberline {3.15.1}Introduction}{90} +\contentsline {subsection}{\numberline {3.15.2}Return Statuses}{90} +\contentsline {subsection}{\numberline {3.15.3}Command Line Length}{91} +\contentsline {subsection}{\numberline {3.15.4}String Substitution}{91} +\contentsline {subsection}{\numberline {3.15.5}How a Command Line is Processed}{92} +\contentsline {subsection}{\numberline {3.15.6}Options}{92} +\contentsline {subsection}{\numberline {3.15.7}Shell Commands}{93} +\contentsline {subsubsection}{\numberline {3.15.7.1}Absent}{93} +\contentsline {subsubsection}{\numberline {3.15.7.2}Codify}{93} +\contentsline {subsubsection}{\numberline {3.15.7.3}Compare}{93} +\contentsline {subsubsection}{\numberline {3.15.7.4}Define}{94} +\contentsline {subsubsection}{\numberline {3.15.7.5}Diff}{94} +\contentsline {subsubsection}{\numberline {3.15.7.6}Diffsummary}{95} +\contentsline {subsubsection}{\numberline {3.15.7.7}Diffzero}{95} +\contentsline {subsubsection}{\numberline {3.15.7.8}Eneo}{95} +\contentsline {subsubsection}{\numberline {3.15.7.9}Execute}{96} +\contentsline {subsubsection}{\numberline {3.15.7.10}Exists}{96} +\contentsline {subsubsection}{\numberline {3.15.7.11}Fixeols}{96} +\contentsline {subsubsection}{\numberline {3.15.7.12}Fw}{97} +\contentsline {subsubsection}{\numberline {3.15.7.13}Help}{97} +\contentsline {subsubsection}{\numberline {3.15.7.14}Here}{98} +\contentsline {subsubsection}{\numberline {3.15.7.15}Quit}{98} +\contentsline {subsubsection}{\numberline {3.15.7.16}Set}{98} +\contentsline {subsubsection}{\numberline {3.15.7.17}Show}{98} +\contentsline {subsubsection}{\numberline {3.15.7.18}Skipto}{98} +\contentsline {subsubsection}{\numberline {3.15.7.19}Status}{99} +\contentsline {subsubsection}{\numberline {3.15.7.20}Tolerate}{100} +\contentsline {subsubsection}{\numberline {3.15.7.21}Trace}{100} +\contentsline {subsubsection}{\numberline {3.15.7.22}Write}{100} +\contentsline {subsubsection}{\numberline {3.15.7.23}Writeu}{100} +\contentsline {section}{\numberline {3.16}Concluding Remarks}{100} +\contentsline {chapter}{\numberline {4}FunnelWeb Installation}{101} +\contentsline {section}{\numberline {4.1}Obtaining a Copy of FunnelWeb}{101} +\contentsline {section}{\numberline {4.2}Establishing The Directory Tree}{102} +\contentsline {subsection}{\numberline {4.2.1}Admin Directory}{102} +\contentsline {subsection}{\numberline {4.2.2}Answers Directory}{102} +\contentsline {subsection}{\numberline {4.2.3}Hackman Directory}{103} +\contentsline {subsection}{\numberline {4.2.4}Results Directory}{103} +\contentsline {subsection}{\numberline {4.2.5}Scripts Directory}{103} +\contentsline {subsection}{\numberline {4.2.6}Sources Directory}{103} +\contentsline {subsection}{\numberline {4.2.7}Tests Directory}{104} +\contentsline {subsection}{\numberline {4.2.8}Userman Directory}{105} +\contentsline {section}{\numberline {4.3}Compiling FunnelWeb}{105} +\contentsline {section}{\numberline {4.4}Testing FunnelWeb}{105} +\contentsline {section}{\numberline {4.5}Installing FunnelWeb}{106} +\contentsline {section}{\numberline {4.6}Printing Manuals}{107} +\contentsline {section}{\numberline {4.7}Installation Problems?}{107} +\contentsline {chapter}{\numberline {5}FunnelWeb Administration}{109} +\contentsline {section}{\numberline {5.1}Introduction}{109} +\contentsline {section}{\numberline {5.2}The User's Commitment To FunnelWeb}{109} +\contentsline {section}{\numberline {5.3}Documentation}{110} +\contentsline {section}{\numberline {5.4}Registration}{110} +\contentsline {section}{\numberline {5.5}Support}{110} +\contentsline {section}{\numberline {5.6}Copyright}{112} +\contentsline {section}{\numberline {5.7}Nowarranty}{112} +\contentsline {section}{\numberline {5.8}Distribution}{113} +\contentsline {section}{\numberline {5.9}Modification}{113} +\contentsline {section}{\numberline {5.10}Versions}{114} +\contentsline {section}{\numberline {5.11}FTP Archive and Author}{114} +\contentsline {chapter}{\numberline {A}Glossary}{115} +\contentsline {chapter}{\numberline {B}References}{117} +\contentsline {chapter}{Index}{117} |