@X @~
~L3 COUK1247
80
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H             FTN121
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL~
~
~
                                                            ISSUE 10~
~V9 -1
~P
~V9 1
~YFTN121
~S1~M~OFORTRAN 77 COMPILER IMPLEMENTATION DESCRIPTION
~S1~M~OSection 12
~S1~OSection 12. Property List Management
~S1~O1.1 General Description
~BThe procedural interface of this section contains
the procedures to search for the property
entry of a 'named' entity in the compilers property lists, and to
add new entries, in addition this section manages the constant lists.
Once a particular property entry is located, then
other sections may access and alter the entry. In this section,
therefore, a description of the property
and constant lists of the compiler is given.
~BNamed entities in Fortran may be classified into four groups,
and the organisation of the property lists reflect this
classification.~
~T# 6
~
a)
~IGLOBAL NAMES, names of global entities which once allocated are
retained until the end of the compilation, e.g., function, subroutine,
block data names.~
b)
~ILOCAL NAMES, name of local entities which once allocated are
retained until the end of the associated program unit then released.~
c)
~ISTATEMENT LABELS, at the end of a program unit, all its label
names are released.~
d)
~ICOMMON NAMES, names of common blocks after allocation
are retained until the end of the compilation.~
~BThe interface procedures ADD.G.NAME, ADD.C.NAME, ADD.L.NAME and ADD.S.NAME
provide property entry access for the global, common, local and statement
label property lists.
~BThe interface procedure LOOK.UP.INTRINSIC searches the list of
available intrinsic function as specified in the Fortran standard.
~BThe interface procedure ADD.CONSTANT allocates a constant property
entry in the LINE.SPACE if it is only required for one statement,
otherwise allocation is in the LOCAL.SPACE.
~BThis section describes the data structures of the various property
lists, these structures are used widely by other sections of the compiler.
~S1~O2. Interfaces
~S1~O2.1 Section Interfaces Used
~
   Section 1 : (Configuration Section)~
   Section 6 : (Specification Part Declarations)~
   Section 13: (Fault Monitoring)~
~S1~O2.2 Section Interface~
~
Exported Types:~
   NAME.T~
   GLOBAL.PROP~
   L.ALT.TYPE~
   LOCAL.PROP~
   COMMON.PROP~
   LABEL.PROP~
   CONST.PROP~
~
Exported Literals:~
   LINE.SPACE~
   LOCAL.SPACE~
   GLOBAL.SPACE~
~
Exported Scalars:~
   COM.LIST.G~
   LOCAL.LIST.ST.G~
   LOCAL.LIST.HD.G~
~
Exported Procedures:~
   ADD.G.NAME~
   ADD.C.NAME~
   ADD.L.NAME~
   ADD.S.NAME~
   ADD.CONST~
   LOOK.UP.INTRINSIC~
   RESET.SPACE~
   MAKE.LO8~
   MAKE.CONST.PROP~
   MAKE.IN~
   MAKE.LOCAL.PROP~
   MAKE.EQUIV.PROP~
   MAKE.PROPS~
   INIT.12~
~S1~O3. Implementation~
~S1~O3.1 Outline of operation~
~S1~O3.1.1 ADD.G.NAME(NAME^)PROP^
~BThis procedure searches for the global name specified by the
parameter. If it is not found, a property list entry is allocated
and initialised. The result points to the property list entry.
A warning message is given if the global name is also
used as a common name within the same program unit.
~S1~O3.1.2 ADD.C.NAME(NAME,LOOK.UP)PROP^
~BThis procedure searches for the common name specified
by the parameter. If it is not found a property list
entry is allocated and initialised unless name is only
being checked. The result points to the property list entry.~
~3
~
   LOOK.UP  0 means allocate entry if not found~
            1 means look up name only.~
   PROP^    Pointer to property list entry.~
~0
~BA null pointer indicates name not found.
~BA warning message is issued if the common name is a constant
name, an intrinsic name or an external function or subroutine used
within the current program unit.
~S1~O3.1.3 ADD.L.NAME(NAME^)PROP^
~BThis procedure searches for the local name specified by the
parameter. If it is not found, a property list entry is allocated
and initialised. The result points to the local property list entry.
~S1~O3.1.4 ADD.S.NAME(LABEL)LABEL.PROP^
~BThis procedure searches for the statement label as specified
by the parameter. If it is not found, a property list entry is allocated
and initialised. The result points to the property list entry.
~S1~O3.1.5 ADD.CONST(SPACE)CONST.PROP^
~BAllocates a property entry for a non character constant in the
SPACE specified and yields a pointer to the entry.~
~3
~
SPACE  0 means allocate in LINE.SPACE~
       1 means allocate in LOCAL.SPACE~
~0
~S1~O3.1.6 LOOK.UP.INSTRINSIC(PROP^)FOUND
~BThis procedure looks up the local name to see if it is a known
intrinsic procedure.
~BA warning message is issued if the intrinsic name is
also the name of a common block used with the program unit.~
~3
~
FOUND  -1 Indicates name not found.~
          Otherwise Intrinsic number.~
~0
~S1~O3.1.7 RESET.SPACE(SPACE)~
~BThis resets the position of a specified space.~
~3
~
SPACE = 0 line space is reset~
      = 1 local space is reset~
      = 2 global space is reset.~
~0
~S1~O3.1.8 MAKE.LO8(SIZE,SPACE)BYTE.VECTOR^~
~BThis makes a vector of bytes of the specified size in
the required space.~
~S1~O3.1.9 MAKE.CONST.PROP(SPACE)CONST.PROP^~
~BThis makes a scalar CONST.PROP entry in the required space.~
~S1~O3.1.10 MAKE.IN(SIZE,SPACE)IN.VECTOR^~
~BThis makes a vector of integers of the specified size in
the required space.~
~S1~O3.1.11 MAKE.LOCAL.PROP(SPACE)LOCAL.PROP^~
~BThis makes a scalar LOCAL.PROP entry in the required space.~
~S1~O3.1.13 MAKE.EQUIV.PROP(SPACE)EQUIV.PROP^~
~BThis makes a scalar EQUIV.PROP entry in the required space.~
~S~O3.1.14 MAKE.PROPS(SIZE,SPACE)PROPS.VECTOR^
~BThis makes a vector of type PROPS of the specified
size in the required space.
~S1~O3.2 Data Structures~
~S1~O3.2.1 GLOBAL NAMES: Property list structure
~BThe overall structure is indicated below.
~3
~Q 33
~
~
                    GLOBAL HASH TABLE~
                 ~O                       ~O~
                |                       |~
                |                       |~
                |                       |~
                |                       |~
                |~O                       ~O|~
                |                       |~
                |   GLOBAL PROPERTY ^ --|---~
                |~O                       ~O|   |~
                |                       |   |~
                |                       |   |~
                |                       |   |~
                |                       |   |~
                |                       |   |~
                |                       |   |~
                |~O                       ~O|   |~
                                            |~
                                            |~
                                            |~
                  GLOBAL PROPERTY ENTRY     |~
                 ~O                       ~O    |~
                |                       |   |~
                |   GLOBAL PROPERTY ^   |<--~
                |~O                       ~O|~
                |                       |~
                |         NAME          |~
                |~O                       ~O|~
                |                       |~
                |   GLOBAL PROPERTIES   |~
                |~O                       ~O|~
~S1                ~OGLOBAL HASH TABLE - G.HASH~O
~0
~S1~MGLOBAL HASH TABLE - G.HASH
~BThe size of the hash table is installation dependent
(in MU5 it contains 64 entries) each entry contains a pointer
to a list of global entities having the same hash value for their names,
such a list is termed a hash list.
~S1~MGLOBAL PROPERTY ENTRY
~BThese entries are normally allocated as required in the global
work space of the compiler. The type name for the
entry is GLOBAL.PROP.
~BEach entry consists of the following:~
~3
~
G.NEXT.P:   Pointer to next property entry on the hash list.~
~
G.NAME:     Vector of eight bytes for name. Name is~
            left justified and space filled.~
~
G.KIND:     Kind of global entity~
      Value 0 - undefined~
            1 - main program~
            2 - block data~
            3 - Fortran external function~
            4 - Fortran subroutine~
            5 - Non-Fortran external function~
            6 - Non-Fortran subroutine~
            7 - External function or subroutine~
                Bit 3 = 1 Program unit defined.~
~
G.ARG.SPEC.P: A pointer to the argument specification~
              entry. See 3.2.7 for details of entry.~
              A null pointer means argument specification~
              not yet defined.~
~
G.TL.NAME:    MUTL name of its MUTL procedure specification.~
~0
~S1~O3.2.2 COMMON NAMES : Property list structure
~BThis has the same overall structure as the global names
property structure. The hash table is called C.HASH.~
~
~
~MCOMMON PROPERTY ENTRY
~BThese entries are allocated within the global work space
of the compiler. The type name for the entry is COMMON.PROP.~
~BEach entry consists of the following:~
~T# 17
~
C.NEXT.P:~IPointer to next property entry on the hash list.~
~
C.NAME:~IVector of eight bytes for name. Name is left
justified and space filled.~
~
C.KIND:~IKind of Common.~
~3
~
~IBit 0 = 0/1 - unsaved/saved common in this program~
~I              unit.~
~T# 21
~I1 = 1   - numeric common~
~I2 = 1   - character common~
~I3 = 1   - explicitly mapped but no data area~
~I          allocated yet.~
~I4 = 1   - used in program unit~
~I5 = 1   - saved in previous program unit~
~I6 = 1   - initialised in previous block data.~
~I7 = 1   - initialised in this block data~
~
~
~0
C.HEAD:~
~
C.TAIL:~IAll local entities declared explicitly in COMMON
statements are linked in a forwards chain, there
is one chain for each different common area. This
field points to the local property entry for the
last item explicitly declared to be in this common.
A nil pointer indicates no items declared in this
common for the current program unit.~
~
C.SIZE:~ISpecified in bytes.~
~
C.PREV.P:~IAll common property list entries are linked in a
backwards linked chain. This points to the previous
entry on the list. The chain head is COM.LIST.G.
The last entry on the list is BLANK.COMMON,
which therefore has a nil pointer in this field.~
~
C.AREA.NO:~INumber of MUTL data area assigned to
this common.~
~IWhen =0 no area assigned yet.~
~IWhen C.KIND bit 3=1 this contains a MUTL segment number.~
~S1~O3.2.3 LOCAL NAMES:   Property list structure
~BThe overall structure of this is indicated below.~
~3
~Q 38
~
               ~O                          ~O~
              |                          |~
              |                          |~
              |                          |~
              |~O                          ~O|~
            --|~O     LOCAL PROPERTY ^     ~O|~
           |  |                          |~
           |  |                          |~
           |  |                          |~
           |  |~O                          ~O|~
           |~
           |~
           |   ~O   LOCAL PROPERTY ENTRY   ~O~
            ->|~O     LOCAL PROPERTY ^     ~O|~
              |~O     LOCAL PROPERTIES     ~O|~
              |~O   EQUIVALENCE ENTRY ^    ~O|------------~
              |~O   ARRAY SPECIFICATION ^  ~O|-----       |~
                                               |      |~
                                               |      |~
                                               |      |~
               ~OARRAY SPECIFICATION ENTRY ~O      |      |~
              |~O    NO. OF DIMENSIONS     ~O|<----       |~
              |~O    KIND OF BOUNDS        ~O|            |~
              |~O  LOWER BOUND 1st. DIM.   ~O|            |~
              |~O  UPPER BOUND 1st. DIM.   ~O|            |~
              |~O  SIZE OF 1st. DIM.       ~O|            |~
              |                          |            |~
              |           ETC.           |            |~
              |           ETC.           |            |~
              |~O                          ~O|            |~
                                                      |~
                                                      |~
               ~O     EQUIVALENCE ENTRY    ~O             |~
              |      See Section 6       |<-----------~
              |~O      for details         ~O|~
~0
~S1~MLOCAL HASH TABLE - L.HASH
~BTable consists of an installation dependent number
of entries, (typically 64), each entry contains a pointer to a
list of local entities having the same hash value for their names.
~S1~MLOCAL NAME ENTRY
~BThese entries are allocated as required in the local work space.
The type name for the entry is LOCAL.PROP.
~BMany different lists are created and manipulated depending
on the entities attributes. All these lists are maintained by
just two links in the property entry.
~BThe lists are as follows:
~B1) On initial creation of a local property entry it is added
to the two directional list, LOCAL.LIST. The variable
LOCAL.LIST.HD.G points to the last added entry in the list,
and LOCAL.LIST.ST.G points to first entry on the list.
~B2) If a local entity appears in a COMMON statement a one
directional COMMON.ITEM.LIST is created for each common block.
The head and tail of this list is in the common name entry.
When an entity is put in this list it is removed from the LOCAL.LIST.
~B3) During the declarative processing of a common block, the
list COMMON.EQUIVALENCE.LIST is created for all items explicitly
declared in that common block which also appear in an
EQUIVALENCE statement.
~B4) Also during the processing of a common block all items
explicitly in common, i.e. they appear in a COMMON statement
are put on the EXPLICIT.COMMON.LIST.
~B5) During the declarative processing of associated equivalences
a one directional list, EQUIVALENCE.LIST, of all as yet undeclared
items equivalenced together is constructed.
~B6) A one directional list DUMMY.ARG.LIST is created for all
the dummy arguments local name entries of a function or
subroutine statement. L.LINK.1 of the associated local property entry
of the subroutine, function or entry points to the first
entry in the list. However a particular dummy argument
may need to be in more than one list because it appears in the
argument list of more than one entry point to a procedure. In this
situation an additional local property entry is allocated for the
sole purpose of creating these dummy argument lists. These additional
entries contain a link to the genuine property entry.
~B7) If a function or subroutine has multiple entry points, then
the local property entries for the ENTRY entities are forwardly
linked in an ENTRY.LIST. L.LINK2 of the local property entry of
the associated function or subroutine points to the first entry
on the list.
~B8) In the processing of a statement function, local property
entries are created for its dummy arguments. These entries are
forwardly linked in the STAT.FN.ARG.LIST, L.LINK2 of the statement
function local property entry points to the first entry in the list.
~S1Each entry consists of the following:~
~T# 17
~
L.NEXT.P~IPointer to next name entry in hash table list.~
~
L.NAME~IVector of 8 bytes for name which is left justified
and space filled.~
~
L.LINK1~IForward link in LOCAL.LIST~
~ILink in COMMON.ITEM.LIST~
~ILink in DUMMY.ARG.LIST~
~ILink in COMMON.EQUIVALENCE.LIST~
~
L.LINK2~IBackward link in LOCAL.LIST~
~ILink in EQUIVALENCE.LIST~
~ILink in ENTRY.LIST~
~ILink in EXPLICIT.COMMON.LIST~
~ILink in STAT.FN.ARG.LIST~
~ILink between a property entry of a duplicate dummy argument
and the genuine dummy argument property entry.~
~
L.TYPE~IType of entity.~
~IBits 0-2 interpreted as~
~I0 - real, 1 - DP, 2 - complex, 3 - integer, 4 - logical,
5 - character~
~IIn addition for functions and subroutines~
~3
~I7 - subroutine.~
~
L.SPECS~IField is bit encoded.~
~IBit   0 = 1  Entity in a SAVE~
~IBit   1 = 1  Entity in an EXTERNAL~
~IBit   2 = 1  Entity in an INTRINSIC~
~IBit   3 = 1  Entity in EQUIVALENCE~
~IBit   4 = 1  Entity in COMMON~
~IBit   5 = 1  Item declared on stack.~
~IBit   6 = 1  Entity in PARAMETER~
~IBit   7 = 1  Entity in TYPE or a TYPE function~
~IBit   8 = 1  Entity an assumed size array~
~IBit   9 = 1  Entity a dummy argument~
~IBit  10 = 1  Entity in current use as a DO variable~
~IBit  11 = 1  Entity is enclosing Program Unit~
~T# 30
~Ie.g. PROGRAM,BLOCK DATA,ENTRY~
~T# 17
~IBit  12 = 1  Entity in blank common~
~IBit  13 = 1  Item declared. This bit is used in a~
~T# 30
~Idifferent way for dummy arguments, if
set it means that the MUTL type of the
argument has been set.~
~T# 17
~IBit  14 = 1  Items position defined. For character~
~T# 30
~Ifunction references when set it means
that a variable has been allocated
for the result.~
~T# 17
~IBits 13,14   Are normally used if the item is~
~I             in COMMON or equivalenced.~
~IBit  15 = 1  Array is an adjustable array.~
~
L.KIND~IKind of local entity.~
~I0  undefined~
~I1  scalar variable~
~I2  array~
~I3  constant~
~I4  statement function~
~I5  subroutine~
~I6  function~
~I7  intrinsic function~
~I8  subroutine or function~
~0
~
L.LEN~IIf entity of character type, this specifies character
length of entity. A negative value indicates the items
length was specified as assumed. This field gives the
negated MUTL name of the parameter containing the
assumed length.~
~
L.TL.NAME~IMUTL name for item. 0 means name not declared
For the entries associated with FUNCTION and
ENTRY statements, this field contains the MUTL
name of the associated result variable. Note
that a non-character FUNCTION/ENTRY is a funtional
MUTL procedure, and a variable is declared within
the procedure to hold the result. A character
FUNCTION/ENTRY is a non-functional MUTL procedure,
two parameters are passed for the result, the first
specifies where to put the FUNCTION result, and the
other the result variables length.~
~
L.ARR.SPEC.P~IPointer to array specification entry for
array entities. See next page for details.~
~BThe rest of the name entry contains optional information
which is required for the following kinds of items.~
~3
~
   1) Items that appear in EQUIVALENCE statements.~
   2) Constants.~
   3) Items which are procedures, i.e. functions, intrinsics,~
      statement funtions and dummy argument functions.~
   4) Dummy array arguments with adjustable dimensions.~
   5) Entry of a FUNCTION, SUBROUTINE or ENTRY statement.~
~0
~
Therefore the field L.ALT has four alternative definitions.
~S1For constants:~
~
L.CONST.P~IPointer to a constant entry.~
~S1For equivalenced items:~
~
L.EQT.P~IPointer to equivalence entry. See section 6 for
details.~
~
L.DISP~IDisplacement measured in bytes
of item from area base.~
~S1For procedure items:~
~
L.ARG.SPEC.P~IPointer to argument specification vector. For
enclosing program unit entities
this field contains argument
specification vector pointer.
See 2.2.10 in this section for details.~
~
L.INTR.NO~IIdentification no. for intrinsic.~
~
L.SPEC.TL.NAME~IMUTL name for procedure specification
associated with a dummy argument or a multiple entry point. Zero
means not yet declared. Alternatively if
entity is a specific intrinsic whose
name has been passed parametrically
then field contains MUTL name of a
specially created parametric version
of the intrinsic. For multiple entry points a MUTL
name is allocated for the MUTL entry point of the
enclosing program unit.~
~
L.CH.RES.NAME~IUsed only for character functions. It gives the
MUTL name of a variable used to hold the result
of this function whenever it is called.~
~
For dummy array arguments with adjustable dimensions:~
~
L.AS.DUMP~IBounded pointer to a copy of the complete
analysis record for the statement containing
the adjustable array declarator for this dummy
argument.~
~
L.PROPS.T.DUMP~IBounded pointer to a copy of the PROPS.T
table (see Section 4) for the statement containing the
adjustable array declarator for this dummy argument.
~S~MARRAY SPECIFICATION ENTRY - ARRAY
~BThese entries are allocated as required in the local data
space. An entry is a vector of between 5 and 23 items, the items
are used as follows.~
~T$10
~
Item 0 :$Number of dimensions~
~
Item 1 :$Bits 0,1 are always zero. Bit 2=1 lower bound of~
$first dimension given by a variable~
$Bit 2=0 lower bound given by a constant~
$Bit 3 as bit 2 but for upper bound~
$Bit 4,5 as Bit 0,1 but for second dimension~
$Bit 6 to 15 specify types of bounds for third to seventh~
$dimension~
~
Item 2 :$Lower bound of first dimension. Constant or name of~
$variable~
~
Item 3 :$Upper bound of first dimension.~
~
Item 4 : SIZE of dimension. This contains either a constant~
$or the MUTL name of a variable containing the adjustable~
$dimension.~
~
Item 5 to 22 specification of other dimensions~
~
For an assumed sized array an item for the upper bound
of the last dimension
will be allocated but its content is undefined.~
~
For adjustable arrays, on initial processing of the adjustable
bounds a copy of the analysis record is made, and the index of
the expression tree in the analysis record for an adjustable
bound is saved in the bound properties. On processing the
adjustable array declarator for a dummy argument a variable
is then created to maintain the adjustable bound information.
~S1~O3.2.4 STATEMENT LABELS: Property list structures~
~BThe overall structure of this is as indicated below~
~3
~Q 39
~
                 ~O     LABEL HASH TABLE     ~O~
                |                          |~
                |                          |~
                |                          |~
                |                          |~
                |                          |~
                |~O                          ~O|~
                |                          |~
                |     LABEL PROPERTY ^  ---|----~
                |~O                          ~O|    |~
                |                          |    |~
                |                          |    |~
                |                          |    |~
                |                          |    |~
                |                          |    |~
                |                          |    |~
                |                          |    |~
                |~O                          ~O|    |~
                                                |~
                                                |~
                                                |~
                 ~O   LABEL PROPERTY ENTRY   ~O     |~
                |                          |    |~
                |     LABEL PROPERTY ^     |<---~
                |~O                          ~O|~
                |                          |~
                |       LABEL VALUE        |~
                |~O                          ~O|~
                |                          |~
                |     LABEL PROPERTIES     |~
                |~O                          ~O|~
~0
~
~S1~OSTATEMENT LABELS  Property list structure~
~S1~MLABEL HASH TABLE - L.HASH~
~BTable consists of installation dependent number of entries (64 on MU5),
each entry contains a pointer
to a list of label property entries having the same 'hash value'
for the label value, such a list is called a hash list.~
~
~MLABEL PROPERTY ENTRY
~BThese entries are allocated as required in the local work
space. The type name for the entry is LABEL.PROP.
~BEach entry consists of the following:~
~T# 12
~
S.NEXT.P#Pointer to next label property entry on hash list, a~
#nil pointer means this is the last entry on the list.~
~
S.NAME#Label name held as a binary integer value.~
~
S.KIND#Defines the type and use of the label.~
~
~3
#Bit 0 = 1  Specification statement label.~
#Bit 1 = 1  Executable statement label.~
#Bit 2 = 1  Format statement label.~
#Bit 3 = 1  ELSE or ELSE IF statement label.~
#Bit 4 = 1  Label defined.~
#Bit 5 = 1  Is not stored in the table but is~
#           used in do loop processing.~
#Bit 6 = 1  Label referenced.~
#Bit 7 = 1  Label assigned.~
~0
~
S.LEVEL#Defines the nesting level of the label or~
#reference.~
~
S.BLOCK#Defines the block number of the label or~
#reference.~
~
S.TL.NAME#MUTL name for an executable label, or of the~
#FORMAT vectors.~
~
S.ID#Internal identifier for label.  Identifiers are~
#allocated fromone onwards.~
~S1~O3.2.6 CONSTANTS : Property list structure
~BFor non-character constants the entry contains just the value.
The type of the entry is CONST.PROP and has five alternative
definitions to cater for the various types of constant. The field
names for accessing the entry are as follows.~
~3
~
          REAL.CONST      : Real constant~
          D.P.CONST       : Double precision constant~
          R.COMP.CONST    : Real part of complex constant~
          I.COMP.CONST    : Imaginary part of complex constant~
          INT.CONST       : Integer constant~
          LOG.CONST       : Logical constant~
          CH.CONST        : Bounded pointer to byte vector specifying~
                            the value of a character constant.
~0
~BFor character constants the entry consists of a byte vector
containing the constant and a terminator byte of value zero.
~S1~O3.2.7 ARGUMENT SPECIFICATION : Property list structure
~BAllocation of an argument specification entry depends on the
type of procedure.~
~3
~
      External functions and subroutine entries are allocated~
      in MODULE.SPACE~
      Statement function entries allocated and in LOCAL.SPACE~
      Intrinsic function entries are embedded within the~
      compilers code as read only data.~
~0
~BThe entry consists of a vector of bytes. There is a result byte, then
one byte for each argument and finally a terminator byte.
~BThe result byte is encoded as follows: 0 - Real, 1 - Double
Precision, 2 - Complex, 3 - Integer, 4 - Logical, 5 - Character
and 7 - Subroutine result.
~BThe argument bytes are encoded as follows:~
~BIf bit 7=0 then bits 0, 6 are encoded as follows:~
~3
~
Bits  0 - 2  Type  0-Real, 1-Double precision, 2-Complex,~
             3-Integer, 4-logical, 5-character, 6-label.~
Bit   3 = 1  Argument passed by reference~
Bit   3 = 0  Argument passed by value~
Bit   4 = 1  Argument is a function~
Bit 5,6 = 3  Argument is passed by reference, whether the dummy~
             argument is an array or a variable reference is not~
             yet known. If an actual argument is an array then~
             this field is set to 2, and if an actual argument~
             is a variable it is set to 1.~
Bit 5,6 = 1  Dummy argument is a scalar variable, actual argument~
             may be a variable, array element or any valid~
             expression.~
Bit 5,6 = 2  Dummy argument is an array.~
Bit 4,5,6=0  Means argument is a label.~
~
If bit 7=1 then bits 0, 6 are encoded as follows:~
~
Bits  0 - 6   0 Argument type undefined~
              1 Illegal argument type.~
~0
~BThe terminator byte usually has the value of %FF, except for intrinsic
functions which have a variable number of arguments, these have a
terminator byte of %FE to indicate that if the end of the argument
specification is reached, the last argument of the entry can be
used for all additional actual arguments.
~S1~O3.2.8 Interface Data Variables~
~T# 19
~
COM.LIST.G~IPointer to last entry of COMMON.LIST.
This list is linked backwards.~
~
LOCAL.LIST.ST.G~IPointer to first entry on LOCAL.LIST.
This is a two directional list.~
~
LOCAL.LIST.HD.G~IPointer to last entry on LOCAL.LIST.~
~Y
~V9 -1
~P
~D15
~HFLOWCHARTS
~
~
~H                FTN121
~V9 -1
~F
@TITLE FTN12(1,11)
@COL 1S-2R-3R
@COL 4R-5R-6R-7R-9F
@FLOW 1-2-3-4-5-6-7-9
@BOX 1.0
PROPERTY LISTS MANAGEMENT
@BOX 2.0
[IMPORTS FTN12/1]
MODULE HEADING
@BOX 3.0
TYPE DECLARATIONS
@BOX 4.0
LITERAL DECLARATIONS
@BOX 5.0
SCALAR DECLARATIONS
@BOX 6.0
VECTOR DECLARATIONS
@BOX 7.0
PROCEDURES IN MODULE
   12.1: ADD.G.NAME
   12.2: ADD.C.NAME
   12.3: ADD.L.NAME
   12.4: ADD.S.NAME
   12.5: ADD.CONST
   12.6: LOOK.UP.INTRINSIC
   12.10: HASH.INDEX
   12.11: INIT.12
   12.12: RESET.SPACE
   12.13: MAKE.LO8
   12.14: MAKE.CONST.PROP
   12.15: MAKE.IN
   12.16: MAKE.LOCAL.PROP
   12.18: MAKE.EQUIV.PROP
   12.19: MAKE.PROPS
@BOX 9.0
END
@BOX 2.1
#FTN12/1
;MODULE (ADD.G.NAME, ADD.C.NAME, ADD.L.NAME, ADD.S.NAME, ADD.CONST,
        LOOK.UP.INTRINSIC, RESET.SPACE, MAKE.LO8, MAKE.CONST.PROP, MAKE.PROPS,
        MAKE.IN, MAKE.LOCAL.PROP, G.HASH, C.HASH, L.HASH, S.HASH,
        LINE.SPACE, LOCAL.SPACE, GLOBAL.SPACE, IMPLICIT.G, IMPLICIT.LEN.G,
        COM.LIST.G, LOCAL.LIST.HD.G, LOCAL.LIST.ST.G, MAKE.EQUIV.PROP, INIT12,
        NAME.T, GLOBAL.PROP, L.ALT.TYPE, LOCAL.PROP, COMMON.PROP, LABEL.PROP,
        MAKE.FORMAT.LIST, MAKE.ENTRY.LIST, MAKE.DATA.LIST, CONST.PROP,
        FORMAT.LIST, ENTRY.LIST, DATA.LIST);
 :: ??? JM 29-DEC-82
@BOX 3.1
;TYPE NAME.T IS $AD[$LO8] NAME :: ??? JM 27-DEC-82
;TYPE GLOBAL.PROP IS
       ADDR GLOBAL.PROP G.NEXT.P
       NAME.T G.NAME
       $LO8 G.KIND
       $LO16 G.TL.NAME
       ADDR [$LO8] G.ARG.SPEC.P
;TYPE L.ALT.TYPE IS
       ADDR CONST.PROP L.CONST.P OR
       ADDR EQUIV.PROP L.EQT.P
       $IN L.DISP OR
       ADDR [$LO8] L.ARG.SPEC.P
       $LO8 L.INTR.NO
       $LO16 L.CH.RES.NAME
       $LO16 L.SPEC.TL.NAME OR
       ADDR [$IN] L.AS.DUMP
       ADDR [PROPS] L.PROPS.T.DUMP
;TYPE LOCAL.PROP IS
       ADDR LOCAL.PROP L.NEXT.P
       NAME.T L.NAME
       ADDR LOCAL.PROP L.LINK1, L.LINK2
       $LO8 LTYPE
       $LO16 LSPECS, LKIND
       $IN L.LEN
       $LO16 L.TL.NAME
       ADDR [$IN] L.ARR.SPEC.P
       L.ALT.TYPE L.ALT
;TYPE COMMON.PROP IS
       ADDR COMMON.PROP C.NEXT.P
       NAME.T C.NAME
       $LO8 C.KIND
       ADDR LOCAL.PROP C.HEAD, C.TAIL
       ADDR C.SIZE
       ADDR COMMON.PROP C.PREV.P
       $LO8 C.AREA.NO
;TYPE LABEL.PROP IS
       ADDR LABEL.PROP S.NEXT.P
       $LO24 S.NAME
       $LO8 S.KIND
       $LO16 S.LEVEL, S.BLOCK, S.TL.NAME, S.ID
;TYPE CONST.PROP IS
       $IN32 INT.CONST OR
       $RE32 REAL.CONST OR
       $RE64 DP.CONST OR
       $RE32 R.COMP.CONST, I.COMP.CONST OR
       $LO16 LOG.CONST OR
       ADDR[$LO8] CH.CONST OR
       $LO64 T.CONST OR
       $LO8[8] H.CONST
       $LO8 H.PR :: @@@ BCT 30-DEC-82
;TYPE DATA.LIST IS
      ADDR [$IN] ARP
      ADDR [PROPS] PROPS.P
      ADDR DATA.LIST NEXT :: ??? JM 27-DEC-82
;TYPE FORMAT.LIST IS
      ADDR LABEL.PROP F.LABEL
      $IN F.BND
      ADDR [$IN] F.TABLE
      ADDR [$LO8] F.STRINGS
      ADDR FORMAT.LIST NEXT :: ??? JM 27-DEC-82
;TYPE ENTRY.LIST IS
      INTEGER STAT.AP.ENTRY
      ADDR [$IN] ARP
      ADDR [PROPS] E.PROPS
      ADDR ENTRY.LIST NEXT :: ??? JM 27-DEC-82
@BOX 4.1
; LITERAL LINE.SPACE = 0, LOCAL.SPACE = 1, GLOBAL.SPACE = 2
@BOX 5.1
; *GLOBAL 2
;ADDR COMMON.PROP COM.LIST.G
;ADDR LOCAL.PROP LOCAL.LIST.HD.G, LOCAL.LIST.ST.G
;ADDR LINE.SPACE.START.G,LOCAL.SPACE.START.G,GLOBAL.SPACE.START.G
@BOX 6.1
;$LO16 N.S.ID
;ADDR GLOBAL.PROP[GLOBAL.HASH.Z.L]G.HASH
;ADDR COMMON.PROP[COMMON.HASH.Z.L]C.HASH
;ADDR LOCAL.PROP[LOCAL.HASH.Z.L]L.HASH
;ADDR LABEL.PROP[LABEL.HASH.Z.L]S.HASH
; $LO8 [26] IMPLICIT.G
; $IN [26] IMPLICIT.LEN.G
; ADDR LINE.SPACE.AREA :: ??? JM 27-DEC-82
; ADDR LOCAL.SPACE.AREA :: ??? JM 27-DEC-82
; ADDR GLOBAL.SPACE.AREA :: ??? JM 27-DEC-82
; *GLOBAL 0
@BOX 7.1
;P.SPEC ADD.G.NAME(ADDR NAME.T)/ADDR GLOBAL.PROP
;P.SPEC ADD.C.NAME(ADDR NAME.T,$IN)/ADDR COMMON.PROP
;P.SPEC ADD.L.NAME(ADDR NAME.T)/ADDR LOCAL.PROP
;P.SPEC ADD.S.NAME($LO24)/ADDR LABEL.PROP
;P.SPEC ADD.CONST($LO8)/ADDR CONST.PROP
;P.SPEC LOOK.UP.INTRINSIC(ADDR LOCAL.PROP)/$IN
;PSPEC HASH.INDEX(ADDR NAME.T)/$IN
;P.SPEC RESET.SPACE($IN)
;P.SPEC MAKE.LO8($IN,$IN)/ADDR [$LO8]
;P.SPEC MAKE.CONST.PROP($IN)/ADDR CONST.PROP
;P.SPEC MAKE.IN($IN,$IN)/ADDR [$IN]
;P.SPEC MAKE.LOCAL.PROP($IN)/ ADDR LOCAL.PROP
;P.SPEC MAKE.EQUIV.PROP($IN)/ADDR EQUIV.PROP
;P.SPEC MAKE.PROPS($IN,$IN)/ADDR [PROPS]
;P.SPEC MAKE.FORMAT.LIST($IN)/ADDR FORMAT.LIST :: ??? JM 29-DEC-82
;P.SPEC MAKE.ENTRY.LIST($IN)/ADDR ENTRY.LIST :: ??? JM 29-DEC-82
;P.SPEC MAKE.DATA.LIST($IN)/ADDR DATA.LIST :: ??? JM 29-DEC-82
;P.SPEC COPY.NAME.T (ADDR NAME.T, INTEGER) / ADDR NAME.T :: ??? JM 28-DEC-82
;P.SPEC EQUAL.NAME.P (ADDR NAME.T, ADDR NAME.T) / INTEGER :: ??? JM 28-DEC-82
;P.SPEC INIT.12()
#FTN12.1
#FTN12.2
#FTN12.3
#FTN12.4
#FTN12.5
#FTN12.6
#FTN12.10
#FTN12.11
#FTN12.12
#FTN12.13
#FTN12.14
#FTN12.15
#FTN12.16
#FTN12.18
#FTN12.19
#FTN12.20
#FTN12.21
#FTN12.22
#FTN12.23
#FTN12.24
@BOX 9.1
; *END
@END
@TITLE FTN12/1(1,11)
@COL 1S-2R-3R-4R-5R-6R-7F
@FLOW 1-2-3-4-5-6-7
@BOX 1.0
NAMELIST IMPORTS
@BOX 2.0
IMPORTED TYPES
@BOX 3.0
IMPORTED LITERALS
@BOX 4.0
IMPORTED SCALARS
@BOX 5.0
IMPORTED VECTORS
@BOX 6.0
IMPORTED PROCEDURES
@BOX 7.0
END
@BOX 2.1
;TYPE CONST.PROP;
;TYPE LOCAL.PROP;
;TYPE EQUIV.PROP IS
     ADDR EQUIV.PROP GR.LINK,IGR.LINK
     ADDR LOCAL.PROP EQ.LP.A
     $IN EQ.NO.DIM,EQ.L.SS,EQ.U.SS
     ADDR [$IN] EQ.SUBS
     $LO8 EQ.FLAG
;TYPE LABEL.PROP ;
; TYPE GLOBAL.PROP ;
; TYPE COMMON.PROP ;
;TYPE PROPS IS
     $IN32 INT OR
     ADDR ADDRESS OR
     ADDR LOCAL.PROP LOC OR
     ADDR GLOBAL.PROP GLOB OR
     ADDR COMMON.PROP COM OR
     ADDR CONST.PROP CONST
@BOX 3.1
;IMPORT LITERAL GLOBAL.HASH.Z.L,GLOBAL.HASH.M.L,
        COMMON.HASH.Z.L,COMMON.HASH.M.L,
        LOCAL.HASH.Z.L,LOCAL.HASH.M.L,
        LABEL.HASH.Z.L,LABEL.HASH.M.L,
        ST.CH.Z.L,ACC.Z.Z.L
;IMPORT LITERAL ADDR LINE.SPACE.Z.L, LOCAL.SPACE.Z.L, GLOBAL.SPACE.Z.L
;IMPORT LITERAL $LO8 SPACE.L
@BOX 4.1
;ADDR GLOBAL.PROP F.G.PROP.G
;ADDR COMMON.PROP F.C.PROP.G,BLANK.COM.G
;ADDR [$LO8] F.B.G :: ??? JM 29-DEC-82
@BOX 5.1
; $LO8 [ACC.Z.Z.L] ACC.Z.G
; $LO8 [ST.CH.Z.L] ST.CH
@BOX 6.1
;P.SPEC FAULT($IN,$IN)
@END
@TITLE FTN12.1(1,11)
@COL 10R
@COL 1S-2R-3T-4T-5R-7R-8R-11T-12T-9F
@FLOW 1-2-3NO-4NO-5-3Y-7-8-11N-12N-9
@ROW 10-12
@FLOW 4Y-11Y-9
@FLOW 12Y-10-9
@BOX 1.0
ADD.G.NAME([NAME])PROP^
@BOX 2.0
CALC HASH INDEX
:12.10
GET START OF LIST
@BOX 3.0
LIST EMPTY
@BOX 4.0
GET PROP ENTRY
NAME FOUND?
@BOX 5.0
ADVANCE TO NEXT
PROP ENTRY
@BOX 7.0
ALLOCATE PROP
ENTRY
LINK TO FRONT OF LIST
@BOX 8.0
ADD NAME AND
INITIALISE PROPS
@BOX 9.0
END
@BOX 10.0
WARNING
@BOX 11.0
IS THERE A COMMON OF THIS
NAME?
@BOX 12.0
IS IT USED IN CURRENT PROGRAM UNIT?
@BOX 1.1
;PROC ADD.G.NAME(N)
;ADDR GLOBAL.PROP GP,HDP
;$IN H,H1
;LITERAL/ADDR [$LO8] NIL.AS =
;LITERAL /ADDR GLOBAL.PROP NIL.G=
;ADDR COMMON.PROP CP
;LITERAL /ADDR COMMON.PROP NIL.C=
;SPACE GLOBAL.SPACE.SPACE[1] :: ??? JM 27-DEC-82
;ADDR NAME.T NAME.HOLDER :: ??? JM 28-DEC-82
@BOX 2.1
;G.HASH[HASH.INDEX(N)=>H1 & GLOBAL.HASH.M.L => H] => HDP => GP
@BOX 3.1
;IF G.P = NIL.G
@BOX 4.1
:: ;IF N^=G.NAME OF GP^ :: ??? JM 28-DEC-82
:: ??? JM 28-DEC-82
   ;IF EQUAL.NAME.P(N,^G.NAME OF GP^) /=0
@BOX 5.1
;G.NEXT.P OF GP^ => GP
@BOX 7.1
;GLOBAL.SPACE.AREA => GLOBAL.SPACE.SPACE :: ??? JM 27-DEC-82
;MAKE(GLOBAL.PROP,0,GLOBAL.SPACE.SPACE)=>GP :: ??? JM 27-DEC-82
;GLOBAL.SPACE.SPACE => GLOBAL.SPACE.AREA :: ??? JM 27-DEC-82
;IF GLOBAL.SPACE.AREA - GLOBAL.SPACE.Z.L > GLOBAL.SPACE.START.G THEN
    FAULT(173,6) FI
;HDP => G.NEXT.P OF GP^
;GP => G.HASH[H]
@BOX 8.1
;COPY.NAME.T (N,GLOBAL.SPACE) => NAME.HOLDER :: ??? JM 28-DEC-82
;NAME.HOLDER^  => G.NAME OF GP^ :: ??? JM 27-DEC-82
:: ;N^ => G.NAME OF GP^ :: ??? JM 27-DEC-82
;NIL.AS=>G.ARG.SPEC.P OF GP^
;0 => G.TL.NAME OF GP^ => G.KIND OF GP^
@BOX 9.1
;GP => ADD.G.NAME
;END
@BOX 10.1
;GP => F.G.PROP.G
;FAULT(%118,4)
@BOX 11.1
;C.HASH[H.1 & COMMON.HASH.M.L] => CP
;WHILE CP /= NIL.C AND N^ /= C.NAME OF CP^ DO
   ;C.NEXT.P OF CP^ => CP
;OD
;IF CP = NIL.C
@BOX 12.1
;IF C.KIND OF CP^ & %10 /= 0
@END
@TITLE FTN12.2(1,11)
@COL 14R
@COL 1S-2R-3T-4T-5R-6T-7R-8R-10T-11T-9F
@ROW 14-11
@FLOW 1-2-3N-4N-5-3Y-6N-7-8-10N-11N-9
@FLOW 4Y-9
@FLOW 6Y-9
@FLOW 10Y-9
@FLOW 11Y-14-9
@BOX 1.0
ADD.C.NAME([NAME],LOOK.UP)PROP^
@BOX 2.0
CALC HASH INDEX : 12.10
GET FIRST ITEM ON LIST
@BOX 3.0
END OF LIST
@BOX 4.0
NAME CORRECT?
@BOX 5.0
GET NEXT ENTRY ON LIST
@BOX 6.0
LOOK UP ONLY
@BOX 7.0
ALLOCATE COMMON PROP ENTRY
AND LINK
@BOX 8.0
INITIALISE ENTRY
@BOX 9.0
END
@BOX 10.0
NAME NOT A LOCAL NAME?
@BOX 11.0
NAME A FN, SUBR, INTR OR
CONSTANT NAME
@BOX 14.0
WARNING
@BOX 1.1
;PROC ADD.C.NAME(N,L.UP)
;ADDR COMMON.PROP CM.P,HD.P
;$IN H, H1,L
;LITERAL /ADDR COMMON.PROP CM.NIL=
;ADDR LOCAL.PROP LP
;LITERAL /ADDR LOCAL.PROP L.NIL=
;SPACE GLOBAL.SPACE.SPACE[1] :: ??? JM 27-DEC-82
;ADDR NAME.T NAME.HOLDER :: ??? JM 28-DEC-82
@BOX 2.1
;C.HASH[HASH.INDEX(N)=>H1 & COMMON.HASH.M.L=>H]
=> HD.P => CM.P
@BOX 3.1
;IF CM.P = CM.NIL
@BOX 4.1
:: ;IF N^= C.NAME OF CM.P^ :: ??? JM 28-DEC-82
:: ??? JM 28-DEC-82
   ;IF EQUAL.NAME.P(N, ^C.NAME OF CM.P^) /= 0
@BOX 5.1
;C.NEXT.P OF CM.P^ => CM.P
@BOX 6.1
;IF L.UP /= 0
@BOX 7.1
;GLOBAL.SPACE.AREA => GLOBAL.SPACE.SPACE :: ??? JM 27-DEC-82
;MAKE(COMMON.PROP,0,GLOBAL.SPACE.SPACE) => CM.P :: ??? JM 27-DEC-82
;GLOBAL.SPACE.SPACE => GLOBAL.SPACE.AREA :: ??? JM 27-DEC-82
;IF GLOBAL.SPACE.AREA - GLOBAL.SPACE.Z.L > GLOBAL.SPACE.START.G THEN
    FAULT(173,6) FI
;HD.P => C.NEXT.P OF CM.P^
;CM.P => C.HASH[H]
@BOX 8.1
;COPY.NAME.T (N,GLOBAL.SPACE) => NAME.HOLDER :: ??? JM 28-DEC-82
;NAME.HOLDER^ => C.NAME OF CM.P^ :: ??? JM 27-DEC-82
:: ;N^=> C.NAME OF CM.P^ :: ??? JM 27-DEC-82
;0 => C.KIND OF CM.P^ => C.AREA.NO OF CM.P^
;L.NIL=>C.TAIL OF CM.P^
@BOX 9.1
;CM.P => ADD.C.NAME
;END
@BOX 10.1
;L.HASH[H.1 & LOCAL.HASH.M.L] => LP
;WHILE LP /= LNIL AND N^ /= L.NAME OF LP^ DO
   ;L.NEXT.P OF LP^ => LP
;OD
;IF LP = L.NIL
@BOX 11.1
;IF L.KIND OF LP^ => L = 3 OR L>4
@BOX 14.1
;CM.P => F.C.PROP.G
;FAULT(%118,2)
@END
@TITLE FTN12.3(1,11)
@COL 1S-2R-3T-4T-5R-7R-8R-9F
@FLOW 1-2-3NO-4NO-5
@FLOW 4YES-9
@FLOW 5-3Y-7-8-9
@BOX 1.0
ADD.L.NAME([NAME])PROP^
@BOX 2.0
CALC HASH INDEX
:12.10
GET FIRST ITEM IN LIST
@BOX 3.0
END OF LIST
@BOX 4.0
GET PROP ENTRY
NAME FOUND?
@BOX 5.0
ADVANCE TO NEXT
PROP ENTRY
@BOX 7.0
ALLOCATE PROP
ENTRY
LINK TO FRONT OF HASH LIST
LINK TO LOCAL LIST
@BOX 8.0
ADD NAME AND
INITIALISE PROPS
@BOX 9.0
END
@BOX 1.1
;PROC ADD.L.NAME(N)
;$IN H,T,CH
;ADDR LOCAL.PROP LP,HDP
;LITERAL/ ADDR LOCAL.PROP NIL.LP=
;ADDR NAME.T NAME.HOLDER :: ??? JM 28-DEC-82
@BOX 2.1
;L.HASH[HASH.INDEX(N) & LOCAL.HASH.M.L => H] => HDP => LP
@BOX 3.1
;IF LP = NIL.LP
@BOX 4.1
:: ;IF N^=L.NAME OF LP^ :: ??? JM 28-DEC-82
:: ??? JM 28-DEC-82
   ;IF EQUAL.NAME.P (N,^L.NAME OF LP^) /= 0
@BOX 5.1
;L.NEXT.P OF LP^ => LP
@BOX 7.1
;MAKE.LOCAL.PROP(1) => LP :: ??? JM 27-DEC-82
;HDP => L.NEXT.P OF LP^
;LP => L.HASH[H]
@BOX 8.1
;COPY.NAME.T (N,LOCAL.SPACE) => NAME.HOLDER :: ??? JM 28-DEC-82
;NAME.HOLDER^ => L.NAME OF LP^ :: ??? JM 27-DEC-82
:: ;N^=>L.NAME OF LP^ :: ??? JM 27-DEC-82
;IMPLICIT.G[ST.CH[NAME^[0] OF N^]=>CH]=>T => L.TYPE OF LP^ :: ??? JM 27-DEC-82
;0=>L.SPECS OF LP^ => L.KIND OF LP^
 => L.TL.NAME OF LP^
;IF IMPLICIT.LEN.G[CH] => L.LEN OF LP^ < 0 THEN
     ACC.Z.G[T] => L.LEN OF LP^ FI
;NIL.LP => L.LINK.1 OF LP^
;LOCAL.LIST.HD.G => L.LINK2 OF LP^
;IF LOCAL.LIST.HD.G /= NIL.LP THEN
      ;LP => L.LINK1 OF LOCAL.LIST.HD.G^
;ELSE
  ;LP=>LOCAL.LIST.ST.G
;FI
;LP => LOCAL.LIST.HD.G
@BOX 9.1
;LP => ADD.L.NAME
;END
@END
@TITLE FTN12.4(1,11)
@COL 1S-2R-3T-4T-5R-7R-8R-9F
@FLOW 1-2-3NO-4NO-5
@FLOW 4YES-9
@FLOW 5-3Y-7-8-9
@BOX 1.0
ADD.S.NAME(LABEL)PROP^
@BOX 2.0
CALC HASH
FOR LABEL
GET FIRST ITEM ON LIST
@BOX 3.0
END OF LIST
@BOX 4.0
GET PROP ENTRY
NAMES MATCH?
@BOX 5.0
ADVANCE NEXT
ENTRY
@BOX 7.0
ALLOCATE PROP
ENTRY
LINK TO FRONT OF LIST
@BOX 8.0
ADD.LABEL AND
INITIALISE
@BOX 9.0
END
@BOX 1.1
;PROC ADD.S.NAME(LAB)
;ADDR LABEL.PROP LB.P,HDP
;$IN H
;LITERAL/ADDR LABEL.PROP NILLB=
;SPACE LOCAL.SPACE.SPACE[1] :: ??? JM 27-DEC-82

@BOX 2.1
;S.HASH[LAB & LABEL.HASH.M.L=>H] => HDP => LB.P
@BOX 3.1
;IF LB.P = NIL.LB
@BOX 4.1
;IF LAB = S.NAME OF LB.P^
@BOX 5.1
;S.NEXT.P OF LB.P^ => LB.P
@BOX 7.1
;LOCAL.SPACE.AREA => LOCAL.SPACE.SPACE :: ??? JM 27-DEC-82
;MAKE(LABEL.PROP,0,LOCAL.SPACE.SPACE) => LB.P :: ??? JM 27-DEC-82
;LOCAL.SPACE.SPACE => LOCAL.SPACE.AREA :: ??? JM 27-DEC-82
;IF LOCAL.SPACE.AREA - LOCAL.SPACE.Z.L > LOCAL.SPACE.START.G THEN
    FAULT(173,6) FI
;HD.P => S.NEXT.P OF LB.P^
;LB.P => S.HASH[H]
;1 +> N.S.ID => S.ID OF LB.P^
;0=> S.KIND OF LB.P^
@BOX 8.1
;LAB => S.NAME OF LB.P^
@BOX 9.1
;LB.P => ADD.S.NAME
;END
@END
@TITLE FTN12.5(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
ADD.CONST(SPACE)CONST.ADDR
@BOX 2.0
MAKE ENTRY IN APPR SPACE
@BOX 3.0
END
@BOX 1.1
;PROC ADD.CONST(SP)
@BOX 2.1
;MAKE.CONST.PROP (SP) => ADD.CONST :: ??? JM 27-DEC-82
@BOX 3.1
;END
@END
@TITLE FTN12.6(1,11)
@COL 1S-2R-4T-5T-6T-7R-3F
@FLOW 1-2-4N-5N-6N-7-3
@FLOW 4Y-3
@FLOW 5Y-3
@FLOW 6Y-3
@BOX 1.0
LOOK.UP.INTRINSIC(NAME)INTR.NO
@BOX 2.0
SEARCH LIST OF INTRINSICS
@BOX 3.0
END
@BOX 4.0
INTRINSIC NOT FOUND
@BOX 5.0
NO COMMON OF SAME NAME : 12.2
@BOX 6.0
NOT USED IN THIS PROGRAM
UNIT
@BOX 7.0
WARNING
@BOX 1.1
;PROC LOOK.UP.INTRINSIC(P)
;$IN I, Z
;-1 => LOOK.UP.INTRINSIC
;LITERAL Z3=16, Z4=37, Z5=28, Z6=4
;$LO32 P1
;$LO16 P2
;LITERAL N3=0, N4=16, N5=53, N6=81
;ADDR [$LO8] N
;NAME OF LNAME  OF P^=>N :: ??? JM 27-DEC-82
;ADDR COMMON.PROP CP
;LITERAL /ADDR COMMON.PROP NIL.C=
#FTN12.6.1
@BOX 2.1
;SIZE(N) => Z
;IF Z < 3 THEN EXIT FI
;N^[0]<<- 8 ! N^[1]<<-8 ! N^[2]  => P1
;-1 => I
;IF Z = 3 THEN
   ;WHILE 1+>I < Z3 DO
      ;IF INTR3[I] = P1 THEN
         ;I => LOOK.UP.INTRINSIC
      ;FI
   ;OD
;ELSE
   ;P1 <<- 8 ! N^[3] => P1
   ;IF Z = 4 THEN
   ;WHILE 1+>I < Z4 DO
      ;IF INTR4[I] = P1 THEN
         ;I+N4=> LOOK.UP.INTRINSIC
      ;FI
   ;OD
;ELSE IF Z = 5 THEN
   ;WHILE 1+>I <Z5 DO
      ;IF INTR54[I]=P1 AND INTR51[I]=N^[4] THEN
         ;I+N5 => LOOK.UP.INTRINSIC
      ;FI
   ;OD
;ELSE IF Z =6 THEN
   ;N^[4] <<- 8 ! N^[5] => P2
   ;WHILE 1+>I <Z6 DO
      ;IF INTR64[I]=P1 AND INTR.62[I] = P2 THEN
         ;I+N6 => LOOK.UP.INTRINSIC
      ;FI
   ;OD
;FI FI FI FI
@BOX 4.1
;IF LOOK.UP.INTRINSIC < 0
@BOX 5.1
;IF ADD.C.NAME(^L.NAME OF P^,1) => CP = NIL.C
@BOX 6.1
;IF C.KIND OF CP^ & %10 = 0
@BOX 7.1
;CP => F.C.PROP.G
;FAULT(%118,2)
@BOX 3.1
;END
@END
@TITLE FTN12.6.1(1,6)
@COL 3R
@COL 4R
@COL 54R
@COL 51R
@COL 6R
@FLOW 3
@FLOW 4
@FLOW 54
@FLOW 51
@F6
@BOX 3.0
THREE LETTER
INTRINSIC NAMES
FOUR LETTER INTRINSIC NAMES
@BOX 54.0
4 OF FIVE LETTER
INTRINSIC NAMES
@BOX 51.0
LAST LETTER
OF FIVE LETTER
INTRINSIC NAMES
@BOX 6.0
SIX LETTER INTRINSIC NAMES
@BOX 3.1
;DATAVEC INTR.3($LO32)
"INT"
"ABS"
"MOD"
"DIM"
"MAX"
"MIN"
"LEN"
"EXP"
"LOG"
"SIN"
"COS"
"TAN"
"LGE"
"LGT"
"LLE"
"LLT"
END
@BOX 4.1
;DATAVEC INTR.4($LO32)
"IFIX"
"REAL"
"SNGL"
"DBLE"
"CHAR"
"AINT"
"DINT"
"NINT"
"IABS"
"DABS"
"CABS"
"AMOD"
"DMOD"
"SIGN"
"IDIM"
"DDIM"
"MAX0"
"MAX1"
"MIN0"
"MIN1"
"SQRT"
"DEXP"
"CEXP"
"ALOG"
"DLOG"
"CLOG"
"DSIN"
"CSIN"
"DCOS"
"CCOS"
"DTAN"
"ASIN"
"ACOS"
"ATAN"
"SINH"
"COSH"
"TANH"
END
@BOX 54.1
;DATAVEC INTR.5.4($LO32)
"FLOA"
"ICHA"
"ANIN"
"DNIN"
"ISIG"
"DSIG"
"DPRO"
"AMAX"
"DMAX"
"AMAX"
"AMIN"
"DMIN"
"INDE"
"AIMA"
"CONJ"
"DSQR"
"CSQR"
"LOG1"
"DASI"
"DACO"
"DATA"
"ATAN"
"DSIN"
"DCOS"
"DTAN"
"IDIN"
"AMIN"
"CMPL"
END
@BOX 51.1
;DATAVEC INTR5.1($LO8)
'T
'R
'T
'T
'N
'N
'D
'1
'1
'0
'1
'1
'X
'G
'G
'T
'T
'0
'N
'S
'N
'2
'H
'H
'H
'T
'0
'X
END
@BOX 6.1
;DATAVEC INTR6.4($LO32)
"IDNI"
"ALOG"
"DLOG"
"DATA"
END
;DATAVEC INTR6.2($LO16)
"NT"
"10"
"10"
"N2"
END
@END
@TITLE FTN12.10(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
HASH INDEX([NAME])HASH
@BOX 2.0
CALCULATE HASH FOR NAME
using a prime remainder hash on
the first 8 characters of the name.
If there are fewer, the name is
left-justified and padded with nulls.
@BOX 3.0
END
@BOX 1.1
;PROC HASH.INDEX(N)
;$IN I, J, K, LENGTH ;$LO8 CHAR
;LITERAL/INTEGER PRIME=16007,
 BITS.PER.CHAR=7, HASHED.CHARS=8
;DATAVEC REMAINDER (INTEGER16)
     1     2     4     8    16    32    64
   128   256   512  1024  2048  4096  8192
   377   754  1508  3016  6032 12064  8121
   235   470   940  1880  3760  7520 15040
 14073 12139  8271   535  1070  2140  4280
  8560  1113  2226  4452  8904  1801  3602
  7204 14408 12809  9611  3215  6430 12860
  9713  3419  6838 13676 11345  6683 13366
END :: ??? JM 11-JAN-83
;SELECT N^ :: ??? JM 27-DEC-82
@BOX 2.1
     :: ??? JM 11-JAN-83 (begin)
;IF SIZE (NAME) => LENGTH > HASHED.CHARS
    THEN HASHED.CHARS => LENGTH
 FI
;0 => HASH.INDEX
;HASHED.CHARS * BITS.PER.CHAR => K
;FOR I < LENGTH DO
      BITS.PER.CHAR -> K
     ;NAME^[I] => CHAR
     ;FOR J < BITS.PER.CHAR DO
          IF CHAR & 1 /= 0
             THEN IF REMAINDER[J+K] +> HASH.INDEX > PRIME
                     THEN PRIME -> HASH.INDEX
                  FI
          FI
          ;CHAR ->> 1 => CHAR
      OD
 OD  :: ??? JM 11-JAN-83 (end)
:: ;NAME^[0] OF N^ & %1F +(NAME^[1] OF N^*2 & %3E)
:: +(NAME^[2] OF N^*4 & %7C) + (NAME^[3] OF N^*4 & %F8)
:: => HASH.INDEX
@BOX 3.1
;END
@END

@TITLE FTN12.11(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
INITIALISE SECTION 12
@BOX 2.0
INITIALISE SPACES
INITIALISE HASH TABLES
INITIALISE BLANK COMMON
@BOX 3.0
END
@BOX 1.1
; PROC INIT.12
; *GLOBAL 3
; SPACE LINE.SPACE[LINE.SPACE.Z.L]
; SPACE LOCAL.SPACE[LOCAL.SPACE.Z.L]
; SPACE GLOBAL.SPACE[GLOBAL.SPACE.Z.L]
; *GLOBAL 0
; $IN I,J,K,L
; LITERAL/ADDR LOCAL.PROP NIL.LP =
; LITERAL/ADDR GLOBAL.PROP NIL.GP =
; LITERAL/ADDR LABEL.PROP NIL.SP =
; LITERAL/ADDR COMMON.PROP NIL.CP =
; ADDR COMMON.PROP CP
@BOX 2.1
; 0 => N.S.ID
; -1 => I => J => K => L
; WHILE 1+>I < LOCAL.HASH.Z.L DO NIL.LP => L.HASH[I] OD
; WHILE 1+>J < GLOBAL.HASH.Z.L DO NIL.GP => G.HASH[J] OD
; WHILE 1+>K < LABEL.HASH.Z.L DO NIL.SP => S.HASH[K] OD
; WHILE 1+>L < COMMON.HASH.Z.L DO NIL.CP => C.HASH[L] OD
; MAKE(COMMON.PROP,0,GLOBAL.SPACE) => CP => BLANK.COM.G :: ??? JM 27-DEC-82
; NIL.CP => C.NEXT.P OF CP^ => C.PREV.P OF CP^
; NIL.LP => C.HEAD OF CP^ => C.TAIL OF CP^
;MAKE($LO8,2,GLOBAL.SPACE)=>NAME OF C.NAME OF CP^ :: @@@ BCT 29-DEC-82
;FOR I < 2 DO
   '/ => NAME^[I] OF C.NAME OF CP^ OD :: ??? JM 27-DEC-82
; 0 => C.KIND OF CP^ => C.SIZE OF CP^
   => C.AREA.NO OF CP^
; LINE.SPACE => LINE.SPACE.AREA => LINE.SPACE.START.G
; LOCAL.SPACE => LOCAL.SPACE.AREA => LOCAL.SPACE.START.G
; GLOBAL.SPACE => GLOBAL.SPACE.AREA => GLOBAL.SPACE.START.G
@BOX 3.1
END
@END
@TITLE FTN12.12(1,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
RESET SPACE
@BOX 2.0
SELECT SPACE TO BE RESET
@BOX 3.0
END
@BOX 1.1
;PROC RESET.SPACE(SP)
@BOX 2.1
; ALTERNATIVE SP FROM
   LINE.SPACE.START.G => LINE.SPACE.AREA
  ;LOCAL.SPACE.START.G => LOCAL.SPACE.AREA
  ;GLOBAL.SPACE.START.G => GLOBAL.SPACE.AREA
END
@BOX 3.1
END
@END
@TITLE FTN12.13(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
MAKE LO8
@BOX 2.0
SELECT SPACE FOR MAKE
@BOX 3.0
END
@BOX 1.1
; PROC MAKE.LO8(SIZ,SP)
; SPACE DUMMY.SPACE[1]
; ADDR ADDR AREA.POINTER
; ADDR START,SZ
@BOX 2.1
; ALTERNATIVE SP FROM
    BEGIN
    ^LINE.SPACE.AREA => AREA.POINTER
   ;LINE.SPACE.Z.L => SZ
   ;LINE.SPACE.START.G => START
    END
   ;BEGIN
    ^LOCAL.SPACE.AREA => AREA.POINTER
   ;LOCAL.SPACE.Z.L => SZ
   ;LOCAL.SPACE.START.G => START
    END
   ;BEGIN
    ^GLOBAL.SPACE.AREA => AREA.POINTER
   ;GLOBAL.SPACE.Z.L => SZ
   ;GLOBAL.SPACE.START.G => START
    END
END
  ;AREA.POINTER^ => DUMMY.SPACE
  ;MAKE($LO8,SIZ,DUMMY.SPACE) => MAKE.LO8
  ;DUMMY.SPACE => AREA.POINTER^
  ;IF AREA.POINTER^ - SZ > START THEN FAULT(171+SP,6) FI
@BOX 3.1
END
@END
@TITLE FTN12.14(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
MAKE CONST.PROP
@BOX 2.0
SELECT SPACE FOR MAKE
@BOX 3.0
END
@BOX 1.1
; PROC MAKE.CONST.PROP(SP)
; SPACE DUMMY.SPACE[1]
; ADDR ADDR AREA.POINTER
; ADDR START,SZ
@BOX 2.1
; ALTERNATIVE SP FROM
    BEGIN
    ^LINE.SPACE.AREA => AREA.POINTER
   ;LINE.SPACE.Z.L => SZ
   ;LINE.SPACE.START.G => START
    END
   ;BEGIN
    ^LOCAL.SPACE.AREA => AREA.POINTER
   ;LOCAL.SPACE.Z.L => SZ
   ;LOCAL.SPACE.START.G => START
    END
   ;BEGIN
    ^GLOBAL.SPACE.AREA => AREA.POINTER
   ;GLOBAL.SPACE.Z.L => SZ
   ;GLOBAL.SPACE.START.G => START
    END
END
  ;AREA.POINTER^ => DUMMY.SPACE
  ;MAKE(CONST.PROP,0,DUMMY.SPACE) => MAKE.CONST.PROP
  ;DUMMY.SPACE => AREA.POINTER^
  ;IF AREA.POINTER^ - SZ > START THEN FAULT(171+SP,6) FI
@BOX 3.1
END
@END
@TITLE FTN12.15(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
MAKE IN
@BOX 2.0
SELECT SPACE FOR MAKE
@BOX 3.0
END
@BOX 1.1
; PROC MAKE.IN(SIZ,SP)
; SPACE DUMMY.SPACE[1]
; ADDR ADDR AREA.POINTER
; ADDR START,SZ
@BOX 2.1
; ALTERNATIVE SP FROM
    BEGIN
    ^LINE.SPACE.AREA => AREA.POINTER
   ;LINE.SPACE.Z.L => SZ
   ;LINE.SPACE.START.G => START
    END
   ;BEGIN
    ^LOCAL.SPACE.AREA => AREA.POINTER
   ;LOCAL.SPACE.Z.L => SZ
   ;LOCAL.SPACE.START.G => START
    END
   ;BEGIN
    ^GLOBAL.SPACE.AREA => AREA.POINTER
   ;GLOBAL.SPACE.Z.L => SZ
   ;GLOBAL.SPACE.START.G => START
    END
END
  ;AREA.POINTER^ => DUMMY.SPACE
  ;MAKE($IN,SIZ,DUMMY.SPACE) => MAKE.IN
  ;DUMMY.SPACE => AREA.POINTER^
  ;IF AREA.POINTER^ - SZ > START THEN FAULT(171+SP,6) FI
@BOX 3.1
END
@END
@TITLE FTN12.16(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
MAKE LOCAL.PROP
@BOX 2.0
SELECT SPACE FOR MAKE
@BOX 3.0
END
@BOX 1.1
; PROC MAKE.LOCAL.PROP(SP)
; SPACE DUMMY.SPACE[1]
; ADDR ADDR AREA.POINTER
; ADDR START,SZ
@BOX 2.1
; ALTERNATIVE SP FROM
    BEGIN
    ^LINE.SPACE.AREA => AREA.POINTER
   ;LINE.SPACE.Z.L => SZ
   ;LINE.SPACE.START.G => START
    END
   ;BEGIN
    ^LOCAL.SPACE.AREA => AREA.POINTER
   ;LOCAL.SPACE.Z.L => SZ
   ;LOCAL.SPACE.START.G => START
    END
   ;BEGIN
    ^GLOBAL.SPACE.AREA => AREA.POINTER
   ;GLOBAL.SPACE.Z.L => SZ
   ;GLOBAL.SPACE.START.G => START
    END
END
  ;AREA.POINTER^ => DUMMY.SPACE
  ;MAKE(LOCAL.PROP,0,DUMMY.SPACE) => MAKE.LOCAL.PROP
  ;DUMMY.SPACE => AREA.POINTER^
  ;IF AREA.POINTER^ - SZ > START THEN FAULT(171+SP,6) FI
@BOX 3.1
END
@END
@TITLE FTN12.18(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
MAKE EQUIV.PROP
@BOX 2.0
SELECT SPACE FOR MAKE
@BOX 3.0
END
@BOX 1.1
; PROC MAKE.EQUIV.PROP(SP)
; SPACE DUMMY.SPACE[1]
; ADDR ADDR AREA.POINTER
; ADDR START,SZ
@BOX 2.1
; ALTERNATIVE SP FROM
    BEGIN
    ^LINE.SPACE.AREA => AREA.POINTER
   ;LINE.SPACE.Z.L => SZ
   ;LINE.SPACE.START.G => START
    END
   ;BEGIN
    ^LOCAL.SPACE.AREA => AREA.POINTER
   ;LOCAL.SPACE.Z.L => SZ
   ;LOCAL.SPACE.START.G => START
    END
   ;BEGIN
    ^GLOBAL.SPACE.AREA => AREA.POINTER
   ;GLOBAL.SPACE.Z.L => SZ
   ;GLOBAL.SPACE.START.G => START
    END
END
  ;AREA.POINTER^ => DUMMY.SPACE
  ;MAKE(EQUIV.PROP,0,DUMMY.SPACE) => MAKE.EQUIV.PROP
  ;DUMMY.SPACE => AREA.POINTER^
  ;IF AREA.POINTER^ - SZ > START THEN FAULT(171+SP,6) FI
@BOX 3.1
END
@END
@TITLE FTN12.19(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
MAKE PROPS
@BOX 2.0
SELECT SPACE FOR MAKE
@BOX 3.0
END
@BOX 1.1
; PROC MAKE.PROPS(Z, SP)
; SPACE DUMMY.SPACE[1]
; ADDR ADDR AREA.POINTER
; ADDR START,SZ
@BOX 2.1
; ALTERNATIVE SP FROM
    BEGIN
    ^LINE.SPACE.AREA => AREA.POINTER
   ;LINE.SPACE.Z.L => SZ
   ;LINE.SPACE.START.G => START
    END
   ;BEGIN
    ^LOCAL.SPACE.AREA => AREA.POINTER
   ;LOCAL.SPACE.Z.L => SZ
   ;LOCAL.SPACE.START.G => START
    END
   ;BEGIN
    ^GLOBAL.SPACE.AREA => AREA.POINTER
   ;GLOBAL.SPACE.Z.L => SZ
   ;GLOBAL.SPACE.START.G => START
    END
END
  ;AREA.POINTER^ => DUMMY.SPACE
  ;MAKE(PROPS,Z,DUMMY.SPACE) => MAKE.PROPS
  ;DUMMY.SPACE => AREA.POINTER^
  ;IF AREA.POINTER^ - SZ > START THEN FAULT(171+SP,6) FI
@BOX 3.1
;END
@END
@TITLE FTN12.20(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
MAKE FORMAT.LIST
@BOX 2.0
SELECT SPACE FOR MAKE
@BOX 3.0
END
@BOX 1.1
; PROC MAKE.FORMAT.LIST(SP)
; SPACE DUMMY.SPACE[1]
; ADDR ADDR AREA.POINTER
; ADDR START,SZ
@BOX 2.1
; ALTERNATIVE SP FROM
    BEGIN
    ^LINE.SPACE.AREA => AREA.POINTER
   ;LINE.SPACE.Z.L => SZ
   ;LINE.SPACE.START.G => START
    END
   ;BEGIN
    ^LOCAL.SPACE.AREA => AREA.POINTER
   ;LOCAL.SPACE.Z.L => SZ
   ;LOCAL.SPACE.START.G => START
    END
   ;BEGIN
    ^GLOBAL.SPACE.AREA => AREA.POINTER
   ;GLOBAL.SPACE.Z.L => SZ
   ;GLOBAL.SPACE.START.G => START
    END
END
  ;AREA.POINTER^ => DUMMY.SPACE
  ;MAKE(FORMAT.LIST,0,DUMMY.SPACE) => MAKE.FORMAT.LIST
  ;DUMMY.SPACE => AREA.POINTER^
  ;IF AREA.POINTER^ - SZ > START THEN FAULT(171+SP,6) FI
@BOX 3.1
END
@END
@TITLE FTN12.21(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
MAKE ENTRY.LIST
@BOX 2.0
SELECT SPACE FOR MAKE
@BOX 3.0
END
@BOX 1.1
; PROC MAKE.ENTRY.LIST(SP)
; SPACE DUMMY.SPACE[1]
; ADDR ADDR AREA.POINTER
; ADDR START,SZ
@BOX 2.1
; ALTERNATIVE SP FROM
    BEGIN
    ^LINE.SPACE.AREA => AREA.POINTER
   ;LINE.SPACE.Z.L => SZ
   ;LINE.SPACE.START.G => START
    END
   ;BEGIN
    ^LOCAL.SPACE.AREA => AREA.POINTER
   ;LOCAL.SPACE.Z.L => SZ
   ;LOCAL.SPACE.START.G => START
    END
   ;BEGIN
    ^GLOBAL.SPACE.AREA => AREA.POINTER
   ;GLOBAL.SPACE.Z.L => SZ
   ;GLOBAL.SPACE.START.G => START
    END
END
  ;AREA.POINTER^ => DUMMY.SPACE
  ;MAKE(ENTRY.LIST,0,DUMMY.SPACE) => MAKE.ENTRY.LIST
  ;DUMMY.SPACE => AREA.POINTER^
  ;IF AREA.POINTER^ - SZ > START THEN FAULT(171+SP,6) FI
@BOX 3.1
END
@END
@TITLE FTN12.22(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
MAKE DATA.LIST
@BOX 2.0
SELECT SPACE FOR MAKE
@BOX 3.0
END
@BOX 1.1
; PROC MAKE.DATA.LIST(SP)
; SPACE DUMMY.SPACE[1]
; ADDR ADDR AREA.POINTER
; ADDR START,SZ
@BOX 2.1
; ALTERNATIVE SP FROM
    BEGIN
    ^LINE.SPACE.AREA => AREA.POINTER
   ;LINE.SPACE.Z.L => SZ
   ;LINE.SPACE.START.G => START
    END
   ;BEGIN
    ^LOCAL.SPACE.AREA => AREA.POINTER
   ;LOCAL.SPACE.Z.L => SZ
   ;LOCAL.SPACE.START.G => START
    END
   ;BEGIN
    ^GLOBAL.SPACE.AREA => AREA.POINTER
   ;GLOBAL.SPACE.Z.L => SZ
   ;GLOBAL.SPACE.START.G => START
    END
END
  ;AREA.POINTER^ => DUMMY.SPACE
  ;MAKE(DATA.LIST,0,DUMMY.SPACE) => MAKE.DATA.LIST
  ;DUMMY.SPACE => AREA.POINTER^
  ;IF AREA.POINTER^ - SZ > START THEN FAULT(171+SP,6) FI
@BOX 3.1
END
@END
@TITLE FTN12.23(1,11)
@COL 1S-2R-9T-10R-4R-3F
@FLOW 1-2-9no-10-4-3
@FLOW 9yes-4
@BOX 1.0
COPY.NAME.T ([NAME],SPACE)
@BOX 2.0
CREATE SPACE FOR A NAME.T
@BOX 9.0
ANSI length name?
@BOX 10.0
ISSUE WARNING - NAME TOO LONG
@BOX 4.0
COPY THE NAME INTO THE
APPROPRIATE SPACE
@BOX 3.0
RETURN A POINTER
@BOX 1.1
;PROC COPY.NAME.T (N,SP)
;INTEGER LENGTH
;LOGICAL8 CHAR, CHAR.WARNING
; SPACE DUMMY.SPACE[1]
; ADDR ADDR AREA.POINTER
; ADDR START,SZ
@BOX 2.1
; ALTERNATIVE SP FROM
    BEGIN
    ^LINE.SPACE.AREA => AREA.POINTER
   ;LINE.SPACE.Z.L => SZ
   ;LINE.SPACE.START.G => START
    END
   ;BEGIN
    ^LOCAL.SPACE.AREA => AREA.POINTER
   ;LOCAL.SPACE.Z.L => SZ
   ;LOCAL.SPACE.START.G => START
    END
   ;BEGIN
    ^GLOBAL.SPACE.AREA => AREA.POINTER
   ;GLOBAL.SPACE.Z.L => SZ
   ;GLOBAL.SPACE.START.G => START
    END
END
  ;AREA.POINTER^ => DUMMY.SPACE
  ;MAKE(NAME.T,0,DUMMY.SPACE) => COPY.NAME.T
  ;DUMMY.SPACE => AREA.POINTER^
  ;IF AREA.POINTER^ - SZ > START THEN FAULT(171+SP,6) FI
@BOX 9.1
 :: ??? JM 29-DEC-82
;NAME OF N^ => F.B.G
;IF SIZE (NAME OF N^) => LENGTH =< 6
@BOX 10.1
;FAULT(140, 7)
@BOX 4.1
;MAKE.LO8 (LENGTH,SP) => NAME OF COPY.NAME.T^
;0=>CHAR.WARNING
;WHILE 1->LENGTH >= 0 DO
    IF NAME^[LENGTH] OF N^ => NAME^[LENGTH] OF COPY.NAME.T^
       => CHAR = '$$  OR  CHAR = '_
       THEN 1 => CHAR.WARNING
    FI
OD
;IF CHAR.WARNING /= 0 THEN FAULT(153, 7) FI
@BOX 3.1
;END
@END
@TITLE FTN12.24(1,11)
@COL 1S-2T-5T-4T-7R-3F
@COL 6R
@ROW 7-6
@FLOW 1-2carry on-5carry on-4not equal-7-3
@FLOW 2not equal-7
@FLOW 5equal-6-3
@FLOW 4carry on-5
@BOX 1.0
EQUAL.NAME.P ([NAME.1], [NAME.2])
@BOX 2.0
EQUAL LENGTH NAMES?
@BOX 3.0
END
@BOX 4.0
BYTES EQUAL?
@BOX 5.0
FIRST BYTE SEEN?
@BOX 6.0
NON-ZERO FOR EQUAL
@BOX 7.0
RETURN 0 FOR UNEQUAL
@BOX 1.1
;PROC EQUAL.NAME.P (N1, N2)
;INTEGER LENGTH
@BOX 2.1
;SIZE (NAME OF N1^) => LENGTH
;IF SIZE (NAME OF N2^) /= LENGTH
@BOX 3.1
;END
@BOX 4.1
;IF NAME^[LENGTH] OF N1^ = NAME^[LENGTH] OF N2^
@BOX 5.1
;IF 1->LENGTH < 0
@BOX 6.1
;-1 => EQUAL.NAME.P
@BOX 7.1
;0 => EQUAL.NAME.P
@EN< 0
@BOX 6.1
;-1 => EQUAL.NAME.P
@BOX 7.1
;0 => EQUAL.NAME.P
@END

