home *** CD-ROM | disk | FTP | other *** search
- ⓪ IMPLEMENTATION MODULE CompTree;
- ⓪
- ⓪ (*$Y+,H+,Z+*)
- ⓪
- ⓪ (*
- ⓪ IMPORT TOSDebug;
- ⓪ *)
- ⓪
- ⓪ (*$N+*)
- ⓪ IMPORT Runtime;
- ⓪ FROM SYSTEM IMPORT ADDRESS, ASSEMBLER, BYTE;
- ⓪ FROM Strings IMPORT String, StrEqual, Assign, Append;
- ⓪ FROM Storage IMPORT ALLOCATE, DEALLOCATE, MemAvail;
- ⓪ IMPORT Files, Binary;
- ⓪
- ⓪ TYPE PtrPtr = POINTER TO PtrItem;
- ⓪
- ⓪ VAR Code: ADDRESS;
- ⓪$ok: BOOLEAN;
- ⓪
- ⓪ PROCEDURE ptr (item: PtrItem; ofs: LONGINT): PtrItem;
- ⓪"(*$L-*)
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(MOVE.L -(A3),A0
- ⓪(ADDA.L -(A3),A0
- ⓪(ADDA.L TreeBase,A0
- ⓪(MOVE.L (A0),D0
- ⓪$END
- ⓪"END ptr;
- ⓪"(*$L=*)
- ⓪
- ⓪ PROCEDURE long (item: PtrItem; ofs: LONGINT): LONGCARD;
- ⓪"(*$L-*)
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(MOVE.L -(A3),A0
- ⓪(ADDA.L -(A3),A0
- ⓪(ADDA.L TreeBase,A0
- ⓪(MOVE.L (A0),D0
- ⓪$END
- ⓪"END long;
- ⓪"(*$L=*)
- ⓪
- ⓪ PROCEDURE card (item: PtrItem; ofs: LONGINT): CARDINAL;
- ⓪"(*$L-*)
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(MOVE.L -(A3),A0
- ⓪(ADDA.L -(A3),A0
- ⓪(ADDA.L TreeBase,A0
- ⓪(MOVE.W (A0),D0
- ⓪$END
- ⓪"END card;
- ⓪"(*$L=*)
- ⓪
- ⓪ PROCEDURE int (item: PtrItem; ofs: LONGINT): INTEGER;
- ⓪"(*$L-*)
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(MOVE.L -(A3),A0
- ⓪(ADDA.L -(A3),A0
- ⓪(ADDA.L TreeBase,A0
- ⓪(MOVE.W (A0),D0
- ⓪$END
- ⓪"END int;
- ⓪"(*$L=*)
- ⓪
- ⓪ PROCEDURE byte (item: PtrItem; ofs: LONGINT): BYTE;
- ⓪"(*$L-*)
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(MOVE.L -(A3),A0
- ⓪(ADDA.L -(A3),A0
- ⓪(ADDA.L TreeBase,A0
- ⓪(MOVE.B (A0),D0
- ⓪$END
- ⓪"END byte;
- ⓪"(*$L=*)
- ⓪
- ⓪ (*$D-*)
- ⓪
- ⓪ PROCEDURE ScanWholeTree (scanner: TreeProc; new: NewTreeProc);
- ⓪"VAR tr: PtrItem; sp: PtrPtr; tt: TreeType;
- ⓪"BEGIN
- ⓪$sp:= PtrPtr (DisplayStack);
- ⓪$LOOP
- ⓪&tr:= sp^;
- ⓪&IF tr = 1 THEN EXIT END;
- ⓪&INC (sp, SIZE (sp^));
- ⓪&IF tr = 0 THEN
- ⓪(IF new (newscope) THEN END
- ⓪&ELSE
- ⓪(IF sp^ = 1 THEN tt:= global ELSE tt:= local END;
- ⓪(IF new (tt) THEN
- ⓪*ScanLocalTree (scanner, tr)
- ⓪(END
- ⓪&END
- ⓪$END;
- ⓪$(* Relocation Stack abarbeiten (lokale Module) *)
- ⓪$sp:= RelocationStack;
- ⓪$WHILE sp^ # NoItem DO
- ⓪&IF new (module) THEN
- ⓪(ScanLocalTree (scanner, sp^);
- ⓪&END;
- ⓪&INC (sp, SIZE (sp^))
- ⓪$END;
- ⓪$IF new (pervasive) THEN
- ⓪&ScanLocalTree (scanner, 0); (* pervasives *)
- ⓪$END
- ⓪"END ScanWholeTree;
- ⓪
- ⓪ PROCEDURE fetch (VAR ptr: PtrItem; VAR name: ARRAY OF CHAR);
- ⓪"(*
- ⓪#* Liest Namen aus Baum ein. 'ptr' muß auf das Zeichen vor dem Namen zeigen
- ⓪#* hinterher zeigt 'ptr' hinter den Text.
- ⓪#*)
- ⓪"VAR (*$Reg*)c: CARDINAL; (*$Reg*)by: BYTE;
- ⓪"BEGIN
- ⓪$c:= 0;
- ⓪$LOOP
- ⓪&IF (c+1) > HIGH (name) THEN HALT END;
- ⓪&DEC (ptr);
- ⓪&by:= byte (ptr, 0);
- ⓪&IF ORD (by) >= $FE THEN
- ⓪(IF ORD (byte (ptr, 0)) = $FE THEN DEC (ptr); END;
- ⓪(IF c = 0 THEN
- ⓪*name[0]:= '*'; (* anonym-Kennung *)
- ⓪*c:= 1
- ⓪(END;
- ⓪(name[c]:= 0C;
- ⓪(RETURN
- ⓪&END;
- ⓪&name [c]:= CHR (ORD (by));
- ⓪&INC (c)
- ⓪$END
- ⓪"END fetch;
- ⓪
- ⓪ (*$D-*)
- ⓪
- ⓪ PROCEDURE ScanLocalTree (scanner: TreeProc; tree: PtrItem);
- ⓪
- ⓪"FORWARD scan (tree: PtrItem);
- ⓪
- ⓪"PROCEDURE doit (it: PtrItem);
- ⓪$VAR name: String; c: CARDINAL;
- ⓪$BEGIN
- ⓪&fetch (it, name);
- ⓪&(* Relays werden direkt gemeldet
- ⓪(IF ORD (byte (it, -1)) = 0 THEN
- ⓪*(* relay *)
- ⓪*it:= ptr (it, -6)
- ⓪(END;
- ⓪&*)
- ⓪&(* IF int (it, -2) < 0 THEN (* kein Modula-Wort, sondern User-ID *) *)
- ⓪((* auch dies muß der 'scanner' selbst veranlassen
- ⓪*c:= ORD (byte (it, -1));
- ⓪*IF (c=15) (* lok.Modul *) OR (c=16) (* qualifier *) THEN
- ⓪,IF ptr (it, -6) # NoItem THEN scan (ptr (it, -6)) END
- ⓪*END;
- ⓪(*)
- ⓪(scanner (name, it)
- ⓪&(* END *)
- ⓪$END doit;
- ⓪
- ⓪"PROCEDURE scan (tree: PtrItem);
- ⓪$(* lokale Funktion, um Stackplatz f. Rekursion zu sparen *)
- ⓪$VAR it: PtrItem;
- ⓪$BEGIN
- ⓪&(* linker Ast *)
- ⓪&it:= ptr (tree, -4);
- ⓪&IF it # NoItem THEN
- ⓪(scan (it);
- ⓪&END;
- ⓪&(* rechter Ast *)
- ⓪&it:= ptr (tree, -8);
- ⓪&IF it # NoItem THEN
- ⓪(scan (it);
- ⓪&END;
- ⓪&doit (tree - 8)
- ⓪$END scan;
- ⓪$
- ⓪"BEGIN
- ⓪$scan (tree);
- ⓪"END ScanLocalTree;
- ⓪
- ⓪ PROCEDURE FindItemByName (REF name: ARRAY OF CHAR; VAR item: PtrItem);
- ⓪"
- ⓪"PROCEDURE scanTree (REF currname: ARRAY OF CHAR; curritem: PtrItem);
- ⓪$BEGIN
- ⓪&(* nur ersten gefundenen Namen übernehmen *)
- ⓪&IF item = NoItem THEN
- ⓪(IF StrEqual (name, currname) THEN
- ⓪*item:= curritem
- ⓪(END
- ⓪&END
- ⓪$END scanTree;
- ⓪"
- ⓪"PROCEDURE newTree (typ: TreeType): BOOLEAN;
- ⓪$BEGIN
- ⓪&(* nur lokale/globale Level *)
- ⓪&RETURN (typ <= global)
- ⓪$END newTree;
- ⓪"
- ⓪"BEGIN
- ⓪$item:= NoItem;
- ⓪$ScanWholeTree (scanTree, newTree);
- ⓪"END FindItemByName;
- ⓪
- ⓪ PROCEDURE GetNameOfItem (item: PtrItem;
- ⓪9VAR name: ARRAY OF CHAR; VAR found: BOOLEAN);
- ⓪"
- ⓪"PROCEDURE scanTree (REF currname: ARRAY OF CHAR; curritem: PtrItem);
- ⓪$BEGIN
- ⓪&IF item = curritem THEN
- ⓪(found:= TRUE;
- ⓪(Assign (currname, name, ok)
- ⓪&END
- ⓪$END scanTree;
- ⓪"
- ⓪"PROCEDURE newTree (typ: TreeType): BOOLEAN;
- ⓪$BEGIN
- ⓪&(* alle Level *)
- ⓪&RETURN TRUE
- ⓪$END newTree;
- ⓪"
- ⓪"BEGIN
- ⓪$found:= FALSE;
- ⓪$name[0]:= 0C;
- ⓪$ScanWholeTree (scanTree, newTree);
- ⓪"END GetNameOfItem;
- ⓪
- ⓪ PROCEDURE GetItemDesc (item: PtrItem; VAR desc: ItemDesc): BOOLEAN;
- ⓪"BEGIN
- ⓪$IF item = NoItem THEN
- ⓪&RETURN FALSE
- ⓪$ELSE
- ⓪&WITH desc DO
- ⓪(flag:= ItemFlags (byte (item, -2));
- ⓪(kind:= ORD (byte (item, -1))
- ⓪&END;
- ⓪&RETURN TRUE
- ⓪$END
- ⓪"END GetItemDesc;
- ⓪
- ⓪ PROCEDURE SystemType (REF desc: ItemDesc): BOOLEAN;
- ⓪"TYPE FS = SET OF [0..63];
- ⓪"BEGIN
- ⓪$RETURN desc.kind IN FS {1,2,3,4,21,22,23,24,25,26,27,29,
- ⓪<30,31,33,34,35,36,37,38,39,40,41,43}
- ⓪"END SystemType;
- ⓪"
- ⓪ PROCEDURE Kind (REF desc: ItemDesc): String;
- ⓪"VAR name: String;
- ⓪"BEGIN
- ⓪$CASE desc.kind OF
- ⓪$| 0: name:= "Relay"
- ⓪$| 1: name:= "LONGINT"
- ⓪$| 2: name:= "LONGREAL"
- ⓪$| 3: name:= "CHAR"
- ⓪$| 4: name:= "ZZ"
- ⓪$| 5: name:= "SET(large)"
- ⓪$| 6: name:= "Prozedur"
- ⓪$| 7: name:= "Parameter"
- ⓪$| 8: name:= "Opaque"
- ⓪$| 9: name:= "Enum-Typ"
- ⓪$|10: name:= "Enum-Elem"
- ⓪$|11: name:= "Subrange"
- ⓪$|12: name:= "ARRAY"
- ⓪$|13: name:= "RECORD"
- ⓪$|14: name:= "Rec-Feld"
- ⓪$|15: name:= "Lok.Modul"
- ⓪$|16: name:= "Qualifier"
- ⓪$|17: name:= "Variable"
- ⓪$|18: name:= "CONST(old)"
- ⓪$|19: name:= "PROCEDURE"
- ⓪$|20: name:= "POINTER"
- ⓪$|21: name:= "WORD"
- ⓪$|22: name:= "LONGCARD"
- ⓪$|23: name:= "ADDRESS"
- ⓪$|24: name:= "BOOLEAN"
- ⓪$|25: name:= "Opaque"
- ⓪$|26: name:= "LONGWORD"
- ⓪$|27: name:= "String"
- ⓪$|28: name:= "TABLE"
- ⓪$|29: name:= "Asm-Label"
- ⓪$|30: name:= "LONGBOTH"
- ⓪$|31: name:= "StrConst"
- ⓪$|32: name:= "OpenArray"
- ⓪$|33: name:= "INTEGER"
- ⓪$|34: name:= "CARDINAL"
- ⓪$|35: name:= "SHORTBOTH"
- ⓪$|36: name:= "StdFunc"
- ⓪$|37: name:= "StdFunc-Parm"
- ⓪$|38: name:= "BYTE"
- ⓪$|39: name:= "BYTE(signed)"
- ⓪$|40: name:= "REAL"
- ⓪$|41: name:= "BITNUM"
- ⓪$|42: name:= "LongOpArr"
- ⓪$|43: name:= "StructConst"
- ⓪$|44: name:= "Long-PROC-Typ"
- ⓪$|45: name:= "SET(32Bit)"
- ⓪$|46: name:= "Tag-Field"
- ⓪$|47: name:= "Rec-Variante"
- ⓪$|50: name:= "CONST(new)"
- ⓪$ELSE
- ⓪&name:= "???"
- ⓪$END;
- ⓪$RETURN name;
- ⓪"END Kind;
- ⓪
- ⓪ PROCEDURE flag (REF desc: ItemDesc; flagNo: CARDINAL): String;
- ⓪"VAR name: String;
- ⓪"BEGIN
- ⓪$WITH desc DO
- ⓪&CASE flagNo OF
- ⓪&| 7: name:= "Userdef"
- ⓪&| 6: name:= "Exported"
- ⓪&| 5: name:= "Imported"
- ⓪&| 4: name:= "External"
- ⓪&| 3: name:= "VAR-Parm"
- ⓪&| 2: name:= "Type"
- ⓪&| 1: IF 2 IN flag THEN name:= "Anonym" ELSE name:= "Global" END
- ⓪&| 0: IF 2 IN flag THEN name:= "Scalar" ELSIF kind = 17 THEN
- ⓪,name:= "Read-only" ELSE name:= "D0-Return" END
- ⓪&END
- ⓪$END;
- ⓪$RETURN name;
- ⓪"END flag;
- ⓪
- ⓪ PROCEDURE Flags (REF desc: ItemDesc): String;
- ⓪"VAR name: String; i: CARDINAL; first: BOOLEAN;
- ⓪"BEGIN
- ⓪$name[0]:= 0C;
- ⓪$first:= TRUE;
- ⓪$FOR i:= 7 TO 0 BY -1 DO
- ⓪&IF i IN desc.flag THEN
- ⓪(IF NOT first THEN Append ('/', name, ok); END;
- ⓪(Append (flag (desc, i), name, ok);
- ⓪(first:= FALSE
- ⓪&END
- ⓪$END;
- ⓪$RETURN name;
- ⓪"END Flags;
- ⓪
- ⓪ PROCEDURE ItemTable;
- ⓪"(*$L-*)
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(DC.W 0,1,0 ;Relay
- ⓪(DC.W 6,2,1,1,2,7,8,0 ;PROC
- ⓪(DC.W 5,2,1,0 ;SET
- ⓪(DC.W 45,2,1,0 ;SET (neue Ordnung)
- ⓪(DC.W 7,1,1,3,0 ;PARAM
- ⓪(DC.W 8,2,0 ;REDECLARABLE OPAQUE
- ⓪(DC.W 9,2,2,5,0 ;ENUM
- ⓪(DC.W 10,3,1,5,0 ;ENUM.ELEMENT
- ⓪(DC.W 11,2,2,2,1,0 ;SUBR
- ⓪(DC.W 12,2,1,1,0 ;ARRAY
- ⓪(DC.W 13,2,1,4,0 ;RECORD
- ⓪(DC.W 14,2,1,1,0 ;REC.FELD
- ⓪(DC.W 15,4,0 ;Lok. Modul
- ⓪(DC.W 16,4,0 ;Qualifier
- ⓪(DC.W 17,2,1,2,7,2,0;VAR
- ⓪(DC.W 18,1,6,0 ;CONST
- ⓪(DC.W 19,2,1,1,0 ;PROC.TYPE
- ⓪(DC.W 20,2,1,0 ;PTR
- ⓪(DC.W 25,2,0 ;OPAQUE
- ⓪(DC.W 27,2,2,0 ;STRING
- ⓪(DC.W 32,1,0 ;OPEN ARRAY
- ⓪(DC.W 42,1,0 ;OPEN LONGARRAY
- ⓪(DC.W 1,2,0 ;LINT
- ⓪(DC.W 2,2,0 ;LONGREAL
- ⓪(DC.W 3,2,0 ;CHAR
- ⓪(DC.W 4,2,0 ;ZZ
- ⓪(DC.W 21,2,0 ;WORD
- ⓪(DC.W 22,2,0 ;LCARD
- ⓪(DC.W 23,2,1,0 ;ADDRESS
- ⓪(DC.W 24,2,0 ;BOOLEAN
- ⓪(DC.W 26,2,0 ;LONG
- ⓪(DC.W 30,2,0 ;LBOTH
- ⓪(DC.W 33,2,0 ;SINT
- ⓪(DC.W 34,2,0 ;SCARD
- ⓪(DC.W 35,2,0 ;SBOTH
- ⓪(DC.W 36,3,1,0 ;StandardProc
- ⓪(DC.W 37,1,1,1,0 ;StandardProcParams
- ⓪(DC.W 38,2,0 ;BYTE
- ⓪(DC.W 39,2,0 ;Signed BYTE
- ⓪(DC.W 40,2,0 ;REAL
- ⓪(DC.W 41,2,0 ;BITNUM
- ⓪(DC.W 43,2,0 ;untyped Constant
- ⓪(DC.W 44,2,1,0 ;PROC.TYPE bei Parametern (8 Byte Länge)
- ⓪(DC.W 46,1,2,2,1,0 ;Record-Tag
- ⓪(DC.W 47,2,1,1,1,1,0;Rec-Variante
- ⓪(DC.W 50,2,1,7,4,6,0 ;CONST neu (nun incl. String-Literals)
- ⓪(DC.W 63,0 ;Dummy-Eintrag
- ⓪(DC.W 0
- ⓪$END
- ⓪"END ItemTable;
- ⓪"(*$L=*)
- ⓪
- ⓪ PROCEDURE ScanItem (scanner: ItemProc; item: PtrItem);
- ⓪"VAR no: CARDINAL; pt: POINTER TO CARDINAL; entry: ItemEntry; ofs: INTEGER;
- ⓪"BEGIN
- ⓪$no:= ORD (byte (item, -1));
- ⓪$(* zuerst die Item-Beschreibung in der Tabelle suchen *)
- ⓪$ASSEMBLER
- ⓪(LEA ItemTable,A0
- ⓪(MOVE.L A0,pt(A6)
- ⓪$END;
- ⓪$LOOP
- ⓪&IF no = pt^ THEN EXIT END;
- ⓪&REPEAT INC (pt, 2); UNTIL pt^ = 0;
- ⓪&INC (pt, 2);
- ⓪&IF pt^ = 0 THEN HALT END (* Nicht gefunden! *)
- ⓪$END;
- ⓪$INC (pt, 2);
- ⓪$ofs:= -2;
- ⓪$LOOP
- ⓪&no:= pt^;
- ⓪&IF no = 0 THEN EXIT END;
- ⓪&INC (pt, 2);
- ⓪&WITH entry DO
- ⓪(name:= '';
- ⓪(CASE no OF
- ⓪(| 1,5: type:= pointer; DEC (ofs, 4); ptrVal:= ptr (item, ofs);
- ⓪(| 2: type:= const; DEC (ofs, 4); constVal:= long (item, ofs);
- ⓪(| 3: type:= const; DEC (ofs, 2); constVal:= card (item, ofs);
- ⓪(| 4: type:= scope; DEC (ofs, 4); ptrVal:= ptr (item, ofs);
- ⓪(| 6: DEC (ofs, 2);
- ⓪(| 7: DEC (ofs, pt^); INC (pt, 2);
- ⓪(ELSE
- ⓪*HALT
- ⓪(END
- ⓪&END;
- ⓪&IF no <= 5 THEN scanner (entry, pt^ # 0) END;
- ⓪$END;
- ⓪"END ScanItem;
- ⓪
- ⓪ PROCEDURE LoadDef (REF name: ARRAY OF CHAR);
- ⓪"VAR size, l: LONGCARD; f: Files.File;
- ⓪"BEGIN
- ⓪$IF Buffer # NIL THEN DEALLOCATE (Buffer, 0) END;
- ⓪$
- ⓪$size:= MemAvail () DIV 2; IF ODD (size) THEN DEC (size) END;
- ⓪$ALLOCATE (Buffer, size);
- ⓪$IF Buffer = NIL THEN HALT END;
- ⓪$
- ⓪$Files.Open (f, name, Files.readOnly);
- ⓪$IF Binary.FileSize (f) * 4 > size THEN HALT END;
- ⓪$Binary.ReadBytes (f, Buffer, Binary.FileSize (f), l);
- ⓪$IF Binary.FileSize (f) # l THEN HALT END;
- ⓪$Files.Close (f);
- ⓪$
- ⓪$Code:= Buffer + 8;
- ⓪$
- ⓪$(* ächz! *)
- ⓪$
- ⓪"END LoadDef;
- ⓪
- ⓪ END CompTree.
- ⓪ ə
- (* $FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$00002315$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EE$FFEB02EEÇ$00001631T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00001630$00001923$00002315$000022D9$00000CA6$00000ACD$00000B08$00000759$FFE9B44A$FFE9B44A$FFE9B44A$00000759$000005C3$000013FD$0000190C$00001923ÉÇé*)
-