92 lines
1.7 KiB
Modula-2
92 lines
1.7 KiB
Modula-2
MODULE StoreFetch;
|
|
|
|
(* From: MODULA-2, An Introduction, by Daniel Thalmann, Springer-Verlag,
|
|
New York, 1985
|
|
Figure 20.3
|
|
*)
|
|
|
|
FROM InOut IMPORT ReadString, WriteString, WriteLn;
|
|
FROM Processes IMPORT SIGNAL, StartProcess, SEND, WAIT, Awaited, Init;
|
|
|
|
MODULE SharedBuffer;
|
|
|
|
IMPORT SIGNAL, SEND, WAIT, Awaited, Init;
|
|
|
|
EXPORT Deposit, Remove;
|
|
|
|
CONST N = 16;
|
|
|
|
VAR n, in, out: CARDINAL;
|
|
NonFull, NonEmpty: SIGNAL;
|
|
Buffer: ARRAY [0..N-1] OF INTEGER;
|
|
|
|
PROCEDURE Deposit(integer: INTEGER);
|
|
BEGIN
|
|
IF n=N THEN WAIT(NonFull) END;
|
|
INC(n);
|
|
Buffer[in] := integer;
|
|
in := (in+1) MOD N;
|
|
IF Awaited(NonEmpty) THEN SEND(NonEmpty) END;
|
|
END Deposit;
|
|
|
|
PROCEDURE Remove(VAR integer: INTEGER);
|
|
BEGIN
|
|
IF n=0 THEN WAIT(NonEmpty) END;
|
|
DEC(n);
|
|
integer := Buffer[out];
|
|
out := (out+1) MOD N;
|
|
IF Awaited(NonFull) THEN SEND(NonFull) END;
|
|
END Remove;
|
|
|
|
BEGIN
|
|
n := 0;
|
|
in := 0;
|
|
out := 0;
|
|
Init(NonFull);
|
|
Init(NonEmpty);
|
|
END SharedBuffer;
|
|
|
|
CONST Max = 80;
|
|
eos = 0C;
|
|
|
|
TYPE StringType = ARRAY[0..Max-1] OF CHAR;
|
|
|
|
VAR EndOfTransfer: SIGNAL;
|
|
|
|
PROCEDURE Store;
|
|
VAR i: INTEGER;
|
|
String: StringType;
|
|
BEGIN
|
|
WriteString("Enter a string: ");
|
|
i := -1;
|
|
ReadString(String);
|
|
REPEAT
|
|
INC(i);
|
|
Deposit(ORD(String[i]));
|
|
UNTIL String[i] = eos;
|
|
WAIT(EndOfTransfer);
|
|
END Store;
|
|
|
|
PROCEDURE Fetch;
|
|
VAR i, OrdOfChar: INTEGER;
|
|
String: StringType;
|
|
BEGIN
|
|
i := -1;
|
|
REPEAT
|
|
INC(i);
|
|
Remove(OrdOfChar);
|
|
String[i] := CHR(OrdOfChar);
|
|
UNTIL String[i] = eos;
|
|
WriteLn;
|
|
WriteString("After transfer: ");
|
|
WriteString(String);
|
|
WriteLn;
|
|
END Fetch;
|
|
|
|
BEGIN
|
|
Init(EndOfTransfer);
|
|
StartProcess(Store, 500);
|
|
StartProcess(Fetch, 500);
|
|
WAIT(EndOfTransfer);
|
|
END StoreFetch.
|