From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- web/funnelAC/hackman/h_ch0.tex | 180 ++ web/funnelAC/hackman/h_ch1.tex | 1107 ++++++++ web/funnelAC/hackman/h_ch2.tex | 443 ++++ web/funnelAC/hackman/h_ch3.tex | 549 ++++ web/funnelAC/hackman/h_ch4.tex | 401 +++ web/funnelAC/hackman/h_cha.tex | 441 ++++ web/funnelAC/hackman/h_manual.aux | 80 + web/funnelAC/hackman/h_manual.dvi | Bin 0 -> 181544 bytes web/funnelAC/hackman/h_manual.idx | 326 +++ web/funnelAC/hackman/h_manual.log | 213 ++ web/funnelAC/hackman/h_manual.ps | 5210 +++++++++++++++++++++++++++++++++++++ web/funnelAC/hackman/h_manual.sin | 326 +++ web/funnelAC/hackman/h_manual.tex | 283 ++ web/funnelAC/hackman/h_manual.toc | 62 + 14 files changed, 9621 insertions(+) create mode 100644 web/funnelAC/hackman/h_ch0.tex create mode 100644 web/funnelAC/hackman/h_ch1.tex create mode 100644 web/funnelAC/hackman/h_ch2.tex create mode 100644 web/funnelAC/hackman/h_ch3.tex create mode 100644 web/funnelAC/hackman/h_ch4.tex create mode 100644 web/funnelAC/hackman/h_cha.tex create mode 100644 web/funnelAC/hackman/h_manual.aux create mode 100644 web/funnelAC/hackman/h_manual.dvi create mode 100644 web/funnelAC/hackman/h_manual.idx create mode 100644 web/funnelAC/hackman/h_manual.log create mode 100644 web/funnelAC/hackman/h_manual.ps create mode 100644 web/funnelAC/hackman/h_manual.sin create mode 100644 web/funnelAC/hackman/h_manual.tex create mode 100644 web/funnelAC/hackman/h_manual.toc (limited to 'web/funnelAC/hackman') diff --git a/web/funnelAC/hackman/h_ch0.tex b/web/funnelAC/hackman/h_ch0.tex new file mode 100644 index 0000000000..597479506e --- /dev/null +++ b/web/funnelAC/hackman/h_ch0.tex @@ -0,0 +1,180 @@ +%==============================================================================% +% Start of Ch0.tex % +%==============================================================================% +% +% Copyright +% --------- +% Copyright (C) 1992 Ross N. Williams. +% This file contains a chapter of the FunnelWeb Hacker'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} + +This manual is for hackers! Anyone who wants to +bash, +diddle, +frob, +grind, +mangle, +patch, +poke, +toggle, +twiddle, +zap, +or generally hack FunnelWeb should at least take a look at this manual. + +This document has been created to serve two purposes: + +\begin{enumerate} + +\item To act as a repository for specific design and implementation +information not appropriate to be included in program comments. + +\item To guide those interested in modifying the program. + +\end{enumerate} + +As a result, this document has grown in fits and starts. +This manual is not a particularly polished or well-balanced document +but it should be of assistance to those (including myself) involved with +modifying FunnelWeb. + +\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. + +\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{}\x{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. + +% I think I've got rid of all the fix-it-up footnotes. +%\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/hackman/h_ch1.tex b/web/funnelAC/hackman/h_ch1.tex new file mode 100644 index 0000000000..75b59696f8 --- /dev/null +++ b/web/funnelAC/hackman/h_ch1.tex @@ -0,0 +1,1107 @@ +%==============================================================================% +% Start of Ch1.tex % +%==============================================================================% +% +% Copyright +% --------- +% Copyright (C) 1992 Ross N. Williams. +% This file contains a chapter of the FunnelWeb Hacker's Manual. +% See the main TeX file for this manual for further information. +% +%==============================================================================% + +\chapter{FunnelWeb Design} +\label{chapdesign}\xx{FunnelWeb}{design} + +This chapter contains notes on the design of FunnelWeb. These notes were +not created \dq{from scratch}, as the original +version of FunnelWeb (\newterm{FunnelWeb V1}) was designed +and constructed in a hurry late in 1986, and no design notes were ever +recorded. +These notes are in fact the result of a complete review of the +FunnelWeb design that took place in late 1991 as part +of the process of upgrading it for public release. + +Throughout the design process I tried to stick to the principles of +simplicity and clarity. As a rule, it was considered more important +that a feature be simple and not allow the user to outsmart himself than it +was for the feature to be particularly crisp. For example, the FunnelWeb +macro calling syntax is not as crisp as the C syntax, but is +more visible. + +To some extent the design review was influenced by the requirements of +backward compatibility.\xx{backwards}{compatibility} +During the review it was hard not to think about +all the source files in FunnelWeb~V1 format that I have written over the +years that would have to be +converted were I to significantly deviate from the old input language. +Luckily it turned out that there was little clash between these +interests, and the resulting design is both clean and does not require +much conversion of old source files. +The main revision is in the document structuring facility. +FunnelWeb~V1 had just two levels of heading indicated by \p{@*@*} +(for major headings) and +\p{@*} (for minor headings). This scheme (which was copied from Knuth's +Web) has been replaced by a hierarchical scheme of five heading levels +levels (\p{@A}$\ldots$\p{@E}). + +This chapter is rather unstructured, acting as it has, mainly as a +dumping ground for random ideas about FunnelWeb. + +\section{Motivation for FunnelWeb} +\xx{FunnelWeb}{motivation} + +During 1986, I was exposed to Donald Knuth's\xn{Donald}{Knuth} +\p{WEB} literate +programming system in the +form of Jon Bentley's\xn{Jon}{Bentley} +\i{Programming Pearls}\x{programming pearls} +column in \i{Communications\x{Communications of the ACM} of +the ACM}\/\paper{Bentley86}.\footnote{As it happens, this was somewhat of a +lucky encounter. I had only just joined the ACM and +the May 1986 issue of CACM in which the column appeared was the first +issue I received.} This prompted me to obtain a copy of the +report on the Web system\paper{Knuth83} +and to try out the program which had been installed on the local Vaxen. + +Web was the best system that I had seen for producing printed and +online, inline documentation. To me +the most extraordinary aspect of the system was +its success despite the fact that it had been built into the horribly antiquated +file/batch processing systems that we all know and love (and use). I had +imagined sophisticated documentation systems before this time, but had always +assumed that they would be parts of complex programming environments. +Knuth showed that, to some extent, it can be done using 1960s +software technology (excluding the 1980s typesetting technology). +This was exciting. + +The Web system was enticing and promising but to me suffered from many +drawbacks, many of which Knuth had promoted as advantages. The following highly +subjective list of disadvantages formed a springboard for the construction of +FunnelWeb. + +\begin{itemize} + +\item Web can only process Pascal\x{Pascal} programs. + +\item Web can produce only one output file. In many instances it is +desirable to generate more than one output file. For example, when programming +in Ada, it is desirable to write a package specification and a package body +together in the same file.\xx{number}{output files} + +\item Web enforces Knuth's individual style of indentation. Web supplies +commands to over-ride the automatic indentation but it is an uphill battle and +the code becomes clogged up with format directives.\x{indentation} + +\item Web does not cater for non-standard Pascal programs. In particular, all +identifiers are truncated to about eight characters. + +\item Web formats the program output file into a form that is unreadable to +humans. + +\item Web does not provide an include facility. +This was considered a feature essential for supporting macro libraries. + +\item Web provides macros with at most one parameter. Knuth +describes a hack that can +extract a multiple parameter macro facility from a single parameter one, +but it is hardly satisfactory. + +\item Web does not provide conditionals. + +\end{itemize} + +Most of these objections boiled down to two points: +that Web is far too +specialized, and that Knuth's \dq{Occam's Razor}\x{Occam's razor} +had cut too far. +What I wanted was +a documentation system that employed all the same principles as Web +but was far +more general. The result was FunnelWeb~V1, which can +process programs in any +language or any combination of languages at the cost of typesetting the text in +\p{tt font}. + +Originally, it was intended that FunnelWeb would be typesetter independent as +well as language independent. It was intended that a format file consisting of a +set of productions describing how the document file was to be formatted would be +handed to FunnelWeb along with the input file. In the end, time pressures forced +me to take the back door and hack up a \TeX{} document file generator. This +compromise has found its way into FunnelWeb~V3.0 which is still reliant +on \TeX{}, although V3.0 at least encourages input files to be typesetter +independent. It is hoped that future versions of FunnelWeb will include +more sophisticated typesetting facilities. + +\section{Indentation} +\x{indentation}\xx{indentation}{no}% +\xx{indentation}{blank}\xx{indentation}{text} + +A macro call that does not appear at the left margin is called an +\newterm{indented macro call} and seems to lead to three different +alternatives for its expansion: \newterm{no indentation}, \newterm{blank +indentation}, and \newterm{text indentation}. Here are examples of each kind +of indentation. First the example problem. + +\begin{verbatim} +@$@==@{@- +Aardvark +Walrus@} + +@O@==@{@- +Zebra@ +Giraffe +@} +\end{verbatim} + +There are three ways that the second line of the \p{Sloth} macro +can be indented. + +\thing{No indentation:} +\begin{verbatim} + ZebraAardvark + Walrus + Giraffe +\end{verbatim} + +\thing{Blank indentation:} +\begin{verbatim} + ZebraAardvark + Walrus + Giraffe +\end{verbatim} + +\thing{Text indentation:} +\begin{verbatim} + ZebraAardvark + ZebraWalrus + Giraffe +\end{verbatim} + +No indentation is useful where the user wishes to deal with the output +stream as a pure output stream. Blank indentation is useful when the user +wishes to generate indented computer programs. +Text indentation is useful where the user wishes to prefix each line of an +entire macro invocation with a string. This can be useful for +commenting out code (\eg{}in Ada using \p{--}), and for prepending things +like a dollar sign at the start of each line an a VAX VMS DCL script +command file.\x{DCL} + +FunnelWeb~V1 provided a choice of no indentation or blank indentation. +The choice was made in the command line and could not be overridden. + +The design questions are as follows: + +\begin{enumerate} +\item Which of the three kinds of indentation should FunnelWeb support? +\item What should be the granularity of swapping between indentation modes? +\item Are particular indentation modes dangerous? +\item Is the presence of particular combinations of indentation modes + confusing to the user? +\item How and when should the choice of indentation be specified? +\end{enumerate} + +All sorts of schemes were considered, including a finely grained system in +which the user could specify at the point of call which indentation mode +should be used for the called macro expansion. + +After a lot of thought, the dominant factor that should affect the design +was decided to be the \i{clarity} in the user's mind of the indentation facility +and the \i{danger} associated with misunderstanding it. Here are two +examples that show how easily a confusion or +misunderstanding of the indenting being used can cause danger. +The first example shows how blank or no indentation might be +misused. + +\begin{verbatim} +--Misuse of blank (and no) indentation. +--@ +\end{verbatim} + +Here the user has assumed that text indentation is in action and has +placed an Ada comment symbol \dqp{--} before the invocation of the macro +\p{@} in the hope that the entire text of the macro would be prefixed by +\dqp{--}. The result could be passed by the compiler which would activate all +but the first statement in the expansion of macro \p{@}. + +The next example demonstrates how text indentation could be +misused.\xx{indentation}{dangers} + +\begin{verbatim} +--Misuse of text indentation: +a++; @ +\end{verbatim} + +Here the user has placed the call to \p{@} after the incrementing of +variable +\p{a}. The result is that there is a good chance that the \dqp{a++;} +prepended to +each line of the expansion of \p{@} will be passed by the compiler and +will cause \p{a} to be overincremented. + +These examples are not to be laughed at. It is possible that FunnelWeb will +be used widely, and the problems above may cause problems in critical systems. +The examples above are particularly scary because they are reflexive. One cannot +simply pin the blame on one particular indentation form. A little thought +reveals that the greatest danger lies in \i{confusion} in the user's mind. +If the +user is confused between text or blank indenting, problems will arise. + +There seem to be two ways to solve the problem. The first is to ban all +macro calls that are preceded by non-blank text. This is not a good option +because there are so many cases where it is desirable to expand more than one +single line macros on the same line. A second option is to eliminate one of +the two forms so as to reduce the potential for ambiguity in the user's +mind. I choose the latter option. Of the two forms, the clear choice for +elimination is text indenting for the following reasons: + +\begin{enumerate} +\item It actually introduces extra text which gives it an a priori + potential for problems. +\item It is harder to implement and would slow down Tangle. +\item It would not be compatible with FunnelWeb~V1 which uses blank + indentation. +\end{enumerate} + +The only other decision is the level of granularity of choice between the +remaining options: no indentation and blank indentation. FunnelWeb~V1 +allowed this choice to be made in the command line. In retrospect, this +was bad design because the user might unwittingly code certain macro calls +relying on one or the other mode. A better system is to allow the user +to specify which mode in the input file itself. This has been done in +FunnelWeb~V3. + +Again, to avoid confusion, it seems sensible to allow the user only +one indentation mode per FunnelWeb input file. In most cases, the user +will be happy with blank indentation (the default) and there will be +no need for change anyway. + +\thing{Decision:} Implement only \dq{no indentation} and \dq{blank indentation}. +Make the +choice of indentation a static attribute of a particular FunnelWeb run +that is specified in the input file. This solution is the same as FunnelWeb~V1 +except that the choice has been moved from the command line to the +input file. + +\section{Review of FunnelWeb Syntax} +\xx{FunnelWeb}{syntax} + +One of the distressing aspects of FunnelWeb~V1 was its clumsy macro +definition and calling syntax. +Compared to (say) the C preprocessor, FunnelWeb's macro call syntax is +like a freight train in a china show. +During the FunnelWeb redesign, a complete review of this syntax took place to +try to neaten it up. Surprisingly, the V1 syntax survived unscathed +with the exception that \dqp{==}\x{==} in macro definitions was made optional. +The survival of this clumsy syntax was a product of the design goal of +making everything simple, explicit, and not subject to subtle errors. + +\subsection{Review of Macro Definition Syntax} +\xx{macro definition}{syntax} + +FunnelWeb~V1 used a macro definition syntax that resulted in macro +definitions such as the following. + +\begin{verbatim} +@$@==@{@- +Open the door +Say out +Close the door@} +\end{verbatim} + +This is messy, but I couldn't think of anything better at the time. +The \p{@\$} is necessary to cue a definition. Without it, the definition +might somehow be mistaken for an invocation. +The \p{@<} and \p{@>} delimit the name. +The \p{@$\{$} and \p{@$\}$} delimit the text. +The \p{@-} is a product of the rule +\dq{exactly the text between the \p{@$\{$} and \p{@$\}$}}. + +The only real target is the \dqp{+=} and \dqp{==} which really break all +the rules +and should be changed. Unfortunately I couldn't +think of anything to change them +to. If there was no \p{+=} mechanism, we could use: + +\begin{verbatim} +@$@@{ +Open the door +Say out +Close the door@} +\end{verbatim} + +In fact, eliminating \p{+=} is thinkable because it does not appear in +many of my existing FunnelWeb source files. This indicates at least that +it was not needed much by myself. + +A minimalist construct could be + +\begin{verbatim} +@ +Open the door +Say out +Close the door@} +\end{verbatim} + +but this is too dangerous for my tastes. + +\thing{Decision:} For compatibility reasons, +retain the old \p{+=} and \p{==} constructs, but make them optional. +The new syntax for defining macros is: + +\begin{verbatim} +@$@@{ +Open the door +Say out +Close the door@} +\end{verbatim} + +Next we turn to parameterized macro +definitions.\xx{parameterized macro definitions}{syntax} +A conventional FunnelWeb parameterized macro definition looks like this: + +\begin{verbatim} +@$@@(@3@)==@{@- +Open the door +Say out +Close the door@} +\end{verbatim} + +which is a bit messy. The natural alternative is even worse: + +\begin{verbatim} +@$@@(@1@,@2@,@3@)==@{@- +Open the door +Say out +Close the door@} +\end{verbatim} + +Thus, just specifying the number of parameters seems sensible. However, +perhaps the syntax could be trimmed to + +\begin{verbatim} +@$@@3==@{@- +Open the door +Say out +Close the door@} +\end{verbatim} + +I decided to reject this in favour of the old syntax. + +\thing{Decision:} Retain the old syntax of $\ldots$\p{@(@3@)}$\ldots$ + +\subsection{Review of Macro Call Syntax} +\xx{macro call}{syntax} + +Here are some ideas for alternatives to the FunnelWeb~V1 macro call syntax. + +\begin{verbatim} +Open the door +@ @! FunnelWeb~V1 style. +Close the door + +Open the door +@@ +Close the door + +Open the door +@"Say out@" +Close the door + +Open the door +@(Say out@) +Close the door + +Open the door +@ +Close the door +\end{verbatim} + +\thing{Decision:} Continue with the old notation. It may not be neat, but at +least it is clear and consistent. The main temptation is the format +\p{@@} +which looks rather good. However, it breaks the special sequence +rational and hence is too confusing. + +\subsection{Review of Parameterized Macro Call Syntax} +\xx{parameterized macro call}{syntax} + +FunnelWeb~V1 provided a messy parameterized macro call syntax: + +\begin{verbatim} +@@(@"firstparam@" @, @"Secondparam@" @, @"thirdparam@" @) +\end{verbatim} + +This syntax can be cleaned up considerably by making the \p{@"} symbols +optional. This results in calls such as the following: + +\begin{verbatim} +@@(firstparam@,Secondparam@,thirdparam@) +\end{verbatim} + +As the first form allows the alignment of complicated parameters by +allowing white space to be inserted outside the \p{@"}, and the second +form is cleaner, both are retained simply by making the quotes optional. + +\thing{Decision:} Make the double quotes optional. + +\section{Document Structuring} +\xx{document}{structure}\x{headings}\x{sections} + +Experience with FunnelWeb~V1, which provided only two levels of +headings (major and minor) +proved that there was a strong need for fully hierarchical +multiple-level headings. +The only question was how it should be done. + +Here are some ideas that were considered. + +\begin{verbatim} +@*@
+@**@ +@***@ + +@*@
+@*@*@ +@*@*@*@ + +@s@
+@ss@ +@sss@ + +@s@
+@s@s@ +@s@s@s@ + +@S@
+@SS@ +@SSS@ + +@S@
+@S@S@ +@S@S@S@ + +@A@
-- The syntax finally chosen. +@B@ +@C@ + +@A Main Program +@B Read the Message +@C Encrypt the Buffer + +@*A Main Program +@*B Read the Message +@*C Encrypt the Buffer + +@1@
+@2@ +@3@ +(using @A..@I@ as macro parameters or overload @1..@9) + +@*@1@
+@*@2@ +@*@3@ +(using @A..@I@ as macro parameters or overload @1..@9) +\end{verbatim} + +Choosing between these alternatives was not easy. The following thoughts +contributed to the decision. + +\begin{itemize} + +\item Syntaxes that require visual counting are probably not a good idea. + +\item Syntaxes that do not delimit the heading name somehow are likely +to cause problems where heading names are omitted. Users will be +tempted to start paragraphs after the start of heading symbol and the +result is that the first line of the paragraph will be sucked into the +heading. + +\item Overloading the \p{@1}, $\ldots$, \p{@9} sequences is undesirable. + + +\end{itemize} + +\thing{Decision:} Use \p{@A}$\ldots$\p{@E} with optional following +macro name syntax for the section name. +Note: We stop at \p{@E} because five levels is probably sufficient, and we +may wish later to use \p{@F} for \b{F}ile (to augment or replace \p{@O}). + + +\section{Discussion of Some Miscellaneous Issues} +\xx{miscellaneous}{issues} + +\thing{Comment duplication:} If\xx{comment}{duplication} +the FunnelWeb user inserts +comments into the target code (in the \p{.fw} file) as well as into the +documentation (free text) +part of the \p{.fw} file, then it is possible for the +situation to get a bit silly. \b{Decision:} This is a problem for the +programmer, not for FunnelWeb. + +\thing{Out-of-date documentation:} Sometimes\xx{out of date}{documentation} +it is all too easy for the +programmer to modify the code without updating the surrounding documentation. +\b{Decision:} This is a serious and major problem. In an automated environment, +it may be possible to create a system of dependencies between scraps of +code and scraps of documentation. However, it is hard to see how a tool +such as FunnelWeb could provide support for prevention of this sort of error. + +\thing{Meta-macro-level parameterization:} Sometimes, when using FunnelWeb, +the facility to use one macro to construct the name of another has been +needed. \b{Decision:} Allowing macro names +to be constructed would lose the simple +nature of the preprocessor and so this suggestion is rejected. + +\thing{Clumsy notation:} The \p{@} notation can be clumsy. +\b{Decision:} This is necessary to maintain the simplicity of the translation. + +\section{Automated Regression Testing} +\xx{regression}{testing} + +Automated regression testing is extremely important for two reasons: + +\begin{enumerate} + +\item It provides confidence that changes made to the program have +not introduced bugs. + +\item It allows portability problems to be pinpointed when the program is +moved to a new machine. + +\end{enumerate} + +The simplest way to set up automated regression testing is to construct +a suite of test cases (and their solutions) and then write a +script in the target machine's command language to run through the suite. +Unfortunately, there is no command language that is shared among the +machines to which FunnelWeb must be ported. These machines are at least: +Macintosh, IBM-PC, Sun, VMS Vax. + +One option is simply to rewrite the script in each machine's particular +command language. This would be a feasible option were it not for the fact +that the Macintosh (the machine upon which FunnelWeb was developed) does +not have a command language! + +After some thought, I decided that the best solution to the problem was +to create a command language \i{within FunnelWeb}. FunnelWeb could then +be invoked in two modes, one-shot command line or interactive/script. This +approach had the benefit of providing total control over the command +language and its complete portability. + +The result is described in the \i{FunnelWeb User's Manual}. + +\section{Command Line Interface} +\xx{command line}{interface} + +FunnelWeb~V1 was implemented in Ada\x{Ada} and runs on a VMS VAX.\xx{vms}{vax} +As such it +has a full VMS DCL command line interface. Here is the \dqp{.CLD} +file\xx{.cld}{file} for the +DCL command line interface. + +\beginsmall +\begin{verbatim} +! FUNNELWEB Command Definition +! ============================ +! Ross Williams. 28 April 1987. + +module command_table + define verb dummy_command + parameter p1 , label=input_file ,value(required,type=$file) + qualifier include_files, label=include_files,value(type=$file) ,default + qualifier output_files , label=output_files ,value(type=$file) ,default + qualifier delete , label=delete ,default + qualifier tex_file , label=tex_file ,value(type=$file) ,default + qualifier listing_file , label=listing_file ,value(type=$file) ,default + qualifier brief , label=brief,value(type=$number,default=5),default + qualifier screen , label=screen ,value(type=$number,default=0) + qualifier trace , label=trace + qualifier file_spec , label=file_spec + qualifier compare +\end{verbatim} +\endsmall + +As portability was a key goal of FunnelWeb~V3, it was obvious that the +command line interface would have to be redesigned. The design goals for the +new command line interface were:\xx{design goals}{command line interface} + +\begin{enumerate} + +\item The interface should not \i{depend} on case. However, it must allow + case-sensitive filenames to be transmitted on systems that have + case-sensitive filenames. + +\item Each option must have a symmetric positive and negative form. For + example, it is confusing for \p{-X} to turn on a feature and \p{-Q} + to turn it off. + +\item The interface must be extensible to allow inclusion of more features + at a later date. + +\item Options should be consistent and memorable. + +\end{enumerate} + +The result is described in the \i{FunnelWeb User's Manual}. + +\section{File Name Management} +\xx{file}{names} + +File names present a host of problems for a program like FunnelWeb. +First, FunnelWeb can generate so many different kinds of files that +conventions must be adopted to prevent them from becoming unmanageable. +Second, the constraints on file names, and even the structure of file +names themselves varies considerably from machine to machine. These two +problems have combined to result in the sophisticated and +rather complicated way in which FunnelWeb~V3 handles filenames. + +To summarize, the three problems are: + +\begin{enumerate} +\item What filename extensions should be chosen for various kinds of file? +\item What filename inheritance should take place? +\item How should FunnelWeb cope with the variations in filename structure +between machines? +\end{enumerate} + +The following three sections address these questions. + +\subsection{Filename Extensions} +\xx{filename}{extensions} + +FunnelWeb is capable of reading and writing a variety of different kinds +of files. In particular, FunnelWeb must often operates in an environment where +the same information is stored in many forms (\eg{}prog.fw, prog.c, proc.exe). +File extensions are an essential tool in managing this situation. +The filename extensions chosen for FunnelWeb are: + +\begin{verbatim} +FunnelWeb : .fw +Product : None. +Documentation : .tex +Listing : .lis +Journal : .jrn +\end{verbatim} + +Lowercase will be used in systems that are case sensitive. + +Readers who are wondering how FunnelWeb copes in environments such as UNIX +where there are no file extensions should refer to +Section~\ref{portablefilenames}. + +\subsection{Filename Inheritance} +\xx{filename}{inheritance} + +Inheritance in filenames refers to how input and output files inherit parts +of their name from other filenames and their environment. For example if +the command + +\begin{verbatim} + fw sloth +J +L +T +\end{verbatim} + +was issued, +you would expect to see output files \p{sloth.jrn}, \p{sloth.lis}, and +\p{sloth.tex}. +The output file names have inherited the \dqp{sloth}. The following table +gives the hierarchy devised for FunnelWeb. + +\begin{center} +\begin{tabular}{|l|l|l|l|l|l|l|l|} \hline + & Script & Input & Include & Journal & List & Document & Product \\ \hline +1 & & & \p{@i} & & & & \p{@o} \\ +2 & \p{+x} & \p{+f} & \p{+i} & \p{+j} & \p{+l} & \p{+t} & \p{+o} \\ +3 & \dqp{.fws} & \dqp{.fw} & \dqp{.fwi} & \dqp{.jrn} & \dqp{.lis} & \dqp{.tex} & \\ +4 & & & \p{+f} & \p{+f} & \p{+f} & \p{+f} & \\ +5 & DefDir & Defdir & Defdir & Defdir & Defdir & Defdir & Defdir \\ \hline +\end{tabular} +\end{center} + +The following notes explain the table. + +\begin{enumerate} + +\item This scheme is similar to that used in FunnelWeb~V1. + +\item The journal, list, and documentation +files all fall in the same pattern and +can be considered as a single case. + +\item Level~1 has the highest priority because it is a direct specification +by the user in the input file. + +\item Level~2 comes next because this is also a direct specification +from the user on the command line. + +\item Level~3 provides the default file extensions. +Product files do not inherit an +extension as they could be of any type. + +\item Level~5 is built into most operating systems' file specification systems. +If I specify file \dqp{x.y}, it is taken to mean on the default disk in the +default directory. + +\item Level~4 looks straightforward, but secretly conceals a difficult design +decision. By the time we get down to this level of inheritance, we know for +sure that the filename has already picked up a file extension. So all that +is left to inherit is the path and the filename proper. Obviously we +have to inherit the filename proper (e.g. \p{sloth} in \p{sloth.tex}), but +should we inherit the input file path? If we do inherit the input file +path, files will be placed in the same directory as the input file. If we +don't inherit the input file path, files will be placed in the current +directory. The choice I have made is to send all the logging type files +into the same directory as the input file. This means, for example, +that \p{sloth.lis} and \p{sloth.tex} will generally land in the same directory +as \p{sloth.fw}. However, I have decided that output files should be sent to +the default directory (if not earlier specified) as this is where the +action is. In normal use, the main product of FunnelWeb will be product files +and so the user will expect them to appear in the current directory by +default. + +\end{enumerate} + +\subsection{Portable Structure of File Names} +\label{portablefilenames}\xx{file}{names}\xx{portable}{filenames} + +Another problem with file names is the variation of their structure +between environments. Here are examples of some of the formats that prevail: + +\begin{verbatim} + UNIX /device/dir1/dir2/name + VMS node::device:[dir1.dir2]name.ext;vn + MSDOS device:\dir1\dir2\name.ext + MAC device:dir1:dir2:name +\end{verbatim} + +Isn't it amazing that none of these popular systems use the same format? + +The solution to dealing with these different formats is to classify them +as non-portable and hide the functions that manipulate them +in the machine-specific module of FunnelWeb. +Luckily there are not many such functions. + +The main problem is coping with +file systems that do not +explicitly support file extensions. +With so many possible input and output files, FunnelWeb all but +needs such extensions. Machines that do not support them pose difficult +design decisions. +If the user specifies \dqp{sloth} as an input file on such +a non-extension-supporting system, +should FunnelWeb look for \p{sloth} +or \p{sloth.fw}? If the user specifies \p{walrus} as a listing file, should +it generate \p{walrus} or \p{walrus.lis}? + +Some possible solutions are: + +\begin{enumerate} + +\item Regard the filename \p{sloth} as having an empty extension. It will then +default to \p{sloth.fw}. + +\item Regard the filename \p{sloth} as having a blank but full extension. +That is, it cannot be overwritten by inheritance, but it remains blank. + +\item Provide an extra syntactic mechanism to allow the user to specify one or +other of the two options above. + +\end{enumerate} + +My solution was to choose the first option. Use of FunnelWeb +results in lots of files lying around (\eg{}\p{sloth.lis}) and it is hard +to see how +the user will cope with them all +without some kind of naming discipline. If a naming discipline +has to be used, it might as well be the FunnelWeb one. + +Thus the names of all files read and written by FunnelWeb will have a file +extension of from zero to three letters separated from the rest of the filename +by a \dqp{.}. + +The only exception is product files whose extension is left +undefined. Product files need not +contain a \dqp{.} and a file extension, +although they can inherit one if the user wishes. + +\section{Specifying Constraints on the Number of Instantiations} +\xx{invocations}{number} + +Experience with FunnelWeb~V1 demonstrated +the need to be able to specify in +macro definitions how many times it was expected that the macro would +be used. FunnelWeb~V1 generates an error if a macro is not used, but +permits macros to be called more than once. This caused problems for macro +libraries, which would be included, but whose macros were often not called. + +By default, FunnelWeb~V3 requires that each macro (except for the ones +attached to output files) be called exactly once. +However, it also provides +syntax that allows the user to specify that a macro be allowed +to be called zero times or many times. +This allows a macro to be specified with the following permissible ranges +of numbers of calls depending on the presence or absence of \dqp{@Z} and +\dqp{@M}: + +\begin{verbatim} + 0..1 @$@@Z==... + 1 @$@==... + 1..n @$@@M==... + 0.....n @$@@Z@M==... +\end{verbatim} + +The only two problems with this scheme are: + +\begin{enumerate} + +\item It is incompatible with +FunnelWeb~V1 files, as the default in FunnelWeb~V1 is $1 \ldots n$ +whereas the default in new FunnelWeb is $1$. This is not a big problem because +most macros in the old files were used exactly once. Only a few macros will +have to be changed. + +\item What should the syntax be? (above is a sneak preview only!) + +\end{enumerate} + +The initial proposal for syntax was to allow the user to insert zero, one, +or both of \p{@?} and \p{@M} just after the \p{@\$} of a macro definition. +However, this has the following drawbacks: + +\begin{enumerate} + +\item It uses two sequences that are desirable to reserve + (\p{@?} for conditionals and \p{@M} for macro). + +\item It stops the user from searching for the string \p{@\$@@(@5@)==@{@- +This is a short macro. +With only a line or two@} + +@$@@?@M@(@5@)==@{@- +This is a short macro. +With only a line or two@} + +@$@@(@5@)@?@M==@{@- +This is a short macro. +With only a line or two@ +\end{verbatim} + +The first form puts me off because I think that it is a good visual rule +to start all the macros with \p{@\$}. The second form puts me off because it +detaches the macro name from the parameter list, thus making it look +less like a call, which is desirable syntactic resonance. The third form +is messy but probably workable. Because we are right next to the tested +constant string (either \p{==} or \p{+=}) we could augment it further. For +example, \p{01==} could allow a macro to be called from 0 to 1 times. +The main problem with this is that we are trying to phase out \p{==} anyway! + +Nevertheless, all the logic points to after the parameter list as the best +place to locate this information. + +After some thought, it was decided that the \dqp{@?} sequence be reserved +for a possible future conditional facility, and so \p{@Z} was used +instead. + +\thing{Decision:} The position is after the parameter list. The notation +is \p{@Z} for zero, and \p{@M} for many.\x{@Z}\x{@M} + +Example of final syntax: + +\begin{verbatim} +@$@@(@5@)@Z@M+=@{@- +This is a short macro. +With only a line or two@} +\end{verbatim} + +\section{The Relationship Between Document Structure and Macro Structure} +\xx{document structure}{macro structure}% +\xx{document}{structure}\xx{macro}{structure}\note{01-Dec-1991}% +\xx{hierarchical}{structure} + +Having already decided upon a fully hierarchical document +structure, I determined to refine the details. +The issues to be addressed were as follows: + +\begin{itemize} + +\item How should the hierarchical structure connect to the macro structure? +\item How can backwards compatibility be achieved? Should it? +\item Should the macros be cross referenced by section or by definition? +\item Should nameless sections inherit macro names as headings? +\item Should we simply use \TeX{} macros to structure the document? + +\end{itemize} + +After some thought, I arrived at the following thoughts: + +\thing{Basically a \TeX{} file:} One option is simply +to treat each \p{.fw} file as a \TeX{}\x{TeX} file +laced with macros. That is, a \p{.fw} file could be +structured as a real \TeX{} file from which FunnelWeb could +extract macro definitions. This approach is feasible because +\TeX{} could be programmed to +respond to the \p{@} sequences in the same way that +FunnelWeb responds to them. Thus, there would be no need for Weave. + +I rejected this approach, first because it is too typesetter-dependent, +and second because it complicates the inclusion of any sort of +complicated post-processing in the documentation file. This would have to +be implemented in \TeX{}. + +A better approach is +to use an invented section notation (e.g. \p{@A @B @C}). This maintains +FunnelWeb's typesetter independence and can easily be +converted into \TeX{} sectioning macros by Weave. + +In the same spirit, it might be worth introducing a few \p{@} sequences for +certain general typesetting operations such as italics and program code. + +\thing{Confusion in FunnelWeb~V1 Heading Numbering:} FunnelWeb~V1 +uses two levels of section headings, but numbers all +the headings sequentially. In this, it is a little confused. Clearly +with a fully hierarchical document structure, the headings cannot be +numbered sequentially --- the numbering must reflect the structure +(\eg{}3.2.1). + +\thing{Hierarchical numbering is messy for macros:} Unfortunately, +hierarchical numbering\xx{section}{numbering} is messy +and confusing when applied to macro names. +In FunnelWeb~V1's typeset output, each macro +call has appended in square brackets the number of the section in which the +macro is defined. Use of hierarchical numbering would be somewhat messy. +For example, a macro call might look like. + +\begin{verbatim} + Write out the output[6.7.4.3] +\end{verbatim} + +Similarly, cross reference lists would be messy: + +\begin{verbatim} + This macro is used in 3.4.5, 1.2, 7.8.9, 7.4, 2.2.1.1. +\end{verbatim} + +\thing{Separate numbering for macros and headings:} One +idea is to use hierarchical numbering for the sections, but to +number the macros sequentially. This could be a little confusing in +documents without much structure, but would be very much less messy than +cross referencing using hierarchical numbering. +Also, it will be easier to find macros +indexed by a sequential number than by section, +which has a less direct relationship +with page bulk and number. By macro numbering is meant the sequential +numbering of each macro body part through the whole document. + +\thing{Input format matters more than output format:} At this point we +realize that a distinction should be made between +the \i{input format} and the \i{typeset output}. +The critical issue here is not how the +program should be formatted for printing, but rather the format of its +\p{.fw} file. The typeset output can always be changed simply by fiddling +with Weave. However, as soon as the document structuring features of FunnelWeb +are fixed, they will be used in dozens or hundreds of documents and it will +be very difficult indeed to change them. Therefore, the important thing is to +provide as sensible and expressive a \p{.fw} format as possible. + +It is therefore a separate decision as to whether we should number macros +by section or by sequence number. The important thing is to address the +format and rules for the expression of structure. + +\thing{Naming sections:} The naming +of sections requires some thought. In many cases (especially +in the case of high-level sections) the writer will provide an explicit +name for a section. In other cases, provision of such a name will merely +duplicate the name of the macro contained within the section. It therefore +makes sense to allow the user to omit the name from a section, with Weave +naming the section after the first macro definition in the section. If a +macro is unnamed and there +is no macro in the section, an error can be generated. + +All these thoughts lead to the following scheme: + +\begin{itemize} +\item Documents will be hierarchically structured using \p{@A}, \p{@B} etc. +\item Each section can be given a name delimited by \p{@<@>}. +\item Sections that do not have names inherit the name of their first macro. +\item If a section does not have a name or a macro, it is erroneous. +\item Sections will be numbered hierarchically either by FunnelWeb or by \TeX{}. +\item Macro body parts will be numbered sequentially by FunnelWeb and cross + referenced by these numbers. +\end{itemize} + +All this results in a system which: + +\begin{itemize} + +\item Provides a hierarchical document structuring capability. +\item Is typesetter independent. +\item Does not require duplication between heading and macro names. +\item Separates the heading and macro systems so that Weave can be configured + at a later date to cross reference in different ways without requiring + input files to be reworked. +\end{itemize} + +\section{Diagnostic Messages} +\xx{diagnostic}{messages} + +In FunnelWeb, all error messages commence with an indicator indicating +the severity of the error message. Here are some of the formats that +I investigated before settling on the final format: + +\begin{verbatim} +W--Error creating sloth. +E--Error opening output file. +S--I'm a teapot. +F--Can't open output file. + +W-Error creating sloth. +E-Error opening output file. +S-I'm a teapot. +F-Can't open output file. + +W:Error creating sloth. +E:Error opening output file. +S:I'm a teapot. +F:Can't open output file. + +W: Error creating sloth. -- Format chosen. +E: Error opening output file. +S: I'm a teapot. +F: Can't open output file. + +War-Error creating sloth. +Err-Error opening output file. +Sev-I'm a teapot. +Fat-Can't open output file. + +W-Old fashioned feature. + +W-Old fashioned feature. + +W--Old fashioned feature. + +W: Old fashioned feature. + +W:Old fashioned feature. +\end{verbatim} + +\section{Summary} + +This rather unstructured chapter has addressed some of the key design +decisions of FunnelWeb. In many cases, the alternatives have been +unpleasant, but I am confident that in all cases, a fully workable solution +has been found. + +%==============================================================================% +% Start of Ch1.tex % +%==============================================================================% diff --git a/web/funnelAC/hackman/h_ch2.tex b/web/funnelAC/hackman/h_ch2.tex new file mode 100644 index 0000000000..89cdf6fc86 --- /dev/null +++ b/web/funnelAC/hackman/h_ch2.tex @@ -0,0 +1,443 @@ +%==============================================================================% +% Start of Ch2.tex % +%==============================================================================% +% +% Copyright +% --------- +% Copyright (C) 1992 Ross N. Williams. +% This file contains a chapter of the FunnelWeb Hacker's Manual. +% See the main TeX file for this manual for further information. +% +%==============================================================================% + +\chapter{FunnelWeb Implementation} +\label{chapimplementation}\xx{FunnelWeb}{implementation} + +\section{Introduction} + +This chapter contains notes on the actual C code that implements +FunnelWeb~V3. This chapter is rather patchy. It has acted mainly as +a dumping ground for ideas that I bothered to write about during +development. + +\section{History of FunnelWeb Implementations} +\xx{FunnelWeb}{history}\x{FunnelWeb version 1}\x{FunnelWeb version 2}% +\x{FunnelWeb version 3} + +The first implementation of FunnelWeb (FunnelWeb~V1) was written in +Ada\x{Ada} +in December 1986. The project was initially canned as requiring too +much time, but was resurrected when I decided to commit to +Ada\paper{USDOD83} and +realized that I needed a program to write to help me to learn Ada. +FunnelWeb~V1 was, in fact, my first Ada program. It took about one +month to write. + +FunnelWeb~V1 was used intensively by myself to write Ada programs +from January~1986 to July~1989 at which time +I finished my Ph.D.\x{Ph.D.} and lost access to +the VAX. During this time at least twenty thousand lines of code were generated +using FunnelWeb. Hardly anyone but myself used +FunnelWeb.\xx{FunnelWeb}{past use} + +After losing access to Ada and the Vax (and hence to FunnelWeb), I was forced +back to programming the non-literate way. From time to time I found that I +needed to use some of my old programs that I had written using Ada and +FunnelWeb. I knew that Ada would become available on more machines, but +certainly FunnelWeb wouldn't. I recognised a strong need for a portable +version of FunnelWeb written in~C but didn't have the time or energy +to create one. + +About this time (late 1989), David Hulse,\xn{David}{Hulse} +at the time a student in +Computer Science at the University of Adelaide,\xx{University}{Adelaide} +volunteered to translate the 4000 line Ada version of FunnelWeb into~C. +To my knowledge this translation process took about three weeks +(in December 1989). The result was called FunnelWeb~V2 and was +formally signed into the public domain on 5~May 1992. + +In general, David Hulse did a good job. However, the resultant code +suffered from one or few serious defects, the most serious of which was +a lack of portability. + +Lack of portability of the C~code, combined with the need for a rather +solid design review, combined with the need to +strengthen the program to bring it up to production standard, resulted +in my performing a complete reworking of the code. The C code was +entirely, but incrementally, replaced or reformatted. +The code was also strengthened and new features were added. +This process took about two months (November and December 1991). +A further two months (approx) were spent writing documentation, constructing +a regression test suite, porting the program to different machines, +and sorting out the legal issues involved in its release. + +I would like to take this opportunity to record a debt of gratitude to +David Hulse who translated FunnelWeb from Ada to~C. Although my +reworking of his C~code obliterated most of his code, +his translation was pivotal to the development process. +Without his effort in moving from Ada to~C, I'm not sure that I +would have mustered the energy and time to complete the process and +bring FunnelWeb up to its current standard. + +\section{Why FunnelWeb Wasn't Used to Write Itself} +\xx{FunnelWeb}{writing itself} + +After Knuth created the Web literate preprocessing system, he +re-wrote it using Web and distributed the source code in Web source form. +To allow the Web source code to be tangled by users not yet having a +copy of Web, he also included the tangled Pascal code for the Tangler. + +While this approach is heroic and serves to convey a commitment and +a confidence in literate programming, it seemed to me that writing FunnelWeb +in FunnelWeb would simply be asking for trouble.\xx{trouble}{asking for} +For a start, it would be +very hard to modify any feature of FunnelWeb that had been used to write +FunnelWeb, and the thought of what would happen if the working executable +became inoperative for some reason does not bear thinking upon. + +One million billion computer programs were written in the non-literate +style before FunnelWeb was created. Why not one more? + +\section{Coding Style} +\xx{coding}{style} + +Although FunnelWeb wasn't coded under any particular coding standard, +it was coded in accordance with a fairly strict personal style of C +which developed during the development of FunnelWeb. This style was +subsequently embodied in a real C coding standard prepared for the +South\x{South Australian Government Department of Lands} +Australian Government +Department of Lands.\footnote{The standard +is currently unavailable, but is likely to be released or +published eventually.} Unfortunately, FunnelWeb was not +formally developed under the standard and so some holes remain in +FunnelWeb's coding style. This section aims to describe some of the more +important aspects of the coding style. + +\thing{Portability:} This\x{portability} +was a major goal of the FunnelWeb implementation. +Two excellent books guided this move to portability. +They were \paper{Rabinowitz90} (which deals with C code itself) +and \paper{Horton90} (which deals with the portability of various library +calls). Other works such as \paper{Kernighan88} and +\paper{ANSI} were also helpful. + +\thing{Identifiers:} \paper{Rabinowitz90}\x{identifier}{length} +specifies that for +wide portability, identifiers of block and file scope should be unique to +eight characters, and identifiers of program scope should be unique to +six characters. I have gone further in FunnelWeb and actually made these +restrictions actual limits on identifier length. + +Because names must be so short, a system of abbreviations was developed to +organize the identifiers used within FunnelWeb. Each abbreviation consists +of a letter pair. Here are \i{some} of the abbreviations +used:\xx{identifier}{abbreviations} + +\begin{verbatim} +bp - Body Part. +cm - Compare. Used to prefix comparison routines that return [-1,0,1]. +dc - Document component. +dm - Dump package. +el - Element. +eq - Equal. Used to prefix comparison routines that return a boolean. +ex - Expression. +f - Global files. +ll - List of lists. +ln - Line record. +ls - List Package. +lr - Lister package. +ma - Macro. +mc - Macro Call. +mn - Macro Name. +op - Options package. +pr - Parser. +ps - Position record. +sc - Scrap record. +sn - Section. +tb - Table package. +ty - Typesetter directive. +wf - Write file package. +wl - Write with EOL (misc.c). +wr - Write (misc.c). +\end{verbatim} + +\thing{Pointers:} Variables or types denoting +pointers\xx{pointers}{naming} start with \dqp{p\_}. + +\thing{Types:} Names denoting types end in \dqp{\_t}. +Thus, a type for a pointer to a table would be named +\p{p\_tb\_t}.\xx{types}{naming} + +\thing{File names:} All files\xx{filenames}{length} +used in FunnelWeb have file names that are +from one to eight characters long and file extensions that are from one to +three characters long. This ensures that the files can be portably moved +to all kinds of machines, even MSDOS!\x{MSDOS} + +\section{Use of Memory} +\xx{use of}{memory} + +FunnelWeb is not a memory-stressed program. However, during its development, +problems with the management of memory seemed to crop up again and again. +This section documents some of these problems and the solutions adopted. + +There are three places where memory can be obtained: the heap, the stack, +and from static variables. The following three sections deal with each +of these areas. + +\section{The Heap} +\xx{heap}{memory} + +One of the great frustrations of being a user is to find that a computer +program is complaining about lack of memory when one knows full well that +one has allocated at least ten times as much memory to the program as it +would ever need to do its job. The reason for such error messages usually +has to do with the programmer setting a fixed \dq{reasonable} limit to +a particular data structure and then locking it up into an array whose +bound is specified by a constant. While the use of arrays can increase the +speed of a program, it also means that the user cannot increase the capacity +of the program without obtaining the source code and recompiling it, +which is usually a daunting option. + +The alternative is to use the heap for all data structures that can +grow in proportion to the size of the user's input. This rule has been +followed rigorously in FunnelWeb. This means that as memory spaces +increase, users will be able to hand their version of FunnelWeb more +memory without having to recompile it. + +\topicbreak + +Some problems arose early on the Macintosh\x{Macintosh} +in the use of the heap. It seems +that some of the allocations I was attempting to make were failing for some +obscure reason, possibly my fault. Whatever it was, it went away when I +replaced direct calls to \p{malloc}\x{malloc} +with calls to a mini package I wrote +(called \p{memory}) that allocated large chunks of memory and then doled out +small pieces as required by the rest of the +program.\xx{memory}{package} + +Having a package to manage all the memory allocation had two other benefits. + +First, only one check was required in the entire program to see if memory +had run out (in the memory package), and if that failed, the program could +be brought to a screaming halt. This organization was far preferable to +having each piece of code that needed to allocate memory having to check +to see if \p{malloc} had failed. + +Second, the decision to construct a mini-shell within FunnelWeb to +support regression testing meant that FunnelWeb proper could be run +many times in any given invocation of FunnelWeb. As a consequence it was +necessary to make sure that there was no memory +leakage\xx{memory}{leakage} between invocations +of FunnelWeb proper. This was accomplished by reworking the memory package +to operate a watermark system. The user of the package, when requesting +memory, could request \dq{temporary} or \dq{permanent}. If permanent, the +memory package forgot that it had allocated the memory. If temporary, the +memory package places the allocated block on a list. There was then a +function in the memory package that could be called to deallocate all the +temporary memory. Thus, so long as all requests for memory within FunnelWeb +proper were for temporary memory, and that memory was freed at the end of +every run, one could be sure that there was no memory leakage. + +\section{The Stack} +\xx{stack}{memory}\xx{stack}{size} + +For a while during the development of FunnelWeb a particularly nasty bug +proved extremely hard to find. The symptom was that FunnelWeb would crash, +sometimes at random, but more often upon entering a particular function. +In the end about a day of specific debugging was required before the problem +was tracked down to a stack problem. It turned out that somehow +(either the fault of the Macintosh or the THINK~C language system), only +6K was being allocated for stack space!!!!!!! + +This experience led me immediately to go through the entire program and +eliminate (or remove to the heap) any automatic variable declarations that +used more than one hundred or so bytes. + +The lesson is clearly that C~programs that use more than a few thousand bytes of +stack space are risking their portability. All large data structures should be +placed in the heap. + +\section{Static Variables} +\xx{memory}{static}\xx{static}{variables} + +Static variables also proved a problem on the Macintosh. +It turns out that +the Macintosh\x{Macintosh} THINK~C compiler\xx{ThinkC}{compiler} +does not allow more than 32K of statics +\i{in the entire program}. For a while this restriction was +a serious threat to the program as it was discovered that constant strings +were included in this total! However, some searching revealed a compiler +option that removed the strings from the static category. + +Nevertheless, the 32K limit is rather severe. Again, it seems that for +portability reasons, C~programs that use a lot of static variables are risking +their portability. As a result, the FunnelWeb code avoids static variables +where possible in favour of the heap. + +\section{Implementing Text Indentation} +\xx{text}{indentation} + +At one point during the development of FunnelWeb, text indentation was +fully implemented. However, it was subsequently removed because it was +considered a dangerous feature. This section records the way in which +text indentation was implemented so that if the feature ever has to be put +back, this technique can be used again. + + +1. Create a new field in the \p{sc\_t} record call \p{sc\_postn}. + +\begin{verbatim} + char *sc_postn; /* Pointer in the range [sc_first,sc_last+1]. */ + /* It is the minimum possible value of sc_postn for */ + /* which EOL does not appear in *sc_postn..*sc_last. */ + /* i.e. Points to the byte following the first EOL in */ + /* the scrap or sc_first if EOL does not appear. */ +\end{verbatim} + +2. Modify the scanner so that it generates this field. +Sendtext should be modified so that +it accepts an argument for the \p{p\_postn} value. + +\begin{verbatim} +LOCAL void sendtext P_((p_ps_t,char *,char *,char *,bool)); +LOCAL void sendtext(p_tkps,p_first,p_last,p_postn,is_white) +/* Appends a text token to the end of the token list. */ +/* IN: p_ps is a pointer to a position structure giving the position of the */ +/* first character of the token. */ +/* IN: p_first and p_last point to the first and last byte of the text scrap. */ +/* IN: p_postn has the same definition as sc_postn (see fwdata.h). */ +/* IN: is_white should be set to TRUE iff scrap is entirely whitespace. */ +p_ps_t p_tkps; +char *p_first; +char *p_last; +char *p_postn; +bool is_white; +{ + tk_t token; + + /* Empty text scraps should never be generated. */ + assert(p_first<=p_last,"sendtext: Text scrap bounds are bad."); + + /* If ch=EOL then we should be scanning more text, not shipping it! */ + assert(ch!=EOL,"senttext: Shipping text while still more to scan."); + + /* Check that p_postn is in range. See definition in fwdata.h. */ + assert(p_first<=p_postn && p_postn<=p_last+1, + "sendtext: p_postn is out of range."); + + /* Debug: Check the p_postn field using a brute force check. */ + { + char *i,*j; + j=p_first; + for (i=p_first;i<=p_last;i++) + if (*i==EOL) + j=i+1; + assert(j==p_postn,"sendtext: sc_postn field is incorrect."); + } + + /* Load the text token. */ + token.tk_kind = TK_TEXT; + ASSIGN(token.tk_ps,*p_tkps); + token.tk_sc.sc_first = p_first; + token.tk_sc.sc_last = p_last; + token.tk_sc.sc_postn = p_postn; + token.tk_white = is_white; + token.tk_parno = 0; + ls_add(token_list,PV &token); +} +\end{verbatim} + +Then all the calls to sendtext have to be changed: + +\begin{verbatim} +/* @ instructs FunnelWeb to replace the special construct with the */ +/* special character. Luckily one appears just before the @ !! */ +/* Note: FALSE is OK because space is not a legal specialch. */ +/* Note: Setting parameter p_postn to p_ch-1 is OK as EOL is not a */ +/* legal specialch. */ +sendtext(&ps_spec,p_ch-1,p_ch-1,p_ch-1,FALSE); +break; + +/* + instructs FunnelWeb to insert an EOL. We can't look to the end of */ +/* the previous line to find an EOL as this might be the first line. */ +/* Running ahead to the end of the line is expensive, and having the */ +/* liner mini-package maintain a variable for it would be extra */ +/* housekeeping. Instead of all this, we just point to a static. */ +{CONST static char stateol = EOL; + sendtext(&ps_spec,&stateol,&stateol,(&stateol)+1,TRUE);} +break; + +/* If we hit something that ends a text token */ +/* then we can transmit a white text token. */ +if (ch==specialch || ch==EOFCH) + {sendtext(&ps_start,p_first,p_ch-1,MAX(p_sol,p_first),TRUE); return;} + +/* Otherwise we have some more (non-white) text to scan. */ +/* We can then send a non-white text token. */ +while (ch!=specialch && ch!=EOFCH) + NEXTCH; +sendtext(&ps_start,p_first,p_ch-1,MAX(p_sol,p_first),FALSE); +\end{verbatim} + +The dump code needs to be changed too! + +\begin{verbatim} + wf_str(p_wf,"\""); +assert(token->tk_sc.sc_first !=NULL,"dm_tkls: NULL ptr1."); +assert(token->tk_sc.sc_last !=NULL,"dm_tkls: NULL ptr2."); +for (i=token->tk_sc.sc_first; i<=token->tk_sc.sc_last; i++) + { + if (i==token->tk_sc.sc_postn) + wf_str(p_wf,""); + if (*i=='\n') + wf_wl(p_wf,""); + else + dm_byte(p_wf,*((ubyte_ *) i)); + } +if (i==token->tk_sc.sc_postn) + wf_str(p_wf,""); +wf_str(p_wf,"\""); +} +\end{verbatim} + +3. Over in the Tangle module, create a massive array of pointers to scraps +to be used as a stack. Maintain pointers into the stack called \p{current} and +\i{base} (similar to the blank indentation variables). Implement the following: + +\begin{itemize} + +\item To write out a scrap, scan it byte by byte. Output each byte. When +you hit an EOL, pop the stack back to \p{base}. Then write out an EOL +followed by the stack contents but writing each scrap only from \p{postn} to +end end of each scrap. +When you have finished the new scrap, push it on the stack. + +\item When you hit a new macro to expand, save \p{base}. Restore it later. + +\end{itemize} + +The \p{postn} field solves the big problem of +how to cope with something like this: + +\begin{verbatim} +The rain in Spain +falls mainly @ +\end{verbatim} + +The trouble is that we want to text indent the lines in +\p{@} with +just \dqp{falls mainly~}. However, this string is only part of a scrap. The +solution is to get the scanner to record, in the \p{postn} field of each scrap, +the position of the first byte with a EOL-free run to the end of the scrap. + +This scheme is very efficient because all we are doing is pushing and popping +pointers to scraps on a stack array. The main disadvantage is that the +array must necessarily be finite and would impose a limit on the depth +of indentation nesting (not a big problem). + +%==============================================================================% +% Start of Ch2.tex % +%==============================================================================% diff --git a/web/funnelAC/hackman/h_ch3.tex b/web/funnelAC/hackman/h_ch3.tex new file mode 100644 index 0000000000..5d4a5dd226 --- /dev/null +++ b/web/funnelAC/hackman/h_ch3.tex @@ -0,0 +1,549 @@ +%==============================================================================% +% Start of Ch3.tex % +%==============================================================================% +% +% Copyright +% --------- +% Copyright (C) 1992 Ross N. Williams. +% This file contains a chapter of the FunnelWeb Hacker's Manual. +% See the main TeX file for this manual for further information. +% +%==============================================================================% + +\chapter{FunnelWeb Modification} +\label{chapmod}\xx{FunnelWeb}{modification} + +\section{Introduction} + +This chapter deals with modifications to FunnelWeb. Although the +GNU license\xx{GNU}{license} +under which FunnelWeb is distributed allows anyone to +modify FunnelWeb and distribute the modified versions, there are a number of +dangers in doing this. This chapter explains the dangers and presents +some issues that you should think about if you intend to +distribute modified versions of FunnelWeb. + +\section{The Danger of Modifying Languages} +\xx{changes}{dangers}\xx{languages}{dangers} + +Whenever someone modifies a computer program they should always ask +themselves \dq{what is the impact of these changes going to be on +users}. For mature products, the degree of impact is largely determined +by the investment that users have made in particular file formats +supported by the product. + +At the two extremes, there are the video game\x{video game} and the +compiler.\x{compiler} +If one changes a video game, the change affects only the future games +played. However, if one changes a compiler in particular ways, +it is likely that thousands of users will be forced to change millions +of source files to accommodate the new version. Thus the impact of changes +to a program depends largely on the investment made by users, in +source files, training, and even muscle memory! + +FunnelWeb lies very much at the compiler end of this spectrum. In fact +it lies even further. Not only does it implement a language, but it is +currently the \i{only} implementation of that language! This means that, +although they shouldn't, people will be tempted to treat the FunnelWeb +program as the definition of its input language instead of +the definition chapter in the \i{FunnelWeb User's Manual}, +which takes precedence. + +Because FunnelWeb defines an input language, and people will write programs +using that language, particular kinds of changes in the language will +impact severely on users. Three different kinds of change are discussed +below. + +\narrowthing{Removing features:}{Removal\xx{removing}{features} +of features (featurectomy) is extremely +difficult once the user base has started using them. If a feature is +removed, users of the program will have to go through all their +programs and find a way to simulate the effect of the removed feature +with other features. Often this is so unthinkable, that bad language +constructs are tolerated far beyond their useful lifetime.} + +\narrowthing{Modifying features:}{Modification\xx{features}{modification} +of features has less +direct impact than the removal of features, but can cause more subtle errors. +For example, consider the sorts of subtle errors that might arise if the +semantics of the FunnelWeb comment \p{@!} were changed so that it no +longer includes the end of line marker. Anyone modifying features should +be sure that they are not inadvertently laying traps.} + +\narrowthing{Adding features:}{Although\xx{features}{adding} +the addition of features is +generally the most painless for the user community, as Hoare points +out, it is also the most dangerous in the long run.} + +\begin{quotation} +\dq{When any new language design project is nearing completion, there is +always a mad rush to get new features added before standardization. +The rush is mad indeed, because it leads into a trap from which there is +no escape. A feature which is omitted can always be added later, when its +design and its implications are well understood. A feature which is +included before it is fully understood can never be removed +later.}\paper{Hoare80} +\end{quotation} + +These problems exist even when there is a central authority. +If we consider the case where there is no central authority, and +users modify a language and its implementations and distribute the +modified versions, the result is even worse. For a start, the +structure of the genealogy of the program\xx{genealogy}{program} +changes from a list to a tree. +This makes it impossible to impose an ordering on the different versions +and makes it difficult to merge them once they diverge. Second, it +reduces the portability of files created under different versions. +Third, it makes adding features hazardous. If a feature is added in +one version, files will be created that use it. These files will +immediately become non-portable. Furthermore, two programmers may +introduce different features that use the same syntactical constructs, +thus preventing the two versions from ever being merged. Worse, two +programmers could introduce \i{similar} features that use the +same syntactical constructs, producing even more subtle problems. + +The only way to avoid all these problems is to create some sort of +central design authority,\xx{design}{authority} +(or, at the very least, some sort of design +synchronization) that controls the language and its implementation. + +The benefits of tight control over the language are enormous. + +\narrowthing{Universal portability:}{Source files can be treated as portable. +If all the language +implementations in the world are singing the same tune, then someone +in Sydney could send a file to someone in New York and be +sure that it will be successfully processed.} + +\narrowthing{Clear semantics:}{Doubt about the semantics of the +language will be greatly minimized. +So long as more than one slightly differing version of a language exists, +there will be confusion over the semantics of its constructs. A good +example is the confusion between the AT\&T Unix\x{Unix} +and Berkeley Unix shell languages.} + +While changes to the language supported by a piece of software is the +most serious problem associated with multiple versions of software, +the lesser problem of keeping track of changes that don't affect the +language that the software implements can also cause trouble. Merging +different versions of software is extremely tedious as anyone who +has tried it will verify. However, changes not affecting the +language are far less serious because they impact only on the program +itself, not on the far more numerous source files that depend on it. + +\section{Authority vs User Security} +\xx{security}{authority} + +There are a number of ways of providing the +strong central design authority required to produce +the portability and semantic security desired by users, + +\begin{itemize} + +\item Trade mark\x{trademark} +the name of the language. Publish a specification of the +language under the trade name. Warn all users not to trust any +implementation that does not guarantee that it implements the language. +Then control implementations by only licensing the trade mark to conforming +implementations. + +\item Create a single implementation of the language. Do not release +the source code to the implementation. Release only binary executables. + +\item Release the source code to the implementation, but under a license +that prohibits the distribution of modified versions. + +\end{itemize} + +Many other variations on these themes are possible, but they are all +based on the idea of regulating either the \dq{official} +definition of the language +or all of its existing implementations. + +At about this stage, a conflict arises. While users want the language +they are using to be tightly controlled, they also want to feel secure +about the availability of its implementations. If hundreds of source +files are to be created in the language, there had better be one or +more translators available when the time comes to use them. + +In the case of widely-used programming languages such as~C, the problem of +securing implementations does not arise. If you don't get your +compiler from Borland, you can get it from Microsoft. However, in the +case of a newly introduced language such as FunnelWeb, there may be +very few implementations, or even just one implementation, +and this poses a danger to the +user who is committing to that format. Despite the best intentions of the +copyright owner, there are a variety of ways in which a computer +program can suddenly become +unavailable.\xx{program}{availability} Here are some examples: + +\begin{itemize} + +\item If the program is owned by a company and the company goes broke, +the liquidators may not bother to place the software in the public domain. + +\item If the program is owned by a kindly individual who issues licenses +for free, and that individual suddenly dies, users might suddenly find +themselves negotiating with hard-nosed estate executors for the rights +to continue using the program. + +\item If whoever owns the program does not upgrade the program every so +often, it is actually possible for the released +executables to \dq{expire} when new operating system upgrades appear. + +\end{itemize} + +These possibilities mean that users about to invest in a newly +introduced programming +tool such as FunnelWeb have legitimate concerns when they worry +about the tool's availability. For non-commercially +distributed tools such as FunnelWeb, the simplest solution to this +problem is to make the source code available, either by placing it +into the public domain, or by releasing it under some kind of +public license, such as a GNU license. +The trouble with releasing the source code +is that it removes control from the design +authority. Once the code is \dq{out} there is no stopping anyone +from modifying the program and distributing modified versions. +All chaos can ensue. + +One solution to this conflict is to take the trade mark approach. This +separates the right of the design authority to control the language and +its implementations, and the right of the users to use the source +code in any way they like (but they may have to change its name!). +However, the trade mark approach is expensive. + +The solution that I (Ross Williams (\p{ross@spam.adelaide.edu.au})) +have adopted is to release the FunnelWeb source code under a GNU license +and then to write this chapter in the \i{FunnelWeb +Hacker's Manual} to dissuade possible hackers from +releasing modified versions under the FunnelWeb name. +This is about as close to the GNU/trademark approach +I can get without forking out about \$1200 for a US trademark +or paying even more to get a lawyer to attempt to draft a contract +stating \dq{thou shalt not modify the FunnelWeb language}. + +\section{What I Want to Protect} +\xx{protection}{FunnelWeb}\xx{protection}{file extension} + +The concerns expressed in the previous section about modifications to the +FunnelWeb program do not preclude modifications. They merely imply that +some conditions be observed when modifications are made. +In fact, +having formally released the sources under GNU, there is nothing that +I can do to stop people distributing modified versions and the conditions +to be described must be imposed voluntarily. + +In the end there are two things that I want to protect/maintain: + +\begin{enumerate} + +\item Restriction of the name \dq{FunnelWeb} only to computer programs +that exactly implement my \dq{official} definition of the language. + +\item Restriction of the FunnelWeb source file extensions \dqp{.fw} +(input files) and \dqp{.fwi} (include files) only +to source files that conform to my \dq{official} definition of the +language. + +\end{enumerate} + +So long as these conditions hold, source files created under \dq{FunnelWeb} +will be portable, and the language will have the potential to +be stable and well-defined. Here are my suggestions for how to +obey these rules. These suggestions are in addition to the GNU license +rules about documenting any changes that you make in the source files. + +\narrowthing{Modifications that do not affect functionality:}{If you +change the FunnelWeb program in a manner that does not +affect the functionality of the program in any way (\eg{}port +it to a new machine, or just speed it up), +then you should modify the program to write out a message when it +starts up saying that +it is a modified version of FunnelWeb. No other actions need be taken.} + +\narrowthing{Modifications that affect functionality:}{If you make changes +to FunnelWeb that affect its functionality (\eg{}changes to command line +options, the command language, or the input language) +you should change the name of the program so that the name +no longer contains the word +\dq{FunnelWeb}, and should choose alternative input and include-file +file extensions (the current ones are \dqp{.fw} and \dqp{.fwi}). For example, +you might call your program \dq{BananaWeb} and use the file extensions +\dqp{.bw} and \dqp{.bwi}.} + +These rules are not very restrictive. Basically you can do what you like +so long as you change the name of the resulting program. I do not wish to +restrict anyone who might want to use FunnelWeb as a foundation for a more +sophisticated literate programming system. My sole aim here is to +protect the integrity of what already exists. + +\section{Modifying the Manuals} +\xx{modifying}{manuals} + +While it is permitted to modify the FunnelWeb program, no license has been +granted +to modify its documentation (\i{The FunnelWeb User's Manual} and +\i{The FunnelWeb Hacker's Manual}). The only operation that can be +performed on the FunnelWeb documentation is a verbatim copy in any medium. + +If you have created a modified version of FunnelWeb and wish to document it, +either write your own manual from scratch, or write a manual that can be +used in conjunction with the existing manuals. + +\section{How Copyright Law Works} +\xx{copyright}{law} + +In order to understand the next section, some understanding of copyright +law is required. The assertions made in this section are not legal opinions; +they are merely approximations of the law, based on my understanding of it. + +By default, whoever creates a \newterm{work} owns \newterm{copyright} +over it. This means that by default, that person is the only person in the +world who has the legal right to make copies of the work. + +Copyright over a work usually covers all direct derivations of this work. +For example, if someone owns the source code to a computer program +then they also own any direct derivations such as the binary executable. + +More than one person may own copyright over a work. If this is the case, +then the work cannot be copied without the permission of all of the people +owning the copyright. + +A person (or group) owning copyright over a work +can \newterm{license} the right to make copies +of the work to anyone he likes under any conditions he likes. + +If a work is modified, the result is called a \newterm{derived work}. + +If copyright on a work is owned by $A$ is the work is modified by $B$, +copyright on the derived work is owned by both $A$ and $B$. + +Copyright is not ownership over particular configurations of information, +but rather is the right to restrict the copying of information derived +from particular sources. For example, if two people point their cameras +out a window and take identical photographs, each person has the right +to restrict the copying of \i{their} photograph regardless of the +fact that the other person has copyright over an identical photograph. +In the unlikely event that two people wrote +novels that were letter for letter identical and it could be proven that +there was no contact between the two people when they wrote the novels, +then copyright law would each protect the right of each person to +restrict the copying of the novel originating from \i{them}. In practice, +the probability of such an event occurring is so low that the law +assumes that if two works are close or identical, that there has been +some information interchange at some point. + +Thus, if I own copyright on computer program $X$, and I create +an identical copy of $X$ +called $Y$ and distribute it under the terms of a license agreement, +then that license agreement does not cover the copy $X$. Once the +license agreement is signed, there is nothing I can do to undo the +license; $Y$ has gone. However, I still have total control over $X$. + +Version~2 of the GNU General Public License\xx{GNU}{license} +(under which FunnelWeb is +released) specifies (in a nutshell) that software can be copied freely +so long as it is not sold, and that it can be modified and copied +freely so long as the modifications are logged and it is not sold. +In both cases, it requires that the +result of the copy or modification operation +be copied only under the conditions of the license. + +Once a declaration is issued licensing a copy of a program under GNU +license, that license cannot be retracted. + +\section{Management of the Official FunnelWeb} +\xx{FunnelWeb}{management}\xx{FunnelWeb}{official} + +I intend to maintain an official copy of FunnelWeb and release it under +GNU license from time to time so that everyone can use it. Unfortunately +its going to be a little messy. + +For a variety of reasons, I want to maintain +total control over \i{my} copy of the official version of FunnelWeb. +Some of the reasons are: + +\begin{itemize} + +\item If it turns out that there is an enormous demand for +FunnelWeb (unlikely) then +I want to be able to create a business based on it, or at least +be able to bundle it with other products. +This would be difficult if the only up-to-date copy available was a GNU copy. +Note: If this happens, all the GNU releases of FunnelWeb will remain +valid. + +\item I want to be able to copy code from my version of FunnelWeb +into commercial products without having to worry about the GNU license. + +\end{itemize} + +The trouble is that (in my understanding of copyright law), +once a copy of FunnelWeb has been released under GNU license, then it +and any works derived from it fall under GNU license too. This means that +if you modify a GNU release of +FunnelWeb and send me your modifications, and I incorporate +them into my version, then I no longer own copyright on the version I +modified. Basically, if GNU touches a work, then that copy is gone forever. + +My solution to the problem is to keep a copy of FunnelWeb that is +GNU-clean and only make modifications to it that are GNU-clean. So +long as my official copy is GNU clean, any modifications that I make +myself will be GNU clean. The problem comes when someone else modifies +the GNU version and then wants me to incorporate the modifications into +my official version. As I understand the law, by default, the programmer +owns the modifications (because he made them), but the result of making +the modifications falls under GNU license. What I propose is that those +who want their modifications included in the official copy of FunnelWeb +sign an agreement transferring copyright of the modifications over to +me on condition that the result be released under GNU license within +a certain time period. \figlicense{} demonstrates the process. + +\begin{figure}[htbp] +\begin{verbatim} + + +---------->----------+--------------<-------------+ + |(modifications by | | + | me) V | + | +----------------------------------+ | + +--<--| My Official Copy of FunnelWeb | | + | Copyright (C) Ross Williams | | + +----------------------------------+ | + | (Periodic releases) / \ + V / \ Programmers + +------------------+ /Legal\ sign away + | GNU Release Copy | \Filte/ copyright on + +------------------+ \ r / modifications + | \ / + | (Modifications made by | + V random programmers) --->--+ + +-----------------------+ + | Modified GNU Version | + +-----------------------+ + +\end{verbatim} +\mylabel{\figlicense{}: How I am going to maintain copyright over FunnelWeb.}{% +% +Once a work is released under GNU license, all derived works fall under +GNU license. However, this diagram shows how copyright can be maintained +over a work, while still making it available under GNU license. +Unfortunately, this scheme requires that copyright on +modifications to FunnelWeb be signed off by the people who make the +modifications. +% +} +\end{figure} + +There are two main disadvantages to this scheme: + +\begin{enumerate} + +\item Getting each person who contributes modifications to FunnelWeb +to sign and send a piece of paper signing away copyright will be tedious. + +\item Programmers may be reluctant to sign away copyright on modifications +because the result could be used by me for commercial purposes +by me at a later date (Note: But it must be released under GNU as well). + +\end{enumerate} + +These disadvantages are regrettable consequences of my decision to retain +total control over the \dq{official} version of FunnelWeb. + +The upshot of all this is that: + +\begin{itemize} + +\item I will never allow any code from a GNU release of FunnelWeb to +touch my official copy. Only modifications will be acceptable. + +\item If you make a modification to FunnelWeb and send it to me for +inclusion in the official version, I will not incorporate your +modification until I have received a signed declaration transferring copyright. +I will prepare such a contract when the first person sends me a worthy +modification! + +\item If you intend to make changes to FunnelWeb that are so massive that they +will involve wide-scale modification of the source files, and you want +the modification to be part of the official version, +it might be a good idea to contact me before doing so. There are two +reasons for doing this. First, it allows me a chance to comment on your +proposed modifications and give my opinion on whether they are likely to be +incorporated into the official version. Second, I can send you a copy +(under special license) of the GNU-clean official version to work on. This will +allow you to ship back your changes as files rather than as change sections. + +\end{itemize} + +As a separate point from the legal issues, I am likely to turn out to be +pretty picky about what modifications I will incorporate into the +official copy. Whether a modification will be accepted will depend, +amongst other things, on the following criteria. + +\begin{itemize} + +\item Does the modification fit in with the design goals of FunnelWeb, or +is it just a case of creeping featurism? + +\item How well coded is the modification? Would it reduce the quality of the +code? + +\item If the modification changes FunnelWeb's functionality, is this a +desirable change? How will it impact on existing users? + +\item Would it be quicker for me to make the modification myself than +to work out how to incorporate the submitted modification? + +\end{itemize} + +It is my goal to guard the integrity of the design and code of the +official version of FunnelWeb and so I will probably be rather +fussy about what I regard as a worthwhile modification. I do not wish to +lose control of the code, either technically or legally. + +\section{A GNU Version?} +\xx{GNU}{version} + +The controls on the official version of FunnelWeb described in the previous +section will have at most a minor impact on FunnelWeb development if +FunnelWeb already serves the needs of most of its users. However, if it +turns out that FunnelWeb is both popular, \i{and} needs +widespread modifications and enhancements, then the official feedback loop +described in the previous section will become unworkable, and there will be +a GNU breakout. + +A \newterm{GNU breakout}\xs{breakout}{GNU} +will occur if FunnelWeb users become +organized enough and annoyed enough (at the official development cycle) +to start maintaining a coherent version of FunnelWeb that +diverges from the official version. +If a GNU breakout occurs, I would appreciate, as requested earlier, that +a different name and file extensions be chosen for the diverging version. + +\section{Summary} + +Decentralized modifications to a programming language and its implementations +can seriously damage the language's portability and semantic clarity. +Unfortunately, there is a tension between centralizing control of a +programming language and providing source code security to nervous users. +In FunnelWeb, this trade-off has been resolved to some extent by +releasing the source code along with a request +that if the functionality of the program is modified, +that the program's name be changed and a different file +extension be chosen for input files created under the modified program. +The author of FunnelWeb has decided to maintain an official version of +FunnelWeb over which he will own copyright, but which he will release +under GNU license from time to time. This means that copyright +on all changes to FunnelWeb must be signed over to the author before they +have a chance of being incorporated in the official version. Finally, it is +possible that this reluctance of the author to remove his copyrighted +version from the development cycle of the official version +will result in a GNU breakout in which a diverging GNU +version of FunnelWeb will be maintained by the GNU community. The author +hopes this won't be necessary and requests, +if this happens, that the diverging GNU version be renamed. + +%==============================================================================% +% Start of Ch3.tex % +%==============================================================================% diff --git a/web/funnelAC/hackman/h_ch4.tex b/web/funnelAC/hackman/h_ch4.tex new file mode 100644 index 0000000000..b4df3706a8 --- /dev/null +++ b/web/funnelAC/hackman/h_ch4.tex @@ -0,0 +1,401 @@ +%==============================================================================% +% Start of Ch4.tex % +%==============================================================================% +% +% Copyright +% --------- +% Copyright (C) 1992 Ross N. Williams. +% This file contains a chapter of the FunnelWeb Hacker's Manual. +% See the main TeX file for this manual for further information. +% +%==============================================================================% + +\chapter{FunnelWeb Future} +\label{chapfuture}\xx{FunnelWeb}{future} + +Previous chapters have explained the design of FunnelWeb and given reasons +for why it is the way it is. This chapter goes through each of the +aspects of FunnelWeb, and explores their problems, how they can be solved, +and lists opportunities for improvement. + +\section{Documentation} +\x{documentation} + +\thing{An official example:} A official example program written using +FunnelWeb should be constructed and made available.\xx{official}{example} + +\thing{Index program:} In order to typeset the documentation, a portable +index sorting program is required. One should be written and added to the +distribution kit.\xx{index}{program} Perhaps this could be the official +example! + +\section{Command Line Interface} +\xx{command}{interface} + +\thing{Buffer length:} Currently the FunnelWeb shell uses the +\p{COMLINE\_MAX} constant to size its internal command line buffers. +This is untenable. The maximum length of a shell command line should +not be machine dependent. + +\thing{Antiquated Features:} As the FunnelWeb language develops, it is likely +that some changes will have to be made that will render one or more +language constructs obsolete. When this happens, it may be necessary to +add a command line option that has the power to turn on and off warnings or +errors flagging antiquated features.\xx{antiquated}{features} + +\section{Shell Interpreter} +\xx{shell}{interpreter}\xx{command}{interpreter} + +\thing{SETALL command:} When writing FunnelWeb scripts, it is sometimes +desirable to set \i{all} of FunnelWeb's options\x{options} +to some particular value +so that the script is not vulnerable to changes in FunnelWeb's default +values which might occur from time to time. To this end, it may be worth +creating a \dqp{SETALL} command that is identical to the \dqp{SET} command +except that it will generate an error if the value of an option is not +specified explicitly.\xx{setall}{command} + +\thing{Recursion test:} A test should be added to test for recursive +invocation in a shellscript.\xx{recursion}{test} + +\thing{Diagnostic counting:} The code for counting diagnostics in the +script interpreter is rather messy and perhaps even buggy. It should be +cleaned up and commented.\xx{diagnostic}{counting} + +\thing{Argument counting:} In the \p{command.c} module, there is a variable +that counts the arguments to a command. Currently it takes the value of +the number of parameters including the command verb. This has turned out +to make the code less readable. It should be changed to be the number of +arguments to the command verb. + +\thing{Make facility:} It may be worth building some sort of make facility +into the script language so as to support machines such as the Macintosh +that do not already have this facility.\x{make} + +\thing{Signature file:} One problem with using FunnelWeb in conjunction with +an external \p{Make} facility is that a user might change a FunnelWeb source +file without making changes that will affect the files that it generates. +If FunnelWeb is then run and the \dqp{+D} option is on, then the output +files will be deleted (to avoid further \p{Make} propagations). +If \p{Make} then has a production linking the \p{.fw} file to its output +files, then it may conclude that the output files are still out of date. +To solve the problem, FunnelWeb could be changed to write a \p{.sig} file +whenever it processes a \p{.fw} file. The \p{Make} production could then +be wired up to link +the \p{.fw} file to the \p{.sig} file instead of to the output +files.\xx{signature}{file} + +\section{Language Design} +\xx{language}{design} + +Some proposed changes to FunnelWeb do not correspond to +any particular component of FunnelWeb +and are really to do with the design of the input language. + +\thing{Output or file?:} The \dqp{@O} special sequence for defining an output +file is somewhat non-mnemonic and can be confused with zero (\dqp{0}). Perhaps +it should be replaced by the \dqp{@F} sequence. + +\thing{Syntax of section names:} Currently section names use +the same syntax as macro names. For example \dqp{@}. It can be +argued that angle brackets should be reserved only for macro names and that +some other syntax should be found for delimiting section names. This is not +a clear issue. It could also be argued that they are both names, and that +because sections can inherit their names from the macros they contain, that +the names are of the same \dq{type}.\xx{section}{syntax} + +\thing{One macro per section:} One particular style of using FunnelWeb is +to have at most one macro definition per section. It may be worth adding +a pragma that instructs FunnelWeb to enforce this. + +\thing{Should @\{ suppress EOL?:} When defining a macro in FunnelWeb, it +seems to be rule rather than the exception that the +\dqp{@\{} be followed by \dqp{@-}. This suppresses the EOL on the definition +line, allowing the first line of the macro to be placed immediately +above and in line with the other +lines without introducing an EOL at the start of the macro text. +One option is to introduce a pragma to determine whether to suppress EOLs +following \dqp{@\{}. + +\thing{Pragma syntax:} It is not clear how \dq{loose} the syntax of pragmas +should be. Perhaps they should be case insensitive.\xx{pragma}{syntax} + +\thing{Conditionals:} Depending on demand, it may be worth reintroducing +some sort of conditional feature into FunnelWeb. However, it would have to +be very simple to compete with the various ways in which conditionals +can already be fudged within FunnelWeb as it stands.\x{conditionals} + +\thing{File markers:} It might be worth modifying the language so that +a special syntactical marker is required at the start and end of files. +This will assist in detecting truncations and other +corruptions.\xx{file}{markers} + +\thing{Formal parameter lists:} It might be worth changing over to a +syntax for formal parameter lists that does not require the \p{@(} and +\p{@)}. However, they could be retained as optional for backward +compatibility.\xx{parameter list}{formal} + +\section{Scanner/Mapper} +\x{scanner}\x{mapper} + +\thing{All non-contiguous mappings:} Currently FunnelWeb requires that all +input files be mapped into a contiguous lump of memory. This caused problems +for two reasons. First, to do this, one has to allocate the memory first, +and to do that, you have to know how long the file is, and it turns out that +finding out the length of a file in a portable manner is very inefficient. +Second, although IBM PC compatibles may have megabytes of memory, it is +segmented into blocks of at most 64K. This means that FunnelWeb currently +cannot read a file longer than 64K on a PC.\xx{contiguous}{memory} + +These problems could be avoided if the mapper and scanner were reorganized to +allow input files to be read in and stored as a linked list of chunks of text +rather than a contiguous block. + +\thing{EOL is unspecifiable:} FunnelWeb uses ASCII character decimal ten (10) +internally to represent logical end-of-line and is currently organized so that +if one of these is inserted into the text by the user using a +\dqp{@\circumflex{}D(10)}, it will be written out as a logical end of line, +rather than as a single ASCII character 10. This should be +fixed.\xx{representation}{EOL} + +\thing{Allow mnemonics for unprintables:} FunnelWeb allows users to insert +unprintable characters into the output using the \dqp{@\circumflex{}D(ddd)} +special sequence. Perhaps it would be changed so that it understands ASCII +standard mnemonics such as \dqp{LF} as well as ASCII +numbers.\xx{ASCII}{mnemonics} + +\thing{Version pragma:} A \dqp{version} pragma should be added that allows +the user to specify in the input file the version of FunnelWeb that was +around when the input file was created. At a later date, such a construct +would be very useful for determining how an input file should be updated +if the FunnelWeb language has changed between +versions.\xx{version}{pragma} + +\section{Parser} +\x{parser} + +There are no proposals to change the parser except as a consequence of +other proposals. + +\section{Analyser} +\x{analyser} + +\thing{Recursion detection:} Currently the FunnelWeb analyser flags, with +an error, all macros with an infinite expansion. This would be best +changed to flagging all macros that are directly or indirectly recursive. +To do this, Tarjan's algorithm\paper{Tarjan72}\xn{Robert Endre}{Tarjan} +for the detection of strong components should +be installed.\xx{recursion}{detection} + +\thing{Once only macros:} By default FunnelWeb prevents a macro from being +called more than once unless it has a \dqp{@M} associated with it. However, +FunnelWeb does allow a macro that calls such a macro to be called more +than once. Perhaps this \dq{loophole} should be plugged somehow. + + +\section{Tangle} +\x{tangle} + +The Tangler is one of the cleanest components of FunnelWeb, as basically all it +has to do is expand some very well-defined macros. + +\thing{Text indentation:} Currently FunnelWeb supports \i{no indentation} +and \i{blank indentation}. A third form could be added if it was considered +necessary. \i{Text indentation} is the same as \i{blank indentation} except +that instead of indenting with blanks, FunnelWeb would indent with the +text to the left of the called macro. This facility could be useful for +commenting out large bodies of text in languages that do not have +multi-line comments (e.g. Ada). A discussion of the pros and cons of this +form of indentation appears earlier.\xx{text}{indentation} + +\section{Weave} +\x{weave} + +Perhaps FunnelWeb's weakest aspect is its typesetting facility. + + +\thing{Align table of contents:} When FunnelWeb generates a table of contents, +the section numbers are not quite aligned with the start of the controlling +heading above them.\x{table of contents} + +\thing{Typesetting strength:} It should be possible to specify the +level of typesetting strength for headings so that short documents do not +look overdone when typeset. A new pragma would be good for +this.\xx{strength}{typesetting} + +\thing{Typeset a portion:} Sometimes it is desirable to typeset just a +portion of a program. A command line option could be added to do +this. The option could accept as its argument, a string containing a list +of section numbers or heading names. + +\thing{Generic typesetter option:} In addition to building in a number +of different versions of Weave, one for each popular typesetter, it would be +possible to add a special generic format where the typeset output is +expressed in terms of \i{FunnelWeb macros}. The user could then specify +macro definitions for a non-supported typesetter and run the output +through FunnelWeb Tangle to get a typeset file in a format suitable for the +unsupported typesetter.\xx{typesetter}{generic} + +\thing{Suppression of include files:} It should be possible to specify +in the input file that particular included files not appear in the +typeset output. Currently, the fact that an inclusion has occurred is +not even represented in the typeset output. Suppression of inclusions +is particularly necessary where a library of macros has been included +at the top of each of a group of source files.\xx{include file}{suppression} + +\thing{Cross reference of identifiers:} WEB provides a list of identifiers +and a list of all the definitions in which they are used. A similar +feature could be added to FunnelWeb.\xx{cross}{references} + +\thing{Support for non-printables:} Currently FunnelWeb does not provide +support for typesetting the special \dqp{@\circumflex(num)} sequences. +This should be added. + +\thing{Support for @+ sequences:} Currently Weave does not see \dqp{@+} +sequences as such. Instead it perceives them as ordinary EOLs. However, +there are arguments for typesetting them specially. + +\thing{Typeset text in macro bodies:} One of the much-loved features +of WEB is the way that it allows the user to switch recursively between +document and program formats. FunnelWeb does not allow this, but +should. In FunnelWeb, the delimiters \dqp{@\{} and \dqp{@\}} are already +used consistently to delimit macro text. The \dqp{@[} and \dqp{@]} sequences +have been reserved for the delimitation of documentation text. + +\thing{Non-tt typesetting:} The current version of FunnelWeb sets all its +macro text in \p{tt font}. This is both a blessing and a curse. It is a +blessing because it connects the reader directly to the code, with no +complicated intermediary. It is a curse because it looks ugly compared to +the beautifully typeset programs produced by other literate programming +tools. + +The difficulty with adding such beautiful typesetting is that it is +necessarily language-specific. Keywords and syntax differ from language +to language and it would not be easy to come up with a set of language +independent rules. + +One approach is to write a set of Weave back-ends, one for each language. +Another approach is to \i{generate} back ends. This is the approach +taken in the \i{Spider} system\paper{Ramsey89}.\x{spider} +In the \i{Spider} system, +the programmer writes production rules for converting lexical components +of the program text into typesetter instructions. The \i{Spider} program +reads these rules and generates a new version of WEB suited for the target +language. + +For FunnelWeb a slightly different system is proposed in which Spider-like +rules appear in the input file and are used directly by Weave to perform the +typesetting. An intermediate abstract typesetting language could be used +so that the productions can be made language specific, but not typesetter +specific. + +\section{Lister} +\x{lister} + +\thing{Glue factor:} A glue factor could be added that determines how many +lines can be in between two diagnostics in the listing before the two +groups of lines are joined together in the listing with no intervening +ellipsis.\xx{glue}{factor} + +\section{Diagnostics} +\x{diagnostics} + +\thing{Advisory information:} Some of FunnelWeb's diagnostics provide +a detailed explanatory paragraph. While this information might be useful the +first time, it has the capacity to clog up a listing file if the user has +made the same error many times. To solve this problem, FunnelWeb could be +modified so that such explanations are only displayed the first time the +error occurs. + +\thing{Abort after n errors:} A facility could be added to prevent +FunnelWeb's scanning, parsing, and analysing phases from continuing if +a certain number of errors have already been issued. + + +\section{Speed} +\x{speed}\x{efficiency} + +\thing{Measurement of speed:} Although FunnelWeb can generate a breakdown +of where it is spending its time, it does not give a final rating in +lines per minute. This should be added. + +\thing{Find the hot spots:} Although FunnelWeb has been designed to allow +high speed, not much effort has so far been made to make it fast. This should +be done. + +\thing{Change some declarations:} FunnelWeb is full of variable declarations +where the variables are wider than they need be. Replacing these might speed +it up. + +\section{Correctness} +\x{correctness} + +\thing{Bounds analysis:} Not much effort has gone into the design of +FunnelWeb's input boundaries. An analysis should be made of FunnelWeb's +behaviour when the following quantities are stretched: + +\begin{itemize} +\item Input line length. +\item Input file size. +\item Number of macros. +\item Length of macro. +\end{itemize} + +In particular, FunnelWeb's behaviour at 32K and 64K boundaries should be +observed. + +\thing{Stack detection:} Macintosh THINK-C provides just 6K of memory for +the stack. It might be worth adding checks to make sure that the stack is +not being blown. + +\section{Test Suite} +\xx{test}{suite} + +The following tests should be added to the test suite: + +\begin{verbatim} +Lister +------ + LR01: Test with a full listing with no diagnostics. + LR02: Test with a full listing with diagnostics. + LR03: Test with an abbreviated listing with no diagnostics. + LR04: Test with an abbreviated listing with diagnostics. + LR05: Test error context system with nearby diagnostics. + +Boundary Cases +-------------- +Static analysis might preclude the need for most of these tests. + BC01: Test what happens when memory runs out. + BC02: Test on a file with a single line of a megabyte. + BC03: Test on a file of a megabyte of EOLs. + BC04: Generate an output file with an extremely long line. + BC05: Generate an output file with one million lines. + BC06: Test on a file with very many macros. + +General +------- + GN01: A large legal input file exercising as many features as possible. + 1. Test listing file. + 2. Test output files. + 3. Test typeset file. + GN... A selection of ten real-life FunnelWeb files. +\end{verbatim} + +\section{Machine-Specific Changes} + +\thing{Icon for the Macintosh:} Currently no icon is supplied for the +Macintosh version of FunnelWeb. An icon depicting a spider or a funnelled +web of some kind would seem appropriate. + +\section{Summary} + +This chapter has describes some of the problems with FunnelWeb and some of the +opportunities that exist for improving it. The direction and speed in which +FunnelWeb will develop will depend largely on user feedback. If you have any +strong feelings on where FunnelWeb should go, please email them to +Ross Williams (\p{ross@spam.adelaide.edu.au}). + + +%==============================================================================% +% Start of Ch4.tex % +%==============================================================================% diff --git a/web/funnelAC/hackman/h_cha.tex b/web/funnelAC/hackman/h_cha.tex new file mode 100644 index 0000000000..9098358be5 --- /dev/null +++ b/web/funnelAC/hackman/h_cha.tex @@ -0,0 +1,441 @@ +%==============================================================================% +% Start of Cha.tex % +%==============================================================================% +% +% Copyright +% --------- +% Copyright (C) 1992 Ross N. Williams. +% This file contains a chapter of the FunnelWeb Hacker's Manual. +% See the main TeX file for this manual for further information. +% +%==============================================================================% + +\appendix + +%============================================================================== + +\chapter{GNU General Public License Version 2} +\xx{GNU}{License} + +This appendix contains a verbatim copy of Version~2 of the GNU +General Public License under which the FunnelWeb computer program is +released. Note that the \i{FunnelWeb User's Manual} and +\i{FunnelWeb Hacker's +Manual} are released under a much simpler license that does not allow +modifications. + +\bigskip + +\hrule + +\bigskip + +\begin{verbatim} + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 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. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 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 OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details + type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. +\end{verbatim} + +\bigskip + +\hrule + +%============================================================================== + +\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{Bentley86} Bentley~J., \dq{Programming Pearls: Literate Programming}, +\i{Communications of the ACM}, Vol.~29, No.~5, pp.~364--369, 1986.\checked{} + +\paper{Hoare80} Hoare~C.A.R., \dq{The Emperor's Old Clothes}, +Turing Award Lecture, 1980, from \dq{ACM Turing Award Lectures: The +First Twenty Years 1966--1985}, +ACM Press, New York, (ISBN: 0-201-07794-9), 1987 (see p.~155).\checked{} + +\paper{Horton90} Horton~M.R., \dq{Portable C Software}, +Prentice Hall, (ISBN: 0-13-868050-7), 1990.\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.\checked{} + +\paper{Knuth84} Knuth~D.E., \dq{The \TeX{}book}, Addison-Wesley, +(ISBN: 0-201-13448-9), 1984. + +\paper{Lamport86} Lamport~L., \dq{\LaTeX{}: A Document Preparation System}, +Addison-Wesley, (ISBN: 0-201-15790-X), +1986.\checked{} + +\paper{Rabinowitz90} Rabinowitz~H., Schaap~C., \dq{Portable~C}, Prentice Hall, +(ISBN:0-13-685967-4) 1990.\checked{} + +\paper{Ramsey89} Ramsey~N., \dq{Weaving a Language-Independent WEB}, +\i{Communications of the ACM}, Vol.~32, No.~9, pp.~1051--1055, 1989.\checked{} + +\paper{Tarjan72} Tarjan~R.E., +\dq{Depth-First Search and Linear Graph Algorithms}, +\i{SIAM Journal of Computing}, Vol.~1, No.~2, pp.~146--160, +June 1972.\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 h_manual.sin +\end{theindex} + +%==============================================================================% +% End of Cha.tex % +%==============================================================================% diff --git a/web/funnelAC/hackman/h_manual.aux b/web/funnelAC/hackman/h_manual.aux new file mode 100644 index 0000000000..fc25ea43c0 --- /dev/null +++ b/web/funnelAC/hackman/h_manual.aux @@ -0,0 +1,80 @@ +\relax +\@writefile{toc}{\string\contentsline\space {chapter}{Preface}{5}} +\@writefile{toc}{\string\contentsline\space {chapter}{Acknowledgements}{7}} +\@writefile{toc}{\string\contentsline\space {chapter}{Presentation Notes}{9}} +\@writefile{toc}{\string\contentsline\space {chapter}{\string\numberline\space {1}FunnelWeb Design}{11}} +\@writefile{lof}{\string\addvspace\space {10pt}} +\@writefile{lot}{\string\addvspace\space {10pt}} +\newlabel{chapdesign}{{1}{11}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {1.1}Motivation for FunnelWeb}{11}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {1.2}Indentation}{12}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {1.3}Review of FunnelWeb Syntax}{14}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {1.3.1}Review of Macro Definition Syntax}{14}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {1.3.2}Review of Macro Call Syntax}{16}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {1.3.3}Review of Parameterized Macro Call Syntax}{16}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {1.4}Document Structuring}{16}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {1.5}Discussion of Some Miscellaneous Issues}{18}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {1.6}Automated Regression Testing}{18}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {1.7}Command Line Interface}{18}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {1.8}File Name Management}{19}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {1.8.1}Filename Extensions}{20}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {1.8.2}Filename Inheritance}{20}} +\@writefile{toc}{\string\contentsline\space {subsection}{\string\numberline\space {1.8.3}Portable Structure of File Names}{21}} +\newlabel{portablefilenames}{{1.8.3}{21}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {1.9}Specifying Constraints on the Number of Instantiations}{22}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {1.10}The Relationship Between Document Structure and Macro Structure}{23}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {1.11}Diagnostic Messages}{25}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {1.12}Summary}{25}} +\@writefile{toc}{\string\contentsline\space {chapter}{\string\numberline\space {2}FunnelWeb Implementation}{27}} +\@writefile{lof}{\string\addvspace\space {10pt}} +\@writefile{lot}{\string\addvspace\space {10pt}} +\newlabel{chapimplementation}{{2}{27}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2.1}Introduction}{27}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2.2}History of FunnelWeb Implementations}{27}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2.3}Why FunnelWeb Wasn't Used to Write Itself}{28}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2.4}Coding Style}{28}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2.5}Use of Memory}{29}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2.6}The Heap}{29}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2.7}The Stack}{30}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2.8}Static Variables}{30}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2.9}Implementing Text Indentation}{30}} +\@writefile{toc}{\string\contentsline\space {chapter}{\string\numberline\space {3}FunnelWeb Modification}{35}} +\@writefile{lof}{\string\addvspace\space {10pt}} +\@writefile{lot}{\string\addvspace\space {10pt}} +\newlabel{chapmod}{{3}{35}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.1}Introduction}{35}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.2}The Danger of Modifying Languages}{35}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.3}Authority vs User Security}{36}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.4}What I Want to Protect}{37}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.5}Modifying the Manuals}{38}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.6}How Copyright Law Works}{38}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.7}Management of the Official FunnelWeb}{39}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.8}A GNU Version?}{41}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3.9}Summary}{41}} +\@writefile{toc}{\string\contentsline\space {chapter}{\string\numberline\space {4}FunnelWeb Future}{43}} +\@writefile{lof}{\string\addvspace\space {10pt}} +\@writefile{lot}{\string\addvspace\space {10pt}} +\newlabel{chapfuture}{{4}{43}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4.1}Documentation}{43}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4.2}Command Line Interface}{43}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4.3}Shell Interpreter}{43}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4.4}Language Design}{44}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4.5}Scanner/Mapper}{44}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4.6}Parser}{45}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4.7}Analyser}{45}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4.8}Tangle}{45}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4.9}Weave}{45}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4.10}Lister}{46}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4.11}Diagnostics}{47}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4.12}Speed}{47}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4.13}Correctness}{47}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4.14}Test Suite}{47}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4.15}Machine-Specific Changes}{48}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4.16}Summary}{48}} +\@writefile{toc}{\string\contentsline\space {chapter}{\string\numberline\space {A}GNU General Public License Version 2}{49}} +\@writefile{lof}{\string\addvspace\space {10pt}} +\@writefile{lot}{\string\addvspace\space {10pt}} +\@writefile{toc}{\string\contentsline\space {chapter}{\string\numberline\space {B}References}{57}} +\@writefile{lof}{\string\addvspace\space {10pt}} +\@writefile{lot}{\string\addvspace\space {10pt}} +\@writefile{toc}{\string\contentsline\space {chapter}{Index}{57}} diff --git a/web/funnelAC/hackman/h_manual.dvi b/web/funnelAC/hackman/h_manual.dvi new file mode 100644 index 0000000000..956cf6322e Binary files /dev/null and b/web/funnelAC/hackman/h_manual.dvi differ diff --git a/web/funnelAC/hackman/h_manual.idx b/web/funnelAC/hackman/h_manual.idx new file mode 100644 index 0000000000..3ba19d0562 --- /dev/null +++ b/web/funnelAC/hackman/h_manual.idx @@ -0,0 +1,326 @@ +\indexentry{Ross Williams}{1} +\indexentry{Williams Ross}{1} +\indexentry{copyright notice}{1} +\indexentry{notice copyright}{1} +\indexentry{preface}{5} +\indexentry{acknowledgements}{7} +\indexentry{David Hulse}{7} +\indexentry{Hulse David}{7} +\indexentry{Ada}{7} +\indexentry{Simon Hackett}{7} +\indexentry{Hackett Simon}{7} +\indexentry{Jeremy Begg}{7} +\indexentry{Begg Jeremy}{7} +\indexentry{Barry Dwyer}{7} +\indexentry{Dwyer Barry}{7} +\indexentry{Roger Brissenden}{7} +\indexentry{Brissenden Roger}{7} +\indexentry{Donald Knuth}{7} +\indexentry{Knuth Donald}{7} +\indexentry{presentation notes}{9} +\indexentry{typesetting}{9} +\indexentry{Andrew Trevorrow}{9} +\indexentry{Trevorrow Andrew}{9} +\indexentry{OzTeX}{9} +\indexentry{Knuth84}{9} +\indexentry{Lamport86}{9} +\indexentry{TeX}{9} +\indexentry{LaTeX}{9} +\indexentry{Macintosh}{9} +\indexentry{LaTeX}{9} +\indexentry{FunnelWeb design}{11} +\indexentry{design FunnelWeb}{11} +\indexentry{FunnelWeb V1}{11} +\indexentry{backwards compatibility}{11} +\indexentry{compatibility backwards}{11} +\indexentry{FunnelWeb motivation}{11} +\indexentry{motivation FunnelWeb}{11} +\indexentry{Donald Knuth}{11} +\indexentry{Knuth Donald}{11} +\indexentry{Jon Bentley}{11} +\indexentry{Bentley Jon}{11} +\indexentry{programming pearls}{11} +\indexentry{Communications of the ACM}{11} +\indexentry{Bentley86}{11} +\indexentry{Knuth83}{11} +\indexentry{Pascal}{12} +\indexentry{number output files}{12} +\indexentry{output files number}{12} +\indexentry{indentation}{12} +\indexentry{Occam's razor}{12} +\indexentry{indentation}{12} +\indexentry{indentation no}{12} +\indexentry{no indentation}{12} +\indexentry{indentation blank}{12} +\indexentry{blank indentation}{12} +\indexentry{indentation text}{12} +\indexentry{text indentation}{12} +\indexentry{indented macro call}{12} +\indexentry{no indentation}{12} +\indexentry{blank indentation}{12} +\indexentry{text indentation}{12} +\indexentry{DCL}{13} +\indexentry{indentation dangers}{13} +\indexentry{dangers indentation}{13} +\indexentry{FunnelWeb syntax}{14} +\indexentry{syntax FunnelWeb}{14} +\indexentry{==}{14} +\indexentry{macro definition syntax}{14} +\indexentry{syntax macro definition}{14} +\indexentry{parameterized macro definitions syntax}{15} +\indexentry{syntax parameterized macro definitions}{15} +\indexentry{macro call syntax}{16} +\indexentry{syntax macro call}{16} +\indexentry{parameterized macro call syntax}{16} +\indexentry{syntax parameterized macro call}{16} +\indexentry{document structure}{16} +\indexentry{structure document}{16} +\indexentry{headings}{16} +\indexentry{sections}{16} +\indexentry{miscellaneous issues}{18} +\indexentry{issues miscellaneous}{18} +\indexentry{comment duplication}{18} +\indexentry{duplication comment}{18} +\indexentry{out of date documentation}{18} +\indexentry{documentation out of date}{18} +\indexentry{regression testing}{18} +\indexentry{testing regression}{18} +\indexentry{command line interface}{18} +\indexentry{interface command line}{18} +\indexentry{Ada}{18} +\indexentry{vms vax}{18} +\indexentry{vax vms}{18} +\indexentry{.cld file}{18} +\indexentry{file .cld}{18} +\indexentry{design goals command line interface}{19} +\indexentry{command line interface design goals}{19} +\indexentry{file names}{19} +\indexentry{names file}{19} +\indexentry{filename extensions}{20} +\indexentry{extensions filename}{20} +\indexentry{filename inheritance}{20} +\indexentry{inheritance filename}{20} +\indexentry{file names}{21} +\indexentry{names file}{21} +\indexentry{portable filenames}{21} +\indexentry{filenames portable}{21} +\indexentry{invocations number}{22} +\indexentry{number invocations}{22} +\indexentry{@Z}{23} +\indexentry{@M}{23} +\indexentry{document structure macro structure}{23} +\indexentry{macro structure document structure}{23} +\indexentry{document structure}{23} +\indexentry{structure document}{23} +\indexentry{macro structure}{23} +\indexentry{structure macro}{23} +\indexentry{hierarchical structure}{23} +\indexentry{structure hierarchical}{23} +\indexentry{TeX}{23} +\indexentry{section numbering}{23} +\indexentry{numbering section}{23} +\indexentry{diagnostic messages}{25} +\indexentry{messages diagnostic}{25} +\indexentry{FunnelWeb implementation}{27} +\indexentry{implementation FunnelWeb}{27} +\indexentry{FunnelWeb history}{27} +\indexentry{history FunnelWeb}{27} +\indexentry{FunnelWeb version 1}{27} +\indexentry{FunnelWeb version 2}{27} +\indexentry{FunnelWeb version 3}{27} +\indexentry{Ada}{27} +\indexentry{USDOD83}{27} +\indexentry{Ph.D.}{27} +\indexentry{FunnelWeb past use}{27} +\indexentry{past use FunnelWeb}{27} +\indexentry{David Hulse}{27} +\indexentry{Hulse David}{27} +\indexentry{University Adelaide}{27} +\indexentry{Adelaide University}{27} +\indexentry{FunnelWeb writing itself}{28} +\indexentry{writing itself FunnelWeb}{28} +\indexentry{trouble asking for}{28} +\indexentry{asking for trouble}{28} +\indexentry{coding style}{28} +\indexentry{style coding}{28} +\indexentry{South Australian Government Department of Lands}{28} +\indexentry{portability}{28} +\indexentry{Rabinowitz90}{28} +\indexentry{Horton90}{28} +\indexentry{Kernighan88}{28} +\indexentry{ANSI}{28} +\indexentry{Rabinowitz90}{28} +\indexentry{identifier}{28} +\indexentry{identifier abbreviations}{28} +\indexentry{abbreviations identifier}{28} +\indexentry{pointers naming}{29} +\indexentry{naming pointers}{29} +\indexentry{types naming}{29} +\indexentry{naming types}{29} +\indexentry{filenames length}{29} +\indexentry{length filenames}{29} +\indexentry{MSDOS}{29} +\indexentry{use of memory}{29} +\indexentry{memory use of}{29} +\indexentry{heap memory}{29} +\indexentry{memory heap}{29} +\indexentry{Macintosh}{29} +\indexentry{malloc}{29} +\indexentry{memory package}{29} +\indexentry{package memory}{29} +\indexentry{memory leakage}{30} +\indexentry{leakage memory}{30} +\indexentry{stack memory}{30} +\indexentry{memory stack}{30} +\indexentry{stack size}{30} +\indexentry{size stack}{30} +\indexentry{memory static}{30} +\indexentry{static memory}{30} +\indexentry{static variables}{30} +\indexentry{variables static}{30} +\indexentry{Macintosh}{30} +\indexentry{ThinkC compiler}{30} +\indexentry{compiler ThinkC}{30} +\indexentry{text indentation}{30} +\indexentry{indentation text}{30} +\indexentry{FunnelWeb modification}{35} +\indexentry{modification FunnelWeb}{35} +\indexentry{GNU license}{35} +\indexentry{license GNU}{35} +\indexentry{changes dangers}{35} +\indexentry{dangers changes}{35} +\indexentry{languages dangers}{35} +\indexentry{dangers languages}{35} +\indexentry{video game}{35} +\indexentry{compiler}{35} +\indexentry{removing features}{35} +\indexentry{features removing}{35} +\indexentry{features modification}{35} +\indexentry{modification features}{35} +\indexentry{features adding}{36} +\indexentry{adding features}{36} +\indexentry{Hoare80}{36} +\indexentry{genealogy program}{36} +\indexentry{program genealogy}{36} +\indexentry{design authority}{36} +\indexentry{authority design}{36} +\indexentry{Unix}{36} +\indexentry{security authority}{36} +\indexentry{authority security}{36} +\indexentry{trademark}{36} +\indexentry{program availability}{37} +\indexentry{availability program}{37} +\indexentry{protection FunnelWeb}{37} +\indexentry{FunnelWeb protection}{37} +\indexentry{protection file extension}{37} +\indexentry{file extension protection}{37} +\indexentry{modifying manuals}{38} +\indexentry{manuals modifying}{38} +\indexentry{copyright law}{38} +\indexentry{law copyright}{38} +\indexentry{work}{38} +\indexentry{copyright}{38} +\indexentry{license}{38} +\indexentry{derived work}{38} +\indexentry{GNU license}{39} +\indexentry{license GNU}{39} +\indexentry{FunnelWeb management}{39} +\indexentry{management FunnelWeb}{39} +\indexentry{FunnelWeb official}{39} +\indexentry{official FunnelWeb}{39} +\indexentry{GNU version}{41} +\indexentry{version GNU}{41} +\indexentry{GNU breakout}{41} +\indexentry{breakout, GNU}{41} +\indexentry{FunnelWeb future}{43} +\indexentry{future FunnelWeb}{43} +\indexentry{documentation}{43} +\indexentry{official example}{43} +\indexentry{example official}{43} +\indexentry{index program}{43} +\indexentry{program index}{43} +\indexentry{command interface}{43} +\indexentry{interface command}{43} +\indexentry{antiquated features}{43} +\indexentry{features antiquated}{43} +\indexentry{shell interpreter}{43} +\indexentry{interpreter shell}{43} +\indexentry{command interpreter}{43} +\indexentry{interpreter command}{43} +\indexentry{options}{43} +\indexentry{setall command}{43} +\indexentry{command setall}{43} +\indexentry{recursion test}{43} +\indexentry{test recursion}{43} +\indexentry{diagnostic counting}{43} +\indexentry{counting diagnostic}{43} +\indexentry{make}{44} +\indexentry{signature file}{44} +\indexentry{file signature}{44} +\indexentry{language design}{44} +\indexentry{design language}{44} +\indexentry{section syntax}{44} +\indexentry{syntax section}{44} +\indexentry{pragma syntax}{44} +\indexentry{syntax pragma}{44} +\indexentry{conditionals}{44} +\indexentry{file markers}{44} +\indexentry{markers file}{44} +\indexentry{parameter list formal}{44} +\indexentry{formal parameter list}{44} +\indexentry{scanner}{44} +\indexentry{mapper}{44} +\indexentry{contiguous memory}{45} +\indexentry{memory contiguous}{45} +\indexentry{representation EOL}{45} +\indexentry{EOL representation}{45} +\indexentry{ASCII mnemonics}{45} +\indexentry{mnemonics ASCII}{45} +\indexentry{version pragma}{45} +\indexentry{pragma version}{45} +\indexentry{parser}{45} +\indexentry{analyser}{45} +\indexentry{Tarjan72}{45} +\indexentry{Robert Endre Tarjan}{45} +\indexentry{Tarjan Robert Endre}{45} +\indexentry{recursion detection}{45} +\indexentry{detection recursion}{45} +\indexentry{tangle}{45} +\indexentry{text indentation}{45} +\indexentry{indentation text}{45} +\indexentry{weave}{45} +\indexentry{table of contents}{45} +\indexentry{strength typesetting}{46} +\indexentry{typesetting strength}{46} +\indexentry{typesetter generic}{46} +\indexentry{generic typesetter}{46} +\indexentry{include file suppression}{46} +\indexentry{suppression include file}{46} +\indexentry{cross references}{46} +\indexentry{references cross}{46} +\indexentry{Ramsey89}{46} +\indexentry{spider}{46} +\indexentry{lister}{46} +\indexentry{glue factor}{46} +\indexentry{factor glue}{46} +\indexentry{diagnostics}{47} +\indexentry{speed}{47} +\indexentry{efficiency}{47} +\indexentry{correctness}{47} +\indexentry{test suite}{47} +\indexentry{suite test}{47} +\indexentry{GNU License}{49} +\indexentry{License GNU}{49} +\indexentry{references}{57} +\indexentry{ANSI}{57} +\indexentry{Bentley86}{57} +\indexentry{Hoare80}{57} +\indexentry{Horton90}{57} +\indexentry{Kernighan88}{57} +\indexentry{Knuth83}{57} +\indexentry{Knuth84}{57} +\indexentry{Lamport86}{57} +\indexentry{Rabinowitz90}{57} +\indexentry{Ramsey89}{57} +\indexentry{Tarjan72}{57} +\indexentry{USDOD83}{57} diff --git a/web/funnelAC/hackman/h_manual.log b/web/funnelAC/hackman/h_manual.log new file mode 100644 index 0000000000..c536c1cd23 --- /dev/null +++ b/web/funnelAC/hackman/h_manual.log @@ -0,0 +1,213 @@ +This is TeX, Version 3.0 (preloaded format=lplain 90.9.16) 27 MAY 1992 12:56 +**&LaTeX h_manual.tex +(h_manual.tex +LaTeX Version 2.09 <13 Jun 1989> +(:TeX-inputs:book.sty +Document Style `book' <24 May 89>. +(:TeX-inputs:bk10.sty) +\descriptionmargin=\dimen99 +\c@part=\count78 +\c@chapter=\count79 +\c@section=\count80 +\c@subsection=\count81 +\c@subsubsection=\count82 +\c@paragraph=\count83 +\c@subparagraph=\count84 +\c@figure=\count85 +\c@table=\count86 +) (:TeX-inputs:titlepage.sty) [0 + + +] +\@indexfile=\write3 + +Writing index file h_manual.idx +(h_manual.aux) +(h_ch0.tex [1] [2 + +] (h_manual.toc [3]) +\tf@toc=\write4 + [4] [5 + +] [6 + +] +Underfull \hbox (badness 10000) in paragraph at lines 120--123 +[]\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. + +[7] [8 + +] +Underfull \hbox (badness 5652) in paragraph at lines 146--152 +[]\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 146--152 +\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. + +) (h_ch1.tex [9] [10 + +] +Chapter 1. +[11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24]) +(h_ch2.tex [25] [26 + +] +Chapter 2. +[27] [28] [29] [30] [31] [32]) (h_ch3.tex [33] [34 + +] +Chapter 3. +[35] [36] [37] [38] [39] [40]) (h_ch4.tex [41] [42 + +] +Chapter 4. +[43] [44] [45] [46] [47]) (h_cha.tex [48] +Appendix A. +[49 + +] +Underfull \vbox (badness 10000) has occurred while \output is active +\vbox(682.86613+0.0)x426.79134 +.\glue(\topskip) 10.0 +.\hbox(0.0+0.0)x0.0 +.\glue(\parskip) 0.0 +.\glue(\baselineskip) 5.88889 +.\hbox(6.11111+2.22223)x426.79134, glue set 80.29436fil +..\hbox(0.0+0.0)x0.0 +..\penalty 10000 +..\glue 5.24995 +..\penalty 10000 +..\glue 5.24995 +..etc. +.etc. + + [50] +Underfull \vbox (badness 10000) has occurred while \output is active +\vbox(682.86613+0.0)x426.79134 +.\glue(\topskip) 10.0 +.\hbox(0.0+0.0)x0.0 +.\glue(\parskip) 0.0 +.\glue(\baselineskip) 5.88889 +.\hbox(6.11111+2.22223)x426.79134, glue set 64.5445fil +..\hbox(0.0+0.0)x0.0 +..\penalty 10000 +..\glue 5.24995 +..\penalty 10000 +..\glue 5.24995 +..etc. +.etc. + + [51] +Underfull \vbox (badness 10000) has occurred while \output is active +\vbox(682.86613+0.0)x426.79134 +.\glue(\topskip) 3.88889 +.\hbox(6.11111+0.0)x426.79134, glue set 64.5445fil +..\hbox(0.0+0.0)x0.0 +..\penalty 10000 +..\glue 5.24995 +..\penalty 10000 +..\glue 5.24995 +..etc. +.\glue(\parskip) 0.0 +.\glue(\baselineskip) 5.88889 +.\hbox(6.11111+2.22223)x426.79134, glue set 164.29362fil +..\hbox(0.0+0.0)x0.0 +..\penalty 10000 +..\glue 5.24995 +..\penalty 10000 +..\glue 5.24995 +..etc. +.etc. + + [52] +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 59.29454fil +..\hbox(0.0+0.0)x0.0 +..\tentt L +..\tentt i +..\tentt c +..\tentt e +..etc. +.\glue(\parskip) 0.0 +.\glue(\baselineskip) 3.66666 +.\hbox(6.11111+2.22223)x426.79134, glue set 90.79427fil +..\hbox(0.0+0.0)x0.0 +..\tentt m +..\tentt a +..\tentt y +..\penalty 10000 +..etc. +.etc. + + [53] +Underfull \vbox (badness 10000) has occurred while \output is active +\vbox(682.86613+0.0)x426.79134 +.\glue(\topskip) 3.88889 +.\hbox(6.11111+1.38887)x426.79134, glue set 38.29472fil +..\hbox(0.0+0.0)x0.0 +..\penalty 10000 +..\glue 5.24995 +..\penalty 10000 +..\glue 5.24995 +..etc. +.\glue(\parskip) 0.0 +.\glue(\baselineskip) 4.50002 +.\hbox(6.11111+1.38887)x426.79134, glue set 48.79463fil +..\hbox(0.0+0.0)x0.0 +..\tentt F +..\tentt O +..\tentt R +..\penalty 10000 +..etc. +.etc. + + [54] +[55] [56 + +] +Appendix B. +[57] (h_manual.sin [58 + +] [59] [60]) [61 + +]) (h_manual.aux) ) +Here is how much of TeX's memory you used: + 220 strings out of 1960 + 1908 string characters out of 13235 + 54264 words of memory out of 60001 + 2151 multiletter control sequences out of 2500 + 19914 words of font info for 75 fonts, out of 27000 for 100 + 14 hyphenation exceptions out of 307 + 15i,6n,15p,200b,226s stack positions out of 200i,40n,60p,500b,600s + +Output written on h_manual.dvi (62 pages, 181584 bytes). diff --git a/web/funnelAC/hackman/h_manual.ps b/web/funnelAC/hackman/h_manual.ps new file mode 100644 index 0000000000..3fa3273717 --- /dev/null +++ b/web/funnelAC/hackman/h_manual.ps @@ -0,0 +1,5210 @@ +%!PS-Adobe-2.0 +%%Creator: dvips 5.493 Copyright 1986, 1992 Radical Eye Software +%%Title: h_manual.dvi +%%CreationDate: Sat Aug 14 17:07:29 1993 +%%Pages: 62 +%%PageOrder: Ascend +%%BoundingBox: 0 0 612 792 +%%EndComments +%DVIPSCommandLine: dvips h_manual +%DVIPSSource: TeX output 1993.08.14:1707 +%%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/hackman/h_manual.dvi) +@start /Fa 37 123 df<000FF000007FFC0001F80E0003E01F0007C03F000F803F000F803F00 +0F801E000F800C000F8000000F8000000F8000000F800000FFFFFF00FFFFFF000F801F000F801F +000F801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F000F80 +1F000F801F000F801F000F801F000F801F000F801F000F801F007FF0FFE07FF0FFE01B237FA21F +>12 D<387CFEFEFE7C3807077C8610>46 D<00180000780001F800FFF800FFF80001F80001F800 +01F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F800 +01F80001F80001F80001F80001F80001F80001F80001F80001F80001F8007FFFE07FFFE013207C +9F1C>49 D<03FC000FFF003C1FC07007E07C07F0FE03F0FE03F8FE03F8FE01F87C01F83803F800 +03F80003F00003F00007E00007C0000F80001F00003E0000380000700000E01801C01803801807 +00180E00380FFFF01FFFF03FFFF07FFFF0FFFFF0FFFFF015207D9F1C>I<00FE0007FFC00F07E0 +1E03F03F03F03F81F83F81F83F81F81F03F81F03F00003F00003E00007C0001F8001FE0001FF00 +0007C00001F00001F80000FC0000FC3C00FE7E00FEFF00FEFF00FEFF00FEFF00FC7E01FC7801F8 +1E07F00FFFC001FE0017207E9F1C>I<00FE0003FFC00703E00E00F01C00F01C00783C00783E00 +783F00783F80783FE0F01FF9E01FFFC00FFF8007FFC003FFE007FFF01E7FF83C1FFC7807FC7801 +FEF000FEF0003EF0001EF0001EF0001CF8001C7800383C00381F01F00FFFC001FF0017207E9F1C +>56 D<0003FE0080001FFF818000FF01E38001F8003F8003E0001F8007C0000F800F800007801F +800007803F000003803F000003807F000001807E000001807E00000180FE00000000FE00000000 +FE00000000FE00000000FE00000000FE00000000FE00000000FE000000007E000000007E000001 +807F000001803F000001803F000003801F800003000F8000030007C000060003F0000C0001F800 +380000FF00F000001FFFC0000003FE000021227DA128>67 DIII73 D77 DI80 +D82 D<01FC0407FF8C1F03FC3C007C7C003C78 +001C78001CF8000CF8000CFC000CFC0000FF0000FFE0007FFF007FFFC03FFFF01FFFF80FFFFC03 +FFFE003FFE0003FF00007F00003F00003FC0001FC0001FC0001FE0001EE0001EF0003CFC003CFF +00F8C7FFE080FF8018227DA11F>I<07FC001FFF803F07C03F03E03F01E03F01F01E01F00001F0 +0001F0003FF003FDF01FC1F03F01F07E01F0FC01F0FC01F0FC01F0FC01F07E02F07E0CF81FF87F +07E03F18167E951B>97 DI<00FF8007FFE00F83F01F03F03E03F07E03F07C01E07C0000FC0000FC0000FC0000FC0000FC +0000FC00007C00007E00007E00003E00301F00600FC0E007FF8000FE0014167E9519>I<0001FE +000001FE0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E000000 +3E0000003E0000003E0001FC3E0007FFBE000F81FE001F007E003E003E007E003E007C003E00FC +003E00FC003E00FC003E00FC003E00FC003E00FC003E00FC003E00FC003E007C003E007C003E00 +3E007E001E00FE000F83BE0007FF3FC001FC3FC01A237EA21F>I<00FE0007FF800F87C01E01E0 +3E01F07C00F07C00F8FC00F8FC00F8FFFFF8FFFFF8FC0000FC0000FC00007C00007C00007E0000 +3E00181F00300FC07003FFC000FF0015167E951A>I<003F8000FFC001E3E003C7E007C7E00F87 +E00F83C00F80000F80000F80000F80000F80000F8000FFFC00FFFC000F80000F80000F80000F80 +000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80 +000F80007FF8007FF80013237FA211>I104 D<1C003E007F007F007F003E001C000000000000000000000000000000FF +00FF001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00 +FFE0FFE00B247EA310>I108 DII<00FE0007FFC00F83E01E00F03E00F87C007C7C007C7C007CFC007E +FC007EFC007EFC007EFC007EFC007EFC007E7C007C7C007C3E00F81F01F00F83E007FFC000FE00 +17167E951C>I114 D<0FF3003FFF00781F00600700E00300E00300F00300FC00007FE0007FF8003FFE000FFF +0001FF00000F80C00780C00380E00380E00380F00700FC0E00EFFC00C7F00011167E9516>I<01 +80000180000180000180000380000380000780000780000F80003F8000FFFF00FFFF000F80000F +80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F81800F81800F81800F +81800F81800F830007C30003FE0000F80011207F9F16>IIIIII<7FFFF07FFFF07C03E07007C0600FC0E01F80C01F00C03E00 +C07E0000FC0000F80001F00003F03007E03007C0300F80701F80703F00603E00E07C03E0FFFFE0 +FFFFE014167E9519>I E /Fb 44 122 df<00FCF807839C0E079C1C07081C07001C07001C0700 +1C07001C0700FFFFE01C07001C07001C07001C07001C07001C07001C07001C07001C07001C0700 +1C07001C0700FF1FE01617809615>11 D<00FC000782000E07001C07001C02001C00001C00001C +00001C0000FFFF001C07001C07001C07001C07001C07001C07001C07001C07001C07001C07001C +07001C0700FF1FE01317809614>I<60F0F070101020204040040A7D830A>44 +D<60F0F06004047D830A>46 D<03000700FF000700070007000700070007000700070007000700 +07000700070007000700070007007FF00C157E9412>49 D<01F00608080C181C301C70006000E0 +00E3E0EC30F018F00CE00EE00EE00E600E600E300C3018183007C00F157F9412>54 +D<07E018302018600C600C700C78183E101F600FC00FF018F8607C601EC00EC006C006C004600C +38300FE00F157F9412>56 D<07C0183030186018E00CE00CE00EE00EE00E601E301E186E0F8E00 +0E000C001C70187018603020C01F800F157F9412>I<001000003800003800003800005C00005C +00005C00008E00008E00008E0001070001070003078002038002038007FFC00401C00401C00800 +E00800E01800E03800F0FE03FE17177F961A>65 D<00FC100383300E00B01C0070380030300030 +700010600010E00010E00000E00000E00000E00000E00000E00010600010700010300020380020 +1C00400E008003830000FC0014177E9619>67 D70 D<007E080381980600580C00381800183000187000 +08700008E00008E00000E00000E00000E00000E003FEE000387000387000383000381800380C00 +380600380380D8007F0817177E961C>III77 DI<00FC000303000E01C01C00E0380070300030700038600018E0001CE000 +1CE0001CE0001CE0001CE0001CE0001C7000387000383000303800701C00E00E01C003030000FC +0016177E961B>I<7FFFF860381840380840380880380480380480380400380000380000380000 +380000380000380000380000380000380000380000380000380000380000380000380007FFC016 +177F9619>84 DI87 D<1FC0386038301038003803F81E3830387038E039E039E07970FF1F1E +100E7F8D12>97 DI<07F01838303870106000E000E000E000E000600070083008183007C00D0E7F8D10> +I<007E00000E00000E00000E00000E00000E00000E00000E00000E0007CE001C3E00300E00700E +00600E00E00E00E00E00E00E00E00E00600E00700E00301E00182E0007CFC012177F9614>I<0F +C0186030307038E018FFF8E000E000E000600070083010183007C00D0E7F8D10>I<03E006700E +701C201C001C001C001C001C00FF801C001C001C001C001C001C001C001C001C001C001C001C00 +FF800C1780960B>I<0F9E18E33060707070707070306018C02F80200060003FE03FF83FFC600E +C006C006C006600C38380FE010157F8D12>II<183C3C1800000000007C1C1C1C1C1C1C1C1C1C1C1C1C +FF081780960A>I<0300078007800300000000000000000000001F800380038003800380038003 +800380038003800380038003800380038003804380E300E7007C00091D82960B>IIIII<07C018303018600C600CE00EE00EE00EE00EE00E701C3018183007C00F0E7F8D12>II<07C2001C2600381E00700E00600E +00E00E00E00E00E00E00E00E00600E00700E00301E001C2E0007CE00000E00000E00000E00000E +00000E00007FC012147F8D13>II<1F4060C0C040C040E000FF007F801FC001E080608060C060E0C09F000B +0E7F8D0E>I<080008000800180018003800FF8038003800380038003800380038003840384038 +4038401C800F000A147F930E>IIII121 +D E /Fc 1 50 df<0C003C00CC000C000C000C000C000C000C000C000C000C000C000C000C00FF +8009107E8F0F>49 D E /Fd 1 50 df<0C001C00EC000C000C000C000C000C000C000C000C000C +000C000C000C000C000C000C00FFC00A137D9211>49 D E /Fe 59 122 +df<0001FF0000001FFFC000007F80F00000FC00F80001F801F80003F803FC0007F003FC0007F0 +03FC0007F003FC0007F001F80007F000F00007F000000007F000000007F000000007F0000000FF +FFFFFC00FFFFFFFC00FFFFFFFC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC00 +07F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC +0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001 +FC007FFF1FFFC07FFF1FFFC07FFF1FFFC0222A7FA926>12 D<0001FF803FE000001FFFE3FFF800 +007F80FFF01E0000FE007F801F0001F800FF003F0003F801FF007F8007F001FE007F8007F001FE +007F8007F001FE007F8007F000FE003F0007F000FE001E0007F000FE00000007F000FE00000007 +F000FE00000007F000FE000000FFFFFFFFFFFF80FFFFFFFFFFFF80FFFFFFFFFFFF8007F000FE00 +3F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007F0 +00FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F +8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007F000 +FE003F8007F000FE003F8007F000FE003F8007F000FE003F807FFF0FFFE3FFF87FFF0FFFE3FFF8 +7FFF0FFFE3FFF8352A7FA939>14 D<1C007F007F00FF80FFC0FFC07FC07FC01CC000C000C00180 +018001800300030006000C001800300020000A157BA913>39 D45 D<1C003E007F00FF80FF80FF807F003E001C0009097B8813>I<00 +000300000007800000078000000F8000000F0000000F0000001F0000001E0000003E0000003C00 +00003C0000007C0000007800000078000000F8000000F0000001F0000001E0000001E0000003E0 +000003C0000003C0000007C00000078000000F8000000F0000000F0000001F0000001E0000003E +0000003C0000003C0000007C0000007800000078000000F8000000F0000001F0000001E0000001 +E0000003E0000003C0000003C0000007C00000078000000F8000000F0000000F0000001F000000 +1E0000001E0000003E0000003C0000007C0000007800000078000000F8000000F0000000F00000 +0060000000193C7CAC22>I<003F800001FFF00007E0FC000FC07E001F803F001F803F003F001F +803F001F807F001FC07F001FC07F001FC07F001FC0FF001FE0FF001FE0FF001FE0FF001FE0FF00 +1FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF +001FE07F001FC07F001FC07F001FC07F001FC03F001F803F001F801F803F001F803F000FC07E00 +07E0FC0001FFF000003F80001B277DA622>I<000E00001E00007E0007FE00FFFE00FFFE00F8FE +0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE +0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE +0000FE0000FE0000FE007FFFFE7FFFFE7FFFFE17277BA622>I<00FF800003FFF0000FFFFC001F +03FE003800FF007C007F80FE003FC0FF003FC0FF003FE0FF001FE0FF001FE07E001FE03C003FE0 +00003FE000003FC000003FC000007F8000007F000000FE000000FC000001F8000003F0000003E0 +0000078000000F0000001E0000003C00E0007000E000E000E001C001C0038001C0070001C00FFF +FFC01FFFFFC03FFFFFC07FFFFFC0FFFFFF80FFFFFF80FFFFFF801B277DA622>I<007F800003FF +F00007FFFC000F81FE001F00FF003F80FF003F807F803F807F803F807F801F807F800F007F8000 +00FF000000FF000000FE000001FC000001F8000007F00000FFC00000FFF0000001FC0000007E00 +00007F0000007F8000003FC000003FC000003FE000003FE03C003FE07E003FE0FF003FE0FF003F +E0FF003FC0FF007FC07E007F807C007F003F01FE001FFFFC0007FFF00000FF80001B277DA622> +I<00000E0000001E0000003E0000007E000000FE000000FE000001FE000003FE0000077E00000E +7E00000E7E00001C7E0000387E0000707E0000E07E0000E07E0001C07E0003807E0007007E000E +007E000E007E001C007E0038007E0070007E00E0007E00FFFFFFF8FFFFFFF8FFFFFFF80000FE00 +0000FE000000FE000000FE000000FE000000FE000000FE000000FE00007FFFF8007FFFF8007FFF +F81D277EA622>I<0C0003000F803F000FFFFE000FFFFC000FFFF8000FFFF0000FFFE0000FFFC0 +000FFE00000E0000000E0000000E0000000E0000000E0000000E0000000E7FC0000FFFF8000F80 +FC000E003E000C003F0000001F8000001FC000001FC000001FE000001FE018001FE07C001FE0FE +001FE0FE001FE0FE001FE0FE001FC0FC001FC078003F8078003F803C007F001F01FE000FFFF800 +03FFF00000FF80001B277DA622>I<0007F000003FFC0000FFFE0001FC0F0003F01F8007E03F80 +0FC03F801FC03F801F803F803F801F003F8000007F0000007F0000007F000000FF000000FF0FC0 +00FF3FF800FF707C00FFC03E00FFC03F00FF801F80FF801FC0FF001FC0FF001FE0FF001FE0FF00 +1FE07F001FE07F001FE07F001FE07F001FE03F001FE03F001FC01F801FC01F803F800FC03F0007 +E07E0003FFFC0000FFF000003FC0001B277DA622>I<380000003E0000003FFFFFF03FFFFFF03F +FFFFF07FFFFFE07FFFFFC07FFFFF807FFFFF0070000E0070000E0070001C00E0003800E0007000 +E000E0000000E0000001C000000380000007800000078000000F0000000F0000001F0000001F00 +00003F0000003E0000003E0000007E0000007E0000007E0000007E000000FE000000FE000000FE +000000FE000000FE000000FE000000FE000000FE0000007C0000003800001C297CA822>I<003F +C00001FFF00003FFFC0007C07E000F003F001E001F001E000F803E000F803E000F803F000F803F +000F803FC00F003FF01F001FFC1E001FFE3C000FFFF80007FFE00003FFF80001FFFC0001FFFE00 +07FFFF000F0FFF801E03FFC03C01FFC07C007FE078001FE0F80007E0F80007E0F80003E0F80003 +E0F80003E0F80003C07C0003C07C0007803F000F001FC03E000FFFFC0003FFF800007FC0001B27 +7DA622>I<007F800001FFF00007FFF8000FE0FC001F807E003F803F007F003F007F001F80FF00 +1F80FF001FC0FF001FC0FF001FC0FF001FE0FF001FE0FF001FE0FF001FE07F001FE07F003FE03F +003FE01F807FE00F807FE007C1DFE003FF9FE0007E1FE000001FE000001FC000001FC000001FC0 +00003F801F003F803F803F003F803F003F807E003F807C001F01F8001E03F0000FFFE00007FF80 +0001FE00001B277DA622>I<01FF000FFFE01E03F03801F87801FCFC01FEFE01FEFE01FEFE01FE +7C01FE3801FC0003F80007F00007C0000F80001F00001E00003C00003800003800007800007000 +00700000700000700000700000700000000000000000000000000000000000000000700000F800 +01FC0003FE0003FE0003FE0001FC0000F800007000172A7CA920>63 D<000003800000000007C0 +0000000007C0000000000FE0000000000FE0000000000FE0000000001FF0000000001FF0000000 +003FF8000000003FF8000000003FF80000000073FC0000000073FC00000000F3FE00000000E1FE +00000000E1FE00000001C0FF00000001C0FF00000003C0FF80000003807F80000007807FC00000 +07003FC0000007003FC000000E003FE000000E001FE000001E001FF000001C000FF000001FFFFF +F000003FFFFFF800003FFFFFF80000780007FC0000700003FC0000700003FC0000E00001FE0000 +E00001FE0001E00001FF0001C00000FF0001C00000FF00FFFE001FFFFEFFFE001FFFFEFFFE001F +FFFE2F297EA834>65 DI<00003FF001800003FFFE +0380000FFFFF8780003FF007DF8000FF8001FF8001FE00007F8003FC00003F8007F000001F800F +F000000F801FE0000007801FE0000007803FC0000007803FC0000003807FC0000003807F800000 +03807F8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF +8000000000FF8000000000FF8000000000FF80000000007F80000000007F80000000007FC00000 +03803FC0000003803FC0000003801FE0000003801FE0000007000FF00000070007F000000E0003 +FC00001E0001FE00003C0000FF8000F800003FF007E000000FFFFFC0000003FFFF000000003FF8 +000029297CA832>II70 D<00007FE003000003FFFC0700001FFFFF0F00003FF00FFF0000FF8001FF0001FE +0000FF0003F800003F0007F000003F000FF000001F001FE000000F001FE000000F003FC000000F +003FC0000007007FC0000007007F80000007007F8000000000FF8000000000FF8000000000FF80 +00000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8001FFFF +F87F8001FFFFF87F8001FFFFF87FC00000FF003FC00000FF003FC00000FF001FE00000FF001FE0 +0000FF000FF00000FF0007F00000FF0003F80000FF0001FE0000FF0000FF8001FF00003FF007BF +00001FFFFF1F000003FFFE0F0000007FF003002D297CA836>III76 +DII<0000FFE000000007FFFC0000003FC07F8000007F001FC00001FC0007F00003F80003F8 +0007F00001FC000FF00001FE001FE00000FF001FE00000FF003FC000007F803FC000007F807FC0 +00007FC07F8000003FC07F8000003FC07F8000003FC0FF8000003FE0FF8000003FE0FF8000003F +E0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF80 +00003FE07F8000003FC07FC000007FC07FC000007FC03FC000007F803FC000007F801FE00000FF +001FE00000FF000FF00001FE0007F00001FC0003F80003F80001FC0007F00000FF001FE000003F +C07F8000000FFFFE00000000FFE000002B297CA834>I +I82 D<007F806003FFF0E007FFF9E00F807FE01F00 +1FE03E0007E07C0003E07C0001E0FC0001E0FC0001E0FC0000E0FE0000E0FE0000E0FF000000FF +C000007FFE00007FFFE0003FFFFC001FFFFE000FFFFF8007FFFFC003FFFFE000FFFFE00007FFF0 +00007FF000000FF8000007F8000003F8600001F8E00001F8E00001F8E00001F8F00001F0F00001 +F0F80003F0FC0003E0FF0007C0FFE01F80F3FFFF00E0FFFE00C01FF0001D297CA826>I<7FFFFF +FFFFC07FFFFFFFFFC07FFFFFFFFFC07F803FC03FC07E003FC007C078003FC003C078003FC003C0 +70003FC001C0F0003FC001E0F0003FC001E0E0003FC000E0E0003FC000E0E0003FC000E0E0003F +C000E0E0003FC000E000003FC0000000003FC0000000003FC0000000003FC0000000003FC00000 +00003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003F +C0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC00000 +00003FC0000000003FC0000000003FC0000000003FC00000007FFFFFE000007FFFFFE000007FFF +FFE0002B287EA730>IIII<01FF80 +0007FFF0000F81F8001FC07E001FC07E001FC03F000F803F8007003F8000003F8000003F800000 +3F80000FFF8000FFFF8007FC3F800FE03F803F803F803F003F807F003F80FE003F80FE003F80FE +003F80FE003F807E007F807F00DF803F839FFC0FFF0FFC01FC03FC1E1B7E9A21>97 +DI<001FF80000FFFE0003F01F0007E03F80 +0FC03F801F803F803F801F007F800E007F0000007F000000FF000000FF000000FF000000FF0000 +00FF000000FF000000FF0000007F0000007F0000007F8000003F8001C01F8001C00FC0038007E0 +070003F01E0000FFFC00001FE0001A1B7E9A1F>I<00003FF80000003FF80000003FF800000003 +F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8000000 +03F800000003F800000003F800000003F800001FE3F80000FFFBF80003F03FF80007E00FF8000F +C007F8001F8003F8003F8003F8007F0003F8007F0003F8007F0003F800FF0003F800FF0003F800 +FF0003F800FF0003F800FF0003F800FF0003F800FF0003F8007F0003F8007F0003F8007F0003F8 +003F8003F8001F8003F8000F8007F80007C00FF80003F03BFF8000FFF3FF80003FC3FF80212A7E +A926>I<003FE00001FFF80003F07E0007C01F000F801F801F800F803F800FC07F000FC07F0007 +C07F0007E0FF0007E0FF0007E0FFFFFFE0FFFFFFE0FF000000FF000000FF0000007F0000007F00 +00007F0000003F8000E01F8000E00FC001C007E0038003F81F0000FFFE00001FF0001B1B7E9A20 +>I<0007F0003FFC00FE3E01F87F03F87F03F07F07F07F07F03E07F00007F00007F00007F00007 +F00007F00007F000FFFFC0FFFFC0FFFFC007F00007F00007F00007F00007F00007F00007F00007 +F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007 +F0007FFF807FFF807FFF80182A7EA915>I<00FF81F003FFE7F80FC1FE7C1F80FC7C1F007C383F +007E107F007F007F007F007F007F007F007F007F007F007F007F003F007E001F007C001F80FC00 +0FC1F8001FFFE00018FF800038000000380000003C0000003E0000003FFFF8001FFFFF001FFFFF +800FFFFFC007FFFFE01FFFFFF03E0007F07C0001F8F80000F8F80000F8F80000F8F80000F87C00 +01F03C0001E01F0007C00FC01F8003FFFE00007FF0001E287E9A22>II<07000F801FC03FE03FE03FE01FC00F800700000000000000000000 +0000000000FFE0FFE0FFE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0 +0FE00FE00FE00FE00FE00FE00FE0FFFEFFFEFFFE0F2B7DAA14>I107 DIII<003FE00001FFFC0003F07E000FC01F801F800FC03F800FE03F0007E07F00 +07F07F0007F07F0007F0FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF +0007F87F0007F07F0007F03F800FE03F800FE01F800FC00FC01F8007F07F0001FFFC00003FE000 +1D1B7E9A22>II114 D<03FE300FFFF01E03F03800F070 +0070F00070F00070F80070FC0000FFE0007FFE007FFF803FFFE01FFFF007FFF800FFF80003FC00 +00FC60007CE0003CF0003CF00038F80038FC0070FF01E0F7FFC0C1FF00161B7E9A1B>I<007000 +00700000700000700000F00000F00000F00001F00003F00003F00007F0001FFFF0FFFFF0FFFFF0 +07F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F000 +07F03807F03807F03807F03807F03807F03803F03803F87001F86000FFC0001F8015267FA51B> +IIIIII E /Ff 17 121 df<00001E000000003E00000000FE +00000003FE0000003FFE0000FFFFFE0000FFFFFE0000FFFFFE0000FFCFFE0000000FFE0000000F +FE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE000000 +0FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000 +000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE00 +00000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE +0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000F +FE0000000FFE0000000FFE00007FFFFFFFC07FFFFFFFC07FFFFFFFC07FFFFFFFC0223879B731> +49 D<0007FE0000007FFFE00001FFFFF80003FFFFFE0007F01FFF000F8007FF801F0001FFC03E +0000FFE07F8000FFF07FC0007FF0FFE0007FF8FFF0003FF8FFF0003FFCFFF0003FFCFFF0003FFC +FFF0003FFC7FE0003FFC3FC0003FFC1F80003FFC0000003FFC0000003FF80000007FF80000007F +F00000007FF0000000FFE0000000FFC0000001FF80000001FF00000003FE00000007FC00000007 +F80000000FF00000001FC00000003F800000007F00000000FC00000001F800000001F0003C0003 +E0003C0007C0003C000F000078001E000078003C00007800780000F800F00000F801FFFFFFF803 +FFFFFFF007FFFFFFF00FFFFFFFF01FFFFFFFF03FFFFFFFF07FFFFFFFF0FFFFFFFFF0FFFFFFFFE0 +FFFFFFFFE0FFFFFFFFE026387BB731>I<0003FF8000001FFFF000007FFFFE0000FE03FF0001F0 +00FF8003C000FFC00780007FE00FF0007FF00FF8007FF01FFC007FF81FFE007FF81FFE007FF81F +FE007FF81FFE007FF81FFE007FF80FFC007FF007F8007FF003F0007FF0000000FFE0000000FFC0 +000001FF80000001FF00000003FE00000007FC0000001FF000000FFFC000000FFF8000000FFFF8 +00000003FE00000000FF800000007FE00000003FF00000003FF80000003FFC0000001FFC000000 +1FFE0000001FFE0200001FFF1FC0001FFF3FE0001FFF7FF0001FFF7FF0001FFFFFF8001FFFFFF8 +001FFFFFF8001FFEFFF8001FFEFFF0001FFE7FF0003FFC7FE0003FFC3FC0003FF81F80007FF01F +E000FFE007FC03FFC003FFFFFF0001FFFFFE00003FFFF0000007FF800028397CB731>I<000000 +07C0000000000FC0000000000FC0000000001FC0000000003FC0000000007FC000000000FFC000 +000000FFC000000001FFC000000003FFC000000007FFC00000000FFFC00000000FFFC00000001E +FFC00000003CFFC00000007CFFC0000000F8FFC0000000F0FFC0000001E0FFC0000003C0FFC000 +0007C0FFC000000F80FFC000000F00FFC000001E00FFC000003C00FFC000007C00FFC00000F800 +FFC00000F000FFC00001E000FFC00003C000FFC00007C000FFC0000F8000FFC0000F0000FFC000 +1E0000FFC0003C0000FFC0007C0000FFC000F80000FFC000FFFFFFFFFFC0FFFFFFFFFFC0FFFFFF +FFFFC0FFFFFFFFFFC0000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000 +000001FFC000000001FFC000000001FFC000000001FFC000000001FFC0000007FFFFFFC00007FF +FFFFC00007FFFFFFC00007FFFFFFC02A377DB631>I<00000001F80000000000000001F8000000 +0000000003FC0000000000000003FC0000000000000007FE0000000000000007FE000000000000 +0007FE000000000000000FFF000000000000000FFF000000000000001FFF800000000000001FFF +800000000000001FFF800000000000003FFFC00000000000003FFFC00000000000007FFFE00000 +000000007DFFE00000000000007DFFE0000000000000FDFFF0000000000000F8FFF00000000000 +01F8FFF8000000000001F07FF8000000000001F07FF8000000000003F07FFC000000000003E03F +FC000000000007E03FFE000000000007C01FFE00000000000FC01FFF00000000000F801FFF0000 +0000000F800FFF00000000001F800FFF80000000001F0007FF80000000003F0007FFC000000000 +3E0003FFC0000000003E0003FFC0000000007E0003FFE0000000007C0001FFE000000000FC0001 +FFF000000000F80000FFF000000000F80000FFF000000001FFFFFFFFF800000001FFFFFFFFF800 +000003FFFFFFFFFC00000003FFFFFFFFFC00000003E000003FFC00000007E000003FFE00000007 +C000001FFE0000000FC000001FFF0000000F8000000FFF0000001F8000000FFF8000001F000000 +0FFF8000001F00000007FF8000003F00000007FFC000003E00000003FFC000007E00000003FFE0 +0000FF00000001FFE000FFFFFC0001FFFFFFF0FFFFFC0001FFFFFFF0FFFFFC0001FFFFFFF0FFFF +FC0001FFFFFFF0443B7DBA4B>65 DI<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 D120 D E /Fg 1 98 df<00200000700000700000700000B80000B80000B800011C +00011C00011C00020E00020E0004070004070007FF000803800803800803801801C03803C0FE0F +F815157F9419>97 D E /Fh 36 122 df<0001FC000703000C03001C07001C0300180000380000 +380000380000380000700007FFFC00701C00701C00701C00E03800E03800E03800E03800E07001 +C07001C07001C07001C0E201C0E201C0E20380E4038064038038038000030000070000060000C6 +0000E40000CC00007000001825819C17>12 D<183C3C3C0404080810204080060C779C0D>39 +D<0000180000001800000038000000380000007800000078000000B8000001B800000138000002 +380000023C0000041C0000041C0000081C0000181C0000101C0000201C0000201C00007FFC0000 +401C0000801C0001801C0001001C0002001C0002001C0004000E000C000E001C001E00FF00FFC0 +1A1D7E9C1F>65 D<0003F020001E0C60003002E000E003C001C001C0038001C0070000C00E0000 +801E0000801C0000803C0000803C000000780000007800000078000000F0000000F0000000F000 +0000F0000000F0000400F0000400F0000400F0000800700008007000100038002000180040000C +0180000706000001F800001B1E7A9C1E>67 D<01FFFFC0003C01C0003800C00038008000380080 +003800800070008000700080007020800070200000E0400000E0400000E0C00000FFC00001C080 +0001C0800001C0800001C080000381000003800000038000000380000007000000070000000700 +0000070000000F000000FFF000001A1C7D9B1B>70 D<01FFCFFE003C01E0003801C0003801C000 +3801C0003801C00070038000700380007003800070038000E0070000E0070000E0070000FFFF00 +01C00E0001C00E0001C00E0001C00E0003801C0003801C0003801C0003801C0007003800070038 +0007003800070038000F007800FFE7FF001F1C7D9B1F>72 D<01FFC0003C000038000038000038 +0000380000700000700000700000700000E00000E00000E00000E00001C00001C00001C00001C0 +000380000380000380000380000700000700000700000700000F0000FFE000121C7E9B10>I<00 +7FF0000780000700000700000700000700000E00000E00000E00000E00001C00001C00001C0000 +1C0000380000380000380000380000700000700000700000700060E000E0E000C0C00081C00083 +80004700003C0000141D7B9B16>I<01FE0007F8003E000780002E000F00002E001700002E0017 +00002E002700004E002E00004E004E00004E004E00004E008E00008E011C00008E011C00008E02 +1C00008E021C000107043800010704380001070838000107103800020710700002072070000207 +2070000207407000040740E000040780E000040700E0000C0700E0001C0601E000FF861FFC0025 +1C7D9B25>77 D<01FFFC00003C070000380380003801C0003801C0003801C0007003C0007003C0 +007003C00070038000E0078000E0070000E00E0000E0380001FFE00001C0000001C0000001C000 +0003800000038000000380000003800000070000000700000007000000070000000F000000FFE0 +00001A1C7D9B1C>80 D<000F8400304C00403C0080180100180300180300180600100600100600 +0007000007000003E00003FC0001FF00007F800007C00001C00001C00000C00000C02000C02000 +C0600180600180600300600200F00400CC180083E000161E7D9C17>83 D<1FFFFFC01C0701C030 +0E00C0200E0080600E0080400E0080401C0080801C0080801C0080001C00000038000000380000 +00380000003800000070000000700000007000000070000000E0000000E0000000E0000000E000 +0001C0000001C0000001C0000001C0000003C000007FFE00001A1C799B1E>I<7FF0FF800F001C +000E0018000E0010000E0010000E0010001C0020001C0020001C0020001C002000380040003800 +4000380040003800400070008000700080007000800070008000E0010000E0010000E0010000E0 +020000E0020000E0040000E00400006008000030300000104000000F800000191D779B1F>I87 +D<03CC063C0C3C181C3838303870387038E070E070E070E070E0E2C0E2C0E261E462643C380F12 +7B9115>97 D<3F00070007000E000E000E000E001C001C001C001C0039C03E6038303830703870 +3870387038E070E070E070E060E0E0C0C0C1C0618063003C000D1D7B9C13>I<01F007080C0818 +1C3838300070007000E000E000E000E000E000E008E010602030C01F000E127B9113>I<001F80 +000380000380000700000700000700000700000E00000E00000E00000E0003DC00063C000C3C00 +181C00383800303800703800703800E07000E07000E07000E07000E0E200C0E200C0E20061E400 +6264003C3800111D7B9C15>I<01E007100C1018083810701070607F80E000E000E000E000E000 +E0086010602030C01F000D127B9113>I<0003C0000670000C70001C60001C00001C0000380000 +380000380000380000380003FF8000700000700000700000700000700000E00000E00000E00000 +E00000E00001C00001C00001C00001C00001C000038000038000038000030000030000070000C6 +0000E60000CC00007800001425819C0D>I<00F3018F030F06070E0E0C0E1C0E1C0E381C381C38 +1C381C383830383038187818F00F700070007000E000E0C0C0E1C0C3007E00101A7D9113>I<0F +C00001C00001C0000380000380000380000380000700000700000700000700000E78000E8C000F +0E000E0E001C0E001C0E001C0E001C0E00381C00381C00381C0038380070388070388070708070 +7100E03200601C00111D7D9C15>I<01800380010000000000000000000000000000001C002600 +470047008E008E000E001C001C001C0038003800710071007100720072003C00091C7C9B0D>I< +0FC00001C00001C0000380000380000380000380000700000700000700000700000E0F000E1100 +0E23800E43801C83001C80001D00001E00003F800039C00038E00038E00070E20070E20070E200 +70E400E06400603800111D7D9C13>107 D<1F800380038007000700070007000E000E000E000E +001C001C001C001C0038003800380038007000700070007000E400E400E400E40068003800091D +7C9C0B>I<3C1E0780266318C04683A0E04703C0E08E0380E08E0380E00E0380E00E0380E01C07 +01C01C0701C01C0701C01C070380380E0388380E0388380E0708380E0710701C0320300C01C01D +127C9122>I<3C3C002646004687004707008E07008E07000E07000E07001C0E001C0E001C0E00 +1C1C00381C40381C40383840383880701900300E0012127C9117>I<01E007180C0C180C380C30 +0E700E700EE01CE01CE01CE018E038E030E06060C031801E000F127B9115>I<07870004D98008 +E0C008E0C011C0E011C0E001C0E001C0E00381C00381C00381C003818007038007030007070007 +06000E8C000E70000E00000E00001C00001C00001C00001C00003C0000FF8000131A7F9115>I< +3C3C26C2468747078E068E000E000E001C001C001C001C0038003800380038007000300010127C +9112>114 D<01F006080C080C1C18181C001F001FC00FF007F0007800386030E030C030806060 +C01F000E127D9111>I<00C001C001C001C00380038003800380FFE00700070007000E000E000E +000E001C001C001C001C00384038403840388019000E000B1A7D990E>I<1E0300270700470700 +470700870E00870E000E0E000E0E001C1C001C1C001C1C001C1C00383880383880183880183900 +1C5900078E0011127C9116>I<1E01832703874703874703838707018707010E07010E07011C0E +021C0E021C0E021C0E04180C04181C04181C081C1C100C263007C3C018127C911C>119 +D<070E0019910010E38020E38041C30041C00001C00001C0000380000380000380000380000702 +00670200E70400CB04008B080070F00011127D9113>I<1E03270747074707870E870E0E0E0E0E +1C1C1C1C1C1C1C1C38383838183818381C7007F00070007000E0E0C0E1C0818047003C00101A7C +9114>I E /Fi 91 127 df<60F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0600000000060F0F0600419 +779816>33 DI<00C00001 +C00001C00001C00007F0001FFC003FFE007DCF0071C780E1C380E1C780E1C780F1C30079C0003F +C0001FF00007FC0001FE0001CF0001C70061C380F1C380F1C380E1C38071C70079DF003FFE001F +F80007E00001C00001C00000C00011207E9C16>36 D<03800007E0000FE0001E70001C70001C70 +001C70001C77E01CE7E01DE7E00FC7000F8E000F0E001E0E003F1C007F1C00739C00E3F800E1F8 +00E0F1C0E0F1C071F9C07FFFC03F9F801E070013197F9816>38 D<30787C3C1C1C1C1C3878F0E0 +40060D789816>I<00E001E0038007000E001C001C0038003800700070007000E000E000E000E0 +00E000E000E000E000E000700070007000380038001C001C000E000700038001E000E00B217A9C +16>II<01C0 +0001C00001C00001C00071C700F9CF807FFF001FFC0007F00007F0001FFC007FFF00F9CF8071C7 +0001C00001C00001C00001C00011127E9516>I<01C00001C00001C00001C00001C00001C00001 +C00001C000FFFF80FFFF80FFFF8001C00001C00001C00001C00001C00001C00001C00001C00011 +137E9516>I<387C7E7E3E0E1E1C78F060070B798416>II< +70F8F8F8700505788416>I<000180000380000380000700000700000E00000E00001C00001C00 +00380000380000700000700000E00000E00001C00001C0000380000380000700000700000E0000 +0E00001C00001C0000380000380000700000700000E00000E00000C0000011207E9C16>I<03E0 +000FF8001FFC001E3C00380E00780F00700700700700E00380E00380E00380E00380E00380E003 +80E00380E00380F00780700700700700780F003C1E001E3C001FFC000FF80003E00011197E9816 +>I<01800380038007800F807F80FF807380038003800380038003800380038003800380038003 +800380038003807FF87FFC7FF80E197C9816>I<07E0001FF8003FFC00783E00E00700F00780F0 +0380600380000380000380000700000700000E00001C0000380000700000E00001C0000380000F +00001E03803803807FFF80FFFF807FFF8011197E9816>I<07E0001FF8003FFC00781E00780700 +300700000700000700000E00003E0007FC0007F00007FC00001E00000700000300000380000380 +600380F00380E00700781E003FFC001FF80007E00011197E9816>I<007C0000FC0000DC0001DC +00039C00039C00071C000F1C000E1C001E1C003C1C00381C00781C00F01C00FFFFE0FFFFE0FFFF +E0001C00001C00001C00001C00001C0001FFC001FFC001FFC013197F9816>I<3FFE003FFE003F +FE003800003800003800003800003800003800003800003BF0003FFC003FFE003C0F0030070000 +0380000380600380F00380F00380E00700781E003FFC001FF80007E00011197E9816>I<00F800 +03FC0007FE000F07001C0F00380F00780600700000700000E3F800EFFC00FFFE00F80F00F00700 +F00380E00380E003807003807003807007803807003C1E001FFC000FF80003E00011197E9816> +II<07F0001FFC003FFE007C1F00F00780E00380E00380E003807007007C1F001F +FC0007F0001FFC003C1E00700700F00780E00380E00380E00380F007807007007C1F003FFE001F +FC0007F00011197E9816>I<03E0000FF8001FFC003C1E00700E00700700E00700E00780E00380 +E00380E00780700780780F803FFF801FFB800FE380000700000700300700780E00781C00707800 +3FF0001FE0000F800011197E9816>I<70F8F8F870000000000000000070F8F8F8700512789116> +I<387C7C7C38000000000000000038787C7C3C1C1C3870E0400618799116>I<00018000078000 +1F80003E0000F80001F00007C0000F80003E0000FC0000F00000FC00003E00000F800007C00001 +F00000F800003E00001F8000078000018011157E9616>I<7FFF00FFFF80FFFF80000000000000 +000000000000000000FFFF80FFFF807FFF00110B7E9116>II<0FE03FF87FFCF01EF00EF00E601E003C007800F001C0 +038003800380038003800300000000000000000003000780078003000F197D9816>I<00F80003 +FC0007FE000F07001C3F80387F8078FF8071C3C071C3C0E381C0E381C0E381C0E381C0E381C0E3 +81C0E381C071C38071C38078FF00387E001C3C000F03C007FFC003FF0000FC0012197E9816>I< +00E00001F00001F00001B00001B00003B80003B80003B800031800071C00071C00071C00071C00 +071C000E0E000E0E000FFE000FFE001FFF001C07001C07001C07007F1FC0FF1FE07F1FC013197F +9816>I<7FF800FFFE007FFF001C0F001C07801C03801C03801C03801C07801C07001FFF001FFE +001FFE001C1F001C03801C03C01C01C01C01C01C01C01C01C01C03C01C07807FFF80FFFF007FFC +0012197F9816>I<01F18007FB800FFF801F0F803C0780380380700380700380F00000E00000E0 +0000E00000E00000E00000E00000E00000F000007003807003803803803C07001F0F000FFE0007 +FC0001F00011197E9816>I<7FF800FFFE007FFF001C0F001C07801C03C01C01C01C01C01C01E0 +1C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C01C01C01C01C03C01C07801C0F80 +7FFF00FFFE007FF8001319809816>I<7FFFC0FFFFC07FFFC01C01C01C01C01C01C01C01C01C00 +001C00001C1C001C1C001FFC001FFC001FFC001C1C001C1C001C00001C00E01C00E01C00E01C00 +E01C00E07FFFE0FFFFE07FFFE013197F9816>II<03E30007FF000FFF001E1F003C0F00 +380700700700700700F00000E00000E00000E00000E00000E03F80E07FC0E03F80F00700700700 +700700380F003C0F001E1F000FFF0007F70003E70012197E9816>I<7F1FC0FFBFE07F1FC01C07 +001C07001C07001C07001C07001C07001C07001FFF001FFF001FFF001C07001C07001C07001C07 +001C07001C07001C07001C07001C07007F1FC0FFBFE07F1FC013197F9816>II<07FE07FF07FE00380038003800380038003800380038003800380038 +003800380038003800386038F038F0707FF07FE01F8010197D9816>I<7F0FE0FF8FF07F0FE01C +07801C0F001C0E001C1C001C3C001C78001CF0001CE0001DF0001FF0001FF8001F38001E1C001C +1C001C0E001C0E001C07001C07001C03807F07E0FF8FF07F07E01419809816>III<7E1FC0FF3FE07F1FC01D07001D87001D87001D87001DC7001DC7001CC7001CC7001CE7001C +E7001CE7001C67001C67001C77001C77001C37001C37001C37001C17007F1F00FF9F007F0F0013 +197F9816>I<1FFC003FFE007FFF00780F00F00780E00380E00380E00380E00380E00380E00380 +E00380E00380E00380E00380E00380E00380E00380E00380F00780F00780780F007FFF003FFE00 +1FFC0011197E9816>I<7FF800FFFE007FFF001C0F801C03801C03C01C01C01C01C01C01C01C03 +C01C03801C0F801FFF001FFE001FF8001C00001C00001C00001C00001C00001C00001C00007F00 +00FF80007F000012197F9816>I<1FFC003FFE007FFF00780F00F00780E00380E00380E00380E0 +0380E00380E00380E00380E00380E00380E00380E00380E00380E00380E0E380E1E380F0F78078 +7F007FFF003FFE001FFC00001C00001E00000E00000F00000700000700111F7E9816>I<7FE000 +FFF8007FFC001C1E001C0F001C07001C07001C07001C07001C0F001C1E001FFC001FF8001FFC00 +1C1C001C0E001C0E001C0E001C0E001C0E201C0E701C0E707F07E0FF87E07F03C014197F9816> +I<07E3001FFF003FFF00781F00F00700E00700E00700E00000F000007800003F80001FF00007FC +0000FE00000F00000700000380000380600380E00380E00700F80F00FFFE00FFFC00C7F0001119 +7E9816>I<7FFFE0FFFFE0FFFFE0E0E0E0E0E0E0E0E0E0E0E0E000E00000E00000E00000E00000 +E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00007FC000FFE0007 +FC0013197F9816>I<7F07F0FF8FF87F07F01C01C01C01C01C01C01C01C01C01C01C01C01C01C0 +1C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C00E03800E038007070007FF00 +03FE0000F8001519809816>III<7F1F807F3F807F1F800E1E000E1C00073C00 +07380003B80003F00001F00001E00000E00001E00001F00003F00003B80007B800071C00071C00 +0E0E000E0E001C07007F1FC0FF1FE07F1FC013197F9816>II<7FFF80FFFF80FFFF80E0 +0700E00F00E01E00E01C00003C0000780000700000F00001E00001C00003C0000780000700000F +00001E03801C03803C0380780380700380FFFF80FFFF80FFFF8011197E9816>IIII<03000F803FE0FDF8F07840100D067C9816>II< +081C3C7870E0E0E0E0F0F87830060D789B16>I<1FE0003FF0007FF800783C00300E00000E0000 +0E0003FE001FFE003E0E00700E00E00E00E00E00E00E00783E007FFFE03FE7E00F83E013127E91 +16>I<7E0000FE00007E00000E00000E00000E00000E00000E3E000EFF000FFF800F83C00F00E0 +0E00E00E00700E00700E00700E00700E00700E00700E00E00F01E00F83C00FFF800EFF00063C00 +1419809816>I<03F80FFC1FFE3C1E780C7000E000E000E000E000E000F000700778073E0E1FFC +0FF803F010127D9116>I<003F00007F00003F0000070000070000070000070003C7000FF7001F +FF003C1F00780F00700700E00700E00700E00700E00700E00700E00700700F00700F003C1F001F +FFE00FE7F007C7E014197F9816>I<03E00FF81FFC3C1E780E7007E007FFFFFFFFFFFFE000E000 +700778073C0F1FFE0FFC03F010127D9116>I<001F00007F8000FF8001E78001C30001C00001C0 +007FFF00FFFF00FFFF0001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0 +0001C00001C0003FFE007FFF003FFE0011197F9816>I<03E3C007F7E00FFFE01C1CC0380E0038 +0E00380E00380E00380E001C1C000FF8001FF0001BE0003800001800001FFC001FFF003FFF8078 +03C0E000E0E000E0E000E0E000E07001C07C07C03FFF800FFE0003F800131C7F9116>I<7E0000 +FE00007E00000E00000E00000E00000E00000E3C000EFE000FFF000F87800F03800E03800E0380 +0E03800E03800E03800E03800E03800E03800E03800E03807FC7F0FFE7F87FC7F01519809816> +I<018003C003C0018000000000000000007FC07FC07FC001C001C001C001C001C001C001C001C0 +01C001C001C001C07FFFFFFF7FFF101A7D9916>I<003000780078003000000000000000001FF8 +1FF81FF80038003800380038003800380038003800380038003800380038003800380038003800 +3800386070F0F0FFE07FC03F800D237E9916>I<7E0000FE00007E00000E00000E00000E00000E +00000E7FE00E7FE00E7FE00E0F000E1E000E3C000E78000EF0000FF0000FF8000FBC000F1E000E +0E000E07000E07807F87F0FFCFF07F87F01419809816>III<7E3C00FEFE007FFF000F87800F03800E03800E03800E03800E03800E +03800E03800E03800E03800E03800E03807FC7F0FFE7F87FC7F01512809116>I<03E0000FF800 +1FFC003C1E00780F00700700E00380E00380E00380E00380E00380F00780700700780F003C1E00 +1FFC000FF80003E00011127E9116>I<7E3E00FEFF007FFF800F83C00F00E00E00E00E00700E00 +700E00700E00700E00700E00700E00E00F01E00F83C00FFF800EFF000E3C000E00000E00000E00 +000E00000E00000E00007FC000FFE0007FC000141B809116>I<07C7000FE7001FF7003C1F0070 +0F00700F00E00700E00700E00700E00700E00700E00700700F00700F003C3F003FF7001FE70007 +C700000700000700000700000700000700000700003FE0007FF0003FE0141B7E9116>II<0FEC3FFC7FFCF03CE01CE01C70007F801FF007F8 +003C600EE00EF00EF81EFFFCFFF8C7E00F127D9116>I<0300000700000700000700000700007F +FF00FFFF00FFFF0007000007000007000007000007000007000007000007010007038007038007 +038007870003FE0001FC0000F80011177F9616>I<7E1F80FE3F807E1F800E03800E03800E0380 +0E03800E03800E03800E03800E03800E03800E03800E03800E0F800FFFF007FBF803E3F0151280 +9116>I<7F1FC0FF1FE07F1FC01C07001E0F000E0E000E0E000E0E00071C00071C00071C00071C +0003B80003B80003B80001F00001F00000E00013127F9116>II<7F1FC07F3FC07F1FC00F1C00073C0003B80003F00001F00000E00001E000 +01F00003B800073C00071C000E0E007F1FC0FF3FE07F1FC013127F9116>I<7F1FC0FF9FE07F1F +C01C07000E07000E0E000E0E00070E00071C00071C00039C00039C0003980001B80001B80000F0 +0000F00000F00000E00000E00000E00001C00079C0007BC0007F80003F00003C0000131B7F9116 +>I<001F80007F8000FF8001E00001C00001C00001C00001C00001C00001C00001C00001C00001 +C00003C0007F8000FF0000FF00007F800003C00001C00001C00001C00001C00001C00001C00001 +C00001C00001C00001E00000FF80007F80001F8011207E9C16>123 DI<7C0000FF0000FF800003 +C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001E00000FF00007F8000 +7F8000FF0001E00001C00001C00001C00001C00001C00001C00001C00001C00001C00003C000FF +8000FF00007C000011207E9C16>I<1C303F78FFF8F7E061C00D057C9816>I +E /Fj 8 111 df<60F0F06004047C830C>58 D<0000038000000F0000003C000000F0000003C0 +00000F0000003C000000F0000003C000000F0000003C000000F0000000F00000003C0000000F00 +000003C0000000F00000003C0000000F00000003C0000000F00000003C0000000F000000038019 +187D9520>60 D62 +D<00000C0000000C0000001C0000001C0000003C0000007C0000005C0000009C0000008E000001 +0E0000010E0000020E0000040E0000040E0000080E0000080E0000100E0000200E00003FFE0000 +400700004007000080070001000700010007000200070002000700060007001E000700FF807FF0 +1C1D7F9C1F>65 D<01FFFF00003C01C0003800E0003800F0003800700038007000700070007000 +F0007000F0007001E000E003C000E0078000E01F0000FFFC0001C00F0001C0078001C003C001C0 +03C0038003C0038003C0038003C0038003C0070007800700070007000E0007001C000E007800FF +FFC0001C1C7E9B1F>I<01FFC0FF80001E003C00001E003000000E002000000F00400000070080 +000007010000000782000000038400000003C800000001D000000001F000000000E000000000E0 +00000000F00000000170000000027000000004380000000838000000103C000000201C00000040 +1E000000800E000001800E000003000F000006000700001E000F8000FF803FF000211C7F9B22> +88 DI<381F004E61804681C04701C08F01C08E01C00E01C00E01C01C03801C03801C03801C +0700380710380710380E10380E2070064030038014127E9119>110 D E +/Fk 71 123 df<003FE3F801F03F1C03C03E3E07C07C3E0F807C3E0F807C1C0F807C000F807C00 +0F807C000F807C000F807C00FFFFFFC0FFFFFFC00F807C000F807C000F807C000F807C000F807C +000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F807C007FE1 +FFC07FE1FFC01F1D809C1C>11 D<003FC00001F0300003C0380007C07C000F807C000F807C000F +8038000F8000000F8000000F8000000F800000FFFFFC00FFFFFC000F807C000F807C000F807C00 +0F807C000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F807C +000F807C007FE1FF807FE1FF80191D809C1B>I<003FC1FE0001F03F818003C03E01C007C07E03 +E00F807C03E00F807C03E00F807C01C00F807C00000F807C00000F807C00000F807C0000FFFFFF +FFE0FFFFFFFFE00F807C03E00F807C03E00F807C03E00F807C03E00F807C03E00F807C03E00F80 +7C03E00F807C03E00F807C03E00F807C03E00F807C03E00F807C03E00F807C03E00F807C03E07F +E1FF0FFC7FE1FF0FFC261D809C28>14 D<00038000000380000003800000038000000380000003 +80000003800000038000000380000003800000038000000380000003800000038000FFFFFFFCFF +FFFFFCFFFFFFFC0003800000038000000380000003800000038000000380000003800000038000 +0003800000038000000380000003800000038000000380001E1F7D9925>43 +D<78FCFCFEFE7A0202040408083040070E7D850D>II<78FCFC +FCFC7806067D850D>I<03F8000F1E001C07003C07803803807803C07803C07803C0F803E0F803 +E0F803E0F803E0F803E0F803E0F803E0F803E0F803E0F803E0F803E0F803E07803C07803C03803 +803C07801C07000F1E0003F800131B7E9A18>48 D<00600001E0000FE000FFE000F3E00003E000 +03E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E000 +03E00003E00003E00003E00003E00003E0007FFF807FFF80111B7D9A18>I<07F8001FFE00383F +80780FC0FC07C0FC07E0FC03E0FC03E07803E00007E00007C00007C0000F80001F00001E000038 +0000700000E0000180600300600600600800E01FFFC03FFFC07FFFC0FFFFC0FFFFC0131B7E9A18 +>I<03F8001FFE003C1F003C0F807C07C07E07C07C07C03807C0000F80000F80001E00003C0003 +F800001E00000F800007C00007C00007E03007E07807E0FC07E0FC07E0FC07C0780F80781F001F +FE0007F800131B7E9A18>I<000180000380000780000F80001F80003F80006F8000CF80008F80 +018F80030F80060F800C0F80180F80300F80600F80C00F80FFFFF8FFFFF8000F80000F80000F80 +000F80000F80000F8001FFF801FFF8151B7F9A18>I<1801801FFF001FFE001FFC001FF8001FC0 +0018000018000018000018000019F8001E0E00180F801007800007C00007E00007E00007E07807 +E0F807E0F807E0F807C0F007C0600F80381F001FFE0007F000131B7E9A18>I<007E0003FF0007 +81800F03C01E07C03C07C03C0380780000780000F80000F8F800FB0E00FA0780FC0380FC03C0F8 +03E0F803E0F803E0F803E07803E07803E07803C03C03C03C07801E0F0007FE0003F800131B7E9A +18>I<6000007FFFE07FFFE07FFFC07FFF807FFF80E00300C00600C00C00C01800003000003000 +00600000E00000E00001E00001C00003C00003C00003C00003C00007C00007C00007C00007C000 +07C00007C000038000131C7D9B18>I<03F8000FFE001E0F803807803803C07803C07803C07E03 +C07F83807FC7003FFE001FFC000FFE0007FF801DFF80387FC0781FE0F007E0F003E0F001E0F001 +E0F001E07801C07803803E07801FFE0003F800131B7E9A18>I<03F8000FFE001E0F003C078078 +07807803C0F803C0F803C0F803E0F803E0F803E0F803E07807E03807E03C0BE00E1BE003E3E000 +03E00003C00003C03807C07C07807C0700780F00383C001FF8000FE000131B7E9A18>I<78FCFC +FCFC7800000000000078FCFCFCFC7806127D910D>I<0FF0303C601EF01FF81FF81F701F003E00 +3C007000E001C00180018003000300030003000300000000000000000007800FC00FC00FC00FC0 +0780101D7D9C17>63 D<001FE00000E01C0003000300060001800C0000C018000060300FC03020 +38601060F0101860F01F18C1E01F0CC1E01F0CC3E01F0CC3E01F0CC3E01F0CC3E01F0CC3E01F0C +C1E01F0CC1E01F0C60F01F0860F01F1820386F10300FC7E0180000000C00000006000000030000 +3C00E007F0001FFC001E1D7D9C25>I<00038000000380000007C0000007C0000007C000000FE0 +00000FE000001FF000001BF000001BF0000031F8000031F8000061FC000060FC0000E0FE0000C0 +7E0000C07E0001803F0001FFFF0003FFFF8003001F8003001F8006000FC006000FC00E000FE00C +0007E0FFC07FFEFFC07FFE1F1C7E9B24>II<001FE02000FFF8E003F80FE007C003E00F8001 +E01F0000E03E0000E03E0000607E0000607C000060FC000000FC000000FC000000FC000000FC00 +0000FC000000FC000000FC0000007C0000607E0000603E0000603E0000C01F0000C00F80018007 +C0030003F80E0000FFFC00001FE0001B1C7D9B22>IIII<000FF008007FFE3801FC07 +F807E001F80F8000781F0000783F0000383E0000387E0000187C000018FC000000FC000000FC00 +0000FC000000FC000000FC000000FC007FFFFC007FFF7C0001F87E0001F83E0001F83F0001F81F +0001F80F8001F807E001F801FC07F8007FFE78000FF818201C7D9B26>III<07FFF007FFF0001F80001F80001F80001F80001F8000 +1F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F8030 +1F80781F80FC1F80FC1F80FC1F00783E00387C000FF000141C7F9B19>IIIII<00 +3FE00001F07C0003C01E000F800F801F0007C01E0003C03E0003E07E0003F07C0001F07C0001F0 +FC0001F8FC0001F8FC0001F8FC0001F8FC0001F8FC0001F8FC0001F8FC0001F87C0001F07E0003 +F07E0003F03E0003E03F0007E01F0007C00F800F8003C01E0001F07C00003FE0001D1C7D9B24> +II82 +D<07F8201FFEE03C07E07801E07000E0F000E0F00060F00060F80000FE0000FFE0007FFE003FFF +003FFF800FFFC007FFE0007FE00003F00001F00000F0C000F0C000F0C000E0E000E0F001C0FC03 +C0EFFF0083FC00141C7D9B1B>I<7FFFFFE07FFFFFE0781F81E0701F80E0601F8060E01F8070C0 +1F8030C01F8030C01F8030C01F8030001F8000001F8000001F8000001F8000001F8000001F8000 +001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F80 +0007FFFE0007FFFE001C1C7E9B21>IIII<7FFE1FFE007FFE1FFE0007 +F001800003F803800001FC07000000FC06000000FE0C0000007F1C0000003F380000003FB00000 +001FE00000000FE00000000FE000000007F000000003F800000007F80000000FFC0000000CFE00 +0000187E000000387F000000703F800000601F800000C01FC00001C00FE000018007F000030007 +F000FFF03FFF80FFF03FFF80211C7F9B24>I91 D93 +D<0FF8001C1E003E0F803E07803E07C01C07C00007C0007FC007E7C01F07C03C07C07C07C0F807 +C0F807C0F807C0780BC03E13F80FE1F815127F9117>97 D +I<03FC000E0E001C1F003C1F00781F00780E00F80000F80000F80000F80000F80000F800007800 +007801803C01801C03000E0E0003F80011127E9115>I<000FF0000FF00001F00001F00001F000 +01F00001F00001F00001F00001F00001F001F9F00F07F01C03F03C01F07801F07801F0F801F0F8 +01F0F801F0F801F0F801F0F801F07801F07801F03C01F01C03F00F0FFE03F9FE171D7E9C1B>I< +01FC000F07001C03803C01C07801C07801E0F801E0F801E0FFFFE0F80000F80000F80000780000 +7C00603C00601E00C00F038001FC0013127F9116>I<007F0001E38003C7C00787C00F87C00F83 +800F80000F80000F80000F80000F8000FFF800FFF8000F80000F80000F80000F80000F80000F80 +000F80000F80000F80000F80000F80000F80000F80000F80007FF8007FF800121D809C0F>I<03 +F8F00E0F381E0F381C07303C07803C07803C07803C07801C07001E0F000E0E001BF80010000018 +00001800001FFF001FFFC00FFFE01FFFF07801F8F00078F00078F000787000707800F01E03C007 +FF00151B7F9118>II<1E003F003F003F003F001E000000 +00000000000000000000FF00FF001F001F001F001F001F001F001F001F001F001F001F001F001F +001F00FFE0FFE00B1E7F9D0E>I<007800FC00FC00FC00FC007800000000000000000000000003 +FC03FC007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C +707CF87CF878F8F070E01F800E26839D0F>IIIII<01FC000F07801C01C03C01E07800F0 +7800F0F800F8F800F8F800F8F800F8F800F8F800F87800F07800F03C01E01E03C00F078001FC00 +15127F9118>II<03F0600F0CE01E07E03C03E07C03E07803E0F803E0F803E0F8 +03E0F803E0F803E0F803E07803E07C03E03C03E01C07E00E0FE003F3E00003E00003E00003E000 +03E00003E00003E0001FFC001FFC161A7E9119>II<1FD830786018E018E018F000FF807FE07FF01FF807FC007CC01CC01CE01CE018F830CF +C00E127E9113>I<0300030003000300070007000F000F003FFCFFFC1F001F001F001F001F001F +001F001F001F001F0C1F0C1F0C1F0C0F08079803F00E1A7F9913>IIIIII<3FFF803C1F00303F00303E00607C00 +60FC0060F80001F00003F00007E00007C1800F81801F81801F03803E03007E07007C0F00FFFF00 +11127F9115>I E /Fl 36 121 df<00000007FF800000000001FFFFF0000000000FFFFFFC0000 +00003FFFFFFE00000000FFFC00FF00000001FFC0003F80000007FF00007FC000000FFE0001FFC0 +00001FFC0001FFE000001FF80003FFE000003FF00003FFE000003FF00003FFE000007FE00003FF +E000007FE00003FFE000007FE00003FFE000007FE00003FFE000007FE00001FFC000007FE00000 +FF8000007FE000003E0000007FE00000000000007FE00000000000007FE00000000000007FE000 +00000000007FE00000000000007FE00000000000007FE0003FFFF000FFFFFFFFFFFFF000FFFFFF +FFFFFFF000FFFFFFFFFFFFF000FFFFFFFFFFFFF000FFFFFFFFFFFFF000007FF00000FFF000007F +F000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF00000 +7FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000 +007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF0 +00007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007F +F000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF00000 +7FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000 +007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF0 +00007FF0003FFFFFE03FFFFFE03FFFFFE03FFFFFE03FFFFFE03FFFFFE03FFFFFE03FFFFFE03FFF +FFE03FFFFFE03B487EC742>12 D<0000FFE00000000FFFFE0000003FFFFFC00000FFFFFFF00003 +FFFFFFFC0007FC01FFFE000FE0007FFF001FC0001FFF803F80000FFFC03FE00007FFE07FF80007 +FFE07FFC0003FFF0FFFC0003FFF0FFFE0001FFF8FFFE0001FFF8FFFE0001FFF8FFFE0000FFFCFF +FE0000FFFC7FFC0000FFFC7FFC0000FFFC3FF80000FFFC1FF00000FFFC0FE00000FFFC00000001 +FFFC00000001FFF800000001FFF800000001FFF000000003FFF000000003FFE000000003FFE000 +000007FFC000000007FF800000000FFF800000001FFF000000001FFE000000003FFC000000007F +F8000000007FE000000000FFC000000001FF8000000003FF0000000007FC000000000FF8000000 +001FF0000000003FC0000000007F80007C0000FF00007C0000FE00007C0001FC00007C0003F000 +00F80007E00000F8000FC00000F8001F800000F8003F000001F8007C000003F800FFFFFFFFF801 +FFFFFFFFF003FFFFFFFFF007FFFFFFFFF00FFFFFFFFFF01FFFFFFFFFF03FFFFFFFFFF07FFFFFFF +FFF07FFFFFFFFFF0FFFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFE02E447AC33B>50 +D<0000000003E000000000000000000007F000000000000000000007F00000000000000000000F +F80000000000000000000FF80000000000000000000FF80000000000000000001FFC0000000000 +000000001FFC0000000000000000003FFE0000000000000000003FFE0000000000000000007FFF +0000000000000000007FFF0000000000000000007FFF000000000000000000FFFF800000000000 +000000FFFF800000000000000001FFFFC00000000000000001FFFFC00000000000000001FFFFC0 +0000000000000003FFFFE00000000000000003EFFFE00000000000000007EFFFF0000000000000 +0007CFFFF00000000000000007C7FFF0000000000000000FC7FFF8000000000000000F83FFF800 +0000000000001F83FFFC000000000000001F03FFFC000000000000001F01FFFC00000000000000 +3F01FFFE000000000000003E00FFFE000000000000007E00FFFF000000000000007C007FFF0000 +0000000000FC007FFF80000000000000F8007FFF80000000000000F8003FFF80000000000001F8 +003FFFC0000000000001F0001FFFC0000000000003F0001FFFE0000000000003E0001FFFE00000 +00000003E0000FFFE0000000000007E0000FFFF0000000000007C00007FFF000000000000FC000 +07FFF800000000000F800007FFF800000000000F800003FFF800000000001F800003FFFC000000 +00001F000001FFFC00000000003FFFFFFFFFFE00000000003FFFFFFFFFFE00000000007FFFFFFF +FFFF00000000007FFFFFFFFFFF00000000007FFFFFFFFFFF0000000000FC0000007FFF80000000 +00F80000003FFF8000000001F80000003FFFC000000001F00000003FFFC000000001F00000001F +FFC000000003F00000001FFFE000000003E00000000FFFE000000007E00000000FFFF000000007 +C00000000FFFF000000007C000000007FFF00000000FC000000007FFF80000000F8000000003FF +F80000001F8000000003FFFC0000001F0000000003FFFC0000007FC000000001FFFC0000FFFFFF +C00007FFFFFFFF80FFFFFFC00007FFFFFFFF80FFFFFFC00007FFFFFFFF80FFFFFFC00007FFFFFF +FF80FFFFFFC00007FFFFFFFF8051487CC75A>65 D<000000003FFE00000E0000000FFFFFC0001E +0000007FFFFFF8003E000003FFFFFFFE00FE00000FFFFFFFFF81FE00003FFFF800FFC3FE0000FF +FF80000FF7FE0001FFFC000003FFFE0007FFF0000001FFFE000FFFC00000007FFE001FFF800000 +003FFE003FFF000000001FFE007FFE000000000FFE00FFFC0000000007FE01FFF80000000007FE +03FFF00000000003FE03FFF00000000001FE07FFE00000000001FE07FFE00000000000FE0FFFC0 +0000000000FE0FFFC000000000007E1FFFC000000000007E1FFF8000000000007E3FFF80000000 +00007E3FFF8000000000003E3FFF8000000000003E7FFF8000000000003E7FFF0000000000003E +7FFF000000000000007FFF00000000000000FFFF00000000000000FFFF00000000000000FFFF00 +000000000000FFFF00000000000000FFFF00000000000000FFFF00000000000000FFFF00000000 +000000FFFF00000000000000FFFF00000000000000FFFF00000000000000FFFF00000000000000 +FFFF00000000000000FFFF000000000000007FFF000000000000007FFF000000000000007FFF00 +0000000000007FFF8000000000003E3FFF8000000000003E3FFF8000000000003E3FFF80000000 +00003E1FFF8000000000003E1FFFC000000000003E0FFFC000000000007C0FFFC000000000007C +07FFE000000000007C07FFE00000000000F803FFF00000000000F803FFF00000000001F801FFF8 +0000000001F000FFFC0000000003E0007FFE0000000007E0003FFF000000000FC0001FFF800000 +001F80000FFFC00000003F000007FFF0000000FE000001FFFC000001FC000000FFFF80000FF800 +00003FFFF8007FF00000000FFFFFFFFFC000000003FFFFFFFF00000000007FFFFFFC0000000000 +0FFFFFE00000000000003FFE000000474979C756>67 DI70 D<000000003FFE00000E000000000FFFFFC0001E000000007FFFFF +F8003E00000003FFFFFFFE00FE0000000FFFFFFFFF81FE0000003FFFF800FFC3FE000000FFFF80 +000FF7FE000001FFFC000003FFFE000007FFF0000001FFFE00000FFFC00000007FFE00001FFF80 +0000003FFE00003FFF000000001FFE00007FFE000000000FFE0000FFFC0000000007FE0001FFF8 +0000000007FE0003FFF00000000003FE0003FFF00000000001FE0007FFE00000000001FE0007FF +E00000000000FE000FFFC00000000000FE000FFFC000000000007E001FFFC000000000007E001F +FF8000000000007E003FFF8000000000007E003FFF8000000000003E003FFF8000000000003E00 +7FFF8000000000003E007FFF0000000000003E007FFF00000000000000007FFF00000000000000 +00FFFF0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF000000000000 +0000FFFF0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF0000000000 +000000FFFF0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF00000000 +00000000FFFF0000007FFFFFFFFE7FFF0000007FFFFFFFFE7FFF0000007FFFFFFFFE7FFF800000 +7FFFFFFFFE7FFF8000007FFFFFFFFE3FFF8000000000FFFE003FFF8000000000FFFE003FFF8000 +000000FFFE001FFF8000000000FFFE001FFFC000000000FFFE000FFFC000000000FFFE000FFFC0 +00000000FFFE0007FFE000000000FFFE0007FFE000000000FFFE0003FFF000000000FFFE0003FF +F800000000FFFE0001FFF800000000FFFE0000FFFC00000000FFFE00007FFE00000000FFFE0000 +3FFF00000000FFFE00001FFF80000000FFFE00000FFFE0000001FFFE000007FFF0000003FFFE00 +0001FFFC000007FFFE000000FFFF80001FFFFE0000003FFFFC00FFC7FE0000000FFFFFFFFF83FE +00000003FFFFFFFE00FE000000007FFFFFF8003E000000000FFFFFE0000E00000000003FFE0000 +00004F4979C75D>I73 D76 DII80 +D82 D +85 DII<0007FFFC000000007FFFFFC0000001FFFFFFF8000003 +FFFFFFFE000007FE001FFF000007FF0003FFC0000FFF8001FFE0000FFF8000FFF0000FFF80007F +F0000FFF80007FF8000FFF80007FF80007FF00003FFC0007FF00003FFC0003FE00003FFC0000F8 +00003FFC00000000003FFC00000000003FFC00000000003FFC00000000003FFC00000007FFFFFC +000000FFFFFFFC000007FFFFFFFC00003FFFE03FFC0000FFFE003FFC0003FFF0003FFC0007FFC0 +003FFC000FFF00003FFC001FFE00003FFC003FFC00003FFC007FF800003FFC007FF800003FFC00 +FFF000003FFC00FFF000003FFC00FFF000003FFC00FFF000003FFC00FFF000003FFC00FFF00000 +7FFC007FF80000FFFC007FF80001EFFC003FFC0003EFFC003FFF0007CFFF000FFFC03F8FFFF807 +FFFFFF07FFFC01FFFFFC03FFFC007FFFF001FFFC0003FF80007FF8362E7DAD3A>97 +D<007FC00000000000FFFFC00000000000FFFFC00000000000FFFFC00000000000FFFFC0000000 +0000FFFFC0000000000003FFC0000000000001FFC0000000000001FFC0000000000001FFC00000 +00000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC000 +0000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0 +000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FF +C0000000000001FFC0000000000001FFC00FFC00000001FFC07FFFC0000001FFC3FFFFF0000001 +FFCFFFFFFC000001FFDFF00FFF000001FFFF8003FF800001FFFE0001FFC00001FFF800007FE000 +01FFF000007FF00001FFE000003FF80001FFE000001FFC0001FFE000001FFC0001FFE000001FFE +0001FFE000001FFE0001FFE000000FFF0001FFE000000FFF0001FFE000000FFF0001FFE000000F +FF0001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE00000 +0FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000 +000FFF8001FFE000000FFF0001FFE000000FFF0001FFE000000FFF0001FFE000001FFE0001FFE0 +00001FFE0001FFE000001FFC0001FFE000001FFC0001FFE000003FF80001FFF000003FF80001FF +F800007FF00001FFFC0000FFE00001FFFE0001FFC00001FFBF0007FF800001FF1FE01FFE000001 +FE0FFFFFFC000001FC03FFFFF0000001F800FFFF80000001F0001FF800000039487CC742>I<00 +001FFFC0000000FFFFF8000007FFFFFE00001FFFFFFF80007FFC00FFC000FFE001FFC001FFC003 +FFE003FF8003FFE007FF0003FFE00FFE0003FFE00FFE0003FFE01FFC0001FFC01FFC0001FFC03F +FC0000FF803FFC00003E007FF8000000007FF8000000007FF800000000FFF800000000FFF80000 +0000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FF +F800000000FFF8000000007FF8000000007FF8000000007FFC000000003FFC000000003FFC0000 +00001FFC000000F81FFE000000F80FFE000000F80FFF000001F007FF800003F003FFC00007E001 +FFE0000FC000FFF0001F80007FFE00FF00001FFFFFFE000007FFFFF8000000FFFFE00000001FFE +00002D2E7CAD35>I<00000000007FC00000000000FFFFC00000000000FFFFC00000000000FFFF +C00000000000FFFFC00000000000FFFFC0000000000003FFC0000000000001FFC0000000000001 +FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC00000000000 +01FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC000000000 +0001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000 +000001FFC0000000000001FFC0000000000001FFC00000000FFC01FFC0000000FFFF81FFC00000 +07FFFFE1FFC000001FFFFFF9FFC000007FFC03FFFFC00000FFF0007FFFC00001FFC0001FFFC000 +03FF80000FFFC00007FF000007FFC0000FFE000003FFC0000FFE000003FFC0001FFC000003FFC0 +001FFC000003FFC0003FFC000003FFC0003FFC000003FFC0007FF8000003FFC0007FF8000003FF +C0007FF8000003FFC000FFF8000003FFC000FFF8000003FFC000FFF8000003FFC000FFF8000003 +FFC000FFF8000003FFC000FFF8000003FFC000FFF8000003FFC000FFF8000003FFC000FFF80000 +03FFC000FFF8000003FFC0007FF8000003FFC0007FF8000003FFC0007FF8000003FFC0003FF800 +0003FFC0003FFC000003FFC0003FFC000003FFC0001FFC000003FFC0001FFC000003FFC0000FFE +000007FFC00007FF00000FFFC00003FF00001FFFC00001FFC0003FFFC00000FFE000FFFFE00000 +7FF807FBFFFF80001FFFFFF3FFFF800007FFFFC3FFFF800001FFFF03FFFF8000001FF803FFFF80 +39487CC742>I<00001FFE00000001FFFFE0000007FFFFF800001FFFFFFE00007FFC07FF0000FF +E001FF8001FFC0007FC003FF80003FE007FF00003FF00FFE00001FF01FFE00000FF81FFC00000F +F83FFC00000FFC3FFC000007FC7FFC000007FC7FF8000007FC7FF8000007FE7FF8000007FEFFF8 +000007FEFFF8000007FEFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFCFFF8000000 +00FFF800000000FFF800000000FFF8000000007FF8000000007FF8000000007FFC000000003FFC +000000003FFC000000003FFC0000001C1FFE0000003E0FFE0000003E07FF0000007E07FF000000 +FC03FF800001F801FFC00003F0007FF0001FE0003FFE00FFC0001FFFFFFF800007FFFFFE000000 +FFFFF80000000FFF80002F2E7DAD36>I<000000FFC000000007FFF80000003FFFFC000000FFFF +FF000001FFC1FF000007FF03FF80000FFC03FF80000FF807FFC0001FF807FFC0003FF007FFC000 +3FF007FFC0003FE003FF80007FE003FF80007FE001FF00007FE000FE00007FE0003800007FE000 +0000007FE0000000007FE0000000007FE0000000007FE0000000007FE0000000007FE000000000 +7FE0000000007FE0000000007FE0000000FFFFFFFE0000FFFFFFFE0000FFFFFFFE0000FFFFFFFE +0000FFFFFFFE0000007FF0000000007FF0000000007FF0000000007FF0000000007FF000000000 +7FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF000 +0000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF000000000 +7FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF000 +0000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF000000000 +7FF0000000007FF0000000007FF0000000007FF0000000007FF00000003FFFFFF800003FFFFFF8 +00003FFFFFF800003FFFFFF800003FFFFFF800002A487DC724>I<00000000001F8000007FF000 +FFE00007FFFF03FFF0001FFFFFC7FFF0007FFFFFFFC7F800FFE03FFE0FF801FF800FFC0FF803FF +0007FE0FF807FE0003FF07F007FE0003FF07F00FFC0001FF81C00FFC0001FF80000FFC0001FF80 +001FFC0001FFC0001FFC0001FFC0001FFC0001FFC0001FFC0001FFC0001FFC0001FFC0001FFC00 +01FFC0000FFC0001FF80000FFC0001FF80000FFC0001FF800007FE0003FF000007FE0003FF0000 +03FF0007FE000001FF800FFC000000FFE03FF8000001FFFFFFF0000001DFFFFFC0000003C7FFFF +00000003C07FF000000007C0000000000007C0000000000007C0000000000007C0000000000007 +E0000000000007F0000000000007F8000000000007FFFFFFF0000007FFFFFFFF000003FFFFFFFF +E00003FFFFFFFFF80001FFFFFFFFFE0001FFFFFFFFFF0000FFFFFFFFFF80007FFFFFFFFF8003FF +FFFFFFFFC00FFFFFFFFFFFC01FF800001FFFE03FE0000001FFE07FC00000007FF07FC00000003F +F0FF800000001FF0FF800000001FF0FF800000001FF0FF800000001FF0FF800000001FF07FC000 +00003FE07FC00000003FE03FE00000007FC03FF0000000FFC01FFC000003FF800FFF00000FFF00 +03FFF000FFFC0000FFFFFFFFF000003FFFFFFFC0000007FFFFFE000000003FFFC0000035447DAE +3B>I<00FC0001FE0003FF0007FF800FFFC01FFFE01FFFE01FFFE01FFFE01FFFE01FFFE00FFFC0 +07FF8003FF0001FE0000FC00000000000000000000000000000000000000000000000000000000 +000000000000007FC0FFFFC0FFFFC0FFFFC0FFFFC0FFFFC003FFC001FFC001FFC001FFC001FFC0 +01FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC0 +01FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC0 +01FFC001FFC001FFC001FFC0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18497CC820>105 +D<007FC000000000FFFFC000000000FFFFC000000000FFFFC000000000FFFFC000000000FFFFC0 +0000000003FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC000000000 +01FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC000 +00000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001 +FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC0007FFFF801FFC0007F +FFF801FFC0007FFFF801FFC0007FFFF801FFC0007FFFF801FFC0000FFE0001FFC00007F00001FF +C0000FE00001FFC0003FC00001FFC0007F800001FFC000FE000001FFC001FC000001FFC007F800 +0001FFC00FF0000001FFC01FC0000001FFC03F80000001FFC0FF00000001FFC1FE00000001FFC3 +FF00000001FFCFFF80000001FFDFFFC0000001FFFFFFC0000001FFFFFFE0000001FFFFFFF00000 +01FFFCFFF8000001FFF87FFC000001FFE03FFC000001FFC01FFE000001FFC01FFF000001FFC00F +FF800001FFC007FFC00001FFC003FFC00001FFC001FFE00001FFC001FFF00001FFC000FFF80001 +FFC0007FFC0001FFC0003FFC0001FFC0001FFE0001FFC0000FFF0001FFC0000FFF8001FFC0000F +FFC0FFFFFF807FFFFFFFFFFF807FFFFFFFFFFF807FFFFFFFFFFF807FFFFFFFFFFF807FFFFF3848 +7CC73F>107 D<007FC000FFFFC000FFFFC000FFFFC000FFFFC000FFFFC00003FFC00001FFC000 +01FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0 +0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FF +C00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001 +FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC000 +01FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0 +0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FF +C000FFFFFF80FFFFFF80FFFFFF80FFFFFF80FFFFFF8019487CC720>I<007FC001FFC00000FFE0 +0000FFFFC00FFFF80007FFFC0000FFFFC03FFFFE001FFFFF0000FFFFC0FFFFFF007FFFFF8000FF +FFC1FC07FF80FE03FFC000FFFFC3E003FFC1F001FFE00003FFC7C001FFC3E000FFE00001FFCF00 +01FFE78000FFF00001FFDE0000FFEF00007FF00001FFDC0000FFEE00007FF00001FFFC0000FFFE +00007FF80001FFF80000FFFC00007FF80001FFF00000FFF800007FF80001FFF00000FFF800007F +F80001FFF00000FFF800007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001 +FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE000 +00FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF0 +00007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007F +F80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001 +FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE000 +00FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF0 +00007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007F +F80001FFE00000FFF000007FF800FFFFFFC07FFFFFE03FFFFFF0FFFFFFC07FFFFFE03FFFFFF0FF +FFFFC07FFFFFE03FFFFFF0FFFFFFC07FFFFFE03FFFFFF0FFFFFFC07FFFFFE03FFFFFF05C2E7CAD +63>I<007FC001FFC00000FFFFC00FFFF80000FFFFC03FFFFE0000FFFFC0FFFFFF0000FFFFC1FC +07FF8000FFFFC3E003FFC00003FFC7C001FFC00001FFCF0001FFE00001FFDE0000FFE00001FFDC +0000FFE00001FFFC0000FFF00001FFF80000FFF00001FFF00000FFF00001FFF00000FFF00001FF +F00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001 +FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF000 +01FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF0 +0001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FF +F00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000 +FFF00001FFE00000FFF00001FFE00000FFF000FFFFFFC07FFFFFE0FFFFFFC07FFFFFE0FFFFFFC0 +7FFFFFE0FFFFFFC07FFFFFE0FFFFFFC07FFFFFE03B2E7CAD42>I<00000FFF0000000000FFFFF0 +00000007FFFFFE0000001FFFFFFF8000003FFC03FFC00000FFE0007FF00001FF80001FF80003FF +00000FFC0007FE000007FE000FFE000007FF000FFC000003FF001FFC000003FF803FFC000003FF +C03FF8000001FFC03FF8000001FFC07FF8000001FFE07FF8000001FFE07FF8000001FFE0FFF800 +0001FFF0FFF8000001FFF0FFF8000001FFF0FFF8000001FFF0FFF8000001FFF0FFF8000001FFF0 +FFF8000001FFF0FFF8000001FFF0FFF8000001FFF0FFF8000001FFF07FF8000001FFE07FF80000 +01FFE07FF8000001FFE07FF8000001FFE03FFC000003FFC03FFC000003FFC01FFC000003FF801F +FE000007FF800FFE000007FF0007FF00000FFE0003FF80001FFC0001FFC0003FF80000FFE0007F +F000007FFC03FFE000001FFFFFFF80000007FFFFFE00000000FFFFF0000000000FFF000000342E +7DAD3B>I<007FC00FFC000000FFFFC07FFFC00000FFFFC3FFFFF00000FFFFCFFFFFFC0000FFFF +DFF01FFF0000FFFFFF8007FF800003FFFE0001FFC00001FFF80000FFE00001FFF00000FFF00001 +FFE000007FF80001FFE000003FFC0001FFE000003FFC0001FFE000003FFE0001FFE000001FFE00 +01FFE000001FFF0001FFE000001FFF0001FFE000001FFF0001FFE000000FFF0001FFE000000FFF +8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000F +FF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE00000 +0FFF0001FFE000001FFF0001FFE000001FFF0001FFE000001FFE0001FFE000001FFE0001FFE000 +003FFC0001FFE000003FFC0001FFE000007FF80001FFF000007FF80001FFF80000FFF00001FFFC +0001FFE00001FFFE0003FFC00001FFFF0007FF800001FFFFE03FFE000001FFEFFFFFFC000001FF +E3FFFFF0000001FFE0FFFF80000001FFE01FF800000001FFE0000000000001FFE0000000000001 +FFE0000000000001FFE0000000000001FFE0000000000001FFE0000000000001FFE00000000000 +01FFE0000000000001FFE0000000000001FFE0000000000001FFE0000000000001FFE000000000 +0001FFE0000000000001FFE0000000000001FFE00000000000FFFFFFC000000000FFFFFFC00000 +0000FFFFFFC000000000FFFFFFC000000000FFFFFFC00000000039427CAD42>I<00FF803F8000 +FFFF80FFF000FFFF83FFFC00FFFF87FFFE00FFFF8FC3FF00FFFF8F07FF0003FF9E0FFF8001FFBC +0FFF8001FFB80FFF8001FFF80FFF8001FFF00FFF8001FFF007FF0001FFF007FF0001FFE003FE00 +01FFE000F80001FFE000000001FFE000000001FFC000000001FFC000000001FFC000000001FFC0 +00000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC0000000 +01FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC0 +00000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC0000000 +01FFC0000000FFFFFFE00000FFFFFFE00000FFFFFFE00000FFFFFFE00000FFFFFFE00000292E7C +AD31>114 D<000FFF00E0007FFFF3E001FFFFFFE007FFFFFFE00FF800FFE01FC0001FE03F8000 +0FE03F000007E07F000003E07F000003E0FF000003E0FF000003E0FF800003E0FFC0000000FFF0 +000000FFFE000000FFFFF800007FFFFFC0007FFFFFF0003FFFFFFC001FFFFFFF000FFFFFFF8007 +FFFFFFC003FFFFFFE000FFFFFFF0003FFFFFF00003FFFFF800001FFFF8000000FFFC0000001FFC +7800000FFCF8000007FCF8000003FCFC000003FCFC000003FCFE000003F8FE000003F8FF000003 +F8FF800007F0FFC0000FF0FFF0001FE0FFFC00FFC0FFFFFFFF80FC7FFFFE00F81FFFF800E003FF +8000262E7CAD2F>I<0001F000000001F000000001F000000001F000000001F000000001F00000 +0003F000000003F000000003F000000007F000000007F000000007F00000000FF00000000FF000 +00001FF00000003FF00000003FF00000007FF0000001FFF0000003FFF000000FFFFFFFC0FFFFFF +FFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC000FFF0000000FFF0000000FFF0000000FFF0000000FF +F0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000 +FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF00000 +00FFF0000000FFF0000000FFF0000000FFF001F000FFF001F000FFF001F000FFF001F000FFF001 +F000FFF001F000FFF001F000FFF001F000FFF001F0007FF001E0007FF803E0003FF803E0003FFC +07C0001FFE0F80000FFFFF800007FFFE000001FFFC0000001FF00024427EC12E>I<007FE00000 +3FF000FFFFE0007FFFF000FFFFE0007FFFF000FFFFE0007FFFF000FFFFE0007FFFF000FFFFE000 +7FFFF00003FFE00001FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE0 +0000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FF +E00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001 +FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF000 +01FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF0 +0001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00001FFF00001FFE00001FF +F00001FFE00001FFF00001FFE00003FFF00000FFE00007FFF00000FFE0000F7FF000007FE0001F +7FF000007FF0003E7FF800003FFC00FC7FFFE0001FFFFFF87FFFE00007FFFFE07FFFE00001FFFF +807FFFE000003FFE007FFFE03B2E7CAD42>I119 D<7FFFFF801FFFFF007FFFFF801FFFFF007FFFFF +801FFFFF007FFFFF801FFFFF007FFFFF801FFFFF00007FF80001FF0000007FFC0001FC0000003F +FE0003F80000001FFF0007F00000000FFF0007E000000007FF800FC000000003FFC01F80000000 +03FFE03F8000000001FFF07F0000000000FFF8FE00000000007FF9FC00000000003FFFF8000000 +00003FFFF000000000001FFFE000000000000FFFC0000000000007FFC0000000000003FFC00000 +00000001FFE0000000000001FFF0000000000001FFF8000000000003FFFC000000000003FFFE00 +0000000007FFFE00000000000FEFFF00000000001FCFFF80000000003F87FFC0000000007F03FF +E000000000FE01FFE000000001FC00FFF000000001F8007FF800000003F0007FFC00000007F000 +3FFE0000000FE0001FFF0000001FC0000FFF0000003F800007FF800000FF800007FFC000FFFFF8 +003FFFFFC0FFFFF8003FFFFFC0FFFFF8003FFFFFC0FFFFF8003FFFFFC0FFFFF8003FFFFFC03A2E +7EAD3F>I E /Fm 5 121 df<0003FE0000000FFF8000003C01E00000F000780001C0001C000300 +00060006000003000C0000018018000000C018000000C030000000603000000060600000003060 +000000306000000030C000000018C000000018C000000018C000000018C000000018C000000018 +C000000018C000000018C000000018600000003060000000306000000030300000006030000000 +6018000000C018000000C00C000001800600000300030000060001C0001C0000F0007800003C01 +E000000FFF80000003FE000025277E9D2A>13 D<03C00FF01FF83FFC7FFE7FFEFFFFFFFFFFFFFF +FF7FFE7FFE3FFC1FF80FF003C010107E9115>15 D<003C00E001C0018003800380038003800380 +03800380038003800380038003800380030007001C00F0001C0007000300038003800380038003 +8003800380038003800380038003800380018001C000E0003C0E297D9E15>102 +DI<1F00308070406060E0E0E0E0E040E00060007000300018001C0033 +00718061C0E0C0E0E0E0E0E0E060E070C031C0198007000300018001C000C000E040E0E0E0E0E0 +C0C041C021801F000B257D9C12>120 D E /Fn 84 125 df<007E1F0001C1B1800303E3C00703 +C3C00E03C1800E01C0000E01C0000E01C0000E01C0000E01C0000E01C000FFFFFC000E01C0000E +01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C000 +0E01C0000E01C0000E01C0000E01C0000E01C0007F87FC001A1D809C18>11 +D<007E0001C1800301800703C00E03C00E01800E00000E00000E00000E00000E0000FFFFC00E01 +C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01 +C00E01C00E01C07F87F8151D809C17>I<007FC001C1C00303C00703C00E01C00E01C00E01C00E +01C00E01C00E01C00E01C0FFFFC00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E +01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C07FCFF8151D809C17>I<003F07E00001 +C09C18000380F018000701F03C000E01E03C000E00E018000E00E000000E00E000000E00E00000 +0E00E000000E00E00000FFFFFFFC000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C +000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E0 +1C000E00E01C000E00E01C000E00E01C007FC7FCFF80211D809C23>I<60F0F0F0F0F0F0F06060 +6060606060606060606060000000000060F0F060041E7C9D0C>33 D<6060F0F0F8F86868080808 +080808101010102020404080800D0C7F9C15>I<0080008007E01898308460824081C087C08FC0 +8FC086E080F0807E803FC01FF00FF803FC00BE008E00876087F083F083E0838082408240842088 +189007E00080008010217E9E15>36 D<00E0000001900000030800000308000007080000070800 +0007080000070800000710000007100000072000000740000003C03FE003800F00038006000380 +040005C0040009C0080010E0100030E010006070200060702000E0384000E03C4000E01C8000E0 +0F0020E0070020700780403009C0401830E18007C03E001B1F7E9D20>38 +D<60F0F8680808081010204080050C7C9C0C>I<004000800100020006000C000C001800180030 +0030007000600060006000E000E000E000E000E000E000E000E000E000E000E000E00060006000 +6000700030003000180018000C000C00060002000100008000400A2A7D9E10>I<800040002000 +100018000C000C000600060003000300038001800180018001C001C001C001C001C001C001C001 +C001C001C001C001C0018001800180038003000300060006000C000C0018001000200040008000 +0A2A7E9E10>I<60F0F0701010101020204080040C7C830C>44 DI<60F0 +F06004047C830C>I<00010003000600060006000C000C000C0018001800180030003000300060 +006000C000C000C0018001800180030003000300060006000C000C000C00180018001800300030 +003000600060006000C000C00010297E9E15>I<03C00C301818300C300C700E60066006E007E0 +07E007E007E007E007E007E007E007E007E007E007E00760066006700E300C300C18180C3007E0 +101D7E9B15>I<030007003F00C700070007000700070007000700070007000700070007000700 +07000700070007000700070007000700070007000F80FFF80D1C7C9B15>I<07C01830201C400C +400EF00FF80FF807F8077007000F000E000E001C001C00380070006000C00180030006010C0118 +0110023FFE7FFEFFFE101C7E9B15>I<07E01830201C201C781E780E781E381E001C001C001800 +30006007E00030001C001C000E000F000F700FF80FF80FF80FF00E401C201C183007E0101D7E9B +15>I<000C00000C00001C00003C00003C00005C0000DC00009C00011C00031C00021C00041C00 +0C1C00081C00101C00301C00201C00401C00C01C00FFFFC0001C00001C00001C00001C00001C00 +001C00001C0001FFC0121C7F9B15>I<300C3FF83FF03FC020002000200020002000200023E024 +302818301C200E000E000F000F000F600FF00FF00FF00F800E401E401C2038187007C0101D7E9B +15>I<00F0030C06040C0E181E301E300C700070006000E3E0E430E818F00CF00EE006E007E007 +E007E007E007600760077006300E300C18180C3003E0101D7E9B15>I<4000007FFF807FFF007F +FF0040020080040080040080080000100000100000200000600000400000C00000C00001C00001 +800001800003800003800003800003800007800007800007800007800007800007800003000011 +1D7E9B15>I<03E00C301008200C20066006600660067006780C3E083FB01FE007F007F818FC30 +7E601E600FC007C003C003C003C00360026004300C1C1007E0101D7E9B15>I<03C00C30181830 +0C700C600EE006E006E007E007E007E007E0076007700F300F18170C2707C700060006000E300C +780C78187010203030C00F80101D7E9B15>I<60F0F0600000000000000000000060F0F0600412 +7C910C>I<60F0F0600000000000000000000060F0F0701010101020204080041A7C910C>I<7FFF +FFC0FFFFFFE00000000000000000000000000000000000000000000000000000000000000000FF +FFFFE07FFFFFC01B0C7E8F20>61 D<0FE03038401CE00EF00EF00EF00E000C001C0030006000C0 +008001800100010001000100010001000000000000000000000003000780078003000F1D7E9C14 +>63 D<003F800000C0600003001800040004000800020010000100201F00802070808040E04040 +40C0384041C038408180382083803820838038208380382083803820838038208180382041C038 +2040C0384040E0784020709880201F0F00100000000800000004000000030001E000C01F80003F +F0001B1D7E9C20>I<000600000006000000060000000F0000000F0000000F0000001780000017 +8000001780000023C0000023C0000023C0000041E0000041E0000041E0000080F0000080F00001 +80F8000100780001FFF80003007C0002003C0002003C0006003E0004001E0004001E000C001F00 +1E001F00FF80FFF01C1D7F9C1F>II<001F808000E06180018019 +80070007800E0003801C0003801C00018038000180780000807800008070000080F0000000F000 +0000F0000000F0000000F0000000F0000000F0000000F000000070000080780000807800008038 +0000801C0001001C0001000E000200070004000180080000E03000001FC000191E7E9C1E>I +III<001F808000E0618001801980 +070007800E0003801C0003801C00018038000180780000807800008070000080F0000000F00000 +00F0000000F0000000F0000000F0000000F000FFF0F0000F807000078078000780780007803800 +07801C0007801C0007800E00078007000B800180118000E06080001F80001C1E7E9C21>II< +FFF00F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F +000F000F000F000F000F000F000F00FFF00C1C7F9B0F>I<1FFF00F80078007800780078007800 +7800780078007800780078007800780078007800780078007800787078F878F878F878F0F040E0 +21C01F00101D7F9B15>IIIII<003F800000E0E0000380380007001C000E000E00 +1C0007003C00078038000380780003C0780003C0700001C0F00001E0F00001E0F00001E0F00001 +E0F00001E0F00001E0F00001E0F00001E0700001C0780003C0780003C0380003803C0007801C00 +07000E000E0007001C000380380000E0E000003F80001B1E7E9C20>II82 D<07E0801C1980300580700380600180E00180E00080E00080E00080F000 +00F800007C00007FC0003FF8001FFE0007FF0000FF80000F800007C00003C00001C08001C08001 +C08001C0C00180C00180E00300D00200CC0C0083F800121E7E9C17>I<7FFFFFC0700F01C0600F +00C0400F0040400F0040C00F0020800F0020800F0020800F0020000F0000000F0000000F000000 +0F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000 +000F0000000F0000000F0000000F0000001F800003FFFC001B1C7F9B1E>IIII< +7FF0FFC00FC03E000780180003C0180003E0100001E0200001F0600000F0400000788000007D80 +00003D0000001E0000001F0000000F0000000F8000000F80000013C0000023E0000021E0000041 +F00000C0F8000080780001007C0003003C0002001E0006001F001F003F80FFC0FFF01C1C7F9B1F +>II<7FFFF07C01F07001E06003C06003C0400780400F80400F00401E00001E00003C00007C +0000780000F00000F00001E00003E00003C0100780100780100F00101F00301E00203C00203C00 +607800E0F803E0FFFFE0141C7E9B19>I<08081010202040404040808080808080B0B0F8F87878 +30300D0C7A9C15>92 D<1FC000307000783800781C00301C00001C00001C0001FC000F1C00381C +00701C00601C00E01C40E01C40E01C40603C40304E801F870012127E9115>97 +DI<07E00C301878307870306000E000E000E000E000E000 +E00060007004300418080C3007C00E127E9112>I<003F00000700000700000700000700000700 +00070000070000070000070000070003E7000C1700180F00300700700700600700E00700E00700 +E00700E00700E00700E00700600700700700300700180F000C370007C7E0131D7E9C17>I<03E0 +0C301818300C700E6006E006FFFEE000E000E000E00060007002300218040C1803E00F127F9112 +>I<00F8018C071E061E0E0C0E000E000E000E000E000E00FFE00E000E000E000E000E000E000E +000E000E000E000E000E000E000E000E000E007FE00F1D809C0D>I<00038003C4C00C38C01C38 +80181800381C00381C00381C00381C001818001C38000C300013C0001000003000001800001FF8 +001FFF001FFF803003806001C0C000C0C000C0C000C06001803003001C0E0007F800121C7F9215 +>II<18003C003C00180000000000000000000000000000 +00FC001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C00FF80091D +7F9C0C>I<00C001E001E000C000000000000000000000000000000FE000E000E000E000E000E0 +00E000E000E000E000E000E000E000E000E000E000E000E000E000E000E060E0F0C0F1C061803E +000B25839C0D>IIIII<03F0000E1C00180600300300700380600180E001C0E001C0E001 +C0E001C0E001C0E001C06001807003803003001806000E1C0003F00012127F9115>II<03C1000C3300180B00300F00700700700700E00700E00700E00700E00700E00700E00700 +600700700700300F00180F000C370007C700000700000700000700000700000700000700000700 +003FE0131A7E9116>II<1F9030704030C010C010E010F8007F803FE00FF000F8803880 +18C018C018E010D0608FC00D127F9110>I<04000400040004000C000C001C003C00FFE01C001C +001C001C001C001C001C001C001C001C101C101C101C101C100C100E2003C00C1A7F9910>IIII<7F8FF00F03800F030007020003840001C80001D80000F00000700000780000F80000 +9C00010E00020E000607000403801E07C0FF0FF81512809116>II<7FFC703860 +38407040F040E041C003C0038007000F040E041C043C0C380870087038FFF80E127F9112>III E /Fo 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 +D70 D +77 D86 DI<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 +D121 D E /Fp 10 116 df<78FCFCFCFC7806067A8512>46 D78 D82 D87 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 /Fq 15 118 df<1F003F807FC0FFC0FFE0FFE0FFF0FFF07FF03FB01F300030003000300030 +003000600060006000C000C000C0018001800300060006000C001800300020000C1F77C71D>39 +D70 +D72 D77 +D87 D<0003FE000000001FFFC00000007E03F0000000F000FC000001C0007E0000 +0380003F000007C0001F800007F0001FC0000FF0000FC0000FF8000FE0000FF8000FE0000FF800 +07F00007F00007F00007F00007F00001C00007F00000000007F00000000007F00000000007F000 +00000007F000000001FFF00000007FFFF0000003FF87F000001FF007F000007F8007F00001FE00 +07F00003F80007F00007F00007F0000FE00007F0001FC00007F0003FC00007F0003F800007F000 +7F800007F01C7F800007F01CFF000007F01CFF000007F01CFF000007F01CFF00000FF01CFF0000 +0FF01CFF00000FF01C7F80001BF01C7F800033F01C3FC00031F8381FC00061F8380FF001C0FC70 +03FC0780FFE000FFFE003FC0001FF8001F802E2F7CAD34>97 D<01FE0000000000FFFE00000000 +00FFFE0000000000FFFE000000000003FE000000000001FE000000000000FE000000000000FE00 +0000000000FE000000000000FE000000000000FE000000000000FE000000000000FE0000000000 +00FE000000000000FE000000000000FE000000000000FE000000000000FE000000000000FE0000 +00000000FE000000000000FE000000000000FE000000000000FE000000000000FE000000000000 +FE000000000000FE000000000000FE000000000000FE00FF00000000FE07FFF0000000FE1F01FC +000000FE38003E000000FE70001F800000FEC0000FC00000FF800007E00000FF800003F00000FF +000003F80000FE000001FC0000FE000001FC0000FE000000FE0000FE000000FE0000FE000000FF +0000FE000000FF0000FE0000007F8000FE0000007F8000FE0000007F8000FE0000007FC000FE00 +00007FC000FE0000007FC000FE0000007FC000FE0000007FC000FE0000007FC000FE0000007FC0 +00FE0000007FC000FE0000007FC000FE0000007FC000FE0000007F8000FE0000007F8000FE0000 +00FF8000FE000000FF0000FE000000FF0000FE000000FE0000FE000001FE0000FE000001FC0000 +FE000001F80000FF000003F00000FF800007F00000FD800007E00000F9C0000F800000F8E0003F +000000F078007E000000F01E03F8000000E00FFFE00000000001FE00000032497DC739>I<0000 +3FE0000001FFFE000007E01F80001F8003C0003E0000E0007C00007001F80000F803F80003F803 +F00003FC07F00007FC0FE00007FC1FE00007FC1FC00003F83FC00003F83FC00000E03FC0000000 +7FC00000007F800000007F80000000FF80000000FF80000000FF80000000FF80000000FF800000 +00FF80000000FF80000000FF80000000FF80000000FF800000007F800000007F800000007FC000 +00003FC00000003FC000000E1FC000000E1FE000000E0FE000001C0FF000001C07F000003803F8 +00003801F800007000FC0000E0007E0001C0001F800780000FE03E000001FFFC0000003FE00027 +2F7DAD2E>I<00007F80000003FFF000000FC0FC00003F003F00007C001F8000F8000FC001F800 +07E003F00007E007E00003F00FE00003F80FE00003F81FC00001FC1FC00001FC3FC00001FC3FC0 +0001FC7F800001FE7F800000FE7F800000FEFF800000FEFF800000FEFFFFFFFFFEFFFFFFFFFEFF +80000000FF80000000FF80000000FF80000000FF80000000FF800000007F800000007F80000000 +7F800000007FC00000003FC00000003FC000000E1FC000000E1FE000000E0FE000001C07E00000 +1C07F000003803F000007001F800007000FC0000E0003E0003C0001F8007000007E03E000001FF +F80000003FC000272F7DAD2E>101 D<01FE0000000000FFFE0000000000FFFE0000000000FFFE +000000000003FE000000000001FE000000000000FE000000000000FE000000000000FE00000000 +0000FE000000000000FE000000000000FE000000000000FE000000000000FE000000000000FE00 +0000000000FE000000000000FE000000000000FE000000000000FE000000000000FE0000000000 +00FE000000000000FE000000000000FE000000000000FE000000000000FE000000000000FE0000 +00000000FE000000000000FE000000000000FE001FFFFE0000FE001FFFFE0000FE001FFFFE0000 +FE0007FFE00000FE0003FF000000FE0001FC000000FE0001F0000000FE0003E0000000FE0003C0 +000000FE000780000000FE000E00000000FE001C00000000FE007800000000FE00F000000000FE +01E000000000FE03C000000000FE07C000000000FE0FC000000000FE1FE000000000FE3FF00000 +0000FEF3F000000000FFE3F800000000FFC1FC00000000FF80FE00000000FF00FE00000000FE00 +7F00000000FC003F80000000FC003F80000000FC001FC0000000FC000FE0000000FC000FE00000 +00FC0007F0000000FC0003F8000000FC0001F8000000FC0001FC000000FC0000FE000000FC0000 +FF000000FC00007F000000FC00007F800000FC00007FC00003FF0000FFF000FFFFFC07FFFF80FF +FFFC07FFFF80FFFFFC07FFFF8031487DC737>107 D<01FE00FFFE00FFFE00FFFE0003FE0001FE +0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE +0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE +0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE +0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE +0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0003FF80FFFFFEFFFF +FEFFFFFE17487DC71C>I<01FC007F800000FFFC03FFF00000FFFC0781F80000FFFC0C007C0000 +03FC18007E000001FC30003F000000FC60003F800000FCC0001F800000FD80001F800000FD8000 +1FC00000FF00001FC00000FF00001FC00000FF00001FC00000FE00001FC00000FE00001FC00000 +FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001F +C00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE +00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC0 +0000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00 +001FC00000FE00001FC00000FE00001FC00000FE00001FC00003FF80007FF000FFFFFE1FFFFFC0 +FFFFFE1FFFFFC0FFFFFE1FFFFFC0322D7CAC39>110 D<01FC01F800FFFC07FE00FFFC1E1F00FF +FC383F8003FC607FC001FC607FC000FCC07FC000FCC07FC000FD803F8000FD801F0000FF000E00 +00FF00000000FF00000000FF00000000FE00000000FE00000000FE00000000FE00000000FE0000 +0000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00 +000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE +00000000FE00000000FE00000000FE00000000FE00000000FE00000000FF00000003FF800000FF +FFFF8000FFFFFF8000FFFFFF8000222D7DAC28>114 D<001FF8060000FFFF0E0003F0079E0007 +8001FE000E00007E001C00003E003C00003E007800001E007800001E00F800001E00F800000E00 +F800000E00FC00000E00FC00000E00FE00000E00FF000000007FC00000007FF80000003FFFE000 +001FFFFE00000FFFFF800007FFFFE00003FFFFF00000FFFFFC00001FFFFE000001FFFE0000000F +FF00000001FF800000007F806000001FC0E000001FC0E000000FC0F000000FC0F0000007C0F000 +0007C0F0000007C0F8000007C0F800000780FC00000780FC00000F00FE00000F00FF00001E00FF +80003C00F9E0007800F0F803E000E03FFFC000C007FC0000222F7DAD29>I<01FE00003FC000FF +FE001FFFC000FFFE001FFFC000FFFE001FFFC00003FE00007FC00001FE00003FC00000FE00001F +C00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE +00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC0 +0000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00 +001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC000 +00FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00003FC00000FE0000 +3FC00000FE00003FC00000FE00007FC000007E00007FC000007E00007FC000003F0000DFC00000 +3F00019FE000001F00031FF000000F80061FFFC00007F01C1FFFC00001FFF81FFFC000003FE01F +E000322E7CAC39>117 D E end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 300dpi +TeXDict begin + +%%EndSetup +%%Page: 0 1 +0 0 bop 206 823 a Fq(F)-9 b(unnelW)g(eb)37 b(Hac)m(k)m(er's)d(Man)m(ual)603 +1151 y Fp(Ross)21 b(N.)g(Williams)519 1343 y Fo(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 Fn(Cop)o(yrigh)o(t)384 +2674 y(c)372 2675 y Fm(\015)14 b Fn(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 Fn(2)p eop +%%Page: 3 4 +3 3 bop 177 397 a Fl(Con)m(ten)m(ts)177 679 y Fk(Preface)1592 +b(5)177 794 y(Ac)o(kno)o(wledgemen)o(ts)1348 b(7)177 909 y(Presen)o(tation)12 +b(Notes)1347 b(9)177 1024 y(1)38 b(F)l(unnelW)l(eb)14 b(Design)1268 +b(11)239 1098 y Fn(1.1)42 b(Motiv)n(ation)12 b(for)i(F)m(unnelW)m(eb)k +Fj(:)j(:)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 Fn(11)239 +1172 y(1.2)42 b(Inden)o(tation)30 b Fj(:)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 Fn(12)239 +1245 y(1.3)42 b(Review)14 b(of)f(F)m(unnelW)m(eb)g(Syn)o(tax)28 +b Fj(:)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 Fn(14)335 +1319 y(1.3.1)46 b(Review)13 b(of)h(Macro)g(De\014nition)f(Syn)o(tax)k +Fj(:)j(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:) +g(:)h(:)f(:)g(:)61 b Fn(14)335 1393 y(1.3.2)46 b(Review)13 +b(of)h(Macro)g(Call)e(Syn)o(tax)26 b Fj(:)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 Fn(16)335 1467 y(1.3.3)46 b(Review)13 b(of)h(P)o(arameterized)g(Macro)g +(Call)f(Syn)o(tax)42 b Fj(:)20 b(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f +(:)g(:)h(:)f(:)g(:)61 b Fn(16)239 1540 y(1.4)42 b(Do)q(cumen)o(t)13 +b(Structuring)27 b Fj(:)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 Fn(16)239 1614 y(1.5)42 b(Discussion)14 b(of)f(Some)g +(Miscellaneous)h(Issues)30 b Fj(:)20 b(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:) +h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fn(18)239 +1688 y(1.6)42 b(Automated)13 b(Regression)h(T)m(esting)38 b +Fj(:)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 Fn(18)239 1761 +y(1.7)42 b(Command)11 b(Line)i(In)o(terface)j Fj(:)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 Fn(18)239 1835 y(1.8)42 b(File)13 +b(Name)g(Managemen)o(t)31 b Fj(:)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 Fn(19)335 1909 y(1.8.1)46 b(Filename)12 b(Extensions)24 +b Fj(:)c(:)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 Fn(20)335 +1982 y(1.8.2)46 b(Filename)12 b(Inheritance)k Fj(:)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(:)61 b Fn(20)335 2056 y(1.8.3)46 b(P)o(ortable)14 +b(Structure)h(of)f(File)f(Names)20 b Fj(:)g(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fn(21)239 2130 y(1.9)42 b(Sp)q(ecifying)13 b(Constrain)o(ts)i(on)e(the)i +(Num)o(b)q(er)e(of)g(Instan)o(tiations)38 b Fj(:)20 b(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fn(22)239 2204 y(1.10)21 +b(The)14 b(Relationship)f(Bet)o(w)o(een)i(Do)q(cumen)o(t)e(Structure)j(and)e +(Macro)g(Structure)19 b Fj(:)h(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fn(23)239 2277 y(1.11)21 b(Diagnostic)13 b(Messages)32 b +Fj(:)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 Fn(25)239 2351 y(1.12)21 b(Summary)31 b Fj(:)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 Fn(25)177 2466 y Fk(2)38 b(F)l(unnelW)l(eb)14 b(Implemen)o(tati)o(on)1077 +b(27)239 2540 y Fn(2.1)42 b(In)o(tro)q(duction)13 b Fj(:)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 Fn(27)239 2614 y(2.2)42 b(History)14 b(of)f(F)m(unnelW)m(eb)g +(Implemen)o(tations)40 b Fj(:)20 b(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:) +f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fn(27)239 +2687 y(2.3)42 b(Wh)o(y)13 b(F)m(unnelW)m(eb)h(W)m(asn't)e(Used)j(to)f(W)m +(rite)g(Itself)35 b Fj(:)21 b(:)f(:)g(:)h(:)f(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:)g +(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 b Fn(28)239 2761 y(2.4)42 +b(Co)q(ding)13 b(St)o(yle)38 b Fj(:)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 Fn(28)239 2835 +y(2.5)42 b(Use)15 b(of)e(Memory)27 b Fj(:)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 Fn(29)1053 2940 +y(3)p eop +%%Page: 4 5 +4 4 bop 239 42 a Fn(2.6)42 b(The)14 b(Heap)30 b Fj(:)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 Fn(29)239 116 y(2.7)42 b(The)14 b(Stac)o(k)24 b Fj(:)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(:)g(:)h(:)f(:)g(:)h(:)f(:)g(:)61 +b Fn(30)239 191 y(2.8)42 b(Static)14 b(V)m(ariables)k Fj(:)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 +Fn(30)239 266 y(2.9)42 b(Implemen)o(ting)11 b(T)m(ext)j(Inden)o(tation)25 +b Fj(:)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 Fn(30)177 +382 y Fk(3)38 b(F)l(unnelW)l(eb)14 b(Mo)q(di\014cation)1145 +b(35)239 457 y Fn(3.1)42 b(In)o(tro)q(duction)13 b Fj(:)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 Fn(35)239 531 y(3.2)42 b(The)14 b(Danger)g(of)f(Mo)q(difying)g +(Languages)26 b Fj(:)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 Fn(35)239 +606 y(3.3)42 b(Authorit)o(y)14 b(vs)g(User)h(Securit)o(y)43 +b Fj(:)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 +Fn(36)239 681 y(3.4)42 b(What)13 b(I)h(W)m(an)o(t)f(to)h(Protect)25 +b Fj(:)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 Fn(37)239 756 y(3.5)42 b(Mo)q(difying)12 b(the)j(Man)o(uals)c +Fj(:)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 Fn(38)239 830 y(3.6)42 b(Ho)o(w)13 b(Cop)o(yrigh)o(t)g(La)o(w)h(W)m(orks)37 +b Fj(:)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 +Fn(38)239 905 y(3.7)42 b(Managemen)o(t)13 b(of)g(the)h(O\016cial)f(F)m +(unnelW)m(eb)f Fj(:)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 Fn(39)239 980 +y(3.8)42 b(A)14 b(GNU)g(V)m(ersion?)29 b Fj(:)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 Fn(41)239 1054 +y(3.9)42 b(Summary)31 b Fj(:)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 Fn(41)177 1171 +y Fk(4)38 b(F)l(unnelW)l(eb)14 b(F)l(uture)1270 b(43)239 1245 +y Fn(4.1)42 b(Do)q(cumen)o(tation)25 b Fj(:)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 Fn(43)239 1320 +y(4.2)42 b(Command)11 b(Line)i(In)o(terface)j Fj(:)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 Fn(43)239 1395 y(4.3)42 b(Shell)13 +b(In)o(terpreter)42 b Fj(:)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 Fn(43)239 1469 y(4.4)42 b(Language)13 +b(Design)28 b Fj(:)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 Fn(44)239 1544 y(4.5)42 b(Scanner/Mapp)q(er)34 +b Fj(:)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 Fn(44)239 1619 y(4.6)42 b(P)o(arser)29 b Fj(:)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 Fn(45)239 1694 y(4.7)42 b(Analyser)16 b Fj(:)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 Fn(45)239 1768 y(4.8)42 b(T)m(angle)21 b Fj(:)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 Fn(45)239 1843 y(4.9)42 b(W)m(ea)o(v)o(e)26 b Fj(:)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 Fn(45)239 1918 y(4.10)21 b(Lister)39 b Fj(:)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 Fn(46)239 1993 y(4.11)21 b(Diagnostics)32 b Fj(:)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 Fn(47)239 2067 y(4.12)21 b(Sp)q(eed)37 b Fj(:)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 Fn(47)239 2142 y(4.13)21 b(Correctness)32 b Fj(:)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 Fn(47)239 2217 y(4.14)21 b(T)m(est)14 b(Suite)25 b Fj(:)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 Fn(47)239 2291 y(4.15)21 b(Mac)o(hine-Sp)q(eci\014c)15 +b(Changes)29 b Fj(:)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 Fn(48)239 2366 y(4.16)21 b(Summary)31 b Fj(:)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 Fn(48)177 2482 y Fk(A)26 b(GNU)16 b(General)e(Public)f(License)h(V)l +(ersion)g(2)841 b(49)177 2599 y(B)28 b(References)1436 b(57)177 +2715 y(Index)1605 b(57)1053 2940 y Fn(4)p eop +%%Page: 5 6 +5 5 bop 177 399 a Fl(Preface)177 639 y Fn(This)15 b(man)o(ual)d(is)j(for)f +(hac)o(k)o(ers!)22 b(An)o(y)o(one)15 b(who)g(w)o(an)o(ts)f(to)h(bash,)g +(diddle,)f(frob,)g(grind,)h(mangle,)d(patc)o(h,)j(p)q(ok)o(e,)177 +689 y(toggle,)e(t)o(widdle,)g(zap,)h(or)f(generally)h(hac)o(k)g(F)m(unnelW)m +(eb)f(should)h(at)g(least)g(tak)o(e)g(a)f(lo)q(ok)g(at)h(this)g(man)o(ual.) +177 764 y(This)g(do)q(cumen)o(t)f(has)h(b)q(een)h(created)h(to)e(serv)o(e)h +(t)o(w)o(o)e(purp)q(oses:)228 880 y(1.)20 b(T)m(o)12 b(act)h(as)f(a)h(rep)q +(ository)g(for)f(sp)q(eci\014c)j(design)d(and)h(implemen)o(tatio)o(n)d +(information)g(not)i(appropriate)h(to)281 930 y(b)q(e)h(included)g(in)g +(program)e(commen)o(ts.)228 1013 y(2.)20 b(T)m(o)13 b(guide)h(those)g(in)o +(terested)i(in)d(mo)q(difying)e(the)k(program.)177 1129 y(As)e(a)g(result,)g +(this)g(do)q(cumen)o(t)f(has)h(gro)o(wn)g(in)f(\014ts)i(and)e(starts.)19 +b(This)13 b(man)o(ual)d(is)j(not)f(a)h(particularly)f(p)q(olished)177 +1179 y(or)h(w)o(ell-balanced)e(do)q(cumen)o(t)h(but)h(it)f(should)h(b)q(e)g +(of)f(assistance)h(to)g(those)g(\(including)f(m)o(yself)s(\))f(in)o(v)o(olv)o +(ed)g(with)177 1229 y(mo)q(difying)g(F)m(unnelW)m(eb.)177 1328 +y Fk(Ross)k(N.)i(Williams)177 1378 y(Adelaide,)d(Australia)177 +1428 y(Ma)o(y)i(1992)1053 2940 y Fn(5)p eop +%%Page: 6 7 +6 6 bop 1053 2940 a Fn(6)p eop +%%Page: 7 8 +7 7 bop 177 399 a Fl(Ac)m(kno)m(wledgemen)m(ts)177 645 y Fn(Man)o(y)16 +b(thanks)h(to)g Fk(Da)o(vid)h(Hulse)d Fn(\()p Fi(dave@cs.adelaide.e)o(du.au)o +Fn(\))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 Fk(Simon)h(Hac)o(k)o(ett)e Fn(\()p +Fi(simon@internode.com)o(.au)p Fn(\))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 Fk(Jerem)o(y)i(Begg)f Fn(\()p Fi(jeremy@vsm.com.au)o +Fn(\))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 Fk(Barry)57 +b(Dwy)o(er)50 b Fn(\()p Fi(dwyer@cs.adelaid)o(e.edu)o(.au)p +Fn(\))d(and)j Fk(Roger)57 b(Brissenden)177 1367 y Fn(\()p Fi +(rjb@koala.harvard.e)o(du)p Fn(\))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 Fk(Ross)h(N.)i(Williams)177 1641 +y(Adelaide,)d(Australia)177 1691 y(Ma)o(y)i(1992)1053 2940 +y Fn(7)p eop +%%Page: 8 9 +8 8 bop 1053 2940 a Fn(8)p eop +%%Page: 9 10 +9 9 bop 177 399 a Fl(Presen)m(tation)42 b(Notes)177 639 y Fk(References:)e +Fn(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 Fk([)p +Fj(<)p Fh(\014rstauthor)p Fj(><)p Fh(ye)n(ar)p Fj(>)p Fk(])p +Fn(.)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 Fk(Sp)q(ecial)d +(terms:)17 b Fn(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 +839 y Fk(T)o(yp)q(esetting:)69 b Fn(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 +888 y(ro)o(w's)29 b(\()p Fi(akt150@cscgpo.anu.e)o(du.au)o Fn(\))e(implemen)o +(tatio)o(n)g(\(OzT)m(eX\))j(of)f(the)h(T)1558 897 y(E)1581 +888 y(X/L)1644 883 y Fg(a)1663 888 y Fn(T)1686 901 y(E)1709 +888 y(X)p Fk([Kn)o(uth84])177 938 y([Lamp)q(ort86])13 b Fn(t)o(yp)q(esetting) +i(system)e(running)h(on)g(a)f(Macin)o(tosh-SE.)177 1013 y Fk(Graphics:)i +Fn(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 1008 y Fg(a)1450 1013 y Fn(T)1473 1025 +y(E)1496 1013 y(X)f Fi(verbatim)f Fn(en)o(vironmen)o(t)177 +1063 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 +1058 y Fg(a)1714 1063 y Fn(T)1737 1075 y(E)1761 1063 y(X)g(without)177 +1112 y(access)g(to)e(the)g(author's)g(dra)o(wing)f(to)q(ols.)177 +1187 y Fk(Kno)o(wn)g(t)o(yp)q(esetting)d(problems:)k Fn(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 1237 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 1287 y(unable)h(to)g(w)o(ork)f(out)h(ho)o(w)g(to) +f(get)h(L)754 1282 y Fg(a)773 1287 y Fn(T)796 1299 y(E)820 +1287 y(X)g(to)g(suppress)h(blank)f(pages)g(at)f(the)i(start)f(of)g(c)o +(hapters.)1053 2940 y(9)p eop +%%Page: 10 11 +10 10 bop 1042 2940 a Fn(10)p eop +%%Page: 11 12 +11 11 bop 177 381 a Ff(Chapter)34 b(1)177 617 y Fl(F)-10 b(unnelW)g(eb)41 +b(Design)177 861 y Fn(This)18 b(c)o(hapter)i(con)o(tains)e(notes)h(on)f(the)h +(design)f(of)g(F)m(unnelW)m(eb.)31 b(These)19 b(notes)g(w)o(ere)h(not)e +(created)i(\\from)177 911 y(scratc)o(h",)d(as)f(the)g(original)e(v)o(ersion)i +(of)f(F)m(unnelW)m(eb)g(\()p Fk(F)l(unnelW)l(eb)h(V1)p Fn(\))g(w)o(as)g +(designed)g(and)g(constructed)177 961 y(in)d(a)h(h)o(urry)f(late)h(in)f +(1986,)f(and)h(no)h(design)f(notes)i(w)o(ere)f(ev)o(er)h(recorded.)k(These)c +(notes)f(are)g(in)f(fact)h(the)g(result)177 1011 y(of)g(a)h(complete)f +(review)h(of)f(the)h(F)m(unnelW)m(eb)f(design)h(that)g(to)q(ok)f(place)h(in)f +(late)h(1991)e(as)i(part)g(of)f(the)h(pro)q(cess)177 1061 y(of)e(upgrading)h +(it)f(for)h(public)f(release.)177 1139 y(Throughout)f(the)h(design)g(pro)q +(cess)h(I)f(tried)g(to)f(stic)o(k)g(to)h(the)g(principles)g(of)e(simplicit)o +(y)f(and)i(clarit)o(y)m(.)17 b(As)c(a)f(rule,)177 1188 y(it)17 +b(w)o(as)h(considered)h(more)e(imp)q(ortan)o(t)f(that)i(a)f(feature)h(b)q(e)h +(simple)d(and)h(not)h(allo)o(w)e(the)i(user)h(to)f(outsmart)177 +1238 y(himself)d(than)h(it)g(w)o(as)g(for)g(the)h(feature)f(to)h(b)q(e)f +(particularly)g(crisp.)26 b(F)m(or)15 b(example,)g(the)i(F)m(unnelW)m(eb)f +(macro)177 1288 y(calling)d(syn)o(tax)g(is)h(not)g(as)g(crisp)g(as)g(the)h(C) +f(syn)o(tax,)f(but)h(is)g(more)f(visible.)177 1366 y(T)m(o)i(some)f(exten)o +(t)i(the)g(design)f(review)h(w)o(as)f(in\015uenced)i(b)o(y)e(the)h +(requiremen)o(ts)f(of)g(bac)o(kw)o(ard)g(compatibilit)o(y)l(.)177 +1416 y(During)d(the)h(review)g(it)g(w)o(as)f(hard)h(not)f(to)h(think)f(ab)q +(out)g(all)g(the)h(source)h(\014les)e(in)h(F)m(unnelW)m(eb)f(V1)g(format)f +(that)177 1466 y(I)j(ha)o(v)o(e)f(written)i(o)o(v)o(er)f(the)g(y)o(ears)g +(that)g(w)o(ould)f(ha)o(v)o(e)h(to)f(b)q(e)i(con)o(v)o(erted)g(w)o(ere)f(I)g +(to)g(signi\014can)o(tly)e(deviate)j(from)177 1516 y(the)h(old)f(input)g +(language.)22 b(Luc)o(kily)14 b(it)h(turned)i(out)e(that)h(there)g(w)o(as)g +(little)e(clash)i(b)q(et)o(w)o(een)h(these)g(in)o(terests,)177 +1565 y(and)g(the)h(resulting)f(design)g(is)g(b)q(oth)g(clean)g(and)g(do)q(es) +h(not)f(require)h(m)o(uc)o(h)e(con)o(v)o(ersion)h(of)f(old)h(source)h +(\014les.)177 1615 y(The)f(main)d(revision)i(is)h(in)f(the)h(do)q(cumen)o(t)e +(structuring)j(facilit)o(y)m(.)23 b(F)m(unnelW)m(eb)16 b(V1)g(had)g(just)h(t) +o(w)o(o)f(lev)o(els)g(of)177 1665 y(heading)d(indicated)g(b)o(y)g +Fi(@*@*)g Fn(\(for)g(ma)r(jor)e(headings\))j(and)f Fi(@*)g +Fn(\(for)g(minor)e(headings\).)18 b(This)13 b(sc)o(heme)h(\(whic)o(h)177 +1715 y(w)o(as)i(copied)g(from)e(Kn)o(uth's)i(W)m(eb\))f(has)h(b)q(een)h +(replaced)g(b)o(y)e(a)h(hierarc)o(hical)f(sc)o(heme)h(of)f(\014v)o(e)h +(heading)g(lev)o(els)177 1765 y(lev)o(els)e(\()p Fi(@A)p Fj(:)7 +b(:)g(:)n Fi(@E)p Fn(\).)177 1843 y(This)18 b(c)o(hapter)h(is)e(rather)i +(unstructured,)i(acting)c(as)h(it)g(has,)g(mainly)e(as)i(a)f(dumping)f +(ground)i(for)f(random)177 1893 y(ideas)d(ab)q(out)g(F)m(unnelW)m(eb.)177 +2066 y Fe(1.1)70 b(Motiv)l(ation)22 b(for)i(F)-6 b(unnelW)g(eb)177 +2186 y Fn(During)16 b(1986,)f(I)h(w)o(as)g(exp)q(osed)i(to)e(Donald)f(Kn)o +(uth's)i Fi(WEB)e Fn(literate)i(programmi)o(ng)c(system)j(in)g(the)h(form)d +(of)177 2236 y(Jon)j(Ben)o(tley's)h Fh(Pr)n(o)n(gr)n(amming)f(Pe)n(arls)f +Fn(column)f(in)h Fh(Communic)n(ations)i(of)g(the)g(A)o(CM)7 +b Fk([Ben)o(tley86])p Fn(.)1825 2221 y Fd(1)1868 2236 y Fn(This)177 +2286 y(prompted)17 b(me)f(to)h(obtain)g(a)g(cop)o(y)g(of)g(the)h(rep)q(ort)g +(on)f(the)h(W)m(eb)f(system)p Fk([Kn)o(uth83])f Fn(and)h(to)g(try)h(out)f +(the)177 2336 y(program)12 b(whic)o(h)i(had)g(b)q(een)h(installed)e(on)h(the) +g(lo)q(cal)f(V)m(axen.)177 2414 y(W)m(eb)h(w)o(as)f(the)i(b)q(est)f(system)g +(that)g(I)f(had)h(seen)h(for)e(pro)q(ducing)h(prin)o(ted)g(and)g(online,)f +(inline)f(do)q(cumen)o(tation.)177 2464 y(T)m(o)k(me)g(the)i(most)e +(extraordinary)h(asp)q(ect)h(of)f(the)g(system)g(w)o(as)g(its)g(success)j +(despite)e(the)f(fact)g(that)g(it)g(had)177 2514 y(b)q(een)h(built)e(in)o(to) +h(the)g(horribly)g(an)o(tiquated)f(\014le/batc)o(h)h(pro)q(cessing)h(systems) +f(that)g(w)o(e)h(all)d(kno)o(w)i(and)f(lo)o(v)o(e)177 2563 +y(\(and)f(use\).)20 b(I)15 b(had)f(imagined)e(sophisticated)j(do)q(cumen)o +(tation)f(systems)g(b)q(efore)h(this)g(time,)e(but)i(had)f(alw)o(a)o(ys)177 +2613 y(assumed)i(that)h(they)g(w)o(ould)f(b)q(e)i(parts)f(of)f(complex)f +(programming)e(en)o(vironmen)o(ts.)26 b(Kn)o(uth)17 b(sho)o(w)o(ed)g(that,) +177 2663 y(to)f(some)e(exten)o(t,)j(it)e(can)h(b)q(e)g(done)g(using)f(1960s)g +(soft)o(w)o(are)h(tec)o(hnology)f(\(excluding)h(the)g(1980s)f(t)o(yp)q +(esetting)177 2713 y(tec)o(hnology\).)j(This)c(w)o(as)g(exciting.)p +177 2757 709 2 v 223 2783 a Fc(1)241 2795 y Fb(As)g(it)g(happ)q(ens,)e(this)h +(w)o(as)h(somewhat)f(of)g(a)h(luc)o(ky)e(encoun)o(ter.)20 b(I)14 +b(had)f(only)g(just)g(joined)f(the)h(A)o(CM)i(and)e(the)h(Ma)o(y)f(1986)177 +2835 y(issue)e(of)g(CA)o(CM)j(in)d(whic)o(h)g(the)f(column)g(app)q(eared)f(w) +o(as)j(the)e(\014rst)h(issue)g(I)g(receiv)o(ed.)1042 2940 y +Fn(11)p eop +%%Page: 12 13 +12 12 bop 177 42 a Fn(The)16 b(W)m(eb)g(system)f(w)o(as)h(en)o(ticing)f(and)h +(promising)d(but)j(to)g(me)e(su\013ered)k(from)c(man)o(y)g(dra)o(wbac)o(ks,)i +(man)o(y)d(of)177 91 y(whic)o(h)j(Kn)o(uth)g(had)g(promoted)f(as)h(adv)n(an)o +(tages.)23 b(The)17 b(follo)o(wing)c(highly)i(sub)r(jectiv)o(e)i(list)e(of)g +(disadv)n(an)o(tages)177 141 y(formed)e(a)g(springb)q(oard)h(for)g(the)g +(construction)h(of)f(F)m(unnelW)m(eb.)239 247 y Fm(\017)21 +b Fn(W)m(eb)13 b(can)i(only)e(pro)q(cess)i(P)o(ascal)f(programs.)239 +327 y Fm(\017)21 b Fn(W)m(eb)16 b(can)h(pro)q(duce)h(only)e(one)h(output)f +(\014le.)27 b(In)16 b(man)o(y)f(instances)j(it)e(is)g(desirable)h(to)g +(generate)h(more)281 377 y(than)g(one)h(output)g(\014le.)31 +b(F)m(or)18 b(example,)g(when)h(programming)c(in)j(Ada,)h(it)f(is)g +(desirable)h(to)f(write)h(a)281 427 y(pac)o(k)n(age)13 b(sp)q(eci\014cation)i +(and)f(a)f(pac)o(k)n(age)h(b)q(o)q(dy)g(together)h(in)e(the)i(same)e(\014le.) +239 507 y Fm(\017)21 b Fn(W)m(eb)15 b(enforces)h(Kn)o(uth's)f(individual)e +(st)o(yle)j(of)e(inden)o(tation.)21 b(W)m(eb)15 b(supplies)g(commands)e(to)i +(o)o(v)o(er-ride)281 557 y(the)h(automatic)e(inden)o(tation)h(but)g(it)g(is)h +(an)f(uphill)f(battle)i(and)f(the)h(co)q(de)h(b)q(ecomes)e(clogged)h(up)f +(with)281 606 y(format)d(directiv)o(es.)239 686 y Fm(\017)21 +b Fn(W)m(eb)f(do)q(es)i(not)f(cater)g(for)g(non-standard)g(P)o(ascal)f +(programs.)38 b(In)21 b(particular,)g(all)f(iden)o(ti\014ers)h(are)281 +736 y(truncated)15 b(to)f(ab)q(out)g(eigh)o(t)f(c)o(haracters.)239 +816 y Fm(\017)21 b Fn(W)m(eb)13 b(formats)g(the)h(program)f(output)h(\014le)g +(in)o(to)f(a)g(form)g(that)g(is)h(unreadable)g(to)g(h)o(umans.)239 +896 y Fm(\017)21 b Fn(W)m(eb)11 b(do)q(es)i(not)f(pro)o(vide)g(an)f(include)h +(facilit)o(y)m(.)j(This)d(w)o(as)g(considered)h(a)f(feature)g(essen)o(tial)h +(for)e(supp)q(ort-)281 946 y(ing)i(macro)g(libraries.)239 1026 +y Fm(\017)21 b Fn(W)m(eb)13 b(pro)o(vides)h(macros)f(with)g(at)h(most)e(one)i +(parameter.)k(Kn)o(uth)c(describ)q(es)i(a)d(hac)o(k)h(that)g(can)g(extract) +281 1076 y(a)d(m)o(ultiple)f(parameter)h(macro)g(facilit)o(y)f(from)g(a)h +(single)g(parameter)h(one,)g(but)g(it)f(is)g(hardly)h(satisfactory)m(.)239 +1156 y Fm(\017)21 b Fn(W)m(eb)13 b(do)q(es)i(not)f(pro)o(vide)g +(conditionals.)177 1262 y(Most)19 b(of)e(these)j(ob)r(jections)f(b)q(oiled)e +(do)o(wn)h(to)g(t)o(w)o(o)g(p)q(oin)o(ts:)27 b(that)18 b(W)m(eb)g(is)g(far)g +(to)q(o)g(sp)q(ecialized,)i(and)e(that)177 1312 y(Kn)o(uth's)h(\\Occam's)f +(Razor")h(had)g(cut)g(to)q(o)g(far.)33 b(What)18 b(I)h(w)o(an)o(ted)g(w)o(as) +g(a)f(do)q(cumen)o(tation)g(system)h(that)177 1362 y(emplo)o(y)o(ed)11 +b(all)g(the)i(same)f(principles)h(as)f(W)m(eb)g(but)h(w)o(as)g(far)f(more)f +(general.)18 b(The)13 b(result)g(w)o(as)f(F)m(unnelW)m(eb)g(V1,)177 +1412 y(whic)o(h)i(can)g(pro)q(cess)i(programs)c(in)h(an)o(y)h(language)f(or)h +(an)o(y)f(com)o(bination)e(of)i(languages)h(at)f(the)i(cost)f(of)f(t)o(yp)q +(e-)177 1461 y(setting)h(the)h(text)f(in)g Fi(tt)21 b(font)p +Fn(.)177 1533 y(Originally)m(,)13 b(it)i(w)o(as)g(in)o(tended)h(that)f(F)m +(unnelW)m(eb)f(w)o(ould)h(b)q(e)h(t)o(yp)q(esetter)h(indep)q(enden)o(t)g(as)e +(w)o(ell)f(as)i(language)177 1583 y(indep)q(enden)o(t.)23 b(It)15 +b(w)o(as)f(in)o(tended)i(that)f(a)f(format)f(\014le)i(consisting)g(of)g(a)f +(set)i(of)e(pro)q(ductions)i(describing)f(ho)o(w)177 1633 y(the)h(do)q(cumen) +o(t)e(\014le)i(w)o(as)f(to)f(b)q(e)i(formatted)e(w)o(ould)g(b)q(e)i(handed)g +(to)e(F)m(unnelW)m(eb)h(along)f(with)h(the)g(input)g(\014le.)177 +1683 y(In)k(the)g(end,)g(time)e(pressures)k(forced)e(me)f(to)g(tak)o(e)g(the) +h(bac)o(k)g(do)q(or)f(and)g(hac)o(k)h(up)f(a)g(T)1627 1691 +y(E)1650 1683 y(X)h(do)q(cumen)o(t)f(\014le)177 1732 y(generator.)h(This)14 +b(compromise)d(has)j(found)f(its)h(w)o(a)o(y)f(in)o(to)g(F)m(unnelW)m(eb)g +(V3.0)g(whic)o(h)g(is)h(still)e(relian)o(t)i(on)f(T)1883 1741 +y(E)1906 1732 y(X,)177 1782 y(although)f(V3.0)g(at)h(least)g(encourages)h +(input)f(\014les)g(to)g(b)q(e)g(t)o(yp)q(esetter)i(indep)q(enden)o(t.)k(It)13 +b(is)g(hop)q(ed)g(that)g(future)177 1832 y(v)o(ersions)i(of)e(F)m(unnelW)m +(eb)g(will)g(include)h(more)e(sophisticated)j(t)o(yp)q(esetting)g +(facilities.)177 1990 y Fe(1.2)70 b(Inden)n(tation)177 2103 +y Fn(A)12 b(macro)f(call)h(that)g(do)q(es)h(not)f(app)q(ear)h(at)f(the)h +(left)e(margin)g(is)h(called)g(an)f Fk(inden)o(ted)g(macro)i(call)f +Fn(and)g(seems)177 2153 y(to)f(lead)h(to)f(three)h(di\013eren)o(t)h +(alternativ)o(es)e(for)g(its)h(expansion:)k Fk(no)d(inden)o(tat)o(ion)o +Fn(,)8 b Fk(blank)k(inden)o(tati)o(on)p Fn(,)c(and)177 2202 +y Fk(text)15 b(inden)o(tati)o(on)p Fn(.)g(Here)g(are)f(examples)f(of)g(eac)o +(h)i(kind)e(of)g(inden)o(tation.)18 b(First)c(the)g(example)f(problem.)177 +2308 y Fi(@$@==@{@-)177 2358 y(Aardvark)177 2408 y(Walrus@})177 +2508 y(@O@==@{@-)177 2557 y(Zebra@)177 2607 +y(Giraffe)177 2657 y(@})177 2763 y Fn(There)i(are)g(three)g(w)o(a)o(ys)e +(that)h(the)h(second)g(line)e(of)g(the)i Fi(Sloth)e Fn(macro)f(can)i(b)q(e)h +(inden)o(ted.)177 2835 y Fk(No)h(inden)o(tati)o(on:)1042 2940 +y Fn(12)p eop +%%Page: 13 14 +13 13 bop 286 42 a Fi(ZebraAardvark)286 91 y(Walrus)286 141 +y(Giraffe)177 252 y Fk(Blank)15 b(inden)o(tati)o(on:)286 362 +y Fi(ZebraAardvark)395 412 y(Walrus)286 462 y(Giraffe)177 572 +y Fk(T)l(ext)h(inden)o(tati)o(on)o(:)286 683 y Fi(ZebraAardvark)286 +733 y(ZebraWalrus)286 783 y(Giraffe)177 893 y Fn(No)g(inden)o(tation)f(is)h +(useful)g(where)i(the)e(user)h(wishes)g(to)f(deal)g(with)g(the)g(output)g +(stream)g(as)g(a)g(pure)h(output)177 943 y(stream.)g(Blank)11 +b(inden)o(tation)g(is)g(useful)g(when)h(the)g(user)h(wishes)f(to)f(generate)h +(inden)o(ted)g(computer)f(programs.)177 993 y(T)m(ext)k(inden)o(tation)f(is)g +(useful)h(where)h(the)f(user)h(wishes)f(to)g(pre\014x)g(eac)o(h)h(line)e(of)g +(an)g(en)o(tire)i(macro)d(in)o(v)o(o)q(cation)177 1043 y(with)c(a)h(string.) +16 b(This)10 b(can)f(b)q(e)i(useful)e(for)g(commen)o(ting)e(out)j(co)q(de)g +(\(e.g.)f(in)g(Ada)g(using)h Fi(--)p Fn(\),)f(and)h(for)f(prep)q(ending)177 +1092 y(things)14 b(lik)o(e)f(a)h(dollar)e(sign)i(at)g(the)g(start)h(of)e(eac) +o(h)h(line)g(an)f(a)h(V)-5 b(AX)15 b(VMS)f(DCL)f(script)i(command)c(\014le.) +177 1168 y(F)m(unnelW)m(eb)i(V1)h(pro)o(vided)g(a)f(c)o(hoice)i(of)e(no)h +(inden)o(tation)f(or)h(blank)f(inden)o(tation.)k(The)d(c)o(hoice)h(w)o(as)f +(made)e(in)177 1218 y(the)j(command)c(line)i(and)h(could)g(not)f(b)q(e)i(o)o +(v)o(erridden.)177 1294 y(The)f(design)h(questions)f(are)g(as)g(follo)o(ws:) +228 1414 y(1.)20 b(Whic)o(h)13 b(of)h(the)g(three)h(kinds)f(of)f(inden)o +(tation)h(should)f(F)m(unnelW)m(eb)h(supp)q(ort?)228 1499 y(2.)20 +b(What)13 b(should)h(b)q(e)h(the)f(gran)o(ularit)o(y)f(of)g(sw)o(apping)g(b)q +(et)o(w)o(een)i(inden)o(tation)f(mo)q(des?)228 1585 y(3.)20 +b(Are)15 b(particular)e(inden)o(tation)h(mo)q(des)f(dangerous?)228 +1671 y(4.)20 b(Is)14 b(the)h(presence)h(of)d(particular)h(com)o(binations)e +(of)h(inden)o(tation)g(mo)q(des)g(confusing)h(to)g(the)g(user?)228 +1756 y(5.)20 b(Ho)o(w)13 b(and)h(when)h(should)e(the)i(c)o(hoice)f(of)f +(inden)o(tation)h(b)q(e)g(sp)q(eci\014ed?)177 1876 y(All)j(sorts)h(of)f(sc)o +(hemes)g(w)o(ere)i(considered,)g(including)d(a)h(\014nely)g(grained)g(system) +h(in)e(whic)o(h)i(the)g(user)g(could)177 1926 y(sp)q(ecify)13 +b(at)g(the)g(p)q(oin)o(t)f(of)g(call)g(whic)o(h)g(inden)o(tation)g(mo)q(de)f +(should)i(b)q(e)g(used)g(for)g(the)g(called)f(macro)f(expansion.)177 +2002 y(After)f(a)f(lot)g(of)g(though)o(t,)g(the)i(dominan)o(t)c(factor)i +(that)h(should)f(a\013ect)h(the)g(design)g(w)o(as)f(decided)h(to)g(b)q(e)g +(the)g Fh(clarity)177 2051 y Fn(in)k(the)g(user's)h(mind)d(of)h(the)i(inden)o +(tation)e(facilit)o(y)f(and)i(the)g Fh(danger)h Fn(asso)q(ciated)f(with)g +(misunderstanding)f(it.)177 2101 y(Here)f(are)f(t)o(w)o(o)f(examples)f(that)i +(sho)o(w)f(ho)o(w)g(easily)g(a)h(confusion)f(or)g(misunderstanding)g(of)g +(the)h(inden)o(ting)f(b)q(eing)177 2151 y(used)15 b(can)f(cause)h(danger.)j +(The)d(\014rst)f(example)f(sho)o(ws)h(ho)o(w)g(blank)f(or)h(no)f(inden)o +(tation)g(migh)o(t)f(b)q(e)j(misused.)177 2271 y Fi(--Misuse)20 +b(of)i(blank)e(\(and)h(no\))h(indentation.)177 2320 y(--@)177 +2440 y Fn(Here)d(the)g(user)g(has)g(assumed)e(that)h(text)h(inden)o(tation)e +(is)h(in)g(action)g(and)g(has)g(placed)g(an)g(Ada)g(commen)o(t)177 +2490 y(sym)o(b)q(ol)12 b(\\)p Fi(--)p Fn(")g(b)q(efore)i(the)g(in)o(v)o(o)q +(cation)e(of)h(the)h(macro)e Fi(@)f Fn(in)i(the)h(hop)q(e)g(that)f +(the)h(en)o(tire)g(text)g(of)f(the)177 2539 y(macro)d(w)o(ould)h(b)q(e)g +(pre\014xed)i(b)o(y)e(\\)p Fi(--)p Fn(".)16 b(The)c(result)g(could)f(b)q(e)h +(passed)g(b)o(y)f(the)h(compiler)d(whic)o(h)j(w)o(ould)e(activ)n(ate)177 +2589 y(all)j(but)h(the)g(\014rst)h(statemen)o(t)f(in)f(the)i(expansion)f(of)f +(macro)g Fi(@)p Fn(.)177 2665 y(The)h(next)h(example)d(demonstrates)j +(ho)o(w)e(text)i(inden)o(tation)e(could)h(b)q(e)g(misused.)177 +2785 y Fi(--Misuse)20 b(of)i(text)f(indentation:)177 2835 y(a++;)g(@) +1042 2940 y Fn(13)p eop +%%Page: 14 15 +14 14 bop 177 42 a Fn(Here)15 b(the)g(user)g(has)f(placed)g(the)h(call)e(to)h +Fi(@)e Fn(after)i(the)h(incremen)o(ting)e(of)g(v)n(ariable)g +Fi(a)p Fn(.)18 b(The)c(result)h(is)177 91 y(that)e(there)h(is)e(a)h(go)q(o)q +(d)f(c)o(hance)i(that)e(the)i(\\)p Fi(a++;)p Fn(")d(prep)q(ended)k(to)d(eac)o +(h)i(line)e(of)g(the)h(expansion)g(of)f Fi(@)177 141 +y Fn(will)h(b)q(e)h(passed)h(b)o(y)f(the)g(compiler)f(and)g(will)g(cause)i +Fi(a)e Fn(to)h(b)q(e)h(o)o(v)o(erincremen)o(ted.)177 216 y(These)h(examples)e +(are)h(not)g(to)f(b)q(e)i(laughed)e(at.)20 b(It)15 b(is)g(p)q(ossible)f(that) +h(F)m(unnelW)m(eb)f(will)g(b)q(e)h(used)h(widely)m(,)d(and)177 +266 y(the)i(problems)e(ab)q(o)o(v)o(e)h(ma)o(y)f(cause)i(problems)e(in)h +(critical)g(systems.)20 b(The)14 b(examples)g(ab)q(o)o(v)o(e)g(are)h +(particularly)177 316 y(scary)h(b)q(ecause)g(they)g(are)f(re\015exiv)o(e.)22 +b(One)15 b(cannot)g(simply)e(pin)h(the)i(blame)d(on)i(one)g(particular)f +(inden)o(tation)177 366 y(form.)j(A)d(little)g(though)o(t)f(rev)o(eals)i +(that)f(the)h(greatest)g(danger)g(lies)f(in)f Fh(c)n(onfusion)i +Fn(in)f(the)g(user's)i(mind.)g(If)e(the)177 416 y(user)h(is)f(confused)h(b)q +(et)o(w)o(een)g(text)f(or)g(blank)f(inden)o(ting,)g(problems)g(will)g(arise.) +177 491 y(There)20 b(seem)e(to)h(b)q(e)g(t)o(w)o(o)f(w)o(a)o(ys)g(to)g(solv)o +(e)h(the)g(problem.)31 b(The)19 b(\014rst)g(is)f(to)h(ban)f(all)f(macro)h +(calls)g(that)g(are)177 541 y(preceded)f(b)o(y)e(non-blank)f(text.)23 +b(This)15 b(is)g(not)g(a)f(go)q(o)q(d)h(option)f(b)q(ecause)j(there)g(are)e +(so)g(man)o(y)e(cases)k(where)f(it)177 591 y(is)g(desirable)g(to)f(expand)h +(more)f(than)g(one)h(single)g(line)f(macros)g(on)g(the)h(same)f(line.)23 +b(A)16 b(second)g(option)f(is)h(to)177 640 y(eliminate)e(one)i(of)g(the)g(t)o +(w)o(o)g(forms)e(so)i(as)g(to)g(reduce)i(the)e(p)q(oten)o(tial)g(for)f(am)o +(biguit)o(y)e(in)j(the)g(user's)h(mind.)23 b(I)177 690 y(c)o(ho)q(ose)17 +b(the)g(latter)f(option.)24 b(Of)16 b(the)g(t)o(w)o(o)g(forms,)f(the)h(clear) +h(c)o(hoice)f(for)g(elimination)d(is)j(text)h(inden)o(ting)e(for)177 +740 y(the)g(follo)o(wing)c(reasons:)228 858 y(1.)20 b(It)14 +b(actually)f(in)o(tro)q(duces)i(extra)f(text)h(whic)o(h)e(giv)o(es)h(it)g(an) +f(a)h(priori)f(p)q(oten)o(tial)g(for)h(problems.)228 942 y(2.)20 +b(It)14 b(is)g(harder)g(to)g(implemen)o(t)d(and)j(w)o(ould)f(slo)o(w)g(do)o +(wn)h(T)m(angle.)228 1026 y(3.)20 b(It)14 b(w)o(ould)f(not)h(b)q(e)g +(compatible)e(with)i(F)m(unnelW)m(eb)f(V1)h(whic)o(h)g(uses)h(blank)e(inden)o +(tation.)177 1144 y(The)18 b(only)f(other)h(decision)g(is)f(the)i(lev)o(el)e +(of)g(gran)o(ularit)o(y)f(of)h(c)o(hoice)h(b)q(et)o(w)o(een)h(the)f +(remaining)e(options:)25 b(no)177 1194 y(inden)o(tation)11 +b(and)h(blank)f(inden)o(tation.)17 b(F)m(unnelW)m(eb)11 b(V1)h(allo)o(w)o(ed) +e(this)i(c)o(hoice)g(to)g(b)q(e)g(made)f(in)g(the)i(command)177 +1243 y(line.)27 b(In)17 b(retrosp)q(ect,)j(this)d(w)o(as)g(bad)g(design)g(b)q +(ecause)i(the)f(user)g(migh)o(t)d(un)o(wittingly)g(co)q(de)j(certain)g(macro) +177 1293 y(calls)12 b(relying)h(on)f(one)h(or)g(the)g(other)h(mo)q(de.)i(A)d +(b)q(etter)h(system)f(is)f(to)h(allo)o(w)e(the)i(user)h(to)f(sp)q(ecify)g +(whic)o(h)g(mo)q(de)177 1343 y(in)h(the)g(input)g(\014le)g(itself.)j(This)d +(has)g(b)q(een)h(done)f(in)g(F)m(unnelW)m(eb)f(V3.)177 1418 +y(Again,)20 b(to)g(a)o(v)o(oid)f(confusion,)i(it)f(seems)g(sensible)h(to)f +(allo)o(w)e(the)j(user)g(only)e(one)h(inden)o(tation)g(mo)q(de)f(p)q(er)177 +1468 y(F)m(unnelW)m(eb)14 b(input)h(\014le.)20 b(In)15 b(most)e(cases,)j(the) +g(user)f(will)f(b)q(e)h(happ)o(y)f(with)h(blank)f(inden)o(tation)g(\(the)h +(default\))177 1518 y(and)f(there)h(will)d(b)q(e)j(no)f(need)h(for)e(c)o +(hange)h(an)o(yw)o(a)o(y)m(.)177 1593 y Fk(Decision:)j Fn(Implemen)o(t)12 +b(only)i(\\no)g(inden)o(tation")f(and)h(\\blank)g(inden)o(tation".)k(Mak)o(e) +c(the)h(c)o(hoice)g(of)f(inden-)177 1643 y(tation)j(a)g(static)h(attribute)g +(of)f(a)g(particular)h(F)m(unnelW)m(eb)f(run)g(that)h(is)f(sp)q(eci\014ed)i +(in)e(the)i(input)e(\014le.)29 b(This)177 1693 y(solution)13 +b(is)h(the)h(same)e(as)h(F)m(unnelW)m(eb)f(V1)h(except)h(that)f(the)h(c)o +(hoice)f(has)g(b)q(een)h(mo)o(v)o(ed)e(from)f(the)j(command)177 +1743 y(line)f(to)f(the)i(input)e(\014le.)177 1907 y Fe(1.3)70 +b(Review)20 b(of)k(F)-6 b(unnelW)g(eb)22 b(Syn)n(tax)177 2023 +y Fn(One)12 b(of)e(the)i(distressing)g(asp)q(ects)h(of)d(F)m(unnelW)m(eb)h +(V1)f(w)o(as)h(its)g(clumsy)f(macro)g(de\014nition)h(and)g(calling)e(syn)o +(tax.)177 2073 y(Compared)14 b(to)h(\(sa)o(y\))g(the)g(C)g(prepro)q(cessor,)i +(F)m(unnelW)m(eb's)d(macro)g(call)g(syn)o(tax)h(is)g(lik)o(e)f(a)g(freigh)o +(t)h(train)g(in)f(a)177 2123 y(c)o(hina)i(sho)o(w.)24 b(During)15 +b(the)h(F)m(unnelW)m(eb)f(redesign,)i(a)f(complete)f(review)h(of)g(this)f +(syn)o(tax)h(to)q(ok)g(place)g(to)g(try)177 2173 y(to)f(neaten)h(it)f(up.)22 +b(Surprisingly)m(,)14 b(the)i(V1)f(syn)o(tax)g(surviv)o(ed)h(unscathed)g +(with)f(the)h(exception)g(that)f(\\)p Fi(==)p Fn(")f(in)177 +2223 y(macro)i(de\014nitions)i(w)o(as)f(made)g(optional.)27 +b(The)18 b(surviv)n(al)f(of)g(this)g(clumsy)g(syn)o(tax)g(w)o(as)h(a)f(pro)q +(duct)h(of)f(the)177 2272 y(design)d(goal)f(of)g(making)f(ev)o(erything)i +(simple,)e(explicit,)h(and)g(not)h(sub)r(ject)i(to)d(subtle)i(errors.)177 +2415 y Fa(1.3.1)55 b(Review)18 b(of)g(Macro)h(De\014nition)f(Syn)n(tax)177 +2518 y Fn(F)m(unnelW)m(eb)i(V1)h(used)g(a)f(macro)g(de\014nition)g(syn)o(tax) +h(that)f(resulted)i(in)e(macro)g(de\014nitions)g(suc)o(h)h(as)g(the)177 +2568 y(follo)o(wing.)177 2685 y Fi(@$@==@{@-)177 +2735 y(Open)g(the)g(door)177 2785 y(Say)g(out)177 2835 y(Close)g(the)g +(door@})1042 2940 y Fn(14)p eop +%%Page: 15 16 +15 15 bop 177 42 a Fn(This)16 b(is)f(messy)m(,)g(but)h(I)g(couldn't)f(think)h +(of)f(an)o(ything)g(b)q(etter)i(at)e(the)i(time.)22 b(The)16 +b Fi(@$)f Fn(is)h(necessary)i(to)d(cue)i(a)177 91 y(de\014nition.)k(Without) +14 b(it,)h(the)g(de\014nition)g(migh)o(t)e(someho)o(w)g(b)q(e)j(mistak)o(en)e +(for)g(an)h(in)o(v)o(o)q(cation.)20 b(The)15 b Fi(@<)g Fn(and)177 +141 y Fi(@>)e Fn(delimit)d(the)k(name.)j(The)c Fi(@)p Fm(f)g +Fn(and)f Fi(@)p Fm(g)h Fn(delimit)e(the)i(text.)19 b(The)13 +b Fi(@-)g Fn(is)f(a)h(pro)q(duct)h(of)e(the)i(rule)f(\\exactly)g(the)177 +191 y(text)i(b)q(et)o(w)o(een)g(the)f Fi(@)p Fm(f)g Fn(and)g +Fi(@)p Fm(g)p Fn(".)177 260 y(The)g(only)f(real)h(target)g(is)g(the)g(\\)p +Fi(+=)p Fn(")f(and)g(\\)p Fi(==)p Fn(")g(whic)o(h)h(really)f(break)h(all)f +(the)h(rules)g(and)g(should)f(b)q(e)i(c)o(hanged.)177 310 y(Unfortunately)f +(I)h(couldn't)e(think)h(of)g(an)o(ything)f(to)h(c)o(hange)h(them)e(to.)19 +b(If)14 b(there)i(w)o(as)e(no)g Fi(+=)g Fn(mec)o(hanism,)e(w)o(e)177 +360 y(could)i(use:)177 458 y Fi(@$@@{)177 +507 y(Open)g(the)g(door)177 557 y(Say)g(out)177 607 y(Close)g(the)g(door@}) +177 705 y Fn(In)14 b(fact,)f(eliminating)d Fi(+=)j Fn(is)h(think)n(able)e(b)q +(ecause)k(it)d(do)q(es)h(not)g(app)q(ear)g(in)f(man)o(y)e(of)i(m)o(y)f +(existing)h(F)m(unnelW)m(eb)177 754 y(source)i(\014les.)k(This)14 +b(indicates)g(at)f(least)i(that)e(it)h(w)o(as)g(not)g(needed)h(m)o(uc)o(h)e +(b)o(y)g(m)o(yself.)177 824 y(A)h(minim)o(ali)o(st)e(construct)j(could)f(b)q +(e)177 921 y Fi(@)177 971 y(Open)g(the)g(door)177 +1021 y(Say)g(out)177 1071 y(Close)g(the)g(door@})177 1168 y +Fn(but)14 b(this)g(is)g(to)q(o)g(dangerous)g(for)g(m)o(y)e(tastes.)177 +1238 y Fk(Decision:)j Fn(F)m(or)c(compatibili)o(t)o(y)d(reasons,)k(retain)g +(the)f(old)g Fi(+=)f Fn(and)h Fi(==)g Fn(constructs,)i(but)e(mak)o(e)e(them)i +(optional.)177 1287 y(The)j(new)h(syn)o(tax)f(for)f(de\014ning)h(macros)f +(is:)177 1385 y Fi(@$@@{)177 1435 +y(Open)g(the)g(door)177 1485 y(Say)g(out)177 1534 y(Close)g(the)g(door@})177 +1632 y Fn(Next)12 b(w)o(e)f(turn)h(to)f(parameterized)g(macro)f +(de\014nitions.)17 b(A)11 b(con)o(v)o(en)o(tional)f(F)m(unnelW)m(eb)h +(parameterized)g(macro)177 1682 y(de\014nition)j(lo)q(oks)f(lik)o(e)g(this:) +177 1779 y Fi(@$@@\(@3@\)==@{@-)177 +1829 y(Open)g(the)g(door)177 1879 y(Say)g(out)177 1929 y(Close)g(the)g +(door@})177 2026 y Fn(whic)o(h)14 b(is)g(a)f(bit)h(messy)m(.)j(The)d(natural) +g(alternativ)o(e)f(is)h(ev)o(en)h(w)o(orse:)177 2124 y Fi(@$@@\(@1@,@2@,@3)o(@\)==@)o({@-)177 2174 y(Open)g(the)g(door) +177 2224 y(Say)g(out)177 2273 y(Close)g(the)g(door@})177 2371 +y Fn(Th)o(us,)12 b(just)g(sp)q(ecifying)f(the)h(n)o(um)o(b)q(er)f(of)g +(parameters)h(seems)g(sensible.)18 b(Ho)o(w)o(ev)o(er,)12 b(p)q(erhaps)g(the) +g(syn)o(tax)g(could)177 2421 y(b)q(e)j(trimmed)c(to)177 2518 +y Fi(@$@@3==@{@-)177 2568 y(Open)g(the)g(door)177 +2618 y(Say)g(out)177 2668 y(Close)g(the)g(door@})177 2765 y +Fn(I)14 b(decided)h(to)f(reject)h(this)f(in)f(fa)o(v)o(our)g(of)h(the)g(old)f +(syn)o(tax.)177 2835 y Fk(Decision:)j Fn(Retain)e(the)g(old)f(syn)o(tax)h(of) +f Fj(:)7 b(:)g(:)o Fi(@\(@3@\))p Fj(:)g(:)g(:)1042 2940 y Fn(15)p +eop +%%Page: 16 17 +16 16 bop 177 42 a Fa(1.3.2)55 b(Review)18 b(of)g(Macro)h(Call)g(Syn)n(tax) +177 147 y Fn(Here)c(are)g(some)e(ideas)h(for)f(alternativ)o(es)h(to)g(the)g +(F)m(unnelW)m(eb)g(V1)f(macro)g(call)g(syn)o(tax.)177 270 y +Fi(Open)21 b(the)g(door)177 320 y(@)195 b(@!)21 +b(FunnelWeb~V1)f(style.)177 370 y(Close)h(the)g(door)177 470 +y(Open)g(the)g(door)177 520 y(@@)177 569 y(Close)g(the)g(door)177 +669 y(Open)g(the)g(door)177 719 y(@"Say)g(out@")177 769 y(Close)g(the)g(door) +177 868 y(Open)g(the)g(door)177 918 y(@\(Say)g(out@\))177 968 +y(Close)g(the)g(door)177 1068 y(Open)g(the)g(door)177 1117 +y(@)177 1167 y(Close)g(the)g(door)177 1291 y Fk(Decision:)29 +b Fn(Con)o(tin)o(ue)20 b(with)g(the)g(old)g(notation.)36 b(It)20 +b(ma)o(y)e(not)i(b)q(e)h(neat,)h(but)e(at)g(least)h(it)e(is)h(clear)h(and)177 +1340 y(consisten)o(t.)j(The)16 b(main)d(temptation)h(is)h(the)h(format)e +Fi(@@)14 b Fn(whic)o(h)h(lo)q(oks)g(rather)i(go)q(o)q(d.)22 +b(Ho)o(w)o(ev)o(er,)177 1390 y(it)14 b(breaks)g(the)h(sp)q(ecial)f(sequence)i +(rational)d(and)g(hence)j(is)d(to)q(o)h(confusing.)177 1540 +y Fa(1.3.3)55 b(Review)18 b(of)g(P)n(arameterized)f(Macro)i(Call)f(Syn)n(tax) +177 1646 y Fn(F)m(unnelW)m(eb)c(V1)f(pro)o(vided)h(a)g(messy)f(parameterized) +h(macro)f(call)g(syn)o(tax:)177 1769 y Fi(@@\(@"firstpar)o +(am@")d(@,)k(@"Secondparam@")c(@,)k(@"thirdparam@")d(@\))177 +1893 y Fn(This)d(syn)o(tax)g(can)g(b)q(e)g(cleaned)h(up)f(considerably)g(b)o +(y)g(making)d(the)k Fi(@")e Fn(sym)o(b)q(ols)g(optional.)22 +b(This)16 b(results)h(in)177 1942 y(calls)d(suc)o(h)g(as)g(the)h(follo)o +(wing:)177 2066 y Fi(@@\(firstparam)o(@,Sec)o(ondpa)o(ram@,)o +(thir)o(dpara)o(m@\))177 2189 y Fn(As)c(the)g(\014rst)g(form)e(allo)o(ws)g +(the)i(alignmen)o(t)d(of)h(complicated)h(parameters)g(b)o(y)g(allo)o(wing)e +(white)j(space)g(to)f(b)q(e)177 2239 y(inserted)h(outside)f(the)g +Fi(@")p Fn(,)f(and)h(the)g(second)h(form)d(is)h(cleaner,)i(b)q(oth)f(are)g +(retained)g(simply)e(b)o(y)h(making)e(the)177 2289 y(quotes)i(optional.)177 +2366 y Fk(Decision:)h Fn(Mak)o(e)e(the)h(double)e(quotes)i(optional.)177 +2538 y Fe(1.4)70 b(Do)r(cumen)n(t)21 b(Structuring)177 2657 +y Fn(Exp)q(erience)e(with)e(F)m(unnelW)m(eb)f(V1,)h(whic)o(h)g(pro)o(vided)g +(only)f(t)o(w)o(o)h(lev)o(els)g(of)f(headings)h(\(ma)r(jor)f(and)g(minor\)) +177 2707 y(pro)o(v)o(ed)10 b(that)h(there)g(w)o(as)f(a)g(strong)g(need)h(for) +f(fully)f(hierarc)o(hical)h(m)o(ultiple-lev)o(el)d(headings.)17 +b(The)10 b(only)g(question)177 2757 y(w)o(as)k(ho)o(w)f(it)h(should)g(b)q(e)g +(done.)177 2835 y(Here)h(are)g(some)e(ideas)h(that)g(w)o(ere)g(considered.) +1042 2940 y(16)p eop +%%Page: 17 18 +17 17 bop 177 42 a Fi(@*@)177 91 y(@**@)177 141 y(@***@)177 241 +y(@*@)177 291 y(@*@*@)177 +340 y(@*@*@*@)177 440 y(@s@)177 +490 y(@ss@)177 540 y(@sss@) +177 639 y(@s@)177 689 y(@s@s@)177 +739 y(@s@s@s@)177 839 y(@S@)177 +888 y(@SS@)177 938 y(@SSS@) +177 1038 y(@S@)177 1088 y(@S@S@)177 +1137 y(@S@S@S@)177 1237 y(@A@)238 +b(--)22 b(The)f(syntax)f(finally)h(chosen.)177 1287 y(@B@)177 1337 y(@C@)177 1436 +y(@A)h(Main)f(Program)177 1486 y(@B)h(Read)f(the)g(Message)177 +1536 y(@C)h(Encrypt)e(the)h(Buffer)177 1636 y(@*A)g(Main)g(Program)177 +1685 y(@*B)g(Read)g(the)g(Message)177 1735 y(@*C)g(Encrypt)g(the)g(Buffer)177 +1835 y(@1@)177 1885 y(@2@)177 +1934 y(@3@)177 1984 y(\(using)g(@A..@I@)f(as)h +(macro)g(parameters)f(or)h(overload)f(@1..@9\))177 2084 y(@*@1@)177 2134 y(@*@2@)177 2183 +y(@*@3@)177 2233 y(\(using)g(@A..@I@)f(as)h(macro)g +(parameters)f(or)h(overload)f(@1..@9\))177 2351 y Fn(Cho)q(osing)f(b)q(et)o +(w)o(een)i(these)g(alternativ)o(es)e(w)o(as)h(not)f(easy)m(.)35 +b(The)20 b(follo)o(wing)d(though)o(ts)j(con)o(tributed)g(to)f(the)177 +2400 y(decision.)239 2518 y Fm(\017)i Fn(Syn)o(taxes)14 b(that)g(require)h +(visual)e(coun)o(ting)g(are)i(probably)e(not)h(a)f(go)q(o)q(d)h(idea.)239 +2601 y Fm(\017)21 b Fn(Syn)o(taxes)14 b(that)f(do)g(not)h(delimit)d(the)j +(heading)f(name)f(someho)o(w)h(are)g(lik)o(ely)f(to)i(cause)g(problems)f +(where)281 2651 y(heading)18 b(names)f(are)h(omitted.)30 b(Users)19 +b(will)e(b)q(e)i(tempted)f(to)g(start)g(paragraphs)h(after)f(the)h(start)f +(of)281 2701 y(heading)c(sym)o(b)q(ol)f(and)h(the)h(result)g(is)f(that)h(the) +g(\014rst)g(line)f(of)g(the)h(paragraph)f(will)f(b)q(e)i(suc)o(k)o(ed)g(in)o +(to)f(the)281 2751 y(heading.)239 2835 y Fm(\017)21 b Fn(Ov)o(erloading)13 +b(the)h Fi(@1)p Fn(,)f Fj(:)7 b(:)g(:)o Fn(,)13 b Fi(@9)h Fn(sequences)i(is)e +(undesirable.)1042 2940 y(17)p eop +%%Page: 18 19 +18 18 bop 177 42 a Fk(Decision:)21 b Fn(Use)c Fi(@A)p Fj(:)7 +b(:)g(:)n Fi(@E)16 b Fn(with)g(optional)f(follo)o(wing)e(macro)i(name)g(syn)o +(tax)h(for)g(the)h(section)g(name.)24 b(Note:)177 91 y(W)m(e)15 +b(stop)g(at)g Fi(@E)f Fn(b)q(ecause)j(\014v)o(e)e(lev)o(els)g(is)g(probably)f +(su\016cien)o(t,)i(and)e(w)o(e)i(ma)o(y)d(wish)h(later)i(to)e(use)i +Fi(@F)f Fn(for)f Fk(F)p Fn(ile)177 141 y(\(to)g(augmen)o(t)f(or)g(replace)i +Fi(@O)p Fn(\).)177 321 y Fe(1.5)70 b(Discussion)21 b(of)j(Some)e(Miscell)o +(aneous)f(Issues)177 445 y Fk(Commen)o(t)d(duplication)o(:)k +Fn(If)17 b(the)h(F)m(unnelW)m(eb)f(user)h(inserts)g(commen)o(ts)d(in)o(to)i +(the)h(target)f(co)q(de)h(\(in)f(the)177 495 y Fi(.fw)12 b +Fn(\014le\))g(as)g(w)o(ell)f(as)h(in)o(to)g(the)g(do)q(cumen)o(tation)f +(\(free)i(text\))g(part)f(of)g(the)g Fi(.fw)g Fn(\014le,)g(then)h(it)e(is)h +(p)q(ossible)g(for)g(the)177 544 y(situation)h(to)h(get)g(a)g(bit)f(silly)m +(.)k Fk(Decision:)f Fn(This)e(is)g(a)f(problem)g(for)g(the)i(programmer,)c +(not)j(for)f(F)m(unnelW)m(eb.)177 625 y Fk(Out-of-date)k(do)q(cumen)o(tation) +o(:)22 b Fn(Sometimes)14 b(it)j(is)f(all)g(to)q(o)h(easy)g(for)f(the)i +(programmer)c(to)j(mo)q(dify)d(the)177 674 y(co)q(de)k(without)e(up)q(dating) +g(the)h(surrounding)g(do)q(cumen)o(tation.)24 b Fk(Decision:)e +Fn(This)16 b(is)h(a)f(serious)h(and)f(ma)r(jor)177 724 y(problem.)27 +b(In)17 b(an)g(automated)f(en)o(vironmen)o(t,)g(it)h(ma)o(y)e(b)q(e)j(p)q +(ossible)f(to)g(create)i(a)e(system)g(of)f(dep)q(endencies)177 +774 y(b)q(et)o(w)o(een)h(scraps)g(of)d(co)q(de)i(and)g(scraps)g(of)f(do)q +(cumen)o(tation.)21 b(Ho)o(w)o(ev)o(er,)16 b(it)f(is)g(hard)h(to)f(see)h(ho)o +(w)f(a)g(to)q(ol)g(suc)o(h)177 824 y(as)f(F)m(unnelW)m(eb)f(could)h(pro)o +(vide)g(supp)q(ort)h(for)e(prev)o(en)o(tion)h(of)g(this)g(sort)g(of)f(error.) +177 904 y Fk(Meta-macro-lev)o(el)j(parameterization:)k Fn(Sometimes,)14 +b(when)j(using)f(F)m(unnelW)m(eb,)g(the)g(facilit)o(y)f(to)h(use)177 +954 y(one)11 b(macro)f(to)h(construct)i(the)e(name)f(of)h(another)g(has)g(b)q +(een)h(needed.)19 b Fk(Decision:)c Fn(Allo)o(wing)9 b(macro)h(names)g(to)177 +1004 y(b)q(e)k(constructed)h(w)o(ould)e(lose)g(the)h(simple)d(nature)j(of)f +(the)h(prepro)q(cessor)h(and)e(so)h(this)f(suggestion)g(is)g(rejected.)177 +1084 y Fk(Clumsy)j(notation:)h Fn(The)e Fi(@)f Fn(notation)f(can)i(b)q(e)g +(clumsy)m(.)j Fk(Decision:)f Fn(This)e(is)f(necessary)i(to)f(main)o(tain)c +(the)177 1134 y(simplicit)o(y)h(of)h(the)h(translation.)177 +1314 y Fe(1.6)70 b(Automated)22 b(Regression)g(T)-6 b(esting)177 +1438 y Fn(Automated)13 b(regression)i(testing)f(is)g(extremely)g(imp)q(ortan) +o(t)e(for)h(t)o(w)o(o)h(reasons:)228 1568 y(1.)20 b(It)14 b(pro)o(vides)g +(con\014dence)i(that)e(c)o(hanges)g(made)f(to)h(the)g(program)e(ha)o(v)o(e)i +(not)g(in)o(tro)q(duced)h(bugs.)228 1662 y(2.)20 b(It)11 b(allo)o(ws)e(p)q +(ortabilit)o(y)g(problems)h(to)g(b)q(e)i(pinp)q(oin)o(ted)e(when)h(the)g +(program)e(is)i(mo)o(v)o(ed)e(to)h(a)g(new)i(mac)o(hine.)177 +1792 y(The)j(simplest)e(w)o(a)o(y)g(to)h(set)h(up)g(automated)d(regression)k +(testing)e(is)g(to)g(construct)i(a)e(suite)h(of)e(test)i(cases)h(\(and)177 +1842 y(their)e(solutions\))e(and)h(then)h(write)f(a)g(script)g(in)g(the)g +(target)h(mac)o(hine's)d(command)g(language)h(to)g(run)i(through)177 +1892 y(the)k(suite.)29 b(Unfortunately)m(,)17 b(there)i(is)e(no)g(command)d +(language)j(that)g(is)g(shared)h(among)e(the)i(mac)o(hines)e(to)177 +1941 y(whic)o(h)f(F)m(unnelW)m(eb)f(m)o(ust)g(b)q(e)h(p)q(orted.)22 +b(These)16 b(mac)o(hines)e(are)i(at)e(least:)20 b(Macin)o(tosh,)15 +b(IBM-PC,)g(Sun,)g(VMS)177 1991 y(V)m(ax.)177 2072 y(One)h(option)e(is)h +(simply)e(to)i(rewrite)h(the)g(script)g(in)e(eac)o(h)i(mac)o(hine's)d +(particular)i(command)d(language.)21 b(This)177 2121 y(w)o(ould)15 +b(b)q(e)i(a)e(feasible)h(option)f(w)o(ere)i(it)e(not)h(for)f(the)i(fact)f +(that)g(the)g(Macin)o(tosh)g(\(the)g(mac)o(hine)f(up)q(on)h(whic)o(h)177 +2171 y(F)m(unnelW)m(eb)e(w)o(as)f(dev)o(elop)q(ed\))i(do)q(es)g(not)e(ha)o(v) +o(e)h(a)g(command)d(language!)177 2252 y(After)i(some)f(though)o(t,)g(I)g +(decided)i(that)e(the)h(b)q(est)h(solution)e(to)g(the)h(problem)e(w)o(as)i +(to)f(create)i(a)e(command)e(lan-)177 2301 y(guage)i Fh(within)h(F)m +(unnelWeb)p Fn(.)18 b(F)m(unnelW)m(eb)12 b(could)g(then)h(b)q(e)f(in)o(v)o +(ok)o(ed)g(in)f(t)o(w)o(o)h(mo)q(des,)f(one-shot)i(command)c(line)177 +2351 y(or)15 b(in)o(teractiv)o(e/script.)20 b(This)15 b(approac)o(h)f(had)g +(the)h(b)q(ene\014t)h(of)e(pro)o(viding)f(total)h(con)o(trol)g(o)o(v)o(er)g +(the)i(command)177 2401 y(language)d(and)h(its)g(complete)f(p)q(ortabilit)o +(y)m(.)177 2481 y(The)h(result)h(is)f(describ)q(ed)i(in)d(the)h +Fh(F)m(unnelWeb)j(User's)d(Manual)p Fn(.)177 2661 y Fe(1.7)70 +b(Command)22 b(Line)g(In)n(terface)177 2785 y Fn(F)m(unnelW)m(eb)12 +b(V1)g(w)o(as)g(implemen)o(ted)e(in)i(Ada)g(and)g(runs)h(on)f(a)g(VMS)g(V)-5 +b(AX.)13 b(As)g(suc)o(h)g(it)e(has)i(a)f(full)f(VMS)h(DCL)177 +2835 y(command)f(line)j(in)o(terface.)k(Here)d(is)f(the)h(\\)p +Fi(.CLD)p Fn(")d(\014le)i(for)g(the)g(DCL)g(command)d(line)i(in)o(terface.) +1042 2940 y(18)p eop +%%Page: 19 20 +19 19 bop 177 42 a Fi(!)22 b(FUNNELWEB)e(Command)g(Definition)177 +91 y(!)i(================)o(=====)o(=====)o(==)177 141 y(!)g(Ross)f +(Williams.)f(28)h(April)g(1987.)177 241 y(module)g(command_table)243 +291 y(define)f(verb)h(dummy_command)243 340 y(parameter)e(p1)240 +b(,)21 b(label=input_file)62 b(,value\(required,type)o(=$fi)o(le\))243 +390 y(qualifier)19 b(include_files,)g(label=include_files)o(,valu)o(e\(typ)o +(e=$fi)o(le\))g(,default)243 440 y(qualifier)g(output_files)h(,)h +(label=output_files)d(,value\(type=$file\))h(,default)243 490 +y(qualifier)g(delete)152 b(,)21 b(label=delete)565 b(,default)243 +540 y(qualifier)19 b(tex_file)108 b(,)21 b(label=tex_file)106 +b(,value\(type=$file\))19 b(,default)243 589 y(qualifier)g(listing_file)h(,)h +(label=listing_file)d(,value\(type=$file\))h(,default)243 639 +y(qualifier)g(brief)174 b(,)21 b(label=brief,value\(t)o(ype=$)o(numbe)o +(r,def)o(ault=)o(5\),d)o(efaul)o(t)243 689 y(qualifier)e(screen)152 +b(,)21 b(label=screen)150 b(,value\(type=$number,)o(defa)o(ult=0)o(\))243 +739 y(qualifier)19 b(trace)174 b(,)21 b(label=trace)243 789 +y(qualifier)e(file_spec)86 b(,)21 b(label=file_spec)243 839 +y(qualifier)e(compare)177 981 y Fn(As)d(p)q(ortabilit)o(y)f(w)o(as)g(a)h(k)o +(ey)g(goal)e(of)h(F)m(unnelW)m(eb)g(V3,)h(it)f(w)o(as)h(ob)o(vious)f(that)h +(the)g(command)d(line)i(in)o(terface)177 1031 y(w)o(ould)e(ha)o(v)o(e)h(to)g +(b)q(e)g(redesigned.)20 b(The)14 b(design)g(goals)f(for)h(the)g(new)g +(command)d(line)j(in)o(terface)g(w)o(ere:)228 1174 y(1.)20 +b(The)15 b(in)o(terface)g(should)f(not)g Fh(dep)n(end)i Fn(on)e(case.)21 +b(Ho)o(w)o(ev)o(er,)14 b(it)g(m)o(ust)g(allo)o(w)e(case-sensitiv)o(e)k +(\014lenames)e(to)281 1224 y(b)q(e)g(transmitted)g(on)f(systems)i(that)e(ha)o +(v)o(e)h(case-sensitiv)o(e)i(\014lenames.)228 1328 y(2.)k(Eac)o(h)13 +b(option)f(m)o(ust)g(ha)o(v)o(e)h(a)f(symmetric)f(p)q(ositiv)o(e)i(and)g +(negativ)o(e)f(form.)k(F)m(or)d(example,)e(it)h(is)h(confusing)281 +1378 y(for)g Fi(-X)h Fn(to)g(turn)g(on)g(a)f(feature)i(and)f +Fi(-Q)f Fn(to)h(turn)g(it)g(o\013.)228 1482 y(3.)20 b(The)14 +b(in)o(terface)h(m)o(ust)e(b)q(e)h(extensible)h(to)f(allo)o(w)e(inclusion)h +(of)g(more)g(features)i(at)f(a)g(later)g(date.)228 1586 y(4.)20 +b(Options)14 b(should)g(b)q(e)g(consisten)o(t)h(and)f(memorable.)177 +1729 y(The)g(result)h(is)f(describ)q(ed)i(in)d(the)h Fh(F)m(unnelWeb)j +(User's)d(Manual)p Fn(.)177 1925 y Fe(1.8)70 b(File)21 b(Name)h(Managemen)n +(t)177 2056 y Fn(File)e(names)f(presen)o(t)j(a)e(host)g(of)g(problems)f(for)h +(a)f(program)g(lik)o(e)g(F)m(unnelW)m(eb.)36 b(First,)22 b(F)m(unnelW)m(eb)e +(can)177 2106 y(generate)c(so)f(man)o(y)e(di\013eren)o(t)j(kinds)f(of)f +(\014les)h(that)g(con)o(v)o(en)o(tions)g(m)o(ust)f(b)q(e)i(adopted)f(to)g +(prev)o(en)o(t)g(them)g(from)177 2156 y(b)q(ecoming)9 b(unmanageable.)15 +b(Second,)c(the)f(constrain)o(ts)g(on)g(\014le)g(names,)f(and)h(ev)o(en)g +(the)h(structure)h(of)d(\014le)h(names)177 2205 y(themselv)o(es)16 +b(v)n(aries)f(considerably)h(from)e(mac)o(hine)g(to)h(mac)o(hine.)22 +b(These)17 b(t)o(w)o(o)e(problems)f(ha)o(v)o(e)i(com)o(bined)e(to)177 +2255 y(result)g(in)e(the)i(sophisticated)g(and)e(rather)i(complicated)e(w)o +(a)o(y)g(in)h(whic)o(h)g(F)m(unnelW)m(eb)f(V3)h(handles)g(\014lenames.)177 +2340 y(T)m(o)g(summarize,)f(the)i(three)h(problems)e(are:)228 +2483 y(1.)20 b(What)13 b(\014lename)g(extensions)i(should)f(b)q(e)g(c)o +(hosen)h(for)f(v)n(arious)f(kinds)h(of)f(\014le?)228 2588 y(2.)20 +b(What)13 b(\014lename)g(inheritance)i(should)e(tak)o(e)h(place?)228 +2692 y(3.)20 b(Ho)o(w)13 b(should)h(F)m(unnelW)m(eb)g(cop)q(e)g(with)g(the)g +(v)n(ariations)f(in)g(\014lename)g(structure)j(b)q(et)o(w)o(een)f(mac)o +(hines?)177 2835 y(The)f(follo)o(wing)e(three)j(sections)g(address)g(these)g +(questions.)1042 2940 y(19)p eop +%%Page: 20 21 +20 20 bop 177 42 a Fa(1.8.1)55 b(Filename)17 b(Extensions)177 +147 y Fn(F)m(unnelW)m(eb)11 b(is)h(capable)f(of)g(reading)h(and)f(writing)g +(a)g(v)n(ariet)o(y)g(of)g(di\013eren)o(t)i(kinds)f(of)f(\014les.)17 +b(In)12 b(particular,)f(F)m(un-)177 197 y(nelW)m(eb)g(m)o(ust)f(often)h(op)q +(erates)h(in)f(an)g(en)o(vironmen)o(t)f(where)i(the)f(same)f(information)f +(is)h(stored)i(in)f(man)o(y)e(forms)177 247 y(\(e.g.)16 b(prog.fw,)f(prog.c,) +i(pro)q(c.exe\).)26 b(File)16 b(extensions)i(are)e(an)h(essen)o(tial)f(to)q +(ol)g(in)g(managing)e(this)i(situation.)177 297 y(The)e(\014lename)f +(extensions)i(c)o(hosen)g(for)f(F)m(unnelW)m(eb)f(are:)177 +421 y Fi(FunnelWeb)107 b(:)22 b(.fw)177 471 y(Product)151 b(:)22 +b(None.)177 521 y(Documentation)d(:)j(.tex)177 570 y(Listing)151 +b(:)22 b(.lis)177 620 y(Journal)151 b(:)22 b(.jrn)177 744 y +Fn(Lo)o(w)o(ercase)15 b(will)e(b)q(e)h(used)h(in)e(systems)h(that)g(are)h +(case)f(sensitiv)o(e.)177 822 y(Readers)g(who)f(are)h(w)o(ondering)e(ho)o(w)h +(F)m(unnelW)m(eb)g(cop)q(es)h(in)f(en)o(vironmen)o(ts)f(suc)o(h)i(as)f(UNIX)h +(where)g(there)g(are)177 872 y(no)g(\014le)g(extensions)h(should)e(refer)i +(to)f(Section)g(1.8.3.)177 1023 y Fa(1.8.2)55 b(Filename)17 +b(Inheritance)177 1129 y Fn(Inheritance)d(in)d(\014lenames)h(refers)i(to)e +(ho)o(w)g(input)g(and)g(output)g(\014les)h(inherit)f(parts)h(of)f(their)h +(name)e(from)f(other)177 1178 y(\014lenames)j(and)h(their)g(en)o(vironmen)o +(t.)j(F)m(or)d(example)e(if)h(the)i(command)243 1302 y Fi(fw)21 +b(sloth)g(+J)g(+L)g(+T)177 1426 y Fn(w)o(as)d(issued,)i(y)o(ou)e(w)o(ould)f +(exp)q(ect)j(to)e(see)h(output)g(\014les)f Fi(sloth.jrn)p Fn(,)f +Fi(sloth.lis)p Fn(,)g(and)h Fi(sloth.tex)p Fn(.)29 b(The)177 +1476 y(output)14 b(\014le)h(names)e(ha)o(v)o(e)h(inherited)g(the)h(\\)p +Fi(sloth)p Fn(".)i(The)e(follo)o(wing)c(table)j(giv)o(es)g(the)h(hierarc)o(h) +o(y)f(devised)h(for)177 1526 y(F)m(unnelW)m(eb.)p 366 1606 +1394 2 v 365 1656 2 50 v 436 1656 V 462 1641 a(Script)p 615 +1656 V 70 w(Input)p 778 1656 V 64 w(Include)p 961 1656 V 50 +w(Journal)p 1147 1656 V 50 w(List)p 1326 1656 V 108 w(Do)q(cumen)o(t)p +1562 1656 V 49 w(Pro)q(duct)p 1759 1656 V 366 1658 1394 2 v +365 1707 2 50 v 391 1692 a(1)p 436 1707 V 615 1707 V 778 1707 +V 392 w Fi(@i)p 961 1707 V 1147 1707 V 1326 1707 V 1562 1707 +V 739 w(@o)p 1759 1707 V 365 1757 V 391 1742 a Fn(2)p 436 1757 +V 50 w Fi(+x)p 615 1757 V 134 w(+f)p 778 1757 V 120 w(+i)p +961 1757 V 138 w(+j)p 1147 1757 V 143 w(+l)p 1326 1757 V 134 +w(+t)p 1562 1757 V 192 w(+o)p 1759 1757 V 365 1807 V 391 1792 +a Fn(3)p 436 1807 V 50 w(\\)p Fi(.fws)p Fn(")p 615 1807 V 48 +w(\\)p Fi(.fw)p Fn(")p 778 1807 V 56 w(\\)p Fi(.fwi)p Fn(")p +961 1807 V 52 w(\\)p Fi(.jrn)p Fn(")p 1147 1807 V 57 w(\\)p +Fi(.lis)p Fn(")p 1326 1807 V 48 w(\\)p Fi(.tex)p Fn(")p 1562 +1807 V 1759 1807 V 365 1857 V 391 1842 a(4)p 436 1857 V 615 +1857 V 778 1857 V 392 w Fi(+f)p 961 1857 V 138 w(+f)p 1147 +1857 V 143 w(+f)p 1326 1857 V 134 w(+f)p 1562 1857 V 1759 1857 +V 365 1907 V 391 1892 a Fn(5)p 436 1907 V 50 w(DefDir)p 615 +1907 V 55 w(Defdir)p 778 1907 V 50 w(Defdir)p 961 1907 V 68 +w(Defdir)p 1147 1907 V 73 w(Defdir)p 1326 1907 V 64 w(Defdir)p +1562 1907 V 122 w(Defdir)p 1759 1907 V 366 1908 1394 2 v 177 +2015 a(The)f(follo)o(wing)e(notes)i(explain)g(the)g(table.)228 +2139 y(1.)20 b(This)14 b(sc)o(heme)g(is)g(similar)d(to)j(that)g(used)g(in)g +(F)m(unnelW)m(eb)f(V1.)228 2229 y(2.)20 b(The)14 b(journal,)f(list,)f(and)i +(do)q(cumen)o(tation)e(\014les)j(all)d(fall)g(in)i(the)g(same)f(pattern)h +(and)g(can)g(b)q(e)g(considered)281 2278 y(as)g(a)g(single)f(case.)228 +2368 y(3.)20 b(Lev)o(el)15 b(1)h(has)f(the)h(highest)g(priorit)o(y)e(b)q +(ecause)k(it)d(is)g(a)g(direct)h(sp)q(eci\014cation)g(b)o(y)g(the)g(user)g +(in)f(the)h(input)281 2418 y(\014le.)228 2507 y(4.)k(Lev)o(el)14 +b(2)f(comes)h(next)g(b)q(ecause)h(this)f(is)g(also)f(a)g(direct)i(sp)q +(eci\014cation)f(from)e(the)j(user)g(on)e(the)i(command)281 +2557 y(line.)228 2646 y(5.)20 b(Lev)o(el)13 b(3)f(pro)o(vides)h(the)h +(default)e(\014le)h(extensions.)19 b(Pro)q(duct)14 b(\014les)f(do)g(not)f +(inherit)h(an)g(extension)g(as)g(they)281 2696 y(could)h(b)q(e)g(of)f(an)o(y) +h(t)o(yp)q(e.)228 2785 y(6.)20 b(Lev)o(el)12 b(5)h(is)f(built)g(in)o(to)f +(most)h(op)q(erating)g(systems')g(\014le)h(sp)q(eci\014cation)g(systems.)k +(If)c(I)f(sp)q(ecify)h(\014le)f(\\)p Fi(x.y)p Fn(",)281 2835 +y(it)h(is)h(tak)o(en)g(to)g(mean)f(on)g(the)i(default)e(disk)h(in)f(the)i +(default)e(directory)m(.)1042 2940 y(20)p eop +%%Page: 21 22 +21 21 bop 228 42 a Fn(7.)20 b(Lev)o(el)15 b(4)g(lo)q(oks)g(straigh)o(tforw)o +(ard,)f(but)i(secretly)h(conceals)f(a)f(di\016cult)f(design)i(decision.)22 +b(By)15 b(the)h(time)281 91 y(w)o(e)j(get)g(do)o(wn)f(to)g(this)h(lev)o(el)f +(of)g(inheritance,)i(w)o(e)e(kno)o(w)h(for)f(sure)h(that)g(the)g(\014lename)e +(has)i(already)281 141 y(pic)o(k)o(ed)c(up)g(a)f(\014le)h(extension.)21 +b(So)15 b(all)e(that)i(is)g(left)f(to)h(inherit)g(is)g(the)g(path)g(and)f +(the)i(\014lename)d(prop)q(er.)281 191 y(Ob)o(viously)g(w)o(e)h(ha)o(v)o(e)g +(to)g(inherit)g(the)h(\014lename)e(prop)q(er)i(\(e.g.)j Fi(sloth)13 +b Fn(in)h Fi(sloth.tex)p Fn(\),)d(but)k(should)f(w)o(e)281 +241 y(inherit)j(the)g(input)g(\014le)g(path?)26 b(If)17 b(w)o(e)g(do)f +(inherit)h(the)g(input)g(\014le)g(path,)g(\014les)g(will)e(b)q(e)j(placed)f +(in)f(the)281 291 y(same)f(directory)h(as)g(the)g(input)g(\014le.)23 +b(If)16 b(w)o(e)g(don't)f(inherit)h(the)g(input)f(\014le)h(path,)g(\014les)g +(will)e(b)q(e)j(placed)281 340 y(in)c(the)h(curren)o(t)h(directory)m(.)j(The) +c(c)o(hoice)g(I)f(ha)o(v)o(e)h(made)e(is)h(to)g(send)i(all)d(the)i(logging)e +(t)o(yp)q(e)i(\014les)f(in)o(to)g(the)281 390 y(same)h(directory)j(as)e(the)h +(input)f(\014le.)23 b(This)15 b(means,)g(for)g(example,)f(that)h +Fi(sloth.lis)e Fn(and)j Fi(sloth.tex)281 440 y Fn(will)c(generally)i(land)f +(in)g(the)i(same)e(directory)h(as)g Fi(sloth.fw)p Fn(.)j(Ho)o(w)o(ev)o(er,)c +(I)h(ha)o(v)o(e)g(decided)h(that)f(output)281 490 y(\014les)e(should)f(b)q(e) +h(sen)o(t)g(to)f(the)h(default)f(directory)h(\(if)f(not)g(earlier)h(sp)q +(eci\014ed\))h(as)e(this)g(is)h(where)g(the)g(action)281 540 +y(is.)19 b(In)c(normal)d(use,)j(the)g(main)d(pro)q(duct)j(of)f(F)m(unnelW)m +(eb)g(will)e(b)q(e)j(pro)q(duct)h(\014les)e(and)g(so)h(the)g(user)g(will)281 +589 y(exp)q(ect)g(them)e(to)h(app)q(ear)h(in)e(the)h(curren)o(t)i(directory)e +(b)o(y)g(default.)177 757 y Fa(1.8.3)55 b(P)n(ortable)19 b(Structure)f(of)h +(File)e(Names)177 871 y Fn(Another)g(problem)e(with)g(\014le)h(names)f(is)h +(the)h(v)n(ariation)d(of)h(their)i(structure)h(b)q(et)o(w)o(een)f(en)o +(vironmen)o(ts.)24 b(Here)177 921 y(are)14 b(examples)f(of)h(some)f(of)g(the) +h(formats)f(that)h(prev)n(ail:)243 1059 y Fi(UNIX)64 b(/device/dir1/dir2/)o +(name)243 1108 y(VMS)86 b(node::device:[dir1)o(.dir2)o(]name)o(.ext)o(;vn)243 +1158 y(MSDOS)42 b(device:\\dir1\\dir2\\)o(name.)o(ext)243 1208 +y(MAC)86 b(device:dir1:dir2:n)o(ame)177 1345 y Fn(Isn't)14 +b(it)g(amazing)d(that)j(none)g(of)g(these)h(p)q(opular)f(systems)g(use)g(the) +h(same)e(format?)177 1429 y(The)j(solution)f(to)g(dealing)g(with)g(these)i +(di\013eren)o(t)f(formats)e(is)h(to)h(classify)f(them)g(as)g(non-p)q(ortable) +g(and)h(hide)177 1479 y(the)g(functions)f(that)g(manipulate)e(them)h(in)g +(the)i(mac)o(hine-sp)q(eci\014c)f(mo)q(dule)e(of)i(F)m(unnelW)m(eb.)20 +b(Luc)o(kily)14 b(there)177 1528 y(are)g(not)g(man)o(y)e(suc)o(h)j +(functions.)177 1612 y(The)g(main)c(problem)i(is)h(coping)f(with)h(\014le)g +(systems)g(that)g(do)g(not)g(explicitly)e(supp)q(ort)j(\014le)f(extensions.) +19 b(With)177 1661 y(so)14 b(man)o(y)e(p)q(ossible)i(input)f(and)g(output)h +(\014les,)g(F)m(unnelW)m(eb)f(all)f(but)i(needs)h(suc)o(h)g(extensions.)k +(Mac)o(hines)14 b(that)177 1711 y(do)h(not)g(supp)q(ort)h(them)e(p)q(ose)h +(di\016cult)g(design)g(decisions.)22 b(If)14 b(the)i(user)g(sp)q(eci\014es)h +(\\)p Fi(sloth)p Fn(")c(as)i(an)g(input)g(\014le)177 1761 y(on)d(suc)o(h)g(a) +g(non-extension-supp)q(orting)g(system,)g(should)g(F)m(unnelW)m(eb)f(lo)q(ok) +g(for)g Fi(sloth)g Fn(or)h Fi(sloth.fw)p Fn(?)k(If)11 b(the)177 +1811 y(user)k(sp)q(eci\014es)h Fi(walrus)c Fn(as)i(a)g(listing)f(\014le,)g +(should)h(it)f(generate)j Fi(walrus)c Fn(or)i Fi(walrus.lis)p +Fn(?)177 1894 y(Some)f(p)q(ossible)h(solutions)f(are:)228 2032 +y(1.)20 b(Regard)14 b(the)g(\014lename)f Fi(sloth)g Fn(as)h(ha)o(ving)e(an)i +(empt)o(y)f(extension.)19 b(It)14 b(will)e(then)j(default)e(to)h +Fi(sloth.fw)p Fn(.)228 2132 y(2.)20 b(Regard)g(the)h(\014lename)d +Fi(sloth)h Fn(as)i(ha)o(ving)e(a)g(blank)h(but)g(full)f(extension.)37 +b(That)20 b(is,)h(it)f(cannot)g(b)q(e)281 2181 y(o)o(v)o(erwritten)14 +b(b)o(y)g(inheritance,)g(but)g(it)g(remains)f(blank.)228 2282 +y(3.)20 b(Pro)o(vide)c(an)g(extra)h(syn)o(tactic)f(mec)o(hanism)e(to)i(allo)o +(w)f(the)i(user)g(to)f(sp)q(ecify)h(one)f(or)g(other)h(of)e(the)i(t)o(w)o(o) +281 2331 y(options)c(ab)q(o)o(v)o(e.)177 2469 y(My)i(solution)e(w)o(as)i(to)f +(c)o(ho)q(ose)i(the)f(\014rst)g(option.)k(Use)d(of)e(F)m(unnelW)m(eb)g +(results)h(in)f(lots)h(of)f(\014les)h(lying)e(around)177 2519 +y(\(e.g.)h Fi(sloth.lis)p Fn(\))f(and)h(it)g(is)g(hard)h(to)f(see)i(ho)o(w)e +(the)h(user)h(will)c(cop)q(e)k(with)e(them)g(all)f(without)h(some)f(kind)h +(of)177 2569 y(naming)e(discipline.)17 b(If)d(a)f(naming)f(discipline)h(has)h +(to)g(b)q(e)h(used,)f(it)g(migh)o(t)d(as)j(w)o(ell)f(b)q(e)i(the)f(F)m +(unnelW)m(eb)g(one.)177 2652 y(Th)o(us)h(the)g(names)e(of)h(all)f(\014les)i +(read)f(and)h(written)f(b)o(y)h(F)m(unnelW)m(eb)e(will)g(ha)o(v)o(e)h(a)g +(\014le)h(extension)g(of)e(from)g(zero)177 2702 y(to)h(three)h(letters)g +(separated)g(from)e(the)h(rest)h(of)e(the)i(\014lename)e(b)o(y)g(a)h(\\)p +Fi(.)p Fn(".)177 2785 y(The)d(only)f(exception)i(is)f(pro)q(duct)g(\014les)g +(whose)h(extension)f(is)g(left)f(unde\014ned.)19 b(Pro)q(duct)12 +b(\014les)f(need)h(not)e(con)o(tain)177 2835 y(a)k(\\)p Fi(.)p +Fn(")k(and)13 b(a)h(\014le)g(extension,)g(although)f(they)h(can)g(inherit)g +(one)g(if)f(the)i(user)g(wishes.)1042 2940 y(21)p eop +%%Page: 22 23 +22 22 bop 177 42 a Fe(1.9)70 b(Sp)r(ecifying)31 b(Constrain)n(ts)i(on)h(the)e +(Num)n(b)r(er)g(of)i(Instan)n(tia-)334 116 y(tions)177 232 +y Fn(Exp)q(erience)17 b(with)d(F)m(unnelW)m(eb)g(V1)g(demonstrated)h(the)g +(need)g(to)g(b)q(e)g(able)f(to)g(sp)q(ecify)h(in)g(macro)e(de\014nitions)177 +281 y(ho)o(w)f(man)o(y)f(times)h(it)g(w)o(as)h(exp)q(ected)h(that)f(the)g +(macro)f(w)o(ould)g(b)q(e)h(used.)18 b(F)m(unnelW)m(eb)13 b(V1)f(generates)i +(an)f(error)177 331 y(if)g(a)g(macro)f(is)h(not)g(used,)h(but)g(p)q(ermits)f +(macros)f(to)i(b)q(e)g(called)f(more)f(than)h(once.)19 b(This)13 +b(caused)i(problems)d(for)177 381 y(macro)h(libraries,)g(whic)o(h)h(w)o(ould) +f(b)q(e)h(included,)g(but)g(whose)g(macros)f(w)o(ere)i(often)f(not)g(called.) +177 455 y(By)g(default,)e(F)m(unnelW)m(eb)h(V3)h(requires)g(that)g(eac)o(h)f +(macro)g(\(except)i(for)e(the)h(ones)f(attac)o(hed)h(to)g(output)f(\014les\)) +177 505 y(b)q(e)19 b(called)e(exactly)h(once.)30 b(Ho)o(w)o(ev)o(er,)19 +b(it)f(also)f(pro)o(vides)h(syn)o(tax)g(that)f(allo)o(ws)g(the)h(user)h(to)f +(sp)q(ecify)g(that)g(a)177 555 y(macro)13 b(b)q(e)h(allo)o(w)o(ed)e(to)i(b)q +(e)g(called)f(zero)i(times)d(or)i(man)o(y)e(times.)17 b(This)c(allo)o(ws)g(a) +g(macro)f(to)i(b)q(e)g(sp)q(eci\014ed)h(with)177 605 y(the)f(follo)o(wing)d +(p)q(ermissible)i(ranges)h(of)f(n)o(um)o(b)q(ers)g(of)g(calls)g(dep)q(ending) +h(on)f(the)h(presence)i(or)e(absence)h(of)e(\\)p Fi(@Z)p Fn(")177 +655 y(and)h(\\)p Fi(@M)p Fn(":)243 770 y Fi(0..1)217 b(@$@@Z==.)o(..) +308 819 y(1)h(@$@==...)308 869 y(1..n)152 b(@$@@M==.)o(..)243 +919 y(0.....n)f(@$@@Z@M=)o(=...)177 1034 y Fn(The)14 +b(only)g(t)o(w)o(o)f(problems)g(with)g(this)h(sc)o(heme)g(are:)228 +1149 y(1.)20 b(It)11 b(is)g(incompatible)f(with)h(F)m(unnelW)m(eb)f(V1)i +(\014les,)f(as)h(the)f(default)g(in)g(F)m(unnelW)m(eb)g(V1)g(is)g(1)c +Fj(:)g(:)g(:)e(n)11 b Fn(whereas)281 1198 y(the)16 b(default)g(in)f(new)h(F)m +(unnelW)m(eb)f(is)h(1.)23 b(This)16 b(is)f(not)h(a)g(big)f(problem)f(b)q +(ecause)j(most)e(macros)g(in)g(the)281 1248 y(old)e(\014les)h(w)o(ere)h(used) +g(exactly)f(once.)19 b(Only)13 b(a)h(few)g(macros)f(will)f(ha)o(v)o(e)i(to)g +(b)q(e)g(c)o(hanged.)228 1331 y(2.)20 b(What)13 b(should)h(the)h(syn)o(tax)e +(b)q(e?)19 b(\(ab)q(o)o(v)o(e)14 b(is)g(a)f(sneak)i(preview)f(only!\))177 +1446 y(The)g(initial)d(prop)q(osal)i(for)g(syn)o(tax)g(w)o(as)g(to)g(allo)o +(w)f(the)i(user)g(to)f(insert)h(zero,)g(one,)f(or)g(b)q(oth)g(of)g +Fi(@?)18 b Fn(and)13 b Fi(@M)g Fn(just)177 1496 y(after)h(the)h +Fi(@$)e Fn(of)g(a)h(macro)f(de\014nition.)k(Ho)o(w)o(ev)o(er,)d(this)g(has)g +(the)h(follo)o(wing)c(dra)o(wbac)o(ks:)228 1610 y(1.)20 b(It)14 +b(uses)h(t)o(w)o(o)e(sequences)k(that)d(are)g(desirable)g(to)g(reserv)o(e)i +(\()p Fi(@?)i Fn(for)c(conditionals)f(and)g Fi(@M)h Fn(for)f(macro\).)228 +1693 y(2.)20 b(It)14 b(stops)g(the)h(user)g(from)d(searc)o(hing)i(for)g(the)g +(string)g Fi(@$@@\(@5@\)==@{@-)177 +2022 y(This)i(is)h(a)f(short)g(macro.)177 2072 y(With)g(only)g(a)h(line)f(or) +g(two@})177 2172 y(@$@@?@M@\(@5@\)=)o(=@{@-)177 +2222 y(This)h(is)h(a)f(short)g(macro.)177 2271 y(With)g(only)g(a)h(line)f(or) +g(two@})177 2371 y(@$@@\(@5@\)@?@M=)o(=@{@-)177 +2421 y(This)h(is)h(a)f(short)g(macro.)177 2471 y(With)g(only)g(a)h(line)f(or) +g(two@)177 2586 y Fn(The)14 b(\014rst)f(form)e(puts)j(me)e(o\013)h(b)q +(ecause)h(I)f(think)g(that)g(it)f(is)h(a)g(go)q(o)q(d)f(visual)g(rule)h(to)g +(start)h(all)e(the)h(macros)f(with)177 2635 y Fi(@$)p Fn(.)17 +b(The)12 b(second)h(form)d(puts)j(me)d(o\013)i(b)q(ecause)i(it)d(detac)o(hes) +i(the)g(macro)d(name)h(from)f(the)j(parameter)e(list,)g(th)o(us)177 +2685 y(making)g(it)i(lo)q(ok)f(less)i(lik)o(e)f(a)g(call,)f(whic)o(h)h(is)h +(desirable)f(syn)o(tactic)h(resonance.)20 b(The)13 b(third)h(form)d(is)j +(messy)f(but)177 2735 y(probably)i(w)o(ork)n(able.)23 b(Because)17 +b(w)o(e)f(are)g(righ)o(t)g(next)g(to)f(the)h(tested)i(constan)o(t)e(string)g +(\(either)g Fi(==)g Fn(or)f Fi(+=)p Fn(\))h(w)o(e)177 2785 +y(could)f(augmen)o(t)e(it)h(further.)21 b(F)m(or)15 b(example,)e +Fi(01==)h Fn(could)g(allo)o(w)f(a)h(macro)g(to)g(b)q(e)i(called)e(from)f(0)h +(to)h(1)f(times.)177 2835 y(The)g(main)e(problem)h(with)g(this)h(is)g(that)g +(w)o(e)g(are)g(trying)g(to)g(phase)g(out)g Fi(==)f Fn(an)o(yw)o(a)o(y!)1042 +2940 y(22)p eop +%%Page: 23 24 +23 23 bop 177 42 a Fn(Nev)o(ertheless,)17 b(all)c(the)j(logic)d(p)q(oin)o(ts) +i(to)f(after)h(the)g(parameter)g(list)f(as)h(the)g(b)q(est)h(place)f(to)f(lo) +q(cate)h(this)g(infor-)177 91 y(mation.)177 167 y(After)21 +b(some)d(though)o(t,)j(it)e(w)o(as)h(decided)h(that)f(the)g(\\)p +Fi(@?)p Fn(")35 b(sequence)22 b(b)q(e)e(reserv)o(ed)i(for)e(a)f(p)q(ossible)h +(future)177 217 y(conditional)13 b(facilit)o(y)m(,)e(and)j(so)g +Fi(@Z)f Fn(w)o(as)h(used)h(instead.)177 292 y Fk(Decision:)h +Fn(The)f(p)q(osition)e(is)h(after)g(the)g(parameter)g(list.)j(The)e(notation) +e(is)g Fi(@Z)h Fn(for)f(zero,)i(and)e Fi(@M)h Fn(for)f(man)o(y)m(.)177 +368 y(Example)g(of)g(\014nal)g(syn)o(tax:)177 486 y Fi(@$@@\(@5@\)@Z@M+)o(=@{@-)177 536 y(This)h(is)h(a)f(short)g(macro.)177 +585 y(With)g(only)g(a)h(line)f(or)g(two@})177 750 y Fe(1.10)70 +b(The)25 b(Relationship)e(Bet)n(w)n(een)g(Do)r(cumen)n(t)h(Structure)h(and) +368 825 y(Macro)f(Structure)177 942 y Fn(Ha)o(ving)15 b(already)h(decided)h +(up)q(on)f(a)g(fully)e(hierarc)o(hical)i(do)q(cumen)o(t)g(structure,)i(I)e +(determined)g(to)g(re\014ne)h(the)177 992 y(details.)h(The)c(issues)h(to)f(b) +q(e)h(addressed)g(w)o(ere)g(as)f(follo)o(ws:)239 1110 y Fm(\017)21 +b Fn(Ho)o(w)13 b(should)h(the)h(hierarc)o(hical)e(structure)j(connect)g(to)d +(the)i(macro)e(structure?)239 1194 y Fm(\017)21 b Fn(Ho)o(w)13 +b(can)i(bac)o(kw)o(ards)f(compatibilit)o(y)c(b)q(e)15 b(ac)o(hiev)o(ed?)j +(Should)c(it?)239 1279 y Fm(\017)21 b Fn(Should)13 b(the)i(macros)e(b)q(e)h +(cross)h(referenced)i(b)o(y)c(section)i(or)f(b)o(y)g(de\014nition?)239 +1363 y Fm(\017)21 b Fn(Should)13 b(nameless)h(sections)h(inherit)f(macro)e +(names)h(as)h(headings?)239 1448 y Fm(\017)21 b Fn(Should)13 +b(w)o(e)h(simply)e(use)j(T)708 1457 y(E)731 1448 y(X)f(macros)f(to)h +(structure)i(the)e(do)q(cumen)o(t?)177 1566 y(After)h(some)e(though)o(t,)g(I) +h(arriv)o(ed)g(at)f(the)i(follo)o(wing)c(though)o(ts:)177 1642 +y Fk(Basically)i(a)h(T)439 1651 y(E)464 1642 y(X)h(\014le:)h +Fn(One)d(option)f(is)g(simply)e(to)i(treat)h(eac)o(h)g Fi(.fw)e +Fn(\014le)i(as)f(a)g(T)1481 1651 y(E)1504 1642 y(X)g(\014le)h(laced)f(with)g +(macros.)177 1691 y(That)18 b(is,)g(a)g Fi(.fw)f Fn(\014le)h(could)f(b)q(e)i +(structured)h(as)e(a)f(real)h(T)1117 1700 y(E)1140 1691 y(X)g(\014le)g(from)e +(whic)o(h)i(F)m(unnelW)m(eb)f(could)h(extract)177 1741 y(macro)13 +b(de\014nitions.)18 b(This)13 b(approac)o(h)h(is)g(feasible)f(b)q(ecause)j(T) +1157 1750 y(E)1180 1741 y(X)e(could)f(b)q(e)i(programmed)c(to)j(resp)q(ond)h +(to)e(the)177 1791 y Fi(@)g Fn(sequences)i(in)d(the)i(same)e(w)o(a)o(y)g +(that)h(F)m(unnelW)m(eb)f(resp)q(onds)i(to)f(them.)k(Th)o(us,)12 +b(there)i(w)o(ould)e(b)q(e)i(no)e(need)i(for)177 1841 y(W)m(ea)o(v)o(e.)177 +1916 y(I)h(rejected)i(this)e(approac)o(h,)g(\014rst)g(b)q(ecause)i(it)e(is)g +(to)q(o)f(t)o(yp)q(esetter-dep)q(e)q(nden)o(t,)k(and)d(second)h(b)q(ecause)h +(it)d(com-)177 1966 y(plicates)i(the)h(inclusion)e(of)h(an)o(y)f(sort)h(of)g +(complicated)e(p)q(ost-pro)q(cessing)k(in)d(the)i(do)q(cumen)o(tation)e +(\014le.)24 b(This)177 2016 y(w)o(ould)13 b(ha)o(v)o(e)h(to)g(b)q(e)g +(implemen)o(ted)e(in)h(T)818 2025 y(E)841 2016 y(X.)177 2091 +y(A)h(b)q(etter)h(approac)o(h)f(is)f(to)h(use)g(an)g(in)o(v)o(en)o(ted)g +(section)g(notation)f(\(e.g.)18 b Fi(@A)j(@B)g(@C)p Fn(\).)13 +b(This)h(main)o(tains)d(F)m(unnel-)177 2141 y(W)m(eb's)h(t)o(yp)q(esetter)k +(indep)q(endence)f(and)d(can)h(easily)f(b)q(e)i(con)o(v)o(erted)g(in)o(to)e +(T)1365 2150 y(E)1388 2141 y(X)h(sectioning)f(macros)g(b)o(y)h(W)m(ea)o(v)o +(e.)177 2217 y(In)g(the)h(same)e(spirit,)g(it)h(migh)o(t)e(b)q(e)j(w)o(orth)f +(in)o(tro)q(ducing)f(a)h(few)g Fi(@)g Fn(sequences)i(for)e(certain)h(general) +f(t)o(yp)q(esetting)177 2267 y(op)q(erations)h(suc)o(h)h(as)f(italics)f(and)h +(program)e(co)q(de.)177 2342 y Fk(Confusion)f(in)i(F)l(unnelW)l(eb)e(V1)j +(Heading)e(Num)o(b)q(ering:)j Fn(F)m(unnelW)m(eb)d(V1)g(uses)h(t)o(w)o(o)f +(lev)o(els)g(of)f(section)177 2392 y(headings,)16 b(but)g(n)o(um)o(b)q(ers)f +(all)f(the)i(headings)g(sequen)o(tially)m(.)22 b(In)16 b(this,)f(it)h(is)f(a) +g(little)g(confused.)24 b(Clearly)15 b(with)177 2442 y(a)20 +b(fully)e(hierarc)o(hical)h(do)q(cumen)o(t)h(structure,)i(the)f(headings)e +(cannot)h(b)q(e)g(n)o(um)o(b)q(ered)g(sequen)o(tially)f(|)g(the)177 +2492 y(n)o(um)o(b)q(ering)13 b(m)o(ust)g(re\015ect)i(the)g(structure)h +(\(e.g.)d(3.2.1\).)177 2567 y Fk(Hierarc)o(hical)d(n)o(um)o(b)q(erin)o(g)f +(is)j(messy)f(for)h(macros:)k Fn(Unfortunately)m(,)11 b(hierarc)o(hical)f(n)o +(um)o(b)q(ering)g(is)g(messy)177 2617 y(and)k(confusing)f(when)i(applied)e +(to)h(macro)e(names.)18 b(In)c(F)m(unnelW)m(eb)f(V1's)h(t)o(yp)q(eset)h +(output,)f(eac)o(h)g(macro)f(call)177 2667 y(has)i(app)q(ended)g(in)f(square) +h(brac)o(k)o(ets)h(the)f(n)o(um)o(b)q(er)f(of)f(the)i(section)h(in)e(whic)o +(h)g(the)h(macro)e(is)h(de\014ned.)21 b(Use)15 b(of)177 2716 +y(hierarc)o(hical)f(n)o(um)o(b)q(ering)e(w)o(ould)i(b)q(e)g(somewhat)f(messy) +m(.)k(F)m(or)d(example,)e(a)h(macro)g(call)g(migh)o(t)f(lo)q(ok)h(lik)o(e.) +243 2835 y Fi(Write)20 b(out)h(the)h(output[6.7.4.3])1042 2940 +y Fn(23)p eop +%%Page: 24 25 +24 24 bop 177 42 a Fn(Similarly)l(,)11 b(cross)k(reference)h(lists)e(w)o +(ould)f(b)q(e)i(messy:)243 180 y Fi(This)21 b(macro)f(is)i(used)f(in)g +(3.4.5,)g(1.2,)g(7.8.9,)f(7.4,)h(2.2.1.1.)177 319 y Fk(Separate)12 +b(n)o(um)o(b)q(ering)e(for)j(macros)h(and)f(headings:)i Fn(One)e(idea)f(is)g +(to)g(use)g(hierarc)o(hical)g(n)o(um)o(b)q(ering)f(for)177 +369 y(the)i(sections,)h(but)f(to)f(n)o(um)o(b)q(er)g(the)h(macros)f(sequen)o +(tially)m(.)k(This)d(could)f(b)q(e)h(a)g(little)f(confusing)g(in)g(do)q +(cumen)o(ts)177 419 y(without)j(m)o(uc)o(h)g(structure,)i(but)f(w)o(ould)f(b) +q(e)h(v)o(ery)g(m)o(uc)o(h)f(less)h(messy)f(than)h(cross)g(referencing)h +(using)f(hierar-)177 469 y(c)o(hical)f(n)o(um)o(b)q(ering.)22 +b(Also,)15 b(it)g(will)f(b)q(e)i(easier)g(to)g(\014nd)f(macros)g(indexed)h(b) +o(y)f(a)g(sequen)o(tial)h(n)o(um)o(b)q(er)f(than)g(b)o(y)177 +519 y(section,)g(whic)o(h)g(has)g(a)g(less)g(direct)h(relationship)e(with)h +(page)g(bulk)f(and)h(n)o(um)o(b)q(er.)20 b(By)15 b(macro)e(n)o(um)o(b)q +(ering)h(is)177 568 y(mean)o(t)f(the)h(sequen)o(tial)g(n)o(um)o(b)q(ering)f +(of)g(eac)o(h)h(macro)f(b)q(o)q(dy)h(part)g(through)g(the)h(whole)e(do)q +(cumen)o(t.)177 652 y Fk(Input)h(format)g(matters)f(more)i(than)f(output)f +(format:)k Fn(A)o(t)c(this)h(p)q(oin)o(t)e(w)o(e)i(realize)g(that)f(a)g +(distinction)177 702 y(should)f(b)q(e)g(made)e(b)q(et)o(w)o(een)j(the)f +Fh(input)i(format)d Fn(and)g(the)h Fh(typ)n(eset)h(output)p +Fn(.)18 b(The)12 b(critical)f(issue)h(here)h(is)f(not)f(ho)o(w)177 +752 y(the)16 b(program)e(should)h(b)q(e)i(formatted)d(for)h(prin)o(ting,)g +(but)g(rather)i(the)f(format)d(of)i(its)h Fi(.fw)f Fn(\014le.)22 +b(The)16 b(t)o(yp)q(eset)177 802 y(output)e(can)h(alw)o(a)o(ys)e(b)q(e)h(c)o +(hanged)h(simply)d(b)o(y)i(\014ddling)f(with)g(W)m(ea)o(v)o(e.)18 +b(Ho)o(w)o(ev)o(er,)c(as)g(so)q(on)g(as)h(the)f(do)q(cumen)o(t)177 +851 y(structuring)g(features)f(of)f(F)m(unnelW)m(eb)g(are)h(\014xed,)f(they)h +(will)e(b)q(e)i(used)h(in)e(dozens)h(or)f(h)o(undreds)i(of)e(do)q(cumen)o(ts) +177 901 y(and)j(it)g(will)f(b)q(e)i(v)o(ery)g(di\016cult)f(indeed)h(to)f(c)o +(hange)h(them.)21 b(Therefore,)c(the)f(imp)q(ortan)o(t)e(thing)g(is)i(to)f +(pro)o(vide)177 951 y(as)f(sensible)h(and)f(expressiv)o(e)h(a)f +Fi(.fw)f Fn(format)f(as)i(p)q(ossible.)177 1035 y(It)d(is)g(therefore)h(a)e +(separate)i(decision)f(as)g(to)f(whether)i(w)o(e)f(should)g(n)o(um)o(b)q(er)f +(macros)g(b)o(y)g(section)h(or)g(b)o(y)g(sequence)177 1085 +y(n)o(um)o(b)q(er.)17 b(The)e(imp)q(ortan)o(t)d(thing)h(is)h(to)g(address)h +(the)f(format)f(and)g(rules)i(for)e(the)i(expression)g(of)e(structure.)177 +1168 y Fk(Naming)k(sections:)i Fn(The)d(naming)d(of)i(sections)h(requires)h +(some)d(though)o(t.)22 b(In)16 b(man)o(y)d(cases)k(\(esp)q(ecially)e(in)177 +1218 y(the)k(case)g(of)e(high-lev)o(el)g(sections\))i(the)f(writer)h(will)d +(pro)o(vide)i(an)g(explicit)f(name)g(for)h(a)f(section.)31 +b(In)18 b(other)177 1268 y(cases,)d(pro)o(vision)e(of)g(suc)o(h)h(a)g(name)e +(will)h(merely)g(duplicate)g(the)i(name)d(of)h(the)i(macro)d(con)o(tained)i +(within)f(the)177 1318 y(section.)23 b(It)15 b(therefore)i(mak)o(es)d(sense)j +(to)e(allo)o(w)e(the)j(user)g(to)f(omit)f(the)h(name)f(from)g(a)h(section,)g +(with)g(W)m(ea)o(v)o(e)177 1368 y(naming)10 b(the)k(section)f(after)g(the)g +(\014rst)h(macro)d(de\014nition)h(in)g(the)i(section.)k(If)12 +b(a)h(macro)e(is)h(unnamed)g(and)g(there)177 1417 y(is)i(no)g(macro)e(in)i +(the)g(section,)g(an)g(error)h(can)f(b)q(e)g(generated.)177 +1501 y(All)f(these)j(though)o(ts)e(lead)f(to)h(the)g(follo)o(wing)e(sc)o +(heme:)239 1640 y Fm(\017)21 b Fn(Do)q(cumen)o(ts)13 b(will)g(b)q(e)h +(hierarc)o(hically)g(structured)i(using)d Fi(@A)p Fn(,)g Fi(@B)h +Fn(etc.)239 1741 y Fm(\017)21 b Fn(Eac)o(h)14 b(section)h(can)f(b)q(e)g(giv)o +(en)g(a)f(name)g(delimited)f(b)o(y)i Fi(@<@>)p Fn(.)239 1842 +y Fm(\017)21 b Fn(Sections)15 b(that)f(do)f(not)h(ha)o(v)o(e)g(names)f +(inherit)h(the)g(name)f(of)g(their)h(\014rst)h(macro.)239 1943 +y Fm(\017)21 b Fn(If)13 b(a)h(section)h(do)q(es)f(not)g(ha)o(v)o(e)g(a)f +(name)g(or)h(a)g(macro,)e(it)h(is)h(erroneous.)239 2045 y Fm(\017)21 +b Fn(Sections)15 b(will)d(b)q(e)j(n)o(um)o(b)q(ered)e(hierarc)o(hically)g +(either)i(b)o(y)f(F)m(unnelW)m(eb)f(or)h(b)o(y)g(T)1551 2054 +y(E)1574 2045 y(X.)239 2146 y Fm(\017)21 b Fn(Macro)12 b(b)q(o)q(dy)f(parts)h +(will)e(b)q(e)i(n)o(um)o(b)q(ered)f(sequen)o(tially)g(b)o(y)g(F)m(unnelW)m +(eb)g(and)h(cross)g(referenced)i(b)o(y)d(these)281 2196 y(n)o(um)o(b)q(ers.) +177 2334 y(All)i(this)h(results)h(in)f(a)f(system)h(whic)o(h:)239 +2473 y Fm(\017)21 b Fn(Pro)o(vides)14 b(a)g(hierarc)o(hical)g(do)q(cumen)o(t) +f(structuring)i(capabilit)o(y)m(.)239 2574 y Fm(\017)21 b Fn(Is)14 +b(t)o(yp)q(esetter)i(indep)q(enden)o(t.)239 2676 y Fm(\017)21 +b Fn(Do)q(es)14 b(not)g(require)h(duplication)e(b)q(et)o(w)o(een)i(heading)e +(and)h(macro)f(names.)239 2777 y Fm(\017)21 b Fn(Separates)14 +b(the)f(heading)f(and)h(macro)e(systems)i(so)f(that)h(W)m(ea)o(v)o(e)f(can)h +(b)q(e)g(con\014gured)h(at)e(a)g(later)h(date)g(to)281 2827 +y(cross)i(reference)h(in)e(di\013eren)o(t)h(w)o(a)o(ys)e(without)h(requiring) +f(input)h(\014les)g(to)g(b)q(e)h(rew)o(ork)o(ed.)1042 2940 +y(24)p eop +%%Page: 25 26 +25 25 bop 177 42 a Fe(1.11)70 b(Diagnostic)22 b(Messages)177 +157 y Fn(In)14 b(F)m(unnelW)m(eb,)f(all)g(error)i(messages)f(commence)f(with) +h(an)g(indicator)f(indicating)g(the)i(sev)o(erit)o(y)g(of)e(the)i(error)177 +207 y(message.)j(Here)d(are)f(some)f(of)h(the)g(formats)e(that)i(I)g(in)o(v)o +(estigated)g(b)q(efore)h(settling)e(on)h(the)h(\014nal)e(format:)177 +323 y Fi(W--Error)20 b(creating)g(sloth.)177 373 y(E--Error)g(opening)h +(output)f(file.)177 423 y(S--I'm)h(a)g(teapot.)177 473 y(F--Can't)f(open)h +(output)g(file.)177 572 y(W-Error)g(creating)f(sloth.)177 622 +y(E-Error)h(opening)f(output)g(file.)177 672 y(S-I'm)h(a)h(teapot.)177 +722 y(F-Can't)f(open)f(output)h(file.)177 822 y(W:Error)g(creating)f(sloth.) +177 871 y(E:Error)h(opening)f(output)g(file.)177 921 y(S:I'm)h(a)h(teapot.) +177 971 y(F:Can't)f(open)f(output)h(file.)177 1071 y(W:)h(Error)e(creating)g +(sloth.)152 b(--)21 b(Format)g(chosen.)177 1120 y(E:)h(Error)e(opening)h +(output)f(file.)177 1170 y(S:)i(I'm)f(a)g(teapot.)177 1220 +y(F:)h(Can't)e(open)h(output)g(file.)177 1320 y(War-Error)f(creating)g +(sloth.)177 1369 y(Err-Error)g(opening)g(output)h(file.)177 +1419 y(Sev-I'm)g(a)g(teapot.)177 1469 y(Fat-Can't)f(open)h(output)g(file.)177 +1569 y(W-Old)g(fashioned)f(feature.)177 1668 y(W-Old)h(fashioned)f(feature.) +177 1768 y(W--Old)h(fashioned)f(feature.)177 1868 y(W:)i(Old)f(fashioned)f +(feature.)177 1967 y(W:Old)h(fashioned)f(feature.)177 2129 +y Fe(1.12)70 b(Summary)177 2245 y Fn(This)16 b(rather)i(unstructured)g(c)o +(hapter)g(has)e(addressed)i(some)e(of)f(the)i(k)o(ey)g(design)f(decisions)h +(of)f(F)m(unnelW)m(eb.)177 2295 y(In)e(man)o(y)e(cases,)j(the)g(alternativ)o +(es)f(ha)o(v)o(e)g(b)q(een)h(unpleasan)o(t,)e(but)h(I)g(am)f(con\014den)o(t)h +(that)g(in)g(all)f(cases,)h(a)g(fully)177 2345 y(w)o(ork)n(able)f(solution)g +(has)h(b)q(een)h(found.)1042 2940 y(25)p eop +%%Page: 26 27 +26 26 bop 1042 2940 a Fn(26)p eop +%%Page: 27 28 +27 27 bop 177 375 a Ff(Chapter)34 b(2)177 606 y Fl(F)-10 b(unnelW)g(eb)41 +b(Implemen)m(tation)177 869 y Fe(2.1)70 b(In)n(tro)r(duction)177 +982 y Fn(This)13 b(c)o(hapter)g(con)o(tains)g(notes)g(on)g(the)g(actual)f(C)h +(co)q(de)g(that)g(implemen)o(ts)d(F)m(unnelW)m(eb)i(V3.)18 +b(This)12 b(c)o(hapter)i(is)177 1032 y(rather)h(patc)o(h)o(y)m(.)20 +b(It)14 b(has)h(acted)g(mainly)d(as)i(a)h(dumping)d(ground)i(for)h(ideas)f +(that)h(I)f(b)q(othered)i(to)e(write)h(ab)q(out)177 1082 y(during)f(dev)o +(elopmen)o(t.)177 1241 y Fe(2.2)70 b(History)22 b(of)i(F)-6 +b(unnelW)g(eb)22 b(Implemen)n(tati)o(ons)177 1354 y Fn(The)16 +b(\014rst)h(implemen)o(tation)12 b(of)k(F)m(unnelW)m(eb)f(\(F)m(unnelW)m(eb)g +(V1\))h(w)o(as)g(written)g(in)g(Ada)g(in)f(Decem)o(b)q(er)h(1986.)177 +1404 y(The)f(pro)r(ject)h(w)o(as)e(initially)e(canned)j(as)g(requiring)f(to)q +(o)g(m)o(uc)o(h)g(time,)f(but)h(w)o(as)h(resurrected)i(when)e(I)g(decided)177 +1454 y(to)e(commit)d(to)k(Ada)p Fk([USDOD83])d Fn(and)i(realized)h(that)f(I)g +(needed)i(a)e(program)f(to)h(write)g(to)g(help)g(me)g(to)g(learn)177 +1504 y(Ada.)18 b(F)m(unnelW)m(eb)13 b(V1)h(w)o(as,)g(in)f(fact,)g(m)o(y)g +(\014rst)h(Ada)g(program.)i(It)e(to)q(ok)g(ab)q(out)g(one)g(mon)o(th)e(to)i +(write.)177 1576 y(F)m(unnelW)m(eb)21 b(V1)g(w)o(as)g(used)h(in)o(tensiv)o +(ely)f(b)o(y)g(m)o(yself)e(to)j(write)f(Ada)g(programs)f(from)g(Jan)o(uary)h +(1986)f(to)177 1626 y(July)e(1989)f(at)h(whic)o(h)g(time)f(I)h(\014nished)h +(m)o(y)e(Ph.D.)g(and)h(lost)g(access)i(to)e(the)h(V)-5 b(AX.)18 +b(During)g(this)g(time)f(at)177 1676 y(least)f(t)o(w)o(en)o(t)o(y)g(thousand) +g(lines)f(of)g(co)q(de)h(w)o(ere)h(generated)g(using)e(F)m(unnelW)m(eb.)23 +b(Hardly)15 b(an)o(y)o(one)h(but)f(m)o(yself)177 1726 y(used)g(F)m(unnelW)m +(eb.)177 1798 y(After)f(losing)f(access)i(to)e(Ada)h(and)f(the)h(V)m(ax)f +(\(and)g(hence)i(to)e(F)m(unnelW)m(eb\),)g(I)g(w)o(as)h(forced)g(bac)o(k)f +(to)h(program-)177 1848 y(ming)9 b(the)i(non-literate)g(w)o(a)o(y)m(.)16 +b(F)m(rom)9 b(time)g(to)i(time)e(I)i(found)g(that)f(I)h(needed)h(to)f(use)h +(some)e(of)g(m)o(y)f(old)h(programs)177 1898 y(that)15 b(I)f(had)h(written)g +(using)f(Ada)h(and)f(F)m(unnelW)m(eb.)19 b(I)c(knew)g(that)f(Ada)h(w)o(ould)f +(b)q(ecome)g(a)o(v)n(ailable)e(on)j(more)177 1947 y(mac)o(hines,)e(but)h +(certainly)g(F)m(unnelW)m(eb)g(w)o(ouldn't.)j(I)d(recognised)h(a)f(strong)g +(need)h(for)e(a)h(p)q(ortable)g(v)o(ersion)g(of)177 1997 y(F)m(unnelW)m(eb)g +(written)g(in)f(C)h(but)g(didn't)g(ha)o(v)o(e)f(the)i(time)d(or)i(energy)h +(to)f(create)h(one.)177 2070 y(Ab)q(out)20 b(this)g(time)f(\(late)h(1989\),)g +(Da)o(vid)f(Hulse,)i(at)f(the)g(time)f(a)g(studen)o(t)i(in)f(Computer)f +(Science)i(at)f(the)177 2119 y(Univ)o(ersit)o(y)c(of)f(Adelaide,)h(v)o(olun)o +(teered)h(to)e(translate)h(the)h(4000)e(line)g(Ada)h(v)o(ersion)g(of)f(F)m +(unnelW)m(eb)g(in)o(to)g(C.)177 2169 y(T)m(o)e(m)o(y)e(kno)o(wledge)j(this)f +(translation)g(pro)q(cess)i(to)q(ok)e(ab)q(out)g(three)i(w)o(eeks)f(\(in)f +(Decem)o(b)q(er)h(1989\).)j(The)d(result)177 2219 y(w)o(as)g(called)g(F)m +(unnelW)m(eb)f(V2)h(and)f(w)o(as)h(formally)d(signed)j(in)o(to)f(the)i +(public)e(domain)f(on)i(5)f(Ma)o(y)h(1992.)177 2291 y(In)k(general,)h(Da)o +(vid)d(Hulse)j(did)e(a)h(go)q(o)q(d)g(job.)29 b(Ho)o(w)o(ev)o(er,)19 +b(the)g(resultan)o(t)f(co)q(de)h(su\013ered)h(from)c(one)i(or)g(few)177 +2341 y(serious)d(defects,)g(the)f(most)f(serious)i(of)e(whic)o(h)h(w)o(as)f +(a)h(lac)o(k)f(of)h(p)q(ortabilit)o(y)m(.)177 2414 y(Lac)o(k)c(of)g(p)q +(ortabilit)o(y)f(of)g(the)i(C)f(co)q(de,)i(com)o(bined)c(with)i(the)h(need)g +(for)f(a)g(rather)h(solid)f(design)g(review,)h(com)o(bined)177 +2463 y(with)17 b(the)g(need)h(to)e(strengthen)j(the)e(program)e(to)i(bring)f +(it)g(up)h(to)g(pro)q(duction)g(standard,)g(resulted)h(in)e(m)o(y)177 +2513 y(p)q(erforming)10 b(a)i(complete)f(rew)o(orking)g(of)g(the)i(co)q(de.) +18 b(The)12 b(C)g(co)q(de)g(w)o(as)g(en)o(tirely)m(,)f(but)h(incremen)o +(tally)m(,)e(replaced)177 2563 y(or)20 b(reformatted.)36 b(The)21 +b(co)q(de)f(w)o(as)g(also)g(strengthened)i(and)e(new)g(features)h(w)o(ere)g +(added.)37 b(This)20 b(pro)q(cess)177 2613 y(to)q(ok)d(ab)q(out)h(t)o(w)o(o)f +(mon)o(ths)f(\(No)o(v)o(em)o(b)q(er)h(and)h(Decem)o(b)q(er)g(1991\).)28 +b(A)17 b(further)i(t)o(w)o(o)e(mon)o(ths)f(\(appro)o(x\))i(w)o(ere)177 +2663 y(sp)q(en)o(t)13 b(writing)f(do)q(cumen)o(tation,)f(constructing)i(a)f +(regression)h(test)h(suite,)e(p)q(orting)g(the)h(program)e(to)h(di\013eren)o +(t)177 2712 y(mac)o(hines,)h(and)g(sorting)h(out)g(the)g(legal)f(issues)i(in) +o(v)o(olv)o(ed)e(in)g(its)h(release.)177 2785 y(I)g(w)o(ould)f(lik)o(e)h(to)g +(tak)o(e)g(this)g(opp)q(ortunit)o(y)g(to)g(record)h(a)f(debt)g(of)g +(gratitude)g(to)g(Da)o(vid)f(Hulse)h(who)g(translated)177 2835 +y(F)m(unnelW)m(eb)f(from)e(Ada)i(to)f(C.)h(Although)f(m)o(y)f(rew)o(orking)i +(of)f(his)h(C)g(co)q(de)h(obliterated)f(most)e(of)i(his)f(co)q(de,)i(his)1042 +2940 y(27)p eop +%%Page: 28 29 +28 28 bop 177 42 a Fn(translation)14 b(w)o(as)g(piv)o(otal)e(to)i(the)h(dev)o +(elopmen)o(t)e(pro)q(cess.)21 b(Without)14 b(his)g(e\013ort)h(in)e(mo)o(ving) +f(from)g(Ada)i(to)g(C,)177 91 y(I'm)f(not)j(sure)g(that)f(I)g(w)o(ould)g(ha)o +(v)o(e)g(m)o(ustered)g(the)h(energy)g(and)f(time)f(to)h(complete)g(the)h(pro) +q(cess)h(and)e(bring)177 141 y(F)m(unnelW)m(eb)f(up)f(to)h(its)g(curren)o(t)h +(standard.)177 308 y Fe(2.3)70 b(Wh)n(y)23 b(F)-6 b(unnelW)g(eb)23 +b(W)-6 b(asn't)24 b(Used)e(to)h(W)-6 b(rite)22 b(Itself)177 +426 y Fn(After)d(Kn)o(uth)g(created)g(the)g(W)m(eb)f(literate)h(prepro)q +(cessing)h(system,)e(he)h(re-wrote)g(it)f(using)g(W)m(eb)g(and)g(dis-)177 +476 y(tributed)13 b(the)g(source)g(co)q(de)g(in)f(W)m(eb)g(source)i(form.)h +(T)m(o)d(allo)o(w)e(the)j(W)m(eb)f(source)h(co)q(de)h(to)e(b)q(e)g(tangled)g +(b)o(y)g(users)177 526 y(not)i(y)o(et)g(ha)o(ving)f(a)g(cop)o(y)h(of)g(W)m +(eb,)f(he)h(also)f(included)h(the)h(tangled)e(P)o(ascal)h(co)q(de)h(for)e +(the)i(T)m(angler.)177 602 y(While)j(this)g(approac)o(h)h(is)f(heroic)h(and)g +(serv)o(es)h(to)e(con)o(v)o(ey)h(a)f(commitm)o(en)o(t)e(and)i(a)g +(con\014dence)i(in)f(literate)177 652 y(programming,)10 b(it)j(seemed)h(to)g +(me)e(that)i(writing)f(F)m(unnelW)m(eb)g(in)g(F)m(unnelW)m(eb)g(w)o(ould)g +(simply)f(b)q(e)i(asking)f(for)177 702 y(trouble.)18 b(F)m(or)11 +b(a)g(start,)i(it)e(w)o(ould)g(b)q(e)h(v)o(ery)g(hard)g(to)g(mo)q(dify)d(an)o +(y)i(feature)i(of)e(F)m(unnelW)m(eb)g(that)h(had)f(b)q(een)i(used)177 +752 y(to)18 b(write)g(F)m(unnelW)m(eb,)f(and)h(the)g(though)o(t)g(of)f(what)g +(w)o(ould)g(happ)q(en)h(if)f(the)h(w)o(orking)f(executable)i(b)q(ecame)177 +801 y(inop)q(erativ)o(e)14 b(for)f(some)g(reason)i(do)q(es)g(not)e(b)q(ear)i +(thinking)e(up)q(on.)177 878 y(One)18 b(million)c(billion)h(computer)i +(programs)f(w)o(ere)j(written)f(in)e(the)i(non-literate)g(st)o(yle)f(b)q +(efore)h(F)m(unnelW)m(eb)177 928 y(w)o(as)c(created.)20 b(Wh)o(y)13 +b(not)h(one)g(more?)177 1095 y Fe(2.4)70 b(Co)r(ding)22 b(St)n(yle)177 +1213 y Fn(Although)15 b(F)m(unnelW)m(eb)g(w)o(asn't)g(co)q(ded)h(under)g(an)o +(y)f(particular)g(co)q(ding)g(standard,)h(it)f(w)o(as)g(co)q(ded)h(in)f +(accor-)177 1263 y(dance)c(with)e(a)g(fairly)g(strict)h(p)q(ersonal)g(st)o +(yle)g(of)f(C)g(whic)o(h)h(dev)o(elop)q(ed)g(during)g(the)g(dev)o(elopmen)o +(t)f(of)g(F)m(unnelW)m(eb.)177 1312 y(This)17 b(st)o(yle)f(w)o(as)h +(subsequen)o(tly)h(em)o(b)q(o)q(died)d(in)h(a)g(real)h(C)f(co)q(ding)h +(standard)g(prepared)g(for)g(the)g(South)f(Aus-)177 1362 y(tralian)10 +b(Go)o(v)o(ernmen)o(t)g(Departmen)o(t)h(of)f(Lands.)935 1347 +y Fd(1)971 1362 y Fn(Unfortunately)m(,)h(F)m(unnelW)m(eb)g(w)o(as)g(not)g +(formally)d(dev)o(elop)q(ed)177 1412 y(under)16 b(the)g(standard)g(and)f(so)g +(some)g(holes)g(remain)f(in)h(F)m(unnelW)m(eb's)g(co)q(ding)g(st)o(yle.)22 +b(This)15 b(section)h(aims)e(to)177 1462 y(describ)q(e)i(some)d(of)g(the)i +(more)d(imp)q(ortan)o(t)h(asp)q(ects)i(of)e(the)i(co)q(ding)f(st)o(yle.)177 +1538 y Fk(P)o(ortabili)o(t)n(y:)27 b Fn(This)19 b(w)o(as)g(a)g(ma)r(jor)e +(goal)h(of)h(the)g(F)m(unnelW)m(eb)g(implemen)o(tatio)o(n.)31 +b(Tw)o(o)19 b(excellen)o(t)h(b)q(o)q(oks)177 1588 y(guided)f(this)g(mo)o(v)o +(e)e(to)i(p)q(ortabilit)o(y)m(.)31 b(They)19 b(w)o(ere)h Fk([Rabino)o +(witz90])c Fn(\(whic)o(h)j(deals)g(with)f(C)h(co)q(de)h(itself)s(\))177 +1638 y(and)15 b Fk([Horton90])g Fn(\(whic)o(h)g(deals)h(with)f(the)h(p)q +(ortabilit)o(y)e(of)g(v)n(arious)h(library)g(calls\).)22 b(Other)16 +b(w)o(orks)g(suc)o(h)g(as)177 1687 y Fk([Kernighan88])c Fn(and)i +Fk([ANSI])g Fn(w)o(ere)h(also)e(helpful.)177 1764 y Fk(Iden)o(ti\014ers:)i +([Rabino)o(witz90])p Fn(length)10 b(sp)q(eci\014es)k(that)f(for)f(wide)g(p)q +(ortabilit)o(y)m(,)f(iden)o(ti\014ers)i(of)f(blo)q(c)o(k)g(and)h(\014le)177 +1814 y(scop)q(e)j(should)f(b)q(e)h(unique)f(to)g(eigh)o(t)f(c)o(haracters,)j +(and)e(iden)o(ti\014ers)h(of)e(program)f(scop)q(e)j(should)f(b)q(e)h(unique)f +(to)177 1863 y(six)d(c)o(haracters.)19 b(I)11 b(ha)o(v)o(e)h(gone)f(further)i +(in)e(F)m(unnelW)m(eb)g(and)h(actually)e(made)h(these)i(restrictions)g +(actual)e(limits)177 1913 y(on)j(iden)o(ti\014er)g(length.)177 +1989 y(Because)k(names)d(m)o(ust)g(b)q(e)i(so)f(short,)g(a)g(system)g(of)f +(abbreviations)h(w)o(as)g(dev)o(elop)q(ed)g(to)g(organize)g(the)h(iden-)177 +2039 y(ti\014ers)f(used)h(within)d(F)m(unnelW)m(eb.)23 b(Eac)o(h)15 +b(abbreviation)g(consists)i(of)d(a)i(letter)g(pair.)22 b(Here)17 +b(are)f Fh(some)f Fn(of)g(the)177 2089 y(abbreviations)f(used:)177 +2209 y Fi(bp)22 b(-)f(Body)g(Part.)177 2259 y(cm)h(-)f(Compare.)f(Used)h(to)h +(prefix)e(comparison)g(routines)g(that)h(return)g([-1,0,1].)177 +2309 y(dc)h(-)f(Document)f(component.)177 2359 y(dm)i(-)f(Dump)g(package.)177 +2408 y(el)h(-)f(Element.)177 2458 y(eq)h(-)f(Equal.)g(Used)g(to)g(prefix)g +(comparison)e(routines)h(that)h(return)g(a)h(boolean.)177 2508 +y(ex)g(-)f(Expression.)177 2558 y(f)44 b(-)21 b(Global)g(files.)177 +2608 y(ll)h(-)f(List)g(of)g(lists.)177 2658 y(ln)h(-)f(Line)g(record.)177 +2707 y(ls)h(-)f(List)g(Package.)177 2757 y(lr)h(-)f(Lister)g(package.)p +177 2796 709 2 v 223 2823 a Fc(1)241 2835 y Fb(The)11 b(standard)e(is)j +(curren)o(tly)d(una)o(v)n(ailable)o(,)g(but)i(is)g(lik)o(ely)f(to)h(b)q(e)g +(released)f(or)h(published)e(ev)o(en)o(tually)m(.)1042 2940 +y Fn(28)p eop +%%Page: 29 30 +29 29 bop 177 42 a Fi(ma)22 b(-)f(Macro.)177 91 y(mc)h(-)f(Macro)g(Call.)177 +141 y(mn)h(-)f(Macro)g(Name.)177 191 y(op)h(-)f(Options)f(package.)177 +241 y(pr)i(-)f(Parser.)177 291 y(ps)h(-)f(Position)f(record.)177 +340 y(sc)i(-)f(Scrap)g(record.)177 390 y(sn)h(-)f(Section.)177 +440 y(tb)h(-)f(Table)g(package.)177 490 y(ty)h(-)f(Typesetter)f(directive.) +177 540 y(wf)i(-)f(Write)g(file)g(package.)177 589 y(wl)h(-)f(Write)g(with)g +(EOL)g(\(misc.c\).)177 639 y(wr)h(-)f(Write)217 b(\(misc.c\).)177 +756 y Fk(P)o(oin)o(ters:)15 b Fn(V)m(ariables)f(or)g(t)o(yp)q(es)g(denoting)g +(p)q(oin)o(ters)g(start)h(with)e(\\)p Fi(p)p 1292 756 14 2 +v 16 w Fn(".)177 831 y Fk(T)o(yp)q(es:)18 b Fn(Names)13 b(denoting)g(t)o(yp)q +(es)h(end)g(in)f(\\)p 898 831 V 15 w Fi(t)p Fn(".)18 b(Th)o(us,)13 +b(a)g(t)o(yp)q(e)h(for)f(a)g(p)q(oin)o(ter)g(to)g(a)g(table)g(w)o(ould)g(b)q +(e)h(named)177 881 y Fi(p)p 202 881 V 16 w(tb)p 262 881 V 15 +w(t)p Fn(.)177 956 y Fk(File)j(names:)23 b Fn(All)16 b(\014les)h(used)g(in)f +(F)m(unnelW)m(eb)g(ha)o(v)o(e)g(\014le)g(names)g(that)h(are)f(from)f(one)i +(to)f(eigh)o(t)g(c)o(haracters)177 1005 y(long)d(and)g(\014le)g(extensions)i +(that)e(are)h(from)e(one)h(to)h(three)g(c)o(haracters)i(long.)h(This)c +(ensures)i(that)f(the)g(\014les)g(can)177 1055 y(b)q(e)h(p)q(ortably)e(mo)o +(v)o(ed)f(to)i(all)f(kinds)h(of)f(mac)o(hines,)f(ev)o(en)j(MSDOS!)177 +1218 y Fe(2.5)70 b(Use)22 b(of)h(Memory)177 1334 y Fn(F)m(unnelW)m(eb)15 +b(is)h(not)g(a)g(memory-stressed)f(program.)23 b(Ho)o(w)o(ev)o(er,)16 +b(during)f(its)h(dev)o(elopmen)o(t,)f(problems)g(with)177 1384 +y(the)g(managemen)o(t)d(of)h(memory)f(seemed)j(to)f(crop)g(up)h(again)e(and)h +(again.)k(This)c(section)h(do)q(cumen)o(ts)f(some)f(of)177 +1434 y(these)i(problems)e(and)h(the)h(solutions)e(adopted.)177 +1509 y(There)22 b(are)e(three)i(places)e(where)i(memory)17 +b(can)k(b)q(e)g(obtained:)30 b(the)21 b(heap,)g(the)g(stac)o(k,)h(and)e(from) +e(static)177 1558 y(v)n(ariables.)f(The)e(follo)o(wing)c(three)k(sections)g +(deal)f(with)f(eac)o(h)i(of)e(these)i(areas.)177 1721 y Fe(2.6)70 +b(The)22 b(Heap)177 1837 y Fn(One)17 b(of)f(the)h(great)g(frustrations)f(of)g +(b)q(eing)h(a)f(user)h(is)f(to)h(\014nd)f(that)h(a)f(computer)g(program)e(is) +j(complaining)177 1887 y(ab)q(out)d(lac)o(k)f(of)g(memory)f(when)i(one)g(kno) +o(ws)g(full)e(w)o(ell)i(that)g(one)g(has)g(allo)q(cated)f(at)h(least)g(ten)g +(times)f(as)h(m)o(uc)o(h)177 1937 y(memory)f(to)j(the)g(program)e(as)i(it)f +(w)o(ould)g(ev)o(er)i(need)f(to)g(do)f(its)h(job.)23 b(The)16 +b(reason)g(for)g(suc)o(h)g(error)h(messages)177 1987 y(usually)h(has)h(to)g +(do)f(with)g(the)i(programmer)c(setting)j(a)g(\014xed)g(\\reasonable")g +(limit)d(to)i(a)h(particular)f(data)177 2037 y(structure)f(and)d(then)h(lo)q +(c)o(king)e(it)i(up)f(in)o(to)g(an)g(arra)o(y)g(whose)h(b)q(ound)g(is)f(sp)q +(eci\014ed)i(b)o(y)e(a)g(constan)o(t.)21 b(While)13 b(the)177 +2086 y(use)i(of)e(arra)o(ys)h(can)g(increase)h(the)f(sp)q(eed)h(of)e(a)h +(program,)d(it)i(also)h(means)e(that)i(the)h(user)f(cannot)g(increase)h(the) +177 2136 y(capacit)o(y)f(of)g(the)h(program)e(without)h(obtaining)f(the)i +(source)h(co)q(de)f(and)g(recompiling)d(it,)i(whic)o(h)g(is)g(usually)g(a)177 +2186 y(daun)o(ting)f(option.)177 2261 y(The)g(alternativ)o(e)g(is)f(to)h(use) +h(the)f(heap)g(for)f(all)g(data)g(structures)j(that)e(can)g(gro)o(w)f(in)h +(prop)q(ortion)f(to)h(the)g(size)g(of)177 2311 y(the)f(user's)g(input.)17 +b(This)11 b(rule)h(has)f(b)q(een)h(follo)o(w)o(ed)e(rigorously)g(in)h(F)m +(unnelW)m(eb.)16 b(This)11 b(means)g(that)g(as)g(memory)177 +2360 y(spaces)h(increase,)g(users)g(will)d(b)q(e)i(able)g(to)f(hand)h(their)f +(v)o(ersion)h(of)f(F)m(unnelW)m(eb)g(more)g(memory)e(without)i(ha)o(ving)177 +2410 y(to)k(recompile)f(it.)998 2510 y(|)h Fm(x)g Fn(|)177 +2635 y(Some)i(problems)f(arose)j(early)e(on)h(the)g(Macin)o(tosh)g(in)f(the)h +(use)h(of)e(the)h(heap.)27 b(It)17 b(seems)g(that)f(some)g(of)g(the)177 +2685 y(allo)q(cations)i(I)i(w)o(as)f(attempting)f(to)h(mak)o(e)f(w)o(ere)i +(failing)d(for)i(some)g(obscure)i(reason,)f(p)q(ossibly)f(m)o(y)f(fault.)177 +2735 y(Whatev)o(er)c(it)f(w)o(as,)g(it)g(w)o(en)o(t)g(a)o(w)o(a)o(y)g(when)g +(I)h(replaced)g(direct)g(calls)f(to)g Fi(malloc)f Fn(with)h(calls)g(to)g(a)g +(mini)e(pac)o(k)n(age)177 2785 y(I)j(wrote)g(\(called)f Fi(memory)p +Fn(\))f(that)i(allo)q(cated)f(large)g(c)o(h)o(unks)h(of)f(memory)e(and)j +(then)g(doled)f(out)h(small)d(pieces)k(as)177 2835 y(required)g(b)o(y)f(the)g +(rest)h(of)e(the)i(program.)1042 2940 y(29)p eop +%%Page: 30 31 +30 30 bop 177 42 a Fn(Ha)o(ving)13 b(a)h(pac)o(k)n(age)f(to)h(manage)e(all)h +(the)h(memory)e(allo)q(cation)g(had)i(t)o(w)o(o)f(other)h(b)q(ene\014ts.)177 +122 y(First,)k(only)f(one)h(c)o(hec)o(k)g(w)o(as)g(required)g(in)f(the)h(en)o +(tire)g(program)e(to)h(see)i(if)e(memory)e(had)i(run)h(out)f(\(in)g(the)177 +172 y(memory)f(pac)o(k)n(age\),)i(and)g(if)g(that)g(failed,)f(the)i(program)e +(could)h(b)q(e)g(brough)o(t)g(to)g(a)g(screaming)g(halt.)30 +b(This)177 222 y(organization)20 b(w)o(as)g(far)g(preferable)i(to)e(ha)o +(ving)g(eac)o(h)h(piece)g(of)f(co)q(de)i(that)f(needed)h(to)e(allo)q(cate)g +(memory)177 272 y(ha)o(ving)13 b(to)h(c)o(hec)o(k)h(to)e(see)i(if)e +Fi(malloc)g Fn(had)h(failed.)177 352 y(Second,)21 b(the)f(decision)g(to)f +(construct)i(a)f(mini-shell)c(within)j(F)m(unnelW)m(eb)g(to)g(supp)q(ort)i +(regression)f(testing)177 402 y(mean)o(t)11 b(that)h(F)m(unnelW)m(eb)g(prop)q +(er)h(could)f(b)q(e)g(run)h(man)o(y)d(times)h(in)h(an)o(y)f(giv)o(en)h(in)o +(v)o(o)q(cation)f(of)g(F)m(unnelW)m(eb.)17 b(As)177 452 y(a)10 +b(consequence)j(it)d(w)o(as)h(necessary)h(to)f(mak)o(e)e(sure)i(that)g(there) +g(w)o(as)g(no)f(memory)e(leak)n(age)i(b)q(et)o(w)o(een)i(in)o(v)o(o)q +(cations)177 502 y(of)18 b(F)m(unnelW)m(eb)h(prop)q(er.)33 +b(This)19 b(w)o(as)g(accomplished)e(b)o(y)i(rew)o(orking)g(the)g(memory)d +(pac)o(k)n(age)j(to)f(op)q(erate)i(a)177 551 y(w)o(atermark)12 +b(system.)17 b(The)d(user)g(of)e(the)i(pac)o(k)n(age,)e(when)h(requesting)h +(memory)m(,)c(could)i(request)j(\\temp)q(orary")177 601 y(or)g(\\p)q(ermanen) +o(t".)22 b(If)15 b(p)q(ermanen)o(t,)g(the)h(memory)d(pac)o(k)n(age)i(forgot)f +(that)i(it)f(had)g(allo)q(cated)g(the)h(memory)m(.)j(If)177 +651 y(temp)q(orary)m(,)12 b(the)i(memory)c(pac)o(k)n(age)j(places)h(the)g +(allo)q(cated)f(blo)q(c)o(k)g(on)g(a)g(list.)k(There)d(w)o(as)f(then)h(a)f +(function)g(in)177 701 y(the)f(memory)d(pac)o(k)n(age)j(that)f(could)h(b)q(e) +g(called)f(to)g(deallo)q(cate)h(all)e(the)i(temp)q(orary)f(memory)m(.)k(Th)o +(us,)c(so)h(long)f(as)177 751 y(all)i(requests)j(for)e(memory)d(within)i(F)m +(unnelW)m(eb)h(prop)q(er)h(w)o(ere)g(for)e(temp)q(orary)h(memory)m(,)c(and)k +(that)g(memory)177 800 y(w)o(as)g(freed)h(at)e(the)i(end)f(of)g(ev)o(ery)g +(run,)g(one)g(could)g(b)q(e)g(sure)h(that)f(there)h(w)o(as)f(no)g(memory)d +(leak)n(age.)177 981 y Fe(2.7)70 b(The)22 b(Stac)n(k)177 1105 +y Fn(F)m(or)13 b(a)f(while)g(during)h(the)g(dev)o(elopmen)o(t)f(of)g(F)m +(unnelW)m(eb)g(a)h(particularly)f(nast)o(y)h(bug)f(pro)o(v)o(ed)h(extremely)g +(hard)177 1155 y(to)j(\014nd.)26 b(The)17 b(symptom)c(w)o(as)j(that)h(F)m +(unnelW)m(eb)f(w)o(ould)f(crash,)i(sometimes)e(at)h(random,)f(but)h(more)g +(often)177 1205 y(up)q(on)h(en)o(tering)g(a)g(particular)f(function.)27 +b(In)16 b(the)i(end)f(ab)q(out)g(a)f(da)o(y)h(of)f(sp)q(eci\014c)i(debugging) +e(w)o(as)h(required)177 1255 y(b)q(efore)e(the)f(problem)e(w)o(as)i(trac)o(k) +o(ed)h(do)o(wn)e(to)h(a)f(stac)o(k)h(problem.)j(It)d(turned)g(out)g(that)g +(someho)o(w)e(\(either)j(the)177 1305 y(fault)f(of)g(the)i(Macin)o(tosh)e(or) +h(the)g(THINK)h(C)e(language)g(system\),)h(only)f(6K)g(w)o(as)h(b)q(eing)g +(allo)q(cated)f(for)g(stac)o(k)177 1354 y(space!!!!!!!)177 +1435 y(This)f(exp)q(erience)h(led)f(me)e(immediately)e(to)k(go)f(through)g +(the)i(en)o(tire)f(program)e(and)h(eliminate)f(\(or)h(remo)o(v)o(e)g(to)177 +1485 y(the)j(heap\))f(an)o(y)f(automatic)f(v)n(ariable)h(declarations)h(that) +g(used)h(more)e(than)h(one)g(h)o(undred)g(or)g(so)g(b)o(ytes.)177 +1565 y(The)g(lesson)g(is)g(clearly)f(that)h(C)f(programs)g(that)g(use)i(more) +d(than)i(a)f(few)h(thousand)f(b)o(ytes)i(of)e(stac)o(k)h(space)g(are)177 +1615 y(risking)f(their)i(p)q(ortabilit)o(y)m(.)h(All)d(large)h(data)f +(structures)j(should)e(b)q(e)h(placed)f(in)f(the)i(heap.)177 +1796 y Fe(2.8)70 b(Static)21 b(V)-6 b(ariables)177 1920 y Fn(Static)11 +b(v)n(ariables)e(also)h(pro)o(v)o(ed)g(a)g(problem)f(on)i(the)g(Macin)o +(tosh.)16 b(It)11 b(turns)g(out)f(that)h(the)g(Macin)o(tosh)f(THINK)h(C)177 +1970 y(compiler)g(do)q(es)h(not)g(allo)o(w)e(more)h(than)h(32K)f(of)g +(statics)i Fh(in)g(the)g(entir)n(e)f(pr)n(o)n(gr)n(am)p Fn(.)17 +b(F)m(or)11 b(a)h(while)f(this)h(restriction)177 2020 y(w)o(as)17 +b(a)f(serious)i(threat)g(to)e(the)i(program)d(as)i(it)f(w)o(as)h(disco)o(v)o +(ered)h(that)f(constan)o(t)g(strings)g(w)o(ere)h(included)f(in)177 +2070 y(this)d(total!)k(Ho)o(w)o(ev)o(er,)c(some)f(searc)o(hing)h(rev)o(ealed) +h(a)e(compiler)g(option)g(that)h(remo)o(v)o(ed)f(the)i(strings)f(from)e(the) +177 2119 y(static)i(category)m(.)177 2200 y(Nev)o(ertheless,)k(the)e(32K)g +(limit)c(is)k(rather)g(sev)o(ere.)25 b(Again,)15 b(it)g(seems)h(that)f(for)h +(p)q(ortabilit)o(y)e(reasons,)i(C)g(pro-)177 2250 y(grams)f(that)h(use)g(a)g +(lot)f(of)h(static)g(v)n(ariables)f(are)h(risking)g(their)g(p)q(ortabilit)o +(y)m(.)22 b(As)16 b(a)g(result,)h(the)f(F)m(unnelW)m(eb)177 +2300 y(co)q(de)f(a)o(v)o(oids)e(static)h(v)n(ariables)f(where)i(p)q(ossible)f +(in)g(fa)o(v)o(our)f(of)g(the)h(heap.)177 2480 y Fe(2.9)70 +b(Implemen)n(ti)o(ng)20 b(T)-6 b(ext)23 b(Inden)n(tation)177 +2605 y Fn(A)o(t)e(one)g(p)q(oin)o(t)f(during)g(the)h(dev)o(elopmen)o(t)f(of)g +(F)m(unnelW)m(eb,)h(text)h(inden)o(tation)e(w)o(as)g(fully)g(implem)o(en)o +(ted.)177 2654 y(Ho)o(w)o(ev)o(er,)12 b(it)g(w)o(as)g(subsequen)o(tly)h(remo) +o(v)o(ed)e(b)q(ecause)i(it)f(w)o(as)g(considered)h(a)f(dangerous)g(feature.) +18 b(This)12 b(section)177 2704 y(records)17 b(the)f(w)o(a)o(y)f(in)g(whic)o +(h)h(text)g(inden)o(tation)f(w)o(as)g(implemen)o(ted)e(so)j(that)g(if)e(the)i +(feature)h(ev)o(er)f(has)g(to)f(b)q(e)177 2754 y(put)f(bac)o(k,)g(this)g(tec) +o(hnique)g(can)h(b)q(e)f(used)h(again.)177 2835 y(1.)j(Create)d(a)e(new)i +(\014eld)f(in)f(the)i Fi(sc)p 739 2835 14 2 v 15 w(t)e Fn(record)j(call)d +Fi(sc)p 1037 2835 V 15 w(postn)p Fn(.)1042 2940 y(30)p eop +%%Page: 31 32 +31 31 bop 308 42 a Fi(char)21 b(*sc_postn;)f(/*)h(Pointer)f(in)i(the)f(range) +g([sc_first,sc_las)o(t+1].)236 b(*/)657 91 y(/*)21 b(It)g(is)h(the)f(minimum) +f(possible)g(value)h(of)h(sc_postn)e(for)108 b(*/)657 141 y(/*)21 +b(which)g(EOL)g(does)g(not)g(appear)g(in)g(*sc_postn..*sc_la)o(st.)84 +b(*/)657 191 y(/*)21 b(i.e.)g(Points)g(to)g(the)g(byte)g(following)f(the)h +(first)g(EOL)g(in)65 b(*/)657 241 y(/*)21 b(the)g(scrap)g(or)g(sc_first)f(if) +i(EOL)f(does)g(not)g(appear.)173 b(*/)177 342 y Fn(2.)17 b(Mo)q(dify)10 +b(the)i(scanner)h(so)e(that)g(it)g(generates)i(this)e(\014eld.)18 +b(Sendtext)12 b(should)f(b)q(e)h(mo)q(di\014ed)e(so)h(that)g(it)g(accepts)177 +391 y(an)j(argumen)o(t)f(for)g(the)i Fi(p)p 581 391 14 2 v +15 w(postn)e Fn(v)n(alue.)177 492 y Fi(LOCAL)21 b(void)g(sendtext)f +(P_\(\(p_ps_t,char)f(*,char)h(*,char)h(*,bool\)\);)177 542 +y(LOCAL)g(void)g(sendtext\(p_tkps,p)o(_firs)o(t,p_l)o(ast,)o(p_pos)o(tn,is)o +(_whit)o(e\))177 592 y(/*)h(Appends)e(a)h(text)g(token)g(to)h(the)f(end)g(of) +g(the)g(token)g(list.)544 b(*/)177 642 y(/*)22 b(IN:)f(p_ps)g(is)g(a)h +(pointer)e(to)h(a)h(position)e(structure)g(giving)h(the)g(position)f(of)h +(the)65 b(*/)177 691 y(/*)109 b(first)20 b(character)g(of)i(the)f(token.)914 +b(*/)177 741 y(/*)22 b(IN:)f(p_first)f(and)h(p_last)g(point)g(to)g(the)g +(first)g(and)g(last)g(byte)g(of)g(the)h(text)e(scrap.)h(*/)177 +791 y(/*)h(IN:)f(p_postn)f(has)h(the)g(same)g(definition)f(as)h(sc_postn)g +(\(see)g(fwdata.h\).)259 b(*/)177 841 y(/*)22 b(IN:)f(is_white)f(should)g(be) +i(set)f(to)g(TRUE)g(iff)g(scrap)g(is)h(entirely)e(whitespace.)150 +b(*/)177 891 y(p_ps_t)21 b(p_tkps;)177 941 y(char)43 b(*p_first;)177 +990 y(char)g(*p_last;)177 1040 y(char)g(*p_postn;)177 1090 +y(bool)65 b(is_white;)177 1140 y({)199 1190 y(tk_t)21 b(token;)199 +1289 y(/*)g(Empty)g(text)g(scraps)g(should)f(never)h(be)g(generated.)f(*/)199 +1339 y(assert\(p_first<=p)o(_last)o(,"sen)o(dtext)o(:)f(Text)i(scrap)g +(bounds)f(are)h(bad."\);)199 1439 y(/*)g(If)h(ch=EOL)e(then)h(we)h(should)e +(be)i(scanning)e(more)h(text,)f(not)i(shipping)e(it!)h(*/)199 +1488 y(assert\(ch!=EOL,"s)o(entte)o(xt:)e(Shipping)h(text)h(while)f(still)h +(more)g(to)h(scan."\);)199 1588 y(/*)f(Check)g(that)g(p_postn)f(is)i(in)f +(range.)g(See)g(definition)f(in)h(fwdata.h.)f(*/)199 1638 y +(assert\(p_first<=p)o(_post)o(n)f(&&)i(p_postn<=p_last+1,)352 +1688 y("sendtext:)e(p_postn)i(is)g(out)g(of)h(range."\);)199 +1787 y(/*)f(Debug:)g(Check)g(the)g(p_postn)f(field)h(using)g(a)g(brute)g +(force)g(check.)f(*/)199 1837 y({)221 1887 y(char)h(*i,*j;)221 +1937 y(j=p_first;)221 1987 y(for)g(\(i=p_first;i<=p_l)o(ast;i)o(++\))286 +2036 y(if)h(\(*i==EOL\))352 2086 y(j=i+1;)221 2136 y(assert\(j==p_post)o +(n,"se)o(ndtex)o(t:)d(sc_postn)h(field)h(is)g(incorrect."\);)199 +2186 y(})199 2286 y(/*)g(Load)g(the)g(text)g(token.)g(*/)199 +2335 y(token.tk_kind)172 b(=)21 b(TK_TEXT;)199 2385 y(ASSIGN\(token.tk_p)o +(s,*p_)o(tkps\))o(;)199 2435 y(token.tk_sc.sc_fi)o(rst)e(=)i(p_first;)199 +2485 y(token.tk_sc.sc_la)o(st)41 b(=)21 b(p_last;)199 2535 +y(token.tk_sc.sc_po)o(stn)e(=)i(p_postn;)199 2584 y(token.tk_white)150 +b(=)21 b(is_white;)199 2634 y(token.tk_parno)150 b(=)21 b(0;)199 +2684 y(ls_add\(token_list)o(,PV)e(&token\);)177 2734 y(})177 +2835 y Fn(Then)c(all)d(the)j(calls)e(to)h(sendtext)h(ha)o(v)o(e)f(to)g(b)q(e) +g(c)o(hanged:)1042 2940 y(31)p eop +%%Page: 32 33 +32 32 bop 177 42 a Fi(/*)22 b(@)f(instructs)f(FunnelWeb)g(to)h(replace)g(the) +g(special)f(construct)g(with)h(the)g(*/)177 91 y(/*)h(special)e(character.)g +(Luckily)g(one)h(appears)f(just)h(before)g(the)g(@)h(!!)108 +b(*/)177 141 y(/*)22 b(Note:)e(FALSE)h(is)g(OK)h(because)e(space)h(is)g(not)g +(a)h(legal)f(specialch.)150 b(*/)177 191 y(/*)22 b(Note:)e(Setting)h +(parameter)f(p_postn)g(to)h(p_ch-1)g(is)g(OK)h(as)f(EOL)g(is)h(not)f(a)g(*/) +177 241 y(/*)152 b(legal)21 b(specialch.)913 b(*/)177 291 y +(sendtext\(&ps_spec,)o(p_ch-)o(1,p_c)o(h-1,p)o(_ch-1)o(,FAL)o(SE\);)177 +340 y(break;)177 440 y(/*)22 b(+)f(instructs)f(FunnelWeb)g(to)h(insert)g(an)g +(EOL.)g(We)h(can't)e(look)h(to)h(the)f(end)g(of)g(*/)177 490 +y(/*)h(the)f(previous)f(line)h(to)g(find)g(an)h(EOL)f(as)g(this)g(might)g(be) +g(the)g(first)g(line.)64 b(*/)177 540 y(/*)22 b(Running)e(ahead)h(to)g(the)g +(end)g(of)h(the)f(line)g(is)g(expensive,)f(and)h(having)g(the)64 +b(*/)177 589 y(/*)22 b(liner)e(mini-package)g(maintain)g(a)h(variable)f(for)i +(it)f(would)g(be)g(extra)173 b(*/)177 639 y(/*)22 b(housekeeping.)d(Instead)h +(of)h(all)h(this,)e(we)i(just)f(point)f(to)i(a)f(static.)151 +b(*/)177 689 y({CONST)21 b(static)f(char)h(stateol)g(=)g(EOL;)199 +739 y(sendtext\(&ps_spec)o(,&sta)o(teol,)o(&stat)o(eol,\()o(&sta)o(teol\))o +(+1,TR)o(UE\);})177 789 y(break;)177 888 y(/*)h(If)f(we)g(hit)g(something)f +(that)h(ends)g(a)h(text)f(token)g(*/)177 938 y(/*)h(then)f(we)g(can)g +(transmit)f(a)i(white)f(text)g(token.)64 b(*/)177 988 y(if)22 +b(\(ch==specialch)c(||)k(ch==EOFCH\))243 1038 y({sendtext\(&ps_s)o(tart,)o +(p_fir)o(st,p_)o(ch-1,)o(MAX\()o(p_sol)o(,p_fi)o(rst\),)o(TRUE\))o(;)d +(return;})177 1137 y(/*)j(Otherwise)d(we)j(have)f(some)g(more)g +(\(non-white\))e(text)i(to)h(scan.)e(*/)177 1187 y(/*)i(We)f(can)g(then)g +(send)g(a)h(non-white)e(text)h(token.)303 b(*/)177 1237 y(while)21 +b(\(ch!=specialch)e(&&)i(ch!=EOFCH\))243 1287 y(NEXTCH;)177 +1337 y(sendtext\(&ps_start)o(,p_fi)o(rst,p)o(_ch-1)o(,MAX\()o(p_so)o(l,p_f)o +(irst\))o(,FALS)o(E\);)177 1442 y Fn(The)14 b(dump)f(co)q(de)i(needs)g(to)f +(b)q(e)g(c)o(hanged)h(to)q(o!)352 1548 y Fi(wf_str\(p_wf,"\\")o("\);)177 +1597 y(assert\(token->tk_s)o(c.sc_)o(first)j(!=NULL,"dm_tkls:)h(NULL)i +(ptr1."\);)177 1647 y(assert\(token->tk_s)o(c.sc_)o(last)40 +b(!=NULL,"dm_tkls:)19 b(NULL)i(ptr2."\);)177 1697 y(for)g +(\(i=token->tk_sc.sc_)o(first)o(;)e(i<=token->tk_sc.s)o(c_las)o(t;)g(i++\)) +221 1747 y({)243 1797 y(if)i(\(i==token->tk_sc.)o(sc_po)o(stn\))308 +1846 y(wf_str\(p_wf,""\))o(;)243 1896 y(if)g(\(*i=='\\n'\))308 +1946 y(wf_wl\(p_wf,""\);)243 1996 y(else)308 2046 y(dm_byte\(p_wf,*\(\(u)o +(byte_)d(*\))k(i\)\);)221 2095 y(})177 2145 y(if)g(\(i==token->tk_s)o(c.sc_)o +(postn)o(\))243 2195 y(wf_str\(p_wf,")o("\);)177 +2245 y(wf_str\(p_wf,"\\""\);)177 2295 y(})177 2400 y Fn(3.)37 +b(Ov)o(er)22 b(in)e(the)h(T)m(angle)e(mo)q(dule,)h(create)i(a)e(massiv)o(e)f +(arra)o(y)h(of)g(p)q(oin)o(ters)h(to)f(scraps)i(to)e(b)q(e)h(used)h(as)e(a) +177 2450 y(stac)o(k.)f(Main)o(tain)13 b(p)q(oin)o(ters)h(in)o(to)g(the)g +(stac)o(k)h(called)e Fi(current)g Fn(and)h Fh(b)n(ase)g Fn(\(similar)e(to)i +(the)g(blank)f(inden)o(tation)177 2500 y(v)n(ariables\).)18 +b(Implemen)o(t)11 b(the)k(follo)o(wing:)239 2605 y Fm(\017)21 +b Fn(T)m(o)14 b(write)i(out)f(a)g(scrap,)h(scan)f(it)g(b)o(yte)h(b)o(y)f(b)o +(yte.)22 b(Output)16 b(eac)o(h)g(b)o(yte.)22 b(When)15 b(y)o(ou)g(hit)g(an)g +(EOL,)g(p)q(op)281 2655 y(the)g(stac)o(k)g(bac)o(k)g(to)f Fi(base)p +Fn(.)20 b(Then)15 b(write)g(out)g(an)f(EOL)h(follo)o(w)o(ed)e(b)o(y)i(the)g +(stac)o(k)g(con)o(ten)o(ts)h(but)f(writing)281 2705 y(eac)o(h)d(scrap)h(only) +f(from)e Fi(postn)h Fn(to)h(end)g(end)h(of)e(eac)o(h)i(scrap.)18 +b(When)12 b(y)o(ou)g(ha)o(v)o(e)g(\014nished)g(the)h(new)f(scrap,)281 +2755 y(push)i(it)g(on)g(the)g(stac)o(k.)239 2835 y Fm(\017)21 +b Fn(When)14 b(y)o(ou)f(hit)h(a)g(new)g(macro)f(to)g(expand,)h(sa)o(v)o(e)g +Fi(base)p Fn(.)j(Restore)e(it)e(later.)1042 2940 y(32)p eop +%%Page: 33 34 +33 33 bop 177 42 a Fn(The)14 b Fi(postn)f Fn(\014eld)h(solv)o(es)g(the)h(big) +e(problem)g(of)g(ho)o(w)g(to)h(cop)q(e)h(with)e(something)g(lik)o(e)g(this:) +177 158 y Fi(The)21 b(rain)g(in)h(Spain)177 208 y(falls)f(mainly)f(@)177 324 y Fn(The)f(trouble)g(is)f(that)h(w)o(e)g(w)o(an)o(t)f +(to)g(text)h(inden)o(t)g(the)g(lines)g(in)f Fi(@)e +Fn(with)h(just)h(\\)p Fi(falls)177 374 y(mainly)g Fn(".)31 +b(Ho)o(w)o(ev)o(er,)20 b(this)f(string)f(is)g(only)g(part)h(of)f(a)g(scrap.) +33 b(The)19 b(solution)e(is)i(to)f(get)h(the)g(scanner)h(to)177 +423 y(record,)c(in)e(the)i Fi(postn)e Fn(\014eld)h(of)f(eac)o(h)h(scrap,)h +(the)f(p)q(osition)f(of)h(the)g(\014rst)h(b)o(yte)f(with)g(a)f(EOL-free)i +(run)f(to)g(the)177 473 y(end)g(of)e(the)h(scrap.)177 548 y(This)i(sc)o(heme) +g(is)g(v)o(ery)h(e\016cien)o(t)f(b)q(ecause)i(all)d(w)o(e)h(are)h(doing)e(is) +h(pushing)g(and)g(p)q(opping)f(p)q(oin)o(ters)i(to)f(scraps)177 +598 y(on)g(a)g(stac)o(k)h(arra)o(y)m(.)25 b(The)16 b(main)e(disadv)n(an)o +(tage)i(is)g(that)g(the)h(arra)o(y)f(m)o(ust)g(necessarily)h(b)q(e)g +(\014nite)f(and)h(w)o(ould)177 648 y(imp)q(ose)c(a)h(limit)d(on)i(the)i +(depth)f(of)g(inden)o(tation)f(nesting)h(\(not)g(a)g(big)f(problem\).)1042 +2940 y(33)p eop +%%Page: 34 35 +34 34 bop 1042 2940 a Fn(34)p eop +%%Page: 35 36 +35 35 bop 177 377 a Ff(Chapter)34 b(3)177 609 y Fl(F)-10 b(unnelW)g(eb)41 +b(Mo)s(di\014cation)177 875 y Fe(3.1)70 b(In)n(tro)r(duction)177 +990 y Fn(This)19 b(c)o(hapter)h(deals)f(with)g(mo)q(di\014cations)e(to)i(F)m +(unnelW)m(eb.)33 b(Although)19 b(the)g(GNU)g(license)h(under)g(whic)o(h)177 +1040 y(F)m(unnelW)m(eb)10 b(is)h(distributed)h(allo)o(ws)d(an)o(y)o(one)i(to) +f(mo)q(dify)f(F)m(unnelW)m(eb)h(and)h(distribute)g(the)g(mo)q(di\014ed)f(v)o +(ersions,)177 1090 y(there)15 b(are)f(a)f(n)o(um)o(b)q(er)f(of)h(dangers)h +(in)f(doing)g(this.)k(This)d(c)o(hapter)g(explains)f(the)h(dangers)g(and)f +(presen)o(ts)j(some)177 1140 y(issues)f(that)f(y)o(ou)g(should)f(think)h(ab)q +(out)g(if)f(y)o(ou)g(in)o(tend)h(to)g(distribute)g(mo)q(di\014ed)f(v)o +(ersions)h(of)f(F)m(unnelW)m(eb.)177 1301 y Fe(3.2)70 b(The)22 +b(Danger)i(of)f(Mo)r(difying)g(Languages)177 1417 y Fn(Whenev)o(er)15 +b(someone)e(mo)q(di\014es)g(a)h(computer)f(program)f(they)j(should)e(alw)o(a) +o(ys)g(ask)h(themselv)o(es)g(\\what)f(is)h(the)177 1467 y(impact)c(of)h +(these)h(c)o(hanges)g(going)f(to)g(b)q(e)h(on)f(users".)18 +b(F)m(or)11 b(mature)g(pro)q(ducts,)h(the)g(degree)h(of)e(impact)e(is)j +(largely)177 1516 y(determined)17 b(b)o(y)g(the)h(in)o(v)o(estmen)o(t)e(that) +i(users)g(ha)o(v)o(e)f(made)f(in)h(particular)g(\014le)g(formats)f(supp)q +(orted)i(b)o(y)f(the)177 1566 y(pro)q(duct.)177 1641 y(A)o(t)c(the)g(t)o(w)o +(o)g(extremes,)g(there)h(are)f(the)g(video)g(game)e(and)i(the)g(compiler.)j +(If)d(one)g(c)o(hanges)g(a)g(video)f(game,)f(the)177 1690 y(c)o(hange)h +(a\013ects)g(only)e(the)i(future)g(games)e(pla)o(y)o(ed.)16 +b(Ho)o(w)o(ev)o(er,)c(if)e(one)i(c)o(hanges)f(a)g(compiler)f(in)h(particular) +g(w)o(a)o(ys,)177 1740 y(it)i(is)f(lik)o(ely)g(that)h(thousands)g(of)g(users) +h(will)e(b)q(e)h(forced)h(to)e(c)o(hange)i(milli)o(ons)c(of)j(source)h +(\014les)f(to)g(accommo)q(date)177 1790 y(the)f(new)g(v)o(ersion.)17 +b(Th)o(us)11 b(the)h(impact)e(of)g(c)o(hanges)i(to)f(a)g(program)f(dep)q +(ends)j(largely)d(on)h(the)h(in)o(v)o(estmen)o(t)e(made)177 +1840 y(b)o(y)k(users,)h(in)e(source)i(\014les,)f(training,)f(and)g(ev)o(en)i +(m)o(uscle)e(memory!)177 1914 y(F)m(unnelW)m(eb)h(lies)h(v)o(ery)g(m)o(uc)o +(h)f(at)h(the)g(compiler)f(end)h(of)f(this)h(sp)q(ectrum.)22 +b(In)14 b(fact)h(it)g(lies)f(ev)o(en)i(further.)22 b(Not)177 +1964 y(only)15 b(do)q(es)h(it)e(implemen)o(t)f(a)i(language,)f(but)h(it)g(is) +g(curren)o(tly)h(the)g Fh(only)g Fn(implem)o(en)o(tation)c(of)j(that)g +(language!)177 2014 y(This)c(means)g(that,)g(although)g(they)h(shouldn't,)f +(p)q(eople)g(will)f(b)q(e)i(tempted)f(to)h(treat)g(the)g(F)m(unnelW)m(eb)e +(program)177 2064 y(as)16 b(the)h(de\014nition)e(of)g(its)h(input)g(language) +f(instead)h(of)f(the)i(de\014nition)e(c)o(hapter)i(in)e(the)i +Fh(F)m(unnelWeb)h(User's)177 2113 y(Manual)p Fn(,)c(whic)o(h)g(tak)o(es)g +(precedence)q(.)177 2188 y(Because)f(F)m(unnelW)m(eb)d(de\014nes)i(an)e +(input)h(language,)f(and)g(p)q(eople)h(will)f(write)h(programs)e(using)h +(that)h(language,)177 2238 y(particular)j(kinds)f(of)h(c)o(hanges)g(in)f(the) +i(language)e(will)f(impact)g(sev)o(erely)j(on)f(users.)19 b(Three)c +(di\013eren)o(t)g(kinds)e(of)177 2287 y(c)o(hange)h(are)h(discussed)g(b)q +(elo)o(w.)295 2362 y Fk(Remo)o(ving)e(features:)k Fn(Remo)o(v)n(al)10 +b(of)i(features)i(\(featurectom)o(y\))f(is)g(extremely)g(di\016cult)f(once) +295 2412 y(the)k(user)h(base)f(has)g(started)g(using)g(them.)22 +b(If)15 b(a)g(feature)h(is)g(remo)o(v)o(ed,)e(users)j(of)e(the)h(program)295 +2461 y(will)11 b(ha)o(v)o(e)h(to)h(go)e(through)i(all)e(their)i(programs)e +(and)h(\014nd)h(a)f(w)o(a)o(y)f(to)i(sim)o(ulate)d(the)j(e\013ect)h(of)e(the) +295 2511 y(remo)o(v)o(ed)h(feature)i(with)e(other)h(features.)19 +b(Often)c(this)e(is)h(so)g(un)o(think)n(able,)e(that)i(bad)g(language)295 +2561 y(constructs)i(are)e(tolerated)h(far)e(b)q(ey)o(ond)i(their)f(useful)g +(lifetime.)295 2635 y Fk(Mo)q(difying)k(features:)23 b Fn(Mo)q(di\014cation) +17 b(of)f(features)i(has)g(less)g(direct)g(impact)d(than)i(the)h(re-)295 +2685 y(mo)o(v)n(al)12 b(of)i(features,)h(but)g(can)f(cause)i(more)d(subtle)i +(errors.)21 b(F)m(or)15 b(example,)d(consider)k(the)f(sorts)295 +2735 y(of)d(subtle)i(errors)g(that)f(migh)o(t)d(arise)j(if)f(the)i(seman)o +(tics)e(of)g(the)h(F)m(unnelW)m(eb)f(commen)o(t)f Fi(@!)18 +b Fn(w)o(ere)295 2785 y(c)o(hanged)i(so)g(that)g(it)f(no)h(longer)f(includes) +h(the)h(end)f(of)f(line)g(mark)o(er.)35 b(An)o(y)o(one)20 b(mo)q(difying)295 +2835 y(features)15 b(should)f(b)q(e)g(sure)h(that)f(they)h(are)f(not)g(inadv) +o(erten)o(tly)g(la)o(ying)e(traps.)1042 2940 y(35)p eop +%%Page: 36 37 +36 36 bop 295 42 a Fk(Adding)15 b(features:)20 b Fn(Although)14 +b(the)i(addition)e(of)h(features)h(is)f(generally)g(the)h(most)e(painless)295 +91 y(for)e(the)h(user)g(comm)o(unit)o(y)m(,)c(as)j(Hoare)h(p)q(oin)o(ts)f +(out,)g(it)g(is)g(also)f(the)i(most)e(dangerous)i(in)f(the)h(long)295 +141 y(run.)343 246 y(\\When)d(an)o(y)f(new)h(language)f(design)h(pro)r(ject)h +(is)f(nearing)f(completion,)g(there)i(is)e(alw)o(a)o(ys)g(a)h(mad)281 +295 y(rush)h(to)f(get)h(new)g(features)g(added)g(b)q(efore)g +(standardization.)16 b(The)11 b(rush)g(is)f(mad)f(indeed,)i(b)q(ecause)281 +345 y(it)f(leads)h(in)o(to)f(a)g(trap)h(from)e(whic)o(h)h(there)i(is)e(no)h +(escap)q(e.)18 b(A)11 b(feature)g(whic)o(h)g(is)f(omitted)f(can)i(alw)o(a)o +(ys)281 395 y(b)q(e)18 b(added)g(later,)g(when)g(its)f(design)h(and)f(its)g +(implications)e(are)j(w)o(ell)f(understo)q(o)q(d.)30 b(A)17 +b(feature)281 445 y(whic)o(h)c(is)g(included)h(b)q(efore)g(it)f(is)g(fully)f +(understo)q(o)q(d)j(can)f(nev)o(er)g(b)q(e)g(remo)o(v)o(ed)e(later.")p +Fk([Hoare80])177 549 y Fn(These)17 b(problems)d(exist)h(ev)o(en)h(when)f +(there)i(is)e(a)f(cen)o(tral)i(authorit)o(y)m(.)21 b(If)14 +b(w)o(e)i(consider)g(the)f(case)h(where)g(there)177 599 y(is)g(no)g(cen)o +(tral)h(authorit)o(y)m(,)e(and)h(users)i(mo)q(dify)c(a)i(language)f(and)h +(its)g(implemen)o(tations)d(and)j(distribute)h(the)177 649 +y(mo)q(di\014ed)h(v)o(ersions,)i(the)g(result)g(is)f(ev)o(en)g(w)o(orse.)34 +b(F)m(or)19 b(a)g(start,)h(the)g(structure)h(of)e(the)g(genealogy)g(of)f(the) +177 699 y(program)e(c)o(hanges)j(from)d(a)h(list)h(to)f(a)h(tree.)31 +b(This)18 b(mak)o(es)e(it)i(imp)q(ossible)e(to)h(imp)q(ose)g(an)h(ordering)g +(on)f(the)177 749 y(di\013eren)o(t)f(v)o(ersions)g(and)g(mak)o(es)e(it)h +(di\016cult)f(to)i(merge)f(them)f(once)i(they)g(div)o(erge.)23 +b(Second,)16 b(it)f(reduces)i(the)177 798 y(p)q(ortabilit)o(y)f(of)h(\014les) +h(created)h(under)g(di\013eren)o(t)f(v)o(ersions.)30 b(Third,)18 +b(it)f(mak)o(es)f(adding)h(features)i(hazardous.)177 848 y(If)c(a)g(feature)h +(is)f(added)h(in)e(one)i(v)o(ersion,)f(\014les)h(will)e(b)q(e)h(created)i +(that)f(use)g(it.)21 b(These)c(\014les)f(will)d(immediately)177 +898 y(b)q(ecome)d(non-p)q(ortable.)17 b(F)m(urthermore,)11 +b(t)o(w)o(o)f(programmers)e(ma)o(y)g(in)o(tro)q(duce)k(di\013eren)o(t)f +(features)g(that)g(use)g(the)177 948 y(same)h(syn)o(tactical)h(constructs,)h +(th)o(us)f(prev)o(en)o(ting)g(the)h(t)o(w)o(o)e(v)o(ersions)h(from)e(ev)o(er) +j(b)q(eing)f(merged.)k(W)m(orse,)12 b(t)o(w)o(o)177 998 y(programmers)f +(could)i(in)o(tro)q(duce)h Fh(similar)e Fn(features)i(that)g(use)g(the)f +(same)g(syn)o(tactical)g(constructs,)i(pro)q(ducing)177 1048 +y(ev)o(en)g(more)e(subtle)h(problems.)177 1119 y(The)c(only)f(w)o(a)o(y)f(to) +i(a)o(v)o(oid)e(all)g(these)j(problems)e(is)g(to)g(create)i(some)e(sort)h(of) +e(cen)o(tral)i(design)g(authorit)o(y)m(,)f(\(or,)h(at)f(the)177 +1169 y(v)o(ery)j(least,)g(some)f(sort)h(of)g(design)g(sync)o(hronization\))f +(that)h(con)o(trols)g(the)h(language)d(and)i(its)g(implemen)o(tati)o(on.)177 +1240 y(The)i(b)q(ene\014ts)i(of)d(tigh)o(t)h(con)o(trol)f(o)o(v)o(er)h(the)h +(language)e(are)h(enormous.)295 1311 y Fk(Univ)o(ersal)g(p)q(ortabilit)n(y:)k +Fn(Source)e(\014les)f(can)g(b)q(e)g(treated)h(as)f(p)q(ortable.)21 +b(If)15 b(all)e(the)j(language)295 1361 y(implemen)o(tations)g(in)i(the)h(w)o +(orld)e(are)i(singing)f(the)h(same)e(tune,)j(then)f(someone)f(in)g(Sydney)295 +1411 y(could)g(send)h(a)f(\014le)h(to)f(someone)f(in)h(New)h(Y)m(ork)f(and)g +(b)q(e)g(sure)i(that)e(it)g(will)f(b)q(e)h(successfully)295 +1461 y(pro)q(cessed.)295 1532 y Fk(Clear)e(seman)o(tics:)i +Fn(Doubt)c(ab)q(out)g(the)h(seman)o(tics)f(of)g(the)h(language)e(will)g(b)q +(e)i(greatly)f(mini-)295 1582 y(mized.)k(So)13 b(long)g(as)h(more)f(than)h +(one)h(sligh)o(tly)d(di\013ering)i(v)o(ersion)g(of)f(a)h(language)f(exists,)h +(there)295 1632 y(will)9 b(b)q(e)j(confusion)e(o)o(v)o(er)g(the)i(seman)o +(tics)e(of)g(its)g(constructs.)19 b(A)11 b(go)q(o)q(d)f(example)f(is)i(the)g +(confusion)295 1682 y(b)q(et)o(w)o(een)16 b(the)e(A)m(T&T)g(Unix)f(and)h +(Berk)o(eley)h(Unix)f(shell)f(languages.)177 1753 y(While)20 +b(c)o(hanges)h(to)g(the)g(language)f(supp)q(orted)i(b)o(y)e(a)g(piece)i(of)e +(soft)o(w)o(are)h(is)f(the)h(most)f(serious)h(problem)177 1803 +y(asso)q(ciated)16 b(with)e(m)o(ultiple)f(v)o(ersions)i(of)f(soft)o(w)o(are,) +h(the)g(lesser)h(problem)e(of)g(k)o(eeping)h(trac)o(k)g(of)f(c)o(hanges)i +(that)177 1853 y(don't)f(a\013ect)h(the)g(language)e(that)h(the)h(soft)o(w)o +(are)g(implem)o(en)o(ts)d(can)j(also)e(cause)j(trouble.)22 +b(Merging)15 b(di\013eren)o(t)177 1902 y(v)o(ersions)g(of)f(soft)o(w)o(are)g +(is)h(extremely)f(tedious)h(as)f(an)o(y)o(one)g(who)g(has)h(tried)g(it)f +(will)f(v)o(erify)m(.)19 b(Ho)o(w)o(ev)o(er,)14 b(c)o(hanges)177 +1952 y(not)g(a\013ecting)g(the)g(language)f(are)h(far)f(less)h(serious)h(b)q +(ecause)g(they)f(impact)e(only)h(on)h(the)g(program)e(itself,)h(not)177 +2002 y(on)h(the)g(far)g(more)f(n)o(umerous)g(source)i(\014les)f(that)g(dep)q +(end)i(on)d(it.)177 2159 y Fe(3.3)70 b(Authorit)n(y)23 b(vs)g(User)g(Securit) +n(y)177 2272 y Fn(There)16 b(are)f(a)g(n)o(um)o(b)q(er)f(of)g(w)o(a)o(ys)h +(of)f(pro)o(viding)f(the)j(strong)f(cen)o(tral)g(design)g(authorit)o(y)f +(required)i(to)f(pro)q(duce)177 2322 y(the)g(p)q(ortabilit)o(y)d(and)i(seman) +o(tic)f(securit)o(y)i(desired)g(b)o(y)e(users,)239 2426 y Fm(\017)21 +b Fn(T)m(rade)d(mark)e(the)i(name)f(of)g(the)i(language.)28 +b(Publish)18 b(a)g(sp)q(eci\014cation)g(of)f(the)i(language)e(under)h(the)281 +2476 y(trade)c(name.)i(W)m(arn)d(all)f(users)j(not)e(to)g(trust)h(an)o(y)f +(implemen)o(tatio)o(n)e(that)i(do)q(es)h(not)f(guaran)o(tee)h(that)f(it)281 +2526 y(implemen)o(ts)d(the)j(language.)k(Then)c(con)o(trol)f(implemen)o +(tations)d(b)o(y)k(only)e(licensing)i(the)g(trade)g(mark)e(to)281 +2576 y(conforming)h(implem)o(en)o(tations.)239 2655 y Fm(\017)21 +b Fn(Create)g(a)f(single)g(implemen)o(tation)d(of)j(the)h(language.)36 +b(Do)20 b(not)g(release)h(the)g(source)h(co)q(de)f(to)f(the)281 +2705 y(implemen)o(tatio)o(n.)15 b(Release)g(only)e(binary)g(executables.)239 +2785 y Fm(\017)21 b Fn(Release)14 b(the)f(source)i(co)q(de)f(to)f(the)g +(implemen)o(tation,)c(but)14 b(under)g(a)f(license)g(that)h(prohibits)e(the)i +(distri-)281 2835 y(bution)f(of)h(mo)q(di\014ed)e(v)o(ersions.)1042 +2940 y(36)p eop +%%Page: 37 38 +37 37 bop 177 42 a Fn(Man)o(y)11 b(other)h(v)n(ariations)e(on)h(these)i +(themes)e(are)h(p)q(ossible,)f(but)h(they)f(are)h(all)e(based)i(on)f(the)h +(idea)f(of)g(regulating)177 91 y(either)k(the)f(\\o\016cial")e(de\014nition)i +(of)f(the)i(language)e(or)g(all)g(of)g(its)h(existing)g(implemen)o(tatio)o +(ns.)177 168 y(A)o(t)h(ab)q(out)f(this)h(stage,)g(a)f(con\015ict)h(arises.)21 +b(While)14 b(users)i(w)o(an)o(t)f(the)g(language)f(they)h(are)g(using)f(to)h +(b)q(e)g(tigh)o(tly)177 217 y(con)o(trolled,)e(they)h(also)f(w)o(an)o(t)g(to) +h(feel)f(secure)j(ab)q(out)d(the)h(a)o(v)n(ailabilit)o(y)c(of)j(its)h(implem) +o(en)o(tations.)h(If)f(h)o(undreds)177 267 y(of)19 b(source)i(\014les)e(are)h +(to)g(b)q(e)g(created)h(in)e(the)h(language,)f(there)i(had)e(b)q(etter)i(b)q +(e)f(one)g(or)f(more)f(translators)177 317 y(a)o(v)n(ailable)12 +b(when)i(the)h(time)d(comes)i(to)f(use)i(them.)177 393 y(In)g(the)g(case)h +(of)e(widely-used)h(programmi)o(ng)d(languages)i(suc)o(h)h(as)g(C,)f(the)i +(problem)d(of)h(securing)i(implem)o(en-)177 443 y(tations)c(do)q(es)i(not)e +(arise.)18 b(If)12 b(y)o(ou)g(don't)g(get)h(y)o(our)f(compiler)f(from)g +(Borland,)h(y)o(ou)g(can)h(get)f(it)h(from)d(Microsoft.)177 +493 y(Ho)o(w)o(ev)o(er,)16 b(in)f(the)h(case)g(of)f(a)g(newly)h(in)o(tro)q +(duced)g(language)e(suc)o(h)i(as)g(F)m(unnelW)m(eb,)f(there)h(ma)o(y)e(b)q(e) +i(v)o(ery)g(few)177 543 y(implemen)o(tations,)g(or)i(ev)o(en)h(just)f(one)h +(implemen)o(tatio)o(n,)d(and)i(this)h(p)q(oses)g(a)f(danger)h(to)f(the)h +(user)g(who)f(is)177 593 y(committing)10 b(to)j(that)g(format.)j(Despite)d +(the)h(b)q(est)g(in)o(ten)o(tions)f(of)f(the)i(cop)o(yrigh)o(t)f(o)o(wner,)g +(there)h(are)g(a)e(v)n(ariet)o(y)177 642 y(of)h(w)o(a)o(ys)g(in)f(whic)o(h)h +(a)g(computer)g(program)f(can)h(suddenly)h(b)q(ecome)f(una)o(v)n(ailable.)j +(Here)e(are)g(some)e(examples:)239 762 y Fm(\017)21 b Fn(If)12 +b(the)h(program)e(is)i(o)o(wned)g(b)o(y)f(a)g(compan)o(y)f(and)i(the)g +(compan)o(y)e(go)q(es)i(brok)o(e,)g(the)g(liquidators)e(ma)o(y)g(not)281 +812 y(b)q(other)k(to)e(place)h(the)h(soft)o(w)o(are)f(in)f(the)i(public)e +(domain.)239 898 y Fm(\017)21 b Fn(If)13 b(the)g(program)f(is)h(o)o(wned)g(b) +o(y)g(a)g(kindly)f(individual)f(who)i(issues)h(licenses)h(for)e(free,)g(and)g +(that)g(individ-)281 948 y(ual)h(suddenly)h(dies,)g(users)i(migh)o(t)12 +b(suddenly)k(\014nd)f(themselv)o(es)g(negotiating)f(with)g(hard-nosed)i +(estate)281 998 y(executors)g(for)d(the)i(righ)o(ts)e(to)h(con)o(tin)o(ue)g +(using)g(the)g(program.)239 1084 y Fm(\017)21 b Fn(If)c(who)q(ev)o(er)h(o)o +(wns)g(the)g(program)e(do)q(es)i(not)f(upgrade)h(the)g(program)e(ev)o(ery)i +(so)f(often,)h(it)f(is)h(actually)281 1134 y(p)q(ossible)10 +b(for)g(the)h(released)g(executables)h(to)e(\\expire")h(when)f(new)h(op)q +(erating)f(system)g(upgrades)h(app)q(ear.)177 1254 y(These)16 +b(p)q(ossibilities)d(mean)g(that)i(users)g(ab)q(out)g(to)f(in)o(v)o(est)g(in) +g(a)g(newly)g(in)o(tro)q(duced)h(programmi)o(ng)c(to)q(ol)j(suc)o(h)177 +1304 y(as)j(F)m(unnelW)m(eb)f(ha)o(v)o(e)h(legitimate)d(concerns)19 +b(when)e(they)h(w)o(orry)e(ab)q(out)h(the)g(to)q(ol's)f(a)o(v)n(ailabilit)o +(y)l(.)24 b(F)m(or)16 b(non-)177 1354 y(commercially)8 b(distributed)k(to)q +(ols)f(suc)o(h)g(as)h(F)m(unnelW)m(eb,)e(the)i(simplest)e(solution)g(to)h +(this)h(problem)d(is)i(to)g(mak)o(e)177 1404 y(the)i(source)g(co)q(de)g(a)o +(v)n(ailable,)c(either)k(b)o(y)f(placing)f(it)g(in)o(to)g(the)i(public)e +(domain,)f(or)i(b)o(y)f(releasing)h(it)g(under)h(some)177 1453 +y(kind)i(of)f(public)h(license,)g(suc)o(h)h(as)f(a)g(GNU)g(license.)22 +b(The)15 b(trouble)g(with)g(releasing)g(the)h(source)g(co)q(de)g(is)f(that) +177 1503 y(it)f(remo)o(v)o(es)g(con)o(trol)g(from)f(the)i(design)g(authorit)o +(y)m(.)j(Once)e(the)f(co)q(de)g(is)g(\\out")f(there)h(is)g(no)f(stopping)g +(an)o(y)o(one)177 1553 y(from)e(mo)q(difying)f(the)k(program)d(and)i +(distributing)f(mo)q(di\014ed)g(v)o(ersions.)18 b(All)13 b(c)o(haos)h(can)g +(ensue.)177 1629 y(One)j(solution)d(to)i(this)g(con\015ict)g(is)f(to)h(tak)o +(e)f(the)h(trade)h(mark)d(approac)o(h.)23 b(This)16 b(separates)h(the)f(righ) +o(t)f(of)g(the)177 1679 y(design)e(authorit)o(y)f(to)h(con)o(trol)f(the)h +(language)f(and)g(its)h(implemen)o(tatio)o(ns,)d(and)j(the)g(righ)o(t)f(of)g +(the)h(users)h(to)f(use)177 1729 y(the)g(source)i(co)q(de)e(in)f(an)o(y)h(w)o +(a)o(y)f(they)h(lik)o(e)f(\(but)h(they)g(ma)o(y)e(ha)o(v)o(e)h(to)h(c)o +(hange)g(its)g(name!\).)j(Ho)o(w)o(ev)o(er,)d(the)g(trade)177 +1779 y(mark)g(approac)o(h)g(is)h(exp)q(ensiv)o(e.)177 1855 +y(The)e(solution)g(that)f(I)h(\(Ross)g(William)o(s)e(\()p Fi +(ross@spam.adelaid)o(e.ed)o(u.au)p Fn(\)\))f(ha)o(v)o(e)i(adopted)i(is)e(to)h +(release)h(the)177 1905 y(F)m(unnelW)m(eb)k(source)i(co)q(de)f(under)h(a)e +(GNU)g(license)i(and)e(then)h(to)f(write)h(this)g(c)o(hapter)g(in)f(the)i +Fh(F)m(unnelWeb)177 1955 y(Hacker's)c(Manual)h Fn(to)e(dissuade)h(p)q +(ossible)g(hac)o(k)o(ers)h(from)d(releasing)h(mo)q(di\014ed)f(v)o(ersions)j +(under)f(the)g(F)m(unnel-)177 2004 y(W)m(eb)e(name.)k(This)d(is)f(ab)q(out)h +(as)g(close)g(to)f(the)i(GNU/trademark)d(approac)o(h)i(I)f(can)h(get)g +(without)f(forking)g(out)177 2054 y(ab)q(out)e($1200)g(for)g(a)g(US)g +(trademark)g(or)g(pa)o(ying)f(ev)o(en)i(more)f(to)g(get)h(a)f(la)o(wy)o(er)g +(to)g(attempt)f(to)i(draft)f(a)g(con)o(tract)177 2104 y(stating)j(\\thou)f +(shalt)h(not)g(mo)q(dify)d(the)k(F)m(unnelW)m(eb)e(language".)177 +2271 y Fe(3.4)70 b(What)23 b(I)g(W)-6 b(an)n(t)24 b(to)f(Protect)177 +2389 y Fn(The)13 b(concerns)i(expressed)g(in)d(the)h(previous)g(section)h(ab) +q(out)e(mo)q(di\014cations)f(to)i(the)g(F)m(unnelW)m(eb)f(program)f(do)177 +2439 y(not)j(preclude)i(mo)q(di\014cations.)i(They)c(merely)g(imply)e(that)i +(some)f(conditions)h(b)q(e)h(observ)o(ed)h(when)f(mo)q(di\014ca-)177 +2489 y(tions)g(are)g(made.)k(In)c(fact,)g(ha)o(ving)e(formally)f(released)k +(the)f(sources)i(under)e(GNU,)f(there)i(is)f(nothing)f(that)h(I)177 +2539 y(can)h(do)f(to)h(stop)g(p)q(eople)g(distributing)f(mo)q(di\014ed)f(v)o +(ersions)i(and)g(the)g(conditions)f(to)h(b)q(e)g(describ)q(ed)i(m)o(ust)c(b)q +(e)177 2588 y(imp)q(osed)f(v)o(olun)o(tarily)m(.)177 2665 y(In)h(the)h(end)f +(there)h(are)f(t)o(w)o(o)g(things)g(that)g(I)f(w)o(an)o(t)h(to)g +(protect/main)o(tain:)228 2785 y(1.)20 b(Restriction)d(of)g(the)g(name)f(\\F) +m(unnelW)m(eb")g(only)g(to)h(computer)g(programs)e(that)i(exactly)h(implem)o +(en)o(t)281 2835 y(m)o(y)12 b(\\o\016cial")g(de\014nition)i(of)f(the)h +(language.)1042 2940 y(37)p eop +%%Page: 38 39 +38 38 bop 228 42 a Fn(2.)20 b(Restriction)15 b(of)f(the)h(F)m(unnelW)m(eb)f +(source)i(\014le)f(extensions)h(\\)p Fi(.fw)p Fn(")d(\(input)i(\014les\))g +(and)f(\\)p Fi(.fwi)p Fn(")g(\(include)281 91 y(\014les\))g(only)f(to)h +(source)h(\014les)g(that)f(conform)e(to)i(m)o(y)e(\\o\016cial")g +(de\014nition)h(of)h(the)g(language.)177 214 y(So)f(long)e(as)i(these)h +(conditions)e(hold,)g(source)i(\014les)f(created)h(under)g(\\F)m(unnelW)m +(eb")e(will)f(b)q(e)i(p)q(ortable,)g(and)f(the)177 264 y(language)g(will)g +(ha)o(v)o(e)g(the)i(p)q(oten)o(tial)e(to)h(b)q(e)h(stable)f(and)g(w)o +(ell-de\014ned.)18 b(Here)c(are)f(m)o(y)e(suggestions)j(for)e(ho)o(w)h(to)177 +314 y(ob)q(ey)i(these)i(rules.)22 b(These)16 b(suggestions)g(are)f(in)g +(addition)e(to)i(the)h(GNU)f(license)g(rules)h(ab)q(out)f(do)q(cumen)o(ting) +177 363 y(an)o(y)f(c)o(hanges)g(that)g(y)o(ou)g(mak)o(e)e(in)h(the)i(source)g +(\014les.)295 441 y Fk(Mo)q(di\014cations)h(that)i(do)g(not)f(a\013ect)i +(functional)o(i)o(t)o(y:)h Fn(If)c(y)o(ou)g(c)o(hange)g(the)h(F)m(unnelW)m +(eb)295 491 y(program)f(in)i(a)f(manner)g(that)h(do)q(es)g(not)g(a\013ect)h +(the)f(functionalit)o(y)e(of)h(the)i(program)d(in)h(an)o(y)295 +540 y(w)o(a)o(y)d(\(e.g.)f(p)q(ort)h(it)g(to)g(a)g(new)g(mac)o(hine,)f(or)h +(just)g(sp)q(eed)i(it)d(up\),)h(then)h(y)o(ou)e(should)h(mo)q(dify)e(the)295 +590 y(program)g(to)h(write)g(out)g(a)g(message)g(when)g(it)g(starts)h(up)f +(sa)o(ying)f(that)h(it)g(is)g(a)g(mo)q(di\014ed)f(v)o(ersion)295 +640 y(of)i(F)m(unnelW)m(eb.)j(No)d(other)g(actions)g(need)h(b)q(e)g(tak)o +(en.)295 717 y Fk(Mo)q(di\014cations)d(that)h(a\013ect)h(functional)o(i)o(t)o +(y:)h Fn(If)d(y)o(ou)g(mak)o(e)e(c)o(hanges)k(to)e(F)m(unnelW)m(eb)g(that)295 +767 y(a\013ect)g(its)f(functionalit)o(y)f(\(e.g.)g(c)o(hanges)i(to)f(command) +e(line)h(options,)h(the)h(command)c(language,)295 817 y(or)13 +b(the)h(input)f(language\))g(y)o(ou)f(should)h(c)o(hange)h(the)g(name)e(of)g +(the)i(program)e(so)h(that)g(the)h(name)295 867 y(no)h(longer)g(con)o(tains)h +(the)g(w)o(ord)f(\\F)m(unnelW)m(eb",)f(and)h(should)g(c)o(ho)q(ose)i +(alternativ)o(e)e(input)g(and)295 917 y(include-\014le)d(\014le)g(extensions) +g(\(the)h(curren)o(t)g(ones)f(are)g(\\)p Fi(.fw)p Fn(")f(and)g(\\)p +Fi(.fwi)p Fn("\).)16 b(F)m(or)c(example,)e(y)o(ou)295 966 y(migh)o(t)g(call)h +(y)o(our)g(program)f(\\BananaW)m(eb")h(and)g(use)i(the)f(\014le)g(extensions) +g(\\)p Fi(.bw)p Fn(")f(and)g(\\)p Fi(.bwi)p Fn(".)177 1044 +y(These)k(rules)f(are)g(not)g(v)o(ery)g(restrictiv)o(e.)19 +b(Basically)13 b(y)o(ou)g(can)h(do)f(what)h(y)o(ou)f(lik)o(e)g(so)h(long)e +(as)i(y)o(ou)f(c)o(hange)h(the)177 1094 y(name)d(of)g(the)h(resulting)g +(program.)k(I)c(do)f(not)h(wish)g(to)g(restrict)h(an)o(y)o(one)e(who)h(migh)o +(t)e(w)o(an)o(t)h(to)h(use)g(F)m(unnelW)m(eb)177 1143 y(as)18 +b(a)g(foundation)f(for)g(a)h(more)f(sophisticated)h(literate)g(programming)d +(system.)30 b(My)17 b(sole)h(aim)e(here)j(is)f(to)177 1193 +y(protect)d(the)g(in)o(tegrit)o(y)e(of)g(what)h(already)g(exists.)177 +1364 y Fe(3.5)70 b(Mo)r(difying)22 b(the)h(Man)n(uals)177 1483 +y Fn(While)15 b(it)h(is)f(p)q(ermitted)h(to)f(mo)q(dify)f(the)i(F)m(unnelW)m +(eb)f(program,)g(no)g(license)i(has)f(b)q(een)g(gran)o(ted)h(to)e(mo)q(dify) +177 1533 y(its)h(do)q(cumen)o(tation)f(\()p Fh(The)i(F)m(unnelWeb)h(User's)e +(Manual)g Fn(and)g Fh(The)h(F)m(unnelWeb)h(Hacker's)e(Manual)p +Fn(\).)25 b(The)177 1583 y(only)12 b(op)q(eration)h(that)f(can)h(b)q(e)h(p)q +(erformed)e(on)g(the)i(F)m(unnelW)m(eb)e(do)q(cumen)o(tation)f(is)i(a)f(v)o +(erbatim)f(cop)o(y)i(in)f(an)o(y)177 1633 y(medium.)177 1710 +y(If)j(y)o(ou)g(ha)o(v)o(e)g(created)i(a)f(mo)q(di\014ed)e(v)o(ersion)h(of)g +(F)m(unnelW)m(eb)g(and)g(wish)h(to)f(do)q(cumen)o(t)g(it,)g(either)h(write)g +(y)o(our)177 1760 y(o)o(wn)h(man)o(ual)e(from)g(scratc)o(h,)k(or)e(write)g(a) +g(man)o(ual)e(that)i(can)g(b)q(e)h(used)g(in)e(conjunction)i(with)e(the)i +(existing)177 1809 y(man)o(uals.)177 1980 y Fe(3.6)70 b(Ho)n(w)23 +b(Cop)n(yrigh)n(t)g(La)n(w)g(W)-6 b(orks)177 2099 y Fn(In)17 +b(order)h(to)f(understand)i(the)f(next)f(section,)i(some)d(understanding)i +(of)e(cop)o(yrigh)o(t)h(la)o(w)f(is)h(required.)29 b(The)177 +2149 y(assertions)15 b(made)e(in)h(this)h(section)f(are)h(not)f(legal)f +(opinions;)g(they)i(are)g(merely)e(appro)o(ximations)f(of)h(the)i(la)o(w,)177 +2199 y(based)g(on)e(m)o(y)g(understanding)h(of)f(it.)177 2276 +y(By)k(default,)g(who)q(ev)o(er)g(creates)h(a)f Fk(w)o(ork)f +Fn(o)o(wns)h Fk(cop)o(yrigh)o(t)c Fn(o)o(v)o(er)k(it.)26 b(This)16 +b(means)g(that)h(b)o(y)f(default,)h(that)177 2326 y(p)q(erson)e(is)f(the)g +(only)f(p)q(erson)i(in)f(the)g(w)o(orld)g(who)f(has)h(the)h(legal)e(righ)o(t) +g(to)h(mak)o(e)e(copies)j(of)e(the)h(w)o(ork.)177 2403 y(Cop)o(yrigh)o(t)g(o) +o(v)o(er)h(a)f(w)o(ork)g(usually)g(co)o(v)o(ers)i(all)d(direct)j(deriv)n +(ations)e(of)g(this)h(w)o(ork.)20 b(F)m(or)14 b(example,)g(if)f(someone)177 +2453 y(o)o(wns)f(the)h(source)h(co)q(de)f(to)f(a)f(computer)h(program)f(then) +i(they)f(also)g(o)o(wn)g(an)o(y)f(direct)i(deriv)n(ations)f(suc)o(h)h(as)f +(the)177 2503 y(binary)i(executable.)177 2580 y(More)i(than)g(one)f(p)q +(erson)i(ma)o(y)c(o)o(wn)i(cop)o(yrigh)o(t)g(o)o(v)o(er)h(a)f(w)o(ork.)23 +b(If)15 b(this)g(is)h(the)g(case,)g(then)g(the)g(w)o(ork)g(cannot)177 +2630 y(b)q(e)f(copied)f(without)f(the)i(p)q(ermission)e(of)g(all)g(of)g(the)h +(p)q(eople)h(o)o(wning)e(the)h(cop)o(yrigh)o(t.)177 2708 y(A)k(p)q(erson)g +(\(or)f(group\))g(o)o(wning)g(cop)o(yrigh)o(t)f(o)o(v)o(er)i(a)f(w)o(ork)g +(can)g Fk(license)e Fn(the)j(righ)o(t)f(to)g(mak)o(e)f(copies)i(of)e(the)177 +2757 y(w)o(ork)e(to)f(an)o(y)o(one)h(he)g(lik)o(es)g(under)h(an)o(y)e +(conditions)h(he)g(lik)o(es.)177 2835 y(If)g(a)f(w)o(ork)h(is)g(mo)q +(di\014ed,)e(the)i(result)h(is)f(called)f(a)h Fk(deriv)o(ed)f(w)o(ork)p +Fn(.)1042 2940 y(38)p eop +%%Page: 39 40 +39 39 bop 177 42 a Fn(If)13 b(cop)o(yrigh)o(t)g(on)h(a)f(w)o(ork)g(is)g(o)o +(wned)h(b)o(y)f Fj(A)h Fn(is)f(the)h(w)o(ork)f(is)h(mo)q(di\014ed)e(b)o(y)h +Fj(B)r Fn(,)h(cop)o(yrigh)o(t)f(on)g(the)h(deriv)o(ed)g(w)o(ork)177 +91 y(is)g(o)o(wned)g(b)o(y)g(b)q(oth)g Fj(A)g Fn(and)f Fj(B)r +Fn(.)177 159 y(Cop)o(yrigh)o(t)j(is)g(not)g(o)o(wnership)h(o)o(v)o(er)f +(particular)g(con\014gurations)h(of)f(information,)d(but)k(rather)g(is)f(the) +h(righ)o(t)177 209 y(to)d(restrict)i(the)f(cop)o(ying)e(of)h(information)d +(deriv)o(ed)k(from)d(particular)i(sources.)21 b(F)m(or)14 b(example,)e(if)i +(t)o(w)o(o)f(p)q(eople)177 259 y(p)q(oin)o(t)k(their)g(cameras)g(out)g(a)g +(windo)o(w)f(and)h(tak)o(e)g(iden)o(tical)f(photographs,)i(eac)o(h)f(p)q +(erson)h(has)g(the)f(righ)o(t)g(to)177 309 y(restrict)e(the)g(cop)o(ying)e +(of)g Fh(their)g Fn(photograph)h(regardless)h(of)e(the)h(fact)g(that)g(the)g +(other)g(p)q(erson)h(has)f(cop)o(yrigh)o(t)177 359 y(o)o(v)o(er)h(an)f(iden)o +(tical)g(photograph.)20 b(In)14 b(the)h(unlik)o(ely)f(ev)o(en)o(t)h(that)f(t) +o(w)o(o)g(p)q(eople)h(wrote)g(no)o(v)o(els)g(that)f(w)o(ere)i(letter)177 +408 y(for)d(letter)h(iden)o(tical)f(and)g(it)g(could)g(b)q(e)h(pro)o(v)o(en)g +(that)f(there)i(w)o(as)e(no)g(con)o(tact)h(b)q(et)o(w)o(een)h(the)f(t)o(w)o +(o)f(p)q(eople)g(when)177 458 y(they)e(wrote)h(the)f(no)o(v)o(els,)g(then)g +(cop)o(yrigh)o(t)g(la)o(w)f(w)o(ould)g(eac)o(h)h(protect)h(the)f(righ)o(t)g +(of)f(eac)o(h)h(p)q(erson)h(to)f(restrict)h(the)177 508 y(cop)o(ying)g(of)h +(the)g(no)o(v)o(el)f(originating)f(from)g Fh(them)p Fn(.)18 +b(In)13 b(practice,)g(the)h(probabilit)o(y)d(of)h(suc)o(h)i(an)f(ev)o(en)o(t) +g(o)q(ccurring)177 558 y(is)i(so)h(lo)o(w)e(that)h(the)h(la)o(w)f(assumes)g +(that)g(if)g(t)o(w)o(o)f(w)o(orks)i(are)f(close)h(or)f(iden)o(tical,)g(that)g +(there)i(has)e(b)q(een)i(some)177 608 y(information)11 b(in)o(terc)o(hange)k +(at)e(some)g(p)q(oin)o(t.)177 676 y(Th)o(us,)f(if)f(I)h(o)o(wn)g(cop)o(yrigh) +o(t)f(on)h(computer)f(program)g Fj(X)s Fn(,)h(and)g(I)f(create)j(an)d(iden)o +(tical)h(cop)o(y)f(of)h Fj(X)j Fn(called)d Fj(Y)21 b Fn(and)177 +726 y(distribute)c(it)f(under)h(the)f(terms)g(of)g(a)g(license)h(agreemen)o +(t,)f(then)g(that)h(license)g(agreemen)o(t)e(do)q(es)i(not)f(co)o(v)o(er)177 +775 y(the)e(cop)o(y)e Fj(X)s Fn(.)19 b(Once)14 b(the)f(license)h(agreemen)o +(t)e(is)h(signed,)g(there)h(is)f(nothing)f(I)h(can)g(do)f(to)h(undo)g(the)g +(license;)g Fj(Y)177 825 y Fn(has)h(gone.)k(Ho)o(w)o(ev)o(er,)c(I)g(still)f +(ha)o(v)o(e)h(total)f(con)o(trol)g(o)o(v)o(er)h Fj(X)s Fn(.)177 +893 y(V)m(ersion)g(2)g(of)f(the)h(GNU)g(General)g(Public)g(License)h(\(under) +g(whic)o(h)e(F)m(unnelW)m(eb)h(is)f(released\))j(sp)q(eci\014es)g(\(in)d(a) +177 943 y(n)o(utshell\))e(that)h(soft)o(w)o(are)f(can)g(b)q(e)h(copied)f +(freely)g(so)h(long)e(as)h(it)g(is)g(not)g(sold,)f(and)h(that)g(it)g(can)h(b) +q(e)f(mo)q(di\014ed)f(and)177 993 y(copied)15 b(freely)h(so)f(long)f(as)h +(the)h(mo)q(di\014cations)d(are)i(logged)g(and)g(it)f(is)h(not)g(sold.)21 +b(In)15 b(b)q(oth)h(cases,)g(it)f(requires)177 1043 y(that)h(the)h(result)g +(of)e(the)i(cop)o(y)f(or)g(mo)q(di\014cation)e(op)q(eration)h(b)q(e)i(copied) +f(only)g(under)g(the)h(conditions)f(of)f(the)177 1092 y(license.)177 +1160 y(Once)g(a)e(declaration)g(is)g(issued)h(licensing)f(a)g(cop)o(y)g(of)g +(a)g(program)e(under)j(GNU)f(license,)h(that)g(license)g(cannot)177 +1210 y(b)q(e)h(retracted.)177 1363 y Fe(3.7)70 b(Managemen)n(t)23 +b(of)g(the)f(O\016cial)f(F)-6 b(unnelW)g(eb)177 1472 y Fn(I)14 +b(in)o(tend)f(to)h(main)o(tain)d(an)i(o\016cial)f(cop)o(y)i(of)f(F)m(unnelW)m +(eb)g(and)g(release)i(it)f(under)g(GNU)f(license)i(from)d(time)g(to)177 +1522 y(time)h(so)h(that)g(ev)o(ery)o(one)g(can)h(use)f(it.)k(Unfortunately)c +(its)g(going)e(to)i(b)q(e)g(a)g(little)f(messy)m(.)177 1590 +y(F)m(or)j(a)h(v)n(ariet)o(y)f(of)f(reasons,)j(I)f(w)o(an)o(t)f(to)g(main)o +(tain)e(total)i(con)o(trol)g(o)o(v)o(er)g Fh(my)h Fn(cop)o(y)g(of)e(the)j +(o\016cial)d(v)o(ersion)h(of)177 1640 y(F)m(unnelW)m(eb.)i(Some)12 +b(of)i(the)g(reasons)h(are:)239 1732 y Fm(\017)21 b Fn(If)15 +b(it)h(turns)h(out)f(that)g(there)h(is)e(an)h(enormous)f(demand)g(for)h(F)m +(unnelW)m(eb)f(\(unlik)o(ely\))g(then)i(I)e(w)o(an)o(t)h(to)281 +1782 y(b)q(e)e(able)e(to)h(create)i(a)d(business)j(based)e(on)g(it,)f(or)h +(at)g(least)h(b)q(e)f(able)g(to)g(bundle)g(it)g(with)f(other)i(pro)q(ducts.) +281 1832 y(This)g(w)o(ould)g(b)q(e)i(di\016cult)e(if)f(the)j(only)d +(up-to-date)i(cop)o(y)g(a)o(v)n(ailable)d(w)o(as)j(a)f(GNU)h(cop)o(y)m(.)k +(Note:)h(If)15 b(this)281 1882 y(happ)q(ens,)f(all)f(the)h(GNU)g(releases)i +(of)d(F)m(unnelW)m(eb)g(will)g(remain)f(v)n(alid.)239 1958 +y Fm(\017)21 b Fn(I)d(w)o(an)o(t)g(to)g(b)q(e)h(able)f(to)g(cop)o(y)g(co)q +(de)h(from)d(m)o(y)h(v)o(ersion)h(of)g(F)m(unnelW)m(eb)f(in)o(to)h +(commercial)d(pro)q(ducts)281 2008 y(without)e(ha)o(ving)g(to)h(w)o(orry)g +(ab)q(out)g(the)g(GNU)g(license.)177 2101 y(The)i(trouble)f(is)h(that)f(\(in) +g(m)o(y)f(understanding)h(of)g(cop)o(yrigh)o(t)g(la)o(w\),)f(once)i(a)f(cop)o +(y)h(of)e(F)m(unnelW)m(eb)h(has)h(b)q(een)177 2151 y(released)i(under)g(GNU)f +(license,)g(then)h(it)e(and)h(an)o(y)f(w)o(orks)h(deriv)o(ed)h(from)d(it)h +(fall)g(under)h(GNU)g(license)g(to)q(o.)177 2200 y(This)c(means)g(that)g(if)g +(y)o(ou)g(mo)q(dify)e(a)i(GNU)g(release)h(of)f(F)m(unnelW)m(eb)g(and)g(send)h +(me)f(y)o(our)g(mo)q(di\014cations,)e(and)177 2250 y(I)18 b(incorp)q(orate)h +(them)e(in)o(to)h(m)o(y)e(v)o(ersion,)j(then)g(I)f(no)g(longer)f(o)o(wn)h +(cop)o(yrigh)o(t)g(on)g(the)g(v)o(ersion)h(I)f(mo)q(di\014ed.)177 +2300 y(Basically)m(,)12 b(if)h(GNU)h(touc)o(hes)h(a)f(w)o(ork,)f(then)h(that) +g(cop)o(y)g(is)g(gone)g(forev)o(er.)177 2368 y(My)k(solution)e(to)i(the)g +(problem)e(is)h(to)g(k)o(eep)i(a)e(cop)o(y)g(of)g(F)m(unnelW)m(eb)g(that)h +(is)f(GNU-clean)g(and)h(only)e(mak)o(e)177 2418 y(mo)q(di\014cations)9 +b(to)h(it)h(that)f(are)h(GNU-clean.)17 b(So)11 b(long)e(as)i(m)o(y)e +(o\016cial)g(cop)o(y)i(is)f(GNU)g(clean,)h(an)o(y)g(mo)q(di\014cations)177 +2468 y(that)j(I)g(mak)o(e)e(m)o(yself)g(will)h(b)q(e)h(GNU)g(clean.)k(The)c +(problem)e(comes)i(when)g(someone)f(else)i(mo)q(di\014es)e(the)h(GNU)177 +2518 y(v)o(ersion)c(and)f(then)h(w)o(an)o(ts)g(me)e(to)i(incorp)q(orate)g +(the)g(mo)q(di\014cations)e(in)o(to)g(m)o(y)g(o\016cial)g(v)o(ersion.)17 +b(As)10 b(I)g(understand)177 2567 y(the)h(la)o(w,)f(b)o(y)g(default,)g(the)h +(programmer)d(o)o(wns)j(the)g(mo)q(di\014cations)d(\(b)q(ecause)k(he)f(made)e +(them\),)h(but)h(the)g(result)177 2617 y(of)h(making)e(the)j(mo)q +(di\014cations)d(falls)i(under)h(GNU)f(license.)18 b(What)12 +b(I)g(prop)q(ose)i(is)e(that)g(those)h(who)f(w)o(an)o(t)g(their)177 +2667 y(mo)q(di\014cations)g(included)i(in)g(the)g(o\016cial)f(cop)o(y)g(of)h +(F)m(unnelW)m(eb)f(sign)h(an)f(agreemen)o(t)h(transferring)g(cop)o(yrigh)o(t) +177 2717 y(of)f(the)g(mo)q(di\014cations)f(o)o(v)o(er)h(to)g(me)f(on)h +(condition)f(that)h(the)h(result)g(b)q(e)f(released)i(under)f(GNU)f(license)h +(within)177 2767 y(a)g(certain)g(time)f(p)q(erio)q(d.)18 b +Fk(Figure)c(1)g Fn(demonstrates)g(the)h(pro)q(cess.)177 2835 +y(There)g(are)g(t)o(w)o(o)e(main)f(disadv)n(an)o(tages)h(to)h(this)g(sc)o +(heme:)1042 2940 y(39)p eop +%%Page: 40 41 +40 40 bop 221 91 a Fi(+---------->----)o(-----)o(-+---)o(-----)o(-----)o +(-<--)o(-----)o(-----)o(-+)221 141 y(|\(modifications)18 b(by)87 +b(|)610 b(|)221 191 y(|)21 b(me\))370 b(V)610 b(|)221 241 y(|)109 +b(+--------------)o(-----)o(-----)o(-----)o(----)o(-+)193 b(|)221 +291 y(+--<--|)42 b(My)21 b(Official)f(Copy)h(of)h(FunnelWeb)63 +b(|)196 b(|)352 340 y(|)65 b(Copyright)20 b(\(C\))h(Ross)g(Williams)85 +b(|)196 b(|)352 390 y(+--------------)o(-----)o(-----)o(-----)o(----)o(-+)d +(|)700 440 y(|)22 b(\(Periodic)e(releases\))150 b(/)22 b(\\)700 +490 y(V)567 b(/)65 b(\\)43 b(Programmers)482 540 y(+------------------)o(+) +346 b(/Legal\\)20 b(sign)h(away)482 589 y(|)h(GNU)f(Release)f(Copy)h(|)349 +b(\\Filte/)20 b(copyright)g(on)482 639 y(+------------------)o(+)368 +b(\\)21 b(r)h(/)43 b(modifications)700 689 y(|)588 b(\\)22 +b(/)700 739 y(|)g(\(Modifications)d(made)i(by)108 b(|)700 789 +y(V)44 b(random)20 b(programmers\))f(--->--+)460 839 y(+-------------------)o +(----+)460 888 y(|)j(Modified)e(GNU)h(Version)43 b(|)460 938 +y(+-------------------)o(----+)343 1079 y Fb(Once)13 b(a)f(w)o(ork)h(is)g +(released)e(under)g(GNU)i(license,)f(all)g(deriv)o(ed)f(w)o(orks)h(fall)g +(under)g(GNU)h(license.)18 b(Ho)o(w)o(ev)o(er,)281 1129 y(this)9 +b(diagram)f(sho)o(ws)i(ho)o(w)g(cop)o(yrigh)o(t)d(can)i(b)q(e)h(main)o +(tained)d(o)o(v)o(er)i(a)h(w)o(ork,)g(while)f(still)g(making)f(it)i(a)o(v)n +(ailable)e(under)281 1179 y(GNU)14 b(license.)19 b(Unfortunately)m(,)11 +b(this)i(sc)o(heme)e(requires)h(that)g(cop)o(yrigh)o(t)f(on)i(mo)q +(di\014cati)o(ons)d(to)j(F)m(unnelW)m(eb)f(b)q(e)281 1229 y(signed)e(o\013)h +(b)o(y)g(the)g(p)q(eople)e(who)j(mak)o(e)e(the)h(mo)q(di\014catio)o(ns.)453 +1320 y Fk(Figure)j(1)p Fn(:)k(Ho)o(w)13 b(I)h(am)e(going)h(to)h(main)o(tain)d +(cop)o(yrigh)o(t)i(o)o(v)o(er)h(F)m(unnelW)m(eb.)228 1453 y(1.)20 +b(Getting)15 b(eac)o(h)i(p)q(erson)g(who)e(con)o(tributes)i(mo)q +(di\014cations)d(to)i(F)m(unnelW)m(eb)g(to)f(sign)h(and)g(send)g(a)g(piece) +281 1503 y(of)d(pap)q(er)i(signing)e(a)o(w)o(a)o(y)f(cop)o(yrigh)o(t)i(will)e +(b)q(e)j(tedious.)228 1580 y(2.)20 b(Programmers)14 b(ma)o(y)g(b)q(e)j +(reluctan)o(t)f(to)g(sign)g(a)o(w)o(a)o(y)e(cop)o(yrigh)o(t)i(on)g(mo)q +(di\014cations)e(b)q(ecause)j(the)g(result)281 1630 y(could)e(b)q(e)h(used)g +(b)o(y)f(me)f(for)h(commercial)d(purp)q(oses)17 b(b)o(y)e(me)f(at)h(a)g +(later)h(date)f(\(Note:)21 b(But)16 b(it)f(m)o(ust)f(b)q(e)281 +1679 y(released)h(under)g(GNU)f(as)f(w)o(ell\).)177 1774 y(These)18 +b(disadv)n(an)o(tages)d(are)i(regrettable)g(consequences)i(of)c(m)o(y)g +(decision)h(to)g(retain)g(total)f(con)o(trol)h(o)o(v)o(er)g(the)177 +1824 y(\\o\016cial")c(v)o(ersion)i(of)f(F)m(unnelW)m(eb.)177 +1893 y(The)h(upshot)h(of)e(all)g(this)h(is)f(that:)239 1988 +y Fm(\017)21 b Fn(I)12 b(will)e(nev)o(er)i(allo)o(w)f(an)o(y)g(co)q(de)h +(from)e(a)i(GNU)f(release)i(of)e(F)m(unnelW)m(eb)g(to)h(touc)o(h)g(m)o(y)e +(o\016cial)g(cop)o(y)m(.)17 b(Only)281 2038 y(mo)q(di\014cations)12 +b(will)g(b)q(e)j(acceptable.)239 2115 y Fm(\017)21 b Fn(If)e(y)o(ou)g(mak)o +(e)f(a)h(mo)q(di\014cation)e(to)j(F)m(unnelW)m(eb)f(and)g(send)h(it)f(to)h +(me)e(for)h(inclusion)g(in)g(the)h(o\016cial)281 2165 y(v)o(ersion,)d(I)f +(will)g(not)g(incorp)q(orate)h(y)o(our)g(mo)q(di\014cation)d(un)o(til)i(I)h +(ha)o(v)o(e)f(receiv)o(ed)i(a)e(signed)h(declaration)281 2214 +y(transferring)11 b(cop)o(yrigh)o(t.)17 b(I)11 b(will)e(prepare)k(suc)o(h)e +(a)g(con)o(tract)h(when)f(the)h(\014rst)f(p)q(erson)h(sends)g(me)e(a)h(w)o +(orth)o(y)281 2264 y(mo)q(di\014cation!)239 2341 y Fm(\017)21 +b Fn(If)12 b(y)o(ou)g(in)o(tend)h(to)f(mak)o(e)f(c)o(hanges)i(to)g(F)m +(unnelW)m(eb)f(that)g(are)h(so)g(massiv)o(e)e(that)i(they)g(will)e(in)o(v)o +(olv)o(e)g(wide-)281 2391 y(scale)i(mo)q(di\014cation)e(of)h(the)i(source)g +(\014les,)f(and)g(y)o(ou)f(w)o(an)o(t)h(the)g(mo)q(di\014cation)e(to)i(b)q(e) +g(part)g(of)g(the)g(o\016cial)281 2441 y(v)o(ersion,)j(it)g(migh)o(t)e(b)q(e) +j(a)f(go)q(o)q(d)f(idea)h(to)g(con)o(tact)h(me)e(b)q(efore)i(doing)e(so.)25 +b(There)17 b(are)f(t)o(w)o(o)g(reasons)h(for)281 2491 y(doing)11 +b(this.)18 b(First,)12 b(it)g(allo)o(ws)f(me)h(a)g(c)o(hance)h(to)f(commen)o +(t)e(on)i(y)o(our)h(prop)q(osed)g(mo)q(di\014cations)d(and)i(giv)o(e)281 +2540 y(m)o(y)i(opinion)g(on)i(whether)h(they)f(are)g(lik)o(ely)e(to)i(b)q(e)g +(incorp)q(orated)g(in)o(to)f(the)i(o\016cial)d(v)o(ersion.)23 +b(Second,)281 2590 y(I)16 b(can)f(send)i(y)o(ou)e(a)g(cop)o(y)h(\(under)h(sp) +q(ecial)e(license\))i(of)e(the)h(GNU-clean)g(o\016cial)e(v)o(ersion)i(to)f(w) +o(ork)g(on.)281 2640 y(This)f(will)e(allo)o(w)g(y)o(ou)i(to)g(ship)f(bac)o(k) +h(y)o(our)g(c)o(hanges)h(as)e(\014les)i(rather)f(than)g(as)g(c)o(hange)h +(sections.)177 2735 y(As)h(a)g(separate)h(p)q(oin)o(t)e(from)f(the)i(legal)f +(issues,)h(I)g(am)e(lik)o(ely)g(to)i(turn)g(out)g(to)f(b)q(e)i(prett)o(y)f +(pic)o(ky)f(ab)q(out)h(what)177 2785 y(mo)q(di\014cations)10 +b(I)j(will)d(incorp)q(orate)j(in)o(to)e(the)i(o\016cial)e(cop)o(y)m(.)17 +b(Whether)c(a)f(mo)q(di\014cation)e(will)h(b)q(e)h(accepted)i(will)177 +2835 y(dep)q(end,)h(amongst)d(other)j(things,)e(on)h(the)g(follo)o(wing)d +(criteria.)1042 2940 y(40)p eop +%%Page: 41 42 +41 41 bop 239 42 a Fm(\017)21 b Fn(Do)q(es)11 b(the)g(mo)q(di\014cation)e +(\014t)i(in)f(with)h(the)g(design)g(goals)f(of)g(F)m(unnelW)m(eb,)h(or)f(is)h +(it)f(just)h(a)g(case)h(of)e(creeping)281 91 y(featurism?)239 +174 y Fm(\017)21 b Fn(Ho)o(w)13 b(w)o(ell)h(co)q(ded)g(is)g(the)h(mo)q +(di\014cation?)h(W)m(ould)c(it)i(reduce)h(the)g(qualit)o(y)d(of)h(the)i(co)q +(de?)239 257 y Fm(\017)21 b Fn(If)14 b(the)i(mo)q(di\014cation)d(c)o(hanges)i +(F)m(unnelW)m(eb's)g(functionalit)o(y)m(,)d(is)j(this)g(a)g(desirable)g(c)o +(hange?)22 b(Ho)o(w)14 b(will)281 307 y(it)f(impact)g(on)g(existing)h(users?) +239 390 y Fm(\017)21 b Fn(W)m(ould)13 b(it)g(b)q(e)i(quic)o(k)o(er)f(for)g +(me)f(to)h(mak)o(e)f(the)h(mo)q(di\014cation)e(m)o(yself)h(than)h(to)g(w)o +(ork)f(out)h(ho)o(w)g(to)g(incor-)281 440 y(p)q(orate)g(the)h(submitted)e(mo) +q(di\014cation?)177 556 y(It)g(is)f(m)o(y)f(goal)h(to)g(guard)h(the)g(in)o +(tegrit)o(y)f(of)g(the)h(design)g(and)f(co)q(de)i(of)e(the)h(o\016cial)e(v)o +(ersion)i(of)f(F)m(unnelW)m(eb)g(and)177 606 y(so)h(I)g(will)e(probably)h(b)q +(e)h(rather)h(fussy)f(ab)q(out)f(what)h(I)f(regard)i(as)e(a)h(w)o(orth)o +(while)f(mo)q(di\014cation.)j(I)e(do)f(not)h(wish)177 656 y(to)h(lose)g(con)o +(trol)f(of)h(the)g(co)q(de,)g(either)h(tec)o(hnically)f(or)g(legally)m(.)177 +818 y Fe(3.8)70 b(A)23 b(GNU)f(V)-6 b(ersion?)177 934 y Fn(The)18 +b(con)o(trols)f(on)f(the)i(o\016cial)d(v)o(ersion)i(of)g(F)m(unnelW)m(eb)f +(describ)q(ed)j(in)d(the)i(previous)f(section)h(will)d(ha)o(v)o(e)i(at)177 +984 y(most)d(a)h(minor)e(impact)h(on)h(F)m(unnelW)m(eb)g(dev)o(elopmen)o(t)f +(if)h(F)m(unnelW)m(eb)f(already)h(serv)o(es)i(the)f(needs)g(of)f(most)177 +1034 y(of)k(its)h(users.)36 b(Ho)o(w)o(ev)o(er,)21 b(if)e(it)g(turns)h(out)g +(that)f(F)m(unnelW)m(eb)g(is)h(b)q(oth)g(p)q(opular,)g Fh(and)g +Fn(needs)h(widespread)177 1083 y(mo)q(di\014cations)13 b(and)h(enhancemen)o +(ts,)h(then)g(the)g(o\016cial)e(feedbac)o(k)i(lo)q(op)e(describ)q(ed)j(in)e +(the)h(previous)g(section)177 1133 y(will)e(b)q(ecome)g(un)o(w)o(ork)n(able,) +g(and)h(there)h(will)d(b)q(e)j(a)e(GNU)h(break)o(out.)177 1208 +y(A)g Fk(GNU)i(break)o(out)c Fn(will)g(o)q(ccur)j(if)e(F)m(unnelW)m(eb)g +(users)j(b)q(ecome)d(organized)h(enough)g(and)g(anno)o(y)o(ed)g(enough)177 +1258 y(\(at)20 b(the)h(o\016cial)d(dev)o(elopmen)o(t)h(cycle\))i(to)f(start)g +(main)o(taining)d(a)j(coheren)o(t)h(v)o(ersion)f(of)f(F)m(unnelW)m(eb)h(that) +177 1307 y(div)o(erges)f(from)d(the)j(o\016cial)e(v)o(ersion.)31 +b(If)18 b(a)g(GNU)g(break)o(out)g(o)q(ccurs,)i(I)e(w)o(ould)g(appreciate,)h +(as)g(requested)177 1357 y(earlier,)14 b(that)g(a)f(di\013eren)o(t)i(name)e +(and)h(\014le)f(extensions)i(b)q(e)g(c)o(hosen)g(for)e(the)i(div)o(erging)e +(v)o(ersion.)177 1519 y Fe(3.9)70 b(Summary)177 1635 y Fn(Decen)o(tralized)21 +b(mo)q(di\014cations)d(to)i(a)f(programming)d(language)j(and)h(its)g +(implemen)o(tatio)o(ns)e(can)i(seriously)177 1685 y(damage)12 +b(the)i(language's)f(p)q(ortabilit)o(y)f(and)i(seman)o(tic)e(clarit)o(y)m(.) +17 b(Unfortunately)m(,)c(there)i(is)e(a)g(tension)h(b)q(et)o(w)o(een)177 +1735 y(cen)o(tralizing)c(con)o(trol)g(of)f(a)h(programmi)o(ng)d(language)i +(and)h(pro)o(viding)f(source)i(co)q(de)g(securit)o(y)g(to)f(nerv)o(ous)h +(users.)177 1785 y(In)k(F)m(unnelW)m(eb,)e(this)i(trade-o\013)g(has)g(b)q +(een)g(resolv)o(ed)g(to)g(some)e(exten)o(t)j(b)o(y)e(releasing)h(the)g +(source)h(co)q(de)f(along)177 1835 y(with)h(a)g(request)i(that)e(if)g(the)g +(functionalit)o(y)f(of)h(the)h(program)d(is)i(mo)q(di\014ed,)f(that)i(the)g +(program's)d(name)h(b)q(e)177 1884 y(c)o(hanged)d(and)g(a)f(di\013eren)o(t)i +(\014le)e(extension)i(b)q(e)f(c)o(hosen)h(for)e(input)h(\014les)g(created)h +(under)f(the)h(mo)q(di\014ed)d(program.)177 1934 y(The)k(author)g(of)f(F)m +(unnelW)m(eb)g(has)g(decided)i(to)e(main)o(tain)e(an)i(o\016cial)g(v)o +(ersion)g(of)g(F)m(unnelW)m(eb)g(o)o(v)o(er)h(whic)o(h)f(he)177 +1984 y(will)h(o)o(wn)h(cop)o(yrigh)o(t,)g(but)h(whic)o(h)f(he)h(will)e +(release)j(under)f(GNU)f(license)i(from)c(time)h(to)i(time.)21 +b(This)16 b(means)177 2034 y(that)g(cop)o(yrigh)o(t)f(on)h(all)e(c)o(hanges)j +(to)e(F)m(unnelW)m(eb)h(m)o(ust)e(b)q(e)j(signed)f(o)o(v)o(er)f(to)h(the)g +(author)g(b)q(efore)h(they)f(ha)o(v)o(e)177 2084 y(a)g(c)o(hance)i(of)e(b)q +(eing)h(incorp)q(orated)g(in)f(the)h(o\016cial)e(v)o(ersion.)27 +b(Finally)m(,)14 b(it)j(is)f(p)q(ossible)h(that)g(this)f(reluctance)177 +2133 y(of)e(the)h(author)f(to)g(remo)o(v)o(e)f(his)h(cop)o(yrigh)o(ted)h(v)o +(ersion)f(from)e(the)j(dev)o(elopmen)o(t)e(cycle)i(of)f(the)h(o\016cial)e(v)o +(ersion)177 2183 y(will)e(result)j(in)e(a)g(GNU)h(break)o(out)g(in)f(whic)o +(h)g(a)h(div)o(erging)e(GNU)i(v)o(ersion)f(of)h(F)m(unnelW)m(eb)f(will)f(b)q +(e)i(main)o(tained)177 2233 y(b)o(y)h(the)g(GNU)g(comm)o(unit)o(y)m(.)h(The)f +(author)g(hop)q(es)h(this)f(w)o(on't)f(b)q(e)i(necessary)h(and)e(requests,)h +(if)e(this)h(happ)q(ens,)177 2283 y(that)g(the)h(div)o(erging)e(GNU)g(v)o +(ersion)h(b)q(e)h(renamed.)1042 2940 y(41)p eop +%%Page: 42 43 +42 42 bop 1042 2940 a Fn(42)p eop +%%Page: 43 44 +43 43 bop 177 376 a Ff(Chapter)34 b(4)177 607 y Fl(F)-10 b(unnelW)g(eb)41 +b(F)-10 b(uture)177 847 y Fn(Previous)13 b(c)o(hapters)h(ha)o(v)o(e)f +(explained)f(the)h(design)g(of)f(F)m(unnelW)m(eb)g(and)h(giv)o(en)f(reasons)i +(for)e(wh)o(y)g(it)h(is)f(the)h(w)o(a)o(y)177 897 y(it)i(is.)24 +b(This)15 b(c)o(hapter)i(go)q(es)f(through)g(eac)o(h)g(of)f(the)i(asp)q(ects) +g(of)e(F)m(unnelW)m(eb,)g(and)h(explores)g(their)g(problems,)177 +946 y(ho)o(w)e(they)g(can)g(b)q(e)h(solv)o(ed,)e(and)h(lists)f(opp)q +(ortunities)i(for)e(impro)o(v)o(emen)o(t.)177 1107 y Fe(4.1)70 +b(Do)r(cumen)n(tation)177 1221 y Fk(An)12 b(o\016cial)f(example:)16 +b Fn(A)11 b(o\016cial)e(example)h(program)f(written)j(using)e(F)m(unnelW)m +(eb)h(should)f(b)q(e)i(constructed)177 1271 y(and)i(made)f(a)o(v)n(ailable.) +177 1344 y Fk(Index)20 b(program:)26 b Fn(In)19 b(order)f(to)h(t)o(yp)q(eset) +g(the)g(do)q(cumen)o(tation,)f(a)g(p)q(ortable)g(index)g(sorting)g(program)f +(is)177 1394 y(required.)31 b(One)19 b(should)e(b)q(e)i(written)f(and)g +(added)g(to)g(the)g(distribution)g(kit.)29 b(P)o(erhaps)19 +b(this)f(could)g(b)q(e)g(the)177 1444 y(o\016cial)13 b(example!)177 +1604 y Fe(4.2)70 b(Command)22 b(Line)g(In)n(terface)177 1719 +y Fk(Bu\013er)14 b(length:)i Fn(Curren)o(tly)d(the)h(F)m(unnelW)m(eb)e(shell) +h(uses)i(the)e Fi(COMLINE)p 1368 1719 14 2 v 15 w(MAX)f Fn(constan)o(t)h(to)g +(size)h(its)f(in)o(ternal)177 1768 y(command)h(line)h(bu\013ers.)27 +b(This)16 b(is)g(un)o(tenable.)25 b(The)17 b(maxim)n(um)12 +b(length)k(of)g(a)g(shell)g(command)d(line)j(should)177 1818 +y(not)e(b)q(e)g(mac)o(hine)f(dep)q(enden)o(t.)177 1892 y Fk(An)o(tiquated)h +(F)l(eatures:)k Fn(As)d(the)g(F)m(unnelW)m(eb)e(language)h(dev)o(elops,)g(it) +g(is)g(lik)o(ely)f(that)i(some)e(c)o(hanges)i(will)177 1941 +y(ha)o(v)o(e)g(to)g(b)q(e)h(made)d(that)i(will)f(render)j(one)e(or)g(more)f +(language)g(constructs)j(obsolete.)22 b(When)15 b(this)g(happ)q(ens,)177 +1991 y(it)e(ma)o(y)d(b)q(e)k(necessary)h(to)d(add)h(a)g(command)d(line)i +(option)g(that)h(has)g(the)g(p)q(o)o(w)o(er)g(to)g(turn)g(on)g(and)f(o\013)h +(w)o(arnings)177 2041 y(or)h(errors)h(\015agging)e(an)o(tiquated)g(features.) +177 2201 y Fe(4.3)70 b(Shell)21 b(In)n(terpreter)177 2316 y +Fk(SET)l(ALL)f(command:)25 b Fn(When)17 b(writing)g(F)m(unnelW)m(eb)g +(scripts,)i(it)e(is)h(sometimes)e(desirable)i(to)f(set)h Fh(al)r(l)f +Fn(of)177 2366 y(F)m(unnelW)m(eb's)f(options)h(to)f(some)g(particular)h(v)n +(alue)f(so)h(that)f(the)i(script)f(is)g(not)f(vulnerable)h(to)g(c)o(hanges)g +(in)177 2415 y(F)m(unnelW)m(eb's)e(default)h(v)n(alues)f(whic)o(h)h(migh)o(t) +e(o)q(ccur)i(from)e(time)h(to)h(time.)22 b(T)m(o)15 b(this)h(end,)g(it)g(ma)o +(y)d(b)q(e)k(w)o(orth)177 2465 y(creating)c(a)f(\\)p Fi(SETALL)p +Fn(")f(command)f(that)i(is)h(iden)o(tical)e(to)i(the)g(\\)p +Fi(SET)p Fn(")e(command)f(except)k(that)e(it)g(will)f(generate)177 +2515 y(an)j(error)h(if)e(the)h(v)n(alue)f(of)h(an)f(option)g(is)h(not)g(sp)q +(eci\014ed)h(explicitly)m(.)177 2588 y Fk(Recursion)f(test:)j +Fn(A)d(test)h(should)f(b)q(e)g(added)h(to)e(test)i(for)f(recursiv)o(e)h(in)o +(v)o(o)q(cation)e(in)g(a)h(shellscript.)177 2662 y Fk(Diagnostic)e(coun)o +(ting:)j Fn(The)e(co)q(de)g(for)f(coun)o(ting)g(diagnostics)h(in)f(the)h +(script)g(in)o(terpreter)h(is)f(rather)g(messy)177 2711 y(and)h(p)q(erhaps)h +(ev)o(en)f(buggy)m(.)k(It)13 b(should)h(b)q(e)h(cleaned)f(up)g(and)g(commen)o +(ted.)177 2785 y Fk(Argumen)o(t)i(coun)o(ting:)j Fn(In)c(the)h +Fi(command.c)e Fn(mo)q(dule,)g(there)j(is)e(a)g(v)n(ariable)g(that)g(coun)o +(ts)h(the)h(argumen)o(ts)177 2835 y(to)d(a)g(command.)j(Curren)o(tly)d(it)g +(tak)o(es)h(the)g(v)n(alue)e(of)h(the)h(n)o(um)o(b)q(er)e(of)h(parameters)g +(including)g(the)h(command)1042 2940 y(43)p eop +%%Page: 44 45 +44 44 bop 177 42 a Fn(v)o(erb.)19 b(This)13 b(has)g(turned)i(out)e(to)g(mak)o +(e)f(the)i(co)q(de)g(less)h(readable.)j(It)13 b(should)g(b)q(e)h(c)o(hanged)g +(to)f(b)q(e)h(the)g(n)o(um)o(b)q(er)177 91 y(of)f(argumen)o(ts)h(to)f(the)i +(command)c(v)o(erb.)177 168 y Fk(Mak)o(e)k(facilit)o(y:)h Fn(It)d(ma)o(y)e(b) +q(e)i(w)o(orth)g(building)f(some)g(sort)h(of)f(mak)o(e)g(facilit)o(y)f(in)o +(to)h(the)i(script)g(language)e(so)h(as)177 218 y(to)h(supp)q(ort)h(mac)o +(hines)e(suc)o(h)h(as)g(the)h(Macin)o(tosh)f(that)f(do)h(not)g(already)f(ha)o +(v)o(e)h(this)g(facilit)o(y)m(.)177 295 y Fk(Signature)d(\014le:)17 +b Fn(One)c(problem)f(with)g(using)g(F)m(unnelW)m(eb)g(in)g(conjunction)g +(with)h(an)f(external)h Fi(Make)e Fn(facilit)o(y)177 345 y(is)k(that)h(a)f +(user)h(migh)o(t)d(c)o(hange)j(a)f(F)m(unnelW)m(eb)g(source)h(\014le)g +(without)f(making)e(c)o(hanges)j(that)f(will)f(a\013ect)i(the)177 +395 y(\014les)g(that)f(it)f(generates.)24 b(If)14 b(F)m(unnelW)m(eb)h(is)g +(then)h(run)f(and)g(the)h(\\)p Fi(+D)p Fn(")e(option)g(is)h(on,)g(then)g(the) +h(output)f(\014les)177 445 y(will)g(b)q(e)i(deleted)h(\(to)f(a)o(v)o(oid)e +(further)i Fi(Make)f Fn(propagations\).)25 b(If)17 b Fi(Make)e +Fn(then)i(has)g(a)f(pro)q(duction)h(linking)e(the)177 495 y +Fi(.fw)d Fn(\014le)h(to)g(its)g(output)g(\014les,)g(then)g(it)g(ma)o(y)e +(conclude)i(that)g(the)g(output)g(\014les)h(are)f(still)f(out)h(of)f(date.)18 +b(T)m(o)12 b(solv)o(e)177 544 y(the)17 b(problem,)e(F)m(unnelW)m(eb)h(could)h +(b)q(e)g(c)o(hanged)f(to)h(write)f(a)g Fi(.sig)g Fn(\014le)g(whenev)o(er)i +(it)e(pro)q(cesses)j(a)e Fi(.fw)e Fn(\014le.)177 594 y(The)g +Fi(Make)e Fn(pro)q(duction)h(could)f(then)i(b)q(e)f(wired)h(up)f(to)f(link)g +(the)i Fi(.fw)e Fn(\014le)h(to)g(the)g Fi(.sig)f Fn(\014le)h(instead)g(of)f +(to)h(the)177 644 y(output)g(\014les.)177 814 y Fe(4.4)70 b(Language)24 +b(Design)177 933 y Fn(Some)13 b(prop)q(osed)i(c)o(hanges)g(to)f(F)m(unnelW)m +(eb)f(do)h(not)g(corresp)q(ond)i(to)e(an)o(y)f(particular)h(comp)q(onen)o(t)g +(of)f(F)m(unnel-)177 983 y(W)m(eb)h(and)f(are)i(really)e(to)h(do)f(with)h +(the)g(design)h(of)e(the)h(input)g(language.)177 1060 y Fk(Output)c(or)h +(\014le?:)16 b Fn(The)11 b(\\)p Fi(@O)p Fn(")e(sp)q(ecial)i(sequence)i(for)d +(de\014ning)h(an)f(output)h(\014le)g(is)f(somewhat)g(non-mnemoni)o(c)177 +1110 y(and)k(can)g(b)q(e)g(confused)h(with)f(zero)h(\(\\)p +Fi(0)p Fn("\).)i(P)o(erhaps)e(it)e(should)h(b)q(e)h(replaced)g(b)o(y)e(the)i +(\\)p Fi(@F)p Fn(")e(sequence.)177 1187 y Fk(Syn)o(tax)j(of)h(section)f +(names:)k Fn(Curren)o(tly)15 b(section)h(names)e(use)i(the)g(same)e(syn)o +(tax)h(as)g(macro)f(names.)21 b(F)m(or)177 1236 y(example)16 +b(\\)p Fi(@)p Fn(".)25 b(It)17 b(can)h(b)q(e)f(argued)h(that)f(angle) +f(brac)o(k)o(ets)i(should)f(b)q(e)h(reserv)o(ed)h(only)d(for)h(macro)177 +1286 y(names)f(and)h(that)f(some)g(other)i(syn)o(tax)e(should)h(b)q(e)g +(found)g(for)f(delimiting)e(section)j(names.)26 b(This)17 b(is)f(not)h(a)177 +1336 y(clear)12 b(issue.)18 b(It)11 b(could)h(also)e(b)q(e)j(argued)e(that)h +(they)g(are)g(b)q(oth)f(names,)g(and)g(that)g(b)q(ecause)j(sections)e(can)g +(inherit)177 1386 y(their)i(names)g(from)e(the)i(macros)f(they)i(con)o(tain,) +e(that)g(the)i(names)e(are)h(of)g(the)g(same)f(\\t)o(yp)q(e".)177 +1463 y Fk(One)i(macro)f(p)q(er)h(section:)i Fn(One)d(particular)f(st)o(yle)g +(of)g(using)g(F)m(unnelW)m(eb)f(is)h(to)g(ha)o(v)o(e)g(at)h(most)e(one)h +(macro)177 1513 y(de\014nition)f(p)q(er)h(section.)19 b(It)12 +b(ma)o(y)f(b)q(e)i(w)o(orth)f(adding)g(a)g(pragma)e(that)j(instructs)h(F)m +(unnelW)m(eb)d(to)i(enforce)g(this.)177 1590 y Fk(Should)i(@)p +Fm(f)i Fk(suppress)e(EOL?:)20 b Fn(When)15 b(de\014ning)g(a)g(macro)f(in)h(F) +m(unnelW)m(eb,)f(it)h(seems)g(to)g(b)q(e)h(rule)f(rather)177 +1640 y(than)f(the)h(exception)f(that)g(the)h(\\)p Fi(@)p Fm(f)p +Fn(")e(b)q(e)h(follo)o(w)o(ed)f(b)o(y)g(\\)p Fi(@-)p Fn(".)18 +b(This)13 b(suppresses)k(the)e(EOL)f(on)g(the)g(de\014nition)177 +1690 y(line,)e(allo)o(wing)f(the)i(\014rst)h(line)e(of)h(the)g(macro)f(to)g +(b)q(e)i(placed)f(immedia)o(tely)d(ab)q(o)o(v)o(e)j(and)f(in)h(line)f(with)h +(the)g(other)177 1739 y(lines)k(without)g(in)o(tro)q(ducing)g(an)f(EOL)i(at)f +(the)g(start)h(of)f(the)g(macro)f(text.)28 b(One)18 b(option)e(is)h(to)g(in)o +(tro)q(duce)h(a)177 1789 y(pragma)12 b(to)i(determine)g(whether)h(to)f +(suppress)i(EOLs)e(follo)o(wing)e(\\)p Fi(@)p Fm(f)p Fn(".)177 +1866 y Fk(Pragma)20 b(syn)o(tax:)26 b Fn(It)18 b(is)g(not)g(clear)g(ho)o(w)g +(\\lo)q(ose")f(the)i(syn)o(tax)f(of)f(pragmas)g(should)g(b)q(e.)31 +b(P)o(erhaps)19 b(they)177 1916 y(should)14 b(b)q(e)g(case)h(insensitiv)o(e.) +177 1993 y Fk(Conditional)o(s:)23 b Fn(Dep)q(ending)17 b(on)g(demand,)g(it)g +(ma)o(y)e(b)q(e)j(w)o(orth)g(rein)o(tro)q(ducing)f(some)g(sort)g(of)g +(conditional)177 2043 y(feature)g(in)o(to)f(F)m(unnelW)m(eb.)24 +b(Ho)o(w)o(ev)o(er,)17 b(it)e(w)o(ould)h(ha)o(v)o(e)g(to)g(b)q(e)h(v)o(ery)f +(simple)f(to)h(comp)q(ete)g(with)g(the)g(v)n(arious)177 2093 +y(w)o(a)o(ys)e(in)f(whic)o(h)h(conditionals)f(can)h(already)f(b)q(e)i(fudged) +f(within)f(F)m(unnelW)m(eb)g(as)h(it)g(stands.)177 2170 y Fk(File)h(mark)o +(ers:)20 b Fn(It)14 b(migh)o(t)f(b)q(e)i(w)o(orth)g(mo)q(difying)d(the)j +(language)f(so)h(that)f(a)h(sp)q(ecial)g(syn)o(tactical)f(mark)o(er)g(is)177 +2220 y(required)d(at)f(the)h(start)g(and)f(end)g(of)g(\014les.)17 +b(This)10 b(will)f(assist)h(in)g(detecting)h(truncations)g(and)f(other)h +(corruptions.)177 2297 y Fk(F)l(ormal)i(parameter)g(lists:)j +Fn(It)d(migh)o(t)d(b)q(e)j(w)o(orth)g(c)o(hanging)f(o)o(v)o(er)g(to)h(a)f +(syn)o(tax)g(for)h(formal)d(parameter)i(lists)177 2347 y(that)k(do)q(es)h +(not)g(require)g(the)f Fi(@\()g Fn(and)g Fi(@\))p Fn(.)25 b(Ho)o(w)o(ev)o +(er,)17 b(they)f(could)g(b)q(e)h(retained)g(as)f(optional)f(for)h(bac)o(kw)o +(ard)177 2396 y(compatibilit)o(y)m(.)177 2566 y Fe(4.5)70 b(Scanner/Mapp)r +(er)177 2685 y Fk(All)17 b(non-con)o(tiguo)o(us)e(mappings:)21 +b Fn(Curren)o(tly)c(F)m(unnelW)m(eb)e(requires)i(that)g(all)e(input)g +(\014les)i(b)q(e)g(mapp)q(ed)177 2735 y(in)o(to)e(a)g(con)o(tiguous)g(lump)f +(of)h(memory)m(.)20 b(This)15 b(caused)i(problems)e(for)g(t)o(w)o(o)g +(reasons.)24 b(First,)15 b(to)h(do)f(this,)h(one)177 2785 y(has)c(to)g(allo)q +(cate)f(the)h(memory)d(\014rst,)k(and)e(to)h(do)f(that,)h(y)o(ou)f(ha)o(v)o +(e)h(to)f(kno)o(w)g(ho)o(w)h(long)f(the)h(\014le)g(is,)f(and)h(it)f(turns)177 +2835 y(out)j(that)g(\014nding)g(out)g(the)g(length)g(of)f(a)h(\014le)g(in)g +(a)f(p)q(ortable)i(manner)e(is)h(v)o(ery)g(ine\016cien)o(t.)k(Second,)d +(although)1042 2940 y(44)p eop +%%Page: 45 46 +45 45 bop 177 42 a Fn(IBM)14 b(PC)f(compatibles)f(ma)o(y)f(ha)o(v)o(e)i +(megab)o(ytes)g(of)g(memory)m(,)d(it)i(is)i(segmen)o(ted)f(in)o(to)f(blo)q(c) +o(ks)i(of)e(at)h(most)f(64K.)177 91 y(This)i(means)f(that)h(F)m(unnelW)m(eb)f +(curren)o(tly)i(cannot)f(read)h(a)e(\014le)h(longer)g(than)g(64K)f(on)h(a)f +(PC.)177 168 y(These)j(problems)d(could)i(b)q(e)g(a)o(v)o(oided)e(if)h(the)h +(mapp)q(er)f(and)g(scanner)i(w)o(ere)f(reorganized)g(to)f(allo)o(w)f(input)h +(\014les)177 218 y(to)g(b)q(e)g(read)h(in)e(and)h(stored)h(as)f(a)f(link)o +(ed)h(list)f(of)g(c)o(h)o(unks)i(of)e(text)h(rather)h(than)f(a)g(con)o +(tiguous)f(blo)q(c)o(k.)177 295 y Fk(EOL)h(is)g(unsp)q(eci\014abl)o(e:)h +Fn(F)m(unnelW)m(eb)d(uses)h(ASCI)q(I)g(c)o(haracter)h(decimal)d(ten)i(\(10\)) +f(in)o(ternally)f(to)h(represen)o(t)177 345 y(logical)g(end-of-line)g(and)h +(is)g(curren)o(tly)h(organized)f(so)g(that)g(if)g(one)g(of)g(these)h(is)f +(inserted)h(in)o(to)f(the)h(text)f(b)o(y)g(the)177 395 y(user)g(using)e(a)h +(\\)p Fi(@^D\(10\))p Fn(",)d(it)j(will)e(b)q(e)i(written)h(out)e(as)h(a)f +(logical)f(end)i(of)g(line,)f(rather)h(than)g(as)g(a)f(single)h(ASCI)q(I)177 +445 y(c)o(haracter)j(10.)j(This)c(should)f(b)q(e)i(\014xed.)177 +522 y Fk(Allo)o(w)g(mnemonics)f(for)i(unprin)n(tabl)o(es:)g +Fn(F)m(unnelW)m(eb)e(allo)o(ws)f(users)j(to)e(insert)h(unprin)o(table)f(c)o +(haracters)177 572 y(in)o(to)i(the)h(output)f(using)g(the)h(\\)p +Fi(@^D\(ddd\))p Fn(")d(sp)q(ecial)i(sequence.)28 b(P)o(erhaps)17 +b(it)f(w)o(ould)f(b)q(e)i(c)o(hanged)g(so)f(that)g(it)177 622 +y(understands)g(ASCI)q(I)e(standard)g(mnemonics)e(suc)o(h)i(as)g(\\)p +Fi(LF)p Fn(")f(as)h(w)o(ell)f(as)h(ASCI)q(I)h(n)o(um)o(b)q(ers.)177 +699 y Fk(V)l(ersion)h(pragma:)22 b Fn(A)16 b(\\)p Fi(version)p +Fn(")e(pragma)g(should)h(b)q(e)i(added)f(that)g(allo)o(ws)e(the)j(user)g(to)e +(sp)q(ecify)i(in)e(the)177 749 y(input)g(\014le)h(the)g(v)o(ersion)g(of)e(F)m +(unnelW)m(eb)h(that)h(w)o(as)f(around)h(when)g(the)g(input)f(\014le)g(w)o(as) +h(created.)24 b(A)o(t)16 b(a)f(later)177 799 y(date,)g(suc)o(h)h(a)e +(construct)j(w)o(ould)d(b)q(e)i(v)o(ery)f(useful)g(for)f(determining)g(ho)o +(w)h(an)f(input)h(\014le)g(should)g(b)q(e)g(up)q(dated)177 +848 y(if)e(the)i(F)m(unnelW)m(eb)e(language)g(has)h(c)o(hanged)g(b)q(et)o(w)o +(een)i(v)o(ersions.)177 1018 y Fe(4.6)70 b(P)n(arser)177 1138 +y Fn(There)15 b(are)g(no)e(prop)q(osals)h(to)g(c)o(hange)g(the)h(parser)g +(except)g(as)f(a)f(consequence)k(of)c(other)h(prop)q(osals.)177 +1308 y Fe(4.7)70 b(Analyser)177 1427 y Fk(Recursion)11 b(detection:)k +Fn(Curren)o(tly)d(the)h(F)m(unnelW)m(eb)e(analyser)h(\015ags,)f(with)h(an)f +(error,)i(all)e(macros)g(with)g(an)177 1477 y(in\014nite)g(expansion.)17 +b(This)12 b(w)o(ould)e(b)q(e)i(b)q(est)g(c)o(hanged)g(to)f(\015agging)f(all)g +(macros)h(that)g(are)h(directly)g(or)f(indirectly)177 1526 +y(recursiv)o(e.)19 b(T)m(o)11 b(do)g(this,)g(T)m(arjan's)g(algorithm)p +Fk([T)l(arjan72])d Fn(for)k(the)g(detection)g(of)f(strong)h(comp)q(onen)o(ts) +f(should)177 1576 y(b)q(e)k(installed.)177 1653 y Fk(Once)h(only)g(macros:)k +Fn(By)15 b(default)f(F)m(unnelW)m(eb)g(prev)o(en)o(ts)i(a)f(macro)e(from)g(b) +q(eing)h(called)h(more)e(than)i(once)177 1703 y(unless)g(it)e(has)h(a)f(\\)p +Fi(@M)p Fn(")g(asso)q(ciated)h(with)g(it.)j(Ho)o(w)o(ev)o(er,)d(F)m(unnelW)m +(eb)f(do)q(es)i(allo)o(w)d(a)h(macro)g(that)g(calls)h(suc)o(h)g(a)177 +1753 y(macro)f(to)h(b)q(e)g(called)g(more)f(than)g(once.)19 +b(P)o(erhaps)c(this)f(\\lo)q(ophole")e(should)i(b)q(e)h(plugged)e(someho)o +(w.)177 1923 y Fe(4.8)70 b(T)-6 b(angle)177 2042 y Fn(The)12 +b(T)m(angler)f(is)h(one)g(of)f(the)i(cleanest)g(comp)q(onen)o(ts)e(of)g(F)m +(unnelW)m(eb,)g(as)h(basically)f(all)f(it)i(has)g(to)f(do)h(is)g(expand)177 +2092 y(some)h(v)o(ery)h(w)o(ell-de\014ned)h(macros.)177 2169 +y Fk(T)l(ext)23 b(inden)o(tati)o(on)o(:)28 b Fn(Curren)o(tly)21 +b(F)m(unnelW)m(eb)e(supp)q(orts)j Fh(no)f(indentation)g Fn(and)f +Fh(blank)g(indentation)p Fn(.)38 b(A)177 2219 y(third)17 b(form)d(could)j(b)q +(e)g(added)g(if)e(it)h(w)o(as)h(considered)g(necessary)m(.)28 +b Fh(T)m(ext)17 b(indentation)g Fn(is)f(the)h(same)f(as)g Fh(blank)177 +2269 y(indentation)g Fn(except)h(that)e(instead)g(of)g(inden)o(ting)f(with)h +(blanks,)g(F)m(unnelW)m(eb)f(w)o(ould)g(inden)o(t)i(with)e(the)i(text)177 +2319 y(to)g(the)h(left)f(of)g(the)h(called)f(macro.)24 b(This)16 +b(facilit)o(y)f(could)h(b)q(e)h(useful)f(for)g(commen)o(ting)d(out)k(large)f +(b)q(o)q(dies)g(of)177 2369 y(text)f(in)f(languages)h(that)f(do)h(not)f(ha)o +(v)o(e)g(m)o(ulti-line)e(commen)o(ts)h(\(e.g.)20 b(Ada\).)g(A)15 +b(discussion)g(of)f(the)h(pros)g(and)177 2418 y(cons)g(of)e(this)h(form)e(of) +h(inden)o(tation)h(app)q(ears)g(earlier.)177 2588 y Fe(4.9)70 +b(W)-6 b(ea)n(v)n(e)177 2708 y Fn(P)o(erhaps)15 b(F)m(unnelW)m(eb's)e(w)o +(eak)o(est)i(asp)q(ect)g(is)f(its)g(t)o(yp)q(esetting)h(facilit)o(y)m(.)177 +2785 y Fk(Align)g(table)h(of)h(con)o(ten)o(ts:)i Fn(When)c(F)m(unnelW)m(eb)f +(generates)j(a)e(table)g(of)g(con)o(ten)o(ts,)h(the)f(section)h(n)o(um)o(b)q +(ers)177 2835 y(are)e(not)g(quite)g(aligned)f(with)h(the)g(start)h(of)e(the)h +(con)o(trolling)f(heading)h(ab)q(o)o(v)o(e)f(them.)1042 2940 +y(45)p eop +%%Page: 46 47 +46 46 bop 177 42 a Fk(T)o(yp)q(esetting)20 b(strength:)27 b +Fn(It)20 b(should)g(b)q(e)g(p)q(ossible)g(to)f(sp)q(ecify)h(the)g(lev)o(el)g +(of)f(t)o(yp)q(esetting)h(strength)h(for)177 91 y(headings)16 +b(so)g(that)h(short)f(do)q(cumen)o(ts)g(do)g(not)g(lo)q(ok)f(o)o(v)o(erdone)h +(when)h(t)o(yp)q(eset.)26 b(A)16 b(new)h(pragma)d(w)o(ould)h(b)q(e)177 +141 y(go)q(o)q(d)f(for)f(this.)177 222 y Fk(T)o(yp)q(eset)f(a)h(p)q(ortion:)i +Fn(Sometimes)9 b(it)i(is)g(desirable)g(to)g(t)o(yp)q(eset)i(just)e(a)g(p)q +(ortion)g(of)f(a)h(program.)k(A)d(command)177 272 y(line)g(option)f(could)h +(b)q(e)g(added)g(to)g(do)g(this.)17 b(The)c(option)e(could)g(accept)j(as)e +(its)g(argumen)o(t,)e(a)i(string)g(con)o(taining)177 322 y(a)i(list)f(of)g +(section)i(n)o(um)o(b)q(ers)f(or)f(heading)h(names.)177 403 +y Fk(Generic)g(t)o(yp)q(esetter)f(option:)j Fn(In)e(addition)e(to)i(building) +e(in)h(a)g(n)o(um)o(b)q(er)g(of)g(di\013eren)o(t)i(v)o(ersions)f(of)f(W)m(ea) +o(v)o(e,)177 453 y(one)k(for)g(eac)o(h)g(p)q(opular)g(t)o(yp)q(esetter,)i(it) +e(w)o(ould)f(b)q(e)h(p)q(ossible)g(to)g(add)g(a)f(sp)q(ecial)h(generic)h +(format)d(where)j(the)177 503 y(t)o(yp)q(eset)h(output)e(is)g(expressed)i(in) +e(terms)g(of)f Fh(F)m(unnelWeb)j(macr)n(os)p Fn(.)27 b(The)18 +b(user)g(could)f(then)g(sp)q(ecify)h(macro)177 552 y(de\014nitions)13 +b(for)g(a)f(non-supp)q(orted)i(t)o(yp)q(esetter)i(and)d(run)g(the)g(output)h +(through)f(F)m(unnelW)m(eb)f(T)m(angle)g(to)h(get)g(a)177 602 +y(t)o(yp)q(eset)j(\014le)d(in)h(a)f(format)f(suitable)i(for)g(the)g(unsupp)q +(orted)i(t)o(yp)q(esetter.)177 683 y Fk(Suppression)e(of)k(include)d +(\014les:)21 b Fn(It)16 b(should)g(b)q(e)g(p)q(ossible)h(to)e(sp)q(ecify)i +(in)e(the)i(input)e(\014le)h(that)g(particular)177 733 y(included)e(\014les)g +(not)f(app)q(ear)h(in)f(the)h(t)o(yp)q(eset)h(output.)j(Curren)o(tly)m(,)13 +b(the)h(fact)f(that)g(an)h(inclusion)e(has)i(o)q(ccurred)177 +783 y(is)h(not)h(ev)o(en)g(represen)o(ted)i(in)d(the)h(t)o(yp)q(eset)g +(output.)23 b(Suppression)16 b(of)f(inclusions)g(is)g(particularly)g +(necessary)177 833 y(where)g(a)f(library)f(of)g(macros)g(has)h(b)q(een)h +(included)f(at)g(the)h(top)e(of)h(eac)o(h)g(of)f(a)h(group)g(of)f(source)i +(\014les.)177 914 y Fk(Cross)f(reference)e(of)i(iden)o(ti)o(\014ers)o(:)h +Fn(WEB)e(pro)o(vides)f(a)g(list)g(of)g(iden)o(ti\014ers)h(and)f(a)g(list)g +(of)g(all)f(the)i(de\014nitions)177 964 y(in)h(whic)o(h)f(they)i(are)f(used.) +19 b(A)14 b(similar)d(feature)k(could)f(b)q(e)g(added)g(to)g(F)m(unnelW)m +(eb.)177 1045 y Fk(Supp)q(ort)k(for)h(non-prin)n(tab)o(les)o(:)k +Fn(Curren)o(tly)18 b(F)m(unnelW)m(eb)f(do)q(es)h(not)f(pro)o(vide)h(supp)q +(ort)g(for)f(t)o(yp)q(esetting)177 1095 y(the)e(sp)q(ecial)f(\\)p +Fi(@^\(num\))p Fn(")e(sequences.)20 b(This)14 b(should)g(b)q(e)g(added.)177 +1176 y Fk(Supp)q(ort)g(for)i(@+)h(sequences:)i Fn(Curren)o(tly)c(W)m(ea)o(v)o +(e)f(do)q(es)h(not)f(see)i(\\)p Fi(@+)p Fn(")e(sequences)j(as)d(suc)o(h.)21 +b(Instead)15 b(it)177 1225 y(p)q(erceiv)o(es)h(them)d(as)h(ordinary)f(EOLs.) +19 b(Ho)o(w)o(ev)o(er,)14 b(there)h(are)g(argumen)o(ts)e(for)g(t)o(yp)q +(esetting)i(them)e(sp)q(ecially)m(.)177 1306 y Fk(T)o(yp)q(eset)e(text)h(in)f +(macro)h(b)q(o)q(dies:)j Fn(One)d(of)e(the)h(m)o(uc)o(h-lo)o(v)o(ed)e +(features)i(of)f(WEB)h(is)g(the)g(w)o(a)o(y)f(that)h(it)f(allo)o(ws)177 +1356 y(the)j(user)h(to)e(switc)o(h)h(recursiv)o(ely)g(b)q(et)o(w)o(een)h(do)q +(cumen)o(t)e(and)g(program)f(formats.)16 b(F)m(unnelW)m(eb)c(do)q(es)h(not)f +(allo)o(w)177 1406 y(this,)18 b(but)g(should.)29 b(In)17 b(F)m(unnelW)m(eb,)h +(the)g(delimiters)f(\\)p Fi(@)p Fm(f)p Fn(")f(and)i(\\)p Fi(@)p +Fm(g)p Fn(")e(are)i(already)f(used)i(consisten)o(tly)f(to)177 +1456 y(delimit)g(macro)g(text.)37 b(The)20 b(\\)p Fi(@[)p Fn(")f(and)g(\\)p +Fi(@])p Fn(")g(sequences)j(ha)o(v)o(e)e(b)q(een)h(reserv)o(ed)h(for)d(the)i +(delimitation)16 b(of)177 1506 y(do)q(cumen)o(tation)d(text.)177 +1587 y Fk(Non-tt)h(t)o(yp)q(esetting:)i Fn(The)d(curren)o(t)i(v)o(ersion)f +(of)f(F)m(unnelW)m(eb)g(sets)i(all)d(its)h(macro)f(text)i(in)f +Fi(tt)22 b(font)p Fn(.)17 b(This)177 1637 y(is)d(b)q(oth)g(a)f(blessing)h +(and)g(a)g(curse.)19 b(It)14 b(is)g(a)f(blessing)h(b)q(ecause)i(it)d +(connects)j(the)e(reader)h(directly)f(to)g(the)g(co)q(de,)177 +1686 y(with)g(no)g(complicated)f(in)o(termediary)m(.)k(It)d(is)g(a)g(curse)i +(b)q(ecause)g(it)e(lo)q(oks)f(ugly)h(compared)f(to)h(the)h(b)q(eautifully)177 +1736 y(t)o(yp)q(eset)h(programs)c(pro)q(duced)j(b)o(y)f(other)g(literate)h +(programmi)o(ng)c(to)q(ols.)177 1817 y(The)20 b(di\016cult)o(y)e(with)g +(adding)g(suc)o(h)i(b)q(eautiful)e(t)o(yp)q(esetting)i(is)f(that)g(it)g(is)g +(necessarily)h(language-sp)q(eci\014c.)177 1867 y(Keyw)o(ords)15 +b(and)f(syn)o(tax)g(di\013er)g(from)e(language)i(to)f(language)g(and)h(it)g +(w)o(ould)f(not)h(b)q(e)h(easy)f(to)g(come)f(up)h(with)177 +1917 y(a)g(set)h(of)e(language)g(indep)q(enden)o(t)i(rules.)177 +1998 y(One)k(approac)o(h)g(is)f(to)g(write)g(a)h(set)g(of)e(W)m(ea)o(v)o(e)h +(bac)o(k-ends,)i(one)e(for)g(eac)o(h)h(language.)31 b(Another)19 +b(approac)o(h)177 2048 y(is)e(to)g Fh(gener)n(ate)f Fn(bac)o(k)h(ends.)28 +b(This)17 b(is)g(the)g(approac)o(h)g(tak)o(en)g(in)f(the)i +Fh(Spider)f Fn(system)p Fk([Ramsey89])p Fn(.)26 b(In)17 b(the)177 +2098 y Fh(Spider)f Fn(system,)g(the)h(programmer)d(writes)i(pro)q(duction)h +(rules)f(for)g(con)o(v)o(erting)g(lexical)f(comp)q(onen)o(ts)h(of)f(the)177 +2148 y(program)f(text)h(in)o(to)g(t)o(yp)q(esetter)i(instructions.)22 +b(The)16 b Fh(Spider)f Fn(program)e(reads)j(these)h(rules)e(and)g(generates)i +(a)177 2197 y(new)d(v)o(ersion)h(of)e(WEB)h(suited)g(for)g(the)g(target)h +(language.)177 2278 y(F)m(or)j(F)m(unnelW)m(eb)g(a)g(sligh)o(tly)f +(di\013eren)o(t)j(system)e(is)g(prop)q(osed)i(in)e(whic)o(h)g(Spider-lik)o(e) +g(rules)h(app)q(ear)g(in)f(the)177 2328 y(input)e(\014le)h(and)f(are)h(used)h +(directly)e(b)o(y)h(W)m(ea)o(v)o(e)f(to)g(p)q(erform)g(the)h(t)o(yp)q +(esetting.)27 b(An)16 b(in)o(termediate)g(abstract)177 2378 +y(t)o(yp)q(esetting)d(language)e(could)h(b)q(e)h(used)g(so)f(that)g(the)h +(pro)q(ductions)f(can)h(b)q(e)f(made)f(language)g(sp)q(eci\014c,)j(but)e(not) +177 2428 y(t)o(yp)q(esetter)k(sp)q(eci\014c.)177 2610 y Fe(4.10)70 +b(Lister)177 2735 y Fk(Glue)17 b(factor:)23 b Fn(A)16 b(glue)g(factor)g +(could)g(b)q(e)h(added)g(that)f(determines)h(ho)o(w)f(man)o(y)e(lines)i(can)h +(b)q(e)g(in)e(b)q(et)o(w)o(een)177 2785 y(t)o(w)o(o)f(diagnostics)g(in)f(the) +i(listing)e(b)q(efore)i(the)f(t)o(w)o(o)g(groups)g(of)g(lines)g(are)g(joined) +g(together)h(in)e(the)i(listing)e(with)177 2835 y(no)h(in)o(terv)o(ening)g +(ellipsis.)1042 2940 y(46)p eop +%%Page: 47 48 +47 47 bop 177 42 a Fe(4.11)70 b(Diagnostics)177 157 y Fk(Advisory)16 +b(information)o(:)j Fn(Some)13 b(of)i(F)m(unnelW)m(eb's)g(diagnostics)f(pro)o +(vide)h(a)g(detailed)g(explanatory)g(para-)177 207 y(graph.)i(While)11 +b(this)h(information)c(migh)o(t)i(b)q(e)i(useful)g(the)g(\014rst)g(time,)f +(it)g(has)h(the)g(capacit)o(y)f(to)h(clog)f(up)h(a)f(listing)177 +257 y(\014le)k(if)f(the)h(user)h(has)f(made)f(the)h(same)f(error)i(man)o(y)d +(times.)20 b(T)m(o)14 b(solv)o(e)g(this)h(problem,)e(F)m(unnelW)m(eb)i(could) +f(b)q(e)177 307 y(mo)q(di\014ed)f(so)h(that)g(suc)o(h)g(explanations)f(are)i +(only)e(displa)o(y)o(ed)g(the)i(\014rst)f(time)f(the)h(error)h(o)q(ccurs.)177 +382 y Fk(Ab)q(ort)g(after)f(n)h(errors:)i Fn(A)d(facilit)o(y)e(could)h(b)q(e) +h(added)g(to)f(prev)o(en)o(t)i(F)m(unnelW)m(eb's)e(scanning,)g(parsing,)g +(and)177 431 y(analysing)g(phases)i(from)d(con)o(tin)o(uing)h(if)g(a)g +(certain)i(n)o(um)o(b)q(er)e(of)g(errors)i(ha)o(v)o(e)f(already)g(b)q(een)h +(issued.)177 594 y Fe(4.12)70 b(Sp)r(eed)177 709 y Fk(Measuremen)o(t)11 +b(of)i(sp)q(eed:)k Fn(Although)11 b(F)m(unnelW)m(eb)g(can)h(generate)h(a)e +(breakdo)o(wn)h(of)f(where)i(it)e(is)g(sp)q(ending)177 759 +y(its)j(time,)e(it)i(do)q(es)g(not)g(giv)o(e)f(a)h(\014nal)f(rating)h(in)f +(lines)h(p)q(er)h(min)o(ute.)h(This)e(should)g(b)q(e)g(added.)177 +834 y Fk(Find)19 b(the)h(hot)f(sp)q(ots:)26 b Fn(Although)17 +b(F)m(unnelW)m(eb)h(has)g(b)q(een)h(designed)g(to)e(allo)o(w)g(high)g(sp)q +(eed,)j(not)e(m)o(uc)o(h)177 884 y(e\013ort)d(has)f(so)g(far)f(b)q(een)i +(made)e(to)h(mak)o(e)e(it)i(fast.)k(This)13 b(should)h(b)q(e)h(done.)177 +958 y Fk(Change)i(some)f(declarations:)i Fn(F)m(unnelW)m(eb)c(is)g(full)g(of) +g(v)n(ariable)g(declarations)h(where)h(the)f(v)n(ariables)f(are)177 +1008 y(wider)g(than)g(they)h(need)f(b)q(e.)19 b(Replacing)13 +b(these)i(migh)o(t)d(sp)q(eed)k(it)d(up.)177 1170 y Fe(4.13)70 +b(Correctness)177 1286 y Fk(Bounds)17 b(analysis:)23 b Fn(Not)16 +b(m)o(uc)o(h)f(e\013ort)j(has)e(gone)h(in)o(to)f(the)h(design)g(of)f(F)m +(unnelW)m(eb's)f(input)i(b)q(oundaries.)177 1336 y(An)12 b(analysis)f(should) +g(b)q(e)h(made)f(of)g(F)m(unnelW)m(eb's)g(b)q(eha)o(viour)g(when)h(the)h +(follo)o(wing)c(quan)o(tities)i(are)h(stretc)o(hed:)239 1452 +y Fm(\017)21 b Fn(Input)14 b(line)g(length.)239 1535 y Fm(\017)21 +b Fn(Input)14 b(\014le)g(size.)239 1618 y Fm(\017)21 b Fn(Num)o(b)q(er)13 +b(of)h(macros.)239 1701 y Fm(\017)21 b Fn(Length)14 b(of)f(macro.)177 +1818 y(In)h(particular,)f(F)m(unnelW)m(eb's)g(b)q(eha)o(viour)h(at)g(32K)g +(and)f(64K)h(b)q(oundaries)g(should)g(b)q(e)g(observ)o(ed.)177 +1892 y Fk(Stac)o(k)k(detection:)i Fn(Macin)o(tosh)c(THINK-C)g(pro)o(vides)g +(just)h(6K)f(of)f(memory)e(for)j(the)h(stac)o(k.)24 b(It)16 +b(migh)o(t)e(b)q(e)177 1942 y(w)o(orth)g(adding)f(c)o(hec)o(ks)i(to)f(mak)o +(e)e(sure)j(that)f(the)h(stac)o(k)f(is)g(not)g(b)q(eing)g(blo)o(wn.)177 +2104 y Fe(4.14)70 b(T)-6 b(est)22 b(Suite)177 2220 y Fn(The)14 +b(follo)o(wing)e(tests)j(should)f(b)q(e)g(added)g(to)g(the)h(test)g(suite:) +177 2337 y Fi(Lister)177 2386 y(------)243 2436 y(LR01:)20 +b(Test)h(with)g(a)h(full)f(listing)f(with)h(no)g(diagnostics.)243 +2486 y(LR02:)f(Test)h(with)g(a)h(full)f(listing)f(with)h(diagnostics.)243 +2536 y(LR03:)f(Test)h(with)g(an)h(abbreviated)d(listing)h(with)h(no)h +(diagnostics.)243 2586 y(LR04:)e(Test)h(with)g(an)h(abbreviated)d(listing)h +(with)h(diagnostics.)243 2635 y(LR05:)f(Test)h(error)g(context)f(system)h +(with)g(nearby)f(diagnostics.)177 2735 y(Boundary)g(Cases)177 +2785 y(--------------)177 2835 y(Static)h(analysis)f(might)h(preclude)f(the)h +(need)g(for)g(most)g(of)g(these)g(tests.)1042 2940 y Fn(47)p +eop +%%Page: 48 49 +48 48 bop 243 42 a Fi(BC01:)20 b(Test)h(what)g(happens)g(when)g(memory)f +(runs)h(out.)243 91 y(BC02:)f(Test)h(on)h(a)f(file)g(with)g(a)h(single)e +(line)h(of)h(a)f(megabyte.)243 141 y(BC03:)f(Test)h(on)h(a)f(file)g(of)h(a)f +(megabyte)f(of)i(EOLs.)243 191 y(BC04:)e(Generate)g(an)i(output)e(file)h +(with)g(an)h(extremely)e(long)h(line.)243 241 y(BC05:)f(Generate)g(an)i +(output)e(file)h(with)g(one)g(million)g(lines.)243 291 y(BC06:)f(Test)h(on)h +(a)f(file)g(with)g(very)g(many)g(macros.)177 390 y(General)177 +440 y(-------)243 490 y(GN01:)f(A)i(large)f(legal)f(input)h(file)g +(exercising)f(as)h(many)g(features)f(as)i(possible.)373 540 +y(1.)g(Test)f(listing)f(file.)373 589 y(2.)i(Test)f(output)f(files.)373 +639 y(3.)i(Test)f(typeset)f(file.)243 689 y(GN...)g(A)i(selection)e(of)h(ten) +g(real-life)f(FunnelWeb)g(files.)177 851 y Fe(4.15)70 b(Mac)n(hine-Sp)r +(eci\014c)20 b(Changes)177 967 y Fk(Icon)14 b(for)g(the)f(Macin)o(tosh:)j +Fn(Curren)o(tly)d(no)g(icon)f(is)g(supplied)h(for)f(the)i(Macin)o(tosh)e(v)o +(ersion)h(of)f(F)m(unnelW)m(eb.)177 1017 y(An)i(icon)g(depicting)g(a)f +(spider)i(or)f(a)f(funnelled)h(w)o(eb)g(of)g(some)f(kind)g(w)o(ould)g(seem)h +(appropriate.)177 1179 y Fe(4.16)70 b(Summary)177 1295 y Fn(This)15 +b(c)o(hapter)i(has)e(describ)q(es)i(some)e(of)f(the)i(problems)f(with)g(F)m +(unnelW)m(eb)f(and)i(some)e(of)h(the)g(opp)q(ortunities)177 +1345 y(that)e(exist)h(for)f(impro)o(ving)e(it.)17 b(The)d(direction)f(and)g +(sp)q(eed)i(in)e(whic)o(h)g(F)m(unnelW)m(eb)g(will)e(dev)o(elop)j(will)e(dep) +q(end)177 1395 y(largely)j(on)h(user)h(feedbac)o(k.)25 b(If)15 +b(y)o(ou)h(ha)o(v)o(e)f(an)o(y)h(strong)g(feelings)g(on)g(where)h(F)m(unnelW) +m(eb)e(should)h(go,)f(please)177 1444 y(email)d(them)h(to)h(Ross)g(William)o +(s)d(\()p Fi(ross@spam.adelaide)o(.edu.)o(au)p Fn(\).)1042 +2940 y(48)p eop +%%Page: 49 50 +49 49 bop 177 380 a Ff(App)s(endix)34 b(A)177 615 y Fl(GNU)40 +b(General)i(Public)f(License)177 739 y(V)-10 b(ersion)41 b(2)177 +983 y Fn(This)16 b(app)q(endix)h(con)o(tains)f(a)g(v)o(erbatim)e(cop)o(y)j +(of)e(V)m(ersion)i(2)f(of)f(the)i(GNU)f(General)g(Public)g(License)i(under) +177 1032 y(whic)o(h)g(the)g(F)m(unnelW)m(eb)g(computer)f(program)f(is)i +(released.)31 b(Note)18 b(that)g(the)h Fh(F)m(unnelWeb)g(User's)f(Manual)177 +1082 y Fn(and)e Fh(F)m(unnelWeb)j(Hacker's)e(Manual)g Fn(are)g(released)g +(under)h(a)e(m)o(uc)o(h)f(simpler)g(license)i(that)g(do)q(es)g(not)f(allo)o +(w)177 1132 y(mo)q(di\014cations.)p 177 1188 1772 2 v 264 1340 +a Fi(GNU)22 b(GENERAL)e(PUBLIC)g(LICENSE)330 1390 y(Version)g(2,)h(June)g +(1991)199 1490 y(Copyright)f(\(C\))h(1989,)g(1991)g(Free)g(Software)f +(Foundation,)f(Inc.)744 1540 y(675)i(Mass)g(Ave,)g(Cambridge,)f(MA)h(02139,)g +(USA)199 1589 y(Everyone)f(is)h(permitted)f(to)i(copy)f(and)g(distribute)f +(verbatim)g(copies)199 1639 y(of)h(this)g(license)g(document,)f(but)h +(changing)f(it)h(is)h(not)f(allowed.)264 1739 y(Preamble)221 +1838 y(The)g(licenses)f(for)h(most)g(software)f(are)i(designed)e(to)h(take)g +(away)g(your)177 1888 y(freedom)g(to)g(share)g(and)g(change)f(it.)43 +b(By)22 b(contrast,)e(the)h(GNU)g(General)f(Public)177 1938 +y(License)h(is)g(intended)f(to)h(guarantee)f(your)h(freedom)g(to)g(share)g +(and)g(change)g(free)177 1988 y(software--to)e(make)i(sure)g(the)h(software)e +(is)h(free)g(for)g(all)g(its)h(users.)42 b(This)177 2038 y(General)21 +b(Public)f(License)g(applies)h(to)g(most)g(of)g(the)h(Free)f(Software)177 +2087 y(Foundation's)e(software)i(and)g(to)g(any)g(other)g(program)f(whose)h +(authors)g(commit)f(to)177 2137 y(using)h(it.)43 b(\(Some)21 +b(other)f(Free)h(Software)g(Foundation)e(software)h(is)i(covered)e(by)177 +2187 y(the)h(GNU)h(Library)e(General)g(Public)h(License)f(instead.\))42 +b(You)21 b(can)g(apply)g(it)g(to)177 2237 y(your)g(programs,)f(too.)221 +2337 y(When)h(we)g(speak)g(of)g(free)g(software,)f(we)i(are)f(referring)f(to) +h(freedom,)f(not)177 2386 y(price.)43 b(Our)21 b(General)f(Public)h(Licenses) +f(are)h(designed)f(to)h(make)g(sure)g(that)g(you)177 2436 y(have)g(the)g +(freedom)g(to)g(distribute)f(copies)g(of)i(free)f(software)f(\(and)h(charge)f +(for)177 2486 y(this)h(service)f(if)i(you)f(wish\),)g(that)g(you)g(receive)f +(source)h(code)g(or)g(can)g(get)g(it)177 2536 y(if)h(you)f(want)g(it,)g(that) +g(you)g(can)g(change)g(the)g(software)f(or)h(use)h(pieces)e(of)i(it)177 +2586 y(in)g(new)f(free)g(programs;)f(and)h(that)g(you)g(know)g(you)g(can)g +(do)h(these)e(things.)221 2685 y(To)h(protect)f(your)h(rights,)g(we)g(need)g +(to)h(make)e(restrictions)g(that)h(forbid)177 2735 y(anyone)g(to)g(deny)g +(you)g(these)g(rights)g(or)g(to)g(ask)g(you)h(to)f(surrender)f(the)h(rights.) +177 2785 y(These)g(restrictions)e(translate)h(to)i(certain)e +(responsibilities)e(for)k(you)f(if)g(you)177 2835 y(distribute)f(copies)g(of) +i(the)f(software,)f(or)h(if)h(you)f(modify)f(it.)1042 2940 +y Fn(49)p eop +%%Page: 50 51 +50 50 bop 221 91 a Fi(For)21 b(example,)f(if)h(you)h(distribute)d(copies)i +(of)g(such)g(a)h(program,)e(whether)177 141 y(gratis)h(or)g(for)g(a)h(fee,)f +(you)g(must)g(give)g(the)g(recipients)f(all)h(the)g(rights)g(that)177 +191 y(you)g(have.)43 b(You)21 b(must)g(make)g(sure)g(that)g(they,)g(too,)g +(receive)f(or)h(can)h(get)f(the)177 241 y(source)g(code.)42 +b(And)21 b(you)h(must)f(show)g(them)g(these)f(terms)h(so)g(they)g(know)g +(their)177 291 y(rights.)221 390 y(We)g(protect)f(your)h(rights)g(with)g(two) +g(steps:)g(\(1\))g(copyright)f(the)h(software,)f(and)177 440 +y(\(2\))h(offer)g(you)g(this)g(license)g(which)f(gives)h(you)g(legal)g +(permission)f(to)h(copy,)177 490 y(distribute)f(and/or)g(modify)h(the)g +(software.)221 589 y(Also,)g(for)g(each)g(author's)f(protection)g(and)h +(ours,)f(we)i(want)f(to)g(make)g(certain)177 639 y(that)g(everyone)f +(understands)g(that)h(there)g(is)g(no)g(warranty)f(for)i(this)f(free)177 +689 y(software.)42 b(If)21 b(the)g(software)g(is)g(modified)f(by)h(someone)g +(else)g(and)g(passed)g(on,)g(we)177 739 y(want)g(its)g(recipients)f(to)h +(know)g(that)g(what)g(they)g(have)g(is)h(not)f(the)g(original,)f(so)177 +789 y(that)h(any)g(problems)f(introduced)g(by)i(others)e(will)h(not)g +(reflect)g(on)g(the)g(original)177 839 y(authors')f(reputations.)221 +938 y(Finally,)g(any)h(free)g(program)f(is)i(threatened)d(constantly)h(by)i +(software)177 988 y(patents.)42 b(We)21 b(wish)g(to)h(avoid)f(the)g(danger)f +(that)h(redistributors)e(of)j(a)f(free)177 1038 y(program)g(will)f +(individually)g(obtain)g(patent)h(licenses,)f(in)h(effect)g(making)f(the)177 +1088 y(program)h(proprietary.)41 b(To)21 b(prevent)f(this,)h(we)g(have)g +(made)g(it)h(clear)f(that)g(any)177 1137 y(patent)g(must)g(be)g(licensed)f +(for)h(everyone's)f(free)h(use)g(or)h(not)f(licensed)f(at)h(all.)221 +1237 y(The)g(precise)f(terms)h(and)g(conditions)f(for)h(copying,)f +(distribution)g(and)177 1287 y(modification)f(follow.)264 1386 +y(GNU)j(GENERAL)e(PUBLIC)g(LICENSE)243 1436 y(TERMS)g(AND)h(CONDITIONS)f(FOR) +h(COPYING,)g(DISTRIBUTION)e(AND)i(MODIFICATION)221 1536 y(0.)g(This)g +(License)f(applies)h(to)g(any)g(program)g(or)g(other)g(work)g(which)g +(contains)177 1586 y(a)h(notice)e(placed)h(by)g(the)g(copyright)f(holder)h +(saying)f(it)i(may)f(be)g(distributed)177 1636 y(under)g(the)g(terms)g(of)g +(this)g(General)g(Public)f(License.)42 b(The)21 b("Program",)f(below,)177 +1685 y(refers)h(to)g(any)g(such)g(program)g(or)g(work,)g(and)g(a)g("work)g +(based)g(on)g(the)h(Program")177 1735 y(means)f(either)f(the)i(Program)e(or)h +(any)h(derivative)d(work)i(under)g(copyright)f(law:)177 1785 +y(that)h(is)h(to)f(say,)g(a)g(work)g(containing)f(the)h(Program)g(or)g(a)h +(portion)e(of)h(it,)177 1835 y(either)g(verbatim)f(or)h(with)g(modifications) +e(and/or)i(translated)f(into)h(another)177 1885 y(language.)42 +b(\(Hereinafter,)19 b(translation)h(is)h(included)f(without)g(limitation)g +(in)177 1934 y(the)h(term)g("modification".\))41 b(Each)21 +b(licensee)f(is)h(addressed)f(as)h("you".)177 2034 y(Activities)f(other)h +(than)g(copying,)f(distribution)f(and)i(modification)f(are)h(not)177 +2084 y(covered)g(by)g(this)g(License;)f(they)h(are)g(outside)f(its)i(scope.) +42 b(The)21 b(act)g(of)177 2134 y(running)g(the)g(Program)f(is)h(not)h +(restricted,)d(and)i(the)g(output)g(from)g(the)g(Program)177 +2183 y(is)h(covered)e(only)h(if)g(its)g(contents)g(constitute)e(a)j(work)f +(based)g(on)g(the)177 2233 y(Program)g(\(independent)e(of)i(having)g(been)g +(made)g(by)g(running)f(the)i(Program\).)177 2283 y(Whether)f(that)f(is)i +(true)f(depends)f(on)i(what)f(the)g(Program)f(does.)221 2383 +y(1.)h(You)g(may)g(copy)g(and)h(distribute)d(verbatim)h(copies)h(of)g(the)h +(Program's)177 2433 y(source)f(code)g(as)g(you)g(receive)g(it,)g(in)g(any)g +(medium,)g(provided)f(that)h(you)177 2482 y(conspicuously)e(and)i +(appropriately)f(publish)g(on)h(each)g(copy)g(an)h(appropriate)177 +2532 y(copyright)e(notice)h(and)g(disclaimer)f(of)h(warranty;)f(keep)h +(intact)f(all)i(the)177 2582 y(notices)f(that)f(refer)h(to)h(this)f(License)f +(and)h(to)g(the)h(absence)e(of)h(any)h(warranty;)177 2632 y(and)f(give)g(any) +g(other)g(recipients)f(of)h(the)h(Program)e(a)h(copy)g(of)h(this)f(License) +177 2682 y(along)g(with)g(the)g(Program.)177 2781 y(You)g(may)h(charge)e(a)i +(fee)f(for)g(the)g(physical)f(act)h(of)h(transferring)d(a)j(copy,)f(and)177 +2831 y(you)g(may)h(at)f(your)g(option)f(offer)h(warranty)f(protection)g(in)h +(exchange)g(for)g(a)g(fee.)1042 2940 y Fn(50)p eop +%%Page: 51 52 +51 51 bop 221 91 a Fi(2.)21 b(You)g(may)g(modify)g(your)g(copy)g(or)g(copies) +g(of)g(the)g(Program)g(or)g(any)g(portion)177 141 y(of)h(it,)f(thus)g +(forming)f(a)i(work)f(based)f(on)i(the)f(Program,)f(and)h(copy)g(and)177 +191 y(distribute)f(such)h(modifications)e(or)i(work)g(under)g(the)g(terms)g +(of)g(Section)g(1)177 241 y(above,)g(provided)f(that)h(you)g(also)g(meet)g +(all)g(of)g(these)g(conditions:)264 340 y(a\))h(You)f(must)g(cause)g(the)g +(modified)f(files)h(to)g(carry)g(prominent)f(notices)264 390 +y(stating)h(that)g(you)g(changed)f(the)h(files)g(and)g(the)g(date)g(of)h(any) +f(change.)264 490 y(b\))h(You)f(must)g(cause)g(any)g(work)g(that)g(you)g +(distribute)f(or)h(publish,)f(that)h(in)264 540 y(whole)g(or)g(in)h(part)f +(contains)f(or)h(is)h(derived)e(from)h(the)g(Program)g(or)g(any)264 +589 y(part)g(thereof,)f(to)i(be)f(licensed)f(as)i(a)f(whole)g(at)g(no)h +(charge)e(to)i(all)f(third)264 639 y(parties)g(under)f(the)i(terms)e(of)i +(this)f(License.)264 739 y(c\))h(If)f(the)g(modified)f(program)h(normally)f +(reads)h(commands)f(interactively)264 789 y(when)h(run,)g(you)g(must)g(cause) +g(it,)g(when)g(started)g(running)f(for)h(such)264 839 y(interactive)f(use)h +(in)g(the)h(most)f(ordinary)f(way,)h(to)g(print)g(or)g(display)g(an)264 +888 y(announcement)f(including)g(an)h(appropriate)e(copyright)h(notice)h(and) +g(a)264 938 y(notice)g(that)g(there)g(is)g(no)g(warranty)g(\(or)g(else,)f +(saying)h(that)g(you)g(provide)264 988 y(a)h(warranty\))e(and)h(that)g(users) +g(may)g(redistribute)e(the)i(program)g(under)264 1038 y(these)g(conditions,)f +(and)h(telling)f(the)h(user)g(how)g(to)h(view)f(a)g(copy)g(of)h(this)264 +1088 y(License.)42 b(\(Exception:)20 b(if)h(the)g(Program)g(itself)f(is)i +(interactive)d(but)264 1137 y(does)i(not)g(normally)g(print)f(such)h(an)h +(announcement,)d(your)i(work)g(based)g(on)264 1187 y(the)h(Program)e(is)h +(not)g(required)g(to)g(print)g(an)g(announcement.\))177 1287 +y(These)g(requirements)e(apply)i(to)g(the)h(modified)e(work)h(as)g(a)h +(whole.)42 b(If)177 1337 y(identifiable)19 b(sections)i(of)g(that)g(work)g +(are)g(not)g(derived)g(from)g(the)g(Program,)177 1386 y(and)g(can)h(be)f +(reasonably)f(considered)f(independent)h(and)h(separate)f(works)h(in)177 +1436 y(themselves,)f(then)h(this)g(License,)f(and)h(its)g(terms,)g(do)g(not)g +(apply)g(to)g(those)177 1486 y(sections)f(when)h(you)g(distribute)f(them)h +(as)h(separate)e(works.)42 b(But)21 b(when)g(you)177 1536 y(distribute)f(the) +h(same)g(sections)f(as)i(part)f(of)g(a)g(whole)g(which)g(is)g(a)h(work)f +(based)177 1586 y(on)h(the)f(Program,)f(the)h(distribution)e(of)j(the)f +(whole)g(must)g(be)g(on)g(the)h(terms)e(of)177 1636 y(this)h(License,)f +(whose)h(permissions)f(for)h(other)f(licensees)g(extend)h(to)g(the)177 +1685 y(entire)g(whole,)f(and)h(thus)g(to)h(each)f(and)g(every)g(part)g +(regardless)e(of)j(who)f(wrote)g(it.)177 1785 y(Thus,)g(it)g(is)h(not)f(the)g +(intent)g(of)g(this)g(section)f(to)i(claim)e(rights)h(or)g(contest)177 +1835 y(your)g(rights)g(to)g(work)g(written)f(entirely)h(by)g(you;)g(rather,)f +(the)h(intent)g(is)g(to)177 1885 y(exercise)f(the)h(right)g(to)h(control)e +(the)h(distribution)e(of)j(derivative)e(or)177 1934 y(collective)g(works)h +(based)f(on)i(the)f(Program.)177 2034 y(In)h(addition,)d(mere)i(aggregation)f +(of)h(another)g(work)g(not)g(based)g(on)g(the)g(Program)177 +2084 y(with)g(the)g(Program)g(\(or)g(with)g(a)g(work)g(based)g(on)g(the)h +(Program\))e(on)h(a)h(volume)e(of)177 2134 y(a)i(storage)e(or)h(distribution) +f(medium)g(does)h(not)g(bring)g(the)g(other)g(work)g(under)177 +2183 y(the)g(scope)g(of)g(this)g(License.)221 2283 y(3.)g(You)g(may)g(copy)g +(and)h(distribute)d(the)j(Program)e(\(or)h(a)h(work)f(based)f(on)i(it,)177 +2333 y(under)f(Section)f(2\))i(in)f(object)g(code)g(or)g(executable)f(form)h +(under)f(the)i(terms)e(of)177 2383 y(Sections)g(1)i(and)f(2)h(above)e +(provided)h(that)g(you)g(also)g(do)g(one)g(of)h(the)f(following:)264 +2482 y(a\))h(Accompany)e(it)h(with)g(the)g(complete)f(corresponding)f +(machine-readable)264 2532 y(source)i(code,)g(which)f(must)h(be)h +(distributed)d(under)i(the)g(terms)g(of)g(Sections)264 2582 +y(1)h(and)f(2)h(above)e(on)i(a)f(medium)g(customarily)e(used)i(for)h +(software)e(interchange;)f(or,)264 2682 y(b\))j(Accompany)e(it)h(with)g(a)h +(written)e(offer,)g(valid)h(for)g(at)h(least)f(three)264 2731 +y(years,)g(to)g(give)g(any)g(third)g(party,)g(for)g(a)g(charge)g(no)g(more)g +(than)g(your)264 2781 y(cost)g(of)h(physically)d(performing)h(source)h +(distribution,)e(a)i(complete)264 2831 y(machine-readable)e(copy)i(of)g(the)g +(corresponding)e(source)i(code,)g(to)g(be)1042 2940 y Fn(51)p +eop +%%Page: 52 53 +52 52 bop 264 42 a Fi(distributed)20 b(under)h(the)g(terms)g(of)g(Sections)f +(1)i(and)f(2)g(above)g(on)h(a)f(medium)264 91 y(customarily)f(used)h(for)g +(software)f(interchange;)f(or,)264 191 y(c\))j(Accompany)e(it)h(with)g(the)g +(information)f(you)h(received)f(as)h(to)h(the)f(offer)264 241 +y(to)h(distribute)d(corresponding)h(source)g(code.)43 b(\(This)20 +b(alternative)g(is)264 291 y(allowed)h(only)g(for)g(noncommercial)e +(distribution)g(and)i(only)g(if)h(you)264 340 y(received)e(the)i(program)e +(in)h(object)g(code)g(or)g(executable)f(form)h(with)g(such)264 +390 y(an)h(offer,)e(in)i(accord)e(with)h(Subsection)f(b)h(above.\))177 +490 y(The)g(source)g(code)g(for)g(a)h(work)f(means)f(the)i(preferred)d(form)i +(of)h(the)f(work)g(for)177 540 y(making)g(modifications)e(to)i(it.)43 +b(For)21 b(an)h(executable)d(work,)i(complete)f(source)177 +589 y(code)h(means)g(all)g(the)g(source)g(code)g(for)g(all)g(modules)f(it)i +(contains,)e(plus)h(any)177 639 y(associated)f(interface)g(definition)g +(files,)g(plus)h(the)g(scripts)g(used)g(to)177 689 y(control)g(compilation)e +(and)i(installation)f(of)h(the)g(executable.)41 b(However,)21 +b(as)g(a)177 739 y(special)g(exception,)e(the)i(source)g(code)g(distributed)e +(need)i(not)h(include)177 789 y(anything)e(that)h(is)h(normally)e +(distributed)f(\(in)i(either)g(source)g(or)g(binary)177 839 +y(form\))g(with)g(the)g(major)g(components)f(\(compiler,)f(kernel,)i(and)g +(so)g(on\))g(of)h(the)177 888 y(operating)e(system)h(on)g(which)g(the)g +(executable)f(runs,)g(unless)h(that)g(component)177 938 y(itself)g +(accompanies)e(the)i(executable.)177 1038 y(If)h(distribution)d(of)i +(executable)f(or)h(object)g(code)g(is)g(made)g(by)h(offering)177 +1088 y(access)f(to)g(copy)g(from)g(a)h(designated)d(place,)i(then)g(offering) +f(equivalent)177 1137 y(access)h(to)g(copy)g(the)g(source)g(code)g(from)g +(the)g(same)g(place)g(counts)f(as)177 1187 y(distribution)f(of)j(the)f +(source)g(code,)f(even)h(though)g(third)g(parties)f(are)h(not)177 +1237 y(compelled)f(to)h(copy)g(the)h(source)e(along)h(with)g(the)g(object)g +(code.)221 1337 y(4.)g(You)g(may)g(not)h(copy,)e(modify,)h(sublicense,)e(or)j +(distribute)d(the)j(Program)177 1386 y(except)f(as)g(expressly)f(provided)g +(under)h(this)g(License.)42 b(Any)21 b(attempt)177 1436 y(otherwise)f(to)h +(copy,)g(modify,)g(sublicense)e(or)j(distribute)d(the)j(Program)e(is)177 +1486 y(void,)h(and)g(will)g(automatically)e(terminate)h(your)h(rights)g +(under)f(this)h(License.)177 1536 y(However,)f(parties)h(who)g(have)g +(received)f(copies,)g(or)i(rights,)e(from)h(you)g(under)177 +1586 y(this)g(License)f(will)h(not)h(have)f(their)f(licenses)g(terminated)g +(so)i(long)f(as)g(such)177 1636 y(parties)g(remain)f(in)h(full)g(compliance.) +221 1735 y(5.)g(You)g(are)g(not)h(required)e(to)h(accept)g(this)g(License,)f +(since)h(you)g(have)g(not)177 1785 y(signed)g(it.)43 b(However,)20 +b(nothing)g(else)h(grants)g(you)g(permission)f(to)h(modify)g(or)177 +1835 y(distribute)f(the)h(Program)f(or)i(its)f(derivative)f(works.)42 +b(These)21 b(actions)f(are)177 1885 y(prohibited)g(by)h(law)g(if)h(you)f(do)g +(not)h(accept)e(this)h(License.)42 b(Therefore,)20 b(by)177 +1934 y(modifying)g(or)h(distributing)f(the)h(Program)f(\(or)h(any)h(work)f +(based)f(on)i(the)177 1984 y(Program\),)e(you)h(indicate)f(your)h(acceptance) +f(of)h(this)g(License)g(to)g(do)h(so,)f(and)177 2034 y(all)g(its)h(terms)e +(and)h(conditions)f(for)h(copying,)f(distributing)g(or)h(modifying)177 +2084 y(the)g(Program)g(or)g(works)g(based)g(on)g(it.)221 2183 +y(6.)g(Each)g(time)g(you)g(redistribute)f(the)h(Program)f(\(or)h(any)g(work)g +(based)g(on)h(the)177 2233 y(Program\),)e(the)h(recipient)f(automatically)f +(receives)h(a)i(license)e(from)h(the)177 2283 y(original)f(licensor)g(to)i +(copy,)f(distribute)e(or)j(modify)e(the)h(Program)g(subject)f(to)177 +2333 y(these)h(terms)g(and)g(conditions.)41 b(You)21 b(may)h(not)f(impose)f +(any)h(further)177 2383 y(restrictions)e(on)j(the)f(recipients')f(exercise)g +(of)h(the)g(rights)g(granted)f(herein.)177 2433 y(You)h(are)h(not)f +(responsible)e(for)i(enforcing)f(compliance)g(by)h(third)g(parties)g(to)177 +2482 y(this)g(License.)221 2582 y(7.)g(If,)g(as)h(a)f(consequence)f(of)h(a)h +(court)f(judgment)f(or)h(allegation)f(of)h(patent)177 2632 +y(infringement)e(or)j(for)f(any)g(other)g(reason)g(\(not)f(limited)h(to)g +(patent)g(issues\),)177 2682 y(conditions)f(are)h(imposed)f(on)i(you)f +(\(whether)f(by)h(court)g(order,)g(agreement)f(or)177 2731 +y(otherwise\))g(that)h(contradict)f(the)h(conditions)e(of)j(this)f(License,)f +(they)h(do)g(not)177 2781 y(excuse)g(you)g(from)g(the)g(conditions)f(of)h +(this)g(License.)42 b(If)21 b(you)h(cannot)177 2831 y(distribute)e(so)h(as)h +(to)f(satisfy)f(simultaneously)f(your)i(obligations)f(under)h(this)1042 +2940 y Fn(52)p eop +%%Page: 53 54 +53 53 bop 177 42 a Fi(License)21 b(and)g(any)g(other)g(pertinent)f +(obligations,)f(then)i(as)g(a)h(consequence)d(you)177 91 y(may)i(not)h +(distribute)d(the)i(Program)g(at)g(all.)43 b(For)21 b(example,)f(if)i(a)f +(patent)177 141 y(license)g(would)f(not)h(permit)g(royalty-free)e +(redistribution)g(of)j(the)f(Program)f(by)177 191 y(all)h(those)g(who)g +(receive)g(copies)f(directly)g(or)i(indirectly)d(through)i(you,)g(then)177 +241 y(the)g(only)g(way)g(you)h(could)e(satisfy)h(both)g(it)g(and)g(this)g +(License)g(would)f(be)i(to)177 291 y(refrain)f(entirely)f(from)h +(distribution)e(of)i(the)g(Program.)177 390 y(If)h(any)f(portion)f(of)h(this) +g(section)g(is)g(held)g(invalid)f(or)i(unenforceable)d(under)177 +440 y(any)i(particular)f(circumstance,)f(the)i(balance)g(of)g(the)g(section)g +(is)g(intended)f(to)177 490 y(apply)h(and)g(the)g(section)g(as)g(a)h(whole)e +(is)i(intended)e(to)h(apply)g(in)g(other)177 540 y(circumstances.)177 +639 y(It)h(is)f(not)g(the)g(purpose)g(of)g(this)g(section)f(to)i(induce)e +(you)h(to)h(infringe)e(any)177 689 y(patents)h(or)g(other)g(property)f(right) +h(claims)f(or)h(to)h(contest)e(validity)g(of)i(any)177 739 +y(such)f(claims;)f(this)h(section)g(has)g(the)g(sole)g(purpose)f(of)i +(protecting)e(the)177 789 y(integrity)g(of)h(the)h(free)f(software)f +(distribution)f(system,)h(which)h(is)177 839 y(implemented)f(by)h(public)g +(license)f(practices.)41 b(Many)21 b(people)g(have)g(made)177 +888 y(generous)f(contributions)f(to)j(the)f(wide)g(range)g(of)g(software)f +(distributed)177 938 y(through)h(that)f(system)h(in)g(reliance)g(on)g +(consistent)f(application)f(of)j(that)177 988 y(system;)f(it)g(is)g(up)h(to)f +(the)g(author/donor)f(to)h(decide)f(if)i(he)f(or)h(she)f(is)g(willing)177 +1038 y(to)h(distribute)d(software)h(through)h(any)g(other)g(system)f(and)h(a) +h(licensee)e(cannot)177 1088 y(impose)h(that)g(choice.)177 +1187 y(This)g(section)f(is)i(intended)e(to)h(make)g(thoroughly)f(clear)h +(what)g(is)g(believed)f(to)177 1237 y(be)i(a)f(consequence)f(of)h(the)g(rest) +g(of)h(this)f(License.)221 1337 y(8.)g(If)h(the)f(distribution)e(and/or)i +(use)g(of)g(the)g(Program)g(is)g(restricted)f(in)177 1386 y(certain)h +(countries)e(either)i(by)g(patents)g(or)g(by)g(copyrighted)f(interfaces,)g +(the)177 1436 y(original)g(copyright)g(holder)h(who)g(places)g(the)g(Program) +f(under)h(this)g(License)177 1486 y(may)g(add)h(an)f(explicit)f(geographical) +f(distribution)h(limitation)f(excluding)177 1536 y(those)i(countries,)f(so)h +(that)g(distribution)e(is)j(permitted)e(only)h(in)g(or)g(among)177 +1586 y(countries)f(not)h(thus)g(excluded.)42 b(In)21 b(such)g(case,)g(this)g +(License)f(incorporates)177 1636 y(the)h(limitation)f(as)h(if)h(written)e(in) +i(the)f(body)g(of)g(this)g(License.)221 1735 y(9.)g(The)g(Free)g(Software)f +(Foundation)g(may)h(publish)g(revised)f(and/or)h(new)g(versions)177 +1785 y(of)h(the)f(General)f(Public)h(License)f(from)h(time)g(to)g(time.)43 +b(Such)21 b(new)g(versions)f(will)177 1835 y(be)i(similar)e(in)h(spirit)g(to) +g(the)g(present)g(version,)f(but)h(may)g(differ)g(in)g(detail)g(to)177 +1885 y(address)g(new)g(problems)f(or)h(concerns.)177 1984 y(Each)g(version)f +(is)i(given)f(a)g(distinguishing)e(version)h(number.)43 b(If)21 +b(the)g(Program)177 2034 y(specifies)f(a)i(version)e(number)h(of)g(this)g +(License)f(which)h(applies)f(to)i(it)f(and)g("any)177 2084 +y(later)g(version",)f(you)h(have)g(the)g(option)g(of)g(following)f(the)h +(terms)g(and)g(conditions)177 2134 y(either)g(of)g(that)g(version)f(or)i(of)f +(any)g(later)g(version)f(published)g(by)i(the)f(Free)177 2183 +y(Software)f(Foundation.)42 b(If)21 b(the)g(Program)g(does)f(not)i(specify)e +(a)i(version)e(number)g(of)177 2233 y(this)h(License,)f(you)h(may)h(choose)e +(any)h(version)g(ever)g(published)f(by)h(the)g(Free)g(Software)177 +2283 y(Foundation.)221 2383 y(10.)g(If)g(you)g(wish)g(to)h(incorporate)d +(parts)i(of)g(the)h(Program)e(into)h(other)g(free)177 2433 +y(programs)f(whose)h(distribution)e(conditions)h(are)h(different,)f(write)h +(to)g(the)g(author)177 2482 y(to)h(ask)f(for)g(permission.)41 +b(For)21 b(software)g(which)f(is)i(copyrighted)d(by)j(the)f(Free)177 +2532 y(Software)f(Foundation,)g(write)h(to)g(the)g(Free)g(Software)f +(Foundation;)g(we)h(sometimes)177 2582 y(make)g(exceptions)f(for)h(this.)43 +b(Our)21 b(decision)f(will)h(be)g(guided)g(by)g(the)g(two)h(goals)177 +2632 y(of)g(preserving)d(the)i(free)g(status)g(of)g(all)h(derivatives)d(of)i +(our)h(free)f(software)f(and)177 2682 y(of)i(promoting)d(the)j(sharing)e(and) +h(reuse)g(of)g(software)f(generally.)264 2781 y(NO)i(WARRANTY)1042 +2940 y Fn(53)p eop +%%Page: 54 55 +54 54 bop 221 42 a Fi(11.)21 b(BECAUSE)f(THE)h(PROGRAM)g(IS)g(LICENSED)f +(FREE)h(OF)h(CHARGE,)e(THERE)h(IS)g(NO)h(WARRANTY)177 91 y(FOR)f(THE)h +(PROGRAM,)e(TO)h(THE)g(EXTENT)g(PERMITTED)f(BY)h(APPLICABLE)f(LAW.)43 +b(EXCEPT)20 b(WHEN)177 141 y(OTHERWISE)g(STATED)h(IN)g(WRITING)f(THE)i +(COPYRIGHT)d(HOLDERS)i(AND/OR)f(OTHER)h(PARTIES)177 191 y(PROVIDE)g(THE)g +(PROGRAM)f("AS)h(IS")g(WITHOUT)g(WARRANTY)f(OF)h(ANY)g(KIND,)g(EITHER)g +(EXPRESSED)177 241 y(OR)h(IMPLIED,)e(INCLUDING,)f(BUT)j(NOT)f(LIMITED)f(TO,)h +(THE)g(IMPLIED)g(WARRANTIES)f(OF)177 291 y(MERCHANTABILITY)f(AND)i(FITNESS)f +(FOR)i(A)f(PARTICULAR)f(PURPOSE.)42 b(THE)21 b(ENTIRE)g(RISK)f(AS)177 +340 y(TO)i(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)177 390 y(PROGRAM)h(PROVE)f(DEFECTIVE,)g +(YOU)h(ASSUME)g(THE)g(COST)g(OF)g(ALL)g(NECESSARY)f(SERVICING,)177 +440 y(REPAIR)h(OR)g(CORRECTION.)221 540 y(12.)g(IN)g(NO)h(EVENT)e(UNLESS)h +(REQUIRED)f(BY)i(APPLICABLE)d(LAW)i(OR)h(AGREED)e(TO)i(IN)f(WRITING)177 +589 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)177 639 y(REDISTRIBUTE)e(THE)j(PROGRAM)e(AS)h +(PERMITTED)f(ABOVE,)h(BE)g(LIABLE)g(TO)g(YOU)g(FOR)h(DAMAGES,)177 +689 y(INCLUDING)e(ANY)h(GENERAL,)f(SPECIAL,)h(INCIDENTAL)e(OR)j +(CONSEQUENTIAL)d(DAMAGES)h(ARISING)177 739 y(OUT)h(OF)h(THE)f(USE)g(OR)g +(INABILITY)f(TO)i(USE)f(THE)g(PROGRAM)f(\(INCLUDING)g(BUT)h(NOT)h(LIMITED)177 +789 y(TO)g(LOSS)f(OF)g(DATA)g(OR)g(DATA)g(BEING)g(RENDERED)f(INACCURATE)g(OR) +h(LOSSES)g(SUSTAINED)f(BY)177 839 y(YOU)h(OR)h(THIRD)e(PARTIES)h(OR)g(A)h +(FAILURE)e(OF)i(THE)f(PROGRAM)f(TO)h(OPERATE)g(WITH)g(ANY)g(OTHER)177 +888 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)177 938 y(POSSIBILITY)e(OF)h(SUCH)g(DAMAGES.)286 +1038 y(END)g(OF)h(TERMS)e(AND)i(CONDITIONS)177 1137 y(Appendix:)e(How)h(to)h +(Apply)e(These)h(Terms)g(to)g(Your)g(New)g(Programs)221 1237 +y(If)g(you)g(develop)g(a)g(new)g(program,)g(and)g(you)g(want)g(it)g(to)h(be)f +(of)g(the)h(greatest)177 1287 y(possible)e(use)h(to)h(the)f(public,)f(the)i +(best)f(way)g(to)g(achieve)f(this)h(is)h(to)f(make)g(it)177 +1337 y(free)g(software)f(which)h(everyone)f(can)h(redistribute)f(and)h +(change)f(under)h(these)g(terms.)221 1436 y(To)g(do)h(so,)f(attach)f(the)h +(following)f(notices)h(to)g(the)g(program.)42 b(It)22 b(is)f(safest)177 +1486 y(to)h(attach)e(them)h(to)g(the)h(start)e(of)i(each)f(source)f(file)h +(to)h(most)f(effectively)177 1536 y(convey)g(the)g(exclusion)f(of)h +(warranty;)f(and)h(each)g(file)g(should)g(have)g(at)g(least)177 +1586 y(the)g("copyright")f(line)h(and)g(a)h(pointer)e(to)h(where)g(the)g +(full)g(notice)g(is)g(found.)264 1685 y()264 +1735 y(Copyright)f(\(C\))h(19yy)43 b()264 +1835 y(This)g(program)g(is)g(free)g(software;)f(you)h(can)g(redistribute)f +(it)h(and/or)g(modify)264 1885 y(it)h(under)e(the)i(terms)e(of)i(the)f(GNU)g +(General)f(Public)h(License)f(as)i(published)e(by)264 1934 +y(the)i(Free)e(Software)h(Foundation;)e(either)i(version)f(2)i(of)f(the)g +(License,)f(or)264 1984 y(\(at)i(your)e(option\))h(any)g(later)g(version.)264 +2084 y(This)g(program)g(is)g(distributed)f(in)h(the)g(hope)g(that)g(it)g +(will)g(be)h(useful,)264 2134 y(but)g(WITHOUT)e(ANY)h(WARRANTY;)f(without)g +(even)h(the)g(implied)g(warranty)f(of)264 2183 y(MERCHANTABILITY)f(or)i +(FITNESS)g(FOR)g(A)h(PARTICULAR)d(PURPOSE.)42 b(See)21 b(the)264 +2233 y(GNU)h(General)e(Public)g(License)h(for)g(more)g(details.)264 +2333 y(You)h(should)e(have)h(received)f(a)i(copy)f(of)g(the)g(GNU)g(General)g +(Public)f(License)264 2383 y(along)h(with)g(this)g(program;)f(if)i(not,)f +(write)f(to)i(the)f(Free)g(Software)264 2433 y(Foundation,)f(Inc.,)h(675)g +(Mass)g(Ave,)g(Cambridge,)e(MA)j(02139,)e(USA.)177 2532 y(Also)h(add)g +(information)f(on)h(how)g(to)h(contact)e(you)h(by)h(electronic)d(and)j(paper) +e(mail.)177 2632 y(If)i(the)f(program)f(is)h(interactive,)f(make)h(it)g +(output)g(a)g(short)g(notice)g(like)g(this)177 2682 y(when)g(it)h(starts)e +(in)h(an)h(interactive)d(mode:)264 2781 y(Gnomovision)h(version)g(69,)h +(Copyright)f(\(C\))h(19yy)g(name)g(of)h(author)264 2831 y(Gnomovision)e +(comes)h(with)g(ABSOLUTELY)e(NO)j(WARRANTY;)e(for)h(details)1042 +2940 y Fn(54)p eop +%%Page: 55 56 +55 55 bop 264 42 a Fi(type)21 b(`show)g(w'.)264 91 y(This)g(is)h(free)f +(software,)f(and)h(you)g(are)g(welcome)f(to)i(redistribute)d(it)264 +141 y(under)i(certain)f(conditions;)g(type)h(`show)g(c')g(for)g(details.)177 +241 y(The)g(hypothetical)f(commands)g(`show)h(w')g(and)g(`show)g(c')g(should) +g(show)g(the)g(appropriate)177 291 y(parts)g(of)g(the)g(General)g(Public)f +(License.)42 b(Of)22 b(course,)e(the)h(commands)f(you)i(use)f(may)177 +340 y(be)h(called)e(something)g(other)h(than)g(`show)g(w')g(and)g(`show)g +(c';)g(they)g(could)g(even)g(be)177 390 y(mouse-clicks)e(or)j(menu)f +(items--whatever)e(suits)h(your)h(program.)177 490 y(You)g(should)g(also)g +(get)g(your)g(employer)f(\(if)h(you)g(work)g(as)h(a)f(programmer\))f(or)h +(your)177 540 y(school,)g(if)g(any,)g(to)g(sign)g(a)h("copyright)e +(disclaimer")f(for)i(the)g(program,)g(if)177 589 y(necessary.)42 +b(Here)21 b(is)g(a)h(sample;)e(alter)h(the)g(names:)221 689 +y(Yoyodyne,)f(Inc.,)g(hereby)h(disclaims)f(all)h(copyright)f(interest)g(in)i +(the)f(program)221 739 y(`Gnomovision')e(\(which)h(makes)h(passes)g(at)g +(compilers\))f(written)g(by)i(James)e(Hacker.)221 839 y(,)g(1)g(April)g(1989)221 888 y(Ty)g(Coon,)g(President)f(of)h(Vice)177 +988 y(This)g(General)f(Public)h(License)f(does)h(not)h(permit)e +(incorporating)f(your)i(program)f(into)177 1038 y(proprietary)g(programs.)41 +b(If)22 b(your)f(program)f(is)h(a)h(subroutine)e(library,)g(you)h(may)177 +1088 y(consider)f(it)i(more)f(useful)f(to)i(permit)e(linking)g(proprietary)g +(applications)f(with)i(the)177 1137 y(library.)42 b(If)21 b(this)g(is)h(what) +f(you)g(want)g(to)g(do,)g(use)h(the)f(GNU)g(Library)f(General)177 +1187 y(Public)h(License)f(instead)g(of)i(this)f(License.)p +177 1280 1772 2 v 1042 2940 a Fn(55)p eop +%%Page: 56 57 +56 56 bop 1042 2940 a Fn(56)p eop +%%Page: 57 58 +57 57 bop 177 378 a Ff(App)s(endix)34 b(B)177 610 y Fl(References)177 +851 y Fk([ANSI])21 b Fn(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 Fk([Ben)o(tley86])h +Fn(Ben)o(tley)i(J.,)g(\\Programmi)o(ng)d(P)o(earls:)22 b(Literate)16 +b(Programming",)c Fh(Communic)n(ations)17 b(of)g(the)177 1075 +y(A)o(CM)p Fn(,)c(V)m(ol.)g(29,)f(No.)i(5,)f(pp.)g(364{369,)f(1986.)177 +1150 y Fk([Hoare80])f Fn(Hoare)f(C.A.R.,)f(\\The)h(Emp)q(eror's)g(Old)g +(Clothes",)g(T)m(uring)g(Aw)o(ard)g(Lecture,)i(1980,)e(from)e(\\A)o(CM)177 +1200 y(T)m(uring)15 b(Aw)o(ard)g(Lectures:)24 b(The)16 b(First)f(Tw)o(en)o(t) +o(y)h(Y)m(ears)g(1966{1985",)d(A)o(CM)i(Press,)i(New)g(Y)m(ork,)e(\(ISBN:)g +(0-)177 1249 y(201-07794-9\),)c(1987)i(\(see)i(p.)f(155\).)177 +1324 y Fk([Horton90])f Fn(Horton)h(M.R.,)e(\\P)o(ortable)i(C)g(Soft)o(w)o +(are",)e(Pren)o(tice)k(Hall,)c(\(ISBN:)i(0-13-868050-7\),)d(1990.)177 +1399 y Fk([Kernighan88])k Fn(Kernighan)i(B.W.,)g(Ritc)o(hie)f(D.M.,)g(\\The)h +(C)g(Programming)c(Language",)k(\(second)h(edi-)177 1449 y(tion,\\ANSI)13 +b(C"\),)g(Pren)o(tice)j(Hall,)c(\(ISBN:)i(0-13-110362-8\),)d(1988.)177 +1523 y Fk([Kn)o(uth83])j Fn(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 +1573 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 1648 y Fk([Kn)o(uth84])f Fn(Kn)o(uth)j(D.E.,)d +(\\The)i(T)767 1657 y(E)790 1648 y(Xb)q(o)q(ok",)f(Addison-W)m(esley)m(,)g +(\(ISBN:)h(0-201-13448-9\),)d(1984.)177 1723 y Fk([Lamp)q(ort86])k +Fn(Lamp)q(ort)h(L.,)g(\\L)723 1718 y Fg(a)742 1723 y Fn(T)765 +1735 y(E)788 1723 y(X:)g(A)g(Do)q(cumen)o(t)g(Preparation)h(System",)f +(Addison-W)m(esley)m(,)g(\(ISBN:)177 1773 y(0-201-15790-X\),)11 +b(1986.)177 1847 y Fk([Rabino)o(witz90])k Fn(Rabino)o(witz)h(H.,)h(Sc)o(haap) +g(C.,)h(\\P)o(ortable)f(C",)f(Pren)o(tice)j(Hall,)d(\(ISBN:0-13-685967-4\)) +177 1897 y(1990.)177 1972 y Fk([Ramsey89])22 b Fn(Ramsey)f(N.,)j(\\W)m(ea)o +(ving)d(a)h(Language-Indep)q(enden)o(t)h(WEB",)f Fh(Communic)n(ations)h(of)g +(the)177 2022 y(A)o(CM)p Fn(,)13 b(V)m(ol.)g(32,)f(No.)i(9,)f(pp.)g +(1051{1055,)e(1989.)177 2096 y Fk([T)l(arjan72])16 b Fn(T)m(arjan)f(R.E.,)h +(\\Depth-First)g(Searc)o(h)i(and)e(Linear)g(Graph)g(Algorithms",)e +Fh(SIAM)k(Journal)f(of)177 2146 y(Computing)p Fn(,)d(V)m(ol.)e(1,)h(No.)h(2,) +f(pp.)g(146{160,)f(June)j(1972.)177 2221 y Fk([USDOD83])i Fn(\\The)i +(Programming)c(Language)j(Ada)g(Reference)i(Man)o(ual",)e(American)g +(National)f(Stan-)177 2271 y(dards)e(Institute)f(Inc,)g +(ANSI/MIL-STD-1815A-1983,)d(1983.)1042 2940 y(57)p eop +%%Page: 58 59 +58 58 bop 177 279 a Fl(Index)177 487 y Fn(.cld)14 b(\014le)f(18)177 +537 y(==)i(14)177 587 y(@M)f(23)177 637 y(@Z)h(23)177 687 y(abbreviations)f +(iden)o(ti\014er)g(28)177 737 y(ac)o(kno)o(wledgemen)o(ts)f(7)177 +787 y(Ada)h(18)177 837 y(Ada)g(27)177 886 y(Ada)g(7)177 936 +y(adding)f(features)i(36)177 986 y(Adelaide)f(Univ)o(ersit)o(y)g(27)177 +1036 y(analyser)g(45)177 1086 y(Andrew)h(T)m(rev)o(orro)o(w)f(9)177 +1136 y(ANSI)g(28)177 1186 y(ANSI)g(57)177 1236 y(an)o(tiquated)g(features)h +(43)177 1286 y(ASCI)q(I)f(mnemonics)e(45)177 1336 y(asking)h(for)h(trouble)g +(28)177 1386 y(authorit)o(y)f(design)i(36)177 1436 y(authorit)o(y)e(securit)o +(y)i(36)177 1486 y(a)o(v)n(ailabilit)o(y)10 b(program)j(37)177 +1536 y(bac)o(kw)o(ards)h(compatibilit)o(y)d(11)177 1586 y(Barry)k(Dwy)o(er)f +(7)177 1636 y(Begg)g(Jerem)o(y)g(7)177 1686 y(Ben)o(tley)h(Jon)f(11)177 +1736 y(Ben)o(tley86)g(11)177 1786 y(Ben)o(tley86)g(57)177 1836 +y(blank)f(inden)o(tation)h(12)177 1886 y(blank)f(inden)o(tation)h(12)177 +1935 y(break)o(out,)g(GNU)f(41)177 1985 y(Brissenden)j(Roger)e(7)177 +2035 y(c)o(hanges)h(dangers)f(35)177 2085 y(co)q(ding)g(st)o(yle)g(28)177 +2135 y(command)d(in)o(terface)k(43)177 2185 y(command)c(in)o(terpreter)16 +b(43)177 2235 y(command)11 b(line)j(in)o(terface)g(design)g(goals)f(19)177 +2285 y(command)e(line)j(in)o(terface)g(18)177 2335 y(command)d(setall)j(43) +177 2385 y(commen)o(t)e(duplication)h(18)177 2435 y(Comm)o(unicati)o(ons)e +(of)j(the)g(A)o(CM)g(11)177 2485 y(compatibilit)o(y)d(bac)o(kw)o(ards)j(11) +177 2535 y(compiler)f(ThinkC)g(30)177 2585 y(compiler)g(35)177 +2635 y(conditionals)g(44)177 2685 y(con)o(tiguous)h(memory)d(45)177 +2735 y(cop)o(yrigh)o(t)j(la)o(w)f(38)177 2785 y(cop)o(yrigh)o(t)h(notice)g(1) +177 2835 y(cop)o(yrigh)o(t)g(38)1136 487 y(correctness)i(47)1136 +537 y(coun)o(ting)d(diagnostic)g(43)1136 587 y(cross)i(references)h(46)1136 +637 y(dangers)e(c)o(hanges)h(35)1136 687 y(dangers)f(inden)o(tation)f(13)1136 +737 y(dangers)h(languages)g(35)1136 787 y(Da)o(vid)e(Hulse)j(27)1136 +837 y(Da)o(vid)d(Hulse)j(7)1136 886 y(DCL)e(13)1136 936 y(deriv)o(ed)h(w)o +(ork)g(38)1136 986 y(design)g(authorit)o(y)f(36)1136 1036 y(design)h(F)m +(unnelW)m(eb)f(11)1136 1086 y(design)h(goals)f(command)e(line)i(in)o(terface) +i(19)1136 1136 y(design)f(language)f(44)1136 1186 y(detection)i(recursion)g +(45)1136 1236 y(diagnostic)e(coun)o(ting)g(43)1136 1286 y(diagnostic)g +(messages)h(25)1136 1336 y(diagnostics)f(47)1136 1386 y(do)q(cumen)o(t)g +(structure)j(macro)d(structure)j(23)1136 1436 y(do)q(cumen)o(t)d(structure)j +(16)1136 1486 y(do)q(cumen)o(t)d(structure)j(23)1136 1536 y(do)q(cumen)o +(tation)c(out)i(of)f(date)i(18)1136 1586 y(do)q(cumen)o(tation)d(43)1136 +1636 y(Donald)g(Kn)o(uth)j(11)1136 1686 y(Donald)d(Kn)o(uth)j(7)1136 +1736 y(duplication)d(commen)o(t)g(18)1136 1786 y(Dwy)o(er)i(Barry)g(7)1136 +1836 y(e\016ciency)g(47)1136 1886 y(EOL)g(represen)o(tation)h(45)1136 +1935 y(example)d(o\016cial)h(43)1136 1985 y(extensions)i(\014lename)d(20)1136 +2035 y(factor)i(glue)f(46)1136 2085 y(features)i(adding)e(36)1136 +2135 y(features)i(an)o(tiquated)e(43)1136 2185 y(features)i(mo)q +(di\014cation)c(35)1136 2235 y(features)k(remo)o(ving)d(35)1136 +2285 y(\014le)i(.cld)f(18)1136 2335 y(\014le)h(extension)g(protection)h(37) +1136 2385 y(\014le)f(mark)o(ers)f(44)1136 2435 y(\014le)h(names)f(19)1136 +2485 y(\014le)h(names)f(21)1136 2535 y(\014le)h(signature)g(44)1136 +2585 y(\014lename)e(extensions)j(20)1136 2635 y(\014lename)d(inheritance)j +(20)1136 2685 y(\014lenames)e(length)h(29)1136 2735 y(\014lenames)f(p)q +(ortable)h(21)1136 2785 y(formal)d(parameter)j(list)f(44)1136 +2835 y(F)m(unnelW)m(eb)g(design)h(11)1042 2940 y(58)p eop +%%Page: 59 60 +59 59 bop 177 42 a Fn(F)m(unnelW)m(eb)14 b(future)g(43)177 +91 y(F)m(unnelW)m(eb)g(history)f(27)177 141 y(F)m(unnelW)m(eb)h(implem)o(en)o +(tation)d(27)177 191 y(F)m(unnelW)m(eb)j(managem)o(en)o(t)e(39)177 +241 y(F)m(unnelW)m(eb)i(mo)q(di\014cation)d(35)177 291 y(F)m(unnelW)m(eb)j +(motiv)n(atio)o(n)d(11)177 341 y(F)m(unnelW)m(eb)j(o\016cial)e(39)177 +391 y(F)m(unnelW)m(eb)i(past)g(use)g(27)177 441 y(F)m(unnelW)m(eb)g +(protection)g(37)177 490 y(F)m(unnelW)m(eb)g(syn)o(tax)f(14)177 +540 y(F)m(unnelW)m(eb)h(V1)f(11)177 590 y(F)m(unnelW)m(eb)h(v)o(ersion)g(1)f +(27)177 640 y(F)m(unnelW)m(eb)h(v)o(ersion)g(2)f(27)177 690 +y(F)m(unnelW)m(eb)h(v)o(ersion)g(3)f(27)177 740 y(F)m(unnelW)m(eb)h(writing)f +(itself)g(28)177 790 y(future)i(F)m(unnelW)m(eb)e(43)177 840 +y(genealogy)g(program)g(36)177 889 y(generic)i(t)o(yp)q(esetter)h(46)177 +939 y(glue)e(factor)g(46)177 989 y(GNU)g(break)o(out)g(41)177 +1039 y(GNU)g(license)h(35)177 1089 y(GNU)f(license)h(39)177 +1139 y(GNU)f(License)h(49)177 1189 y(GNU)f(v)o(ersion)g(41)177 +1239 y(Hac)o(k)o(ett)h(Simon)d(7)177 1288 y(headings)i(16)177 +1338 y(heap)g(memory)e(29)177 1388 y(hierarc)o(hical)i(structure)i(23)177 +1438 y(history)e(F)m(unnelW)m(eb)f(27)177 1488 y(Hoare80)h(36)177 +1538 y(Hoare80)g(57)177 1588 y(Horton90)g(28)177 1638 y(Horton90)g(57)177 +1687 y(Hulse)h(Da)o(vid)d(27)177 1737 y(Hulse)j(Da)o(vid)d(7)177 +1787 y(iden)o(ti\014er)i(abbreviations)g(28)177 1837 y(iden)o(ti\014er)g(28) +177 1887 y(implemen)o(tation)d(F)m(unnelW)m(eb)i(27)177 1937 +y(include)h(\014le)g(suppression)h(46)177 1987 y(inden)o(tation)e(blank)h(12) +177 2037 y(inden)o(tation)f(dangers)i(13)177 2086 y(inden)o(tation)e(no)h(12) +177 2136 y(inden)o(tation)f(text)i(12)177 2186 y(inden)o(tation)e(text)i(30) +177 2236 y(inden)o(tation)e(text)i(45)177 2286 y(inden)o(tation)e(12)177 +2336 y(inden)o(tation)g(12)177 2386 y(inden)o(ted)i(macro)d(call)h(12)177 +2436 y(index)h(program)e(43)177 2486 y(inheritance)j(\014lename)d(20)177 +2535 y(in)o(terface)j(command)c(line)i(18)177 2585 y(in)o(terface)i(command)c +(43)177 2635 y(in)o(terpreter)16 b(command)11 b(43)177 2685 +y(in)o(terpreter)16 b(shell)e(43)177 2735 y(in)o(v)o(o)q(cations)f(n)o(um)o +(b)q(er)g(22)177 2785 y(issues)i(miscellaneous)e(18)177 2835 +y(Jerem)o(y)h(Begg)g(7)1136 42 y(Jon)g(Ben)o(tley)g(11)1136 +91 y(Kernighan88)f(28)1136 141 y(Kernighan88)g(57)1136 191 +y(Kn)o(uth)h(Donald)f(11)1136 241 y(Kn)o(uth)h(Donald)f(7)1136 +291 y(Kn)o(uth83)g(11)1136 341 y(Kn)o(uth83)g(57)1136 391 y(Kn)o(uth84)g(57) +1136 441 y(Kn)o(uth84)g(9)1136 490 y(Lamp)q(ort86)f(57)1136 +540 y(Lamp)q(ort86)g(9)1136 590 y(language)h(design)h(44)1136 +640 y(languages)f(dangers)i(35)1136 690 y(LaT)m(eX)e(9)1136 +740 y(LaT)m(eX)g(9)1136 790 y(la)o(w)g(cop)o(yrigh)o(t)g(38)1136 +840 y(leak)n(age)g(memory)e(30)1136 889 y(length)i(\014lenames)h(29)1136 +939 y(license)g(GNU)g(35)1136 989 y(license)g(GNU)g(39)1136 +1039 y(License)h(GNU)e(49)1136 1089 y(license)h(38)1136 1139 +y(lister)g(46)1136 1189 y(Macin)o(tosh)g(29)1136 1239 y(Macin)o(tosh)g(30) +1136 1288 y(Macin)o(tosh)g(9)1136 1338 y(macro)e(call)h(syn)o(tax)h(16)1136 +1388 y(macro)e(de\014nition)i(syn)o(tax)g(14)1136 1438 y(macro)e(structure)k +(do)q(cumen)o(t)e(structure)i(23)1136 1488 y(macro)c(structure)k(23)1136 +1538 y(mak)o(e)c(44)1136 1588 y(mallo)q(c)f(29)1136 1638 y(managemen)o(t)g(F) +m(unnelW)m(eb)i(39)1136 1687 y(man)o(uals)e(mo)q(difying)g(38)1136 +1737 y(mapp)q(er)i(44)1136 1787 y(mark)o(ers)g(\014le)h(44)1136 +1837 y(memory)d(con)o(tiguous)j(45)1136 1887 y(memory)d(heap)j(29)1136 +1937 y(memory)d(leak)n(age)i(30)1136 1987 y(memory)e(pac)o(k)n(age)j(29)1136 +2037 y(memory)d(stac)o(k)j(30)1136 2086 y(memory)d(static)j(30)1136 +2136 y(memory)d(use)k(of)e(29)1136 2186 y(messages)h(diagnostic)f(25)1136 +2236 y(miscellaneous)f(issues)j(18)1136 2286 y(mnemonics)c(ASCI)q(I)j(45)1136 +2336 y(mo)q(di\014cation)d(features)k(35)1136 2386 y(mo)q(di\014cation)c(F)m +(unnelW)m(eb)j(35)1136 2436 y(mo)q(difying)d(man)o(uals)g(38)1136 +2486 y(motiv)n(atio)o(n)g(F)m(unnelW)m(eb)j(11)1136 2535 y(MSDOS)g(29)1136 +2585 y(names)f(\014le)h(19)1136 2635 y(names)f(\014le)h(21)1136 +2685 y(naming)d(p)q(oin)o(ters)k(29)1136 2735 y(naming)c(t)o(yp)q(es)k(29) +1136 2785 y(no)e(inden)o(tation)h(12)1136 2835 y(no)f(inden)o(tation)h(12) +1042 2940 y(59)p eop +%%Page: 60 61 +60 60 bop 177 42 a Fn(notice)14 b(cop)o(yrigh)o(t)g(1)177 91 +y(n)o(um)o(b)q(er)f(in)o(v)o(o)q(cations)g(22)177 141 y(n)o(um)o(b)q(er)g +(output)h(\014les)h(12)177 191 y(n)o(um)o(b)q(ering)e(section)h(23)177 +241 y(Occam's)f(razor)i(12)177 291 y(o\016cial)e(example)f(43)177 +341 y(o\016cial)h(F)m(unnelW)m(eb)g(39)177 391 y(options)h(43)177 +441 y(out)g(of)f(date)h(do)q(cumen)o(tation)f(18)177 490 y(output)h(\014les)g +(n)o(um)o(b)q(er)g(12)177 540 y(OzT)m(eX)h(9)177 590 y(pac)o(k)n(age)f +(memory)d(29)177 640 y(parameter)j(list)f(formal)f(44)177 690 +y(parameterized)i(macro)f(call)g(syn)o(tax)h(16)177 740 y(parameterized)g +(macro)f(de\014nitions)h(syn)o(tax)g(15)177 790 y(parser)h(45)177 +840 y(P)o(ascal)f(12)177 889 y(past)g(use)h(F)m(unnelW)m(eb)e(27)177 +939 y(Ph.D.)g(27)177 989 y(p)q(oin)o(ters)i(naming)c(29)177 +1039 y(p)q(ortabilit)o(y)i(28)177 1089 y(p)q(ortable)h(\014lenames)f(21)177 +1139 y(pragma)f(syn)o(tax)i(44)177 1189 y(pragma)e(v)o(ersion)i(45)177 +1239 y(preface)h(5)177 1288 y(presen)o(tation)g(notes)g(9)177 +1338 y(program)d(a)o(v)n(ailabilit)o(y)f(37)177 1388 y(program)h(genealogy)i +(36)177 1438 y(program)e(index)i(43)177 1488 y(programming)c(p)q(earls)15 +b(11)177 1538 y(protection)g(\014le)e(extension)i(37)177 1588 +y(protection)g(F)m(unnelW)m(eb)e(37)177 1638 y(Rabino)o(witz90)f(28)177 +1687 y(Rabino)o(witz90)g(28)177 1737 y(Rabino)o(witz90)g(57)177 +1787 y(Ramsey89)g(46)177 1837 y(Ramsey89)g(57)177 1887 y(recursion)j +(detection)g(45)177 1937 y(recursion)g(test)g(43)177 1987 y(references)i +(cross)e(46)177 2037 y(references)i(57)177 2086 y(regression)e(testing)g(18) +177 2136 y(remo)o(ving)d(features)j(35)177 2186 y(represen)o(tation)h(EOL)e +(45)177 2236 y(Rob)q(ert)g(Endre)h(T)m(arjan)e(45)177 2286 +y(Roger)h(Brissenden)i(7)177 2336 y(Ross)e(William)o(s)d(1)177 +2386 y(scanner)k(44)177 2436 y(section)g(n)o(um)o(b)q(ering)d(23)177 +2486 y(section)j(syn)o(tax)f(44)177 2535 y(sections)h(16)177 +2585 y(securit)o(y)g(authorit)o(y)e(36)177 2635 y(setall)h(command)d(43)177 +2685 y(shell)j(in)o(terpreter)i(43)177 2735 y(signature)e(\014le)g(44)177 +2785 y(Simon)e(Hac)o(k)o(ett)j(7)177 2835 y(size)g(stac)o(k)f(30)1136 +42 y(South)d(Australian)f(Go)o(v)o(ernmen)o(t)g(Departmen)o(t)g(of)1302 +91 y(Lands)k(28)1136 141 y(sp)q(eed)h(47)1136 191 y(spider)f(46)1136 +241 y(stac)o(k)g(memory)d(30)1136 291 y(stac)o(k)j(size)h(30)1136 +341 y(static)f(memory)d(30)1136 391 y(static)j(v)n(ariables)f(30)1136 +440 y(strength)i(t)o(yp)q(esetting)g(46)1136 490 y(structure)h(do)q(cumen)o +(t)d(16)1136 540 y(structure)j(do)q(cumen)o(t)d(23)1136 590 +y(structure)j(hierarc)o(hical)d(23)1136 640 y(structure)j(macro)c(23)1136 +690 y(st)o(yle)i(co)q(ding)f(28)1136 740 y(suite)h(test)h(47)1136 +790 y(suppression)g(include)f(\014le)g(46)1136 840 y(syn)o(tax)f(F)m(unnelW)m +(eb)h(14)1136 889 y(syn)o(tax)f(macro)g(call)g(16)1136 939 +y(syn)o(tax)g(macro)g(de\014nition)h(14)1136 989 y(syn)o(tax)f(parameterized) +i(macro)d(call)h(16)1136 1039 y(syn)o(tax)g(parameterized)i(macro)d +(de\014nitions)i(15)1136 1089 y(syn)o(tax)f(pragma)f(44)1136 +1139 y(syn)o(tax)h(section)i(44)1136 1189 y(table)e(of)h(con)o(ten)o(ts)h(45) +1136 1239 y(tangle)e(45)1136 1288 y(T)m(arjan)g(Rob)q(ert)h(Endre)h(45)1136 +1338 y(T)m(arjan72)d(45)1136 1388 y(T)m(arjan72)g(57)1136 1438 +y(test)j(recursion)g(43)1136 1488 y(test)g(suite)f(47)1136 +1538 y(testing)g(regression)h(18)1136 1588 y(text)f(inden)o(tation)f(12)1136 +1638 y(text)h(inden)o(tation)f(12)1136 1687 y(text)h(inden)o(tation)f(30)1136 +1737 y(text)h(inden)o(tation)f(45)1136 1787 y(T)m(eX)h(23)1136 +1837 y(T)m(eX)g(9)1136 1887 y(ThinkC)f(compiler)f(30)1136 1937 +y(trademark)h(36)1136 1987 y(T)m(rev)o(orro)o(w)g(Andrew)i(9)1136 +2037 y(trouble)f(asking)f(for)g(28)1136 2086 y(t)o(yp)q(es)h(naming)e(29)1136 +2136 y(t)o(yp)q(esetter)k(generic)f(46)1136 2186 y(t)o(yp)q(esetting)f +(strength)i(46)1136 2236 y(t)o(yp)q(esetting)e(9)1136 2286 +y(Univ)o(ersit)o(y)f(Adelaide)h(27)1136 2336 y(Unix)f(36)1136 +2386 y(USDOD83)g(27)1136 2436 y(USDOD83)g(57)1136 2485 y(use)h(of)g(memory)d +(29)1136 2535 y(v)n(ariables)i(static)h(30)1136 2585 y(v)n(ax)f(vms)f(18)1136 +2635 y(v)o(ersion)i(GNU)f(41)1136 2685 y(v)o(ersion)h(pragma)e(45)1136 +2735 y(video)h(game)g(35)1136 2785 y(vms)f(v)n(ax)h(18)1136 +2835 y(w)o(ea)o(v)o(e)h(45)1042 2940 y(60)p eop +%%Page: 61 62 +61 61 bop 177 42 a Fn(William)o(s)12 b(Ross)h(1)177 91 y(w)o(ork)h(38)177 +141 y(writing)f(itself)h(F)m(unnelW)m(eb)f(28)1042 2940 y(61)p +eop +%%Trailer +end +userdict /end-hook known{end-hook}if +%%EOF diff --git a/web/funnelAC/hackman/h_manual.sin b/web/funnelAC/hackman/h_manual.sin new file mode 100644 index 0000000000..72e1b4fa20 --- /dev/null +++ b/web/funnelAC/hackman/h_manual.sin @@ -0,0 +1,326 @@ +\indexentry{.cld file}{18} +\indexentry{==}{14} +\indexentry{@M}{23} +\indexentry{@Z}{23} +\indexentry{abbreviations identifier}{28} +\indexentry{acknowledgements}{7} +\indexentry{Ada}{18} +\indexentry{Ada}{27} +\indexentry{Ada}{7} +\indexentry{adding features}{36} +\indexentry{Adelaide University}{27} +\indexentry{analyser}{45} +\indexentry{Andrew Trevorrow}{9} +\indexentry{ANSI}{28} +\indexentry{ANSI}{57} +\indexentry{antiquated features}{43} +\indexentry{ASCII mnemonics}{45} +\indexentry{asking for trouble}{28} +\indexentry{authority design}{36} +\indexentry{authority security}{36} +\indexentry{availability program}{37} +\indexentry{backwards compatibility}{11} +\indexentry{Barry Dwyer}{7} +\indexentry{Begg Jeremy}{7} +\indexentry{Bentley Jon}{11} +\indexentry{Bentley86}{11} +\indexentry{Bentley86}{57} +\indexentry{blank indentation}{12} +\indexentry{blank indentation}{12} +\indexentry{breakout, GNU}{41} +\indexentry{Brissenden Roger}{7} +\indexentry{changes dangers}{35} +\indexentry{coding style}{28} +\indexentry{command interface}{43} +\indexentry{command interpreter}{43} +\indexentry{command line interface design goals}{19} +\indexentry{command line interface}{18} +\indexentry{command setall}{43} +\indexentry{comment duplication}{18} +\indexentry{Communications of the ACM}{11} +\indexentry{compatibility backwards}{11} +\indexentry{compiler ThinkC}{30} +\indexentry{compiler}{35} +\indexentry{conditionals}{44} +\indexentry{contiguous memory}{45} +\indexentry{copyright law}{38} +\indexentry{copyright notice}{1} +\indexentry{copyright}{38} +\indexentry{correctness}{47} +\indexentry{counting diagnostic}{43} +\indexentry{cross references}{46} +\indexentry{dangers changes}{35} +\indexentry{dangers indentation}{13} +\indexentry{dangers languages}{35} +\indexentry{David Hulse}{27} +\indexentry{David Hulse}{7} +\indexentry{DCL}{13} +\indexentry{derived work}{38} +\indexentry{design authority}{36} +\indexentry{design FunnelWeb}{11} +\indexentry{design goals command line interface}{19} +\indexentry{design language}{44} +\indexentry{detection recursion}{45} +\indexentry{diagnostic counting}{43} +\indexentry{diagnostic messages}{25} +\indexentry{diagnostics}{47} +\indexentry{document structure macro structure}{23} +\indexentry{document structure}{16} +\indexentry{document structure}{23} +\indexentry{documentation out of date}{18} +\indexentry{documentation}{43} +\indexentry{Donald Knuth}{11} +\indexentry{Donald Knuth}{7} +\indexentry{duplication comment}{18} +\indexentry{Dwyer Barry}{7} +\indexentry{efficiency}{47} +\indexentry{EOL representation}{45} +\indexentry{example official}{43} +\indexentry{extensions filename}{20} +\indexentry{factor glue}{46} +\indexentry{features adding}{36} +\indexentry{features antiquated}{43} +\indexentry{features modification}{35} +\indexentry{features removing}{35} +\indexentry{file .cld}{18} +\indexentry{file extension protection}{37} +\indexentry{file markers}{44} +\indexentry{file names}{19} +\indexentry{file names}{21} +\indexentry{file signature}{44} +\indexentry{filename extensions}{20} +\indexentry{filename inheritance}{20} +\indexentry{filenames length}{29} +\indexentry{filenames portable}{21} +\indexentry{formal parameter list}{44} +\indexentry{FunnelWeb design}{11} +\indexentry{FunnelWeb future}{43} +\indexentry{FunnelWeb history}{27} +\indexentry{FunnelWeb implementation}{27} +\indexentry{FunnelWeb management}{39} +\indexentry{FunnelWeb modification}{35} +\indexentry{FunnelWeb motivation}{11} +\indexentry{FunnelWeb official}{39} +\indexentry{FunnelWeb past use}{27} +\indexentry{FunnelWeb protection}{37} +\indexentry{FunnelWeb syntax}{14} +\indexentry{FunnelWeb V1}{11} +\indexentry{FunnelWeb version 1}{27} +\indexentry{FunnelWeb version 2}{27} +\indexentry{FunnelWeb version 3}{27} +\indexentry{FunnelWeb writing itself}{28} +\indexentry{future FunnelWeb}{43} +\indexentry{genealogy program}{36} +\indexentry{generic typesetter}{46} +\indexentry{glue factor}{46} +\indexentry{GNU breakout}{41} +\indexentry{GNU license}{35} +\indexentry{GNU license}{39} +\indexentry{GNU License}{49} +\indexentry{GNU version}{41} +\indexentry{Hackett Simon}{7} +\indexentry{headings}{16} +\indexentry{heap memory}{29} +\indexentry{hierarchical structure}{23} +\indexentry{history FunnelWeb}{27} +\indexentry{Hoare80}{36} +\indexentry{Hoare80}{57} +\indexentry{Horton90}{28} +\indexentry{Horton90}{57} +\indexentry{Hulse David}{27} +\indexentry{Hulse David}{7} +\indexentry{identifier abbreviations}{28} +\indexentry{identifier}{28} +\indexentry{implementation FunnelWeb}{27} +\indexentry{include file suppression}{46} +\indexentry{indentation blank}{12} +\indexentry{indentation dangers}{13} +\indexentry{indentation no}{12} +\indexentry{indentation text}{12} +\indexentry{indentation text}{30} +\indexentry{indentation text}{45} +\indexentry{indentation}{12} +\indexentry{indentation}{12} +\indexentry{indented macro call}{12} +\indexentry{index program}{43} +\indexentry{inheritance filename}{20} +\indexentry{interface command line}{18} +\indexentry{interface command}{43} +\indexentry{interpreter command}{43} +\indexentry{interpreter shell}{43} +\indexentry{invocations number}{22} +\indexentry{issues miscellaneous}{18} +\indexentry{Jeremy Begg}{7} +\indexentry{Jon Bentley}{11} +\indexentry{Kernighan88}{28} +\indexentry{Kernighan88}{57} +\indexentry{Knuth Donald}{11} +\indexentry{Knuth Donald}{7} +\indexentry{Knuth83}{11} +\indexentry{Knuth83}{57} +\indexentry{Knuth84}{57} +\indexentry{Knuth84}{9} +\indexentry{Lamport86}{57} +\indexentry{Lamport86}{9} +\indexentry{language design}{44} +\indexentry{languages dangers}{35} +\indexentry{LaTeX}{9} +\indexentry{LaTeX}{9} +\indexentry{law copyright}{38} +\indexentry{leakage memory}{30} +\indexentry{length filenames}{29} +\indexentry{license GNU}{35} +\indexentry{license GNU}{39} +\indexentry{License GNU}{49} +\indexentry{license}{38} +\indexentry{lister}{46} +\indexentry{Macintosh}{29} +\indexentry{Macintosh}{30} +\indexentry{Macintosh}{9} +\indexentry{macro call syntax}{16} +\indexentry{macro definition syntax}{14} +\indexentry{macro structure document structure}{23} +\indexentry{macro structure}{23} +\indexentry{make}{44} +\indexentry{malloc}{29} +\indexentry{management FunnelWeb}{39} +\indexentry{manuals modifying}{38} +\indexentry{mapper}{44} +\indexentry{markers file}{44} +\indexentry{memory contiguous}{45} +\indexentry{memory heap}{29} +\indexentry{memory leakage}{30} +\indexentry{memory package}{29} +\indexentry{memory stack}{30} +\indexentry{memory static}{30} +\indexentry{memory use of}{29} +\indexentry{messages diagnostic}{25} +\indexentry{miscellaneous issues}{18} +\indexentry{mnemonics ASCII}{45} +\indexentry{modification features}{35} +\indexentry{modification FunnelWeb}{35} +\indexentry{modifying manuals}{38} +\indexentry{motivation FunnelWeb}{11} +\indexentry{MSDOS}{29} +\indexentry{names file}{19} +\indexentry{names file}{21} +\indexentry{naming pointers}{29} +\indexentry{naming types}{29} +\indexentry{no indentation}{12} +\indexentry{no indentation}{12} +\indexentry{notice copyright}{1} +\indexentry{number invocations}{22} +\indexentry{number output files}{12} +\indexentry{numbering section}{23} +\indexentry{Occam's razor}{12} +\indexentry{official example}{43} +\indexentry{official FunnelWeb}{39} +\indexentry{options}{43} +\indexentry{out of date documentation}{18} +\indexentry{output files number}{12} +\indexentry{OzTeX}{9} +\indexentry{package memory}{29} +\indexentry{parameter list formal}{44} +\indexentry{parameterized macro call syntax}{16} +\indexentry{parameterized macro definitions syntax}{15} +\indexentry{parser}{45} +\indexentry{Pascal}{12} +\indexentry{past use FunnelWeb}{27} +\indexentry{Ph.D.}{27} +\indexentry{pointers naming}{29} +\indexentry{portability}{28} +\indexentry{portable filenames}{21} +\indexentry{pragma syntax}{44} +\indexentry{pragma version}{45} +\indexentry{preface}{5} +\indexentry{presentation notes}{9} +\indexentry{program availability}{37} +\indexentry{program genealogy}{36} +\indexentry{program index}{43} +\indexentry{programming pearls}{11} +\indexentry{protection file extension}{37} +\indexentry{protection FunnelWeb}{37} +\indexentry{Rabinowitz90}{28} +\indexentry{Rabinowitz90}{28} +\indexentry{Rabinowitz90}{57} +\indexentry{Ramsey89}{46} +\indexentry{Ramsey89}{57} +\indexentry{recursion detection}{45} +\indexentry{recursion test}{43} +\indexentry{references cross}{46} +\indexentry{references}{57} +\indexentry{regression testing}{18} +\indexentry{removing features}{35} +\indexentry{representation EOL}{45} +\indexentry{Robert Endre Tarjan}{45} +\indexentry{Roger Brissenden}{7} +\indexentry{Ross Williams}{1} +\indexentry{scanner}{44} +\indexentry{section numbering}{23} +\indexentry{section syntax}{44} +\indexentry{sections}{16} +\indexentry{security authority}{36} +\indexentry{setall command}{43} +\indexentry{shell interpreter}{43} +\indexentry{signature file}{44} +\indexentry{Simon Hackett}{7} +\indexentry{size stack}{30} +\indexentry{South Australian Government Department of Lands}{28} +\indexentry{speed}{47} +\indexentry{spider}{46} +\indexentry{stack memory}{30} +\indexentry{stack size}{30} +\indexentry{static memory}{30} +\indexentry{static variables}{30} +\indexentry{strength typesetting}{46} +\indexentry{structure document}{16} +\indexentry{structure document}{23} +\indexentry{structure hierarchical}{23} +\indexentry{structure macro}{23} +\indexentry{style coding}{28} +\indexentry{suite test}{47} +\indexentry{suppression include file}{46} +\indexentry{syntax FunnelWeb}{14} +\indexentry{syntax macro call}{16} +\indexentry{syntax macro definition}{14} +\indexentry{syntax parameterized macro call}{16} +\indexentry{syntax parameterized macro definitions}{15} +\indexentry{syntax pragma}{44} +\indexentry{syntax section}{44} +\indexentry{table of contents}{45} +\indexentry{tangle}{45} +\indexentry{Tarjan Robert Endre}{45} +\indexentry{Tarjan72}{45} +\indexentry{Tarjan72}{57} +\indexentry{test recursion}{43} +\indexentry{test suite}{47} +\indexentry{testing regression}{18} +\indexentry{text indentation}{12} +\indexentry{text indentation}{12} +\indexentry{text indentation}{30} +\indexentry{text indentation}{45} +\indexentry{TeX}{23} +\indexentry{TeX}{9} +\indexentry{ThinkC compiler}{30} +\indexentry{trademark}{36} +\indexentry{Trevorrow Andrew}{9} +\indexentry{trouble asking for}{28} +\indexentry{types naming}{29} +\indexentry{typesetter generic}{46} +\indexentry{typesetting strength}{46} +\indexentry{typesetting}{9} +\indexentry{University Adelaide}{27} +\indexentry{Unix}{36} +\indexentry{USDOD83}{27} +\indexentry{USDOD83}{57} +\indexentry{use of memory}{29} +\indexentry{variables static}{30} +\indexentry{vax vms}{18} +\indexentry{version GNU}{41} +\indexentry{version pragma}{45} +\indexentry{video game}{35} +\indexentry{vms vax}{18} +\indexentry{weave}{45} +\indexentry{Williams Ross}{1} +\indexentry{work}{38} +\indexentry{writing itself FunnelWeb}{28} diff --git a/web/funnelAC/hackman/h_manual.tex b/web/funnelAC/hackman/h_manual.tex new file mode 100644 index 0000000000..716a28277c --- /dev/null +++ b/web/funnelAC/hackman/h_manual.tex @@ -0,0 +1,283 @@ +%==============================================================================% +% FUNNELWEB USER'S MANUAL % +%==============================================================================% +% +% Summary +% ------- +% This is the main .tex file of the FunnelWeb Hacker'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.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\figlicense{\figfor{1}} +%\def\figtwo{\figfor{2}} + +%\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} + + + +%------------------------------------------------------------------------------ + +% 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 Hacker'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 + +%------------------------------------------------------------------------------- + +\begin{document} +\sloppy +\nonstopmode + +\input h_ch0 % Table of contents etc. +\input h_ch1 % FunnelWeb Design +\input h_ch2 % FunnelWeb Implementation +\input h_ch3 % FunnelWeb Modification +\input h_ch4 % FunnelWeb Future +\input h_cha % Appendices + +\end{document} + +%==============================================================================% +% End of Main .TeX File of FunnelWeb Hacker's Manual % +%==============================================================================% diff --git a/web/funnelAC/hackman/h_manual.toc b/web/funnelAC/hackman/h_manual.toc new file mode 100644 index 0000000000..41e1e43e82 --- /dev/null +++ b/web/funnelAC/hackman/h_manual.toc @@ -0,0 +1,62 @@ +\contentsline {chapter}{Preface}{5} +\contentsline {chapter}{Acknowledgements}{7} +\contentsline {chapter}{Presentation Notes}{9} +\contentsline {chapter}{\numberline {1}FunnelWeb Design}{11} +\contentsline {section}{\numberline {1.1}Motivation for FunnelWeb}{11} +\contentsline {section}{\numberline {1.2}Indentation}{12} +\contentsline {section}{\numberline {1.3}Review of FunnelWeb Syntax}{14} +\contentsline {subsection}{\numberline {1.3.1}Review of Macro Definition Syntax}{14} +\contentsline {subsection}{\numberline {1.3.2}Review of Macro Call Syntax}{16} +\contentsline {subsection}{\numberline {1.3.3}Review of Parameterized Macro Call Syntax}{16} +\contentsline {section}{\numberline {1.4}Document Structuring}{16} +\contentsline {section}{\numberline {1.5}Discussion of Some Miscellaneous Issues}{18} +\contentsline {section}{\numberline {1.6}Automated Regression Testing}{18} +\contentsline {section}{\numberline {1.7}Command Line Interface}{18} +\contentsline {section}{\numberline {1.8}File Name Management}{19} +\contentsline {subsection}{\numberline {1.8.1}Filename Extensions}{20} +\contentsline {subsection}{\numberline {1.8.2}Filename Inheritance}{20} +\contentsline {subsection}{\numberline {1.8.3}Portable Structure of File Names}{21} +\contentsline {section}{\numberline {1.9}Specifying Constraints on the Number of Instantiations}{22} +\contentsline {section}{\numberline {1.10}The Relationship Between Document Structure and Macro Structure}{23} +\contentsline {section}{\numberline {1.11}Diagnostic Messages}{25} +\contentsline {section}{\numberline {1.12}Summary}{25} +\contentsline {chapter}{\numberline {2}FunnelWeb Implementation}{27} +\contentsline {section}{\numberline {2.1}Introduction}{27} +\contentsline {section}{\numberline {2.2}History of FunnelWeb Implementations}{27} +\contentsline {section}{\numberline {2.3}Why FunnelWeb Wasn't Used to Write Itself}{28} +\contentsline {section}{\numberline {2.4}Coding Style}{28} +\contentsline {section}{\numberline {2.5}Use of Memory}{29} +\contentsline {section}{\numberline {2.6}The Heap}{29} +\contentsline {section}{\numberline {2.7}The Stack}{30} +\contentsline {section}{\numberline {2.8}Static Variables}{30} +\contentsline {section}{\numberline {2.9}Implementing Text Indentation}{30} +\contentsline {chapter}{\numberline {3}FunnelWeb Modification}{35} +\contentsline {section}{\numberline {3.1}Introduction}{35} +\contentsline {section}{\numberline {3.2}The Danger of Modifying Languages}{35} +\contentsline {section}{\numberline {3.3}Authority vs User Security}{36} +\contentsline {section}{\numberline {3.4}What I Want to Protect}{37} +\contentsline {section}{\numberline {3.5}Modifying the Manuals}{38} +\contentsline {section}{\numberline {3.6}How Copyright Law Works}{38} +\contentsline {section}{\numberline {3.7}Management of the Official FunnelWeb}{39} +\contentsline {section}{\numberline {3.8}A GNU Version?}{41} +\contentsline {section}{\numberline {3.9}Summary}{41} +\contentsline {chapter}{\numberline {4}FunnelWeb Future}{43} +\contentsline {section}{\numberline {4.1}Documentation}{43} +\contentsline {section}{\numberline {4.2}Command Line Interface}{43} +\contentsline {section}{\numberline {4.3}Shell Interpreter}{43} +\contentsline {section}{\numberline {4.4}Language Design}{44} +\contentsline {section}{\numberline {4.5}Scanner/Mapper}{44} +\contentsline {section}{\numberline {4.6}Parser}{45} +\contentsline {section}{\numberline {4.7}Analyser}{45} +\contentsline {section}{\numberline {4.8}Tangle}{45} +\contentsline {section}{\numberline {4.9}Weave}{45} +\contentsline {section}{\numberline {4.10}Lister}{46} +\contentsline {section}{\numberline {4.11}Diagnostics}{47} +\contentsline {section}{\numberline {4.12}Speed}{47} +\contentsline {section}{\numberline {4.13}Correctness}{47} +\contentsline {section}{\numberline {4.14}Test Suite}{47} +\contentsline {section}{\numberline {4.15}Machine-Specific Changes}{48} +\contentsline {section}{\numberline {4.16}Summary}{48} +\contentsline {chapter}{\numberline {A}GNU General Public License Version 2}{49} +\contentsline {chapter}{\numberline {B}References}{57} +\contentsline {chapter}{Index}{57} -- cgit v1.2.3