home *** CD-ROM | disk | FTP | other *** search
- Unit ExtBuff;
- {$R-,S-,O+}
-
- { Defines the ExtendedBuffer Object, which is a file-based
- storage space for ExtendedArray "Lobes". }
-
- { ExtendedBuffers either have the tagged block of data currently
- residing within them, or can access it by reading from the disk
- (after writing any currently contained data to disk). }
-
- INTERFACE
-
- Uses XGlobals,FlexPntr;
-
- Type
- ExtendedBuffer = Object
-
- Tag : Short;
- E : Ext;
- Length : Word;
- DataField : FlexPtr;
-
- Procedure Create;
- Procedure Init (FName : Short; Exten : Ext; FieldSize : Word);
-
- Procedure SwapData (NewTag : Short);
-
- Function Data : FlexPtr;
- Procedure Accept (Var Info : FlexPtr); {Changes current Data}
-
- Procedure Destroy;
-
- End;
-
- IMPLEMENTATION
-
- Procedure Error (Num : Byte);
- Begin
- WriteLn;
- Write ('ExtendedBuffer ERROR: ');
- Case Num of
- 0 : WriteLn ('Attempted Init on Un-Created or Initialized ExtendedBuffer.');
- 1 : WriteLn ('**** OUT OF MEMORY ****');
- 2 : WriteLn ('**** Insufficient Disk Space ****');
- End;
- WriteLn ('**** PROGRAM TERMINATED ****');
- WriteLn;
- Write ('Press <Return> to Continue.... ');
- ReadLn;
- HALT (0)
- End;
-
- Procedure ExtendedBuffer.Create;
- Begin
- DataField := Nil
- End;
-
- Procedure ExtendedBuffer.Init (FName : Short; Exten : Ext; FieldSize : Word);
- Begin
- If DataField <> Nil Then Error (0);
- Tag := FName;
- E := Exten;
- Length := FieldSize;
- GetMem (DataField,SizeOf(FlexCount)+FieldSize);
- If DataField = Nil Then Error (1)
- End;
-
- Procedure Update (E : ExtendedBuffer);
- Var
- F : File;
- Begin
- Assign (F,E.Tag+E.E);
- {$I-} Rewrite (F,1); {$I+}
- If IOResult <> 0 Then
- Begin
- E.Destroy;
- Error (2)
- End;
- BlockWrite (F,E.DataField^,E.Length+SizeOf(FlexCount));
- Close (F)
- End;
-
- Procedure Retrieve (E : ExtendedBuffer);
- Var
- F : File;
- Begin
- Assign (F,E.Tag+E.E);
- {$I-} Reset (F,1); {$I+}
- If IOResult = 0
- Then
- Begin
- BlockRead (F,E.DataField^,E.Length+SizeOf(FlexCount));
- Close (F)
- End
- End;
-
- Procedure ExtendedBuffer.SwapData (NewTag : Short);
- Begin
- Update (Self);
- Tag := NewTag;
- Retrieve (Self)
- End;
-
- Procedure ExtendedBuffer.Destroy;
- Begin
- FreeMem (DataField,Length+SizeOf(FlexCount));
- DataField := Nil;
- Tag := '';
- E := '';
- Length := 0
- End;
-
- Function ExtendedBuffer.Data;
- Begin
- Data := DataField
- End;
-
- Procedure ExtendedBuffer.Accept;
- Begin
- DataField := Info
- End;
-
- BEGIN
- HeapError := @HeapErrorTrap;
- System.FileMode := 2
- END.