home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1994-09-09 | 3.3 KB | 149 lines |
- IMPLEMENTATION MODULE ListsAndNodes;
-
- (* NodeSearch.mod - Einzeilige Funktionsbeschreibung
- * Version : $VER: NodeSearch.mod 0.0 (© 1994 Fin Schuppenhauer)
- * Autor : Fin Schuppenhauer
- * Braußpark 10
- * 20537 Hamburg
- * (Germany)
- * E-Mail : 1schuppe@rzdspc2.informatik.uni-hamburg.de
- * Erstellt am : 09 Sep 1994
- * Letzte Änd. : 09 Sep 1994
- *)
-
- IMPORT
- ed:ExecD, el:ExecL,
- str:String;
-
- FROM SYSTEM IMPORT
- CAST, ADDRESS, ADR;
-
- CONST
- EQUAL = 0;
- LESS = 1;
- GREATER = -1;
-
- PROCEDURE CompareNodeNames (node1, node2 : ed.NodePtr) : LONGINT;
- (** "Vergleicht die Namen zweier Exec-Nodes" *)
- BEGIN
- IF node1^.name = NIL THEN
- IF node2^.name = NIL THEN
- RETURN EQUAL;
- ELSE
- RETURN LESS;
- END;
- ELSE
- IF node2^.name = NIL THEN
- RETURN GREATER;
- ELSE
- RETURN str.Compare(CAST(StrPtr, node1^.name)^,
- CAST(StrPtr, node2^.name)^);
- END;
- END;
- END CompareNodeNames;
- (* **)
-
- PROCEDURE CountNodes (list : ed.ListPtr) : LONGCARD;
- (** "Zählt die Anzahl der Nodes einer Liste" *)
- VAR
- count : LONGCARD;
- node : ed.NodePtr;
- BEGIN
- count := 0;
- node := list^.head;
-
- WHILE (node # NIL) & (node^.succ # NIL) DO
- INC (count);
- node := node^.succ;
- END;
-
- RETURN count;
- END CountNodes;
- (* **)
-
- PROCEDURE ChangeNodes (list : ed.ListPtr; node1, node2 : ed.NodePtr);
- (** "Vertauscht node1 mit node2" *)
- VAR
- oldn1pred : ed.NodePtr;
- oldn2pred : ed.NodePtr;
-
- BEGIN
- oldn1pred := node1^.pred;
- IF node1^.succ = node2 THEN
- (* Spezialfall !!! *)
- node1^.pred^.succ := node2;
- node2^.succ^.pred := node1;
- node1^.succ := node2^.succ;
- node1^.pred := node2;
- node2^.succ := node1;
- node2^.pred := oldn1pred;
- ELSE
- oldn2pred := node2^.pred;
- el.Remove (node1);
- el.Remove (node2);
- el.Insert (list, node1, oldn2pred);
- el.Insert (list, node2, oldn1pred);
- END;
-
- END ChangeNodes;
- (* **)
-
- PROCEDURE SortExecList (list : ed.ListPtr; max : INTEGER);
- (** "Sortiert eine Exec-Liste alphabetisch anhand der node.name's" *)
- VAR
- a,b : INTEGER;
- n : ed.NodePtr;
- BEGIN
- IF max = ALLNODES THEN
- max := CountNodes(list);
- END;
-
- FOR a := max-1 TO 1 BY -1 DO
- n := list^.head;
- FOR b := 1 TO a DO
- IF CompareNodeNames (n, n^.succ) > 0 THEN
- ChangeNodes (list, n, n^.succ);
- n := n^.pred;
- END;
- n := n^.succ;
- END;
- END;
-
- END SortExecList;
- (* **)
-
- PROCEDURE Enumerate (list : ed.ListPtr; enumProc : EnumerateProcedure);
- (** "Prozedur enumProc auf jede Node anwenden" *)
- VAR
- node : ed.NodePtr;
- BEGIN
- node := list^.head;
-
- WHILE (node # NIL) & (node^.succ # NIL) DO
- enumProc (node);
- node := node^.succ;
- END;
- END Enumerate;
- (* **)
-
- PROCEDURE FreeAllNodes (list : ed.ListPtr; nodesize : CARDINAL);
- (** "Belegten Speicher aller Nodes einer Liste freigeben" *)
- VAR
- worknode, node : ed.NodePtr;
- BEGIN
- node := list^.head;
-
- WHILE (node # NIL) & (node^.succ # NIL) DO
- worknode := node;
- node := node^.succ;
- el.FreeMem (worknode, nodesize);
- END;
-
- list^.head := NIL;
- list^.tailPred := NIL;
- END FreeAllNodes;
- (* **)
-
- BEGIN (* main *)
- END ListsAndNodes.
-