home *** CD-ROM | disk | FTP | other *** search
- {$R-,I+,N-}
- PROGRAM Memory_File;
- USES Crt, DOS;
- CONST
- BufSiz = 127;
- UsrSiz = 4095;
- IO_Invalid = 6;
- IO_FileFull = 101;
- IO_NotOpen = 103;
- IO_NotInput = 104;
- IO_NotOutput = 105;
- TYPE
- FFileBuffer = ARRAY[0..UsrSiz] OF Char;
- FFilePointer = ^FFileBuffer;
- CharBuf = ARRAY[0..BufSiz] OF Char;
- TextRec = RECORD
- Handle : Word;
- Mode : Word;
- BufSize : Word;
- Private : Word;
- BufPos : Word;
- BufEnd : Word;
- BufPtr : ^CharBuf;
- OpenFunc : pointer;
- InOutFunc : pointer;
- FlushFunc : pointer;
- CloseFunc : pointer;
- UFilePos : Word;
- UFileSiz : Word;
- FileData : FFilePointer;
- Erased : boolean;
- UserData : ARRAY[1..7] OF Byte;
- Name : ARRAY[0..79] OF Char;
- Buffer : CharBuf;
- END;
- VAR
- UsrFile : Text;
- line : STRING[255];
-
- {$F+} {Make routines with FAR calls from here on}
- FUNCTION UsrIgnore(VAR F : TextRec) : Integer;
- BEGIN
- UsrIgnore := 0;
- END;
-
- FUNCTION UsrInput(VAR F : TextRec) : Integer;
- FUNCTION Min(A, B : Word) : Word;
- BEGIN
- IF A < B THEN Min := A ELSE Min := B;
- END;
- BEGIN
- UsrInput := 0;
- WITH F DO
- IF Mode = fmClosed THEN UsrInput := IO_NotOpen
- ELSE IF Mode = fmInput THEN
- BEGIN
- IF UFilePos >= UFileSiz THEN
- BEGIN
- BufEnd := 0;
- BufPos := 0;
- END
- ELSE
- BEGIN
- BufEnd := Min(UFileSiz-UFilePos, BufSiz);
- Move(FileData^[UFilePos], BufPtr^, BufEnd);
- UFilePos := UFilePos+BufEnd;
- BufPos := 0;
- END;
- END
- ELSE IF Mode = fmOutput THEN UsrInput := IO_NotOutput
- ELSE UsrInput := IO_Invalid;
- END;
-
- FUNCTION UsrOutput(VAR F : TextRec) : Integer;
- BEGIN
- UsrOutput := 0;
- WITH F DO
- IF Mode = fmClosed THEN UsrOutput := IO_NotOpen
- ELSE IF Mode = fmOutput THEN
- BEGIN
- IF UFilePos+BufPos >= UsrSiz THEN UsrOutput := IO_FileFull
- ELSE
- BEGIN
- Move(BufPtr^, FileData^[UFilePos], BufPos);
- UFilePos := UFilePos+BufPos;
- IF UFilePos > UFileSiz THEN UFileSiz := UFilePos;
- BufPos := 0;
- END;
- END
- ELSE IF Mode = fmInput THEN UsrOutput := IO_NotInput
- ELSE UsrOutput := IO_Invalid;
- END;
-
- FUNCTION UsrOpen(VAR F : TextRec) : Integer;
- BEGIN
- UsrOpen := 0;
- WITH F DO
- IF Mode = fmInput THEN
- (* ==================================== *)
- (* RESET : open for input from the *)
- (* "file". If size is 0, say the file *)
- (* doesn't exist. Otherwise, set InOut *)
- (* for INPUT and put the FilePos at 0. *)
- (* ==================================== *)
- BEGIN
- IF erased THEN UsrOpen := IO_NotInput
- ELSE
- BEGIN
- FlushFunc := @UsrIgnore;
- InOutFunc := @UsrInput;
- UFilePos := 0;
- END;
- END
- ELSE IF Mode = fmOutput THEN
- (* ==================================== *)
- (* REWRITE -- open for output TO the *)
- (* "file". Set FileSize and FilePos to *)
- (* 0 and allocate space for the file's *)
- (* data to reside in *)
- (* ==================================== *)
- BEGIN
- UFileSiz := 0;
- UFilePos := 0;
- IF erased THEN
- BEGIN
- erased := false;
- New(FileData);
- END;
- InOutFunc := @UsrOutput;
- FlushFunc := @UsrOutput;
- END
- ELSE IF Mode = fmInOut THEN
- (* ==================================== *)
- (* APPEND -- if the file doesn't exist *)
- (* yet, say so. Otherwise, point the *)
- (* FilePos at the FileSize, so new *)
- (* WRITE statements will append to the *)
- (* "file" *)
- (* ==================================== *)
- BEGIN
- IF erased THEN UsrOpen := IO_NotOutput
- ELSE
- BEGIN
- UFilePos := UFileSiz;
- InOutFunc := @UsrOutput;
- FlushFunc := @UsrOutput;
- Mode := fmOutput;
- END;
- END
- ELSE UsrOpen := IO_Invalid;
- END;
-
- {$F-} {Stop making routines with FAR calls}
-
- PROCEDURE EraseUsr(VAR F : Text);
- BEGIN
- WITH TextRec(F) DO
- BEGIN
- erased := true;
- dispose(FileData);
- mode := fmClosed;
- END;
- END;
-
-
- PROCEDURE AssignUsr(VAR F : Text);
- BEGIN
- WITH TextRec(F) DO
- BEGIN
- Mode := fmClosed;
- BufSize := BufSiz;
- BufPtr := @buffer;
- OpenFunc := @UsrOpen;
- CloseFunc := @UsrIgnore;
- Name[0] := #0;
- UFileSiz := 0;
- UFilePos := 0;
- Erased := true;
- END;
- END;
-
- BEGIN
- ClrScr;
- AssignUsr(UsrFile);
- Rewrite(UsrFile);
- Write(UsrFile, 'I ');
- Write(UsrFile, 'am ', 1.234, ' feet high.');
- WriteLn(UsrFile);
- WriteLn(UsrFile, 'The value of pi is ', Pi:1:11);
- Close(UsrFile);
- Reset(UsrFile);
- WriteLn('I have written some lines to the "fake file". I can get them');
- WriteLn('back by READING the "fake file" and writing to the screen.');
- WriteLn('HERE they come:');
- WHILE NOT(EoF(UsrFile) OR KeyPressed) DO
- BEGIN
- ReadLn(UsrFile, line);
- WriteLn(line);
- END;
- WriteLn;
- WriteLn('Now going to APPEND -- ...');
- Append(UsrFile);
- WriteLn(UsrFile, 'What is 1/4 of pi? Is it ', Pi/4:1:11, '?');
- Close(UsrFile);
- Reset(UsrFile);
- WHILE NOT(EoF(UsrFile) OR KeyPressed) DO
- BEGIN
- ReadLn(UsrFile, line);
- WriteLn(line);
- END;
- END.