[fpc-devel]Source files involved in (text) file handling (Q & A)
Tom Verhoeff
wstomv at win.tue.nl
Sun Jul 14 21:23:58 CEST 2002
I am looking into the handling of text files within FreePascal
programs. I have found that the text file type is defined in
fpc/rtl/inc/textrec.inc and text.inc via TextRec,
and system.inc (for def. of type FileFunc),
systemh.inc (for routine headers)
However, text.inc refers to routines named
Do_Open, Do_Read, Do_Write, DoClose, Do_IsDevice, Do_FilePos, Do_Seek
which work on file handles, and I cannot find their definitions.
It is also not clear to me which higher level file includes
system.inc and text.inc (textrec.inc is included in system.inc).
Apologies! I did some more tracking and found that rtl/linux/
has syslinux.pp, which includes system.pp, which includes
sysunixh.inc and sysunix.inc (located in rtl/unix/). Then
sysunixh.inc includes systemh.inc, and and sysunix.inc includes
system.inc and text.inc. Furthermore sysunix.inc has the
definitions for Do_xxx under Low Level File Routines in terms of
routines named sys_xxx define in rtl/linux/syscalls.inc. A rather
contorted maze, if I may say so, :-). In summary:
fpc/
rtl/
inc/
textrec.inc defines type TextRec
text.inc implements routines Assign, Reset, Rewrite, Close, etc.
on TextRec, using FileFunc, in terms of routines
Do_Open, Do_Read, Do_Write, Do_Close on handles
(Do_Open is exceptional and works on var f that
must have handle and mode as first two fields)
systemh.inc declares routines Assign, Reset, Rewrite, Close, etc.
on Text
system.inc defines type FileFunc = Procedure(var t: TextRec);
linux/
syscalls.inc implements Sys_Open, Sys_Read, Sys_Write, Sys_Close, etc.
syslinux.pp includes system.pp
system.pp includes rtl/unix/{sysunixh,sysunix}.inc
unix/
sysunixh.inc includes rtl/inc/systemh.inc
sysunix.inc includes rtl/{inc/{sytem,text},linux/syscalls}.inc,
implements Do_Open, Do_Read, Do_Write, Do_Close, etc.
in terms of Sys_xxxx
(I had no interest in tracing the Windows branch.)
By the way, in the implementation for SeekEof (in text.inc), I read
that the file position is NOT actually advanced, UNLESS the file is
associated with a device. The implementation for SeekEoln always
advances the file position. The documentation (ref.pdf) states that
both SeekEof and SeekEoln advance the file position. An experiment
shows that the implementation is right (small wonder :-).
Reason for my interest is that I wanted to know why FilePos
and Seek are not implemented for text files. The answer seems to
be that there is a problem if they are associated with devices,
which are not seekable. I would like to have FilePos and Seek
when the text files are not associated with a device, and that seems
doable somehow. They could just return an error if the text file
is not seekable. I would probably also be happy if SeekEoln would
NOT advance the file position whenever possible (just like SeekEof).
I hope this message may still be useful in some archive.
Thanks for your attention,
Tom Verhoeff
More information about the fpc-devel
mailing list