123456789101112131415161718192021222324252627282930313233343536373839 |
- #include "stdio_impl.h"
- #include <limits.h>
- #include <errno.h>
- off_t __ftello_unlocked(FILE *f)
- {
- off_t pos = f->seek(f, 0,
- (f->flags & F_APP) && f->wpos != f->wbase
- ? SEEK_END : SEEK_CUR);
- if (pos < 0) return pos;
- /* Adjust for data in buffer. */
- if (f->rend)
- pos += f->rpos - f->rend;
- else if (f->wbase)
- pos += f->wpos - f->wbase;
- return pos;
- }
- off_t __ftello(FILE *f)
- {
- off_t pos;
- FLOCK(f);
- pos = __ftello_unlocked(f);
- FUNLOCK(f);
- return pos;
- }
- long ftell(FILE *f)
- {
- off_t pos = __ftello(f);
- if (pos > LONG_MAX) {
- errno = EOVERFLOW;
- return -1;
- }
- return pos;
- }
- weak_alias(__ftello, ftello);
|