summaryrefslogtreecommitdiff
path: root/Build/source/utils/xml2pmx/xml2pmx-src/obsrc/Fifo.m
blob: 5cd49b335866c6b4593b13502d2deeab47ffd965 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
MODULE Fifo;
IMPORT Out; (*  := WCout; *)
VAR
TYPE 
	LONGINT = INTEGER;
  Node* = POINTER TO NodeDesc;
  NodeDesc = RECORD
  	key* : LONGINT;
  	next : Node
  END;
  FIFO* = RECORD
  		first*, last* : Node
  		END;
  slur* = POINTER TO slurlist; 	  
  slurlist* = RECORD(NodeDesc)
  id, start, stop : CHAR;
  ps, voice, measure, note : LONGINT;
  END;
 PROCEDURE smallfree*(used : SET) : LONGINT;
	  (* finds the lowest INTEGER included in "used" *)
	  VAR i : LONGINT;
	  BEGIN
	  i := -1; 
	  REPEAT INC(i); UNTIL (i IN used);
	  RETURN i;
	  END smallfree;

 PROCEDURE Enqueue*( VAR q: FIFO;  n: Node );  
	(* puts Tag "n" into the list "q" *)
	BEGIN 
		n.next := NIL;  
		IF q.first # NIL THEN q.last.next := n ELSE q.first := n END;  
		q.last := n
	END Enqueue;  
 PROCEDURE DequeuedNode*(VAR q: FIFO) : Node;
 VAR n : Node;
 BEGIN
 n := q.first;
 IF n # NIL THEN q.first := n.next END;
 RETURN n
 END DequeuedNode; 
 
PROCEDURE testfifo*;
VAR m, n : Node; q : FIFO; i : LONGINT; used : SET;
BEGIN
i := 0; 
WHILE i < 10 DO 
		NEW(n); 
		n.key := i; 
		Enqueue(q,n); 
		INC(i) 
END;

m := DequeuedNode(q); i := 0;
WHILE m # NIL DO 
	Out.Int(i,5); 
	Out.Char("|");
	Out.Int(m.key,5);
	m := DequeuedNode(q); 
	INC(i); 
END;
i := 0; 
used := {1,2,3};Out.Ln(); Out.String("1,2,3"); Out.Int(smallfree(used),5);

used := {0,2,3,4};Out.Ln(); Out.String("2,3,4"); Out.Int(smallfree(used),5);


END testfifo;
END Fifo.testfifo
System.Free Fifo