From 15ecf716d38217d00af04f4dff724fb849fc257a Mon Sep 17 00:00:00 2001
From: sof <unknown>
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 9266c58ba6d4..c9fecc4e33e2 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 f3efb3488de6..9f4c80eb8d28 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 81128d4d9cc4..cdd3eb20cf2c 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 336c0d9a7c18..131c956364af 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 df0d332ca72b..91a172251d62 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 826c4f48b311..7a0d7907b80a 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 bca57bafbeec..4e6b85bb04e4 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 ed3da3c77acd..34348feedf83 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 68aa4456c514..6cfd484e741e 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 0c6bb44b7053..cb0b9840d2a2 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 f39014e25e0d..1ed0dbf7eedf 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 fc8184e994d9..7e62f31eec1b 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 2b649e3dbd57..0cc9c2c7b931 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 caff60701875..48c0cf7d3b91 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 ffccf70ca0df..0169b50ce2f2 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 791323769ad3..82b223f9cd9c 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 6981bf128ca2..71c7b0df173e 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;
-- 
GitLab