From c5c999f5963acfdb1762af08c5400a26ff5a7c6c Mon Sep 17 00:00:00 2001 From: Norayr Chilingarian Date: Wed, 19 Jan 2022 04:19:52 +0400 Subject: [PATCH] now works! --- src/vpkResolver.Mod | 33 +++++++++++++++++++++++++++------ src/vpkdepTree.Mod | 43 ++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 67 insertions(+), 9 deletions(-) diff --git a/src/vpkResolver.Mod b/src/vpkResolver.Mod index 60589bc..58e56f5 100644 --- a/src/vpkResolver.Mod +++ b/src/vpkResolver.Mod @@ -29,6 +29,26 @@ BEGIN RETURN res; 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); VAR depStrs: StringList.TStringList; @@ -38,7 +58,7 @@ VAR i: INTEGER; rtrvRes: LONGINT; 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; rtrvRes := d.RetrieveDeps(d, depStrs); IF rtrvRes = -1 THEN @@ -55,28 +75,29 @@ BEGIN REPEAT p := depStrs.GetString(depStrs, i); IF p # NIL THEN + t := NIL; t := met.GetByName(met, p^); IF t = NIL THEN t := vpkdepTree.CreateDep(p^); t.InstallRetriever(t, rtvr); END; deps[i] := t; - IF ~treeContains(t, depTree) THEN - IF treeContains(t, met) THEN + IF ~treeContainsByName(t, depTree) THEN + IF treeContainsByName(t, met) THEN Out.Ln; Out.String("curcular dependency: "); Out.String(d.name^); Out.String(" requires "); Out.String(t.name^); Out.Ln; Out.String("unable to continue."); Out.Ln; HALT(60) ELSE - mkDepTree(t, depTree, met) + mkDepTree(t, depTree, met); END; END; END; - INC(i) + INC(i); UNTIL i = depStrs.Count - 1; d.AssignDeps(d, deps); END; - depTree.Add(depTree, d); + vpkdepTree.AddCopy(depTree, d); END mkDepTree; PROCEDURE resolve*(first: ARRAY OF CHAR; r: vpkdepTree.retriever): TdepTree; diff --git a/src/vpkdepTree.Mod b/src/vpkdepTree.Mod index 8bbb1bd..4ca4467 100644 --- a/src/vpkdepTree.Mod +++ b/src/vpkdepTree.Mod @@ -72,6 +72,17 @@ BEGIN UNTIL i = s.Count - 1; 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); BEGIN l := NIL @@ -96,9 +107,33 @@ PROCEDURE Add* (VAR l : TdepTree; VAR d: Tdep); l.Last.next := d; END; l.Last := d; + l.Last.next := NIL; INC(l.Count); 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; VAR i: LONGINT; @@ -129,14 +164,16 @@ BEGIN REPEAT IF d # NIL THEN IF d.name^ = name THEN - fnd := TRUE + fnd := TRUE; + RETURN d; ELSE d := d.next END END; INC(i); - UNTIL fnd OR (i >= l.Count); - RETURN d; +(* UNTIL fnd OR (i >= l.Count );*) + UNTIL fnd OR (d = NIL); + RETURN NIL; (* in case of this UNTIL it seems safe to RETURN d *) END GetByName; PROCEDURE Create* () : TdepTree;