@X @~
~L3 COUK1247
80
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H             BSC081
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL
~
~
                                                           ISSUE 9~
~V9 -1
~P
~V9 1
~YBSC081
~S~M~OBASIC COMPILER IMPLEMENTATION MANUAL
~S~M~OSection 8
~S~OSection 8. Name List Management
~S~O1.1 General Description
~BThis module of the compiler provides the data structures that record
the names used in a program and converts them to internal identifiers
(INTIDs), keeping a note of their MUTL names and type of entity to
which they belong.
~S~O2. Interfaces
~S~O2.1 Section Interfaces Used
~
   Section 1 :   (Statement Driver)~
   Section 2 :   (Configuration Section)~
   Section 4 :   (Declaration Processing)~
   Section 9 :   (Fault and Reference Point Monitoring)~
~S~O2.2 Section Interface
~
Exported Scalars:~
   LASTCH~
   LASTN~
~
Exported Types:~
   NLIST.ENT~
~
Exported Vectors:~
   NLIST~
   CHLIST~
~
Exported Procedures:~
   ADDN~
   GENN~
   ADD.NLIST~
   SUPPLIED.FN~
   HASH~
   LAB~
   LAB.NAME~
   INIT.LABS~
   END.LABS~
   IMPL.TYPE~
   INIT.S8~
~
Configuration Parameters:~
   NLIST.Z~
   LB.Z~
~S11) ADDN(CH.INDEX,HASH)INTID
~BAdds the current name in CHLIST (indicated by P1 and terminated
by the null character) whose hash value is given by P2
to the name list NLIST if it has not already been
declared, and returns its corresponding internal identifier.
~S12) GENN(INTID)[NAME]
~BFor the given INTID, a bounded pointer to characters
of the associated BASIC name is returned.
~S13) ADDNLIST()
~BThis procedure allocates a NLIST entry, the compilation
aborts when the NLIST is full.
~S14) SUPPLIED.FN(INT.ID)/FN.ID
~BThis procedure determines whether the entity specified
by P1 has the name of one of the Basic supplied functions,
if it has a non-negative identifier is returned, otherwise
-1 is returned.
~S15) HASH(CH.INDEX)HASH
~BGenerates 16 bit hash value for current name in CHLIST
(i.e. indexed by P1).
~S16) LAB(LABEL,KIND)TL.NAME OR DATA INDEX
~BThis procedure adds a label to the current level.  P1 specifies
the label value and KIND is encoded as follows:~
~3
~
~MBit 0   = 0 label reference
~N        = 1 label definition
~NBit 1,2 = 0 control label
~N        = 1 IMAGE line label
~N        = 2 DATA line label.
~0
~
For control label reference the result is the MUTL name of the
label.  For an IMAGE line reference the result is the MUTL name
of the vector containing the encoded IMAGE line.  For a DATA line
reference then if the DATA line is already defined the result is
the index to its datum list in DATA.DV (see section 5), otherwise
bit 15 of the result is set and bit 0-14 contain the index into
RESTORE.DV.
~S17) IMPL.TYPE(INTID)TYPE
~BThis procedure returns the implicit type encoded as a MUTL
type specifier of a name whose internal identifier is given by P1.
~S18) INIT.S8()
~BInitialisation procedure.
~S19) LAB.NAME(LAB.VALUE)LAB.NAME
~BThis procedure returns a bounded byte pointer to the name in characters
whose numeric value is given by P1.
~S110) INIT.LABS()
~BThis procedure is called at the start of a program unit textual
level to initialise the label property structures.
~S111) END.LABS()
~BThis procedure is called at the end of a program unit textual level.
References to undefined levels are reported.
~S1~O3. Implementation
~S1~O3.1 Outline of Operation
~BStraightforward.
~S~O3.2 Data Structures
~T# 10
~
LASTCH~Iindex to the first free position in CHLIST.~
~
CHLIST~Ibyte vector in which the characters of a name are placed
before calling ADDN.  The first character of the name should be
in the position indexed by LASTCH and the last character should
be followed by a zero byte.~
~
LASTN~Iindex to the last allocated entry in NLIST.~
~
NLIST~Iaggregate type vector containing entries relating BASIC names
to MUTL names.  Each entry is of type NLISTENT.  It is indexed by INTID.~
~
NLISTZ~INumber of elements in NLIST.~
~
~3
NLIST.ENT~IProperty list entry type.~
~IBASICN     index into CHLIST for symbolic name~
~I           of identifier.~
~IHASH       hash value of name, bits 0-5 contain~
~I           number of characters in symbolic name.~
~IMUTLN      MUTL name, where relevent, of entity.~
~I           For exception handlers~
~I           0 means PU exception handler~
~I          >0 NLIST index of internal function~
~IK          Kind of entity.~
~I0(KVAR)    scalar variable~
~I1(KVEC)    1-D array~
~I2(KMAT)    2-D array~
~I3(KCONST)  constant~
~I6(KSUB)    subprogram~
~I7(KFN)     function~
~I8(KBSUB)   Basic supplied subprogram~
~I9(KFN)     Basic supplied function~
~I10(KEXSUB) External subprogram~
~I11(KEXFN)  External function~
~I12(KXH)    Exception handler~
~I14(KINV)   Name not allowed~
~I15(KUNDEF) Not yet defined~
~IT          Type information~
~I           Bits 6,7  0,1,3 mean real, integer, string.~
~I           Bits 3-5  0,1,2,3 mean 8, 16, 32, 64 bit.~
~IDETAIL     supplementary information for certain~
~I           entities.  For procedures with a~
~I           specification it is a PARAMS index~
~I           of its specification (see BSC04).~
~I           For exception handlers DETAIL contains exception~
~I           handler identifier~
~IDETAIL1    supplementary information for certain entities~
~I           Bit 3=1 indicates a possible write access~
~I           Bit 4=1 parameter identifier~
~I           Bit 5=1 parameter that requires dereferencing~
~I                   (note only used when params passed~
                              by value and reference).~
~I           Bit 7=1 actively in use as FOR~
~I                   control variable~
~I           Bit 9=1 procedure/exception handler defined.~
~I           Bit 10=1 for procedure references this is~
~I                    set to indicate the properties~
~I                    at the program unit level are to~
~I                    be copied out to the program level~
~I                    at the end of the program unit if~
~I                    the procedure is external.~
~I           Bit 11=1 function is external (i.e~
~I                    textual level one)~
~I           Bit 12=1 function is internal (i.e~
~I                    textual level two)~
~
LB.E~ILabel property list entry type.  It contains the following fields:~
~IVAL        Value of label.~
~INEXT       Index into label property table (LB.T) of~
~I           next label entry on hash chain.  A zero~
~I           indicates the end of the hash chain.~
~ILB.MN      MUTL name of label for control reference~
~I           purposes.  Bit 15 is set to indicate~
~I           label defined.~
~IIMAGE.MN   MUTL name of incode vector containing~
~I           encoded IMAGE format.  Bit 12 is set to~
~I           indicate IMAGE defined.~
~IDATA.I     A value of %FFFF indicates field not,~
~I           used, otherwise bit 15=0 indicates DATA~
~I           line defined and bits 0-14 contain index~
~I           to datum list within DATA.DV, while bit~
~I           15=1 means bits 0-14 contain index into~
~I           RESTORE.DV (see Section 4).~
~0
~BThe namelist organisation of basic supplied functions is
separate and different from the program identifiers namelist.
Whereas the program identifiers namelist is maintained during
itemisation, the basic supplied functions namelist is only
referred to during the processing of expressions in determining
the attributes of the operand of an expression.  The data
structures for supplied function are designed for rapid identification.~
~3
~Q 22
~
        ~O           ~O            ~O           ~O            ~O           ~O~
   |   |           |          |           |          |           |~
   |   |           |          |           |          |           |~
   v   |           |          |           |          |           |~
LETTER | FN.STARTS |--------->| FN.CH.IND |--------->|   FN.CH   |~
       |           |    |     |           |          |           |~
       |           |    |     |           |          |           |~
       |~O           ~O|    |     |           |          |           |~
                        |     |           |          |           |~
                        |     |~O           ~O|          |~O           ~O|~
                        |~
                        |      ~O           ~O~
                        |     |           |~
                        |     |           |~
                        |     |           |~
                         ---->|  FN.HASH  |~
                              |           |~
                              |           |~
                              |           |~
                              |           |~
                              |~O           ~O|~
~0
~
~
The table FN.STARTS is indexed by the first letter of a potential
basic supplied function to select a subset of entries from
FN.CH.IND and FN.HASH.  The latter table contains the 'hash'
values of the basic supplied function while the former is an
index to the symbolic name held in the FN.CH table.  These
data structures are created by a preprocessor (described in
section 10) from a list of basic supplied function names in
level 0 of flowchart BSC08/2.  These names are ordered firstly
on first letter alphabetical order, and secondly in ascending
namelength order.
~Y
~V9 -1
~P
~D15
~HFLOWCHARTS
~
~
~H                BSC081
~V9 -1
~F
///9
@TITLE BSC08(1,11)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 2-3-4-5-6
@BOX 1.0
NAME LIST MANAGEMENT
@BOX 2.0
TYPE DECL
@BOX 3.0
VARIABLE DECLS
DATAVECS FOR NAMES OF
BASIC SUPPLIED FUNCTIONS
@BOX 4.0
PROCEDURES IN MODULE:
ADDN [BSC08.1]
GENN [BSC08.2]
ADD.NLIST[BSC08.3]
SUPPLIED.FN[BSC08.4]
LAB [BSC08.5]
HASH[BSC08.6]
IMPL.TYPE[BSC08.7]
LAB.NAME[BSC08.8]
OUT.PROPS[BSC08.9]
OUT.PROPS.ALL[BSC08.10]
OUT.LABS[BSC08.11]
INIT.LABS[BSC08.12]
END.LABS[BSC08.13]
@BOX 5.0
INITIALISATION PROC
@BOX 6.0
END
@BOX 1.1
#BSC08/1
MODULE(ADDN,GENN,ADD.NLIST,SUPPLIED.FN,OUT.PROP,OUT.PROP.ALL,
OUT.LABS,LAB, LB.T, LAST.LB, LB.E,LAB.IND,
NLIST.ENT,NLIST,CHLIST,HASH,IMPL.TYPE,
LASTN,LASTCH,GL.LASTCH,INIT.S8,HASH, INIT.LABS, END.LABS, LAB.NAME);
@BOX 2.1
::DECLARATIONS
$TY NLIST.ENT IS $LO16 BASICN,HASH,MUTLN,DETAIL,DETAIL1 $LO8 K,T;
$TY LB.E IS $LO16 NEXT, LB.MN, IMAGE.MN,DATA.I $LO32 VAL;
@BOX 3.1
*GLOBAL 5;
$IN LAB.IND;
$LO8 [CHLISTZ] CHLIST;
$LO8[8] LAB.V;
NLIST.ENT [NLISTZ] NLIST;
LB.E [LB.Z] LB.T;
$LO16 [64] LB.HASH;
$IN LASTCH,LASTN,LAST.LB,GL.LASTCH;
$LI/ADDR[$LO8] NIL=;
*GLOBAL 6;
#BSC08/2
*GLOBAL 0;
@BOX 4.1
$PS ADDN($IN,$LO16)/$LO16;
$PS GENN($LO16)/ADDR [$LO8];
$PS ADD.NLIST()/$IN;
$PS LAB ($LO32, $IN) / $LO16;
$PS HASH($IN)/$LO16;
$PS IMPL.TYPE($IN)/$LO8;
$PS SUPPLIED.FN($IN)/$IN;
$PS INIT.LABS();
$PS END.LABS();
$LS OUT.PROP($IN);
$LS OUT.PROP.ALL();
$LS OUT.LABS($LO16,$LO16);
$PS LAB.NAME($LO32)/ADDR[$LO8];
*CODE 8;
#BSC08.1
#BSC08.2
#BSC08.3
#BSC08.5
#BSC08.4
#BSC08.6
#BSC08.7
#BSC08.8
#BSC08.9
#BSC08.10
#BSC08.11
#BSC08.12
#BSC08.13
@BOX 5.1
$PS INIT.S8();
$PR INIT.S8;
0 => LASTN => LASTCH;
CH.LISTZ - 1 => GL.LASTCH;
END
@BOX 6.1
::END OF MODULE BSC081
*END
@END
@TITLE BSC08/1(1,11)
@COL 1S
@BOX 1.0
EXTERNAL INTERFACE
OF MODULE BSC081
@BOX 1.1
TYPE ITYPE IS $LO8 TAG, ST $LO16 IND;
$PS MONITOR($IN);
$PS MONITOR.I($IN, $IN16);
$PS MONITOR.S($IN,ADDR[$LO8]);
$IN MSTR, LAST.MN, LAST.B;
$IM $LI NLISTZ,CHLISTZ,LB.Z;
$IN PROCLEV, B.INT, B.RE;
$IM $LI BSTR,KUNDEF;
$IM $LI RESTORE.B.Z, BLK.Z;
$LO16[RESTORE.B.Z] RESTORE.B;
$LO16 [BLK.Z] BLK.STK;
$IN BLK.NO, BLK.LEV;
$IN LAST.R;
@END
///13
@TITLE BSC08/2(1,11)
@COL 1S-2R
@FLOW 1-2
@BOX 1.0
@BOX 2.0
ABS ATN ACOS ASIN ANGLE
COS COT CSC CON CEIL COSH CHR$
DEG DET DOT DATE DATE$
EPS EXP EXLINE EXTYPE
FP
IP INF INT IDN INV
LEN LOG LOG2 LOG10 LBOUND LCASE$ LTRIM$
MAX MIN MOD MAXLEN
NULL$
ORD
PI POS
RAD REM RND ROUND RTRIM$
SEC SGN SIN SQR SINH SIZE STR$
TAN TRN TANH TIME TIME$ TRUNCATE
UBOUND UCASE$
VAL
ZERO
%
@BOX 1.1
::BSC07/2
@BOX 2.1
DATAVEC FN.CH($LO8)
"ABSATNACOSASINANGLECOSCOTCSCCONC"
"EILCOSHCHR$$DEGDETDOTDATEDATE$$EPS"
"EXPEXLINEEXTYPEFPIPINFINTIDNINVL"
"ENLOGLOG2LOG10LBOUNDLCASE$$LTRIM$$"
"MAXMINMODMAXLENNULL$$ORDPIPOSRADR"
"EMRNDROUNDRTRIM$$SECSGNSINSQRSINH"
"SIZESTR$$TANTRNTANHTIMETIME$$TRUNC"
"ATEUBOUNDUCASE$$VALZERO"

END

DATAVEC FN.HASH($LO16)
%0363  %0743  %08A4  %0E84  %1725  %07A3  %07C3  %06A3
%0703  %0944  %1044  %0C04  %0423  %05C3  %0843  %0A24
%14C5  %08E3  %0A83  %58A6  %6926  %0382  %0442  %08C3
%0A83  %0743  %0AC3  %0903  %0AA3  %1784  %30C5  %5186
%4246  %7246  %09C3  %0A83  %0AC3  %5706  %3A85  %0C83
%0522  %0E23  %09C3  %0BE3  %0D03  %4185  %8A46  %0B23
%0D03  %0D83  %1003  %1C04  %1EA4  %2204  %0C03  %1043
%1904  %1C64  %3945  %4928  %7586  %6646  %0CC3  %22E4

END

DATAVEC FN.CH.IND($LO16)
%0000  %0003  %0006  %000A  %000E  %0013  %0016  %0019
%001C  %001F  %0023  %0027  %002B  %002E  %0031  %0034
%0038  %003D  %0040  %0043  %0049  %004F  %0051  %0053
%0056  %0059  %005C  %005F  %0062  %0065  %0069  %006E
%0074  %007A  %0080  %0083  %0086  %0089  %008F  %0094
%0097  %0099  %009C  %009F  %00A2  %00A5  %00AA  %00B0
%00B3  %00B6  %00B9  %00BC  %00C0  %00C4  %00C8  %00CB
%00CE  %00D2  %00D6  %00DB  %00E3  %00E9  %00EF  %00F2

END

DATAVEC FN.STARTS($LO8)
%00  %05  %05  %0C  %11  %15  %16  %16
%16  %1B  %1B  %1B  %22  %26  %27  %28
%2A  %2A  %2F  %36  %3C  %3E  %3F  %3F
%3F  %3F  %40
END

@END
@TITLE BSC08.1(1,11)
@COL 1S-3R-4T-5T-6R-7T-8T-9R-10F
@COL 11R
@ROW 5-11
@FLOW 1-3-4N-5Y-6-7Y-8Y-9-10
@FLOW 4Y-11-10
@FLOW 5N-4
@FLOW 7N-4
@FLOW 8N-7
@BOX 1.0
ADDN(CH.INDEX,HASH)
@BOX 3.0
GET LENGTH OF NAME
@BOX 4.0
COMPARED ALL NAMES
IN NLIST?
@BOX 5.0
ARE HASHS THE SAME?
@BOX 6.0
SET POINTERS FOR
NAME COMPARISON
@BOX 7.0
NEXT CHARACTERS
THE SAME?
@BOX 8.0
ALL NAME COMPARED?
@BOX 9.0
RETURN NLIST PTR
AS INTID
@BOX 10.0
EXIT
@BOX 11.0
GET NLIST ENTRY [08.3]
AND INITIALISE
RETURN NEW NAME
INDEX AS INTID
@BOX 1.1
$PR ADDN(CH.I,HASH1);
$IN I,J,K,L,N,ST;
@BOX 3.1
CH.I => I;
HASH1 & %1F => N;
LASTN+1 => ST;
@BOX 4.1
IF 1 -> ST < 0
@BOX 5.1
IF HASH OF NLIST[ST] /= HASH1
@BOX 6.1
BASICN OF NLIST[ST] => J;
0 => L;
@BOX7.1
IF CHLIST[J+L] /= CHLIST[CH.I+L]
@BOX8.1
IF 1 +> L /= N
@BOX9.1
ST => ADDN;
@BOX10.1
END
@BOX11.1
BEGIN
SELECT NLIST[ADD.NLIST() => ADDN];
CH.I => BASICN;
HASH1 => HASH;
N + CH.I-1 => LAST.CH
END;
@END
@TITLE BSC08.2(1,11)
@COL 1S-2R-3R-5R-6F
@FLOW 1-2-3-5-6
@BOX 1.0
GENN(INTID)
@BOX 2.0
DECLARATIONS
@BOX3.0
1ST CH NAME IS
BASICN OF NLIST[INTID]
OF NAME
@BOX5.0
CREATE PARTITION
CHLIST (1ST CH, LASTCH)
AS RESULT
@BOX6.0
END
@BOX 8.0
COPY NAME TO
XNAME
@BOX 9.0
CREATE PARTITION
OF XNAME AND
RETURN AS RESULT
@BOX 1.1
$PR GENN(INTID);
@BOX 2.1
$IN FSTCH,I,N;
@BOX 3.1
BASICN OF NLIST[INTID] => FSTCH;
HASH OF NLIST[INTID] & %1F => N;
@BOX 5.1
PART(^CHLIST,FSTCH,FSTCH+N-1) => GENN;
@BOX 6.1
$EN
@END
@TITLE BSC08.3(1,11)
@COL 1S-2R-3T-4R-5F
@COL 6R
@ROW 4-6
@FLOW 1-2-3N-4-5
@FLOW 3Y-6
@BOX 1.0
ADD.NLIST()NLIST.INDEX
@BOX 2.0
GET NLIST ENTRY
@BOX 3.0
NLIST OR CHAR TABLE FULL
@BOX 4.0
INIT NLIST ENTRY
@BOX 5.0
END
@BOX 6.0
FAULT
@BOX 1.1
PROC ADD.NLIST;
@BOX 2.1
1 +> LAST.N => ADD.NLIST;
@BOX 3.1
IF ADD.NLIST >= NLISTZ OR
   LASTCH + 32 >= CHLISTZ
@BOX 4.1
SELECT NLIST[ADDNLIST];
KUNDEF => K;
0 => MUTLN => T => BASIC.N => HASH;
0 => DETAIL => DETAIL1;
@BOX 5.1
END
@BOX 6.1
MONITOR.S(%110,%"NLIST");
@END
///4
@TITLE BSC08.4(1,11)
@COL 1S-2R-3T-4T-5R-7F
@COL 6R
@ROW 5-6
@FLOW 1-2-3N-4N-5-7
@FLOW 4Y-3Y-6-7
@BOX 1.0
SUPPLIED.FN(NLIST.ID)/FN.ID
@BOX 2.0
SELECT SUBLIST OF NAMES
STARTING WITH FIRST LETTER OF NAME
@BOX 3.0
FIND NEXT IN LIST WITH SAME HASH
VALUE
END OF LIST?
@BOX 4.0
NAMES DIFFERENT?
@BOX 5.0
RETURN FN.ID
@BOX 6.0
RETURN -1
@BOX 7.0
END
@BOX 1.1
PROC SUPPLIED.FN(NLIST.ID);
$IN ST,FIN,CH,I,J,N;
SELECT NLIST[NLIST.ID];
@BOX 2.1
FN.STARTS[CH.LIST[BASICN] - 'A => CH] -1 => ST;
FN.STARTS[CH+1] => FIN;
@BOX 3.1
WHILE 1+> ST< FIN AND HASH /= FN.HASH[ST] DO OD
IF ST >= FIN
@BOX 4.1
FN.CH.IND[ST] => J;
HASH & %1F => N;
-1 => I;
WHILE CH.LIST[1+>I+BASIC.N] = FN.CH[J+I] AND I < N DO OD
IF N /= I
@BOX 5.1
ST => SUPPLIED.FN;
@BOX 6.1
-1=>SUPPLIED.FN;
@BOX 7.1
END
@END
///14
@TITLE BSC08.5(1,11)
@COL 23T-24T-25R-26R-27R-28T-29T-30R-31R
@COL 1S-2R-3R-4T-5T-6R-7T-22T-8T-9R-10T-11R-12F
@COL 20T-13R-21R-14T-15R-16T-17T-18R-19R
@ROW 5-20
@ROW 23-6
@ROW 6-13
@ROW 8-14
@FLOW 1-2-3-4N-5N-6-4Y-20N-13-7N-22N-8N-9-10N-11-12
@FLOW 5Y-7Y-14N-15-16N-17N-18-12
@FLOW 8Y-10Y-12
@FLOW 20Y-21
@FLOW 14Y-16Y-12
@FLOW 17Y-19-12
@FLOW 22Y-23N-24N-25-26-27-12
@FLOW 24Y-26
@FLOW 23Y-28N-29N-30-27
@FLOW 28Y-27
@FLOW 29Y-31
@BOX 1.0
LAB (VALUE, KIND)LABEL TL.NAME
KIND BIT 0 = 0/1 REFN/DEFN
     BIT 1, 2 = 0/1/2 CONTROL /IMAGE /DATA LABEL
@BOX 2.0
CALCULATE HASH
@BOX 3.0
GET LABEL INDEX FROM
CURRENT HASH TABLE
@BOX 4.0
END OF HASH CHAIN?
@BOX 5.0
IS IT THE REQUIRED LABEL?
@BOX 6.0
GET NEXT LINK IN HASH CHAIN
@BOX 7.0
CONTROL LABEL?
@BOX 8.0
DATAVEC DECLARED FOR IMAGE LINE
AND NOT A DOUBLE DEFINITION
@BOX 9.0
DECLARE INCODE DATAVEC FOR
ENCODED IMAGE LINE
UPDATE PROPS
@BOX 10.0
REFERENCE
@BOX 11.0
NOTE DEFINED
@BOX 12.0
END
@BOX 13.0
ALLOCATE LABEL ENTRY
LINK TO LABEL HASH TABLE
@BOX 14.0
LABEL DECLARED?
@BOX 15.0
DECLARE LABEL
UNLESS LABEL OUTSIDE PROGRAM UNIT
UPDATE PROPS
@BOX 16.0
LABEL REFERENCE?
@BOX 17.0
LABEL NOT DEFINED?
@BOX 18.0
FAULT
@BOX 19.0
DEFINEL LABEL TO MUTL
UNLESS LABEL OUTSIDE PROGRAM UNIT
NOTE DEFINED
@BOX 20.0
LABEL TABLE FULL
@BOX 21.0
FAULT (ABANDON COMPILATION)
@BOX 22.0
DATA STATEMENT LABEL?
@BOX 23.0
REFN OR ALREADY DEFINED
@BOX 24.0
NO FORWARD REFERENCES?
@BOX 25.0
PUT DATUM LIST INDEX INTO
'RESTORE DV'
@BOX 26.0
UPDATE PROPS WITH DATUM LIST
INDEX
@BOX 27.0
SET RESULT FROM PROPS
@BOX 28.0
PREVIOUS REFERENCE OR
ALREADY DEFINED
@BOX 29.0
'RESTORE DV' FULL
@BOX 30.0
ADD ENTRY TO 'RESTORE DV'
@BOX 31.0
FAULT(ABORT COMPILE)
@BOX 1.1
PROC LAB (V, K);
$IN HASH, N, FN, D;
@BOX 2.1
V & %3F => HASH;
@BOX 3.1
LB.HASH [HASH] => FN => N;
@BOX 4.1
IF N = 0
@BOX 5.1
IF VAL OF LB.T [N] = V
@BOX 6.1
NEXT OF LB.T [N] => N;
@BOX 7.1
SELECT LB.T [N];
IF K & 6 = 0
@BOX 8.1
IF IMAGE.MN & %FFF => LAB /= 0
@BOX 9.1
TL.S.DECL (NIL, %80, -1);
1 +> LAST.MN => LAB => IMAGE.MN;
@BOX 10.1
IF K & 1 = 0
@BOX 11.1
%1000 !> IMAGE.MN;
@BOX 12.1
END
@BOX 13.1
BEGIN
SELECT LB.T [N => LAB.IND];
N => LB.HASH [HASH];
FN => NEXT;
0 => LB.MN => IMAGE.MN;
V => VAL;
%FFFF => DATA.I;
END
@BOX 14.1
IF LB.MN & %3FFF => LAB /= 0
@BOX 15.1
IF PROC.LEV /= 0 THEN
   TL.LABEL.SPEC (LAB.NAME(V), 0);
   1 +> LAST.MN => LB.MN => LAB;
ELSE
   1 => LB.MN => LAB;
FI
@BOX 16.1
IF K & 1 = 0
@BOX 17.1
IF LB.MN & %8000 = 0
@BOX 18.1
MONITOR.I(16, V);
@BOX 19.1
IF PROC.LEV /= 0 THEN
   TL.LABEL (LB.MN);
FI;
%8000 !> LB.MN;
@BOX 20.1
IF 1 +> LAST.LB => N >= LB.Z
@BOX 21.1
MONITOR.S (%200F, %"LABEL PROPERTIES");
@BOX 22.1
IF K & 6 = 4
@BOX 23.1
DATA.I => D
IF K & 1 = 0 OR
   [D /= 0 AND D & %8000 = 0]
@BOX 24.1
IF D = %FFFF
@BOX 25.1
LAST.B + 1 => RESTORE.B[D & %7FFF];
@BOX 26.1
LAST.B + 1 => DATA.I;
@BOX 27.1
DATA.I => LAB;
@BOX 28.1
IF D/= %FFFF
@BOX 29.1
IF 1+>LAST.R >= RESTORE.B.Z
@BOX 30.1
%8000 ! LAST.R => DATA.I;
@BOX 31.1
MONITOR.S (%200F,%"RESTORE LABEL");
@END
@TITLE BSC08.6(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
HASH(CHLIST.INDEX)HASH
@BOX 2.0
CALCULATE HASH
@BOX 3.0
END
@BOX 1.1
PROC HASH(CH.I);
$LO16 CH;
$IN N;
@BOX 2.1
-1 => N;
0 => HASH;
WHILE CH.LIST[1+>N+CH.I] => CH /=0 DO
CH & %1F + HASH & %7FF <<- 1 => HASH;
OD
HASH <<- 4 + N => HASH;
@BOX 3.1
END
@END
@TITLE BSC08.7(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
IMPL.TYPE(NLIST.ID)TYPE
@BOX 2.0
GET LAST CHAR AND CALCULATE
IMPLICIT TYPE
@BOX 3.0
END
@BOX 1.1
PROC IMPL.TYPE(NL.I);
$LO8 CH;
@BOX 2.1
IF CHLIST[HASH OF NLIST[NL.I] & %1F-1+BASICN OF NLIST[NL.I]]
   => CH = '$$ THEN
      BSTR => IMPL.TYPE;
   ELSE IF CH = '% THEN
        B.INT => IMPL.TYPE;
       ELSE
      B.RE => IMPL.TYPE;
       FI
FI
@BOX 3.1
END
@END
///9
@TITLE BSC08.8(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
LAB.NAME(VALUE) NAME
@BOX 2.0
CONVERT NUMERIC LABEL
VALUE TO CHARACTER STRING
@BOX 3.0
END
@BOX 1.1
PROC LAB.NAME(V);
$IN32 M,D;
$IN Z;
@BOX 2.1
0 => Z;
10000000 => M;
FOR 8 DO;
   V / M => D * M -> V;
   IF D + Z > 0 THEN
      D + '0 => LAB.V[Z];
      1 +> Z;
   FI
10 /> M;
OD
PART(^LAB.V, 0, Z -1) => LAB.NAME;
@BOX 3.1
END;
@END

///6
@TITLE BSC08.9(1,11)
@COLUMN 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
OUT.PROP(INT.ID.NO)
@BOX 2.0
FOR A GIVEN INTERNAL IDENTIFIER
NUMBER, OUTPUT THE IDENTIFIER PROPERTIES
@BOX 3.0
END
@BOX 1.1
$PR OUT.PROP(INT.ID.NO);
@BOX 2.1
NEWLINES(0);
SELECT N.LIST[INT.ID.NO];
CAPTION(%"NAME: ");CAPTION(GENN(INT.ID.NO));
CAPTION(%"  HASH: ");OUTHEX(HASH,4);
CAPTION(%"  MUTLN: ");OUTHEX(MUTLN,4);
CAPTION(%"  K: ");OUTHEX(K,2);
CAPTION(%"  T: ");OUTHEX(T,2);
CAPTION(%"  DETAIL: ");OUTHEX(DETAIL,4);
CAPTION(%"  DETAIL1: ");OUTHEX(DETAIL1,4);
NEWLINES(0);
@BOX 3.1
END
@END
//14
@TITLE BSC08.10
@COLUMN 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
OUT.PROP.ALL()
@BOX 2.0
FOR EACH IDENTIFIER
DUMP OUT PROPERTIES
@BOX 3.0
END
@BOX 1.1
$PR OUT.PROP.ALL;
   $IN I;
@BOX 2.1
FOR I < LASTN DO
   OUT.PROP(I + 1);
OD
@BOX 3.1
END
@END
//14
@TITLE BSC08.11(1,11)
@COLUMN 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
OUT.LABS(LOWER.BNDS,UPPER.BNDS)
@BOX 2.0
FOR A THE SPECIFIED RANGE OF LABELS
OUTPUT THE  FIELDS OF THE LABEL TABLE: LB.T
@BOX 3.0
END
@BOX 1.1
$PR OUT.LABS(LOWER.BND,UPPER.BND);
  $IN LB.TBL.IDX;
@BOX 2.1
NEWLINES(0);
FOR LB.TBL.IDX < LAST.LB DO
SELECT LB.T[LB.TBL.IDX + 1];
  IF LOWER.BND =< VAL >= UPPER.BND THEN
    CAPTION(%"LABEL: ");OUT.I(VAL,6);
    CAPTION(%"  NEXT: ");OUTHEX(NEXT,4);
    CAPTION(%"  LB.MN: ");OUTHEX(LB.MN,4);
    CAPTION(%"  IMAGE.MN: ");OUTHEX(IMAGE.MN,4);
    CAPTION(%"  DATA.I: ");OUTHEX(DATA.I,4);
    NEWLINES(0);
  FI
OD
@BOX 3.1
END
@END

///8
@TITLE BSC08.12(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
INIT.LABS()
@BOX 2.0
INITIALISE LABEL HASH TABLE
@BOX 3.0
END
@BOX 1.1
PROC INIT.LABS;
$IN I;
@BOX 2.1
FOR I < 64 DO
   0 => LB.HASH[I];
OD
0 => LAST.LB;
@BOX 3.1
END
@END
///11
@TITLE BSC08.13(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
END.LABS()
@BOX 2.0
MONITOR REFERENCES TO LINE NUMBERS NOT DEFINED
@BOX 3.0
END
@BOX 1.1
PROC END.LABS;
$IN I;
@BOX 2.1
FOR I < LAST.LB DO
   IF LB.MN OF LB.T[I+1] & %8000 = 0 THEN
      MONITOR.S(%4F,LAB.NAME(VAL OF LB.T[I+1]));
   FI
OD
@BOX 3.1
END
@END

