\input texinfo   @c -*-texinfo-*-
@c %**start of header
@setfilename gnat-style.info
@documentencoding UTF-8
@ifinfo
@*Generated by Sphinx 4.0.2.@*
@end ifinfo
@settitle GNAT Coding Style A Guide for GNAT Developers
@defindex ge
@paragraphindent 0
@exampleindent 4
@finalout
@dircategory GNU Ada Tools 
@direntry
* gnat-style: (gnat-style.info). gnat-style
@end direntry

@definfoenclose strong,`,'
@definfoenclose emph,`,'
@c %**end of header

@copying
@quotation
GNAT Coding Style: A Guide for GNAT Developers , Jun 23, 2021

AdaCore

Copyright @copyright{} 2008-2021, Free Software Foundation
@end quotation

@end copying

@titlepage
@title GNAT Coding Style A Guide for GNAT Developers
@insertcopying
@end titlepage
@contents

@c %** start of user preamble

@c %** end of user preamble

@ifnottex
@node Top
@top GNAT Coding Style A Guide for GNAT Developers
@insertcopying
@end ifnottex

@c %**start of body
@anchor{gnat-style doc}@anchor{0}
@menu
* General:: 
* Lexical Elements:: 
* Declarations and Types:: 
* Expressions and Names:: 
* Statements:: 
* Subprograms:: 
* Packages and Visibility Rules:: 
* Program Structure and Compilation Issues:: 
* Index:: 

@end menu

@node General,Lexical Elements,Top,Top
@anchor{gnat-style general}@anchor{1}@anchor{gnat-style gnat-coding-style-a-guide-for-gnat-developers}@anchor{2}
@chapter General


Most of GNAT is written in Ada using a consistent style to ensure
readability of the code.  This document has been written to help
maintain this consistent style, while having a large group of developers
work on the compiler.

For the coding style in the C parts of the compiler and run time,
see the GNU Coding Guidelines.

This document is structured after the Ada Reference Manual.
Those familiar with that document should be able to quickly
lookup style rules for particular constructs.

@node Lexical Elements,Declarations and Types,General,Top
@anchor{gnat-style lexical-elements}@anchor{3}
@chapter Lexical Elements


@menu
* Character Set and Separators:: 
* Identifiers:: 
* Numeric Literals:: 
* Reserved Words:: 
* Comments:: 

@end menu

@node Character Set and Separators,Identifiers,,Lexical Elements
@anchor{gnat-style character-set-and-separators}@anchor{4}
@section Character Set and Separators


@geindex Character set

@geindex ASCII

@geindex Separators

@geindex End-of-line

@geindex Line length

@geindex Indentation


@itemize *

@item 
The character set used should be plain 7-bit ASCII.
The only separators allowed are space and the end-of-line sequence.
No other control character or format effector (such as @code{HT},
@code{VT}, @code{FF} )
should be used.
The normal end-of-line sequence is used, which may be
@code{LF}, @code{CR/LF} or @code{CR},
depending on the host system.  An optional @code{SUB}
( @code{16#1A#} ) may be present as the
last character in the file on hosts using that character as file terminator.

@item 
Files that are checked in or distributed should be in host format.

@item 
A line should never be longer than 79 characters, not counting the line
separator.

@item 
Lines must not have trailing blanks.

@item 
Indentation is 3 characters per level for @code{if} statements, loops, and
@code{case} statements.
For exact information on required spacing between lexical
elements, see file style.adb.

@geindex style.adb file
@end itemize

@node Identifiers,Numeric Literals,Character Set and Separators,Lexical Elements
@anchor{gnat-style identifiers}@anchor{5}
@section Identifiers



@itemize *

@item 
Identifiers will start with an upper case letter, and each letter following
an underscore will be upper case.

@geindex Casing (for identifiers)

Short acronyms may be all upper case.
All other letters are lower case.
An exception is for identifiers matching a foreign language.  In particular,
we use all lower case where appropriate for C.

@item 
Use underscores to separate words in an identifier.

@geindex Underscores

@item 
Try to limit your use of abbreviations in identifiers.
It is ok to make a few abbreviations, explain what they mean, and then
use them frequently, but don’t use lots of obscure abbreviations.  An
example is the @code{ALI} word which stands for Ada Library
Information and is by convention always written in upper-case when
used in entity names.

@example
procedure Find_ALI_Files;
@end example

@item 
Don’t use the variable name @code{I}, use @code{J} instead; @code{I} is too
easily confused with @code{1} in some fonts.  Similarly don’t use the
variable @code{O}, which is too easily mistaken for the number @code{0}.
@end itemize

@node Numeric Literals,Reserved Words,Identifiers,Lexical Elements
@anchor{gnat-style numeric-literals}@anchor{6}
@section Numeric Literals



@itemize *

@item 
Numeric literals should include underscores where helpful for
readability.

@geindex Underscores

@example
1_000_000
16#8000_0000#
3.14159_26535_89793_23846
@end example
@end itemize

@node Reserved Words,Comments,Numeric Literals,Lexical Elements
@anchor{gnat-style reserved-words}@anchor{7}
@section Reserved Words



@itemize *

@item 
Reserved words use all lower case.

@geindex Casing (for reserved words)

@example
return else
@end example

@item 
The words @code{Access}, @code{Delta} and @code{Digits} are
capitalized when used as attribute_designator.
@end itemize

@node Comments,,Reserved Words,Lexical Elements
@anchor{gnat-style comments}@anchor{8}
@section Comments



@itemize *

@item 
A comment starts with @code{--} followed by two spaces.
The only exception to this rule (i.e. one space is tolerated) is when the
comment ends with a single space followed by @code{--}.
It is also acceptable to have only one space between @code{--} and the start
of the comment when the comment is at the end of a line,
after some Ada code.

@item 
Every sentence in a comment should start with an upper-case letter (including
the first letter of the comment).

@geindex Casing (in comments)

@item 
When declarations are commented with ‘hanging’ comments, i.e.
comments after the declaration, there is no blank line before the
comment, and if it is absolutely necessary to have blank lines within
the comments, e.g. to make paragraph separations within a single comment,
these blank lines @emph{do} have a @code{--} (unlike the
normal rule, which is to use entirely blank lines for separating
comment paragraphs).  The comment starts at same level of indentation
as code it is commenting.

@geindex Blank lines (in comments)

@geindex Indentation

@example
z : Integer;
--  Integer value for storing value of z
--
--  The previous line was a blank line.
@end example

@item 
Comments that are dubious or incomplete, or that comment on possibly
wrong or incomplete code, should be preceded or followed by @code{???}.

@item 
Comments in a subprogram body must generally be surrounded by blank lines.
An exception is a comment that follows a line containing a single keyword
( @code{begin}, @code{else}, @code{loop} ):

@example
begin
   --  Comment for the next statement

   A := 5;

   --  Comment for the B statement

   B := 6;
end;
@end example

@item 
In sequences of statements, comments at the end of the lines should be
aligned.

@geindex Alignment (in comments)

@example
My_Identifier := 5;      --  First comment
Other_Id := 6;           --  Second comment
@end example

@item 
Short comments that fit on a single line are @emph{not} ended with a
period.  Comments taking more than a line are punctuated in the normal
manner.

@item 
Comments should focus on @emph{why} instead of @emph{what}.
Descriptions of what subprograms do go with the specification.

@item 
Comments describing a subprogram spec should specifically mention the
formal argument names.  General rule: write a comment that does not
depend on the names of things.  The names are supplementary, not
sufficient, as comments.

@item 
@emph{Do not} put two spaces after periods in comments.
@end itemize

@node Declarations and Types,Expressions and Names,Lexical Elements,Top
@anchor{gnat-style declarations-and-types}@anchor{9}
@chapter Declarations and Types



@itemize *

@item 
In entity declarations, colons must be surrounded by spaces.  Colons
should be aligned.

@geindex Alignment (in declarations)

@example
Entity1   : Integer;
My_Entity : Integer;
@end example

@item 
Declarations should be grouped in a logical order.
Related groups of declarations may be preceded by a header comment.

@item 
All local subprograms in a subprogram or package body should be declared
before the first local subprogram body.

@item 
Do not declare local entities that hide global entities.

@geindex Hiding of outer entities

@item 
Do not declare multiple variables in one declaration that spans lines.
Start a new declaration on each line, instead.

@item 
The defining_identifiers of global declarations serve as
comments of a sort.  So don’t choose terse names, but look for names
that give useful information instead.

@item 
Local names can be shorter, because they are used only within
one context, where comments explain their purpose.

@item 
When starting an initialization or default expression on the line that follows
the declaration line, use 2 characters for indentation.

@example
Entity1 : Integer :=
  Function_Name (Parameters, For_Call);
@end example

@item 
If an initialization or default expression needs to be continued on subsequent
lines, the continuations should be indented from the start of the expression.

@example
Entity1 : Integer := Long_Function_Name
                       (parameters for call);
@end example
@end itemize

@node Expressions and Names,Statements,Declarations and Types,Top
@anchor{gnat-style expressions-and-names}@anchor{a}
@chapter Expressions and Names



@itemize *

@item 
Every operator must be surrounded by spaces. An exception is that
this rule does not apply to the exponentiation operator, for which
there are no specific layout rules. The reason for this exception
is that sometimes it makes clearer reading to leave out the spaces
around exponentiation.

@geindex Operators

@example
E := A * B**2 + 3 * (C - D);
@end example

@item 
Use parentheses where they clarify the intended association of operands
with operators:

@geindex Parenthesization of expressions

@example
(A / B) * C
@end example
@end itemize

@node Statements,Subprograms,Expressions and Names,Top
@anchor{gnat-style statements}@anchor{b}
@chapter Statements


@menu
* Simple and Compound Statements:: 
* If Statements:: 
* Case Statements:: 
* Loop Statements:: 
* Block Statements:: 

@end menu

@node Simple and Compound Statements,If Statements,,Statements
@anchor{gnat-style simple-and-compound-statements}@anchor{c}
@section Simple and Compound Statements



@itemize *

@item 
Use only one statement or label per line.

@item 
A longer sequence_of_statements may be divided in logical
groups or separated from surrounding code using a blank line.
@end itemize

@node If Statements,Case Statements,Simple and Compound Statements,Statements
@anchor{gnat-style if-statements}@anchor{d}
@section If Statements



@itemize *

@item 
When the @code{if}, @code{elsif} or @code{else} keywords fit on the
same line with the condition and the @code{then} keyword, then the
statement is formatted as follows:

@geindex Alignment (in an if statement)

@example
if condition then
   ...
elsif condition then
   ...
else
   ...
end if;
@end example

When the above layout is not possible, @code{then} should be aligned
with @code{if}, and conditions should preferably be split before an
@code{and} or @code{or} keyword a follows:

@example
if long_condition_that_has_to_be_split
  and then continued_on_the_next_line
then
   ...
end if;
@end example

The @code{elsif}, @code{else} and @code{end if} always line up with
the @code{if} keyword.  The preferred location for splitting the line
is before @code{and} or @code{or}.  The continuation of a condition is
indented with two spaces or as many as needed to make nesting clear.
As an exception, if conditions are closely related either of the
following is allowed:

@example
if x = lakdsjfhlkashfdlkflkdsalkhfsalkdhflkjdsahf
     or else
   x = asldkjhalkdsjfhhfd
     or else
   x = asdfadsfadsf
then
  ...
end if;

if x = lakdsjfhlkashfdlkflkdsalkhfsalkdhflkjdsahf or else
   x = asldkjhalkdsjfhhfd                         or else
   x = asdfadsfadsf
then
  ...
end if;
@end example

@item 
Conditions should use short-circuit forms ( @code{and then},
@code{or else} ), except when the operands are boolean variables
or boolean constants.

@geindex Short-circuit forms

@item 
Complex conditions in @code{if} statements are indented two characters:

@geindex Indentation (in if statements)

@example
if this_complex_condition
  and then that_other_one
  and then one_last_one
then
   ...
end if;
@end example

There are some cases where complex conditionals can be laid out
in manners that do not follow these rules to preserve better
parallelism between branches, e.g.

@example
if xyz.abc (gef) = 'c'
     or else
   xyz.abc (gef) = 'x'
then
   ...
end if;
@end example

@item 
Every @code{if} block is preceded and followed by a blank line, except
where it begins or ends a sequence_of_statements.

@geindex Blank lines (in an if statement)

@example
A := 5;

if A = 5 then
   null;
end if;

A := 6;
@end example
@end itemize

@node Case Statements,Loop Statements,If Statements,Statements
@anchor{gnat-style case-statements}@anchor{e}
@section Case Statements



@itemize *

@item 
Layout is as below.  For long @code{case} statements, the extra indentation
can be saved by aligning the @code{when} clauses with the opening @code{case}.

@example
case expression is
   when condition =>
      ...
   when condition =>
      ...
end case;
@end example
@end itemize

@node Loop Statements,Block Statements,Case Statements,Statements
@anchor{gnat-style loop-statements}@anchor{f}
@section Loop Statements



@itemize *

@item 
When possible, have @code{for} or @code{while} on one line with the
condition and the @code{loop} keyword.

@example
for J in S'Range loop
   ...
end loop;
@end example

If the condition is too long, split the condition (see ‘If
statements’ above) and align @code{loop} with the @code{for} or
@code{while} keyword.

@geindex Alignment (in a loop statement)

@example
while long_condition_that_has_to_be_split
  and then continued_on_the_next_line
loop
   ...
end loop;
@end example

If the loop_statement has an identifier, it is laid out as follows:

@example
Outer : while not condition loop
   ...
end Outer;
@end example
@end itemize

@node Block Statements,,Loop Statements,Statements
@anchor{gnat-style block-statements}@anchor{10}
@section Block Statements



@itemize *

@item 
The @code{declare} (optional), @code{begin} and @code{end} words
are aligned, except when the block_statement is named.  There
is a blank line before the @code{begin} keyword:

@geindex Alignment (in a block statement)

@example
Some_Block : declare
   ...

begin
   ...
end Some_Block;
@end example
@end itemize

@node Subprograms,Packages and Visibility Rules,Statements,Top
@anchor{gnat-style subprograms}@anchor{11}
@chapter Subprograms


@menu
* Subprogram Declarations:: 
* Subprogram Bodies:: 

@end menu

@node Subprogram Declarations,Subprogram Bodies,,Subprograms
@anchor{gnat-style subprogram-declarations}@anchor{12}
@section Subprogram Declarations



@itemize *

@item 
Do not write the @code{in} for parameters.

@example
function Length (S : String) return Integer;
@end example

@item 
When the declaration line for a procedure or a function is too long to fit
the entire declaration (including the keyword procedure or function) on a
single line, then fold it, putting a single parameter on a line, aligning
the colons, as in:

@example
procedure Set_Heading
  (Source : String;
   Count  : Natural;
   Pad    : Character := Space;
   Fill   : Boolean   := True);
@end example

In the case of a function, if the entire spec does not fit on one line, then
the return may appear after the last parameter, as in:

@example
function Head
  (Source : String;
   Count  : Natural;
   Pad    : Character := Space) return String;
@end example

Or it may appear on its own as a separate line. This form is preferred when
putting the return on the same line as the last parameter would result in
an overlong line. The return type may optionally be aligned with the types
of the parameters (usually we do this aligning if it results only in a small
number of extra spaces, and otherwise we don’t attempt to align). So two
alternative forms for the above spec are:

@example
function Head
  (Source : String;
   Count  : Natural;
   Pad    : Character := Space)
   return   String;

function Head
  (Source : String;
   Count  : Natural;
   Pad    : Character := Space)
   return String;
@end example
@end itemize

@node Subprogram Bodies,,Subprogram Declarations,Subprograms
@anchor{gnat-style subprogram-bodies}@anchor{13}
@section Subprogram Bodies



@itemize *

@item 
Function and procedure bodies should usually be sorted alphabetically. Do
not attempt to sort them in some logical order by functionality. For a
sequence of subprogram specs, a general alphabetical sorting is also
usually appropriate, but occasionally it makes sense to group by major
function, with appropriate headers.

@item 
All subprograms have a header giving the function name, with the following
format:

@example
-----------------
-- My_Function --
-----------------

procedure My_Function is
begin
  ...
end My_Function;
@end example

Note that the name in the header is preceded by a single space,
not two spaces as for other comments. These headers are used on
nested subprograms as well as outer level subprograms. They may
also be used as headers for sections of comments, or collections
of declarations that are related.

@item 
Every subprogram body must have a preceding subprogram_declaration,
which includes proper client documentation so that you do not need to
read the subprogram body in order to understand what the subprogram does and
how to call it. All subprograms should be documented, without exceptions.

@geindex Blank lines (in subprogram bodies)

@item 
A sequence of declarations may optionally be separated from the following
begin by a blank line.  Just as we optionally allow blank lines in general
between declarations, this blank line should be present only if it improves
readability. Generally we avoid this blank line if the declarative part is
small (one or two lines) and the body has no blank lines, and we include it
if the declarative part is long or if the body has blank lines.

@item 
If the declarations in a subprogram contain at least one nested
subprogram body, then just before the @code{begin} of the enclosing
subprogram, there is a comment line and a blank line:

@example
--  Start of processing for Enclosing_Subprogram

begin
  ...
end Enclosing_Subprogram;
@end example

@item 
When nested subprograms are present, variables that are referenced by any
nested subprogram should precede the nested subprogram specs. For variables
that are not referenced by nested procedures, the declarations can either also
be before any of the nested subprogram specs (this is the old style, more
generally used). Or then can come just before the begin, with a header. The
following example shows the two possible styles:

@example
procedure Style1 is
   Var_Referenced_In_Nested      : Integer;
   Var_Referenced_Only_In_Style1 : Integer;

   proc Nested;
   --  Comments ...

   ------------
   -- Nested --
   ------------

   procedure Nested is
   begin
      ...
   end Nested;

--  Start of processing for Style1

begin
   ...
end Style1;

procedure Style2 is
   Var_Referenced_In_Nested : Integer;

   proc Nested;
   --  Comments ...

   ------------
   -- Nested --
   ------------

   procedure Nested is
   begin
      ...
   end Nested;

   --  Local variables

   Var_Referenced_Only_In_Style2 : Integer;

--  Start of processing for Style2

begin
   ...
end Style2;
@end example

For new code, we generally prefer Style2, but we do not insist on
modifying all legacy occurrences of Style1, which is still much
more common in the sources.
@end itemize

@node Packages and Visibility Rules,Program Structure and Compilation Issues,Subprograms,Top
@anchor{gnat-style packages-and-visibility-rules}@anchor{14}
@chapter Packages and Visibility Rules



@itemize *

@item 
All program units and subprograms have their name at the end:

@example
package P is
   ...
end P;
@end example

@item 
We will use the style of @code{use} -ing @code{with} -ed packages, with
the context clauses looking like:

@geindex use clauses

@example
with A; use A;
with B; use B;
@end example

@item 
Names declared in the visible part of packages should be
unique, to prevent name clashes when the packages are @code{use} d.

@geindex Name clash avoidance

@example
package Entity is
   type Entity_Kind is ...;
   ...
end Entity;
@end example

@item 
After the file header comment, the context clause and unit specification
should be the first thing in a program_unit.

@item 
Preelaborate, Pure and Elaborate_Body pragmas should be added right after the
package name, indented an extra level and using the parameterless form:

@example
package Preelaborate_Package is
   pragma Preelaborate;
   ...
end Preelaborate_Package;
@end example
@end itemize

@node Program Structure and Compilation Issues,Index,Packages and Visibility Rules,Top
@anchor{gnat-style program-structure-and-compilation-issues}@anchor{15}
@chapter Program Structure and Compilation Issues



@itemize *

@item 
Every GNAT source file must be compiled with the @code{-gnatg}
switch to check the coding style.
(Note that you should look at
style.adb to see the lexical rules enforced by @code{-gnatg} ).

@geindex -gnatg option (to gcc)

@geindex style.adb file

@item 
Each source file should contain only one compilation unit.

@item 
Filenames should be 8 or fewer characters, followed by the @code{.adb}
extension for a body or @code{.ads} for a spec.

@geindex File name length

@item 
Unit names should be distinct when ‘krunch’ed to 8 characters
(see krunch.ads) and the filenames should match the unit name,
except that they are all lower case.

@geindex krunch.ads file
@end itemize

@menu
* GNU Free Documentation License:: 

@end menu

@node GNU Free Documentation License,,,Program Structure and Compilation Issues
@anchor{share/gnu_free_documentation_license doc}@anchor{16}@anchor{share/gnu_free_documentation_license gnu-fdl}@anchor{17}@anchor{share/gnu_free_documentation_license gnu-free-documentation-license}@anchor{18}
@section GNU Free Documentation License


Version 1.3, 3 November 2008

Copyright  2000, 2001, 2002, 2007, 2008  Free Software Foundation, Inc
@indicateurl{http://fsf.org/}

Everyone is permitted to copy and distribute verbatim copies of this
license document, but changing it is not allowed.

@strong{Preamble}

The purpose of this License is to make a manual, textbook, or other
functional and useful document “free” in the sense of freedom: to
assure everyone the effective freedom to copy and redistribute it,
with or without modifying it, either commercially or noncommercially.
Secondarily, this License preserves for the author and publisher a way
to get credit for their work, while not being considered responsible
for modifications made by others.

This License is a kind of “copyleft”, which means that derivative
works of the document must themselves be free in the same sense.  It
complements the GNU General Public License, which is a copyleft
license designed for free software.

We have designed this License in order to use it for manuals for free
software, because free software needs free documentation: a free
program should come with manuals providing the same freedoms that the
software does.  But this License is not limited to software manuals;
it can be used for any textual work, regardless of subject matter or
whether it is published as a printed book.  We recommend this License
principally for works whose purpose is instruction or reference.

@strong{1. APPLICABILITY AND DEFINITIONS}

This License applies to any manual or other work, in any medium, that
contains a notice placed by the copyright holder saying it can be
distributed under the terms of this License.  Such a notice grants a
world-wide, royalty-free license, unlimited in duration, to use that
work under the conditions stated herein.  The @strong{Document}, below,
refers to any such manual or work.  Any member of the public is a
licensee, and is addressed as “@strong{you}”.  You accept the license if you
copy, modify or distribute the work in a way requiring permission
under copyright law.

A “@strong{Modified Version}” of the Document means any work containing the
Document or a portion of it, either copied verbatim, or with
modifications and/or translated into another language.

A “@strong{Secondary Section}” is a named appendix or a front-matter section of
the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Document’s overall subject
(or to related matters) and contains nothing that could fall directly
within that overall subject.  (Thus, if the Document is in part a
textbook of mathematics, a Secondary Section may not explain any
mathematics.)  The relationship could be a matter of historical
connection with the subject or with related matters, or of legal,
commercial, philosophical, ethical or political position regarding
them.

The “@strong{Invariant Sections}” are certain Secondary Sections whose titles
are designated, as being those of Invariant Sections, in the notice
that says that the Document is released under this License.  If a
section does not fit the above definition of Secondary then it is not
allowed to be designated as Invariant.  The Document may contain zero
Invariant Sections.  If the Document does not identify any Invariant
Sections then there are none.

The “@strong{Cover Texts}” are certain short passages of text that are listed,
as Front-Cover Texts or Back-Cover Texts, in the notice that says that
the Document is released under this License.  A Front-Cover Text may
be at most 5 words, and a Back-Cover Text may be at most 25 words.

A “@strong{Transparent}” copy of the Document means a machine-readable copy,
represented in a format whose specification is available to the
general public, that is suitable for revising the document
straightforwardly with generic text editors or (for images composed of
pixels) generic paint programs or (for drawings) some widely available
drawing editor, and that is suitable for input to text formatters or
for automatic translation to a variety of formats suitable for input
to text formatters.  A copy made in an otherwise Transparent file
format whose markup, or absence of markup, has been arranged to thwart
or discourage subsequent modification by readers is not Transparent.
An image format is not Transparent if used for any substantial amount
of text.  A copy that is not “Transparent” is called @strong{Opaque}.

Examples of suitable formats for Transparent copies include plain
ASCII without markup, Texinfo input format, LaTeX input format, SGML
or XML using a publicly available DTD, and standard-conforming simple
HTML, PostScript or PDF designed for human modification.  Examples of
transparent image formats include PNG, XCF and JPG.  Opaque formats
include proprietary formats that can be read and edited only by
proprietary word processors, SGML or XML for which the DTD and/or
processing tools are not generally available, and the
machine-generated HTML, PostScript or PDF produced by some word
processors for output purposes only.

The “@strong{Title Page}” means, for a printed book, the title page itself,
plus such following pages as are needed to hold, legibly, the material
this License requires to appear in the title page.  For works in
formats which do not have any title page as such, “Title Page” means
the text near the most prominent appearance of the work’s title,
preceding the beginning of the body of the text.

The “@strong{publisher}” means any person or entity that distributes
copies of the Document to the public.

A section “@strong{Entitled XYZ}” means a named subunit of the Document whose
title either is precisely XYZ or contains XYZ in parentheses following
text that translates XYZ in another language.  (Here XYZ stands for a
specific section name mentioned below, such as “@strong{Acknowledgements}”,
“@strong{Dedications}”, “@strong{Endorsements}”, or “@strong{History}”.)
To “@strong{Preserve the Title}”
of such a section when you modify the Document means that it remains a
section “Entitled XYZ” according to this definition.

The Document may include Warranty Disclaimers next to the notice which
states that this License applies to the Document.  These Warranty
Disclaimers are considered to be included by reference in this
License, but only as regards disclaiming warranties: any other
implication that these Warranty Disclaimers may have is void and has
no effect on the meaning of this License.

@strong{2. VERBATIM COPYING}

You may copy and distribute the Document in any medium, either
commercially or noncommercially, provided that this License, the
copyright notices, and the license notice saying this License applies
to the Document are reproduced in all copies, and that you add no other
conditions whatsoever to those of this License.  You may not use
technical measures to obstruct or control the reading or further
copying of the copies you make or distribute.  However, you may accept
compensation in exchange for copies.  If you distribute a large enough
number of copies you must also follow the conditions in section 3.

You may also lend copies, under the same conditions stated above, and
you may publicly display copies.

@strong{3. COPYING IN QUANTITY}

If you publish printed copies (or copies in media that commonly have
printed covers) of the Document, numbering more than 100, and the
Document’s license notice requires Cover Texts, you must enclose the
copies in covers that carry, clearly and legibly, all these Cover
Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
the back cover.  Both covers must also clearly and legibly identify
you as the publisher of these copies.  The front cover must present
the full title with all words of the title equally prominent and
visible.  You may add other material on the covers in addition.
Copying with changes limited to the covers, as long as they preserve
the title of the Document and satisfy these conditions, can be treated
as verbatim copying in other respects.

If the required texts for either cover are too voluminous to fit
legibly, you should put the first ones listed (as many as fit
reasonably) on the actual cover, and continue the rest onto adjacent
pages.

If you publish or distribute Opaque copies of the Document numbering
more than 100, you must either include a machine-readable Transparent
copy along with each Opaque copy, or state in or with each Opaque copy
a computer-network location from which the general network-using
public has access to download using public-standard network protocols
a complete Transparent copy of the Document, free of added material.
If you use the latter option, you must take reasonably prudent steps,
when you begin distribution of Opaque copies in quantity, to ensure
that this Transparent copy will remain thus accessible at the stated
location until at least one year after the last time you distribute an
Opaque copy (directly or through your agents or retailers) of that
edition to the public.

It is requested, but not required, that you contact the authors of the
Document well before redistributing any large number of copies, to give
them a chance to provide you with an updated version of the Document.

@strong{4. MODIFICATIONS}

You may copy and distribute a Modified Version of the Document under
the conditions of sections 2 and 3 above, provided that you release
the Modified Version under precisely this License, with the Modified
Version filling the role of the Document, thus licensing distribution
and modification of the Modified Version to whoever possesses a copy
of it.  In addition, you must do these things in the Modified Version:


@enumerate A

@item 
Use in the Title Page (and on the covers, if any) a title distinct
from that of the Document, and from those of previous versions
(which should, if there were any, be listed in the History section
of the Document).  You may use the same title as a previous version
if the original publisher of that version gives permission.

@item 
List on the Title Page, as authors, one or more persons or entities
responsible for authorship of the modifications in the Modified
Version, together with at least five of the principal authors of the
Document (all of its principal authors, if it has fewer than five),
unless they release you from this requirement.

@item 
State on the Title page the name of the publisher of the
Modified Version, as the publisher.

@item 
Preserve all the copyright notices of the Document.

@item 
Add an appropriate copyright notice for your modifications
adjacent to the other copyright notices.

@item 
Include, immediately after the copyright notices, a license notice
giving the public permission to use the Modified Version under the
terms of this License, in the form shown in the Addendum below.

@item 
Preserve in that license notice the full lists of Invariant Sections
and required Cover Texts given in the Document’s license notice.

@item 
Include an unaltered copy of this License.

@item 
Preserve the section Entitled “History”, Preserve its Title, and add
to it an item stating at least the title, year, new authors, and
publisher of the Modified Version as given on the Title Page.  If
there is no section Entitled “History” in the Document, create one
stating the title, year, authors, and publisher of the Document as
given on its Title Page, then add an item describing the Modified
Version as stated in the previous sentence.

@item 
Preserve the network location, if any, given in the Document for
public access to a Transparent copy of the Document, and likewise
the network locations given in the Document for previous versions
it was based on.  These may be placed in the “History” section.
You may omit a network location for a work that was published at
least four years before the Document itself, or if the original
publisher of the version it refers to gives permission.

@item 
For any section Entitled “Acknowledgements” or “Dedications”,
Preserve the Title of the section, and preserve in the section all
the substance and tone of each of the contributor acknowledgements
and/or dedications given therein.

@item 
Preserve all the Invariant Sections of the Document,
unaltered in their text and in their titles.  Section numbers
or the equivalent are not considered part of the section titles.

@item 
Delete any section Entitled “Endorsements”.  Such a section
may not be included in the Modified Version.

@item 
Do not retitle any existing section to be Entitled “Endorsements”
or to conflict in title with any Invariant Section.

@item 
Preserve any Warranty Disclaimers.
@end enumerate

If the Modified Version includes new front-matter sections or
appendices that qualify as Secondary Sections and contain no material
copied from the Document, you may at your option designate some or all
of these sections as invariant.  To do this, add their titles to the
list of Invariant Sections in the Modified Version’s license notice.
These titles must be distinct from any other section titles.

You may add a section Entitled “Endorsements”, provided it contains
nothing but endorsements of your Modified Version by various
parties—for example, statements of peer review or that the text has
been approved by an organization as the authoritative definition of a
standard.

You may add a passage of up to five words as a Front-Cover Text, and a
passage of up to 25 words as a Back-Cover Text, to the end of the list
of Cover Texts in the Modified Version.  Only one passage of
Front-Cover Text and one of Back-Cover Text may be added by (or
through arrangements made by) any one entity.  If the Document already
includes a cover text for the same cover, previously added by you or
by arrangement made by the same entity you are acting on behalf of,
you may not add another; but you may replace the old one, on explicit
permission from the previous publisher that added the old one.

The author(s) and publisher(s) of the Document do not by this License
give permission to use their names for publicity for or to assert or
imply endorsement of any Modified Version.

@strong{5. COMBINING DOCUMENTS}

You may combine the Document with other documents released under this
License, under the terms defined in section 4 above for modified
versions, provided that you include in the combination all of the
Invariant Sections of all of the original documents, unmodified, and
list them all as Invariant Sections of your combined work in its
license notice, and that you preserve all their Warranty Disclaimers.

The combined work need only contain one copy of this License, and
multiple identical Invariant Sections may be replaced with a single
copy.  If there are multiple Invariant Sections with the same name but
different contents, make the title of each such section unique by
adding at the end of it, in parentheses, the name of the original
author or publisher of that section if known, or else a unique number.
Make the same adjustment to the section titles in the list of
Invariant Sections in the license notice of the combined work.

In the combination, you must combine any sections Entitled “History”
in the various original documents, forming one section Entitled
“History”; likewise combine any sections Entitled “Acknowledgements”,
and any sections Entitled “Dedications”.  You must delete all sections
Entitled “Endorsements”.

@strong{6. COLLECTIONS OF DOCUMENTS}

You may make a collection consisting of the Document and other documents
released under this License, and replace the individual copies of this
License in the various documents with a single copy that is included in
the collection, provided that you follow the rules of this License for
verbatim copying of each of the documents in all other respects.

You may extract a single document from such a collection, and distribute
it individually under this License, provided you insert a copy of this
License into the extracted document, and follow this License in all
other respects regarding verbatim copying of that document.

@strong{7. AGGREGATION WITH INDEPENDENT WORKS}

A compilation of the Document or its derivatives with other separate
and independent documents or works, in or on a volume of a storage or
distribution medium, is called an “aggregate” if the copyright
resulting from the compilation is not used to limit the legal rights
of the compilation’s users beyond what the individual works permit.
When the Document is included in an aggregate, this License does not
apply to the other works in the aggregate which are not themselves
derivative works of the Document.

If the Cover Text requirement of section 3 is applicable to these
copies of the Document, then if the Document is less than one half of
the entire aggregate, the Document’s Cover Texts may be placed on
covers that bracket the Document within the aggregate, or the
electronic equivalent of covers if the Document is in electronic form.
Otherwise they must appear on printed covers that bracket the whole
aggregate.

@strong{8. TRANSLATION}

Translation is considered a kind of modification, so you may
distribute translations of the Document under the terms of section 4.
Replacing Invariant Sections with translations requires special
permission from their copyright holders, but you may include
translations of some or all Invariant Sections in addition to the
original versions of these Invariant Sections.  You may include a
translation of this License, and all the license notices in the
Document, and any Warranty Disclaimers, provided that you also include
the original English version of this License and the original versions
of those notices and disclaimers.  In case of a disagreement between
the translation and the original version of this License or a notice
or disclaimer, the original version will prevail.

If a section in the Document is Entitled “Acknowledgements”,
“Dedications”, or “History”, the requirement (section 4) to Preserve
its Title (section 1) will typically require changing the actual
title.

@strong{9. TERMINATION}

You may not copy, modify, sublicense, or distribute the Document
except as expressly provided under this License.  Any attempt
otherwise to copy, modify, sublicense, or distribute it is void, and
will automatically terminate your rights under this License.

However, if you cease all violation of this License, then your license
from a particular copyright holder is reinstated (a) provisionally,
unless and until the copyright holder explicitly and finally
terminates your license, and (b) permanently, if the copyright holder
fails to notify you of the violation by some reasonable means prior to
60 days after the cessation.

Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, receipt of a copy of some or all of the same material does
not give you any rights to use it.

@strong{10. FUTURE REVISIONS OF THIS LICENSE}

The Free Software Foundation may publish new, revised versions
of the GNU Free Documentation License from time to time.  Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.  See
@indicateurl{http://www.gnu.org/copyleft/}.

Each version of the License is given a distinguishing version number.
If the Document specifies that a particular numbered version of this
License “or any later version” applies to it, you have the option of
following the terms and conditions either of that specified version or
of any later version that has been published (not as a draft) by the
Free Software Foundation.  If the Document does not specify a version
number of this License, you may choose any version ever published (not
as a draft) by the Free Software Foundation.  If the Document
specifies that a proxy can decide which future versions of this
License can be used, that proxy’s public statement of acceptance of a
version permanently authorizes you to choose that version for the
Document.

@strong{11. RELICENSING}

“Massive Multiauthor Collaboration Site” (or “MMC Site”) means any
World Wide Web server that publishes copyrightable works and also
provides prominent facilities for anybody to edit those works.  A
public wiki that anybody can edit is an example of such a server.  A
“Massive Multiauthor Collaboration” (or “MMC”) contained in the
site means any set of copyrightable works thus published on the MMC
site.

“CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0
license published by Creative Commons Corporation, a not-for-profit
corporation with a principal place of business in San Francisco,
California, as well as future copyleft versions of that license
published by that same organization.

“Incorporate” means to publish or republish a Document, in whole or
in part, as part of another Document.

An MMC is “eligible for relicensing” if it is licensed under this
License, and if all works that were first published under this License
somewhere other than this MMC, and subsequently incorporated in whole
or in part into the MMC, (1) had no cover texts or invariant sections,
and (2) were thus incorporated prior to November 1, 2008.

The operator of an MMC Site may republish an MMC contained in the site
under CC-BY-SA on the same site at any time before August 1, 2009,
provided the MMC is eligible for relicensing.

@strong{ADDENDUM: How to use this License for your documents}

To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and
license notices just after the title page:

@quotation

Copyright © YEAR  YOUR NAME.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
A copy of the license is included in the section entitled “GNU
Free Documentation License”.
@end quotation

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
replace the “with … Texts.” line with this:

@quotation

with the Invariant Sections being LIST THEIR TITLES, with the
Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
@end quotation

If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.

If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of
free software license, such as the GNU General Public License,
to permit their use in free software.

@node Index,,Program Structure and Compilation Issues,Top
@unnumbered Index


@printindex ge


@c %**end of body
@bye
