Pristine Ack-5.5
[Ack-5.5.git] / lang / m2 / test / Thalmann / StoreFetch.mod
1 MODULE StoreFetch;
2
3 (* From: MODULA-2, An Introduction, by Daniel Thalmann, Springer-Verlag,
4          New York, 1985
5    Figure 20.3
6 *)
7
8   FROM InOut IMPORT     ReadString, WriteString, WriteLn;
9   FROM Processes IMPORT SIGNAL, StartProcess, SEND, WAIT, Awaited, Init;
10
11   MODULE SharedBuffer;
12
13     IMPORT      SIGNAL, SEND, WAIT, Awaited, Init;
14
15     EXPORT      Deposit, Remove;
16
17     CONST       N = 16;
18
19     VAR         n, in, out: CARDINAL;
20                 NonFull, NonEmpty: SIGNAL;
21                 Buffer: ARRAY [0..N-1] OF INTEGER;
22
23     PROCEDURE Deposit(integer: INTEGER);
24     BEGIN
25         IF n=N THEN WAIT(NonFull) END;
26         INC(n);
27         Buffer[in] := integer;
28         in := (in+1) MOD N;
29         IF Awaited(NonEmpty) THEN SEND(NonEmpty) END;
30     END Deposit;
31
32     PROCEDURE Remove(VAR integer: INTEGER);
33     BEGIN
34         IF n=0 THEN WAIT(NonEmpty) END;
35         DEC(n);
36         integer := Buffer[out];
37         out := (out+1) MOD N;
38         IF Awaited(NonFull) THEN SEND(NonFull) END;
39     END Remove;
40
41   BEGIN
42         n := 0;
43         in := 0;
44         out := 0;
45         Init(NonFull);
46         Init(NonEmpty);
47   END SharedBuffer;
48
49   CONST Max = 256;
50         eos = 0C;
51
52   TYPE  StringType = ARRAY[0..Max-1] OF CHAR;
53
54   VAR   EndOfTransfer: SIGNAL;
55
56   PROCEDURE Store;
57     VAR i: INTEGER;
58         String: StringType;
59   BEGIN
60         WriteString("Enter a string: ");
61         i := -1;
62         ReadString(String);
63         REPEAT
64                 INC(i);
65                 Deposit(ORD(String[i]));
66         UNTIL String[i] = eos;
67         WAIT(EndOfTransfer);
68   END Store;
69
70   PROCEDURE Fetch;
71     VAR i, OrdOfChar: INTEGER;
72         String: StringType;
73   BEGIN
74         i := -1;
75         REPEAT
76                 INC(i);
77                 Remove(OrdOfChar);
78                 String[i] := CHR(CARDINAL(OrdOfChar));
79         UNTIL String[i] = eos;
80         WriteLn;
81         WriteString("After transfer: ");
82         WriteString(String);
83         WriteLn;
84   END Fetch;
85
86 BEGIN
87         Init(EndOfTransfer);
88         StartProcess(Store, 2000);
89         StartProcess(Fetch, 2000);
90         WAIT(EndOfTransfer);
91 END StoreFetch.