[AD] pack_ferror() - differences between platforms |
[ Thread Index | Date Index | More lists.liballeg.org/allegro-developers Archives ]
Hi I was about to post a bug report - pack_ferror() wasn't being set on Linux - but it seems to be more of a quirk than a bug. With DJGPP, pack_ferror() will return nonzero if the end of the file has been reached (incidentally I was using a compressed file). With Linux, pack_ferror() will not. While I was looking for a possible cause for the bug, it occurred to me that this was what pack_feof() was for. I tested with Allegro 4.0.0 on DJGPP and Allegro 4.1.x CVS on Linux. Just to make sure, I tried Allegro 4.0.0 on Linux, and it behaved the same as Allegro 4.1.x CVS on Linux. So this really does appear to be a platform issue, not a version issue. (By the way, I still have Allegro 4.0.0 on my laptop because I hardly ever use the laptop any more and it's not worth the trouble of upgrading :) Anyhow, I believe it should be documented in pack_ferror()'s description that EOF may not be considered an error - or the library should be fixed so that it either always is or always isn't considered an error. I've attached three patches - don't apply more than one of them. They are as follows: allegro._tx.diff Updates the docs to indicate that the return value of pack_ferror() is undefined after you try to read beyond the end of the file. file.inl.eofiserror.diff Modifies packfile_ferror() to return nonzero if either PACKFILE_FLAG_EOF or PACKFILE_FLAG_ERROR is set in the PACKFILE struct. file.inl.eofnoterror.hacky.diff Modifies packfile_ferror() to return nonzero only if PACKFILE_FLAG_ERROR is set _and_ PACKFILE_FLAG_EOF is clear. This is hacky, as a valid error condition may accidentally be missed... I've also attached an archive of these files, in case your e-mail clients mess them up :) Ben
Attachment:
diffs.tar.gz
Description: GNU Zip compressed data
--- include/allegro/inline/file.inl.old Sun Jan 19 13:35:50 2003 +++ include/allegro/inline/file.inl Sun Jan 19 13:40:25 2003 @@ -51,7 +51,7 @@ AL_INLINE(int, pack_ferror, (PACKFILE *f), { - return (f->flags & PACKFILE_FLAG_ERROR); + return ((f->flags & (PACKFILE_FLAG_ERROR | PACKFILE_FLAG_EOF)) == PACKFILE_FLAG_ERROR); }) #ifdef __cplusplus
--- include/allegro/inline/file.inl.old Sun Jan 19 13:35:50 2003 +++ include/allegro/inline/file.inl Sun Jan 19 13:35:55 2003 @@ -51,7 +51,7 @@ AL_INLINE(int, pack_ferror, (PACKFILE *f), { - return (f->flags & PACKFILE_FLAG_ERROR); + return (f->flags & (PACKFILE_FLAG_ERROR | PACKFILE_FLAG_EOF)); }) #ifdef __cplusplus
--- docs/src/allegro._tx.old Sun Jan 19 13:26:35 2003 +++ docs/src/allegro._tx Sun Jan 19 13:33:31 2003 @@ -6321,6 +6321,10 @@ DOS/Windows. If you do not want either of these things to happen, use pack_fwrite() and/or pack_putc() instead. </ul> + Please note that the return value of pack_ferror() after you try to read + beyond the end of the file is undefined. If you wish to detect premature + end of file, you should check both pack_ferror() and pack_feof(). + @@PACKFILE *@pack_fopen_chunk(PACKFILE *f, int pack); @xref pack_fclose_chunk, pack_fopen Opens a sub-chunk of a file. Chunks are primarily intended for use by the
Mail converted by MHonArc 2.6.19+ | http://listengine.tuxfamily.org/ |