home *** CD-ROM | disk | FTP | other *** search
- {$R-,I+,N-}
- PROGRAM UsrFile;
- USES Crt, DOS;
- CONST
- UsrSiz = 255;
- IO_NotOutput = 105;
- IO_FileFull = 101;
- IO_Invalid = 6;
- TYPE
- String255 = STRING[255];
- CharBuf = ARRAY[0..127] OF Char;
- FakeFile = ARRAY[0..UsrSiz] 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;
- Data : ^FakeFile;
- UserData : ARRAY[1..8] OF Byte;
- Name : ARRAY[0..79] OF Char;
- Buffer : CharBuf;
- END;
- VAR
- UFile : Text;
- CH : Char;
- N, D : Integer;
-
- {$F+}{Start making all routines FAR}
-
- FUNCTION UsrOpen(VAR F : TextRec) : Integer;
- BEGIN
- UsrOpen := 0;
- WITH F DO
- IF Mode = fmOutput THEN
- BEGIN
- UFileSiz := 0;
- UFilePos := 0;
- END
- ELSE UsrOpen := IO_Invalid;
- END;
-
- FUNCTION UsrClose(VAR F : TextRec) : Integer;
- BEGIN
- UsrClose := 0;
- END;
-
- FUNCTION UsrOutput(VAR F : TextRec) : Integer;
- BEGIN
- UsrOutput := 0;
- WITH F DO
- IF Mode = fmOutput THEN
- BEGIN
- IF UFilePos+BufPos >= UsrSiz THEN UsrOutput := IO_FileFull
- ELSE
- BEGIN
- Move(BufPtr^, Data^[UFilePos], BufPos);
- UFilePos := UFilePos+BufPos;
- IF UFilePos > UFileSiz THEN UFileSiz := UFilePos;
- BufPos := 0;
- END;
- END
- ELSE
- IF Mode = fmClosed THEN UsrOutput := IO_NotOutput
- ELSE UsrOutput := IO_Invalid;
- END;
-
- {$F-}{Stop making all routines FAR}
-
- FUNCTION ReadUsr(VAR F : Text) : String255;
- VAR Temp : String255;
- BEGIN
- WITH TextRec(F) DO
- BEGIN
- Move(Data^, Temp[1], UFileSiz);
- Temp[0] := Chr(UFileSiz);
- UFileSiz := 0;
- UFilePos := 0;
- END;
- ReadUsr := Temp;
- END;
-
- PROCEDURE AssignUsr(VAR F : Text);
- BEGIN
- WITH TextRec(F) DO
- BEGIN
- Mode := fmClosed;
- BufSize := 127;
- BufPtr := @buffer;
- OpenFunc := @UsrOpen;
- CloseFunc := @UsrClose;
- InOutFunc := @UsrOutput;
- FlushFunc := @UsrOutput;
- Name[0] := #0;
- UFileSiz := 0;
- UFilePos := 0;
- New(Data);
- END;
- END;
-
- BEGIN
- ClrScr;
- Write('Now writing several variables to "UFile" -- ');
- WriteLn('they will become a single STRING.');
- AssignUsr(UFile);
- Rewrite(UFile);
- Write(UFile, 'PI/4 = ', Pi/4:1:11);
- Write(UFile, ' The biggest Long Integer is ', MaxLongInt);
- WriteLn('Press a key to see the result.');
- CH := ReadKey;
- WriteLn; WriteLn('"', ReadUsr(UFile), '"'); WriteLn;
- WriteLn('Now the UFile is clear, ready to accept input again');
- N := 355; D := 113;
- Write(UFile, N, '/', D, ' ', Chr(247), ' PI.');
- Write(UFile, ' PI=', Pi:1:11, ' and ', N, '/', D, '=', N/D:1:11);
- WriteLn('Press a key to see the result.');
- CH := ReadKey;
- WriteLn; WriteLn('"', ReadUsr(UFile), '"'); WriteLn;
- WriteLn('NOW to overload the UFile -- we will get a special I/O error');
- WriteLn('Press a key to see the result.');
- CH := ReadKey;
- FOR N := 1 TO 9 DO
- Write(UFile, 'THIS string has 32 characters. ');
- END.