home *** CD-ROM | disk | FTP | other *** search
Modula Definition | 1988-09-30 | 6.3 KB | 215 lines |
- (*******************************************************)
- (* VIRTARR1.MOD *)
- (* Definitions- und Implementationsmodul von VARRSYS *)
- (* Virtuelle Speicherverwaltung in M2 *)
- (* (C) 1988 Peter H. Seewann & TOOLBOX *)
- (*******************************************************)
-
- DEFINITION MODULE VARRSYS;
- FROM SYSTEM IMPORT ADDRESS;
-
- TYPE VirtualArray;
- (* Opaquer Datentyp - die interne Struktur ist für *)
- (* die Applikation uninteressant *)
-
- PROCEDURE DefineVArray( name : ARRAY OF CHAR;
- tsize : CARDINAL;
- inMem : CARDINAL )
- : VirtualArray;
- PROCEDURE OpenVArray( V : VirtualArray;
- VAR ok : BOOLEAN );
- PROCEDURE CloseVArray( VAR V : VirtualArray;
- delete,
- reuse : BOOLEAN );
- PROCEDURE VElement( i : CARDINAL;
- V : VirtualArray ): ADDRESS;
- PROCEDURE VHigh( V : VirtualArray ): CARDINAL;
- END VARRSYS.
-
-
- IMPLEMENTATION MODULE VARRSYS;
-
- FROM SYSTEM IMPORT
- ADDRESS, TSIZE;
-
- FROM CODELIB IMPORT
- FillWords;
-
- FROM Storage IMPORT
- ALLOCATE, DEALLOCATE;
- (*
- FROM VIRTMEM IMPORT
- ReadBlock, WriteBlock;
- *)
- FROM FILESYS IMPORT
- WRITEBYTES, READBYTES, FILE, CREATE, WRITE,
- UserHandle, IOR, ResultType,
- SETEOF, SETPOS, CLOSE, DELETE, OPEN, AccessType;
-
- TYPE
- VirtualArray = POINTER TO TVirtArray;
- TVirtArray = RECORD
- handle : FILE;
- fname : ARRAY [ 0 .. 11 ] OF CHAR;
- typesize : CARDINAL;
- (* Größe des Datentyps *)
- elements : CARDINAL;
- (* echte Anzahl der Elemente *)
- worksize : CARDINAL;
- (* Anzahl der speicherresidenten *)
- (* Elemente *)
- currI0 : CARDINAL;
- (* erstes der speicherresidenten *)
- (* Elemente *)
- workspace : ADDRESS
- (* Puffer *)
- END;
-
- PROCEDURE DefineVArray( name : ARRAY OF CHAR;
- tsize : CARDINAL;
- inMem : CARDINAL )
- : VirtualArray;
- VAR
- va : VirtualArray;
- sz,i : CARDINAL;
- BEGIN
- ALLOCATE( va, TSIZE( TVirtArray ) );
- WITH va^ DO
- i := 0;
- WHILE ( i < 8 ) & ( i <= HIGH( name ) )
- & ( name[i] # 0c ) DO
- fname[i] := name[i];
- INC( i )
- END;
- fname[i] := '.';
- INC( i );
- fname[i] := 'V';(* Dateiname a. d. Typennamen kon- *)
- INC( i ); (* struieren u. m. Standardextension *)
- fname[i] := 'A';(* versehen *)
- INC( i );
- fname[i] := 'R';
- INC( i );
- IF i <= 11
- THEN
- fname[i] := 0c
- END;
- CREATE( handle, fname, TRUE ); (* Datei anlegen *)
- typesize := tsize;
- elements := inMem;
- worksize := inMem;
- sz := inMem * tsize;
- ALLOCATE( workspace, sz );
- (* ACHTUNG !!!!!! siehe Kommentar im Text *)
- IF workspace = NIL
- THEN
- DEALLOCATE( va, TSIZE( TVirtArray ) );
- RETURN NIL
- END;
- WRITEBYTES( handle, workspace, sz );
- CLOSE( handle ); (* Plattenbereich initialisieren *)
- currI0 := 0
- END;
- RETURN va
- END DefineVArray;
-
- PROCEDURE OpenVArray( V : VirtualArray;
- VAR ok : BOOLEAN );
- VAR
- sz : CARDINAL; (* Array eröffnen *)
- BEGIN
- ok := V # NIL;
- IF ~ ok
- THEN
- RETURN
- END;
- WITH V^ DO
- OPEN( handle, fname, readwritemode );
- ok := IOR( handle ) = OK;
- IF ok & ( workspace = NIL )
- THEN
- sz := worksize * typesize;
- ALLOCATE( workspace, sz );
- ok := workspace # NIL;
- IF ok THEN
- READBYTES( handle, workspace, sz );
- currI0 := 0;
- END
- END
- END
- END OpenVArray;
-
- PROCEDURE CloseVArray(VAR V : VirtualArray;
- delete, (* Datei *)
- reuse : BOOLEAN ); (* Array *)
- VAR
- sz : CARDINAL;
- BEGIN
- WITH V^ DO
- sz := worksize * typesize;
- IF ~ delete
- THEN
- WRITEBYTES( handle, workspace, sz )
- END;
- CLOSE( handle );
- IF delete
- THEN
- DELETE( fname )
- END;
- DEALLOCATE( workspace, worksize * typesize );
- elements := 0;
- IF ~ reuse
- THEN
- DEALLOCATE( V, TSIZE( TVirtArray ) )
- END
- END
- END CloseVArray;
-
- PROCEDURE VElement( i : CARDINAL;
- V : VirtualArray ): ADDRESS;
- VAR
- retaddr : ADDRESS;
- sz : CARDINAL;
- extion : BOOLEAN;
- BEGIN
- extion := FALSE;
- WITH V^ DO
- IF ( i < currI0 ) OR ( i >= currI0 + worksize )
- THEN
- sz := worksize * typesize;
- SETPOS( handle,
- VAL( LONGINT, currI0 * typesize ),
- FALSE );
- WRITEBYTES( handle, workspace, sz );
- IF i >= elements
- THEN
- extion := TRUE;
- FillWords( 0, sz DIV 2, workspace );
- SETEOF( handle );
- WHILE i >= elements DO
- WRITEBYTES( handle, workspace, sz );
- INC( elements, worksize )
- END
- END;
- currI0 := i DIV worksize * worksize;
- SETPOS( handle, VAL(LONGINT,currI0*typesize),
- FALSE );
- IF ~ extion
- THEN
- READBYTES( handle, workspace, sz )
- END
- END;
- retaddr := workspace;
- INC( retaddr, ( i - currI0 ) * typesize );
- RETURN retaddr
- END
- END VElement;
-
- PROCEDURE VHigh( V : VirtualArray ): CARDINAL;
- BEGIN
- RETURN V^.elements - 1
- END VHigh;
-
- (* Kein Initialisierungsteil erforderlich *)
-
- END VARRSYS.