summaryrefslogtreecommitdiff
path: root/ghc/lib/std/cbits/filePosn.c
diff options
context:
space:
mode:
Diffstat (limited to 'ghc/lib/std/cbits/filePosn.c')
-rw-r--r--ghc/lib/std/cbits/filePosn.c99
1 files changed, 0 insertions, 99 deletions
diff --git a/ghc/lib/std/cbits/filePosn.c b/ghc/lib/std/cbits/filePosn.c
deleted file mode 100644
index bd1abce29a..0000000000
--- a/ghc/lib/std/cbits/filePosn.c
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * (c) The GRASP/AQUA Project, Glasgow University, 1994-1998
- *
- * $Id: filePosn.c,v 1.7 2000/04/14 16:25:08 rrt Exp $
- *
- * hGetPosn and hSetPosn Runtime Support
- */
-
-#include "Rts.h"
-#include "stgio.h"
-
-#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif
-
-StgInt
-getFilePosn(ptr)
-StgForeignPtr ptr;
-{
- IOFileObject* fo = (IOFileObject*)ptr;
- off_t posn;
- while ( (posn = lseek(fo->fd, 0, SEEK_CUR)) == -1) {
- if (errno != EINTR) {
- cvtErrno();
- stdErrno();
- return -1;
- }
- }
- if (fo->flags & FILEOBJ_WRITE) {
- posn += fo->bufWPtr;
- } else if (fo->flags & FILEOBJ_READ) {
- posn -= (fo->bufWPtr - fo->bufRPtr);
-#if defined(_WIN32)
- if (fo->buf && !(fo->flags & FILEOBJ_BINARY)) {
- /* Sigh, to get at the Real file position for files opened
- in text mode, we need to scan the read buffer looking for
- '\n's, making them count as \r\n (i.e., undoing the work of
- read()), since lseek() returns the raw position.
- */
- int i, j;
-
- i = fo->bufRPtr;
- j = fo->bufWPtr;
- while (i <= j) {
- if (((char*)fo->buf)[i] == '\n') {
- posn--;
- }
- i++;
- }
- }
-#endif
- }
- return (StgInt)posn;
-}
-
-/* The following is only called with a position that we've already visited
- (this is ensured by making the Haskell file posn. type abstract.)
-*/
-StgInt
-setFilePosn(StgForeignPtr ptr, StgInt size, StgByteArray d)
-{
- IOFileObject* fo = (IOFileObject*)ptr;
- int rc;
- off_t offset;
-
- /*
- * We need to snatch the offset out of an MP_INT. The bits are there sans sign,
- * which we pick up from our size parameter. If abs(size) is greater than 1,
- * this integer is just too big.
- */
- switch (size) {
- case -1:
- offset = -*(StgInt *) d;
- break;
- case 0:
- offset = 0;
- break;
- case 1:
- offset = *(StgInt *) d;
- break;
- default:
- ghc_errtype = ERR_INVALIDARGUMENT;
- ghc_errstr = "offset out of range";
- return -1;
- }
-
- rc = flushBuffer(ptr);
- if (rc < 0) return rc;
-
- while (lseek(fo->fd, offset, SEEK_SET) == -1) {
- if (errno != EINTR) {
- cvtErrno();
- stdErrno();
- return -1;
- }
- }
- FILEOBJ_CLEAR_EOF(fo);
- return 0;
-}