summaryrefslogtreecommitdiffstats
path: root/newlib/libc/stdio64/ftello64.c
diff options
context:
space:
mode:
authorJeff Johnston <jjohnstn@redhat.com>2002-07-17 23:25:44 +0000
committerJeff Johnston <jjohnstn@redhat.com>2002-07-17 23:25:44 +0000
commitdee51391315e2bb819409a6b3eb23ee6ef6d3c59 (patch)
tree17c5dc4dd302a05142ab357c745e37305c6b04ea /newlib/libc/stdio64/ftello64.c
parent30a431abf19a11923e53050fc94619e8705d4e50 (diff)
downloadcygnal-dee51391315e2bb819409a6b3eb23ee6ef6d3c59.tar.gz
cygnal-dee51391315e2bb819409a6b3eb23ee6ef6d3c59.tar.bz2
cygnal-dee51391315e2bb819409a6b3eb23ee6ef6d3c59.zip
2002-07-17 Jeff Johnston <jjohnstn@redhat.com>
* configure.host(stdio64_dir): New setting that is used to enable building of new stdio64 directory. * libc/Makefile.am[HAVE_STDIO64_DIR]: Add support for large files. (stmp-stdio64,stdio64.texi): New targets to optionally add in stdio64 info to info files. * libc/Makefile.in: Regenerated. * libc/configure: Ditto. * libc/configure.in: Add configuration variables that are set when stdio64 is selected as subdir in configure.host. * libc/libc.texinfo: Add optional menu item for Stdio64, based on whether STDIO64 flag is set or not. * libc/sys.tex: Add optional stdio64 syscalls based on whether STDIO64 flag is set or not. * libc/include/reent.h[__LARGE64_FILES]: Add new stdio64 _r sycall routines. * libc/include/stdio.h[__LARGE64_FILES]: Add new stdio64 prototypes. (FILE): Typedef'd to __FILE instead of struct __sFILE directly. (__SL64): New file flag indicating file is opened via fopen64. * libc/include/sys/_types.h(_off64_t): Added. * libc/include/sys/config.h: For x86-linux, define __LARGE64_FILES. * libc/include/sys/reent.h(struct __sFILE64): New file structure for 64-bit offset large file support. (__FILE): New intermediate type either set to struct __sFILE64 or struct __sFILE, depending on whether __LARGE64_FILES is set or not. * libc/reent/Makefile.am[HAVE_STDIO64_DIR]: Add new files. * libc/reent/Makefile.in: Regenerated. * libc/reent/fstat64r.c: New file. * libc/reent/lseek64r.c: Ditto. * libc/reent/open64r.c: Ditto. * libc/reent/reent.tex: Optionally add stdio64 reentrant syscalls based on whether STDIO64 flag is set. * libc/stdio/stdio.tex: Add blank line. * libc/stdio64/Makefile.am: New file. * libc/stdio64/Makefile.in: Ditto. * libc/stdio64/fgetpos64.c: Ditto. * libc/stdio64/fopen64.: Ditto. * libc/stdio64/freopen64.c: Ditto. * libc/stdio64/fseeko64.c: Ditto. * libc/stdio64/fsetpos64.c: Ditto. * libc/stdio64/ftello64.c: Ditto. * libc/stdio64/local64.h: Ditto. * libc/stdio64/stdio64.c: Ditto. * libc/stdio64/stdio64.tex: Ditto. * libc/stdio64/tmpfile64.c: Ditto. * libc/sys/linux/io64.c: Add weak aliases for lseek64, fstat64, and open64.
Diffstat (limited to 'newlib/libc/stdio64/ftello64.c')
-rw-r--r--newlib/libc/stdio64/ftello64.c138
1 files changed, 138 insertions, 0 deletions
diff --git a/newlib/libc/stdio64/ftello64.c b/newlib/libc/stdio64/ftello64.c
new file mode 100644
index 000000000..c6b888cf4
--- /dev/null
+++ b/newlib/libc/stdio64/ftello64.c
@@ -0,0 +1,138 @@
+#ifdef __LARGE64_FILES
+
+/*
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley. The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+/*
+FUNCTION
+<<ftello64>>---return position in a stream or file
+
+INDEX
+ ftello64
+
+ANSI_SYNOPSIS
+ #include <stdio.h>
+ _off64_t ftello64(FILE *<[fp]>);
+
+TRAD_SYNOPSIS
+ #include <stdio.h>
+ _off64_t ftello64(<[fp]>)
+ FILE *<[fp]>;
+
+DESCRIPTION
+Objects of type <<FILE>> can have a ``position'' that records how much
+of the file your program has already read. Many of the <<stdio>> functions
+depend on this position, and many change it as a side effect.
+
+The result of <<ftello64>> is the current position for a large file
+identified by <[fp]>. If you record this result, you can later
+use it with <<fseeko64>> to return the file to this
+position. The difference between <<ftello>> and <<ftello64>> is that
+<<ftello>> returns <<off_t>> and <<ftello64>> is designed to work
+for large files (>2GB) and returns <<_off64_t>>.
+
+In the current implementation, <<ftello64>> simply uses a character
+count to represent the file position; this is the same number that
+would be recorded by <<fgetpos64>>.
+
+The function exists only if the __LARGE64_FILES flag is defined.
+An error occurs if the <[fp]> was not opened via <<fopen64>>.
+
+RETURNS
+<<ftello64>> returns the file position, if possible. If it cannot do
+this, it returns <<-1>>. Failure occurs on streams that do not support
+positioning or not opened via <<fopen64>>; the global <<errno>> indicates
+this condition with the value <<ESPIPE>>.
+
+PORTABILITY
+<<ftello64>> is a glibc extension.
+
+No supporting OS subroutines are required.
+*/
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "%W% (Berkeley) %G%";
+#endif /* LIBC_SCCS and not lint */
+
+/*
+ * ftello64: return current offset.
+ */
+
+#include <stdio.h>
+#include <errno.h>
+
+#include "local64.h"
+
+_off64_t
+_DEFUN (ftello64, (fp),
+ register FILE * fp)
+{
+ _fpos64_t pos;
+
+ _flockfile(fp);
+
+ /* Ensure stdio is set up. */
+
+ CHECK_INIT (fp);
+
+ if (fp->_seek64 == NULL)
+ {
+ fp->_data->_errno = ESPIPE;
+ _funlockfile(fp);
+ return -1L;
+ }
+
+ /* Find offset of underlying I/O object, then
+ adjust for buffered bytes. */
+ fflush(fp); /* may adjust seek offset on append stream */
+ if (fp->_flags & __SOFF)
+ pos = fp->_offset;
+ else
+ {
+ pos = (*fp->_seek64) (fp->_cookie, (_fpos64_t) 0, SEEK_CUR);
+ if (pos == -1L)
+ {
+ _funlockfile(fp);
+ return pos;
+ }
+ }
+ if (fp->_flags & __SRD)
+ {
+ /*
+ * Reading. Any unread characters (including
+ * those from ungetc) cause the position to be
+ * smaller than that in the underlying object.
+ */
+ pos -= fp->_r;
+ if (HASUB (fp))
+ pos -= fp->_ur;
+ }
+ else if (fp->_flags & __SWR && fp->_p != NULL)
+ {
+ /*
+ * Writing. Any buffered characters cause the
+ * position to be greater than that in the
+ * underlying object.
+ */
+ pos += fp->_p - fp->_bf._base;
+ }
+
+ _funlockfile(fp);
+ return pos;
+}
+
+#endif /* __LARGE64_FILES */