mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 08:24:18 +00:00
Upload
Digital Research
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
/***********************************************************************
|
||||
*
|
||||
* f t e l l F u n c t i o n
|
||||
* ---------------------------
|
||||
* Copyright 1982 by Digital Research Inc. All rights reserved.
|
||||
*
|
||||
* "ftell" returns the present value of the read/write pointer
|
||||
* within the stream. This is a meaningless number for console
|
||||
* and list devices.
|
||||
*
|
||||
* Calling sequence:
|
||||
* offset = ftell(sp)
|
||||
* Where:
|
||||
* sp -> (FILE *) stream
|
||||
* offset = (LONG) where stream is reading from/writing to
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#include "stdio.h"
|
||||
|
||||
LONG ftell(sp) /* CLEAR FUNCTION ***********/
|
||||
REG FILE *sp; /* stream pointer */
|
||||
{ /* */
|
||||
REG LONG filepos; /* file position */
|
||||
REG BYTE *bp; /* Buffer ptr */
|
||||
LONG nread; /* Temp var */
|
||||
LONG lseek(); /* byte offset into buf */
|
||||
/* */
|
||||
if( isatty(fileno(sp)) ) /* are we talking to a tty? */
|
||||
return(0L); /* quit now if so */
|
||||
filepos = FAILURE; /* default return value */
|
||||
if( sp->_flag & (_IOREAD|_IOWRT) ) /* if file is open */
|
||||
{ /* */
|
||||
if((filepos=lseek(fileno(sp),0L,1)) /* get where next byte read */
|
||||
== FAILURE ) /* from or written to */
|
||||
return((LONG)FAILURE); /* quit if bad lseek */
|
||||
if( sp->_base == NULLPTR ) /* if file hasn't had i/o */
|
||||
return(filepos); /* return this position */
|
||||
nread = sp->_ptr - sp->_base; /* calc for # read/written */
|
||||
filepos += nread; /* correct for # read/wrtn */
|
||||
if( sp->_flag & _IOREAD ) /* if reading from file */
|
||||
if( filepos > 0 ) /* and we've read from file*/
|
||||
filepos -= nread + sp->_cnt; /* adjust file position */
|
||||
/* to reflect read ahead */
|
||||
if( sp->_flag & _IOASCI ) /* ascii file? **************/
|
||||
{ /* count the newlines */
|
||||
if( sp->_flag & _IOWRT ) /* add in newline's cr's */
|
||||
{ /* */
|
||||
for( bp=sp->_base; bp < sp->_ptr; bp++ ) /* */
|
||||
if( *bp == '\n' ) /* count newlines in stuff */
|
||||
filepos++; /* written/read so far */
|
||||
} else { /* we're reading... */
|
||||
if( filepos > 0 ) /* check to see we've read */
|
||||
for(bp= &(sp->_ptr[sp->_cnt-1]);/* start at end of buffer */
|
||||
bp >= sp->_ptr; bp-- ) /* back up to next read char*/
|
||||
if( *bp == '\n' ) /* count off for newlines */
|
||||
filepos--; /* */
|
||||
} /* */
|
||||
} /* fini ascii ***************/
|
||||
} /****************************/
|
||||
return(filepos); /* */
|
||||
} /****************************/
|
||||
|
Reference in New Issue
Block a user