better encapsulation.

This commit is contained in:
Norayr Chilingarian 2020-06-10 22:06:34 +04:00
parent f1b478f4ac
commit e6823cb373
2 changed files with 27 additions and 11 deletions

View file

@ -1,5 +1,5 @@
MODULE vpkResolver; MODULE vpkResolver;
IMPORT Out, Strings, StringList, vpkdepTree, vpkRetriever; IMPORT Out, StringList, vpkdepTree, vpkRetriever;
TYPE TYPE
Tdep = vpkdepTree.Tdep; Tdep = vpkdepTree.Tdep;
@ -16,7 +16,6 @@ BEGIN
res := FALSE; res := FALSE;
i := 0; i := 0;
REPEAT REPEAT
Out.Int(i, 0); Out.Ln;
d2 := depTree.Get(depTree, i); d2 := depTree.Get(depTree, i);
IF d2 # NIL THEN IF d2 # NIL THEN
IF d = d2 THEN res := TRUE END; IF d = d2 THEN res := TRUE END;
@ -40,21 +39,20 @@ BEGIN
depStrs := vpkRetriever.getDeps(d.name^); depStrs := vpkRetriever.getDeps(d.name^);
IF depStrs # NIL THEN IF depStrs # NIL THEN
NEW (deps, depStrs.Count); NEW (deps, depStrs.Count);
d.deps := deps;
i := 0; i := 0;
REPEAT REPEAT
e := depStrs.Get(depStrs, i); e := depStrs.Get(depStrs, i);
IF e # NIL THEN IF e # NIL THEN
t := met.GetByName(met, e.obj(StringList.TString).str^); t := met.GetByName(met, e.obj(StringList.TString).str^);
IF t = NIL THEN IF t = NIL THEN
NEW(t); NEW(t.name, Strings.Length(e.obj(StringList.TString).str^)+1); t := vpkdepTree.CreateDep(e.obj(StringList.TString).str^);
COPY (e.obj(StringList.TString).str^, t.name^);
END; END;
deps[i] := t; deps[i] := t;
IF ~treeContains(t, depTree) THEN IF ~treeContains(t, depTree) THEN
IF treeContains(t, met) THEN IF treeContains(t, met) THEN
Out.String("curcular dependency!"); Out.Ln; 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;
HALT(60) HALT(60)
ELSE ELSE
mkDepTree(t, depTree, met) mkDepTree(t, depTree, met)
@ -63,6 +61,7 @@ BEGIN
END; END;
INC(i) INC(i)
UNTIL i = depStrs.Count - 1; UNTIL i = depStrs.Count - 1;
d.AssignDeps(d, deps);
END; END;
depTree.Add(depTree, d); depTree.Add(depTree, d);
END mkDepTree; END mkDepTree;
@ -75,8 +74,7 @@ VAR
BEGIN BEGIN
depTree := vpkdepTree.Create(); depTree := vpkdepTree.Create();
met := vpkdepTree.Create(); (* for deps that we already met *) met := vpkdepTree.Create(); (* for deps that we already met *)
NEW(dep); NEW(dep.name, Strings.Length(first) + 1); dep := vpkdepTree.CreateDep(first);
COPY(first, dep.name^);
mkDepTree(dep, depTree, met); mkDepTree(dep, depTree, met);
RETURN depTree RETURN depTree
END resolve; END resolve;

View file

@ -1,5 +1,5 @@
MODULE vpkdepTree; MODULE vpkdepTree;
IMPORT Out, strutils, StringList; IMPORT Out, Strings, strutils, StringList;
TYPE TYPE
pstring = strutils.pstring; pstring = strutils.pstring;
@ -25,10 +25,28 @@ TYPE
TdepDesc* = RECORD TdepDesc* = RECORD
prev-, next-: Tdep; prev-, next-: Tdep;
name* : pstring; name- : pstring;
deps* : Tdeps; deps- : Tdeps;
Create* : PROCEDURE (VAR name: ARRAY OF CHAR): Tdep;
AssignDeps* : PROCEDURE (VAR d: Tdep; VAR deps: Tdeps);
END; END;
PROCEDURE AssignDeps*(VAR d: Tdep; VAR deps: Tdeps);
BEGIN
d.deps := deps
END AssignDeps;
PROCEDURE CreateDep*(VAR name: ARRAY OF CHAR): Tdep;
VAR
dep: Tdep;
BEGIN
NEW(dep);
NEW(dep.name, Strings.Length(name) + 1);
COPY(name, dep.name^);
dep.AssignDeps := AssignDeps;
RETURN dep
END CreateDep;
PROCEDURE list(VAR s : StringList.TStringList); PROCEDURE list(VAR s : StringList.TStringList);
VAR e : StringList.Node; VAR e : StringList.Node;
i : INTEGER; i : INTEGER;