.ds f. ghost.sec
.NH 1 "INTRODUCTION"
.XS
\s12\*(SN  INTRODUCTION\s0
.XE
.sp 2
.PP
\fBGhostwriter, ghostreader\fP, and \fBghostcheck\fP are tools to aid the 
programmer in writing and maintaining all programs (both vroutines and 
xvroutines) in the Khoros System.  The \fBghost routines\fP were used to 
generate and maintain all of the programs that are currently accessible via 
the \fBcantata\fP visual language;  they were also used for the xvroutines 
that comprise all the major Khoros applications.
.PP
The purpose of \fBghostwriter\fP is to create C source code and man pages
for the application program.  The \fIsources\fP of information for 
\fBghostwriter\fP are the User Interface Specification File (UIS file, or 
*.pane file), and the Program Specification File (PS file, or *.prog file).  
The \fIdestination\fP of information extracted by \fBghostwriter\fP
is one or more of five files:  a C file containing the main driver of the
program (*.c), an include file for the program (*.h), a library file (l*.c), 
a man1 file (*.1), and a man3 file (*.3).  The UIS and PS files contain 
information that is modifiable during the writing and maintanence of 
the program;  with this information, the \fBghostwriter\fP code generator 
automates the creation of the standardized portions of the both the code 
and the documentation of the program.  Moreover, \fBghostwriter\fP creates 
the code to parse the command line user interface (CLUI) for you, and fills 
a mediating C structure with the values extracted from the command line so 
that they are conveniently available for use in your program.
.PP
The purpose of \fBghostreader\fP is to create a new PS file from C code and 
man pages.  The \fIsource\fP of information for \fBghostreader\fP is the 
*.c file, the *.h file, the l*.c file, the *.1 file, and the *.3 file,
all of which must have originally been generated with \fBghostwriter\fP.  
The \fIdestination\fP of extracted information is the PS (*.prog) file.  
.sp 3
.NH 1 "GHOSTWRITER"
.XS
\s12\*(SN  GHOSTWRITER\s0
.XE
.sp 2
.NH 2 "FILES GENERATED BY GHOSTWRITER"
.XS
      \*(SN  FILES GENERATED BY GHOSTWRITER
.XE
.sp
.PP
\fBGhostwriter\fP automatically generates the following files, according to the 
information about each argument specified in the UIS (*.pane) and the PS 
(*.prog) files: 
.sp
.in +0.5i
1) the *.c file, containing:
.in +0.5i
a) a main program
.br
b) \fIgw_get_args()\fP, a routine to get user info from the command line
.br
c) \fIgw_usage()\fP, a routine to print the usage
of the program to the user's TTY when the (-U) flag is used,
or when illegal flags are input to the generated program.
.sp
.in -0.5i
2) the *.h file, containing the definition of the C structure in which the
values of the command line arguments will be stored. Fields will be named 
according to the \fIvariable\fP fields on lines specified in the *.pane file.
.sp
3) the *.1 file, containing a man1 page formatted according to
Khoros System specifications and any relevant information provided in the
*.prog file.
.sp
4) the l*.c file in which to program the library routine,
including copyright and header
.sp
5) the *.3 file, containing a man3 page formatted according to
Khoros System specifications and any relevant information provided in the
*.prog file
.sp
6) if no *.prog file is used as input, a template *.prog file will
also be generated.
.sp
7) if no configuration (*.conf) file exists in the current working directory,
a template *.conf file will be generated (configuration files are explained
later)
.in -0.5i
.sp 2
.NH 2 "THE UIS FILE AS INPUT TO GHOSTWRITER"
.XS
      \*(SN  THE UIS FILE AS INPUT TO GHOSTWRITER
.XE
.sp
.PP
Input of a syntactically correct UIS file
is the only requirement for use of the \fBghostwriter\fP
code generation utility. The UIS file must be named "*.pane" when used 
with \fBghostwriter\fP, where "*" indicates the name of the program being 
generated, and is specified using [-name *].  While use of the Program
Specification File (PS file) as well as the *.pane file is recommended,
only a *.pane file is necessary for \fBghostwriter\fP to do the minimum
amount of code generation. This document assumes that you are
familiar with the syntax and use of the *.pane file - if you are not 
familiar with the concept or details of the User Interface Specification,
it is strongly recommended that you read Chapter 2 of the Khoros Programmer's 
Manual before going on with this document.
.PP
Of course, all fields in the *.pane file should be set carefully, especially 
since the UIS file will also be used to define a Graphical User Interface (GUI) 
for the program, as is the case with all Khoros programs.  However, with only 
the command line user interface (CLUI) in mind, you should pay special 
attention to the following fields in each selection description: 
.in +0.5i
.sp
1) The optional field.  This determines whether a program
argument is required or optional on the command line.
.sp
2) The default value.  A valid default value should
be provided for each selection, ESPECIALLY if the
argument is optional.  Remember that integer, float, string, inputfile, and
outputfile toggles take their values from the defaults specified by each
of the members of the toggle.
.sp
3) The description field.  This should be a BRIEF but
EXPLICIT description of the argument.  Explanations
should be limited to a maximum of 40 characters if
possible.
.sp
4) The variable name.  Variable names may be as many
characters long as desired, but variable names are
recommended to be from 1 - 10 characters long.  Conventions for
commonly used variable names are given in Chapter 1 of the Khoros Programmer's
Manual.
.sp
5) Bounds on integer and float arguments. 
Remember that with integer and float toggles, lower bounds must be specified
as the smallest default value, and upper bounds must be specified as the largest
default value.
.sp 2
.in -0.5i
.PP
While it is only necessary to use a *.pane file as input to \fBghostwriter\fP,
complete code generation cannot be accomplished with such a limited amount
of information. When using only a *.pane file as input, the \fIgw_get_args()\fP
routine can be completely generated in the *.c file.  The \fIgw_usage()\fP 
routine can also be completely generated, although use of the *.prog file 
can make this routine print a more explicit usage statement for the user of 
the program.  However, the main program generated will be only a skeleton.
.PP
The C structure through which the application program will access command line
arguments can be completely generated in the *.h file with only a *.pane file as
input;  however, with a *.prog file,  #defines, macros, and other C code
appropriate for a *.h file may also be generated.
.PP
Since the information provided in the *.pane file is simply not sufficient for
\fBghostwriter\fP to do anything further, the *.1, *.3, and l*.c files will be
nothing more than skeletons when only a *.pane file is used.  These skeletons,
however, will be in keeping with the standard Khoros system format.
.sp
.in -0.5i
.sp 2
.NH 3 "Example UIS Files"
.XS
              \*(SN  Example UIS Files
.XE
.sp 
.ps 9
.vs 10
.sp
-F 4.2 1 0 170x7+10+20 +35+1 'Form title' form_name
.br
  -M 1 0 100x40+10+20 +22+1 'Subform Title' subform_name
.br
    -P 1 0 80x38+22+2 +17+1 'Pane Title' pane_name
.br
      -I 1 0 0 1 0 1 50x1+2+3 +0+0 'default' 'InputFile  Title' 'description' i
.br
      -O 1 0 0 1 0 1 50x1+2+4 +0+0 'default' 'OutputFile Title' 'description' o
.br
      -i 1 0 1 0 0 50x1+2+6 +0+0 0 0 1 'Integer Title' 'description' v
.br
      -f 1 0 1 0 0 50x1+2+7 +0+0 0 0 1 'Float   Title' 'description' f
.br
      -s 1 0 1 0 0 50x1+2+8 +0+0 'default' 'String Title ' 'description' s
.br
      -l 1 0 1 0 0 20x1+2+10 +0+0 1 'Logical Title' 'False' 'True' 'description' l
.br
    -E
.br
  -E
.br
-E
.sp 2
.nr PS 11
.nr VS 13
.PP
The UIS file given above describes a Khoros program with six arguments.  The
input file and output file arguments are required, while the integer, float,
string and logical arguments are optional.  The float and integer arguments
are unbounded, with defaults of one (1.0). The minimum syntax required of the
user to run the program would be:
\f(CW
% program_name -i {input file} -o {output file}
\fP
.sp
.PP
Occasionally, a program will have no need for any arguments at all.  
\fBGhostwriter\fP will work for such programs, but still must have a UIS file.  
In this event, create a "shell" UIS file.  A shell UIS file looks like the one 
above, but has none of the UIS lines that describe program arguments.  
For example:
.sp
.ps 9
.vs 10
.sp
-F 4.2 1 0 170x7+10+20 +35+1 'Form title' form_name
.br
  -M 1 0 100x40+10+20 +22+1 'Subform Title' subform_name
.br
    -P 1 0 80x38+22+2 +17+1 'Pane Title' pane_name
.br
.br
    -E
.br
  -E
.br
-E
.nr PS 11
.nr VS 13
.sp 2
.NH 2 "The PS FILE AS INPUT TO GHOSTWRITER"
.XS
      \*(SN  THE PS FILE AS INPUT TO GHOSTWRITER
.XE
.sp
.PP
Use of the Program Specification (PS) File will make possible the future 
maintenance of the program with \fBghostreader\fP and \fBghostwriter\fP, 
and is very strongly recommended.  The PS file is always named "*.prog", 
where "*" indicates the name of the program being generated, and is specified 
with [-name *].  The *.prog file is a simple ascii file.  It contains \fIkeys\fP
that delineate \fItext blocks\fP to be placed in designated target positions
in the files generated.  By placing appropriate text blocks between each set 
of \fIbegin\fP and \fIend keys\fP, you can specify the blocks of text that 
are to appear in certain places in the files generated.  An example of a 
text block in a *.prog file which specifies the author's name is as follows:
.sp
\f(CW
-authors
.br
Danielle Argiro
.br
-authors_end
\fP
.sp
.PP
Notice that the \fIbegin key\fP is the string "-authors".  All keys must appear in the first column of the .prog file, and all keys begin with a "-"
sign.  The text block may not begin on the same line as the begin key.
Note that the \fIend key\fP is identical to the begin key, except that "_end"
is appended.  The \fIend key\fP designates the end of the text block, and
must appear by itself in the first column of the .prog file. Note that begin
keys and end keys MUST be spelled exactly! If a key is modified, it will not
be recognized by \fBghostwriter\fP. 
.PP
While it is essential the keys must be spelled exactly in the .prog file,
\fBghostreader\fP & \fBghostwriter\fP will accept either upper or lower case 
letters in the keys.  For instance, the "-authors" key will also be accepted 
if it appears as "-Authors", or "-AUTHORS".  \fBGhostreader\fP takes an old
*.prog file as input;  thus, if you modify the keys in your *.prog file
to be upper case, the next time you run \fBghostreader\fP, the new *.prog file
generated will also have keys in upper case.
.PP
Key words are descriptive not only of the contents of the text
block, but also of the location of its target position.  Since "-authors"
will have more than one target position, it is not a good example of this,
so let us take another example:
.sp
\f(CW
-main_library_call
.br
if (!(our_library_routine(image1, image2)))
.br
{
.br
    fprintf(stderr, "Cannot perform function\n");
.br
    exit(1);
.br
}
.br
-main_library_call_end
\fP
.sp
.PP
As one might guess, this segment is to go to the \fImain program\fP.  It is
the library call to be made to the library routine that you will be write to
provide functionality to your program.  Since the \fItarget position\fP of 
the text block is the main program, the text block must be in correct C syntax. 
When \fBghostwriter\fP is run, it will insert the call to 
\fIour_library_routine()\fP into the main program that is generated.
.PP
We will not discuss each of the keys and their text blocks here, as that
information is documented in a later section; it is worth mentioning here that
by using the *.prog file correctly, you can add the following items 
to the code and man pages generated by \fBghostwriter\fP:
.sp
\(bu
Your name, as the author
.br
\(bu
Any desired additions to the *.h file, including #defines or other #includes
.br
\(bu
Macros to be added to the *.h file
.br
\(bu
A short description of the program, to appear in the man1 file, the header
of the main program, and the \fIgw_usage()\fP routine
.br
\(bu
A list of variables to be declared in the main program
.br
\(bu
Any C code to appear before the call to the library routine
.br
\(bu
The call to the library routine itself
.br
\(bu
Any C code to appear after the call to the library routine
.br
\(bu
Any desired \fIfprintf()\fP statements to add into the \fIgw_usage()\fP routine
.br
\(bu
A detailed description of the program and its usage to appear in the man1 file
.br
\(bu
Examples of proper execution of the program from the command line, 
to appear in the man1 file
.br
\(bu
Any program restrictions to be documented in the man1 file
.br
\(bu
Other documentation to be listed under "See Also" in the man1 file
.br
\(bu
A short description of the library routine, to appear in the man3 file and
the header of the library routine
.br
\(bu
Descriptions of all input arguments to the library routine, to appear in
the header of the library routine
.br
\(bu
Descriptions of all output arguments to the library routine, to appear in
the header of the library routine
.br
\(bu
The formal C definition of the library routine
.br
\(bu
A detailed description of the library routine, to appear in the man3 file
.br
\(bu
Any restrictions on the use of the library routine to appear in the man3 file
.br
\(bu
Other documentation to be listed under "See Also" in the man3 file
.sp
.PP
A completed *.prog file makes it possible for \fBghostwriter\fP
to generate the code necessary for a Khoros program in its entirety.
However, it is up to you to make sure that you use the *.prog file correctly 
and completely - no checking of text blocks is done to ensure correct use.  
Errors in C code will not be detected by \fBghostwriter\fP, and will not
be apparent until the generated code is compiled.  Errors in the \fInroff\fP
formatting of text blocks to appear in man pages will not be apparent until
the man pages are formatted.
.sp 2
.NH 3 "Template PS File (using UPPER CASE)"
.XS
              \*(SN  Template PS File
.XE
.sp 2
.PP
The following is an example of a template *.prog file like the one that might be
generated by \fBghostwriter\fP if an existing *.prog file was not already 
present; however, while the template *.prog file generated by \fBghostwriter\fP
is in lower case, the following example shows the \fIbegin\fP and 
\fIend keys\fP in upper case, as is preferred by some Khoros programmers. 
.sp 
\f(CW
-AUTHORS
.br
-AUTHORS_END
.sp
-LIBRARY_MODS
.br
-LIBRARY_MODS_END
.sp
-SHORT_PROG_DESCRIPTION
.br
-SHORT_PROG_DESCRIPTION_END
.sp
-SHORT_LIB_DESCRIPTION
.br
-SHORT_LIB_DESCRIPTION_END
.sp
-MAN1_LONG_DESCRIPTION
.br
-MAN1_LONG_DESCRIPTION_END
.sp
-MAN1_EXAMPLES
.br
-MAN1_EXAMPLES_END
.sp
-MAN1_RESTRICTIONS
.br
-MAN1_RESTRICTIONS_END
.sp
-MAN1_SEE_ALSO
.br
-MAN1_SEE_ALSO_END
.sp
-MAN3_LONG_DESCRIPTION
.br
-MAN3_LONG_DESCRIPTION_END
.sp
-MAN3_RESTRICTIONS
.br
-MAN3_RESTRICTIONS_END
.sp
-MAN3_SEE_ALSO
.br
-MAN3_SEE_ALSO_END
.sp
-USAGE_ADDITIONS
.br
-USAGE_ADDITIONS_END
.sp
-INCLUDE_INCLUDES
.br
-INCLUDE_INCLUDES_END
.sp
-INCLUDE_ADDITIONS
.br
-INCLUDE_ADDITIONS_END
.sp
-INCLUDE_MACROS
.br
-INCLUDE_MACROS_END
.sp
-MAIN_VARIABLE_LIST
.br
-MAIN_VARIABLE_LIST_END
.sp
-MAIN_BEFORE_LIB_CALL
.br
-MAIN_BEFORE_LIB_CALL_END
.sp
-MAIN_LIBRARY_CALL
.br
-MAIN_LIBRARY_CALL_END
.sp
-MAIN_AFTER_LIB_CALL
.br
-MAIN_AFTER_LIB_CALL_END
.sp
-LIBRARY_INCLUDES
.br
-LIBRARY_INCLUDES_END
.sp
-LIBRARY_INPUT
.br
-LIBRARY_INPUT_END
.sp
-LIBRARY_OUTPUT
.br
-LIBRARY_OUTPUT_END
.sp
-LIBRARY_DEF
.br
-LIBRARY_DEF_END
.sp
-LIBRARY_CODE
.br
-LIBRARY_CODE_END
\fP
.sp 2
.NH 2 "SYNTAX FOR USING GHOSTWRITER"
.XS
      \*(SN  SYNTAX FOR USING GHOSTWRITER
.XE
.sp 
         -name  name of program to be generated  (string)
.sp 2
        [-config]  use configuration file? (boolean) [false]
.sp
        [-lib]  generate lib file? (boolean) [true]
.sp
        [-man3]  generate man3 file? (boolean) [true]
.sp
        [-install]  install output? (boolean) [false]
.sp
        [-format]  formatting (0 = none, 1 = nroff) (integer, 0 to 1) [1]
.sp
        [-debug]  generate debug statements in main? (boolean) [false]
.sp
        [-tag]  append tags on variable names? (boolean) [true]
.sp
        [-force]  force output? (boolean) [false]
.sp
        [-type]  type of program
.br
		'prog' (vroutine)
.br
		'xprog' (xvroutine)
.br
		[default = prog]
.sp 2
        [-U] Gives the usage for writer
.sp
        [-P] Prompts for command line options
.sp
        [-A [file1]] Creates the answer file called writer.ans or file1
.sp
        [-a [file1]] Uses writer.ans or file1 as the answer file
.sp 3
.IP name: 10
The name of the program to be generated, as well as the base name "*" in all
files used by \fBghostreader\fP and \fBghostwriter\fP: 
*.c, *.h, l*.c, *.1, *.3, *.pane,
*.prog, and *.conf.  This name may be a maximum of 9 characters long, so that
the length of generated files with postfixes will meet the 14 character limit
of filenames on System V machines.  This is the one argument required by both
\fBghostreader\fP and \fBghostwriter\fP.
.IP config: 10
Provide a value of True (1) if a configuration file, *.conf, is to be used with
\fBghostwriter\fP.  Configuration files will be explained in detail in a
later section.  Note that if a configuration file is to be used, it MUST 
exist in the local "." directory where \fBghostwriter\fP is executed.
.IP lib: 10
Provide a value of False (0) if no library file is to be generated.  Note that
not all programs need a library file.
.IP man3: 10
Provide a value of False (0) if [-lib] is also specified as False (0).  Any
program that does not have a library file has no need for a man3 file.
.IP install: 10
Provide a value of True (1) if output files of \fBghostwriter\fP are to be installed
at the locations specified by the configuration file.  The install flag will be
discussed further in a later section, along with configuration files.  Note that
a value of True (1) should ONLY be provided for [-install] when a value of
True (1) is also provided for [-config].
.IP format:
Provide a value of 0 ONLY if \fInroff\fP is not available on your system. 
The default value of 1 (indicating use of \fInroff)\fP should otherwise 
be used.  No other values for [-format] are available at this time.
.IP debug:
Generally used only by members of the Khoros programming staff, providing
a value of True (1) for [-debug] will cause \fBghostwriter\fP to put fprintf()
statements in the main() of the generated program, so that values returned 
from the gw_get_args() routine are printed out.
.IP tag:
If [-tag] is specified as False (0), the variable tags (_int, _float, _string, 
etc) are NOT tacked onto the end of the command line argument structure
that is generated in the *.h  file.  This is a question of programming style.
In general, only Khoros xvroutines use [-tag 0].
.IP force:
If [-force] is specified as True (1), output from \fBghostwriter\fP will automatically
over-write any existing files by the same name;  the user will not be prompted
before files are clobbered.
.IP
The [-type] flag is optional, and defaults to 'prog', implying that the program
being written is a \fIvroutine\fP.  If you are writing an \fIxvroutine\fP, it 
is very important that you remember to provide the [-type xprog] argument to
\fBghostwriter\fP.  The distinction between Khoros \fIvroutines\fP and Khoros
\fIxvroutines\fP is made clearly in Chapter 1 of the Khoros Programmer's 
Manual.  If you do not understand the difference, you should review the first
section of that chapter now.  If you are writing an xvroutine and you forget
to provide the [-type xprog] flag to \fBghostwriter\fP, the *.c file and 
l*.c file will incorrectly include "vinclude.h", when they should in fact 
be including "xvinclude.h".  In addition, the Imakefile that is generated 
will not include links to the Xlib, Xt, and Xaw libraries, and your code 
will not compile.  If you forget the [-type xprog] argument when writing an
xvroutine, simply remember to change references to "vinclude.h" to 
"xvinclude.h".  Then, remove the Imakefile and Makefile created by 
\fBghostwriter.\fP  Create the correct Imakefile & Makefile by executing:
\f(CW
.sp
% imkmf -name xvroutine -type xprog
.sp
% makemake
.sp
.LP
.sp 3
.NH 1 "GHOSTREADER "
.XS
\s12\*(SN  GHOSTREADER \s0 
.XE
.sp 2
.NH 2 "UPDATING THE PS FILE"
.XS
      \*(SN  UPDATING THE PS FILE
.XE
.sp 
.PP
\fBGhostreader\fP was written to be used in conjunction with \fBghostwriter\fP; 
its function is the opposite of that of \fBghostwriter\fP.  \fBGhostwriter\fP 
takes a *.prog file as input, and outputs C code and man files; 
\fBghostreader\fP, on the other hand, takes the C code and man files as input, 
and outputs an updated *.prog file.  
.PP
The philosophy behind \fBghostreader\fP is that while the *.prog file is very 
useful for maintaining complete code and detailed man pages, it is not natural 
for a programmer to actually program within the confines of such a file.  
It is much more convenient to simply modify the C files themselves before 
compiling and testing them, rather than to update a *.prog file, re-run 
\fBghostwriter\fP, and finally re-compile and test the newly-generated code.  
For this reason, \fBghostreader\fP was written.  After running \fBghostwriter\fP
for the first time, you may modify the *.h, *.c, l*.c, *.1, and *.3 files 
as desired.  When all is in order, run \fBghostreader\fP in order to update 
the *.prog file to be consistent with the contents of these files.  Later on,
when you decide to add or delete an argument to the program by modifying the
*.pane file and using \fBghostwriter\fP again, you will risk no danger of 
having your previous changes over-written.  
.sp 2
.NH 2 "INPUT TO GHOSTREADER"
.XS
      \*(SN  INPUT TO GHOSTREADER
.XE
.sp 
.PP
\fBGhostreader\fP takes as input the *.c, *.h, l*.c, *.1, and *.3 files, 
and looks in each for the \fItags\fP that were generated by \fBghostwriter\fP.
Assuming that the \fItags\fP have not been manually corrupted, it will find
the appropriate information with which to update each of the textblocks 
in the *.prog file.  After each file has been inspected, and the 
appropriate \fItext blocks\fP extracted, the new *.prog file is written out, 
with all its text blocks updated according to what was found in the input files.
If any of the \fItags\fP are not found in the input files, \fBghostreader\fP 
will print a warning message.
.PP
If a *.prog file already exists for a program, \fBghostreader\fP will read this
program specification from the existing *.prog file first.   Then, it will 
over-write entries in the program specification written as it finds text blocks 
in the various input files.  Thus, if some input files are not found, or keys
for certain text blocks are not found in the input files, \fBghostreader\fP
will make sure that the original entries are not blanked out.  If for some 
reason the old *.prog file becomes corrupted, (assuming that all the other
input files for \fBghostreader\fP are correct and up to date) it should be 
deleted before \fBghostreader\fP is re-run. 
.PP
.sp 2
.NH 2 "SYNTAX FOR USING GHOSTREADER"
.XS
      \*(SN  SYNTAX FOR USING GHOSTREADER
.XE
.sp 2
	-name  name of program to be generated  (string)
.sp 2
        [-config]  use configuration file? (boolean) [false]
.sp
        [-lib]  use library file as input? (boolean) [true]
.sp
        [-man3]  use man3 file as input? (boolean) [true]
.sp
        [-install]  install output? (boolean) [false]
.sp
        [-format]  formatting (0 = none, 1 = nroff) (integer, 0 to 1) [1]
.sp
        [-prog]  use the old *.prog file? (boolean) [true]
.sp
        [-force]  force output? (boolean) [false]
.sp 2
        [-U] Gives the usage for ghostreader
.sp
        [-P] Prompts for command line options
.sp
        [-A [file1]] Creates the answer file called reader.ans or file1
.sp
        [-a [file1]] Uses reader.ans or file1 as the answer file
.sp
.IP name: 10
The name of the program to be updated is the only required argument for 
\fBghostwriter\fP. The *.c, *.h, l*.c, *.1, *.3, *.prog, *.pane, and 
*.conf files MUST all have this basename.  If other names are used, 
\fBghostreader\fP will not work properly.
.IP config: 10
Provide a value of True (1) if a configuration file, *.conf, is to be used with
\fBghostreader\fP.  Configuration files will be explained in detail in a 
later section.  Note that if a configuration file is to be used, it MUST 
exist in the local "." directory where \fBghostreader\fP is executed.
.IP lib: 10
Provide a value of False (0) if the program in question does not have 
a library file.  In particular, you must specify [-lib 0] with 
\fBghostreader\fP when you previously specified [-lib 0] with \fBghostwriter\fP.
.IP man3: 10
Provide a value of False (0) if the program in question does not have 
a library file (and, therefore, no man3 file).  In particular, you must 
specify [-man3 0] with \fBghostreader\fP when you previously specified 
[-man3 0] with \fBghostwriter\fP.
.IP install: 10
Provide a value of True (1) if the *.prog output file of \fBghostreader\fP is 
to be installed at the location specified by the configuration file.  
The install flag will be discussed further in a later section, along with 
configuration files.  Note that a value of True (1) should ONLY be provided 
for [-install] when a value of True (1) is also provided for [-config].
.IP format:
Provide a value of 0 ONLY if \fInroff\fP is not available on your system. 
The default value of 1 (indicating the use of the \fInroff\fP formatter) 
should otherwise be used.  No other values for [-format] are available at 
this time.
.IP prog:
Provide a value of 0 ONLY if you think that the old *.prog file has been
corrupted in some way.
.IP force:
Provide a value of 1 ONLY if you want \fBghostreader\fP to over-write the
old *.prog file without prompting you first.
.sp 3
.NH 1 "CONFIGURATION FILES"
.XS
\s12\*(SN  CONFIGURATION FILES\s0
.XE
.sp 2
.NH 2 "DEFINITION OF THE CONFIGURATION FILE"
.XS
      \*(SN  DEFINITION OF THE CONFIGURATION FILE
.XE
.sp 
.PP
The configuration file (*.conf) used by \fBghostreader\fP and \fBghostwriter\fP 
is a simple ascii file that specifies pathnames for the various input and 
output files;  this same configuration file is also used with the \fBkinstall\fP
program,  which helps to automate the installation process of a vroutine.  
Use of the configuration file (specified with the [-config 1] flag) is 
optional for both \fBghostreader\fP and \fBghostwriter\fP, and is generally
intended for the convenience of those who are maintaining code in /src, 
where there may be many different locations for files.  It is important to note
that the configuration file serves a dual purpose:  it is used by 
\fBghostreader\fP and \fBghostwriter\fP to indicate destinations where
files are to be output (if the destination is other than the current working
"." directory), and it is also used by the \fIkinstall\fP program to specify
where to install the different files associated with a program.
.PP
The first time that \fBghostwriter\fP is run, a template configuration file
will be created for you, and any time thereafter that no *.conf file exists 
in the current working directory.  The locations specified for files in the 
template configuration file will be the local "." directory; you may edit
this file as desired in order to specify locations other than the local
directory.
.PP
Especially when maintenance of a program under the Khoros system is an issue, 
use of the configuration file is quite useful. The configuration file is 
always named "*.conf", where "*" indicates the name of the program being 
generated, and is specified with [-name *].  The *.conf file MUST exist 
in the the current "." directory where \fBghostreader\fP or \fBghostwriter\fP 
is being run.  
.PP
Each line of the configuration file contains a \fIfile key\fP that tells 
which file is being referring to, followed by the correct path specifying 
where that file is to be found.  Each \fIfile key\fP must be followed by a 
colon and a space before the pathname is specified.  Use of a tilde '~' 
is allowed in a pathname, as are the environment variables KHOROS_HOME and
KHOROS_CONTRIB.  Note that the configuration file uses \fIpathnames\fP 
and not \fIfilenames\fP.  The file keys that are used in the configuration file 
by \fBghostreader\fP, \fBghostwriter\fP, and \fBkinstall\fP are as follows:
.br
.IP cpath: 10
path to input *.c file
.IP hpath: 10
path to input *.h file
.IP lpath: 10
path to input l*.c file
.IP man1path: 10
path to input *.1 file
.IP man3path: 10
path to input *.3 file
.IP progpath: 10
path to old *.prog file
.IP panepath: 10
path to old *.pane file
.IP helppath: 10
path to online documentation file for this program
.IP subhelppath: 10
path to online documentation file for the \fBcantata\fP subform from which
the program may be accessed
.IP topsrc: 10
(use optional) when used, provides the base directory to which the "cpath", 
"hpath", "lpath", and "progpath" paths are relative.  This file key is 
\fIalways\fP specified as either \f(CWKHOROS_HOME/src/\fP or 
\f(CWKHOROS_CONTRIB/src\fP.
.sp 2
.NH 2 "EXAMPLE CONFIGURATION FILE"
.XS
      \*(SN  EXAMPLE CONFIGURATION FILE
.XE
.sp 
.LP
As an example, let us take the \fBvadd\fP image processing program.
The vadd.c, vadd.h, and vadd.prog files are found in
\f(CWKHOROS_HOME/src/vipl/arith_binary/vadd\fP.  The library file for 
\fBvadd\fP, lvadd.c, is found in \f(CWKHOROS_HOME/src/vipl/Lib\fP,  while 
the man1 and man3 pages are found in \f(CWKHOROS_HOME/man/man1\fP and 
\f(CWKHOROS_HOME/man/man3\fP, respectively.  Finally,
the vadd.pane file is found in 
\f(CWKHOROS_HOME/repos/cantata/subforms/arith_binary\fP,
as the \fBvadd\fP program is callable by the \fBcantata\fP 
visual language program, and is located with the other binary 
arithmetic programs.  The help file specific to the \fBvadd\fP program
is found in \f(CWKHOROS_HOME/doc/cantata/subforms/arith_binary/help\fP,
while the help file for the "Binary Arithmetic" subform from which the 
\fBvadd\fP program may be accessed is located in the directory above that.
The configuration file for \fBvadd\fP, then, looks like this:
.sp
topsrc: KHOROS_HOME/src
.br
cfile: vipl/arith_binary/vadd
.br
hfile: vipl/arith_binary/vadd
.br
lfile: vipl/Lib
.br
man1file: KHOROS_HOME/man/man1
.br
man3file: KHOROS_HOME/man/man3
.br
progfile: vipl/arith_binary/vadd
.br
panefile: KHOROS_HOME/repos/cantata/subforms/arith_binary
.br
helpfile: KHOROS_HOME/doc/cantata/subforms/arith_binary/help
.br
subhelpfile: KHOROS_HOME/doc/cantata/subforms/arith_binary
.sp 
.PP
The last two entries in the configuration file are NOT used by 
the \fBghost routines\fP.  They are used exclusively by the \fBkinstall\fP
installation program, so that \fBkinstall\fP can correctly install the 
online help documentation for the program.  Again, note that the use of the
"topsrc" file key is not necessary; it is provided so that we may specify
\fIrelative paths\fP for the source code and PS file.  
If, in the configuration file for vadd,
we had elected not to use the "topsrc" file key, we would have specified
\f(CWKHOROS_HOME/src/vipl/arith_binary/vadd\fP as the pathname for the
"cfile", "hfile", and "progfile", and would have specified 
\f(CWKHOROS_HOME/src/vipl/Lib\fP for the "lfile".
.sp 2
.NH 2 "USING [-CONFIG] and [-INSTALL]"
.XS
      \*(SN  USING [-CONFIG] and [-INSTALL]
.XE
.sp 2
.PP
When the [-config] flag is NOT specified as True (1) for \fBghostreader\fP and 
\fBghostwriter\fP, both programs look for input and write output to the local
"." directory.  Also note that when the [-config] flag is specified as False 
(0), the value of the [-install] flag has no effect.
.PP
When the [-config] flag IS specified as True (1) but the [-install] flag is
left as False (0) for either \fBghostwriter\fP or \fBghostreader\fP, 
the programs will both look for INPUT FILES ONLY at the locations specified in 
the configuration file.  Thus, \fBghostwriter\fP will use the paths specified 
for "panefile" and "progfile" to find the *.pane and *.prog files for its input,
while \fBghostreader\fP will use the paths specified for the "cfile", "hfile", 
"lfile", "man1file", and "man3file" file keys to find its input files. 
The OUTPUT from both programs, however, will still go to the local "." 
directory.  Even though some lines of the configuration file may not be used, 
the configuration file MUST still be COMPLETE as shown above.
.PP
When the [-config] and [-install] flags are BOTH specified as True (1) for
\fBghostwriter\fP or \fBghostreader\fP, this indicates to either program that 
that the paths in the configuration file are to be used for BOTH INPUT AND 
OUTPUT. 
.DE
.sp 3
.NH 1 "CREATING & MAINTAINING NEW ROUTINES"
.XS
\s12\*(SN  CREATING & MAINTAINING NEW ROUTINES\s0
.XE
.sp 2
.NH 2 "METHOD FOR USING GHOST ROUTINES"
.XS
      \*(SN  METHOD FOR USING GHOST ROUTINES
.XE
.sp 2
.PP
\fBGhostwriter\fP and \fBghostreader\fP were written specifically to be used 
together, and it is highly recommended that you do so.  The following are a few
suggested methods for creating a program with a command-line user interface
using \fBghostreader\fP and \fBghostwriter\fP:
.sp
.B
Method 1
.R
.sp
1) Create a syntactically correct UIS file, named "*.pane" where "*" is the 
name of your program-to-be.  Make sure that lines in the *.pane file are 
equipped with appropriate \fIvariable\fP fields, \fIdefault\fP values, and 
\fIdescriptions\fP. Set \fIoptional\fP fields carefully, and pay close 
attention to \fIbounds\fP on integers and floats.  Make sure that there is 
one line in your *.pane file for each desired argument to your program.  
Use \fBpreview\fP, if applicable, to make sure that your
*.pane file defines a visually pleasing graphical user interface.
.sp
2) Use \fBghostwriter\fP with a *.pane file as input only. When no *.prog file 
is found, \fBghostwriter\fP will automatically generate a template *.prog file 
with all the correct begin and end keys.  This template will be in lower case.  
If you prefer upper case, edit the *.prog file immediately and change all 
\fIbegin \fP and \fIend\fP keys to upper case.
.sp
3) Modify the *.c, *.h, l*.c, *.1, and *.3 files as desired, being very careful
not to delete any of \fBghostwriter's\fP \fItags\fP out of the C files, and also
being very careful not to change the format of the man pages in any way.  
.sp
4) Use \fBghostreader\fP to update the *.prog file according to changes made 
to any files in step (3).
.sp
5) Re-iterate steps (3) and (4) as many times as necessary.
.sp
.B
Method 2
.R
.sp
1) Follow Step 1 of Method 1.
.sp
2) Follow Step 2 of Method 1.
.sp
3) Modify the *.prog file as desired, being very careful to put correct C code
into \fItext blocks\fP that call for C code, and doing careful nroff formatting
for \fItext blocks\fP that will go into man pages.
.sp
4) Use \fBghostwriter\fP to update the *.c, *.h, l*.c *.1, and *.3 files according
to changes made to the *.prog file.
.sp
5) Re-iterate steps (3) and (4) as many times as necessary.
.sp
.B
Method 3
.R
.sp
1) Follow Step 1 of Method 1.
.sp
2) Follow Step 2 of Method 1.
.sp
3) Modify the *.c, *.h, and l*.c files as desired.  Compile and debug program.
.sp
4) Run \fBghostreader\fP to update *.prog file with changes made to *.c, *.h, and
l*.c files.
.sp
5) Update all the \fItext blocks\fP in the *.prog file that DO NOT DEAL with
source code in any way, i.e, all those that have a destination in headers or
in man pages.
.sp
6) Run \fBghostwriter\fP to update *.c, *.h, and l*.c with improved headers as 
specified in the *.prog file, and to update the *.1 and *.3 files with more
extensive information.
.sp
7) When changes to source code are needed, re-iterate steps (3) 
and (4) as needed.
.sp
8) When changes to documentation are needed, re-iterate steps (5) and (6) 
as needed.
.sp 2
.PP
Theoretically, Method 1 or Method 2 are the simplest and the most 
straightforward.  However, as you become more familiar with the use of 
\fBghostreader\fP and \fBghostwriter\fP, you will find (as we have!) that Method 3 is
certainly the most realistic in practice.  To avoid any pitfalls presented
by Method 3, NEVER follow step (3) with step (5) or vice versa.  Can you see
how doing this will always result in some of your changes being clobbered?
.PP
Later, when maintenance becomes an issue, you may wish to add new command 
line arguments, or delete old command line arguments.  This is easily 
achieved through the following sequence:
.sp
.in +0.5i
1) Make sure that your *.prog file is up to date.  Run \fBghostreader\fP 
if necessary.
.br
2) Update the *.pane file to specify new command line argument(s).
.br
2) Run \fBghostwriter\fP with the modified *.pane file 
and the current *.prog file as input.
.br
3) Re-compile and test.
.in -0.5i
.sp 3
.NH 2 "USING GHOSTCHECK"
.XS
      \*(SN  USING GHOSTCHECK
.XE
.sp 2
.PP
Often, after some time has elapsed since you last worked on your program,
you may find that you have forgotten whether the last program executed was
\fBghostreader\fP or \fBghostwriter\fP.  This may be somewhat worrisome, as
there does exist a possibility that you may over-write changes if 
you run the wrong program.  The simple way to avoid this is \fIalways\fP to
follow changes to source code & man pages with a run of \fBghostreader\fP,
and changes to the *.prog file with a run of \fBghostwriter\fP.  However, 
in the event that you feel uncertain, the \fBghostcheck\fP program is 
available to give helpful advice.  Simply execute:
.sp
\f(CW
% ghostcheck -name {program name}
.sp
\fP
.PP
Based on the dates of the files involved, \fBghostcheck\fP will provide advice
as to the best way to proceed.  Remember that \fBghostcheck\fP is not a 
particularly "smart" program.  It has no way to compare actual text blocks
in the PS file with the contents of the source code and man pages; it relies
solely on file dates to provide you with a good idea of the best next step.
Therefore, it is fallible since its advice can be incorrect if a file has 
been touched but not changed.  However, if you feel lost, it is always 
worthwhile to run \fBghostcheck\fP.
.sp 2
.NH 2 "TIPS FOR USING GHOSTWRITER AND GHOSTREADER"
.XS
      \*(SN  TIPS FOR USING GHOSTWRITER AND GHOSTREADER
.XE
.sp 2
.PP
Most importantly, DO NOT DELETE OR CHANGE ANY \fITAGS\fP that are inserted into
generated C code by \fBghostwriter\fP.  These tags are necessary for 
\fBghostreader\fP to operate correctly; If you make any change to the 
begin or end tags, \fBghostreader\fP will no longer be able to update the 
*.prog file for that text block.  These tags will appear as the corresponding
begin and end keys from the *.prog file, within comments.  
For example, the tags marking the text block inserted into the main for 
the main library call might look like:
.sp
\f(CW
/* -main_library_call */
.br
if (!(our_library_routine(image1, image2)))
.br
{
.br
    fprintf(stderr, "Cannot perform function");
.br
    exit(1);
.br
}
.br
/* -main_library_call_end */
\fP
.sp
.PP
DO NOT CHANGE THE FORMAT OF THE MAN FILES IN ANY WAY.  There are two reasons
for this.  Like the keys inserted into C code to mark text blocks,
certain automatically generated lines in the man pages are used as keys to mark
the beginning and ending of text blocks;  however, unlike the keys that are
inserted into the C code,  the lines of the man pages used as keys by 
\fBghostwriter\fP are not at all obvious - they are simply selected pieces of 
the predefined man page structure.  If you accidentally change or delete
one of these, \fBghostreader\fP will no longer be able to update the *.prog 
file with these text blocks that appear in the man pages.  The other reason is 
that the man pages are generated the way they are to conform to the Khoros 
System standard.  One of the main goals of \fBghostreader\fP and 
\fBghostwriter\fP is to enforce these standards.  Therefore, if you change the 
format of the man files, your modifications will be counter-productive to the 
objectives of the code-generating tools that are attempting to aid you.
.PP
USE GHOSTREADER AND GHOSTWRITER CONSISTENTLY.  Always make sure that you run
\fBghostreader\fP after you are finished updating the *.c, *.h, l*.c *.1, 
and *.3 files. Always make sure that you run \fBghostwriter\fP after updating 
the *.pane file and/or the *.prog file.
.PP
USE THE [-format] OPTION CONSISTENTLY.  The default value of this option, which
is provided with both \fBghostreader\fP and \fBghostwriter\fP, is for nroff 
formatting.  Best results will be gained when the text blocks in the .prog file 
which are not C code have nroff commands inserted where they will 
make the text look nice.  If for some reason, you do not wish to format text 
blocks with nroff, the [-format 0] option should be specified, to indicate 
that no formatting is desired.  Either way, it is STRONGLY suggested that you
be consistent with \fBghostreader\fP and \fBghostwriter\fP.  If [-format 0] 
is used with \fBghostreader\fP, it should also be used with \fBghostwriter\fP.  
Furthermore, once a program is generated with [-format 0], you can NEVER go 
back to [-format 1] (or vice versa).  Formatting of man pages and 
documentation will be permanently corrupted if this happens. 
.PP
USE THE [-lib] AND [-man3] OPTIONS CONSISTENTLY. Some programs have no library
file, and thus no man3 page either.  Accordingly, \fBghostwriter\fP should be
run with [-lib 0] and [-man3 0].  However, it is important to remember that
both \fBghostwriter\fP and \fBghostreader\fP must from now on \fIalways\fP
be run with [-lib 0] and [-man3 0].  In general, consistent use of the 
[-format], [-lib] and [-man3] options can painlessly be achieved through use
of the answer (*.ans) file, described earlier.
.sp 2
.NH 2 "CONVENTIONS FOR VARIABLE NAMES"
.XS
      \*(SN  CONVENTIONS FOR VARIABLE NAMES
.XE
.sp 2
.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 the \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".  When you are referring to another
.br
		type of file format, be specific, eg, "SUN raster 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 
.br
		\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	rows and columns
.br

.br
	b	bands
.br

.br
	a,A,P,U,V reserved for predefined command line arguments
.br
.sp 3
.NH 1 "GUIDE FOR CREATING THE PS FILE"
.XS
\s12\*(SN  GUIDE FOR CREATING THE PS FILE\s0
.XE
.sp 2
.PP
The following table outlines guidelines to be used when creating 
the *.prog file to be used by \fBghostreader\fP and \fBghostwriter\fP.
.PP
Column one gives the KEYS to be used in the *.prog file, to insert desired 
text and code segments into files generated by \fBghostwriter\fP.  
(To illustrate what should be provided for each, see the excerpt from 
the *.prog file for \fBvadd\fP following the table.)
.PP
In the next two columns are the DESCRIPTION of each key, and the TARGET 
positions where the text will be inserted.  If there is not a one-to-one 
correspondence between the text block and the target position for 
\fBghostwriter,\fP
the SOURCE for \fIghostreader\fP is documented under column 3.  (In general 
when there is more than one target position for a text block with 
\fBghostwriter,\fP \fBghostreader\fP will take the man3 file or the 
man1 file as its source.)
.PP
Our example uses the program \fBvadd\fP, so the files generated by 
\fBghostwriter\fP would partially include:  
.DS
.IP "vadd.c:" 10
main program
.IP "vadd.h:"
include file for all C files
.IP "lvadd.c:"
library routine 
.IP "lvadd.3:"
man3 page describing library routine
.IP "vadd.1:"
man1 page describing main program
.DE
.bp 
.nr PS 10
.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 50 51 52 53
.nr 34 \n(.lu
.eo
.am 50
.br
.di a+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(50 .ll \n(50u
.in 0
-AUTHORS
.br
-AUTHORS_END
.br
.di
.nr a| \n(dn
.nr a- \n(dl
..
.ec \
.eo
.am 51
.br
.di b+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(51 .ll \n(51u
.in 0
.na
The author's names
.ad
.br
.di
.nr b| \n(dn
.nr b- \n(dl
..
.ec \
.eo
.am 52
.br
.di c+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(52 .ll \n(52u
.in 0
.na
vadd.c, 
.br
vadd.h, 
.br
lvadd.c	
.br
(all headers)
.ad
.br
.di
.nr c| \n(dn
.nr c- \n(dl
..
.ec \
.eo
.am 53
.br
.di d+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(53 .ll \n(53u
.in 0
.na
vadd.3
.ad
.br
.di
.nr d| \n(dn
.nr d- \n(dl
..
.ec \
.eo
.am 50
.br
.di e+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(50 .ll \n(50u
.in 0
-SHORT_PROG_DESCRIPTION
.br
-SHORT_PROG_DESCRIPTION_END
.br
.di
.nr e| \n(dn
.nr e- \n(dl
..
.ec \
.eo
.am 51
.br
.di f+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(51 .ll \n(51u
.in 0
.na
A short description of the purpose of the program.
MUST BE ONLY ONE LINE, I.E. ONLY ONE <CR>. 
CANNOT BE FORMATTED FOR NROFF!
.ad
.br
.di
.nr f| \n(dn
.nr f- \n(dl
..
.ec \
.eo
.am 52
.br
.di g+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(52 .ll \n(52u
.in 0
.na
vadd.c 
.br
(header)
.br
(gw_usage)
.ad
.br
.di
.nr g| \n(dn
.nr g- \n(dl
..
.ec \
.eo
.am 53
.br
.di h+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(53 .ll \n(53u
.in 0
.na
vadd.1
.ad
.br
.di
.nr h| \n(dn
.nr h- \n(dl
..
.ec \
.eo
.am 50
.br
.di i+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(50 .ll \n(50u
.in 0
-SHORT_LIB_DESCRIPTION
.br
-SHORT_LIB_DESCRIPTION_END
.br
.di
.nr i| \n(dn
.nr i- \n(dl
..
.ec \
.eo
.am 51
.br
.di j+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(51 .ll \n(51u
.in 0
.na
A short description of the purpose of the library
routine.  MUST BE ONLY ONE LINE, I.E. ONLY ONE <CR>.
CANNOT BE FORMATTED FOR NROFF!
.ad
.br
.di
.nr j| \n(dn
.nr j- \n(dl
..
.ec \
.eo
.am 52
.br
.di k+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(52 .ll \n(52u
.in 0
.na
lvadd.c 
.br
(header)
.br
lvadd.3
.ad
.br
.di
.nr k| \n(dn
.nr k- \n(dl
..
.ec \
.eo
.am 53
.br
.di l+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(53 .ll \n(53u
.in 0
.na
lvadd.3
.ad
.br
.di
.nr l| \n(dn
.nr l- \n(dl
..
.ec \
.eo
.am 50
.br
.di m+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(50 .ll \n(50u
.in 0
-MAN1_LONG_DESCRIPTION
.br
-MAN1_LONG_DESCRIPTION_END
.br
.di
.nr m| \n(dn
.nr m- \n(dl
..
.ec \
.eo
.am 51
.br
.di n+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(51 .ll \n(51u
.in 0
.na
A more detailed description of the program, to
appear in the man1 page for the routine.
May be as long & complex as necessary or desired.
Formatting for nroff should start with I followed
by program name; use LP for new paragraphs.
Use IP for lists, RS and RE for indenting,
and DS/DE for non-formatted sections.
.ad
.br
.di
.nr n| \n(dn
.nr n- \n(dl
..
.ec \
.eo
.am 52
.br
.di o+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(52 .ll \n(52u
.in 0
.na
vadd.1
.ad
.br
.di
.nr o| \n(dn
.nr o- \n(dl
..
.ec \
.eo
.am 53
.br
.di p+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(53 .ll \n(53u
.in 0
.na
vadd.1
.ad
.br
.di
.nr p| \n(dn
.nr p- \n(dl
..
.ec \
.eo
.am 50
.br
.di q+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(50 .ll \n(50u
.in 0
-MAN1_EXAMPLES
.br
-MAN1_EXAMPLES_END
.br
.di
.nr q| \n(dn
.nr q- \n(dl
..
.ec \
.eo
.am 51
.br
.di r+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(51 .ll \n(51u
.in 0
.na
Give at least one example, possibly the one
you actually used to test the program.
.ad
.br
.di
.nr r| \n(dn
.nr r- \n(dl
..
.ec \
.eo
.am 52
.br
.di s+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(52 .ll \n(52u
.in 0
.na
vadd.1
.ad
.br
.di
.nr s| \n(dn
.nr s- \n(dl
..
.ec \
.eo
.am 53
.br
.di t+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(53 .ll \n(53u
.in 0
.na
vadd.1
.ad
.br
.di
.nr t| \n(dn
.nr t- \n(dl
..
.ec \
.eo
.am 50
.br
.di u+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(50 .ll \n(50u
.in 0
-MAN1_RESTRICTIONS
.br
-MAN1_RESTRICTIONS_END
.br
.di
.nr u| \n(dn
.nr u- \n(dl
..
.ec \
.eo
.am 51
.br
.di v+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(51 .ll \n(51u
.in 0
.na
List any restrictions or limitations of the program.
.ad
.br
.di
.nr v| \n(dn
.nr v- \n(dl
..
.ec \
.eo
.am 52
.br
.di w+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(52 .ll \n(52u
.in 0
.na
vadd.1
.ad
.br
.di
.nr w| \n(dn
.nr w- \n(dl
..
.ec \
.eo
.am 53
.br
.di x+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(53 .ll \n(53u
.in 0
.na
vadd.1
.ad
.br
.di
.nr x| \n(dn
.nr x- \n(dl
..
.ec \
.eo
.am 50
.br
.di y+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(50 .ll \n(50u
.in 0
-MAN1_SEE_ALSO
.br
-MAN1_SEE_ALSO_END
.br
.di
.nr y| \n(dn
.nr y- \n(dl
..
.ec \
.eo
.am 51
.br
.di z+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(51 .ll \n(51u
.in 0
.na
Any other documentation that may be used as a reference.
The library lvadd.3 file, as well as intro(1), verror(3), and 
vutils(3) will be included automatically.
.ad
.br
.di
.nr z| \n(dn
.nr z- \n(dl
..
.ec \
.eo
.am 52
.br
.di A+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(52 .ll \n(52u
.in 0
.na
vadd.1
.ad
.br
.di
.nr A| \n(dn
.nr A- \n(dl
..
.ec \
.eo
.am 53
.br
.di B+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(53 .ll \n(53u
.in 0
.na
vadd.1
.ad
.br
.di
.nr B| \n(dn
.nr B- \n(dl
..
.ec \
.eo
.am 50
.br
.di C+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(50 .ll \n(50u
.in 0
-MAN3_LONG_DESCRIPTION
.br
-MAN3_LONG_DESCRIPTION_END
.br
.di
.nr C| \n(dn
.nr C- \n(dl
..
.ec \
.eo
.am 51
.br
.di D+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(51 .ll \n(51u
.in 0
.na
A detailed description of the library routine to appear in the man3
page for the library call. See formatting notes for -MAN1_LONG_DESCRIPTION.
.ad
.br
.di
.nr D| \n(dn
.nr D- \n(dl
..
.ec \
.eo
.am 52
.br
.di E+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(52 .ll \n(52u
.in 0
.na
lvadd.3
.ad
.br
.di
.nr E| \n(dn
.nr E- \n(dl
..
.ec \
.eo
.am 53
.br
.di F+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(53 .ll \n(53u
.in 0
.na
lvadd.3
.ad
.br
.di
.nr F| \n(dn
.nr F- \n(dl
..
.ec \
.35
.nf
.ll \n(34u
.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 #c \n(#T
.	nr ^a \n(#T
.	nr ^b \n(#T
.	nr ^c \n(#T
.	nr ^d \n(#T
.	if \n(#| \{ \
.nr 36 \n(.v
.vs \n(.vu-\n(.sp
\h'|0'\s\n(33\l'|\n(TWu\(ul'\s0
.vs \n(36u
.		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 50 0
.nr 38 \w\fIbegin\fP and \fIend\fP keys
.if \n(50<\n(38 .nr 50 \n(38
.50
.rm 50
.nr 38 \n(a-
.if \n(50<\n(38 .nr 50 \n(38
.nr 38 \n(e-
.if \n(50<\n(38 .nr 50 \n(38
.nr 38 \n(i-
.if \n(50<\n(38 .nr 50 \n(38
.nr 38 \n(m-
.if \n(50<\n(38 .nr 50 \n(38
.nr 38 \n(q-
.if \n(50<\n(38 .nr 50 \n(38
.nr 38 \n(u-
.if \n(50<\n(38 .nr 50 \n(38
.nr 38 \n(y-
.if \n(50<\n(38 .nr 50 \n(38
.nr 38 \n(C-
.if \n(50<\n(38 .nr 50 \n(38
.nr 51 0
.nr 38 \wDescription of Associated Text Block
.if \n(51<\n(38 .nr 51 \n(38
.51
.rm 51
.nr 38 \n(b-
.if \n(51<\n(38 .nr 51 \n(38
.nr 38 \n(f-
.if \n(51<\n(38 .nr 51 \n(38
.nr 38 \n(j-
.if \n(51<\n(38 .nr 51 \n(38
.nr 38 \n(n-
.if \n(51<\n(38 .nr 51 \n(38
.nr 38 \n(r-
.if \n(51<\n(38 .nr 51 \n(38
.nr 38 \n(v-
.if \n(51<\n(38 .nr 51 \n(38
.nr 38 \n(z-
.if \n(51<\n(38 .nr 51 \n(38
.nr 38 \n(D-
.if \n(51<\n(38 .nr 51 \n(38
.nr 52 0
.nr 38 \wSource
.if \n(52<\n(38 .nr 52 \n(38
.52
.rm 52
.nr 38 \n(c-
.if \n(52<\n(38 .nr 52 \n(38
.nr 38 \n(g-
.if \n(52<\n(38 .nr 52 \n(38
.nr 38 \n(k-
.if \n(52<\n(38 .nr 52 \n(38
.nr 38 \n(o-
.if \n(52<\n(38 .nr 52 \n(38
.nr 38 \n(s-
.if \n(52<\n(38 .nr 52 \n(38
.nr 38 \n(w-
.if \n(52<\n(38 .nr 52 \n(38
.nr 38 \n(A-
.if \n(52<\n(38 .nr 52 \n(38
.nr 38 \n(E-
.if \n(52<\n(38 .nr 52 \n(38
.nr 53 0
.nr 38 \wDest
.if \n(53<\n(38 .nr 53 \n(38
.53
.rm 53
.nr 38 \n(d-
.if \n(53<\n(38 .nr 53 \n(38
.nr 38 \n(h-
.if \n(53<\n(38 .nr 53 \n(38
.nr 38 \n(l-
.if \n(53<\n(38 .nr 53 \n(38
.nr 38 \n(p-
.if \n(53<\n(38 .nr 53 \n(38
.nr 38 \n(t-
.if \n(53<\n(38 .nr 53 \n(38
.nr 38 \n(x-
.if \n(53<\n(38 .nr 53 \n(38
.nr 38 \n(B-
.if \n(53<\n(38 .nr 53 \n(38
.nr 38 \n(F-
.if \n(53<\n(38 .nr 53 \n(38
.nr 38 \wSource/Destination Guide-\n(50-3n-\n(51-3n-\n(52-3n-\n(53
.if \n(38>0 .nr 38 \n(38/3
.if \n(38<0 .nr 38 0
.nr 50 +\n(38
.nr 51 +\n(38
.nr 52 +\n(38
.35
.nf
.ll \n(34u
.nr 38 1n
.nr 49 0
.nr 40 \n(49+((2*\n(38)/2)
.nr 50 +\n(40
.nr 41 \n(50+((6*\n(38)/2)
.nr 51 +\n(41
.nr 42 \n(51+((6*\n(38)/2)
.nr 52 +\n(42
.nr 43 \n(52+((6*\n(38)/2)
.nr 53 +\n(43
.nr TW \n(53
.nr TW +((2*\n(38)/2)
.ne 10v+(0u*(\n(.vu-\n(.sp))+(2u*(\n(.vu-\n(.sp))
.fc  
.nr #T 0-1
.nr #a 0-1
.nr #c 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(#c<0  .nr #c \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(#c>=0 \{\
.	sp -1
.	ie \n(#c=\n(#T \{\
.		ie \n(3a \{\
\h'(|\n(41u+|\n(50u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#au-1v'\s0\v'\n(\*(#du-\n(#au+1v'\h'|\n(TWu'\}
.		el \{\
\h'(|\n(41u+|\n(50u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#cu-\n(35u'\s0\v'\n(\*(#du-\n(#cu+\n(35u'\h'|\n(TWu'\}\}
.	el \{\
.	nr 3a 1
\h'(|\n(41u+|\n(50u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#cu-\n(35u'\s0\v'\n(\*(#du-\n(#cu+\n(35u'\h'|\n(TWu'\}\}
.if \n(#c>=0 \{\
.	sp -1
.	ie \n(#c=\n(#T \{\
.		ie \n(3a \{\
\h'(|\n(42u+|\n(51u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#au-1v'\s0\v'\n(\*(#du-\n(#au+1v'\h'|\n(TWu'\}
.		el \{\
\h'(|\n(42u+|\n(51u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#cu-\n(35u'\s0\v'\n(\*(#du-\n(#cu+\n(35u'\h'|\n(TWu'\}\}
.	el \{\
.	nr 3a 1
\h'(|\n(42u+|\n(51u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#cu-\n(35u'\s0\v'\n(\*(#du-\n(#cu+\n(35u'\h'|\n(TWu'\}\}
.if \n(#c>=0 \{\
.	sp -1
.	ie \n(#c=\n(#T \{\
.		ie \n(3a \{\
\h'(|\n(43u+|\n(52u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#au-1v'\s0\v'\n(\*(#du-\n(#au+1v'\h'|\n(TWu'\}
.		el \{\
\h'(|\n(43u+|\n(52u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#cu-\n(35u'\s0\v'\n(\*(#du-\n(#cu+\n(35u'\h'|\n(TWu'\}\}
.	el \{\
.	nr 3a 1
\h'(|\n(43u+|\n(52u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#cu-\n(35u'\s0\v'\n(\*(#du-\n(#cu+\n(35u'\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'\}\}
.nr #c 0-1
.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(53u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'Source/Destination Guide
.nr tH 0
.sp
.if \n(.tu<=2v .#f
.nr tH 0
.mk #c
.nr 36 \n(.v
.vs \n(.vu-\n(.sp
\h'|0'\s\n(33\l'|\n(TWu\(ul'\s0
.vs \n(36u
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\fIbegin\fP and \fIend\fP keys\h'|\n(41u'Description of Associated Text Block\h'|\n(42u'Source\h'|\n(43u'Dest
.nr tH 0
.sp
.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
.nr 32 0
.if \n(a|u>\n(32u .nr 32 \n(a|u
.if \n(b|u>\n(32u .nr 32 \n(b|u
.if \n(c|u>\n(32u .nr 32 \n(c|u
.if \n(d|u>\n(32u .nr 32 \n(d|u
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.mk ##
.nr 37 (\n(40u+\n(50u-\n(a-u)/2u
.in +\n(37u
.ie \n(a|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(a|>\n(tH .nr tH \n(a|
.a+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(41u+\n(51u-\n(b-u)/2u
.in +\n(37u
.ie \n(b|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(b|>\n(tH .nr tH \n(b|
.b+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(42u+\n(52u-\n(c-u)/2u
.in +\n(37u
.ie \n(c|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(c|>\n(tH .nr tH \n(c|
.c+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(43u+\n(53u-\n(d-u)/2u
.in +\n(37u
.ie \n(d|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(d|>\n(tH .nr tH \n(d|
.d+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\h'|\n(41u'\h'|\n(42u'\h'|\n(43u'
.sp |\n(32u
.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
.nr 32 0
.if \n(e|u>\n(32u .nr 32 \n(e|u
.if \n(f|u>\n(32u .nr 32 \n(f|u
.if \n(g|u>\n(32u .nr 32 \n(g|u
.if \n(h|u>\n(32u .nr 32 \n(h|u
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.mk ##
.nr 37 (\n(40u+\n(50u-\n(e-u)/2u
.in +\n(37u
.ie \n(e|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(e|>\n(tH .nr tH \n(e|
.e+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(41u+\n(51u-\n(f-u)/2u
.in +\n(37u
.ie \n(f|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(f|>\n(tH .nr tH \n(f|
.f+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(42u+\n(52u-\n(g-u)/2u
.in +\n(37u
.ie \n(g|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(g|>\n(tH .nr tH \n(g|
.g+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(43u+\n(53u-\n(h-u)/2u
.in +\n(37u
.ie \n(h|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(h|>\n(tH .nr tH \n(h|
.h+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\h'|\n(41u'\h'|\n(42u'\h'|\n(43u'
.sp |\n(32u
.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
.nr 32 0
.if \n(i|u>\n(32u .nr 32 \n(i|u
.if \n(j|u>\n(32u .nr 32 \n(j|u
.if \n(k|u>\n(32u .nr 32 \n(k|u
.if \n(l|u>\n(32u .nr 32 \n(l|u
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.mk ##
.nr 37 (\n(40u+\n(50u-\n(i-u)/2u
.in +\n(37u
.ie \n(i|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(i|>\n(tH .nr tH \n(i|
.i+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(41u+\n(51u-\n(j-u)/2u
.in +\n(37u
.ie \n(j|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(j|>\n(tH .nr tH \n(j|
.j+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(42u+\n(52u-\n(k-u)/2u
.in +\n(37u
.ie \n(k|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(k|>\n(tH .nr tH \n(k|
.k+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(43u+\n(53u-\n(l-u)/2u
.in +\n(37u
.ie \n(l|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(l|>\n(tH .nr tH \n(l|
.l+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\h'|\n(41u'\h'|\n(42u'\h'|\n(43u'
.sp |\n(32u
.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
.nr 32 0
.if \n(m|u>\n(32u .nr 32 \n(m|u
.if \n(n|u>\n(32u .nr 32 \n(n|u
.if \n(o|u>\n(32u .nr 32 \n(o|u
.if \n(p|u>\n(32u .nr 32 \n(p|u
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.mk ##
.nr 37 (\n(40u+\n(50u-\n(m-u)/2u
.in +\n(37u
.ie \n(m|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(m|>\n(tH .nr tH \n(m|
.m+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(41u+\n(51u-\n(n-u)/2u
.in +\n(37u
.ie \n(n|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(n|>\n(tH .nr tH \n(n|
.n+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(42u+\n(52u-\n(o-u)/2u
.in +\n(37u
.ie \n(o|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(o|>\n(tH .nr tH \n(o|
.o+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(43u+\n(53u-\n(p-u)/2u
.in +\n(37u
.ie \n(p|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(p|>\n(tH .nr tH \n(p|
.p+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\h'|\n(41u'\h'|\n(42u'\h'|\n(43u'
.sp |\n(32u
.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
.nr 32 0
.if \n(q|u>\n(32u .nr 32 \n(q|u
.if \n(r|u>\n(32u .nr 32 \n(r|u
.if \n(s|u>\n(32u .nr 32 \n(s|u
.if \n(t|u>\n(32u .nr 32 \n(t|u
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.mk ##
.nr 37 (\n(40u+\n(50u-\n(q-u)/2u
.in +\n(37u
.ie \n(q|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(q|>\n(tH .nr tH \n(q|
.q+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(41u+\n(51u-\n(r-u)/2u
.in +\n(37u
.ie \n(r|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(r|>\n(tH .nr tH \n(r|
.r+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(42u+\n(52u-\n(s-u)/2u
.in +\n(37u
.ie \n(s|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(s|>\n(tH .nr tH \n(s|
.s+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(43u+\n(53u-\n(t-u)/2u
.in +\n(37u
.ie \n(t|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(t|>\n(tH .nr tH \n(t|
.t+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\h'|\n(41u'\h'|\n(42u'\h'|\n(43u'
.sp |\n(32u
.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
.nr 32 0
.if \n(u|u>\n(32u .nr 32 \n(u|u
.if \n(v|u>\n(32u .nr 32 \n(v|u
.if \n(w|u>\n(32u .nr 32 \n(w|u
.if \n(x|u>\n(32u .nr 32 \n(x|u
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.mk ##
.nr 37 (\n(40u+\n(50u-\n(u-u)/2u
.in +\n(37u
.ie \n(u|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(u|>\n(tH .nr tH \n(u|
.u+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(41u+\n(51u-\n(v-u)/2u
.in +\n(37u
.ie \n(v|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(v|>\n(tH .nr tH \n(v|
.v+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(42u+\n(52u-\n(w-u)/2u
.in +\n(37u
.ie \n(w|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(w|>\n(tH .nr tH \n(w|
.w+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(43u+\n(53u-\n(x-u)/2u
.in +\n(37u
.ie \n(x|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(x|>\n(tH .nr tH \n(x|
.x+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\h'|\n(41u'\h'|\n(42u'\h'|\n(43u'
.sp |\n(32u
.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
.nr 32 0
.if \n(y|u>\n(32u .nr 32 \n(y|u
.if \n(z|u>\n(32u .nr 32 \n(z|u
.if \n(A|u>\n(32u .nr 32 \n(A|u
.if \n(B|u>\n(32u .nr 32 \n(B|u
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.mk ##
.nr 37 (\n(40u+\n(50u-\n(y-u)/2u
.in +\n(37u
.ie \n(y|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(y|>\n(tH .nr tH \n(y|
.y+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(41u+\n(51u-\n(z-u)/2u
.in +\n(37u
.ie \n(z|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(z|>\n(tH .nr tH \n(z|
.z+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(42u+\n(52u-\n(A-u)/2u
.in +\n(37u
.ie \n(A|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(A|>\n(tH .nr tH \n(A|
.A+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(43u+\n(53u-\n(B-u)/2u
.in +\n(37u
.ie \n(B|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(B|>\n(tH .nr tH \n(B|
.B+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\h'|\n(41u'\h'|\n(42u'\h'|\n(43u'
.sp |\n(32u
.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
.nr 32 0
.if \n(C|u>\n(32u .nr 32 \n(C|u
.if \n(D|u>\n(32u .nr 32 \n(D|u
.if \n(E|u>\n(32u .nr 32 \n(E|u
.if \n(F|u>\n(32u .nr 32 \n(F|u
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.mk ##
.nr 37 (\n(40u+\n(50u-\n(C-u)/2u
.in +\n(37u
.ie \n(C|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(C|>\n(tH .nr tH \n(C|
.C+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(41u+\n(51u-\n(D-u)/2u
.in +\n(37u
.ie \n(D|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(D|>\n(tH .nr tH \n(D|
.D+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(42u+\n(52u-\n(E-u)/2u
.in +\n(37u
.ie \n(E|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(E|>\n(tH .nr tH \n(E|
.E+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(43u+\n(53u-\n(F-u)/2u
.in +\n(37u
.ie \n(F|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(F|>\n(tH .nr tH \n(F|
.F+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\h'|\n(41u'\h'|\n(42u'\h'|\n(43u'
.sp |\n(32u
.fc
.ch #f
.rm #f
.nr T. 1
.T# \n(T.
.rm T#
.rr 3a
.35
.nr #a 0
.nr #c 0
.rm a+
.rm b+
.rm c+
.rm d+
.rm e+
.rm f+
.rm g+
.rm h+
.rm i+
.rm j+
.rm k+
.rm l+
.rm m+
.rm n+
.rm o+
.rm p+
.rm q+
.rm r+
.rm s+
.rm t+
.rm u+
.rm v+
.rm w+
.rm x+
.rm y+
.rm z+
.rm A+
.rm B+
.rm C+
.rm D+
.rm E+
.rm F+
.TE
.if \n-(b.=0 .nr c. \n(.c-\n(d.-173
.bp
.sp 3
.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 50 51 52 53
.nr 34 \n(.lu
.eo
.am 50
.br
.di a+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(50 .ll \n(50u
.in 0
-MAN3_SEE_ALSO
.br
-MAN3_SEE_ALSO_END
.br
.di
.nr a| \n(dn
.nr a- \n(dl
..
.ec \
.eo
.am 51
.br
.di b+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(51 .ll \n(51u
.in 0
.na
Any other doc to be used as reference in lvadd.3.  vadd.1, intro(3), vipl(3), 
verror(3), and vutils(3) will be included automatically.
.ad
.br
.di
.nr b| \n(dn
.nr b- \n(dl
..
.ec \
.eo
.am 52
.br
.di c+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(52 .ll \n(52u
.in 0
.na
lvadd.3
.ad
.br
.di
.nr c| \n(dn
.nr c- \n(dl
..
.ec \
.eo
.am 53
.br
.di d+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(53 .ll \n(53u
.in 0
.na
lvadd.3
.ad
.br
.di
.nr d| \n(dn
.nr d- \n(dl
..
.ec \
.eo
.am 50
.br
.di e+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(50 .ll \n(50u
.in 0
-MAN3_RESTRICTIONS
.br
-MAN3_RESTRICTIONS_END
.br
.di
.nr e| \n(dn
.nr e- \n(dl
..
.ec \
.eo
.am 51
.br
.di f+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(51 .ll \n(51u
.in 0
.na
List any restrictions, limitations on the library
routine.  Document any known bugs here.
.ad
.br
.di
.nr f| \n(dn
.nr f- \n(dl
..
.ec \
.eo
.am 52
.br
.di g+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(52 .ll \n(52u
.in 0
.na
lvadd.3
.ad
.br
.di
.nr g| \n(dn
.nr g- \n(dl
..
.ec \
.eo
.am 53
.br
.di h+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(53 .ll \n(53u
.in 0
.na
lvadd.3
.ad
.br
.di
.nr h| \n(dn
.nr h- \n(dl
..
.ec \
.eo
.am 50
.br
.di i+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(50 .ll \n(50u
.in 0
-USAGE_ADDITIONS
.br
-USAGE_ADDITIONS_END
.br
.di
.nr i| \n(dn
.nr i- \n(dl
..
.ec \
.eo
.am 51
.br
.di j+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(51 .ll \n(51u
.in 0
.na
Any additional statements to be included in the gw_usage() routine.
Must be correct C syntax.
.ad
.br
.di
.nr j| \n(dn
.nr j- \n(dl
..
.ec \
.eo
.am 52
.br
.di k+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(52 .ll \n(52u
.in 0
.na
vadd.c 
.br
(gw_usage)
.ad
.br
.di
.nr k| \n(dn
.nr k- \n(dl
..
.ec \
.eo
.am 53
.br
.di l+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(53 .ll \n(53u
.in 0
.na
vadd.c 
.br
(gw_usage)
.ad
.br
.di
.nr l| \n(dn
.nr l- \n(dl
..
.ec \
.eo
.am 50
.br
.di m+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(50 .ll \n(50u
.in 0
-INCLUDE_INCLUDES
.br
-INCLUDE_INCLUDES_END
.br
.di
.nr m| \n(dn
.nr m- \n(dl
..
.ec \
.eo
.am 51
.br
.di n+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(51 .ll \n(51u
.in 0
.na
Other #includes statements that need to appear in the vadd.h file that
will not be automatically generated. (unmcopyright.h and vinclude.h
are automatically included).
.ad
.br
.di
.nr n| \n(dn
.nr n- \n(dl
..
.ec \
.eo
.am 52
.br
.di o+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(52 .ll \n(52u
.in 0
.na
vadd.h
.ad
.br
.di
.nr o| \n(dn
.nr o- \n(dl
..
.ec \
.eo
.am 53
.br
.di p+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(53 .ll \n(53u
.in 0
.na
vadd.h
.ad
.br
.di
.nr p| \n(dn
.nr p- \n(dl
..
.ec \
.eo
.am 50
.br
.di q+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(50 .ll \n(50u
.in 0
-INCLUDE_ADDITIONS
.br
-INCLUDE_ADDITIONS_END
.br
.di
.nr q| \n(dn
.nr q- \n(dl
..
.ec \
.eo
.am 51
.br
.di r+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(51 .ll \n(51u
.in 0
.na
Any additional things to put in the vadd.h file: #defines, function 
definitions, global variables, etc.  Must be correct C syntax.
.ad
.br
.di
.nr r| \n(dn
.nr r- \n(dl
..
.ec \
.eo
.am 52
.br
.di s+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(52 .ll \n(52u
.in 0
.na
vadd.h
.ad
.br
.di
.nr s| \n(dn
.nr s- \n(dl
..
.ec \
.eo
.am 53
.br
.di t+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(53 .ll \n(53u
.in 0
.na
vadd.h
.ad
.br
.di
.nr t| \n(dn
.nr t- \n(dl
..
.ec \
.eo
.am 50
.br
.di u+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(50 .ll \n(50u
.in 0
-INCLUDE_MACROS
.br
-INCLUDE_MACROS_END
.br
.di
.nr u| \n(dn
.nr u- \n(dl
..
.ec \
.eo
.am 51
.br
.di v+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(51 .ll \n(51u
.in 0
.na
Any desired macros to be defined.
Must be in correct C syntax.
.ad
.br
.di
.nr v| \n(dn
.nr v- \n(dl
..
.ec \
.eo
.am 52
.br
.di w+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(52 .ll \n(52u
.in 0
.na
vadd.h
.ad
.br
.di
.nr w| \n(dn
.nr w- \n(dl
..
.ec \
.eo
.am 53
.br
.di x+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(53 .ll \n(53u
.in 0
.na
vadd.h
.ad
.br
.di
.nr x| \n(dn
.nr x- \n(dl
..
.ec \
.eo
.am 50
.br
.di y+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(50 .ll \n(50u
.in 0
-MAIN_VARIABLE_LIST
.br
-MAIN_VARIABLE_LIST_END
.br
.di
.nr y| \n(dn
.nr y- \n(dl
..
.ec \
.eo
.am 51
.br
.di z+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(51 .ll \n(51u
.in 0
.na
List of variables to be declared in the main().
Must be correct C syntax.
.ad
.br
.di
.nr z| \n(dn
.nr z- \n(dl
..
.ec \
.eo
.am 52
.br
.di A+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(52 .ll \n(52u
.in 0
.na
vadd.c 
.br
(main)
.ad
.br
.di
.nr A| \n(dn
.nr A- \n(dl
..
.ec \
.eo
.am 53
.br
.di B+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(53 .ll \n(53u
.in 0
.na
vadd.c
.ad
.br
.di
.nr B| \n(dn
.nr B- \n(dl
..
.ec \
.eo
.am 50
.br
.di C+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(50 .ll \n(50u
.in 0
-MAIN_BEFORE_LIB_CALL
.br
-MAIN_BEFORE_LIB_CALL_END
.br
.di
.nr C| \n(dn
.nr C- \n(dl
..
.ec \
.eo
.am 51
.br
.di D+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(51 .ll \n(51u
.in 0
.na
C code to get necessary input for program, plus
any other code that the programmer wishes to appear
in main before the call to the library routine.
Routines for Cantata must include a call to check_args() here.
Will look nicer if tabs are used.  Correct C syntax.
.ad
.br
.di
.nr D| \n(dn
.nr D- \n(dl
..
.ec \
.eo
.am 52
.br
.di E+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(52 .ll \n(52u
.in 0
.na
vadd.c 
.br
(main)
.ad
.br
.di
.nr E| \n(dn
.nr E- \n(dl
..
.ec \
.eo
.am 53
.br
.di F+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(53 .ll \n(53u
.in 0
.na
vadd.c
.ad
.br
.di
.nr F| \n(dn
.nr F- \n(dl
..
.ec \
.eo
.am 50
.br
.di G+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(50 .ll \n(50u
.in 0
-MAIN_LIBRARY_CALL
.br
-MAIN_LIBRARY_CALL_END
.br
.di
.nr G| \n(dn
.nr G- \n(dl
..
.ec \
.eo
.am 51
.br
.di H+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(51 .ll \n(51u
.in 0
The library routine as called in your main program.
Will look nicer if tabs are used.  Correct C syntax.
.br
.di
.nr H| \n(dn
.nr H- \n(dl
..
.ec \
.eo
.am 52
.br
.di I+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(52 .ll \n(52u
.in 0
.na
vadd.c 
.br
(main)
.ad
.br
.di
.nr I| \n(dn
.nr I- \n(dl
..
.ec \
.eo
.am 53
.br
.di J+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(53 .ll \n(53u
.in 0
.na
vadd.c
.ad
.br
.di
.nr J| \n(dn
.nr J- \n(dl
..
.ec \
.eo
.am 50
.br
.di K+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(50 .ll \n(50u
.in 0
-MAIN_AFTER_LIB_CALL
.br
-MAIN_AFTER_LIB_CALL_END
.br
.di
.nr K| \n(dn
.nr K- \n(dl
..
.ec \
.eo
.am 51
.br
.di L+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(51 .ll \n(51u
.in 0
.na
Any C code to follow the call to the library routine.
.ad
.br
.di
.nr L| \n(dn
.nr L- \n(dl
..
.ec \
.eo
.am 52
.br
.di M+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(52 .ll \n(52u
.in 0
.na
vadd.c 
.br
(main)
.ad
.br
.di
.nr M| \n(dn
.nr M- \n(dl
..
.ec \
.eo
.am 53
.br
.di N+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(53 .ll \n(53u
.in 0
.na
vadd.c
.ad
.br
.di
.nr N| \n(dn
.nr N- \n(dl
..
.ec \
.35
.nf
.ll \n(34u
.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 #c \n(#T
.	nr ^a \n(#T
.	nr ^b \n(#T
.	nr ^c \n(#T
.	nr ^d \n(#T
.	if \n(#| \{ \
.nr 36 \n(.v
.vs \n(.vu-\n(.sp
\h'|0'\s\n(33\l'|\n(TWu\(ul'\s0
.vs \n(36u
.		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 50 0
.nr 38 \w\fIbegin\fP and \fIend\fP keys
.if \n(50<\n(38 .nr 50 \n(38
.50
.rm 50
.nr 38 \n(a-
.if \n(50<\n(38 .nr 50 \n(38
.nr 38 \n(e-
.if \n(50<\n(38 .nr 50 \n(38
.nr 38 \n(i-
.if \n(50<\n(38 .nr 50 \n(38
.nr 38 \n(m-
.if \n(50<\n(38 .nr 50 \n(38
.nr 38 \n(q-
.if \n(50<\n(38 .nr 50 \n(38
.nr 38 \n(u-
.if \n(50<\n(38 .nr 50 \n(38
.nr 38 \n(y-
.if \n(50<\n(38 .nr 50 \n(38
.nr 38 \n(C-
.if \n(50<\n(38 .nr 50 \n(38
.nr 38 \n(G-
.if \n(50<\n(38 .nr 50 \n(38
.nr 38 \n(K-
.if \n(50<\n(38 .nr 50 \n(38
.nr 51 0
.nr 38 \wDescription of Associated Text Block
.if \n(51<\n(38 .nr 51 \n(38
.51
.rm 51
.nr 38 \n(b-
.if \n(51<\n(38 .nr 51 \n(38
.nr 38 \n(f-
.if \n(51<\n(38 .nr 51 \n(38
.nr 38 \n(j-
.if \n(51<\n(38 .nr 51 \n(38
.nr 38 \n(n-
.if \n(51<\n(38 .nr 51 \n(38
.nr 38 \n(r-
.if \n(51<\n(38 .nr 51 \n(38
.nr 38 \n(v-
.if \n(51<\n(38 .nr 51 \n(38
.nr 38 \n(z-
.if \n(51<\n(38 .nr 51 \n(38
.nr 38 \n(D-
.if \n(51<\n(38 .nr 51 \n(38
.nr 38 \n(H-
.if \n(51<\n(38 .nr 51 \n(38
.nr 38 \n(L-
.if \n(51<\n(38 .nr 51 \n(38
.nr 52 0
.nr 38 \wSource
.if \n(52<\n(38 .nr 52 \n(38
.52
.rm 52
.nr 38 \n(c-
.if \n(52<\n(38 .nr 52 \n(38
.nr 38 \n(g-
.if \n(52<\n(38 .nr 52 \n(38
.nr 38 \n(k-
.if \n(52<\n(38 .nr 52 \n(38
.nr 38 \n(o-
.if \n(52<\n(38 .nr 52 \n(38
.nr 38 \n(s-
.if \n(52<\n(38 .nr 52 \n(38
.nr 38 \n(w-
.if \n(52<\n(38 .nr 52 \n(38
.nr 38 \n(A-
.if \n(52<\n(38 .nr 52 \n(38
.nr 38 \n(E-
.if \n(52<\n(38 .nr 52 \n(38
.nr 38 \n(I-
.if \n(52<\n(38 .nr 52 \n(38
.nr 38 \n(M-
.if \n(52<\n(38 .nr 52 \n(38
.nr 53 0
.nr 38 \wDest
.if \n(53<\n(38 .nr 53 \n(38
.53
.rm 53
.nr 38 \n(d-
.if \n(53<\n(38 .nr 53 \n(38
.nr 38 \n(h-
.if \n(53<\n(38 .nr 53 \n(38
.nr 38 \n(l-
.if \n(53<\n(38 .nr 53 \n(38
.nr 38 \n(p-
.if \n(53<\n(38 .nr 53 \n(38
.nr 38 \n(t-
.if \n(53<\n(38 .nr 53 \n(38
.nr 38 \n(x-
.if \n(53<\n(38 .nr 53 \n(38
.nr 38 \n(B-
.if \n(53<\n(38 .nr 53 \n(38
.nr 38 \n(F-
.if \n(53<\n(38 .nr 53 \n(38
.nr 38 \n(J-
.if \n(53<\n(38 .nr 53 \n(38
.nr 38 \n(N-
.if \n(53<\n(38 .nr 53 \n(38
.nr 38 \wSource/Destination Guide-\n(50-3n-\n(51-3n-\n(52-3n-\n(53
.if \n(38>0 .nr 38 \n(38/3
.if \n(38<0 .nr 38 0
.nr 50 +\n(38
.nr 51 +\n(38
.nr 52 +\n(38
.35
.nf
.ll \n(34u
.nr 38 1n
.nr 49 0
.nr 40 \n(49+((2*\n(38)/2)
.nr 50 +\n(40
.nr 41 \n(50+((6*\n(38)/2)
.nr 51 +\n(41
.nr 42 \n(51+((6*\n(38)/2)
.nr 52 +\n(42
.nr 43 \n(52+((6*\n(38)/2)
.nr 53 +\n(43
.nr TW \n(53
.nr TW +((2*\n(38)/2)
.ne 12v+(0u*(\n(.vu-\n(.sp))+(2u*(\n(.vu-\n(.sp))
.fc  
.nr #T 0-1
.nr #a 0-1
.nr #c 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(#c<0  .nr #c \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(#c>=0 \{\
.	sp -1
.	ie \n(#c=\n(#T \{\
.		ie \n(3a \{\
\h'(|\n(41u+|\n(50u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#au-1v'\s0\v'\n(\*(#du-\n(#au+1v'\h'|\n(TWu'\}
.		el \{\
\h'(|\n(41u+|\n(50u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#cu-\n(35u'\s0\v'\n(\*(#du-\n(#cu+\n(35u'\h'|\n(TWu'\}\}
.	el \{\
.	nr 3a 1
\h'(|\n(41u+|\n(50u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#cu-\n(35u'\s0\v'\n(\*(#du-\n(#cu+\n(35u'\h'|\n(TWu'\}\}
.if \n(#c>=0 \{\
.	sp -1
.	ie \n(#c=\n(#T \{\
.		ie \n(3a \{\
\h'(|\n(42u+|\n(51u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#au-1v'\s0\v'\n(\*(#du-\n(#au+1v'\h'|\n(TWu'\}
.		el \{\
\h'(|\n(42u+|\n(51u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#cu-\n(35u'\s0\v'\n(\*(#du-\n(#cu+\n(35u'\h'|\n(TWu'\}\}
.	el \{\
.	nr 3a 1
\h'(|\n(42u+|\n(51u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#cu-\n(35u'\s0\v'\n(\*(#du-\n(#cu+\n(35u'\h'|\n(TWu'\}\}
.if \n(#c>=0 \{\
.	sp -1
.	ie \n(#c=\n(#T \{\
.		ie \n(3a \{\
\h'(|\n(43u+|\n(52u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#au-1v'\s0\v'\n(\*(#du-\n(#au+1v'\h'|\n(TWu'\}
.		el \{\
\h'(|\n(43u+|\n(52u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#cu-\n(35u'\s0\v'\n(\*(#du-\n(#cu+\n(35u'\h'|\n(TWu'\}\}
.	el \{\
.	nr 3a 1
\h'(|\n(43u+|\n(52u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#cu-\n(35u'\s0\v'\n(\*(#du-\n(#cu+\n(35u'\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'\}\}
.nr #c 0-1
.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(53u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'Source/Destination Guide
.nr tH 0
.sp
.if \n(.tu<=2v .#f
.nr tH 0
.mk #c
.nr 36 \n(.v
.vs \n(.vu-\n(.sp
\h'|0'\s\n(33\l'|\n(TWu\(ul'\s0
.vs \n(36u
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\fIbegin\fP and \fIend\fP keys\h'|\n(41u'Description of Associated Text Block\h'|\n(42u'Source\h'|\n(43u'Dest
.nr tH 0
.sp
.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
.nr 32 0
.if \n(a|u>\n(32u .nr 32 \n(a|u
.if \n(b|u>\n(32u .nr 32 \n(b|u
.if \n(c|u>\n(32u .nr 32 \n(c|u
.if \n(d|u>\n(32u .nr 32 \n(d|u
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.mk ##
.nr 37 (\n(40u+\n(50u-\n(a-u)/2u
.in +\n(37u
.ie \n(a|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(a|>\n(tH .nr tH \n(a|
.a+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(41u+\n(51u-\n(b-u)/2u
.in +\n(37u
.ie \n(b|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(b|>\n(tH .nr tH \n(b|
.b+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(42u+\n(52u-\n(c-u)/2u
.in +\n(37u
.ie \n(c|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(c|>\n(tH .nr tH \n(c|
.c+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(43u+\n(53u-\n(d-u)/2u
.in +\n(37u
.ie \n(d|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(d|>\n(tH .nr tH \n(d|
.d+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\h'|\n(41u'\h'|\n(42u'\h'|\n(43u'
.sp |\n(32u
.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
.nr 32 0
.if \n(e|u>\n(32u .nr 32 \n(e|u
.if \n(f|u>\n(32u .nr 32 \n(f|u
.if \n(g|u>\n(32u .nr 32 \n(g|u
.if \n(h|u>\n(32u .nr 32 \n(h|u
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.mk ##
.nr 37 (\n(40u+\n(50u-\n(e-u)/2u
.in +\n(37u
.ie \n(e|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(e|>\n(tH .nr tH \n(e|
.e+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(41u+\n(51u-\n(f-u)/2u
.in +\n(37u
.ie \n(f|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(f|>\n(tH .nr tH \n(f|
.f+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(42u+\n(52u-\n(g-u)/2u
.in +\n(37u
.ie \n(g|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(g|>\n(tH .nr tH \n(g|
.g+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(43u+\n(53u-\n(h-u)/2u
.in +\n(37u
.ie \n(h|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(h|>\n(tH .nr tH \n(h|
.h+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\h'|\n(41u'\h'|\n(42u'\h'|\n(43u'
.sp |\n(32u
.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
.nr 32 0
.if \n(i|u>\n(32u .nr 32 \n(i|u
.if \n(j|u>\n(32u .nr 32 \n(j|u
.if \n(k|u>\n(32u .nr 32 \n(k|u
.if \n(l|u>\n(32u .nr 32 \n(l|u
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.mk ##
.nr 37 (\n(40u+\n(50u-\n(i-u)/2u
.in +\n(37u
.ie \n(i|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(i|>\n(tH .nr tH \n(i|
.i+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(41u+\n(51u-\n(j-u)/2u
.in +\n(37u
.ie \n(j|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(j|>\n(tH .nr tH \n(j|
.j+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(42u+\n(52u-\n(k-u)/2u
.in +\n(37u
.ie \n(k|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(k|>\n(tH .nr tH \n(k|
.k+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(43u+\n(53u-\n(l-u)/2u
.in +\n(37u
.ie \n(l|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(l|>\n(tH .nr tH \n(l|
.l+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\h'|\n(41u'\h'|\n(42u'\h'|\n(43u'
.sp |\n(32u
.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
.nr 32 0
.if \n(m|u>\n(32u .nr 32 \n(m|u
.if \n(n|u>\n(32u .nr 32 \n(n|u
.if \n(o|u>\n(32u .nr 32 \n(o|u
.if \n(p|u>\n(32u .nr 32 \n(p|u
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.mk ##
.nr 37 (\n(40u+\n(50u-\n(m-u)/2u
.in +\n(37u
.ie \n(m|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(m|>\n(tH .nr tH \n(m|
.m+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(41u+\n(51u-\n(n-u)/2u
.in +\n(37u
.ie \n(n|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(n|>\n(tH .nr tH \n(n|
.n+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(42u+\n(52u-\n(o-u)/2u
.in +\n(37u
.ie \n(o|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(o|>\n(tH .nr tH \n(o|
.o+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(43u+\n(53u-\n(p-u)/2u
.in +\n(37u
.ie \n(p|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(p|>\n(tH .nr tH \n(p|
.p+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\h'|\n(41u'\h'|\n(42u'\h'|\n(43u'
.sp |\n(32u
.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
.nr 32 0
.if \n(q|u>\n(32u .nr 32 \n(q|u
.if \n(r|u>\n(32u .nr 32 \n(r|u
.if \n(s|u>\n(32u .nr 32 \n(s|u
.if \n(t|u>\n(32u .nr 32 \n(t|u
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.mk ##
.nr 37 (\n(40u+\n(50u-\n(q-u)/2u
.in +\n(37u
.ie \n(q|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(q|>\n(tH .nr tH \n(q|
.q+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(41u+\n(51u-\n(r-u)/2u
.in +\n(37u
.ie \n(r|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(r|>\n(tH .nr tH \n(r|
.r+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(42u+\n(52u-\n(s-u)/2u
.in +\n(37u
.ie \n(s|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(s|>\n(tH .nr tH \n(s|
.s+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(43u+\n(53u-\n(t-u)/2u
.in +\n(37u
.ie \n(t|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(t|>\n(tH .nr tH \n(t|
.t+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\h'|\n(41u'\h'|\n(42u'\h'|\n(43u'
.sp |\n(32u
.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
.nr 32 0
.if \n(u|u>\n(32u .nr 32 \n(u|u
.if \n(v|u>\n(32u .nr 32 \n(v|u
.if \n(w|u>\n(32u .nr 32 \n(w|u
.if \n(x|u>\n(32u .nr 32 \n(x|u
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.mk ##
.nr 37 (\n(40u+\n(50u-\n(u-u)/2u
.in +\n(37u
.ie \n(u|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(u|>\n(tH .nr tH \n(u|
.u+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(41u+\n(51u-\n(v-u)/2u
.in +\n(37u
.ie \n(v|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(v|>\n(tH .nr tH \n(v|
.v+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(42u+\n(52u-\n(w-u)/2u
.in +\n(37u
.ie \n(w|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(w|>\n(tH .nr tH \n(w|
.w+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(43u+\n(53u-\n(x-u)/2u
.in +\n(37u
.ie \n(x|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(x|>\n(tH .nr tH \n(x|
.x+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\h'|\n(41u'\h'|\n(42u'\h'|\n(43u'
.sp |\n(32u
.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
.nr 32 0
.if \n(y|u>\n(32u .nr 32 \n(y|u
.if \n(z|u>\n(32u .nr 32 \n(z|u
.if \n(A|u>\n(32u .nr 32 \n(A|u
.if \n(B|u>\n(32u .nr 32 \n(B|u
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.mk ##
.nr 37 (\n(40u+\n(50u-\n(y-u)/2u
.in +\n(37u
.ie \n(y|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(y|>\n(tH .nr tH \n(y|
.y+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(41u+\n(51u-\n(z-u)/2u
.in +\n(37u
.ie \n(z|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(z|>\n(tH .nr tH \n(z|
.z+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(42u+\n(52u-\n(A-u)/2u
.in +\n(37u
.ie \n(A|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(A|>\n(tH .nr tH \n(A|
.A+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(43u+\n(53u-\n(B-u)/2u
.in +\n(37u
.ie \n(B|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(B|>\n(tH .nr tH \n(B|
.B+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\h'|\n(41u'\h'|\n(42u'\h'|\n(43u'
.sp |\n(32u
.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
.nr 32 0
.if \n(C|u>\n(32u .nr 32 \n(C|u
.if \n(D|u>\n(32u .nr 32 \n(D|u
.if \n(E|u>\n(32u .nr 32 \n(E|u
.if \n(F|u>\n(32u .nr 32 \n(F|u
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.mk ##
.nr 37 (\n(40u+\n(50u-\n(C-u)/2u
.in +\n(37u
.ie \n(C|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(C|>\n(tH .nr tH \n(C|
.C+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(41u+\n(51u-\n(D-u)/2u
.in +\n(37u
.ie \n(D|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(D|>\n(tH .nr tH \n(D|
.D+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(42u+\n(52u-\n(E-u)/2u
.in +\n(37u
.ie \n(E|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(E|>\n(tH .nr tH \n(E|
.E+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(43u+\n(53u-\n(F-u)/2u
.in +\n(37u
.ie \n(F|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(F|>\n(tH .nr tH \n(F|
.F+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\h'|\n(41u'\h'|\n(42u'\h'|\n(43u'
.sp |\n(32u
.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
.nr 32 0
.if \n(G|u>\n(32u .nr 32 \n(G|u
.if \n(H|u>\n(32u .nr 32 \n(H|u
.if \n(I|u>\n(32u .nr 32 \n(I|u
.if \n(J|u>\n(32u .nr 32 \n(J|u
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.mk ##
.nr 37 (\n(40u+\n(50u-\n(G-u)/2u
.in +\n(37u
.ie \n(G|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(G|>\n(tH .nr tH \n(G|
.G+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(41u+\n(51u-\n(H-u)/2u
.in +\n(37u
.ie \n(H|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(H|>\n(tH .nr tH \n(H|
.H+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(42u+\n(52u-\n(I-u)/2u
.in +\n(37u
.ie \n(I|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(I|>\n(tH .nr tH \n(I|
.I+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(43u+\n(53u-\n(J-u)/2u
.in +\n(37u
.ie \n(J|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(J|>\n(tH .nr tH \n(J|
.J+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\h'|\n(41u'\h'|\n(42u'\h'|\n(43u'
.sp |\n(32u
.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
.nr 32 0
.if \n(K|u>\n(32u .nr 32 \n(K|u
.if \n(L|u>\n(32u .nr 32 \n(L|u
.if \n(M|u>\n(32u .nr 32 \n(M|u
.if \n(N|u>\n(32u .nr 32 \n(N|u
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.mk ##
.nr 37 (\n(40u+\n(50u-\n(K-u)/2u
.in +\n(37u
.ie \n(K|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(K|>\n(tH .nr tH \n(K|
.K+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(41u+\n(51u-\n(L-u)/2u
.in +\n(37u
.ie \n(L|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(L|>\n(tH .nr tH \n(L|
.L+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(42u+\n(52u-\n(M-u)/2u
.in +\n(37u
.ie \n(M|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(M|>\n(tH .nr tH \n(M|
.M+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(43u+\n(53u-\n(N-u)/2u
.in +\n(37u
.ie \n(N|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(N|>\n(tH .nr tH \n(N|
.N+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\h'|\n(41u'\h'|\n(42u'\h'|\n(43u'
.sp |\n(32u
.fc
.ch #f
.rm #f
.nr T. 1
.T# \n(T.
.rm T#
.rr 3a
.35
.nr #a 0
.nr #c 0
.rm a+
.rm b+
.rm c+
.rm d+
.rm e+
.rm f+
.rm g+
.rm h+
.rm i+
.rm j+
.rm k+
.rm l+
.rm m+
.rm n+
.rm o+
.rm p+
.rm q+
.rm r+
.rm s+
.rm t+
.rm u+
.rm v+
.rm w+
.rm x+
.rm y+
.rm z+
.rm A+
.rm B+
.rm C+
.rm D+
.rm E+
.rm F+
.rm G+
.rm H+
.rm I+
.rm J+
.rm K+
.rm L+
.rm M+
.rm N+
.TE
.if \n-(b.=0 .nr c. \n(.c-\n(d.-202
.bp
.sp 3
.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 50 51 52 53
.nr 34 \n(.lu
.eo
.am 50
.br
.di a+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(50 .ll \n(50u
.in 0
-LIBRARY_INPUT
.br
-LIBRARY_INPUT_END
.br
.di
.nr a| \n(dn
.nr a- \n(dl
..
.ec \
.eo
.am 51
.br
.di b+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(51 .ll \n(51u
.in 0
.na
A short description of each input to the library
routine.  No longer than a short blurb for each.
Formatting for nroff: "IP 'input variable' 15.
Put description on the following line, etc.
.ad
.br
.di
.nr b| \n(dn
.nr b- \n(dl
..
.ec \
.eo
.am 52
.br
.di c+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(52 .ll \n(52u
.in 0
.na
lvadd.c 
.br
(header)
.br
lvadd.3
.ad
.br
.di
.nr c| \n(dn
.nr c- \n(dl
..
.ec \
.eo
.am 53
.br
.di d+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(53 .ll \n(53u
.in 0
.na
lvadd.3
.ad
.br
.di
.nr d| \n(dn
.nr d- \n(dl
..
.ec \
.eo
.am 50
.br
.di e+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(50 .ll \n(50u
.in 0
-LIBRARY_OUTPUT
.br
-LIBRARY_OUTPUT_END
.br
.di
.nr e| \n(dn
.nr e- \n(dl
..
.ec \
.eo
.am 51
.br
.di f+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(51 .ll \n(51u
.in 0
.na
A short description of each output from the library
routine.  No longer than a short blurb for each.
Don't forget to include mention of the return value!
Formatting for nroff: "IP 'input variable' 15.
Put description on the following line, etc.
.ad
.br
.di
.nr f| \n(dn
.nr f- \n(dl
..
.ec \
.eo
.am 52
.br
.di g+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(52 .ll \n(52u
.in 0
.na
lvadd.c 
.br
(header)
.br
lvadd.3
.ad
.br
.di
.nr g| \n(dn
.nr g- \n(dl
..
.ec \
.eo
.am 53
.br
.di h+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(53 .ll \n(53u
.in 0
.na
lvadd.3
.ad
.br
.di
.nr h| \n(dn
.nr h- \n(dl
..
.ec \
.eo
.am 50
.br
.di i+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(50 .ll \n(50u
.in 0
-LIBRARY_DEF
.br
-LIBRARY_DEF_END
.br
.di
.nr i| \n(dn
.nr i- \n(dl
..
.ec \
.eo
.am 51
.br
.di j+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(51 .ll \n(51u
.in 0
.na
The library routine definition.  DO NOT format
for nroff!  Also goes into the vadd.3 file as the
definition of the library routine.
Must be in correct C syntax.
.ad
.br
.di
.nr j| \n(dn
.nr j- \n(dl
..
.ec \
.eo
.am 52
.br
.di k+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(52 .ll \n(52u
.in 0
.na
lvadd.c
.br
lvadd.3
.ad
.br
.di
.nr k| \n(dn
.nr k- \n(dl
..
.ec \
.eo
.am 53
.br
.di l+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(53 .ll \n(53u
.in 0
.na
lvadd.c
.ad
.br
.di
.nr l| \n(dn
.nr l- \n(dl
..
.ec \
.eo
.am 50
.br
.di m+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(50 .ll \n(50u
.in 0
-LIBRARY_MODS
.br
-LIBRARY_MODS_END
.br
.di
.nr m| \n(dn
.nr m- \n(dl
..
.ec \
.eo
.am 51
.br
.di n+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(51 .ll \n(51u
.in 0
.na
A short description of each new modification to the
library routine in the form:  name (date) - change.
May be formatted for nroff.  Use  !!date  to include
the current date.
.ad
.br
.di
.nr n| \n(dn
.nr n- \n(dl
..
.ec \
.eo
.am 52
.br
.di o+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(52 .ll \n(52u
.in 0
.na
lvadd.c 
.br
(header) 
.br
lvadd.3
.ad
.br
.di
.nr o| \n(dn
.nr o- \n(dl
..
.ec \
.eo
.am 53
.br
.di p+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(53 .ll \n(53u
.in 0
.na
lvadd.3
.ad
.br
.di
.nr p| \n(dn
.nr p- \n(dl
..
.ec \
.eo
.am 50
.br
.di q+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(50 .ll \n(50u
.in 0
-LIBRARY_INCLUDES
.br
-LIBRARY_INCLUDES_END
.br
.di
.nr q| \n(dn
.nr q- \n(dl
..
.ec \
.eo
.am 51
.br
.di r+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(51 .ll \n(51u
.in 0
.na
Any #include statements that should appear in the lvadd.c file that
are not already included by vinclude.h (vinclude.h is automatically
included in the lvadd.c file). 
.ad
.br
.di
.nr r| \n(dn
.nr r- \n(dl
..
.ec \
.eo
.am 52
.br
.di s+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(52 .ll \n(52u
.in 0
.na
lvadd.c
.ad
.br
.di
.nr s| \n(dn
.nr s- \n(dl
..
.ec \
.eo
.am 53
.br
.di t+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(53 .ll \n(53u
.in 0
.na
lvadd.c
.ad
.br
.di
.nr t| \n(dn
.nr t- \n(dl
..
.ec \
.eo
.am 50
.br
.di u+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(50 .ll \n(50u
.in 0
-LIBRARY_CODE
.br
-LIBRARY_CODE_END
.br
.di
.nr u| \n(dn
.nr u- \n(dl
..
.ec \
.eo
.am 51
.br
.di v+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(51 .ll \n(51u
.in 0
.na
The C code for the library routine.  As code is
modified, \fBghostreader\fP can be used to pick this out
of the lib.c file.  Don't bother to update this field
in vadd.prog. Let \fBghostreader\fP do it for you!
.ad
.br
.di
.nr v| \n(dn
.nr v- \n(dl
..
.ec \
.eo
.am 52
.br
.di w+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(52 .ll \n(52u
.in 0
.na
lvadd.c
.ad
.br
.di
.nr w| \n(dn
.nr w- \n(dl
..
.ec \
.eo
.am 53
.br
.di x+
.35
.ft \n(.f
.ll \n(34u*1u/5u
.if \n(.l<\n(53 .ll \n(53u
.in 0
.na
lvadd.c
.ad
.br
.di
.nr x| \n(dn
.nr x- \n(dl
..
.ec \
.35
.nf
.ll \n(34u
.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 #c \n(#T
.	nr ^a \n(#T
.	nr ^b \n(#T
.	nr ^c \n(#T
.	nr ^d \n(#T
.	if \n(#| \{ \
.nr 36 \n(.v
.vs \n(.vu-\n(.sp
\h'|0'\s\n(33\l'|\n(TWu\(ul'\s0
.vs \n(36u
.		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 50 0
.nr 38 \w\fIbegin\fP and \fIend\fP keys
.if \n(50<\n(38 .nr 50 \n(38
.50
.rm 50
.nr 38 \n(a-
.if \n(50<\n(38 .nr 50 \n(38
.nr 38 \n(e-
.if \n(50<\n(38 .nr 50 \n(38
.nr 38 \n(i-
.if \n(50<\n(38 .nr 50 \n(38
.nr 38 \n(m-
.if \n(50<\n(38 .nr 50 \n(38
.nr 38 \n(q-
.if \n(50<\n(38 .nr 50 \n(38
.nr 38 \n(u-
.if \n(50<\n(38 .nr 50 \n(38
.nr 51 0
.nr 38 \wDescription of Associated Text Block
.if \n(51<\n(38 .nr 51 \n(38
.51
.rm 51
.nr 38 \n(b-
.if \n(51<\n(38 .nr 51 \n(38
.nr 38 \n(f-
.if \n(51<\n(38 .nr 51 \n(38
.nr 38 \n(j-
.if \n(51<\n(38 .nr 51 \n(38
.nr 38 \n(n-
.if \n(51<\n(38 .nr 51 \n(38
.nr 38 \n(r-
.if \n(51<\n(38 .nr 51 \n(38
.nr 38 \n(v-
.if \n(51<\n(38 .nr 51 \n(38
.nr 52 0
.nr 38 \wSource
.if \n(52<\n(38 .nr 52 \n(38
.52
.rm 52
.nr 38 \n(c-
.if \n(52<\n(38 .nr 52 \n(38
.nr 38 \n(g-
.if \n(52<\n(38 .nr 52 \n(38
.nr 38 \n(k-
.if \n(52<\n(38 .nr 52 \n(38
.nr 38 \n(o-
.if \n(52<\n(38 .nr 52 \n(38
.nr 38 \n(s-
.if \n(52<\n(38 .nr 52 \n(38
.nr 38 \n(w-
.if \n(52<\n(38 .nr 52 \n(38
.nr 53 0
.nr 38 \wDest
.if \n(53<\n(38 .nr 53 \n(38
.53
.rm 53
.nr 38 \n(d-
.if \n(53<\n(38 .nr 53 \n(38
.nr 38 \n(h-
.if \n(53<\n(38 .nr 53 \n(38
.nr 38 \n(l-
.if \n(53<\n(38 .nr 53 \n(38
.nr 38 \n(p-
.if \n(53<\n(38 .nr 53 \n(38
.nr 38 \n(t-
.if \n(53<\n(38 .nr 53 \n(38
.nr 38 \n(x-
.if \n(53<\n(38 .nr 53 \n(38
.nr 38 \wSource/Destination Guide-\n(50-3n-\n(51-3n-\n(52-3n-\n(53
.if \n(38>0 .nr 38 \n(38/3
.if \n(38<0 .nr 38 0
.nr 50 +\n(38
.nr 51 +\n(38
.nr 52 +\n(38
.35
.nf
.ll \n(34u
.nr 38 1n
.nr 49 0
.nr 40 \n(49+((2*\n(38)/2)
.nr 50 +\n(40
.nr 41 \n(50+((6*\n(38)/2)
.nr 51 +\n(41
.nr 42 \n(51+((6*\n(38)/2)
.nr 52 +\n(42
.nr 43 \n(52+((6*\n(38)/2)
.nr 53 +\n(43
.nr TW \n(53
.nr TW +((2*\n(38)/2)
.ne 8v+(0u*(\n(.vu-\n(.sp))+(2u*(\n(.vu-\n(.sp))
.fc  
.nr #T 0-1
.nr #a 0-1
.nr #c 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(#c<0  .nr #c \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(#c>=0 \{\
.	sp -1
.	ie \n(#c=\n(#T \{\
.		ie \n(3a \{\
\h'(|\n(41u+|\n(50u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#au-1v'\s0\v'\n(\*(#du-\n(#au+1v'\h'|\n(TWu'\}
.		el \{\
\h'(|\n(41u+|\n(50u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#cu-\n(35u'\s0\v'\n(\*(#du-\n(#cu+\n(35u'\h'|\n(TWu'\}\}
.	el \{\
.	nr 3a 1
\h'(|\n(41u+|\n(50u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#cu-\n(35u'\s0\v'\n(\*(#du-\n(#cu+\n(35u'\h'|\n(TWu'\}\}
.if \n(#c>=0 \{\
.	sp -1
.	ie \n(#c=\n(#T \{\
.		ie \n(3a \{\
\h'(|\n(42u+|\n(51u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#au-1v'\s0\v'\n(\*(#du-\n(#au+1v'\h'|\n(TWu'\}
.		el \{\
\h'(|\n(42u+|\n(51u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#cu-\n(35u'\s0\v'\n(\*(#du-\n(#cu+\n(35u'\h'|\n(TWu'\}\}
.	el \{\
.	nr 3a 1
\h'(|\n(42u+|\n(51u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#cu-\n(35u'\s0\v'\n(\*(#du-\n(#cu+\n(35u'\h'|\n(TWu'\}\}
.if \n(#c>=0 \{\
.	sp -1
.	ie \n(#c=\n(#T \{\
.		ie \n(3a \{\
\h'(|\n(43u+|\n(52u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#au-1v'\s0\v'\n(\*(#du-\n(#au+1v'\h'|\n(TWu'\}
.		el \{\
\h'(|\n(43u+|\n(52u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#cu-\n(35u'\s0\v'\n(\*(#du-\n(#cu+\n(35u'\h'|\n(TWu'\}\}
.	el \{\
.	nr 3a 1
\h'(|\n(43u+|\n(52u)/2u'\s\n(33\h'-\n(#~u'\L'|\n(#cu-\n(35u'\s0\v'\n(\*(#du-\n(#cu+\n(35u'\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'\}\}
.nr #c 0-1
.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(53u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'Source/Destination Guide
.nr tH 0
.sp
.if \n(.tu<=2v .#f
.nr tH 0
.mk #c
.nr 36 \n(.v
.vs \n(.vu-\n(.sp
\h'|0'\s\n(33\l'|\n(TWu\(ul'\s0
.vs \n(36u
.nr 32 0
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\fIbegin\fP and \fIend\fP keys\h'|\n(41u'Description of Associated Text Block\h'|\n(42u'Source\h'|\n(43u'Dest
.nr tH 0
.sp
.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
.nr 32 0
.if \n(a|u>\n(32u .nr 32 \n(a|u
.if \n(b|u>\n(32u .nr 32 \n(b|u
.if \n(c|u>\n(32u .nr 32 \n(c|u
.if \n(d|u>\n(32u .nr 32 \n(d|u
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.mk ##
.nr 37 (\n(40u+\n(50u-\n(a-u)/2u
.in +\n(37u
.ie \n(a|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(a|>\n(tH .nr tH \n(a|
.a+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(41u+\n(51u-\n(b-u)/2u
.in +\n(37u
.ie \n(b|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(b|>\n(tH .nr tH \n(b|
.b+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(42u+\n(52u-\n(c-u)/2u
.in +\n(37u
.ie \n(c|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(c|>\n(tH .nr tH \n(c|
.c+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(43u+\n(53u-\n(d-u)/2u
.in +\n(37u
.ie \n(d|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(d|>\n(tH .nr tH \n(d|
.d+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\h'|\n(41u'\h'|\n(42u'\h'|\n(43u'
.sp |\n(32u
.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
.nr 32 0
.if \n(e|u>\n(32u .nr 32 \n(e|u
.if \n(f|u>\n(32u .nr 32 \n(f|u
.if \n(g|u>\n(32u .nr 32 \n(g|u
.if \n(h|u>\n(32u .nr 32 \n(h|u
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.mk ##
.nr 37 (\n(40u+\n(50u-\n(e-u)/2u
.in +\n(37u
.ie \n(e|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(e|>\n(tH .nr tH \n(e|
.e+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(41u+\n(51u-\n(f-u)/2u
.in +\n(37u
.ie \n(f|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(f|>\n(tH .nr tH \n(f|
.f+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(42u+\n(52u-\n(g-u)/2u
.in +\n(37u
.ie \n(g|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(g|>\n(tH .nr tH \n(g|
.g+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(43u+\n(53u-\n(h-u)/2u
.in +\n(37u
.ie \n(h|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(h|>\n(tH .nr tH \n(h|
.h+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\h'|\n(41u'\h'|\n(42u'\h'|\n(43u'
.sp |\n(32u
.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
.nr 32 0
.if \n(i|u>\n(32u .nr 32 \n(i|u
.if \n(j|u>\n(32u .nr 32 \n(j|u
.if \n(k|u>\n(32u .nr 32 \n(k|u
.if \n(l|u>\n(32u .nr 32 \n(l|u
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.mk ##
.nr 37 (\n(40u+\n(50u-\n(i-u)/2u
.in +\n(37u
.ie \n(i|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(i|>\n(tH .nr tH \n(i|
.i+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(41u+\n(51u-\n(j-u)/2u
.in +\n(37u
.ie \n(j|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(j|>\n(tH .nr tH \n(j|
.j+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(42u+\n(52u-\n(k-u)/2u
.in +\n(37u
.ie \n(k|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(k|>\n(tH .nr tH \n(k|
.k+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(43u+\n(53u-\n(l-u)/2u
.in +\n(37u
.ie \n(l|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(l|>\n(tH .nr tH \n(l|
.l+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\h'|\n(41u'\h'|\n(42u'\h'|\n(43u'
.sp |\n(32u
.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
.nr 32 0
.if \n(m|u>\n(32u .nr 32 \n(m|u
.if \n(n|u>\n(32u .nr 32 \n(n|u
.if \n(o|u>\n(32u .nr 32 \n(o|u
.if \n(p|u>\n(32u .nr 32 \n(p|u
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.mk ##
.nr 37 (\n(40u+\n(50u-\n(m-u)/2u
.in +\n(37u
.ie \n(m|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(m|>\n(tH .nr tH \n(m|
.m+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(41u+\n(51u-\n(n-u)/2u
.in +\n(37u
.ie \n(n|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(n|>\n(tH .nr tH \n(n|
.n+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(42u+\n(52u-\n(o-u)/2u
.in +\n(37u
.ie \n(o|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(o|>\n(tH .nr tH \n(o|
.o+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(43u+\n(53u-\n(p-u)/2u
.in +\n(37u
.ie \n(p|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(p|>\n(tH .nr tH \n(p|
.p+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\h'|\n(41u'\h'|\n(42u'\h'|\n(43u'
.sp |\n(32u
.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
.nr 32 0
.if \n(q|u>\n(32u .nr 32 \n(q|u
.if \n(r|u>\n(32u .nr 32 \n(r|u
.if \n(s|u>\n(32u .nr 32 \n(s|u
.if \n(t|u>\n(32u .nr 32 \n(t|u
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.mk ##
.nr 37 (\n(40u+\n(50u-\n(q-u)/2u
.in +\n(37u
.ie \n(q|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(q|>\n(tH .nr tH \n(q|
.q+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(41u+\n(51u-\n(r-u)/2u
.in +\n(37u
.ie \n(r|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(r|>\n(tH .nr tH \n(r|
.r+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(42u+\n(52u-\n(s-u)/2u
.in +\n(37u
.ie \n(s|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(s|>\n(tH .nr tH \n(s|
.s+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(43u+\n(53u-\n(t-u)/2u
.in +\n(37u
.ie \n(t|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(t|>\n(tH .nr tH \n(t|
.t+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\h'|\n(41u'\h'|\n(42u'\h'|\n(43u'
.sp |\n(32u
.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
.nr 32 0
.if \n(u|u>\n(32u .nr 32 \n(u|u
.if \n(v|u>\n(32u .nr 32 \n(v|u
.if \n(w|u>\n(32u .nr 32 \n(w|u
.if \n(x|u>\n(32u .nr 32 \n(x|u
.nr 32 \n(32u+\n(.du+2p
.ta \n(50u \n(51u \n(52u \n(53u 
.mk ##
.nr 37 (\n(40u+\n(50u-\n(u-u)/2u
.in +\n(37u
.ie \n(u|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(u|>\n(tH .nr tH \n(u|
.u+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(41u+\n(51u-\n(v-u)/2u
.in +\n(37u
.ie \n(v|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(v|>\n(tH .nr tH \n(v|
.v+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(42u+\n(52u-\n(w-u)/2u
.in +\n(37u
.ie \n(w|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(w|>\n(tH .nr tH \n(w|
.w+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 37 (\n(43u+\n(53u-\n(x-u)/2u
.in +\n(37u
.ie \n(x|>\n(.t .nr #& 1
.el .nr #& 0
.if \n(x|>\n(tH .nr tH \n(x|
.x+
.#%
.in -\n(37u
.mk 38
.if \n(38>\n(32 .nr 32 \n(38
.sp |\n(##u
.nr 35 1m
.nr 31 \n(.f
.af 31 01
\&\h'|\n(40u'\h'|\n(41u'\h'|\n(42u'\h'|\n(43u'
.sp |\n(32u
.fc
.ch #f
.rm #f
.nr T. 1
.T# \n(T.
.rm T#
.rr 3a
.35
.nr #a 0
.nr #c 0
.rm a+
.rm b+
.rm c+
.rm d+
.rm e+
.rm f+
.rm g+
.rm h+
.rm i+
.rm j+
.rm k+
.rm l+
.rm m+
.rm n+
.rm o+
.rm p+
.rm q+
.rm r+
.rm s+
.rm t+
.rm u+
.rm v+
.rm w+
.rm x+
.TE
.if \n-(b.=0 .nr c. \n(.c-\n(d.-143
.nr PS 11
.bp
.NH 2 "EXAMPLE PS FILE"
.XS
      \*(SN  EXAMPLE PS FILE
.XE
.sp 2
.RS
.ps 8
.vs 8
.nf
 -AUTHORS
 Scott Wilson
 -AUTHORS_END

 -LIBRARY_MODS
 .LP
 Scott Wilson (April 29, 1988)
 .LP
 Marcelo Teran, John Rasure, Tom Sauer
 .LP
 Scott Wilson (December 28, 1989) - Upgrade to multiband.
 -LIBRARY_MODS_END

 -SHORT_PROG_DESCRIPTION
 Adds two images pixel by pixel.
 -SHORT_PROG_DESCRIPTION_END

 -SHORT_LIB_DESCRIPTION
 Adds two images pixel by pixel with an operation gating mask.
 -SHORT_LIB_DESCRIPTION_END

 -MAN1_LONG_DESCRIPTION
 .I vadd
 will add two input images pixel by pixel.
 The optional input mask image is used to gate the operation. 
 .LP
 A non-zero mask pixel enables the output pixel to contain the sum. 
 A zero mask pixel just transfers the value of the corresponding 
 pixel in the first input image to the output pixel.
 .LP
 The two input images must be of the same data type and size, as 
 must the optional mask image. The output image data type is the 
 same as the input images.
 -MAN1_LONG_DESCRIPTION_END

 -MAN1_EXAMPLES
 vadd -i1 ball.xv -i2 ball.xv -o outimage.xv
 .LP
 Will add image 1 "ball.xv" and image 2 "ball.xv" with the resulting
 image written to "outimage.xv".
 -MAN1_EXAMPLES_END
 
 -MAN1_RESTRICTIONS
 .I vadd
 will not operate on BIT data storage types.
 -MAN1_RESTRICTIONS_END
 
 -MAN1_SEE_ALSO
 vipl(3)
 -MAN1_SEE_ALSO_END
 
 -MAN3_LONG_DESCRIPTION
 .I vadd
 will add two images pixel by pixel.
 img1 and img2 are the input images; img3 is the gating image,
 and mflg should be set to 1 if the gating image is to be used.
 A non-zero mask pixel in img3 enables the output pixel to contain 
 the sum. A zero mask pixel in img3 just transfers the value 
 of the corresponding pixel in img1 to the output pixel.
 .LP
 The mask image must be the same data storage type and size as the 
 two input images. The output image data type is the same as the 
 input images.
 Note that img1 is used for both the input xvimage structure and the
 resulting output xvimage structure.  This is done to save space, but 
 you must be careful not to overwrite important data.
 -MAN3_LONG_DESCRIPTION_END
 
 -MAN3_RESTRICTIONS
 .I lvadd
 will not operate on VFF_TYP_BIT data storage types.
 -MAN3_RESTRICTIONS_END
 
 -MAN3_SEE_ALSO
 vipl(3)
 -MAN3_SEE_ALSO_END
 
 -USAGE_ADDITIONS
 	fprintf(stderr, "\tOptional third input is a masking image.\n");
 	fprintf(stderr, "\t\n");
 -USAGE_ADDITIONS_END

 -INCLUDE_INCLUDES
 -INCLUDE_INCLUDES_END
 
 -INCLUDE_ADDITIONS
 -INCLUDE_ADDITIONS_END
 
 -INCLUDE_MACROS
 #define CHECKINPUT(program, img1, img2) \\
         (void) proper_num_images(program,img1,1,TRUE); \\
         (void) match_num_images(program,img1,img2,TRUE); \\
         \\
         (void) match_num_bands(program,img1,img2,TRUE); \\
         \\
         (void) proper_map_enable(program,img1,VFF_MAP_OPTIONAL,TRUE); \\
         (void) match_map_enable(program,img1,img2,TRUE); \\
         \\
         (void) matchsize(program,img1,img2,TRUE); \\
         (void) matchtype(program,img1,img2,TRUE)
 
 #define MATCHINPUT(program, img1, img2) \\
         (void) match_num_images(program,img1,img2,TRUE); \\
         \\
         (void) match_num_bands(program,img1,img2,TRUE); \\
         (void) match_map_enable(program,img1,img2,TRUE); \\
         \\
         (void) matchsize(program,img1,img2,TRUE); \\
         (void) matchtype(program,img1,img2,TRUE)
 -INCLUDE_MACROS_END
 
 -MAIN_VARIABLE_LIST
 struct xvimage *img1, *img2, *img3, *readimage();
 -MAIN_VARIABLE_LIST_END
 
 -MAIN_BEFORE_LIB_CALL
 	if (check_args()) exit(1);
 
 	img1 = readimage(vadd->i1_fd);
 	if (img1 == NULL) exit(1);                    
 
 	img2 = readimage(vadd->i2_fd);
 	if (img2 == NULL) exit(1);                      
 
 	if (vadd->m_flag) img3 = readimage(vadd->m_fd);
 	if (vadd->m_flag && (img3 == NULL)) exit(1);         
 
         CHECKINPUT(program, img1, img2);      /* Verify input images */
 
         if(vadd->m_flag)  { 
      	    MATCHINPUT(program, img1, img3);  /* Verify input images */
         }
 -MAIN_BEFORE_LIB_CALL_END
 
 -MAIN_LIBRARY_CALL
 	if(! lvadd(img1, img2, img3, vadd->m_flag) )
 	{
   	    (void) fprintf(stderr, "lvadd Failed\n");
   	    exit(1);
 	}
 -MAIN_LIBRARY_CALL_END
 
 -MAIN_AFTER_LIB_CALL
 	vopen_output(vadd->o_file, &vadd->o_fd);
 	(void) writeimage(vadd->o_fd, img1);
 -MAIN_AFTER_LIB_CALL_END
 
 -LIBRARY_INCLUDES
 -LIBRARY_INCLUDES_END
 
 -LIBRARY_INPUT
 .IP "img1" 15  
 first xvimage structure
 .IP "img2" 15
 second xvimage structure
 .IP "img3" 15
 gating mask image
 .IP "mflg" 15
 a flag set (equal 1) if gating image mask available
 .IP
 Note that all inputs must be of the same data type and size.
 -LIBRARY_INPUT_END
 
 -LIBRARY_OUTPUT
 .IP "img1" 15
 holds the result of the add operation.  The output data
 type is the same as the input data type.
 .IP "Return Value:" 15
 1 on success, 0 on failure.
 -LIBRARY_OUTPUT_END
 
 -LIBRARY_DEF
 int
 lvadd(img1,img2,img3,mflg)
 struct xvimage *img1, *img2, *img3;
 int   mflg;
 -LIBRARY_DEF_END
 
 -LIBRARY_CODE
 {
     int    j, k;
     int    *i1,*i2,*i3,*i4;
     short  *s1,*s2,*s3,*s4;
     float  *f1,*f2,*f3,*f4;
     unsigned char *c1,*c2,*c3,*c4;
 
     switch (img1->data_storage_type)
       {
          case VFF_TYP_BIT :
           fprintf(stderr,"lvadd: Don't know how to add BIT images\n");
           return(0);
           break;
 
          case VFF_TYP_1_BYTE : 
           k = img1->row_size*img1->col_size*img1->num_data_bands;
  
 	...
  	...
 	...
   
  
         default:
           fprintf(stderr,"lvadd: Unknown data storage type, %d\n",img1->data_storage_type);
           return(0);
            break;
       }
       return(1);
 }
 -LIBRARY_CODE_END
.fi
.ps 11
.RE
.sp
 
