ref: e6128b22b6f016d1e0d22177f111a346e36d8705
dir: /src/libc/stdio/ftell.c/
#include <stdio.h>
#include "../syscall.h"
#undef ftell
long
ftell(FILE *fp)
{
long off;
unsigned char *p;
if (fp->flags & _IOERR)
return EOF;
if ((off = _lseek(fp->fd, 0, SEEK_CUR)) < 0) {
fp->flags |= _IOERR;
return EOF;
}
if (fp->flags & _IOREAD)
return off - (fp->wp - fp->rp);
if (fp->flags & _IOWRITE) {
p = (fp->flags & _IOLBF) ? fp->lp : fp->wp;
return off + (p - fp->buf);
}
return off;
}