1 (***********************************************************************)
2 (* Component Pascal Make Tool *)
4 (* Diane Corney, 20th July 1999 *)
8 (***********************************************************************)
20 ModName
* = LitValue
.CharOpen
;
22 ModInfo
* = POINTER TO ModInfoRec
;
26 list
* : POINTER TO ARRAY OF ModInfo
;
29 KeyList
* = POINTER TO ARRAY OF INTEGER;
34 importedBy
* : ModList
;
35 importKeys
* : KeyList
;
40 importsLinked
* : BOOLEAN;
43 ModTree
* = POINTER TO RECORD
52 PROCEDURE Add
* (VAR modList
: ModList
; mod
: ModInfo
);
54 tmp
: POINTER TO ARRAY OF ModInfo
;
57 IF modList
.list
= NIL THEN
58 NEW(modList
.list
,listIncrement
);
61 FOR i
:= 0 TO modList
.tide
- 1 DO
62 IF mod
= modList
.list
[i
] THEN RETURN; END;
64 IF modList
.tide
>= LEN(modList
.list
) THEN
66 NEW(modList
.list
,(LEN(modList
.list
) + listIncrement
));
67 FOR i
:= 0 TO modList
.tide
- 1 DO
68 modList
.list
[i
] := tmp
[i
];
72 modList
.list
[modList
.tide
] := mod
;
76 PROCEDURE AddKey
*(thisMod
, impMod
: ModInfo
; impKey
: INTEGER);
80 tmp
: POINTER TO ARRAY OF INTEGER;
82 mods
:= thisMod
.imports
;
83 IF (thisMod
.importKeys
= NIL) OR
84 (LEN(thisMod
.importKeys
) < LEN(mods
.list
)) THEN
85 tmp
:= thisMod
.importKeys
;
86 NEW(thisMod
.importKeys
,LEN(mods
.list
));
88 FOR i
:= 0 TO LEN(tmp
)-1 DO
89 thisMod
.importKeys
[i
] := tmp
[i
];
94 WHILE (i
< LEN (mods
.list
)) & (mods
.list
[i
] # impMod
) DO INC(i
); END;
95 IF (i
< LEN (mods
.list
)) THEN thisMod
.importKeys
[i
] := impKey
; END;
98 PROCEDURE GetKey
*(thisMod
: ModInfo
; impMod
: ModInfo
) : INTEGER;
102 (* Assert: impMod is in imports list of thisMod *)
104 WHILE (thisMod
.imports
.list
[ix
] # impMod
) DO INC(ix
); END;
105 RETURN thisMod
.importKeys
[ix
];
108 PROCEDURE NewModInfo(modName
: ModName
) : ModInfo
;
115 mod
.compile
:= FALSE
;
117 mod
.isForeign
:= FALSE
;
118 mod
.importsLinked
:= FALSE
;
119 mod
.imports
.tide
:= 0;
120 NEW(mod
.imports
.list
, listIncrement
);
121 mod
.importedBy
.tide
:= 0;
125 PROCEDURE GetModule
*(modName
: ModName
) : ModInfo
;
128 node
, parent
: ModTree
;
131 IF (modules
= NIL) THEN
133 modules
.module
:= NewModInfo(modName
);
134 RETURN modules
.module
;
140 WHILE (node
# NIL) & (~found
) DO
142 IF node
.module
.name^
= modName^
THEN
145 ELSIF modName^
< node
.module
.name^
THEN
152 ASSERT(parent
# NIL);
154 mod
:= NewModInfo(modName
);
156 IF modName^
< parent
.module
.name^
THEN
159 parent
.right
:= node
;