In case you are using emacs, this is a -*- text -*- file.
Documentation for FunnelWeb 3.05AC
10th October, 1995.
Anthony B. Coates
Department of Physics
The University of Queensland
QLD 4072
Australia
coates@physics.uq.edu.au
This document lists the features which I [ABC] have added to Ross
Williams' FunnelWeb v3.0 in developing FunnelWeb 3.05AC. Although
Ross does not want bogus copies of FunnelWeb to be distributed, for
the very good reason that existing FunnelWeb code should not break
because someone unknowingly installs an improperly modified version of
the program, he has allowed me to distribute FunnelWeb 3.05AC freely.
However, note that while the features of FunnelWeb 3.05AC may appear
in the next official release of FunnelWeb, there is no guarantee that
they will, as this will be up to Ross Williams to decide.
Note too that when my version of FunnelWeb is run, it automatically
prints out a message pointing out that it is not FunnelWeb v3.0.
Please do not remove or change this message without my express
permission [ABC].
****ATTENTION****
FunnelWeb is currently written using K&R C. This means that it can be
compiled by both old-style K&R C compilers and new-style ANSI/ISO C
compilers, but not (as C++) by C++ compilers, as C++ uses the ANSI/ISO
syntax. In future releases, FunnelWeb AC may change from K&R to
ANSI/ISO syntax. This is because the number of people who wish to
compile FunnelWeb using a C++ compiler will probably outnumber those
who wish to use a K&R C compiler. However, if you have a strong
opinion as to whether FunnelWeb should be written in K&R or ANSI/ISO
C, send an email message to coates@physics.uq.edu.au, so that users'
opinions can be gauged.
****ATTENTION****
To avoid problems with existing FunnelWeb code breaking when processed
with FunnelWeb 3.05AC, new features are only enabled by the explicit
setting of pragmas. As such, this version of FunnelWeb should process
all existing sources without problems, and all product files,
including the documentation, should be exactly the same as produced by
FunnelWeb v3.0. The one exception to this is if the FunnelWeb
document contains macro names that begin with the hash character '#'.
This will be discussed later in this document.
Differences from FunnelWeb 3.0AC:
1. Fixed a serious bug in the HTML code generation
(the characters '<' and '>' should have been escaped in the
generated HTML documentation, but were not).
2. Added the concept of source code types. Currently, this is used
only to allow line directives to be generated in some product
files but not others.
3. Added the internal macro #timestamp to allow timestamping of
product files.
4. Added PC32 machine type for 32-bit DOS code (no 64K boundary
restrictions).
5. Added +Qb command line switch for true batch mode
(no interaction with the user is attempted if FunnelWeb
has to abort).
6. Mapping of files into memory changed to try and avoid problems
of differing EOL conventions when taking FunnelWeb sources from
one type of system to another (e.g. DOS to Unix).
Modifications:
1. Addition of OSF64, OS2, and LINUX machine types to environ.h,
machin.h, and machin.c. The OSF64 machine type is for a 64-bit
processor running the OSF/1.3 version of UNIX, such as a DEC
AXP (Alpha). The OS2 machine type is for a PC386/486 running OS/2
2.1. The code now checks for `PATH_MAX' before `FILENAME_MAX'
as the constant giving the maximum fully qualified filename
length for an operating system. This is to accomodate
Unix System V. The PC32 machine type has also been added for
32-bit DOS code.
2. Additions to `typesetter' pragma:
FunnelWeb v.3.0 supports the `@p typesetter = tex' pragma, which
allows (La)TeX expressions to be imbedded in the documentation
text without being escaped. Without this pragma, FunnelWeb
treats all documentation text as literal ASCII.
My version [ABC] of FunnelWeb also supports the additional
typesetter choices `@p typesetter = hypertext' and
`@p typesetter = html'. The `hypertext' option causes FunnelWeb
to output an HTML hypertext file rather than a TeX file. This
HTML file can be viewed using `Mosaic', and indeed `Mosaic' is
the only HTML viewer with which the HTML code produced by this
FunnelWeb 3.05AC has been tested. In `hypertext' mode, the
standard FunnelWeb typesetting commands are converted to
hypertext equivalents, so an existing FunnelWeb file which does
NOT contain a `@p typesetter = tex' pragma should be able to be
used for hypertext by simply adding `@p typesetter = hypertext'
as the first line. The resulting hypertext output is not be
formatted exactly the same as the TeX version (in particular,
vertical skips are currently ignored for hypertext), but the
formatting should nonetheless be reasonable for a hypertext
document, and includes appropriate hypertext links for macro
invocations and the table of contents. The
`@p typesetter = html' option allows HTML expressions to be
included in the documentation without being escaped, and so is
the HTML equivalent of the `@p typesetter = tex' option.
3. no_doc_header pragma:
`@p no_doc_header' is used to suppress the TeX (or HTML)
header definitions that FunnelWeb normally includes in the output
file. It is mainly intended for users who use
`@p typesetter = tex' so that they can write their documentation
using LaTeX. The file `fw-latex.sty' contains all of the
standard FunnelWeb header definitions, and can be included as an
optional style file for the LaTeX `\documentstyle' command. Note
that it is not necessary to do this for LaTeX files, as the
FunnelWeb TeX definitions work perfectly well under LaTeX;
however, by separating the definitions into a single style file,
the same definitions are not repeated in every documentation
file, which can offer a useful saving in disk space. Leaving the
TeX header intact *and* using the FunnelWeb style file as well
will lead to a LaTeX error, so you must choose one or the other
if you are writing your documentation this way. Using
`@p no_doc_header' also suppresses the automatic inclusion of a
TeX `\bye' command at the end of the documentation file. For
LaTeX, the `\end{document}' command makes `\bye' unnecessary.
4. raw_macro_and_section_names pragma:
Normally, FunnelWeb escapes all TeX (or HTML) expressions that
occur in section names (if you use the FunnelWeb sectioning
commands) or in macro names. The
`@p raw_macro_and_section_names' pragma inhibits this escaping of
expressions in section and macro names, unless the macro is
attached to a file (TeX or HTML in file names almost certainly
have no practical value, and would more likely be unintentional,
particularly with file systems that use `\' as the directory
separator).
4. ignore_text_after_special_minus pragma:
Normally, it is an error to have any text on a line after a
FunnelWeb `@-' command, which suppresses the return at the end of
a line. However, in some cases it may be useful to allow the
text appearing after a `@-' command on a line to be treated as a
comment which does not appear in the final documentation (in
particular, this style of comment allows the automatic setting of
emacs buffer modes for editing code scraps when using certain
emacs WEB modes). The `@p ignore_text_after_special_minus'
allows the use of such trailing comments after `@-' (assuming
that `@' is the special character as per usual; the use of `@' as
the special is not at all necessary for this pragma to work).
5. no_paragraph_markups pragma:
For the hypertext settings `@p typesetter = hypertext' and
`@p typesetter = html', HTML paragraph markups (`
') are
inserted in the documentation text wherever one or more blank
lines occur in a row. However, particularly for users writing
HTML documentation directly and using `@p typesetter = html', it
may be undesirable to have these `
' markups automatically
inserted, since they may already exist as desired in the
documentation text. The `@p no_paragraph_markups' pragma
suppresses the automatic insertion of `
' markups in HTML
documentation (but has no effect on TeX documentation).
6. automatic_line_directive_macro pragma:
This pragma allows the *automatic* insertion of line directives
into the product files, similarly to the manner supported by
`noweb'. For example, `@p automatic_line_directive_macro = line'
would make FunnelWeb call the macro `@' whenever a line
directive was needed (an appropriate definition of @ for
C/C++ is given in `autoccln.fwi'. The fact that this macro is
user defined means that the user can support any type of line
directive convention, or just add comments to show where a
section of a product file came from in the original FunnelWeb
source. New line directive types can be defined using
`@<#line@>' and `@<#file@>', which are described in the next
section.
There are some caveats that go with using automatic line
directive insertion. The same macro is used for all the line
directives, which means that a single FunnelWeb source cannot
support multiple language/file types unless the line directive
style happens to be the same for all of them. Also, when adding
line directives, there is the need to insert carriage returns
into the product files before and after macro invocations. So
your code may break unless macros are only used where adding
newlines before or after the macro invocations does not affect
the meaning of the product code. For many languages, such as
C/C++ or Pascal, this is generally the case; it isn't for
Fortran, though. Using a macro in the middle of a string
definition would probably also do the wrong thing, breaking
the string up across multiple lines.
7. allow_source_code_typing and declare_source_code_type pragmas:
As originally implemented, the `automatic_line_directive_macro'
pragma added the same line directives to every product file
(except the documentation file). This is O.K. when all of the
files are, say, C files, but if you also generate the makefile
from the FunnelWeb file, you would then have to remove the #line
directives from the makefile, or use two separate FunnelWeb
files. The `allow_source_code_typing' macro tells FunnelWeb that
you wish apply the insertion of line directives selectively to
the product files. This pragma is required so that the new
features remain inactive unless explicitly asked for, to protect
existing FunnelWeb code.
Continuing the example of a FunnelWeb file from which is produced
a C file and a makefile, the product makefile should not have any
line directives. Since the FunnelWeb default is no line
directives, the makefile can be produced with the default source
code type. Then `@p declare_source_code_type "C"' can be used to
declare a source code type for the C file. You can declare as
many source code types as are required. Do not create a special
source code type for files without line directives, though, since
the default already provides this.
With source code types, the `automatic_line_directive_macro'
pragma can have two forms. The first form is
`@p automatic_line_directive_macro = ', which sets the
automatic line directive macro for the default source type. If
you are using source code typing, you probably will have some
files to generate without line directives, and so you will not
want to set a line directive type for the default source code
type. Having defined a "C" source code type, you set the
automatic line directive macro for C files by
`@p automatic_line_directive_macro = "C"', i.e. you add
the source code type name to the end of the line.
There is only one more thing to do. Source code types apply only
to macros which are attached to files. So when you generate your
C file `main.c', you change its definition from
`@O@==@{...@}' to `@O@==@{...@}'. Note the
special use of `@,' here, and also that in the file macro
definition the source code type name is not surrounded by double
quotes as it is in the pragmas.
If you have followed all of this, you should be able to
understand the following sample FunnelWeb file which uses these
pragmas.
-----------sample FunnelWeb file----------------
@p allow_source_code_typing
@p declare_source_code_type "C"
@p automatic_line_directive_macro = "line" "C"
@i autoccln.fwi
@O@==@{int main(void) { return 0; }@}
@$@==@{@^D(009)@} @! ASCII TAB character is decimal 9.
@O@==@{@-
main.exe: main.c
@$(CC) -o $@@ main.c
@}
-----------end of sample FunnelWeb file----------
8. A command switch `+Qb' has been added. The `b' stands for
`batch', and this switch stops FunnelWeb from asking the user
for confirmation if it has to abort. This means that FunnelWeb
will run as a completely batch-mode program, which apparently is
important for users who want to integrate it into the Borland
C/C++ IDE (development environment).
9. The way FunnelWeb AC maps files into memory has been modified in
order to avoid problems with Unix systems choking on the CR/LF
pair used to terminate lines in DOS files. While the new system
has been checked under OS/2, OSF/1(Unix), and DOS, I would
appreciate knowing if this system works for Macintoshes as I
believe it should.
In principle this change could make FunnelWeb 3.05AC act
differently to FunnelWeb 3.0 for some files, but only files
so perverse as to be unreasonable in any case. If this is not
the case, report it to the author immediately.
Special Internal Macros:
Some special `internal' macros have been added to FunnelWeb 3.05AC
to support imbedding of references to the original FunnelWeb
source(s) in the product files. In particular, the FunnelWeb
include file `ccline.fwi' defines a macro called @ which can
be used to insert a C/C++ #line directive into a product file (for
manual line directive insertion, i.e. where the user types
`@' wherever needed. The version of `@' to be used
for automatic line directive insertion is to be found in
`autoccln.fwi'). These internal macros, of which only three
currently exist (@<#line@>, @<#file@>, and @<#timestamp@>), have
names which start with the hash character '#'.
This is the one place where existing FunnelWeb code might be
expected to break when processed by this experimental version of
FunnelWeb, if the name of an internal macro also used for a
user-defined macro. As such, it is strongly recommended that the
user avoid macro names which start with the '#' character.
The @<#line@> macro causes a FunnelWeb source line number to
be inserted into the product file, while the @<#file@> macro inserts
a FunnelWeb source file name. See `ccline.fwi' for an example.
There are two pragmas related to this pair of internal macros.
`@p #line_offset = ' is used to set a value which is added to
the actual FunnelWeb source file line on which @<#line@> is invoked
before the line number is printed in the product file. This is
necessary for C/C++ #line directives because the directive much
specify the source line number of the line *after* the directive,
not the source line number of the directive itself. Thus, the
offset value needs to be 1 for C/C++ (and is defined to be in
`ccline.fwi').
`@p #line_depth = ' controls *which* line number and file name
are actually printed by @<#line@> and @<#file@>. Taking
`ccline.fwi' as an example, this file defines a @ macro in
which @<#line@> and @<#file@> are then called. My first naive
version of @ [ABC] ended up printing the line number and file
name for `ccline.fwi' (which is then the same for every case)!!!
What I [ABC] wanted was the line number and file name for where
@ was invoked, not where @<#line@> and @<#file@> were
actually invoked inside @. This means that it is necessary
to climb up the current stack of macro invocations until you arrive
at the one you want. `@p #line_depth = ' allows the user to
define how far up the macro invocation stack you must go in order to
get the desired line number and file name. The appropriate value
for C/C++ #line directives is set in `ccline.fwi'.
The @<#timestamp@> macro is converted in the product files
(but not in the documentation file)to a date/time string in the form
`yyyy/mm/dd/hh/mm/ss'. Although most file systems will date the
product files anyway, timestamping may be useful for having the
program itself print a message saying when FunnelWeb was last used
to generate the product files. The actually date and time used for
the timestamp are only checked once, the first time that
@<#timestamp@> is processed by FunnelWeb. Thus, all product files
produced by the same run of FunnelWeb will contain the same
timestamp. This seems more reasonable than having slightly
different times in each of the product files. If you have more
complicated timestamp or version control requirements, try using GNU
RCS (revision control system), which has been found to work well
with FunnelWeb. *WARNING*: if you use @<#timestamp@> in a product
file, the FunnelWeb `+D' command line flag will not affect that
file, since the timestamp in the file will be different every time
FunnelWeb is run. Hence, if you use makefiles, and do not want to
recompile/regenerate everything every time, be careful about using
@<#timestamp@>.
Other changes:
Ross Williams once posted a message to the FunnelWeb mailing list
stating that FunnelWeb allocated a maximally-sized string to every
macro name, and that this was a waste of space. In my version,
this has been modified so that only the amount of string space
necessary is allocated. How much is saved will depend greatly on
the nature of the FunnelWeb source. I [ABC] did manage in one case
to save 100k on the memory that needed to be allocated, but this was
on a project where FunnelWeb allocated itself just over 11M while
running; thus the saving is not necessarily significant.
Compiling the code:
I have included some example makefiles, but the standard FunnelWeb
creed of `just compile it all together at once' should work fine. I
[ABC] tend not to do this because my compiler is not lightning fast.
Because of the modifications, when you run the FunnelWeb tests, you
will not get the same errors as with FunnelWeb v.3.0. The number of
errors and differences that you should get is to be found in the
file `err.status'.
This is the end of this documentation file.