.ds f. convention.sec
.sp 2
.NH 1 "CONVENTIONS & GUIDELINES FOR ALL KHOROS ROUTINES"
.XS
\s12\*(SN  CONVENTIONS & GUIDELINES FOR ALL KHOROS ROUTINES\s0
.XE
.sp
.PP
This section contains information that is common to both vroutines and 
xvroutines.  It details conventions that must be adhered for the sake
of portability and machine independance when programming in the Khoros
environment.  Variable naming conventions that should be followed when
creating a UIS file are given here, as are file naming conventions that
are followed throughout the Khoros system.  
.sp 2
.NH 2 "GUIDELINES FOR WRITING CODE"
.XS
      \*(SN  GUIDELINES FOR WRITING CODE
.XE
.sp
.PP
There are several rules that you should follow when developing new 
programs under the Khoros environment.  Following these guidelines will help
to ensure that your new program will function properly and consistently
as a new part of the Khoros system.  
.PP
When coding in the PS file, all \fIfprintf();\fP 
error message statements should use the file descriptor \fBstderr\fP, NOT 
\fBstdout\fP.
.PP
The \fIcheck_args()\fP function exists in the vgparms library. Its purpose
is to make sure the command line did not contain any invalid 
arguments/options. If the command line did contain
invalid arguments/options, \fIcheck_args()\fP will print them out and
your program will exit.  This call is not mandatory, but it is
a good idea to include it in your code.
.PP
All input file error checking should be performed in the 
-include_macros field using functions from the \fBverror\fP library.
As many #defines may be included as necessary. 
.PP
The motivation for breaking the program into a main *.c file and a l*.c
library file is mainly to separate the functionality 
into its two component phases.  The preliminary work is done in the main *.c 
file, which includes argument and file checking.  The library file
includes the source code for executing the vroutine on the data.  
This enables the library routine to be called from different programs 
as well as from the original. 
.PP
In xvroutines, the l*.c file is used to
integrate the main driver generated by \fBconductor\fP with the files generated
by \fBghostwriter\fP.  It is not truly a "library" file in that it will
not become part of a library, will not be called by any other xvroutines,
and will not have a man3 page installed.
However, the library file for an xvroutine should still retain its name 
and the tags generated by \fBghostwriter\fP
in order to stay maintainable and consistent under the Khoros system.
.PP
An important point which needs to be stated here is that the library routine 
should be always be declared to return an integer. Consequently it will return 
zero (0) upon failure or one (1) upon success.
The library should be very robust; it should not not crash for any
reason.  In order to obtain this objective, all the necessary error
checking should be done in the libraries as well as their drivers.
The library should always return to the main program; either it completed
its work successfully or unsuccessfully. That is, the library should never
contain an \fIexit()\fP statement within its instructions.
.PP
Whenever memory is allocated for one or more pointers, they should
be freed as soon as they no longer needed. This is to minimize
the risk of running out of memory. Also, for those working with VIFF files,
the data contained in the
memory location starting with the address given by "image->imagedata",
should be released with a call to \fIfreeimage()\fP when it is changed or 
replaced by another one; for instance, in the following example, 
"image->imagedata" is replaced by a new pointer. 
.sp
\f(CW freeimage(image);\fP
.br
\f(CW image->imagedata = (char *) fptr;\fP
.sp
.PP
If the library routine that is being written needs to call any of the already
existing ones, the calling format should be the same as that of the
main program; that is, the calling routine should check if the
subordinate routine returns one (1) or zero (0) upon success or
failure.  
.PP
Also, one should make an effort not to introduce inter-dependencies 
into library routines.  However, you are welcome (and highly encouraged!) 
to make calls from your vroutine 
to the utilities found in the \fIverror, vgparm, vmath, vrast,\fP and 
\fIvutils\fP libraries.  On the other hand, you are not encouraged
to add dspl routines that depend on ipl routines and vice versa.  
.PP
Due to the necessity to perform the same operation for different image
types, one should try to use flow control that provides fast
performance. For instance, in programs like vconvert, it is better
to have \fIfor\fP loops inside the \fIswitch\fP statement 
rather than having the \fIswitch\fP
inside the \fIfor\fP loops. The reason for this is that the latter requires more
time due to the continuous breaks(jumps).
.PP
Also, if the algorithm being implemented requires a large amount of
code, modularity is one of the important issues that one should
observe. Some kind of compromise with the efficiency issues mentioned
above should be considered.  When writing a vroutine, one should make sure
that all functionality of the program is provided by the code in the library
file.
.PP
If you make a system call to \fIsignal(sig, function)\fP, you must define
\fIfunction\fP to be of type \fIvsignal\fP, and you must have the line:
\f(CW#include "vsignal.h"\fP in order for your code to be portable.
.PP
If you make a system call to \fIwait(status)\fP or
\fIvwait3(status,options,rusage)\fP, you must define \fIstatus\fP to be of type
\fIvstatus\fP, and you must have the line:
\f(CW#include "vsignal.h"\fP in order for your code to be portable.
.PP
If you make a system call to the directory routine \fIreaddir()\fP, or any
other system call that uses the type \fIdirent\fP or \fIdirect\fP, you must
re-define the routine that you are calling to be of type \fIvdirect\fP.  The
\fIvdirect\fP type is definedin \f(CWKHOROS_HOME/include/vinclude.h\fP. Again,
this is to allow your code to be portable to other architectures.
.PP
If you need to use the system calls \fIputenv(), tempnam(), random(), rand(),
srandom(), srand(),\fP or \fIwait3(),\fP you must instead use the Khoros
versions of these routines that may be found in either the \fIvgparm\fP or\fIvmath\fP libraries.  Once more, this is to ensure portability to other
architectures.
.PP
If you need to use the system call \fIvfork()\fP, then to make your code
portable, you must follow the approach in the example below.  This is because
not all machines support the \fIvfork()\fP system call.
.sp
\f(CW
#ifdef VFORK
.br
        if ((pid = vfork()) == 0)
.br
#else
.br
        if ((pid = fork()) == 0)
.br
#endif
.br
        {
.br
            (void) execl("/bin/csh", "csh", "-cf",
.br
                         "lpr writing_progs.ps", (char *)0);
.br
            exit(1);
.br
        }
\fP
.sp
.PP
Since every program is different, it is very difficult
to explain exactly how to write one. The best approach for writing a new
program is to look at examples. There are plenty of
vroutines in the \f(CWKHOROS_HOME/src/vipl/Lib/\fP directory.
Spend some time browsing through these routines, looking for one that is 
similar to the 
one that you would like to write in order to get an idea of how to approach 
the problem at hand. Experience with the C programming language will help
tremendously, as all Khoros programs are written in C.
.PP
Additional information concerning the Program Specification
file is provided in Section D of this chapter.  Certain segments of the
PS file that elaborate on the programming aspects are detailed in 
that section.
.sp 2
.NH 2 "CONVENTIONS FOR VARIABLE NAMES"
.XS
      \*(SN  CONVENTIONS FOR VARIABLE NAMES
.XE
.PP
These are conventions for the most common variable names used in the Khoros
system. Note that the \fIvariable\fP field on a particular line of the *.pane
file becomes the name of the [-flag] to the program on the command line, as
well as the name of the corresponding field in the C structure that 
\fBghostwriter\fP generates in the *.h file.
.sp
        i       single input viff file
.br
        i#      multiple input viff files
.br
                (NOTE: do not use the word "image" casually -
.br
                try to use "viff file" when you mean an image
.br
                formatted specifically for the Khoros system,
.br
                not "image file".
.br

.br
        o       single output viff file
.br
        o#      multiple viff output files
.br
        f       output ascii file
.br

.br
        t       data type (string)  This flag requires a call to \fIvget_type()\fP
.br
        d       direction of processing for 1d data
.br
        w,h    width and height
.br
        x,y     coordinates of a pixel
.br
        r,c     row and column
.br

.br
        b       bands
.br

.br
        a, A, P, U, V reserved command line arguments
.br
.sp 2
.NH 2 "KHOROS FILE NAMING CONVENTIONS"
.XS
      \*(SN  KHOROS FILE NAMING CONVENTIONS
.XE
.PP
The table below is a list of the file naming conventions used in Khoros.
.LP
.TS
.if \n+(b.=1 .nr d. \n(.c-\n(c.-1
.de 35
.ps \n(.s
.vs \n(.vu
.in \n(.iu
.if \n(.u .fi
.if \n(.j .ad
.if \n(.j=0 .na
..
.nf
.nr #~ 0
.if \n(.T .if n .nr #~ 0.6n
.ds #d .d
.if \n(.z .ds #d nl
.fc
.nr 33 \n(.s
.nr 39 \n(.s
.rm 46 47
.if \n(.z \{\
.	ch #f
.	wh \n(nlu+\n(.tu-2v #f\}
.eo
.de #f
.ie \n(#& \{ \
.	nr #& 0
.	nr #| 1
.	di #o \}
.el \{ \
.	ch #f
.	nr T. 1
.	if \n(#| .sp
.	T#
.	sp \n(.tu
.	mk #T
.	nr #a \n(#T
.	nr ^a \n(#T
.	nr ^b \n(#T
.	if \n(#| \{ \
.		in 0
.		#+
.		in
.		rm #+
.		mk 32
.		nr #| 0\}
.	wh \n(nlu+\n(.tu-2v #f \}
..
.de #%
.if \n(.z#o \{ \
.	sp |0u
.	in 0
.	#+
.	in
.	sp |\n(.hu
.	di
.	rn #o #+ \}
..
.ec
.nr 46 0
.nr 38 \wFile suffix
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.a
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.ans
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.awk
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.c
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.cmdlog
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.conf
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.csh
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.doc
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.f
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.form
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.jp
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.l
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.man
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.ms
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.o
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.pane
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.prog
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.ps
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.sh
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.sub
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.txt
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.vec
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.xv
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.y
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.1
.if \n(46<\n(38 .nr 46 \n(38
.nr 38 \w*.3
.if \n(46<\n(38 .nr 46 \n(38
.46
.rm 46
.nr 47 0
.nr 38 \wDescription
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wlibrary
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wCommand line answer file.
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wawk script files.
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wC source
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wKhoros command execution log file.
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wConfiguration file used by \fBghost\fP routines.
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wcsh script files.
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wDocumentation files formatted for on line help in X applications.
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wfortran source
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wUIS file describing GUI for xvroutines - used with \fBconductor\fP.
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wJournal Playback files.
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wlex source
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wFiles used for preparing documentation for printing.
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wManual files containing ms macros.
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wobject file produced by cc
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wUIS file describing CLUI & GUI - used with \fBcantata\fP & \fBghostwriter\fP.
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wPS file for \fBghostwriter\fP and \fBghostreader\fP.
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wPostscript files ready to be printed.
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wbourne script files.
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wUIS file describing subforms for \fBcantata\fP (has ref's to *.pane files).
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wText file (README(s) are the exception).
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wVector font files.
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wFiles that are in VIFF format.
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wyacc source
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wSection one manual page.
.if \n(47<\n(38 .nr 47 \n(38
.nr 38 \wSection three manual page.
.if \n(47<\n(38 .nr 47 \n(38
.47
.rm 47
.nr 38 1n
.nr 45 0
.nr 40 \n(45+((2*\n(38)/2)
.nr 46 +\n(40
.nr 41 \n(46+((6*\n(38)/2)
.nr 47 +\n(41
.nr TW \n(47
.nr TW +((2*\n(38)/2)
.ne 27v+(1u*(\n(.vu-\n(.sp))+(2u*(\n(.vu-\n(.sp))
.fc  
.nr #T 0-1
.nr #a 0-1
.nr #a 0-1
.eo
.de T#
.nr 38 \n(.s
.ps \n(39p
.nr 35 1m
.ds #d .d
.if \n(.z .ds #d nl
.mk ##
.nr ## -1v
.ls 1
.if \n(T. .vs \n(.vu-\n(.sp
.if \n(T. \h'|0'\s\n(33\l'|\n(TWu\(ul'\s0
.if \n(T. .vs
.if \n(#T>=0 .nr #a \n(#T
.if \n(#a>=0 \{\
.	sp -1
.	ie \n(#a=\n(#T \{\
\h'|0'\s\n(33\h'-\n(#~u'\L'|\n(#au-1v'\s0\v'\n(\*(#du-\n(#au+1v'\h'|\n(TWu'\}
.	el \{\
\h'|0'\s\n(33\h'-\n(#~u'\L'|\n(#au-1v'\s0\v'\n(\*(#du-\n(#au+1v'\h'|\n(TWu'\}\}
.if \n(#a>=0 \{.sp -1
.	ie \n(#a=\n(#T \{\
\h'|\n(TWu'\s\n(33\h'-\n(#~u'\L'|\n(#au-1v'\s0\v'\n(\*(#du-\n(#au+1v'\}
.	el \{\
\h'|\n(TWu'\s\n(33\h'-\n(#~u'\L'|\n(#au-1v'\s0\v'\n(\*(#du-\n(#au+1v'\}\}
.ls
.ps \n(38p
..
.ec
.if \n(.tu<=2v .#f
.nr tH 0
.nr 36 \n(.v
.vs \n(.vu-\n(.sp
\h'|0'\s\n(33\l'|\n(TWu\(ul'\s0
.vs \n(36u
.mk #a
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'File suffix\h'|\n(41u'Description
.if \n(.tu<=2v .#f
.nr tH 0
.nr 36 \n(.v
.vs \n(.vu-\n(.sp
\h'|0'\s\n(33\l'|\n(TWu\(ul'\s0
.vs \n(36u
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.a\h'|\n(41u'library
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.ans\h'|\n(41u'Command line answer file.
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.awk\h'|\n(41u'awk script files.
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.c\h'|\n(41u'C source
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.cmdlog\h'|\n(41u'Khoros command execution log file.
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.conf\h'|\n(41u'Configuration file used by \fBghost\fP routines.
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.csh\h'|\n(41u'csh script files.
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.doc\h'|\n(41u'Documentation files formatted for on line help in X applications.
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.f\h'|\n(41u'fortran source
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.form\h'|\n(41u'UIS file describing GUI for xvroutines - used with \fBconductor\fP.
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.jp\h'|\n(41u'Journal Playback files.
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.l\h'|\n(41u'lex source
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.man\h'|\n(41u'Files used for preparing documentation for printing.
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.ms\h'|\n(41u'Manual files containing ms macros.
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.o\h'|\n(41u'object file produced by cc
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.pane\h'|\n(41u'UIS file describing CLUI & GUI - used with \fBcantata\fP & \fBghostwriter\fP.
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.prog\h'|\n(41u'PS file for \fBghostwriter\fP and \fBghostreader\fP.
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.ps\h'|\n(41u'Postscript files ready to be printed.
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.sh\h'|\n(41u'bourne script files.
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.sub\h'|\n(41u'UIS file describing subforms for \fBcantata\fP (has ref's to *.pane files).
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.txt\h'|\n(41u'Text file (README(s) are the exception).
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.vec\h'|\n(41u'Vector font files.
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.xv\h'|\n(41u'Files that are in VIFF format.
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.y\h'|\n(41u'yacc source
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.1\h'|\n(41u'Section one manual page.
.if \n(.tu<=2v .#f
.nr tH 0
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(46u \n(47u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'*.3\h'|\n(41u'Section three manual page.
.fc
.ch #f
.rm #f
.nr T. 1
.T# \n(T.
.rm T#
.rr 3a
.35
.nr #a 0
.TE
.if \n-(b.=0 .nr c. \n(.c-\n(d.-31
