home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GEMini Atari
/
GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso
/
zip
/
mint
/
mntlib16.lzh
/
MNTLIB16
/
FSEEK.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-08-03
|
2KB
|
97 lines
/* something like the origonal
* from Dale Schumacher's dLibs
*/
#include <stdio.h>
extern long lseek(), tell();
long ftell(fp)
FILE *fp;
{
long rv, count = fp->_cnt, adjust = 0;
unsigned int f = fp->_flag;
if( ((f & _IOREAD) && (!(f & _IOBIN))) ||
(count == 0) ||
(f & _IONBF) )
{
fflush(fp);
rv = lseek(fp->_file, 0L, SEEK_CUR);
}
else
{
if(f & _IOREAD)
adjust = -count;
else if(f & (_IOWRT | _IORW))
{
if(f & _IOWRT)
adjust = count;
}
else return -1L;
rv = lseek(fp->_file, 0L, SEEK_CUR);
}
return (rv < 0) ? -1L : rv + adjust;
}
void rewind(fp)
register FILE *fp;
{
register long rv;
fflush(fp);
rv = lseek(fp->_file, 0L, SEEK_SET);
fp->_flag &= ~(_IOEOF|_IOERR);
}
int fseek(fp, offset, origin)
FILE *fp;
long offset;
int origin;
{
long pos, count;
unsigned int f;
int rv;
/* Clear end of file flag */
f = (fp->_flag &= ~_IOEOF);
count = fp->_cnt;
if((!(f & _IOBIN)) ||
(f & (_IOWRT)) ||
(count == 0) ||
(f & _IONBF) ||
(origin == SEEK_END) )
{
rv = fflush(fp);
return ((rv == EOF) || (lseek(fp->_file, offset, origin) < 0)) ?
-1 : 0;
}
/* figure out if where we are going is still within the buffer */
pos = offset;
if(origin == SEEK_SET)
{
register long realpos;
if((realpos = tell(fp->_file)) < 0)
{ /* no point carrying on */
return -1;
}
pos += count - realpos;
}
else offset -= count; /* we were already count ahead */
if( (!(f & _IORW)) && (pos <= count) && (pos >= (fp->_base - fp->_ptr)) )
{
fp->_ptr += pos;
fp->_cnt -= pos;
return 0;
}
/* otherwise */
fp->_ptr = fp->_base;
fp->_cnt = 0;
if(f & _IORW) fp->_flag &= ~_IOREAD;
return (lseek(fp->_file, offset, origin) < 0) ? -1 : 0;
}