care for fopen returning a FILE* of -1
authorClaus Gittinger <cg@exept.de>
Sat, 10 Jul 1999 12:18:50 +0200
changeset 4361 6ce4ff1e7f3c
parent 4360 41671bce2bd6
child 4362 f13cb0309e66
care for fopen returning a FILE* of -1
FileStr_win32.st
FileStream_win32.st
--- a/FileStr_win32.st	Sat Jul 10 01:05:49 1999 +0200
+++ b/FileStr_win32.st	Sat Jul 10 12:18:50 1999 +0200
@@ -19,9 +19,6 @@
 
 !FileStream primitiveDefinitions!
 %{
-#ifdef __openVMS__
-# undef __new
-#endif
 
 #include <stdio.h>
 #define _STDIO_H_INCLUDED_
@@ -29,20 +26,8 @@
 #include <errno.h>
 #define _ERRNO_H_INCLUDED_
 
-#ifdef transputer
-# include <iocntrl.h>
-# ifndef fileno
-   /* kludge: inmos forgot fileno */
-#  define fileno(f)     ((f)->__file)
-# endif
-#else
-# include <sys/types.h>
-# include <sys/stat.h>
-#endif
-
-#ifdef hpux
-# define fileno(f)      ((f->__fileH << 8) | (f->__fileL))
-#endif
+#include <sys/types.h>
+#include <sys/stat.h>
 
 #ifndef SEEK_SET
 # define SEEK_SET       0
@@ -58,150 +43,142 @@
  * not all systems have off_t
  * explicit add of those we know to have ...
  */
-#ifdef __osf__
-# define OFF_T  off_t
-#endif
 
 #ifndef OFF_T
 # define OFF_T  long
 #endif
 
-#ifdef __VMS__
-/*
- * get those VMS definitions ...
- */
-# include <rms.h>
+#if 1
+# define NO_STDIO
+#else
+# undef __BEGIN_INTERRUPTABLE__
+# undef __END_INTERRUPTABLE__
+# define __BEGIN_INTERRUPTABLE__
+# define __END_INTERRUPTABLE__
+#endif
+
+#ifdef i386
+# define _X86_
 #endif
 
-#ifdef WIN32
-# if 1
-#  define NO_STDIO
-# else
-#  undef __BEGIN_INTERRUPTABLE__
-#  undef __END_INTERRUPTABLE__
-#  define __BEGIN_INTERRUPTABLE__
-#  define __END_INTERRUPTABLE__
-# endif
-# ifdef i386
-#  define _X86_
-# endif
+#undef INT
+#undef Array
+#undef Number
+#undef Method
+#undef Point
+#undef Rectangle
+#undef Block
+#undef Time
+#undef Date
 
-# undef INT
-# undef Array
-# undef Number
-# undef Method
-# undef Point
-# undef Rectangle
-# undef Block
-# undef Time
-# undef Date
-
-# define NOATOM
-# define NOGDICAPMASKS
-# define NOMETAFILE
-# define NOMINMAX
+#define NOATOM
+#define NOGDICAPMASKS
+#define NOMETAFILE
+#define NOMINMAX
 //# define NOOPENFILE
-# define NOSOUND
-# define NOWH
+#define NOSOUND
+#define NOWH
 //# define NOCOMM
-# define NOKANJI
-# define NOCRYPT
+#define NOKANJI
+#define NOCRYPT
 //# define NOMCX
-# define WIN32_LEAN_AND_MEAN
-# include <windows.h>
-# include <winsock.h> /* */
-# if !defined(__BORLANDC__)
-#  define stat _stat
-# endif
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <winsock.h> /* */
+#if !defined(__BORLANDC__)
+# define stat _stat
+#endif
 
-# ifdef __DEF_Array
-#   define Array __DEF_Array
-# endif
-# ifdef __DEF_Number
-#   define Number __DEF_Number
-# endif
-# ifdef __DEF_Method
-#   define Method __DEF_Method
-# endif
-# ifdef __DEF_Point
-#   define Point __DEF_Point
-# endif
-# ifdef __DEF_Block
-#   define Block __DEF_Block
-# endif
-# ifdef __DEF_Time
-#   define Time __DEF_Time
-# endif
-# ifdef __DEF_Date
-#   define Date __DEF_Date
-# endif
+#ifdef __DEF_Array
+#  define Array __DEF_Array
+#endif
+#ifdef __DEF_Number
+#  define Number __DEF_Number
+#endif
+#ifdef __DEF_Method
+#  define Method __DEF_Method
+#endif
+#ifdef __DEF_Point
+#  define Point __DEF_Point
+#endif
+#ifdef __DEF_Block
+#  define Block __DEF_Block
+#endif
+#ifdef __DEF_Time
+#  define Time __DEF_Time
+#endif
+#ifdef __DEF_Date
+#  define Date __DEF_Date
+#endif
 
-# define INT int
-#endif /* WIN32 */
+#define INT int
 
 #ifdef NO_STDIO
+
 /*# define HFILE HANDLE*/
 # define HFILE FILE *
 //# define fileno(f) f
 
-# define TELL(currentPosition,f,buffered)                               \
+# define TELL(currentPosition,f,buffered)                       \
     if (buffered) {                                             \
 	currentPosition = ftell(f);                             \
     } else {                                                    \
-      OBJ rA = __INST(readAhead);                                       \
-      if (rA != nil) {                                                  \
-	  __INST(readAhead) = nil;                                      \
-	currentPosition = lseek(fileno(f), -1L, SEEK_CUR);                      \
-      }                                                                 \
-      else \
-	currentPosition = lseek(fileno(f), 0L, SEEK_CUR);                       \
+	OBJ rA = __INST(readAhead);                             \
+	if (rA != nil) {                                        \
+	    __INST(readAhead) = nil;                            \
+	    currentPosition = lseek(fileno(f), -1L, SEEK_CUR);  \
+	} else {                                                \
+	  currentPosition = lseek(fileno(f), 0L, SEEK_CUR);     \
+	}                                                       \
+    }
+
+# define SEEK(ret,f,nP,buffered)                        \
+    if (buffered) {                                     \
+	ret = fseek(f, nP, SEEK_SET);                   \
+    } else {                                            \
+	OBJ rA = __INST(readAhead);                     \
+	if (rA != nil) {                                \
+	    __INST(readAhead) = nil;                    \
+	}                                               \
+	ret = lseek(fileno(f), nP, SEEK_SET);           \
     }
 
-# define SEEK(ret,f,nP,buffered)                                        \
-	  if (buffered) {                                     \
-	      ret = fseek(f, nP, SEEK_SET);                   \
-	  } else {                                            \
-	    OBJ rA = __INST(readAhead);                                 \
-	    if (rA != nil) {                                            \
-		__INST(readAhead) = nil;                                \
-	    }                                                           \
-	    ret = lseek(fileno(f), nP, SEEK_SET);                       \
-	  }
+# define TOEND(ret,f,buffered)                          \
+    if (buffered) {                                     \
+	ret = fseek(f, 0L, SEEK_END);                   \
+    } else {                                            \
+	OBJ rA = __INST(readAhead);                     \
+	if (rA != nil) {                                \
+	    __INST(readAhead) = nil;                    \
+	}                                               \
+	ret = lseek(fileno(f), 0L, SEEK_END);           \
+    }
 
-# define TOEND(ret,f,buffered) \
-	  if (buffered) {                                             \
-	      ret = fseek(f, 0L, SEEK_END);                           \
-	  } else {                                                    \
-	    OBJ rA = __INST(readAhead);                                 \
-	    if (rA != nil) {                                            \
-		__INST(readAhead) = nil;                                \
-	    }                                                           \
-	    ret = lseek(fileno(f), 0L, SEEK_END);                       \
-	  }
 #else
+
 # define HFILE FILE *
 
-# define TELL(currentPosition,f,buffered) \
-	    if (buffered) {                                             \
-		currentPosition = ftell(f);                             \
-	    } else {                                                    \
-		currentPosition = lseek(fileno(f), 0L, SEEK_CUR);       \
-	    }
+# define TELL(currentPosition,f,buffered)                 \
+    if (buffered) {                                       \
+	currentPosition = ftell(f);                       \
+    } else {                                              \
+	currentPosition = lseek(fileno(f), 0L, SEEK_CUR); \
+    }
 
-# define SEEK(ret,f,nP,buffered)                                        \
-		    if (buffered) {                                     \
-			ret = fseek(f, nP, SEEK_SET);                   \
-		    } else {                                            \
-			ret = lseek(fileno(f), nP, SEEK_SET);           \
-		    }
+# define SEEK(ret,f,nP,buffered)                        \
+    if (buffered) {                                     \
+	ret = fseek(f, nP, SEEK_SET);                   \
+    } else {                                            \
+	ret = lseek(fileno(f), nP, SEEK_SET);           \
+    }
 
-# define TOEND(ret,f,buffered) \
-	    if (buffered) {                                             \
-		ret = fseek(f, 0L, SEEK_END);                           \
-	    } else {                                                    \
-		ret = lseek(fileno(f), 0L, SEEK_END);                   \
-	    }
-	    
+# define TOEND(ret,f,buffered)                          \
+    if (buffered) {                                     \
+	ret = fseek(f, 0L, SEEK_END);                   \
+    } else {                                            \
+	ret = lseek(fileno(f), 0L, SEEK_END);           \
+    }
+            
  extern long ftell(), lseek();
 #endif
 
@@ -255,36 +232,12 @@
 	canPosition     <Boolean>       positionable - read above comment
 
     [author:]
-	Claus Gittinger
+	Claus Gittinger (original Unix version)
+	Manfred Dierolf (dos port)
 
     [see also:]
 	Filename DirectoryStream PipeStream Socket
 "
-!
-
-examples
-"
-  for VMS users only:
-
-    The #openWithMode:attributes: entry allows additional RMS attributes
-    to be passed in the second argument, which must be an array of strings
-    as described in the 'creat' RTL Library documentation.
-
-    For example, to create a file with fixed records and recordLength of 100,
-    use:
-
-	|newFile|
-
-	newFile := FileStream new pathName:'<nameOfFile>'.
-	newFile setMode:#writeonly.
-	newFile openWithMode:'w' attributes:#('rfm=fix' 'fsz=100').
-
-    since all of the above is private protocol, and it is considered bad style to
-    access these from user programs, we recommend subclassing FileStream as
-    something like VMSFixedRecordFileStream, and redefine the instance creation
-    method(s) there as appropriate. 
-    This will retain VMS specifics in one place and enhance maintanability.
-"
 ! !
 
 !FileStream class methodsFor:'initialization'!
@@ -879,7 +832,7 @@
 	    path = __INST(pathName);
 	} while ((f == NULL) && (errno == EINTR));
 
-	if (f == NULL) {
+	if ((f == NULL) || (f == (HFILE)(-1)){
 	    /*
 	     * If no filedescriptors available, try to finalize
 	     * possibly collected fd's and try again.
@@ -1024,6 +977,6 @@
 !FileStream class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/Attic/FileStr_win32.st,v 1.6 1999-06-18 12:49:31 ps Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Attic/FileStr_win32.st,v 1.7 1999-07-10 10:18:50 cg Exp $'
 ! !
 FileStream initialize!
--- a/FileStream_win32.st	Sat Jul 10 01:05:49 1999 +0200
+++ b/FileStream_win32.st	Sat Jul 10 12:18:50 1999 +0200
@@ -19,9 +19,6 @@
 
 !FileStream primitiveDefinitions!
 %{
-#ifdef __openVMS__
-# undef __new
-#endif
 
 #include <stdio.h>
 #define _STDIO_H_INCLUDED_
@@ -29,20 +26,8 @@
 #include <errno.h>
 #define _ERRNO_H_INCLUDED_
 
-#ifdef transputer
-# include <iocntrl.h>
-# ifndef fileno
-   /* kludge: inmos forgot fileno */
-#  define fileno(f)     ((f)->__file)
-# endif
-#else
-# include <sys/types.h>
-# include <sys/stat.h>
-#endif
-
-#ifdef hpux
-# define fileno(f)      ((f->__fileH << 8) | (f->__fileL))
-#endif
+#include <sys/types.h>
+#include <sys/stat.h>
 
 #ifndef SEEK_SET
 # define SEEK_SET       0
@@ -58,150 +43,142 @@
  * not all systems have off_t
  * explicit add of those we know to have ...
  */
-#ifdef __osf__
-# define OFF_T  off_t
-#endif
 
 #ifndef OFF_T
 # define OFF_T  long
 #endif
 
-#ifdef __VMS__
-/*
- * get those VMS definitions ...
- */
-# include <rms.h>
+#if 1
+# define NO_STDIO
+#else
+# undef __BEGIN_INTERRUPTABLE__
+# undef __END_INTERRUPTABLE__
+# define __BEGIN_INTERRUPTABLE__
+# define __END_INTERRUPTABLE__
+#endif
+
+#ifdef i386
+# define _X86_
 #endif
 
-#ifdef WIN32
-# if 1
-#  define NO_STDIO
-# else
-#  undef __BEGIN_INTERRUPTABLE__
-#  undef __END_INTERRUPTABLE__
-#  define __BEGIN_INTERRUPTABLE__
-#  define __END_INTERRUPTABLE__
-# endif
-# ifdef i386
-#  define _X86_
-# endif
+#undef INT
+#undef Array
+#undef Number
+#undef Method
+#undef Point
+#undef Rectangle
+#undef Block
+#undef Time
+#undef Date
 
-# undef INT
-# undef Array
-# undef Number
-# undef Method
-# undef Point
-# undef Rectangle
-# undef Block
-# undef Time
-# undef Date
-
-# define NOATOM
-# define NOGDICAPMASKS
-# define NOMETAFILE
-# define NOMINMAX
+#define NOATOM
+#define NOGDICAPMASKS
+#define NOMETAFILE
+#define NOMINMAX
 //# define NOOPENFILE
-# define NOSOUND
-# define NOWH
+#define NOSOUND
+#define NOWH
 //# define NOCOMM
-# define NOKANJI
-# define NOCRYPT
+#define NOKANJI
+#define NOCRYPT
 //# define NOMCX
-# define WIN32_LEAN_AND_MEAN
-# include <windows.h>
-# include <winsock.h> /* */
-# if !defined(__BORLANDC__)
-#  define stat _stat
-# endif
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <winsock.h> /* */
+#if !defined(__BORLANDC__)
+# define stat _stat
+#endif
 
-# ifdef __DEF_Array
-#   define Array __DEF_Array
-# endif
-# ifdef __DEF_Number
-#   define Number __DEF_Number
-# endif
-# ifdef __DEF_Method
-#   define Method __DEF_Method
-# endif
-# ifdef __DEF_Point
-#   define Point __DEF_Point
-# endif
-# ifdef __DEF_Block
-#   define Block __DEF_Block
-# endif
-# ifdef __DEF_Time
-#   define Time __DEF_Time
-# endif
-# ifdef __DEF_Date
-#   define Date __DEF_Date
-# endif
+#ifdef __DEF_Array
+#  define Array __DEF_Array
+#endif
+#ifdef __DEF_Number
+#  define Number __DEF_Number
+#endif
+#ifdef __DEF_Method
+#  define Method __DEF_Method
+#endif
+#ifdef __DEF_Point
+#  define Point __DEF_Point
+#endif
+#ifdef __DEF_Block
+#  define Block __DEF_Block
+#endif
+#ifdef __DEF_Time
+#  define Time __DEF_Time
+#endif
+#ifdef __DEF_Date
+#  define Date __DEF_Date
+#endif
 
-# define INT int
-#endif /* WIN32 */
+#define INT int
 
 #ifdef NO_STDIO
+
 /*# define HFILE HANDLE*/
 # define HFILE FILE *
 //# define fileno(f) f
 
-# define TELL(currentPosition,f,buffered)                               \
+# define TELL(currentPosition,f,buffered)                       \
     if (buffered) {                                             \
 	currentPosition = ftell(f);                             \
     } else {                                                    \
-      OBJ rA = __INST(readAhead);                                       \
-      if (rA != nil) {                                                  \
-	  __INST(readAhead) = nil;                                      \
-	currentPosition = lseek(fileno(f), -1L, SEEK_CUR);                      \
-      }                                                                 \
-      else \
-	currentPosition = lseek(fileno(f), 0L, SEEK_CUR);                       \
+	OBJ rA = __INST(readAhead);                             \
+	if (rA != nil) {                                        \
+	    __INST(readAhead) = nil;                            \
+	    currentPosition = lseek(fileno(f), -1L, SEEK_CUR);  \
+	} else {                                                \
+	  currentPosition = lseek(fileno(f), 0L, SEEK_CUR);     \
+	}                                                       \
+    }
+
+# define SEEK(ret,f,nP,buffered)                        \
+    if (buffered) {                                     \
+	ret = fseek(f, nP, SEEK_SET);                   \
+    } else {                                            \
+	OBJ rA = __INST(readAhead);                     \
+	if (rA != nil) {                                \
+	    __INST(readAhead) = nil;                    \
+	}                                               \
+	ret = lseek(fileno(f), nP, SEEK_SET);           \
     }
 
-# define SEEK(ret,f,nP,buffered)                                        \
-	  if (buffered) {                                     \
-	      ret = fseek(f, nP, SEEK_SET);                   \
-	  } else {                                            \
-	    OBJ rA = __INST(readAhead);                                 \
-	    if (rA != nil) {                                            \
-		__INST(readAhead) = nil;                                \
-	    }                                                           \
-	    ret = lseek(fileno(f), nP, SEEK_SET);                       \
-	  }
+# define TOEND(ret,f,buffered)                          \
+    if (buffered) {                                     \
+	ret = fseek(f, 0L, SEEK_END);                   \
+    } else {                                            \
+	OBJ rA = __INST(readAhead);                     \
+	if (rA != nil) {                                \
+	    __INST(readAhead) = nil;                    \
+	}                                               \
+	ret = lseek(fileno(f), 0L, SEEK_END);           \
+    }
 
-# define TOEND(ret,f,buffered) \
-	  if (buffered) {                                             \
-	      ret = fseek(f, 0L, SEEK_END);                           \
-	  } else {                                                    \
-	    OBJ rA = __INST(readAhead);                                 \
-	    if (rA != nil) {                                            \
-		__INST(readAhead) = nil;                                \
-	    }                                                           \
-	    ret = lseek(fileno(f), 0L, SEEK_END);                       \
-	  }
 #else
+
 # define HFILE FILE *
 
-# define TELL(currentPosition,f,buffered) \
-	    if (buffered) {                                             \
-		currentPosition = ftell(f);                             \
-	    } else {                                                    \
-		currentPosition = lseek(fileno(f), 0L, SEEK_CUR);       \
-	    }
+# define TELL(currentPosition,f,buffered)                 \
+    if (buffered) {                                       \
+	currentPosition = ftell(f);                       \
+    } else {                                              \
+	currentPosition = lseek(fileno(f), 0L, SEEK_CUR); \
+    }
 
-# define SEEK(ret,f,nP,buffered)                                        \
-		    if (buffered) {                                     \
-			ret = fseek(f, nP, SEEK_SET);                   \
-		    } else {                                            \
-			ret = lseek(fileno(f), nP, SEEK_SET);           \
-		    }
+# define SEEK(ret,f,nP,buffered)                        \
+    if (buffered) {                                     \
+	ret = fseek(f, nP, SEEK_SET);                   \
+    } else {                                            \
+	ret = lseek(fileno(f), nP, SEEK_SET);           \
+    }
 
-# define TOEND(ret,f,buffered) \
-	    if (buffered) {                                             \
-		ret = fseek(f, 0L, SEEK_END);                           \
-	    } else {                                                    \
-		ret = lseek(fileno(f), 0L, SEEK_END);                   \
-	    }
-	    
+# define TOEND(ret,f,buffered)                          \
+    if (buffered) {                                     \
+	ret = fseek(f, 0L, SEEK_END);                   \
+    } else {                                            \
+	ret = lseek(fileno(f), 0L, SEEK_END);           \
+    }
+            
  extern long ftell(), lseek();
 #endif
 
@@ -255,36 +232,12 @@
 	canPosition     <Boolean>       positionable - read above comment
 
     [author:]
-	Claus Gittinger
+	Claus Gittinger (original Unix version)
+	Manfred Dierolf (dos port)
 
     [see also:]
 	Filename DirectoryStream PipeStream Socket
 "
-!
-
-examples
-"
-  for VMS users only:
-
-    The #openWithMode:attributes: entry allows additional RMS attributes
-    to be passed in the second argument, which must be an array of strings
-    as described in the 'creat' RTL Library documentation.
-
-    For example, to create a file with fixed records and recordLength of 100,
-    use:
-
-	|newFile|
-
-	newFile := FileStream new pathName:'<nameOfFile>'.
-	newFile setMode:#writeonly.
-	newFile openWithMode:'w' attributes:#('rfm=fix' 'fsz=100').
-
-    since all of the above is private protocol, and it is considered bad style to
-    access these from user programs, we recommend subclassing FileStream as
-    something like VMSFixedRecordFileStream, and redefine the instance creation
-    method(s) there as appropriate. 
-    This will retain VMS specifics in one place and enhance maintanability.
-"
 ! !
 
 !FileStream class methodsFor:'initialization'!
@@ -879,7 +832,7 @@
 	    path = __INST(pathName);
 	} while ((f == NULL) && (errno == EINTR));
 
-	if (f == NULL) {
+	if ((f == NULL) || (f == (HFILE)(-1)){
 	    /*
 	     * If no filedescriptors available, try to finalize
 	     * possibly collected fd's and try again.
@@ -1024,6 +977,6 @@
 !FileStream class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/Attic/FileStream_win32.st,v 1.6 1999-06-18 12:49:31 ps Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Attic/FileStream_win32.st,v 1.7 1999-07-10 10:18:50 cg Exp $'
 ! !
 FileStream initialize!