diff --git a/makefile b/makefile index e0dc8ef..b604dbb 100644 --- a/makefile +++ b/makefile @@ -32,6 +32,8 @@ all: ../src/vpkStorage.Mod \ ../src/vpkSyncer.Mod \ ../src/vpkRetriever.Mod \ + ../src/vpkdepTree.Mod \ + ../src/vpkDot.Mod \ ../src/vpkResolver.Mod \ ../src/vpkInstaller.Mod \ ../src/vipack.Mod -m diff --git a/src/vpkDot.Mod b/src/vpkDot.Mod new file mode 100644 index 0000000..fb184ad --- /dev/null +++ b/src/vpkDot.Mod @@ -0,0 +1,46 @@ +MODULE vpkDot; +IMPORT Strings, vpkdepTree, StringList; + +CONST + first = "digraph dependencies {"; + last = "}"; + arrow = " -> "; + tab = " "; + +PROCEDURE tree2dot*(VAR tree: vpkdepTree.TdepTree): StringList.TStringList; +VAR + dep : vpkdepTree.Tdep; + i, j : LONGINT; + lst : StringList.TStringList; + line: ARRAY 64 OF CHAR; +BEGIN + lst := StringList.Create(); + line:= first; + lst.AppendString(lst, line); + i := 0; + REPEAT + dep := tree.Get(tree, i); + IF dep # NIL THEN + IF dep.deps # NIL THEN + j := 0; + REPEAT + IF dep.deps[j]^.name # NIL THEN + COPY("", line); + Strings.Append(tab, line); + Strings.Append(dep.name^, line); + Strings.Append(arrow, line); + Strings.Append(dep.deps[j]^.name^, line); + lst.AppendString(lst, line); + END; + INC(j) + UNTIL j = (LEN(dep.deps^) -1 ); + END + END; + INC(i) + UNTIL i = tree.Count ; + line := last; + lst.AppendString(lst, line); + RETURN lst; +END tree2dot; + +END vpkDot. diff --git a/src/vpkInstaller.Mod b/src/vpkInstaller.Mod index 6df5902..c3f26e2 100644 --- a/src/vpkInstaller.Mod +++ b/src/vpkInstaller.Mod @@ -1,9 +1,13 @@ MODULE vpkInstaller; -IMPORT StringList, vpkResolver; +IMPORT StringList, vpkResolver, vpkdepTree, vpkDot; PROCEDURE install*(VAR unit: ARRAY OF CHAR); +VAR + tree: vpkdepTree.TdepTree; + lst: StringList.TStringList; BEGIN - vpkResolver.resolve(unit); + tree := vpkResolver.resolve(unit); + lst := vpkDot.tree2dot(tree); END install; diff --git a/src/vpkdepTree.Mod b/src/vpkdepTree.Mod new file mode 100644 index 0000000..0af8363 --- /dev/null +++ b/src/vpkdepTree.Mod @@ -0,0 +1,105 @@ +MODULE vpkdepTree; +IMPORT Out, strutils, StringList; +TYPE + + pstring = strutils.pstring; + pstrings = strutils.pstrings; + + Tdep* = POINTER TO TdepDesc; + Tdeps* = POINTER TO ARRAY OF Tdep; + + TdepTree* = POINTER TO TdepTreeDesc; + + TdepTreeDesc* = RECORD + First- : Tdep; + Last- : Tdep; + Create* : PROCEDURE () : TdepTree; + Free* : PROCEDURE (l : TdepTree); + Clear* : PROCEDURE (l : TdepTree); + Add* : PROCEDURE (l : TdepTree; s : Tdep); + Get* : PROCEDURE (l : TdepTree; i : LONGINT): Tdep; + Empty* : PROCEDURE (l : TdepTree) : BOOLEAN; + Count* : LONGINT; + END; + + TdepDesc* = RECORD + prev-, next-: Tdep; + name* : pstring; + deps* : Tdeps; + END; + +PROCEDURE list(VAR s : StringList.TStringList); +VAR e : StringList.Node; + i : INTEGER; +BEGIN + NEW(e); + i := 0; + REPEAT + e := s.Get(s, i); + IF e # NIL THEN Out.String (e.obj(StringList.TString).str^); Out.Ln END; + (*Out.String (e.string); Out.Ln;*) + INC(i); + UNTIL i = s.Count - 1; +END list; + +PROCEDURE Free*(l : TdepTree); + BEGIN + END Free; + +PROCEDURE Clear*(l : TdepTree); + BEGIN + l.First := NIL; + l.Count := 0; + END Clear; + +PROCEDURE Empty* (l : TdepTree) : BOOLEAN; + BEGIN + RETURN l.First = NIL + END Empty; + +PROCEDURE Add* (l : TdepTree; d: Tdep); + BEGIN + IF l.First = NIL THEN + l.First := d; + ELSE + l.Last.next := d; + END; + l.Last := d; + INC(l.Count); + END Add; + +PROCEDURE Get*(l: TdepTree; inx: LONGINT): Tdep; +VAR + i: LONGINT; + d: Tdep; +BEGIN + NEW(d); d := NIL; + i := 0; + IF (inx < l.Count) & (inx >= 0) THEN + i := 0; + d := l.First; + WHILE i # inx DO + IF d # NIL THEN d := d.next END; + INC(i); + END; + END; + RETURN d; +END Get; + +PROCEDURE Create* () : TdepTree; + VAR l : TdepTree; + BEGIN + NEW(l); + l.First := NIL; + l.Last := NIL; + l.Count := 0; + l.Add := Add; + l.Get := Get; + l.Clear := Clear; + l.Free := Free; + l.Empty := Empty; + RETURN(l); + END Create; + + +END vpkdepTree.