now works!

This commit is contained in:
Norayr Chilingarian 2022-01-19 04:19:52 +04:00
parent 32679a8852
commit c5c999f596
2 changed files with 67 additions and 9 deletions

View file

@ -29,6 +29,26 @@ BEGIN
RETURN res; RETURN res;
END treeContains; END treeContains;
PROCEDURE treeContainsByName(VAR d: Tdep; VAR depTree: TdepTree): BOOLEAN;
VAR
res: BOOLEAN;
i: INTEGER;
d2: Tdep;
BEGIN
res := FALSE;
i := 0;
REPEAT
d2 := depTree.Get(depTree, i);
IF d2 # NIL THEN
IF d.name^ = d2.name^ THEN res := TRUE END;
(*IF d.name^ = d2.name^ THEN res := TRUE END *)
END;
INC(i)
UNTIL res OR (i >= depTree.Count);
RETURN res;
END treeContainsByName;
PROCEDURE mkDepTree(VAR d: Tdep; VAR depTree, met: TdepTree); PROCEDURE mkDepTree(VAR d: Tdep; VAR depTree, met: TdepTree);
VAR VAR
depStrs: StringList.TStringList; depStrs: StringList.TStringList;
@ -38,7 +58,7 @@ VAR
i: INTEGER; i: INTEGER;
rtrvRes: LONGINT; rtrvRes: LONGINT;
BEGIN BEGIN
met.Add(met, d); vpkdepTree.Add(met, d);
IF d.RetrieveDeps = NIL THEN Out.String("dep retriever method not installed"); Out.Ln; HALT(1) END; IF d.RetrieveDeps = NIL THEN Out.String("dep retriever method not installed"); Out.Ln; HALT(1) END;
rtrvRes := d.RetrieveDeps(d, depStrs); rtrvRes := d.RetrieveDeps(d, depStrs);
IF rtrvRes = -1 THEN IF rtrvRes = -1 THEN
@ -55,28 +75,29 @@ BEGIN
REPEAT REPEAT
p := depStrs.GetString(depStrs, i); p := depStrs.GetString(depStrs, i);
IF p # NIL THEN IF p # NIL THEN
t := NIL;
t := met.GetByName(met, p^); t := met.GetByName(met, p^);
IF t = NIL THEN IF t = NIL THEN
t := vpkdepTree.CreateDep(p^); t := vpkdepTree.CreateDep(p^);
t.InstallRetriever(t, rtvr); t.InstallRetriever(t, rtvr);
END; END;
deps[i] := t; deps[i] := t;
IF ~treeContains(t, depTree) THEN IF ~treeContainsByName(t, depTree) THEN
IF treeContains(t, met) THEN IF treeContainsByName(t, met) THEN
Out.Ln; Out.String("curcular dependency: "); Out.Ln; Out.String("curcular dependency: ");
Out.String(d.name^); Out.String(" requires "); Out.String(t.name^); Out.Ln; Out.String(d.name^); Out.String(" requires "); Out.String(t.name^); Out.Ln;
Out.String("unable to continue."); Out.Ln; Out.String("unable to continue."); Out.Ln;
HALT(60) HALT(60)
ELSE ELSE
mkDepTree(t, depTree, met) mkDepTree(t, depTree, met);
END; END;
END; END;
END; END;
INC(i) INC(i);
UNTIL i = depStrs.Count - 1; UNTIL i = depStrs.Count - 1;
d.AssignDeps(d, deps); d.AssignDeps(d, deps);
END; END;
depTree.Add(depTree, d); vpkdepTree.AddCopy(depTree, d);
END mkDepTree; END mkDepTree;
PROCEDURE resolve*(first: ARRAY OF CHAR; r: vpkdepTree.retriever): TdepTree; PROCEDURE resolve*(first: ARRAY OF CHAR; r: vpkdepTree.retriever): TdepTree;

View file

@ -72,6 +72,17 @@ BEGIN
UNTIL i = s.Count - 1; UNTIL i = s.Count - 1;
END list; END list;
PROCEDURE listDeps*(VAR deps: Tdeps);
VAR
l: LONGINT;
BEGIN
l := 0;
REPEAT
Out.Int(l, 0); Out.String(": "); Out.String(deps[l].name^); Out.Ln;
INC(l);
UNTIL l = LEN(deps^) - 1;
END listDeps;
PROCEDURE Free*(VAR l : TdepTree); PROCEDURE Free*(VAR l : TdepTree);
BEGIN BEGIN
l := NIL l := NIL
@ -96,9 +107,33 @@ PROCEDURE Add* (VAR l : TdepTree; VAR d: Tdep);
l.Last.next := d; l.Last.next := d;
END; END;
l.Last := d; l.Last := d;
l.Last.next := NIL;
INC(l.Count); INC(l.Count);
END Add; END Add;
PROCEDURE AddCopy* (VAR l : TdepTree; VAR d: Tdep);
VAR
new: Tdep;
ln: INTEGER;
BEGIN
NEW(new);
new.prev := d.prev; new.next := d.next;
ln := Strings.Length(d.name^) + 1; NEW(new.name, ln); COPY(d.name^, new.name^);
new.deps := d.deps;
new.Create := d.Create; new.AssignDeps := d.AssignDeps;
new.RetrieveDeps := d.RetrieveDeps;
new.InstallRetriever := d.InstallRetriever;
IF l.First = NIL THEN
l.First := new;
ELSE
l.Last.next := new;
END;
l.Last := new;
l.Last.next := NIL;
INC(l.Count);
END AddCopy;
PROCEDURE Get*(VAR l: TdepTree; inx: LONGINT): Tdep; PROCEDURE Get*(VAR l: TdepTree; inx: LONGINT): Tdep;
VAR VAR
i: LONGINT; i: LONGINT;
@ -129,14 +164,16 @@ BEGIN
REPEAT REPEAT
IF d # NIL THEN IF d # NIL THEN
IF d.name^ = name THEN IF d.name^ = name THEN
fnd := TRUE fnd := TRUE;
RETURN d;
ELSE ELSE
d := d.next d := d.next
END END
END; END;
INC(i); INC(i);
UNTIL fnd OR (i >= l.Count); (* UNTIL fnd OR (i >= l.Count );*)
RETURN d; UNTIL fnd OR (d = NIL);
RETURN NIL; (* in case of this UNTIL it seems safe to RETURN d *)
END GetByName; END GetByName;
PROCEDURE Create* () : TdepTree; PROCEDURE Create* () : TdepTree;