Mail Archives: djgpp-workers/1997/05/08/03:42:36
On Wed, 7 May 1997, Diego Zuccato wrote:
> I just did a bit of C&P with DJ's code from _write()and now it's nearly
> as fast as before but supports FSEXT funcs on text files too. FSEXTwrite
> func will be called with the *already converted* buffer. I think no
> changes in documentation are required, since (IMHO) behaviour is like
> expected : first buffer is converted, THEN __FSEXT is called.
Thanks, but I think the call to the __FSEXT function should be *before*
the conversion, for two reasons:
1) The hook might not need the conversion at all, in which
case you are just waisting cycles.
2) It is usually a bad idea to call a function after data has
been put into the transfer buffer, but *before* you call DOS. That's
because many library functions overwrite the transfer buffer; if the
__FSEXT hook uses any of them and then returns zero (meaning it didn't
handle the call), you will write garbage to the file.
I also think that the code is incorrect:
/* we now have a transfer buf stuffed with data; write it out */
if (func)
{
int rv;
if (func(__FSEXT_write, &rv, &handle))
return rv;
}
else
{
r.x.ax = 0x4000;
r.x.bx = handle;
r.x.cx = bytes_in_tb;
r.x.dx = __tb & 15;
r.x.ds = __tb / 16;
__dpmi_int(0x21, &r);
That `else' clause shouldn't be there: you need also call DOS if
`func' is non-NULL, i.e. a handler *was* installed, but calling it
returned zero, meaning that it didn't handle this particular call.
- Raw text -