From 15ecf716d38217d00af04f4dff724fb849fc257a Mon Sep 17 00:00:00 2001 From: sof Date: Fri, 14 Mar 1997 05:17:32 +0000 Subject: [PATCH] [project @ 1997-03-14 05:17:06 by sof] FILE objects are now StgForeignPtrs --- ghc/lib/cbits/Makefile | 67 ++++++++++++++++++---------------------- ghc/lib/cbits/closeFile.lc | 7 +++-- ghc/lib/cbits/fileEOF.lc | 2 +- ghc/lib/cbits/fileGetc.lc | 2 +- ghc/lib/cbits/fileLookAhead.lc | 2 +- ghc/lib/cbits/filePosn.lc | 4 +-- ghc/lib/cbits/filePutc.lc | 2 +- ghc/lib/cbits/fileSize.lc | 2 +- ghc/lib/cbits/flushFile.lc | 2 +- ghc/lib/cbits/getBufferMode.lc | 2 +- ghc/lib/cbits/getLock.lc | 12 ++++--- ghc/lib/cbits/inputReady.lc | 2 +- ghc/lib/cbits/readFile.lc | 6 ++-- ghc/lib/cbits/seekFile.lc | 4 +-- ghc/lib/cbits/setBuffering.lc | 2 +- ghc/lib/cbits/stgio.h | 47 +++++++++++++++------------- ghc/lib/cbits/writeFile.lc | 2 +- 17 files changed, 84 insertions(+), 83 deletions(-) diff --git a/ghc/lib/cbits/Makefile b/ghc/lib/cbits/Makefile index 9266c58b..c9fecc4 100644 --- a/ghc/lib/cbits/Makefile +++ b/ghc/lib/cbits/Makefile @@ -1,37 +1,30 @@ -# $Id: Makefile,v 1.2 1996/11/21 16:47:46 simonm Exp $ - -TOP = ../../.. -UnlitSuffixRules = YES -include $(TOP)/ghc/mk/ghc.mk - -ARCHIVE=libHS_cbits.a -DESTDIR=$(INSTLIBDIR_GHC) - -SRCS=\ -closeFile.lc createDirectory.lc \ -errno.lc fileEOF.lc \ -fileGetc.lc fileLookAhead.lc \ -filePosn.lc filePutc.lc \ -fileSize.lc flushFile.lc \ -getBufferMode.lc getCurrentDirectory.lc \ -getDirectoryContents.lc getLock.lc \ -inputReady.lc openFile.lc \ -readFile.lc removeDirectory.lc \ -removeFile.lc renameDirectory.lc \ -renameFile.lc seekFile.lc \ -setBuffering.lc setCurrentDirectory.lc \ -system.lc writeFile.lc - -LIBOBJS = $(patsubst %.lc, %.o, $(SRCS)) - -%.o : %.c - @$(RM) $@ - $(GHC) $(GHCFLAGS) -c $< -o $@ - -clean :: - $(RM) $(SRCS:.lc=.c) - -C_DEP_SRCS = $(SRCS) -MKDEPENDC_OPTS = -I$(GHC_INCLUDES) - -include $(TOP)/mk/lib.mk +# $Id: Makefile,v 1.3 1997/03/14 05:17:06 sof Exp $ + +TOP = ../.. +include $(TOP)/mk/boilerplate.mk +WAYS= + +LIBRARY=libHS_cbits.a +INSTALL_LIBS+=$(LIBRARY) + +SRCS= $(wildcard *.lc) + +C_SRCS = $(SRCS:.lc=.c) +C_OBJS = $(C_SRCS:.c=.o) +LIBOBJS = $(C_OBJS) +SRC_CC_OPTS = -I$(GHC_INCLUDE_DIR) + +# +# Compile the files using the Haskell compiler (ghc really). +# +CC=$(HC) + +# +# Remove the intermediate .c files +# (the .o's will be removed automatically by default mk setup) +# +CLEAN_FILES += $(C_SRCS) + +SRC_MKDEPENDC_OPTS += -I$(GHC_INCLUDE_DIR) + +include $(TOP)/mk/target.mk diff --git a/ghc/lib/cbits/closeFile.lc b/ghc/lib/cbits/closeFile.lc index f3efb34..9f4c80e 100644 --- a/ghc/lib/cbits/closeFile.lc +++ b/ghc/lib/cbits/closeFile.lc @@ -10,11 +10,14 @@ StgInt closeFile(fp) -StgAddr fp; +StgForeignObj fp; { int rc; - unlockFile(fileno((FILE *) fp)); + if (unlockFile(fileno((FILE *) fp))) { + /* If it has been unlocked, don't bother fclose()ing */ + return 0; + } while ((rc = fclose((FILE *) fp)) != 0) { if (errno != EINTR) { diff --git a/ghc/lib/cbits/fileEOF.lc b/ghc/lib/cbits/fileEOF.lc index 81128d4..cdd3eb2 100644 --- a/ghc/lib/cbits/fileEOF.lc +++ b/ghc/lib/cbits/fileEOF.lc @@ -10,7 +10,7 @@ StgInt fileEOF(fp) -StgAddr fp; +StgForeignObj fp; { if (fileLookAhead(fp) != EOF) return 0; diff --git a/ghc/lib/cbits/fileGetc.lc b/ghc/lib/cbits/fileGetc.lc index 336c0d9..131c956 100644 --- a/ghc/lib/cbits/fileGetc.lc +++ b/ghc/lib/cbits/fileGetc.lc @@ -11,7 +11,7 @@ StgInt fileGetc(fp) -StgAddr fp; +StgForeignObj fp; { int c; diff --git a/ghc/lib/cbits/fileLookAhead.lc b/ghc/lib/cbits/fileLookAhead.lc index df0d332..91a1722 100644 --- a/ghc/lib/cbits/fileLookAhead.lc +++ b/ghc/lib/cbits/fileLookAhead.lc @@ -10,7 +10,7 @@ StgInt fileLookAhead(fp) -StgAddr fp; +StgForeignObj fp; { int c; diff --git a/ghc/lib/cbits/filePosn.lc b/ghc/lib/cbits/filePosn.lc index 826c4f4..7a0d790 100644 --- a/ghc/lib/cbits/filePosn.lc +++ b/ghc/lib/cbits/filePosn.lc @@ -10,7 +10,7 @@ StgInt getFilePosn(fp) -StgAddr fp; +StgForeignObj fp; { StgInt posn; @@ -29,7 +29,7 @@ StgAddr fp; StgInt setFilePosn(fp, posn) -StgAddr fp; +StgForeignObj fp; StgInt posn; { while (fseek((FILE *) fp, posn, SEEK_SET) != 0) { diff --git a/ghc/lib/cbits/filePutc.lc b/ghc/lib/cbits/filePutc.lc index bca57ba..4e6b85b 100644 --- a/ghc/lib/cbits/filePutc.lc +++ b/ghc/lib/cbits/filePutc.lc @@ -11,7 +11,7 @@ StgInt filePutc(fp, c) -StgAddr fp; +StgForeignObj fp; StgInt c; { int rc; diff --git a/ghc/lib/cbits/fileSize.lc b/ghc/lib/cbits/fileSize.lc index ed3da3c..34348fe 100644 --- a/ghc/lib/cbits/fileSize.lc +++ b/ghc/lib/cbits/fileSize.lc @@ -18,7 +18,7 @@ StgInt fileSize(fp, result) -StgAddr fp; +StgForeignObj fp; StgByteArray result; { struct stat sb; diff --git a/ghc/lib/cbits/flushFile.lc b/ghc/lib/cbits/flushFile.lc index 68aa445..6cfd484 100644 --- a/ghc/lib/cbits/flushFile.lc +++ b/ghc/lib/cbits/flushFile.lc @@ -10,7 +10,7 @@ StgInt flushFile(fp) -StgAddr fp; +StgForeignObj fp; { int rc; diff --git a/ghc/lib/cbits/getBufferMode.lc b/ghc/lib/cbits/getBufferMode.lc index 0c6bb44..cb0b984 100644 --- a/ghc/lib/cbits/getBufferMode.lc +++ b/ghc/lib/cbits/getBufferMode.lc @@ -28,7 +28,7 @@ StgInt getBufferMode(fp) -StgAddr fp; +StgForeignObj fp; { struct stat sb; diff --git a/ghc/lib/cbits/getLock.lc b/ghc/lib/cbits/getLock.lc index f39014e..1ed0dbf 100644 --- a/ghc/lib/cbits/getLock.lc +++ b/ghc/lib/cbits/getLock.lc @@ -85,18 +85,18 @@ int exclusive; return 0; } -void +int unlockFile(fd) int fd; { - int i; + int i, rc; for (i = 0; i < readLocks; i++) if (readLock[i].fd == fd) { while (++i < readLocks) readLock[i - 1] = readLock[i]; readLocks--; - return; + return 0; } for (i = 0; i < writeLocks; i++) @@ -104,13 +104,15 @@ int fd; while (++i < writeLocks) writeLock[i - 1] = writeLock[i]; writeLocks--; - return; + return 0; } + /* Signal that we did not find an entry */ + return 1; } StgInt getLock(fp, exclusive) -StgAddr fp; +StgForeignObj fp; StgInt exclusive; { if (lockFile(fileno((FILE *) fp), exclusive) < 0) { diff --git a/ghc/lib/cbits/inputReady.lc b/ghc/lib/cbits/inputReady.lc index fc8184e..7e62f31 100644 --- a/ghc/lib/cbits/inputReady.lc +++ b/ghc/lib/cbits/inputReady.lc @@ -22,7 +22,7 @@ StgInt inputReady(fp) -StgAddr fp; +StgForeignObj fp; { int flags; int c; diff --git a/ghc/lib/cbits/readFile.lc b/ghc/lib/cbits/readFile.lc index 2b649e3..0cc9c2c 100644 --- a/ghc/lib/cbits/readFile.lc +++ b/ghc/lib/cbits/readFile.lc @@ -13,7 +13,7 @@ StgInt readBlock(buf, fp, size) StgAddr buf; -StgAddr fp; +StgForeignObj fp; StgInt size; { int count; @@ -43,7 +43,7 @@ StgInt size; StgInt readLine(buf, fp, size) StgAddr buf; -StgAddr fp; +StgForeignObj fp; StgInt size; { if (feof((FILE *) fp)) { @@ -70,7 +70,7 @@ StgInt size; StgInt readChar(fp) -StgAddr fp; +StgForeignObj fp; { int c; diff --git a/ghc/lib/cbits/seekFile.lc b/ghc/lib/cbits/seekFile.lc index caff607..48c0cf7 100644 --- a/ghc/lib/cbits/seekFile.lc +++ b/ghc/lib/cbits/seekFile.lc @@ -18,7 +18,7 @@ StgInt seekFile(fp, whence, size, d) -StgAddr fp; +StgForeignObj fp; StgInt whence; StgInt size; StgByteArray d; @@ -106,7 +106,7 @@ StgByteArray d; StgInt seekFileP(fp) -StgAddr fp; +StgForeignObj fp; { struct stat sb; diff --git a/ghc/lib/cbits/setBuffering.lc b/ghc/lib/cbits/setBuffering.lc index ffccf70..0169b50 100644 --- a/ghc/lib/cbits/setBuffering.lc +++ b/ghc/lib/cbits/setBuffering.lc @@ -30,7 +30,7 @@ StgInt setBuffering(fp, size) -StgAddr fp; +StgForeignObj fp; StgInt size; { int flags; diff --git a/ghc/lib/cbits/stgio.h b/ghc/lib/cbits/stgio.h index 7913237..82b223f 100644 --- a/ghc/lib/cbits/stgio.h +++ b/ghc/lib/cbits/stgio.h @@ -1,14 +1,14 @@ #ifndef STGIO_H #define STGIO_H -/* Decls for routines in ghc/runtime/io/ only used there. +/* Decls for routines in ghc/lib/cbits/ only used there. * This file is used when compiling the Haskell library * that _ccalls_ those routines; and when compiling those * routines (to check consistency). */ /* closeFile.lc */ -StgInt closeFile PROTO((StgAddr)); +StgInt closeFile PROTO((StgForeignObj)); /* createDirectory.lc */ StgInt createDirectory PROTO((StgByteArray)); @@ -30,29 +30,28 @@ void stdErrno(STG_NO_ARGS); int execvpe PROTO((char *, char **, char **)); /* fileEOF.lc */ -StgInt fileEOF PROTO((StgAddr)); - +StgInt fileEOF PROTO((StgForeignObj)); /* fileGetc.lc */ -StgInt fileGetc PROTO((StgAddr)); +StgInt fileGetc PROTO((StgForeignObj)); /* fileLookAhead.lc */ -StgInt fileLookAhead PROTO((StgAddr)); +StgInt fileLookAhead PROTO((StgForeignObj)); /* filePosn.lc */ -StgInt getFilePosn PROTO((StgAddr)); -StgInt setFilePosn PROTO((StgAddr, StgInt)); +StgInt getFilePosn PROTO((StgForeignObj)); +StgInt setFilePosn PROTO((StgForeignObj, StgInt)); /* filePutc.lc */ -StgInt filePutc PROTO((StgAddr, StgInt)); +StgInt filePutc PROTO((StgForeignObj, StgInt)); /* fileSize.lc */ -StgInt fileSize PROTO((StgAddr, StgByteArray)); +StgInt fileSize PROTO((StgForeignObj, StgByteArray)); /* flushFile.lc */ -StgInt flushFile PROTO((StgAddr)); +StgInt flushFile PROTO((StgForeignObj)); /* getBufferMode.lc */ -StgInt getBufferMode PROTO((StgAddr)); +StgInt getBufferMode PROTO((StgForeignObj)); /* getClockTime.lc */ StgInt getClockTime PROTO((StgByteArray, StgByteArray)); @@ -68,19 +67,23 @@ StgAddr getDirectoryContents PROTO((StgByteArray)); /* getLock.lc */ int lockFile PROTO((int, int)); -void unlockFile PROTO((int)); -StgInt getLock PROTO((StgAddr, StgInt)); +int unlockFile PROTO((int)); +StgInt getLock PROTO((StgForeignObj, StgInt)); /* inputReady.lc */ -StgInt inputReady PROTO((StgAddr)); +StgInt inputReady PROTO((StgForeignObj)); /* openFile.lc */ StgAddr openFile PROTO((StgByteArray, StgByteArray)); +/* freeFile.lc */ +void freeStdChannel PROTO((StgForeignObj)); +void freeFile PROTO((StgForeignObj)); + /* readFile.lc */ -StgInt readBlock PROTO((StgAddr, StgAddr, StgInt)); -StgInt readLine PROTO((StgAddr, StgAddr, StgInt)); -StgInt readChar PROTO((StgAddr)); +StgInt readBlock PROTO((StgAddr, StgForeignObj, StgInt)); +StgInt readLine PROTO((StgAddr, StgForeignObj, StgInt)); +StgInt readChar PROTO((StgForeignObj)); /* removeDirectory.lc */ StgInt removeDirectory PROTO((StgByteArray)); @@ -95,11 +98,11 @@ StgInt renameDirectory PROTO((StgByteArray, StgByteArray)); StgInt renameFile PROTO((StgByteArray, StgByteArray)); /* seekFile.lc */ -StgInt seekFile PROTO((StgAddr, StgInt, StgInt, StgByteArray)); -StgInt seekFileP PROTO((StgAddr)); +StgInt seekFile PROTO((StgForeignObj, StgInt, StgInt, StgByteArray)); +StgInt seekFileP PROTO((StgForeignObj)); /* setBuffering.lc */ -StgInt setBuffering PROTO((StgAddr, StgInt)); +StgInt setBuffering PROTO((StgForeignObj, StgInt)); /* setCurrentDirectory.lc */ StgInt setCurrentDirectory PROTO((StgByteArray)); @@ -120,6 +123,6 @@ StgAddr toUTCTime PROTO((StgInt, StgByteArray, StgByteArray)); StgAddr toClockSec PROTO((StgInt, StgInt, StgInt, StgInt, StgInt, StgInt, StgInt, StgByteArray)); /* writeFile.lc */ -StgInt writeFile PROTO((StgAddr, StgAddr, StgInt)); +StgInt writeFile PROTO((StgAddr, StgForeignObj, StgInt)); #endif /* ! STGIO_H */ diff --git a/ghc/lib/cbits/writeFile.lc b/ghc/lib/cbits/writeFile.lc index 6981bf1..71c7b0d 100644 --- a/ghc/lib/cbits/writeFile.lc +++ b/ghc/lib/cbits/writeFile.lc @@ -11,7 +11,7 @@ StgInt writeFile(buf, fp, bytes) StgAddr buf; -StgAddr fp; +StgForeignObj fp; StgInt bytes; { int count; -- 1.7.10.4