summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd C. Miller <millert@cvs.openbsd.org>2000-02-21 22:11:23 +0000
committerTodd C. Miller <millert@cvs.openbsd.org>2000-02-21 22:11:23 +0000
commitc73a0ad4b650731afc9ff73ce3efa6a20bc12d0a (patch)
treecb01bc14f869b62fbde1335281f99360545f3170
parentc08bffdba7eb5dccf57b3c21bb64592637f27391 (diff)
Add fseeko() and ftello() -- versions of fseek() and ftell() that use off_t.
Also make fsetpos() and fgetpos() use fseeko() and ftello() respectively since fpos_t is actually a 64bit type.
-rw-r--r--include/stdio.h4
-rw-r--r--lib/libc/stdio/fgetpos.c7
-rw-r--r--lib/libc/stdio/fseek.354
-rw-r--r--lib/libc/stdio/fseek.c26
-rw-r--r--lib/libc/stdio/fsetpos.c6
-rw-r--r--lib/libc/stdio/ftell.c27
6 files changed, 101 insertions, 23 deletions
diff --git a/include/stdio.h b/include/stdio.h
index 50e0987e381..a423df04159 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: stdio.h,v 1.11 1999/09/17 13:13:46 espie Exp $ */
+/* $OpenBSD: stdio.h,v 1.12 2000/02/21 22:11:20 millert Exp $ */
/* $NetBSD: stdio.h,v 1.18 1996/04/25 18:29:21 jtc Exp $ */
/*-
@@ -233,8 +233,10 @@ size_t fread __P((void *, size_t, size_t, FILE *));
FILE *freopen __P((const char *, const char *, FILE *));
int fscanf __P((FILE *, const char *, ...));
int fseek __P((FILE *, long, int));
+int fseeko __P((FILE *, off_t, int));
int fsetpos __P((FILE *, const fpos_t *));
long ftell __P((FILE *));
+off_t ftello __P((FILE *));
size_t fwrite __P((const void *, size_t, size_t, FILE *));
int getc __P((FILE *));
int getchar __P((void));
diff --git a/lib/libc/stdio/fgetpos.c b/lib/libc/stdio/fgetpos.c
index 83edbcbcf1e..4ea497c7cf2 100644
--- a/lib/libc/stdio/fgetpos.c
+++ b/lib/libc/stdio/fgetpos.c
@@ -35,15 +35,18 @@
*/
#if defined(LIBC_SCCS) && !defined(lint)
-static char rcsid[] = "$OpenBSD: fgetpos.c,v 1.2 1996/08/19 08:32:30 tholo Exp $";
+static char rcsid[] = "$OpenBSD: fgetpos.c,v 1.3 2000/02/21 22:11:21 millert Exp $";
#endif /* LIBC_SCCS and not lint */
#include <stdio.h>
+/*
+ * fgetpos: like ftello.
+ */
int
fgetpos(fp, pos)
FILE *fp;
fpos_t *pos;
{
- return((*pos = ftell(fp)) == (fpos_t)-1);
+ return((*pos = ftello(fp)) == (fpos_t)-1);
}
diff --git a/lib/libc/stdio/fseek.3 b/lib/libc/stdio/fseek.3
index ec46cdbdbd2..a20f47d10c5 100644
--- a/lib/libc/stdio/fseek.3
+++ b/lib/libc/stdio/fseek.3
@@ -1,4 +1,4 @@
-.\" $OpenBSD: fseek.3,v 1.4 1999/07/09 13:35:23 aaron Exp $
+.\" $OpenBSD: fseek.3,v 1.5 2000/02/21 22:11:22 millert Exp $
.\"
.\" Copyright (c) 1990, 1991, 1993
.\" The Regents of the University of California. All rights reserved.
@@ -35,13 +35,15 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd June 4, 1993
+.Dd February 21, 2000
.Dt FSEEK 3
.Os
.Sh NAME
.Nm fgetpos ,
.Nm fseek ,
+.Nm fseeko ,
.Nm fsetpos ,
+.Nm ftello ,
.Nm ftell ,
.Nm rewind
.Nd reposition a stream
@@ -49,8 +51,12 @@
.Fd #include <stdio.h>
.Ft int
.Fn fseek "FILE *stream" "long offset" "int whence"
+.Ft int
+.Fn fseeko "FILE *stream" "off_t offset" "int whence"
.Ft long
.Fn ftell "FILE *stream"
+.Ft off_t
+.Fn ftello "FILE *stream"
.Ft void
.Fn rewind "FILE *stream"
.Ft int
@@ -85,6 +91,15 @@ any effects of the
function on the same stream.
.Pp
The
+.Fn fseeko
+function is identical to
+.Fn fseek
+except that it takes an
+.Dv off_t
+as its
+.Fa offset .
+.Pp
+The
.Fn ftell
function
obtains the current value of the file position indicator for the
@@ -92,6 +107,13 @@ stream pointed to by
.Fa stream .
.Pp
The
+.Fn ftello
+function is identical to
+.Fn ftell
+except that its return value is of type
+.Dv off_t .
+.Pp
+The
.Fn rewind
function sets the file position indicator for the stream pointed
to by
@@ -133,14 +155,18 @@ returns no value.
Upon successful completion,
.Fn fgetpos ,
.Fn fseek ,
+.Fn fseeko ,
.Fn fsetpos
-return 0,
-and
+return 0 and
.Fn ftell
-returns the current offset.
+and
+.Fn ftello
+return the current offset.
Otherwise,
.Fn fseek
-returns \-1 and
+and
+.Fn fseeko
+return \-1 and
the others
return a nonzero value and the global variable
.Va errno
@@ -167,9 +193,11 @@ or
The function
.Fn fgetpos ,
.Fn fseek ,
+.Fn fseeko ,
.Fn fsetpos ,
+.Fn ftell ,
and
-.Fn ftell
+.Fn ftello
may also fail and set
.Va errno
for any of the errors specified for the routines
@@ -190,4 +218,14 @@ and
.Fn rewind
functions
conform to
-.St -ansiC .
+.St -ansiC
+and
+.St -xpg4 .
+.Pp
+The
+.Fn fseeko
+and
+.Fn ftello
+functions
+conform to
+.St -xpg4 .
diff --git a/lib/libc/stdio/fseek.c b/lib/libc/stdio/fseek.c
index 035ac7918c3..8063c6a0d9b 100644
--- a/lib/libc/stdio/fseek.c
+++ b/lib/libc/stdio/fseek.c
@@ -35,7 +35,7 @@
*/
#if defined(LIBC_SCCS) && !defined(lint)
-static char rcsid[] = "$OpenBSD: fseek.c,v 1.2 1996/08/19 08:32:46 tholo Exp $";
+static char rcsid[] = "$OpenBSD: fseek.c,v 1.3 2000/02/21 22:11:22 millert Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
@@ -53,9 +53,9 @@ static char rcsid[] = "$OpenBSD: fseek.c,v 1.2 1996/08/19 08:32:46 tholo Exp $";
* `Whence' must be one of the three SEEK_* macros.
*/
int
-fseek(fp, offset, whence)
+fseeko(fp, offset, whence)
register FILE *fp;
- long offset;
+ off_t offset;
int whence;
{
register fpos_t (*seekfn) __P((void *, fpos_t, int));
@@ -93,7 +93,7 @@ fseek(fp, offset, whence)
curoff = fp->_offset;
else {
curoff = (*seekfn)(fp->_cookie, (fpos_t)0, SEEK_CUR);
- if (curoff == -1L)
+ if (curoff == (fpos_t)-1)
return (EOF);
}
if (fp->_flags & __SRD) {
@@ -245,3 +245,21 @@ dumb:
fp->_flags &= ~__SEOF;
return (0);
}
+
+/*
+ * fseek()'s offset is a long and sizeof(off_t) != sizeof(long) on all arches
+ */
+#if defined(__alpha__) && defined(__indr_reference)
+__indr_reference(fseeko, fseek);
+#else
+int
+fseek(fp, offset, whence)
+ register FILE *fp;
+ long offset;
+ int whence;
+{
+ off_t off = offset;
+
+ return(fseeko(fp, off, whence));
+}
+#endif
diff --git a/lib/libc/stdio/fsetpos.c b/lib/libc/stdio/fsetpos.c
index c6fae71d7b0..bc538ee4f7e 100644
--- a/lib/libc/stdio/fsetpos.c
+++ b/lib/libc/stdio/fsetpos.c
@@ -35,18 +35,18 @@
*/
#if defined(LIBC_SCCS) && !defined(lint)
-static char rcsid[] = "$OpenBSD: fsetpos.c,v 1.2 1996/08/19 08:32:47 tholo Exp $";
+static char rcsid[] = "$OpenBSD: fsetpos.c,v 1.3 2000/02/21 22:11:22 millert Exp $";
#endif /* LIBC_SCCS and not lint */
#include <stdio.h>
/*
- * fsetpos: like fseek.
+ * fsetpos: like fseeko.
*/
int
fsetpos(iop, pos)
FILE *iop;
const fpos_t *pos;
{
- return (fseek(iop, (long)*pos, SEEK_SET));
+ return (fseeko(iop, (off_t)*pos, SEEK_SET));
}
diff --git a/lib/libc/stdio/ftell.c b/lib/libc/stdio/ftell.c
index 64d69266047..c4431fa527e 100644
--- a/lib/libc/stdio/ftell.c
+++ b/lib/libc/stdio/ftell.c
@@ -35,7 +35,7 @@
*/
#if defined(LIBC_SCCS) && !defined(lint)
-static char rcsid[] = "$OpenBSD: ftell.c,v 1.2 1996/08/19 08:32:47 tholo Exp $";
+static char rcsid[] = "$OpenBSD: ftell.c,v 1.3 2000/02/21 22:11:22 millert Exp $";
#endif /* LIBC_SCCS and not lint */
#include <stdio.h>
@@ -43,17 +43,17 @@ static char rcsid[] = "$OpenBSD: ftell.c,v 1.2 1996/08/19 08:32:47 tholo Exp $";
#include "local.h"
/*
- * ftell: return current offset.
+ * ftello: return current offset.
*/
-long
-ftell(fp)
+off_t
+ftello(fp)
register FILE *fp;
{
register fpos_t pos;
if (fp->_seek == NULL) {
errno = ESPIPE; /* historic practice */
- return (-1L);
+ return ((off_t)-1);
}
/*
@@ -87,3 +87,20 @@ ftell(fp)
}
return (pos);
}
+
+/*
+ * ftell() returns a long and sizeof(off_t) != sizeof(long) on all arches
+ */
+#if defined(__alpha__) && defined(__indr_reference)
+__indr_reference(ftello, ftell);
+#else
+long
+ftell(fp)
+ register FILE *fp;
+{
+ long pos;
+
+ pos = (long)ftello(fp);
+ return(pos);
+}
+#endif