|
|
@@ -69,7 +69,7 @@ FROM Runtime IMPORT RT_Build, RT_Size, RT_Byte, RT_Entry, LoadBias ;
|
|
|
|
|
|
CONST
|
|
|
MaxLine = 128 ;
|
|
|
- MaxName = 31 ;
|
|
|
+ MaxName = 63 ;
|
|
|
|
|
|
(* Size of the entry jump at image offset 0: E9 lo hi. The jump's
|
|
|
displacement is relative to the END of the jump, so every offset in the
|
|
|
@@ -394,6 +394,7 @@ VAR
|
|
|
TU_StackChk : CARDINAL ;
|
|
|
TU_WrInt : CARDINAL ; TU_WrIntW : CARDINAL ;
|
|
|
TU_WrChar : CARDINAL ; TU_WrBool : CARDINAL ;
|
|
|
+ TU_WrCharW : CARDINAL ; TU_WrBoolW : CARDINAL ; TU_WrStrW : CARDINAL ;
|
|
|
TU_WrReal : CARDINAL ; TU_RealWrite : CARDINAL ; TU_RealFmt : CARDINAL ;
|
|
|
TU_RealVal : CARDINAL ; TU_RealCmp : CARDINAL ;
|
|
|
TU_RealAdd : CARDINAL ; TU_RealSub : CARDINAL ;
|
|
|
@@ -2427,6 +2428,17 @@ BEGIN
|
|
|
cls := TScalar ;
|
|
|
v := 0 ;
|
|
|
Skip () ;
|
|
|
+ IF CurCh () = '-' THEN
|
|
|
+ (* Signed ordinal constant, needed for array bounds such as
|
|
|
+ `array[-17..42] of real'. ParseExpr already handles unary minus in
|
|
|
+ expressions; RdConst is the constant-only path and had no sign. *)
|
|
|
+ DropCh (GetCh ()) ;
|
|
|
+ RdConst (v, cls, isStr) ;
|
|
|
+ IF NOT isStr THEN
|
|
|
+ v := 0 - v
|
|
|
+ END ;
|
|
|
+ RETURN
|
|
|
+ END ;
|
|
|
IF CurCh () = '$' THEN
|
|
|
RdIntConst (v) ;
|
|
|
cls := TScalar
|
|
|
@@ -4456,6 +4468,51 @@ BEGIN
|
|
|
ParseSub (r) ;
|
|
|
RETURN
|
|
|
END ;
|
|
|
+ IF NameEq (wrd, "NIL") THEN
|
|
|
+ r.kind := 0 ;
|
|
|
+ r.cls := TPtr ;
|
|
|
+ r.imm := 0 ;
|
|
|
+ r.sz := 2 ;
|
|
|
+ RETURN
|
|
|
+ END ;
|
|
|
+ IF NameEq (wrd, "ADDR") THEN
|
|
|
+ (* Addr(x): the run-time address of x, as a pointer value in AX. TP3
|
|
|
+ spells this Addr; the @ operator is a later Turbo spelling and is not
|
|
|
+ part of the TP3 subset yet. *)
|
|
|
+ IF NOT MatchDelim ('(') THEN
|
|
|
+ Err (ENoSemi) ;
|
|
|
+ RETURN
|
|
|
+ END ;
|
|
|
+ Skip () ;
|
|
|
+ IF NOT Alpha (CurCh ()) THEN
|
|
|
+ Err (EUnknown) ;
|
|
|
+ RETURN
|
|
|
+ END ;
|
|
|
+ GetWord () ;
|
|
|
+ ParseVar (r) ;
|
|
|
+ ExpectDelim (')', ENoSemi) ;
|
|
|
+ IF NOT OK () THEN
|
|
|
+ RETURN
|
|
|
+ END ;
|
|
|
+ IF r.kind = 5 THEN
|
|
|
+ EmMovAxDi ()
|
|
|
+ ELSIF r.kind = 1 THEN
|
|
|
+ IF symtab [r.idx].isVar THEN
|
|
|
+ LoadSymVar (r.idx, symtab [r.idx].off, 2)
|
|
|
+ ELSE
|
|
|
+ EmPushSymAddr (r.idx, (symtab [r.idx].off + r.boff) MOD 10000H) ;
|
|
|
+ EmPopAx ()
|
|
|
+ END
|
|
|
+ ELSE
|
|
|
+ Err (ETypeErr) ;
|
|
|
+ RETURN
|
|
|
+ END ;
|
|
|
+ r.kind := 2 ;
|
|
|
+ r.cls := TPtr ;
|
|
|
+ r.sz := 2 ;
|
|
|
+ r.idx := 0 ;
|
|
|
+ RETURN
|
|
|
+ END ;
|
|
|
IF NOT Search (wrd, idx) THEN
|
|
|
Err (EUnknown) ;
|
|
|
RETURN
|
|
|
@@ -5039,19 +5096,24 @@ END ParseExpr ;
|
|
|
(* ---------------------------------------------------------------- *)
|
|
|
|
|
|
PROCEDURE ParseLabelStmt () ;
|
|
|
-(* numeric label definition 'n :' *)
|
|
|
+(* numeric or named label definition 'n :' / 'Name:' *)
|
|
|
VAR n : CARDINAL ;
|
|
|
- nm : ARRAY [0..9] OF CHAR ;
|
|
|
+ nm : ARRAY [0..MaxName] OF CHAR ;
|
|
|
idx : CARDINAL ;
|
|
|
i : CARDINAL ;
|
|
|
BEGIN
|
|
|
- n := 0 ;
|
|
|
- WHILE Digit (CurCh ()) DO
|
|
|
- n := n * 10 + (ORD (CurCh ()) - ORD ('0')) ;
|
|
|
- DropCh (GetCh ())
|
|
|
+ IF Alpha (CurCh ()) THEN
|
|
|
+ GetWord () ;
|
|
|
+ SaveWord (nm)
|
|
|
+ ELSE
|
|
|
+ n := 0 ;
|
|
|
+ WHILE Digit (CurCh ()) DO
|
|
|
+ n := n * 10 + (ORD (CurCh ()) - ORD ('0')) ;
|
|
|
+ DropCh (GetCh ())
|
|
|
+ END ;
|
|
|
+ NumToName (n, nm)
|
|
|
END ;
|
|
|
ExpectDelim (':', ENoSemi) ;
|
|
|
- NumToName (n, nm) ;
|
|
|
IF Search (nm, idx) THEN
|
|
|
IF symtab [idx].tag = KLabel THEN
|
|
|
symtab [idx].defnd := TRUE ;
|
|
|
@@ -6304,8 +6366,9 @@ BEGIN
|
|
|
CALL wrtinl <length byte> <characters...>
|
|
|
with no stack argument at all; wrtinl reads the length from the
|
|
|
return address and returns to just past the last character.
|
|
|
- Mirrored exactly, so the literal costs only its own characters
|
|
|
- in the code stream and nothing in the data segment. *)
|
|
|
+ A following `:width' needs the ordinary address form, so
|
|
|
+ wrstrw can pad it; the no-width path keeps the compact
|
|
|
+ inline byte stream. *)
|
|
|
IF strLen [arg.strx] > 255 THEN
|
|
|
(* The length is one byte, so a literal of 256 characters or
|
|
|
more would wrap: 300 characters emitted behind a length of
|
|
|
@@ -6315,14 +6378,28 @@ BEGIN
|
|
|
Err (EConstRange) ;
|
|
|
RETURN
|
|
|
END ;
|
|
|
- DropC (EmCall (TU_WrInl)) ;
|
|
|
- Ebyte (VAL (BYTE, strLen [arg.strx])) ;
|
|
|
- n := 0 ;
|
|
|
- WHILE n < strLen [arg.strx] DO
|
|
|
- Ebyte (VAL (BYTE, ORD (strPool [strOff [arg.strx] + n]))) ;
|
|
|
- INC (n)
|
|
|
- END ;
|
|
|
- pushed := FALSE (* nothing was pushed for this one *)
|
|
|
+ IF MatchDelim (':') THEN
|
|
|
+ (* A string literal with a field width: make its bytes an
|
|
|
+ ordinary code-resident address, then pad before it. *)
|
|
|
+ EmPushStrAddr (arg) ;
|
|
|
+ ParseExpr (dummy) ;
|
|
|
+ IF NOT OK () THEN
|
|
|
+ RETURN
|
|
|
+ END ;
|
|
|
+ LoadAtom (dummy) ;
|
|
|
+ EmPushAx () ;
|
|
|
+ ent := TU_WrStrW ;
|
|
|
+ argBytes := 4
|
|
|
+ ELSE
|
|
|
+ DropC (EmCall (TU_WrInl)) ;
|
|
|
+ Ebyte (VAL (BYTE, strLen [arg.strx])) ;
|
|
|
+ n := 0 ;
|
|
|
+ WHILE n < strLen [arg.strx] DO
|
|
|
+ Ebyte (VAL (BYTE, ORD (strPool [strOff [arg.strx] + n]))) ;
|
|
|
+ INC (n)
|
|
|
+ END ;
|
|
|
+ pushed := FALSE (* nothing was pushed for this one *)
|
|
|
+ END
|
|
|
ELSE
|
|
|
IF acls = TString THEN
|
|
|
(* A string *variable*. Its value IS its address, so it is
|
|
|
@@ -6351,7 +6428,17 @@ BEGIN
|
|
|
ELSE
|
|
|
EmPushSymAddr (arg.idx, (symtab [arg.idx].off + arg.boff) MOD 10000H)
|
|
|
END ;
|
|
|
- ent := TU_WrStr
|
|
|
+ ent := TU_WrStr ;
|
|
|
+ IF MatchDelim (':') THEN
|
|
|
+ ParseExpr (dummy) ;
|
|
|
+ IF NOT OK () THEN
|
|
|
+ RETURN
|
|
|
+ END ;
|
|
|
+ LoadAtom (dummy) ;
|
|
|
+ EmPushAx () ;
|
|
|
+ ent := TU_WrStrW ;
|
|
|
+ argBytes := 4
|
|
|
+ END
|
|
|
ELSE
|
|
|
IF acls = TReal THEN
|
|
|
(* A REAL is six bytes, so the writer takes its
|
|
|
@@ -6412,13 +6499,9 @@ BEGIN
|
|
|
(* Field width: `writeln(I:2)'. TP3 evaluates the
|
|
|
width (CALC passes `FW', a variable), so it is
|
|
|
parsed and pushed AFTER the value: width at BP+4,
|
|
|
- value at BP+6. Only an integer has a width entry
|
|
|
- yet - a CHAR/BOOLEAN/STRING width needs its own
|
|
|
- writer, and `:decimals' is the REAL form. *)
|
|
|
- IF (acls # TScalar) OR arg.chr THEN
|
|
|
- Err (ENoLib) ;
|
|
|
- RETURN
|
|
|
- END ;
|
|
|
+ value at BP+6. Char, BOOLEAN and integer each
|
|
|
+ have their own width entry; a second colon is
|
|
|
+ only legal for REAL, handled above. *)
|
|
|
ParseExpr (dummy) ;
|
|
|
IF NOT OK () THEN
|
|
|
RETURN
|
|
|
@@ -6429,7 +6512,13 @@ BEGIN
|
|
|
Err (ENoLib) ;
|
|
|
RETURN
|
|
|
END ;
|
|
|
- ent := TU_WrIntW ;
|
|
|
+ IF arg.chr OR (acls = TChar) THEN
|
|
|
+ ent := TU_WrCharW
|
|
|
+ ELSIF acls = TBool THEN
|
|
|
+ ent := TU_WrBoolW
|
|
|
+ ELSE
|
|
|
+ ent := TU_WrIntW
|
|
|
+ END ;
|
|
|
argBytes := 4
|
|
|
END
|
|
|
END
|
|
|
@@ -6468,6 +6557,38 @@ BEGIN
|
|
|
END
|
|
|
END IoCall ;
|
|
|
|
|
|
+PROCEDURE LabelColonAhead () : BOOLEAN ;
|
|
|
+(* `Label:' is a statement label, but `Name;' is a procedure call. Look
|
|
|
+ past an identifier and blanks without consuming input. *)
|
|
|
+VAR k : CARDINAL ;
|
|
|
+ ch : CHAR ;
|
|
|
+BEGIN
|
|
|
+ k := 0 ;
|
|
|
+ ch := PeekAhead (k) ;
|
|
|
+ IF NOT Alpha (ch) THEN
|
|
|
+ RETURN FALSE
|
|
|
+ END ;
|
|
|
+ WHILE AlphaNum (ch) DO
|
|
|
+ INC (k) ;
|
|
|
+ ch := PeekAhead (k)
|
|
|
+ END ;
|
|
|
+ WHILE ch = ' ' DO
|
|
|
+ INC (k) ;
|
|
|
+ ch := PeekAhead (k)
|
|
|
+ END ;
|
|
|
+ IF ch # ':' THEN
|
|
|
+ RETURN FALSE
|
|
|
+ END ;
|
|
|
+ (* `Name := ...' is an assignment, not a label definition. *)
|
|
|
+ INC (k) ;
|
|
|
+ ch := PeekAhead (k) ;
|
|
|
+ WHILE ch = ' ' DO
|
|
|
+ INC (k) ;
|
|
|
+ ch := PeekAhead (k)
|
|
|
+ END ;
|
|
|
+ RETURN ch # '='
|
|
|
+END LabelColonAhead ;
|
|
|
+
|
|
|
PROCEDURE Statmnt () ;
|
|
|
VAR tok : CARDINAL ;
|
|
|
idx, i2 : CARDINAL ;
|
|
|
@@ -6483,10 +6604,9 @@ VAR tok : CARDINAL ;
|
|
|
savedWith : CARDINAL ;
|
|
|
BEGIN
|
|
|
Skip () ;
|
|
|
- IF Digit (CurCh ()) THEN
|
|
|
- ParseLabelStmt () ; (* consumed 'n' ':' *)
|
|
|
- Statmnt () ; (* 'n : statement' - the statement follows
|
|
|
- the label directly, with no ';' between *)
|
|
|
+ IF Digit (CurCh ()) OR LabelColonAhead () THEN
|
|
|
+ ParseLabelStmt () ; (* consumed the label and ':' *)
|
|
|
+ Statmnt () ; (* the statement follows the label directly *)
|
|
|
RETURN
|
|
|
END ;
|
|
|
IF NOT Alpha (CurCh ()) THEN
|
|
|
@@ -6860,10 +6980,17 @@ BEGIN
|
|
|
ELSIF tok = TkGoto THEN
|
|
|
v := 0 ;
|
|
|
Skip () ; (* after the GOTO keyword: skip blanks *)
|
|
|
- IF Digit (CurCh ()) THEN
|
|
|
+ IF Alpha (CurCh ()) THEN
|
|
|
+ GetWord () ;
|
|
|
+ SaveWord (nm)
|
|
|
+ ELSIF Digit (CurCh ()) THEN
|
|
|
RdIntConst (v) ;
|
|
|
- NumToName (W16 (v), nm) ;
|
|
|
- IF Search (nm, idx) THEN
|
|
|
+ NumToName (W16 (v), nm)
|
|
|
+ ELSE
|
|
|
+ Err (EUnknown) ;
|
|
|
+ RETURN
|
|
|
+ END ;
|
|
|
+ IF Search (nm, idx) THEN
|
|
|
IF symtab [idx].tag = KLabel THEN
|
|
|
IF symtab [idx].defnd THEN
|
|
|
DropC (EmJmpNear (symtab [idx].goPos))
|
|
|
@@ -6874,13 +7001,10 @@ BEGIN
|
|
|
ELSE
|
|
|
Err (EUnknown)
|
|
|
END
|
|
|
- ELSE
|
|
|
- idx := NewSym (nm, KLabel, TScalar, 0, 0, 0, 0, FALSE) ;
|
|
|
- zj := EmJmpNear (0) ;
|
|
|
- AddPend (0, idx, zj)
|
|
|
- END
|
|
|
ELSE
|
|
|
- Err (EUnknown)
|
|
|
+ idx := NewSym (nm, KLabel, TScalar, 0, 0, 0, 0, FALSE) ;
|
|
|
+ zj := EmJmpNear (0) ;
|
|
|
+ AddPend (0, idx, zj)
|
|
|
END
|
|
|
ELSIF tok = TkExit THEN
|
|
|
IF brkN = 0 THEN
|
|
|
@@ -7025,6 +7149,7 @@ VAR tok : CARDINAL ;
|
|
|
isCharRange : BOOLEAN ;
|
|
|
consumed : BOOLEAN ;
|
|
|
running, groupFirst, i, an, recStart : CARDINAL ;
|
|
|
+ innerIdx, innerN, leafElem, leafCls, j : CARDINAL ;
|
|
|
alo, ahi : ARRAY [0..3] OF LONGINT ;
|
|
|
ecls2 : CARDINAL ;
|
|
|
BEGIN
|
|
|
@@ -7044,9 +7169,16 @@ BEGIN
|
|
|
RETURN
|
|
|
END ;
|
|
|
GetWord () ;
|
|
|
- IF NOT Search (wrd, idx) OR (symtab [idx].tag # KType) THEN
|
|
|
- Err (ESimpType) ;
|
|
|
- RETURN
|
|
|
+ IF Search (wrd, idx) THEN
|
|
|
+ IF symtab [idx].tag # KType THEN
|
|
|
+ Err (ESimpType) ;
|
|
|
+ RETURN
|
|
|
+ END
|
|
|
+ ELSE
|
|
|
+ (* Forward type reference: `Next : ^Person' before the record is
|
|
|
+ declared. Create a placeholder that DefType will fill. *)
|
|
|
+ idx := NewSym (wrd, KType, TNone, 0, 0, 0, 0, FALSE) ;
|
|
|
+ symtab [idx].fwd := TRUE
|
|
|
END ;
|
|
|
cls := TPtr ;
|
|
|
size := 2 ;
|
|
|
@@ -7145,8 +7277,22 @@ BEGIN
|
|
|
END ;
|
|
|
ParseType (cls, s2, e2) ;
|
|
|
ecls2 := cls ;
|
|
|
+ innerIdx := newArrIdx ;
|
|
|
+ IF (cls = TArray) AND (innerIdx > 0) THEN
|
|
|
+ (* Flatten array-of-array: the outer symbol must index the same
|
|
|
+ number of dimensions as `array[a,b]'. A named element array
|
|
|
+ (`Airplane = array[...] of Dog_Food') carries its shape in the
|
|
|
+ inner ArrRec; keep only the leaf element size and class here. *)
|
|
|
+ leafElem := arrs [innerIdx - 1].elem ;
|
|
|
+ leafCls := arrs [innerIdx - 1].ecls ;
|
|
|
+ innerN := arrs [innerIdx - 1].n
|
|
|
+ ELSE
|
|
|
+ leafElem := s2 ;
|
|
|
+ leafCls := ecls2 ;
|
|
|
+ innerN := 0
|
|
|
+ END ;
|
|
|
cls := TArray ;
|
|
|
- elem := s2 ;
|
|
|
+ elem := leafElem ;
|
|
|
size := s2 ;
|
|
|
i := 0 ;
|
|
|
WHILE i < an DO
|
|
|
@@ -7154,18 +7300,24 @@ BEGIN
|
|
|
- VAL (LONGINT, W16 (alo [i])) + 1) ;
|
|
|
INC (i)
|
|
|
END ;
|
|
|
- (* register the shape so indexing can scale by element size and subtract
|
|
|
- each lower bound; the symbol points at this slot *)
|
|
|
- IF arrTop < MaxArrs THEN
|
|
|
- arrs [arrTop].n := an ;
|
|
|
- arrs [arrTop].elem := s2 ;
|
|
|
- arrs [arrTop].ecls := ecls2 ;
|
|
|
+ (* register the flattened shape so indexing can scale by leaf element
|
|
|
+ size and subtract each lower bound; the symbol points at this slot *)
|
|
|
+ IF (an + innerN <= 4) AND (arrTop < MaxArrs) THEN
|
|
|
+ arrs [arrTop].n := an + innerN ;
|
|
|
+ arrs [arrTop].elem := leafElem ;
|
|
|
+ arrs [arrTop].ecls := leafCls ;
|
|
|
i := 0 ;
|
|
|
WHILE i < an DO
|
|
|
arrs [arrTop].lo [i] := alo [i] ;
|
|
|
arrs [arrTop].hi [i] := ahi [i] ;
|
|
|
INC (i)
|
|
|
END ;
|
|
|
+ j := 0 ;
|
|
|
+ WHILE j < innerN DO
|
|
|
+ arrs [arrTop].lo [an + j] := arrs [innerIdx - 1].lo [j] ;
|
|
|
+ arrs [arrTop].hi [an + j] := arrs [innerIdx - 1].hi [j] ;
|
|
|
+ INC (j)
|
|
|
+ END ;
|
|
|
newArrIdx := arrTop + 1 ;
|
|
|
INC (arrTop)
|
|
|
ELSE
|
|
|
@@ -7653,21 +7805,25 @@ BEGIN
|
|
|
END DefConst ;
|
|
|
|
|
|
PROCEDURE DefLabelPart () ;
|
|
|
-VAR nm : ARRAY [0..9] OF CHAR ;
|
|
|
+VAR nm : ARRAY [0..MaxName] OF CHAR ;
|
|
|
n : CARDINAL ;
|
|
|
BEGIN
|
|
|
LOOP
|
|
|
Skip () ;
|
|
|
- IF NOT Digit (CurCh ()) THEN
|
|
|
+ IF Alpha (CurCh ()) THEN
|
|
|
+ GetWord () ;
|
|
|
+ SaveWord (nm)
|
|
|
+ ELSIF Digit (CurCh ()) THEN
|
|
|
+ n := 0 ;
|
|
|
+ WHILE Digit (CurCh ()) DO
|
|
|
+ n := n * 10 + (ORD (CurCh ()) - ORD ('0')) ;
|
|
|
+ DropCh (GetCh ())
|
|
|
+ END ;
|
|
|
+ NumToName (n, nm)
|
|
|
+ ELSE
|
|
|
Err (EUnknown) ;
|
|
|
RETURN
|
|
|
END ;
|
|
|
- n := 0 ;
|
|
|
- WHILE Digit (CurCh ()) DO
|
|
|
- n := n * 10 + (ORD (CurCh ()) - ORD ('0')) ;
|
|
|
- DropCh (GetCh ())
|
|
|
- END ;
|
|
|
- NumToName (n, nm) ;
|
|
|
IF NOT Search (nm, n) THEN
|
|
|
DropC (NewSym (nm, KLabel, TScalar, 0, 0, 0, 0, FALSE))
|
|
|
END ;
|
|
|
@@ -8036,7 +8192,15 @@ BEGIN
|
|
|
END ;
|
|
|
HideLocals (nestMark) ; (* parameters and locals stop here *)
|
|
|
IF reusedFwd THEN
|
|
|
- HideLocals (symtab [old].parmFirst)
|
|
|
+ (* Hide only the forward's parameter range. HideLocals starts at
|
|
|
+ parmFirst and would also hide every procedure declared between the
|
|
|
+ forward and its definition; t120's `B' disappeared when A was
|
|
|
+ defined that way. *)
|
|
|
+ i := symtab [old].parmFirst ;
|
|
|
+ WHILE i < symtab [old].parmFirst + symtab [old].parmCount DO
|
|
|
+ symtab [i].level := 0FFFFH ;
|
|
|
+ INC (i)
|
|
|
+ END
|
|
|
END ;
|
|
|
lexnest := saveNest ;
|
|
|
locFree := saveLoc ;
|
|
|
@@ -8068,13 +8232,25 @@ BEGIN
|
|
|
END ;
|
|
|
GetWord () ;
|
|
|
SaveWord (nm) ;
|
|
|
- DupTest (nm) ;
|
|
|
+ (* A type name may already exist as a forward placeholder created by
|
|
|
+ `Next : ^Person' before `Person = record'. Reuse that entry; only a
|
|
|
+ real duplicate is an error. *)
|
|
|
+ IF Search (nm, tidx) AND (symtab [tidx].tag = KType)
|
|
|
+ AND (symtab [tidx].cls = TNone) THEN
|
|
|
+ (* fill the placeholder below *)
|
|
|
+ ELSE
|
|
|
+ DupTest (nm) ;
|
|
|
+ tidx := NewSym (nm, KType, TNone, 0, 0, 0, 0, FALSE)
|
|
|
+ END ;
|
|
|
ExpectDelim ('=', ENoSemi) ;
|
|
|
ParseType (cls, size, elem) ;
|
|
|
IF NOT OK () THEN
|
|
|
RETURN
|
|
|
END ;
|
|
|
- tidx := NewSym (nm, KType, cls, size, elem, 0, 0, FALSE) ;
|
|
|
+ symtab [tidx].cls := cls ;
|
|
|
+ symtab [tidx].size := size ;
|
|
|
+ symtab [tidx].elem := elem ;
|
|
|
+ symtab [tidx].fwd := FALSE ;
|
|
|
IF cls = TEnum THEN
|
|
|
(* the enumeration's bounds, set by ParseType, belong to the type - so
|
|
|
`set of Attributes' can size its base (0..n-1, one byte) *)
|
|
|
@@ -8404,6 +8580,9 @@ BEGIN
|
|
|
TU_WrInt := RT_Entry (3) ;
|
|
|
TU_WrChar := RT_Entry (4) ;
|
|
|
TU_WrBool := RT_Entry (5) ;
|
|
|
+ TU_WrCharW := RT_Entry (56) ;
|
|
|
+ TU_WrBoolW := RT_Entry (57) ;
|
|
|
+ TU_WrStrW := RT_Entry (58) ;
|
|
|
TU_WrReal := RT_Entry (6) ;
|
|
|
TU_RealWrite := RT_Entry (30) ; (* fmtreal + padding + output *)
|
|
|
TU_RealFmt := RT_Entry (28) ; (* fmtreal into a string variable *)
|