91 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Modula-2
		
	
	
	
	
	
			
		
		
	
	
			91 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(CARDINAL(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.
 |