FileStream.st
changeset 85 1343af456e28
parent 77 6c38ca59927f
child 88 81dacba7a63a
equal deleted inserted replaced
84:1eba5946aea2 85:1343af456e28
    22               All Rights Reserved
    22               All Rights Reserved
    23 
    23 
    24 This class provides access to the operating systems underlying file
    24 This class provides access to the operating systems underlying file
    25 system (i.e. its an interface to the stdio library).
    25 system (i.e. its an interface to the stdio library).
    26 
    26 
    27 $Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.11 1994-05-17 10:07:32 claus Exp $
    27 $Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.12 1994-06-02 11:20:21 claus Exp $
    28 '!
    28 '!
    29 
    29 
    30 %{
    30 %{
    31 #include <stdio.h>
    31 #include <stdio.h>
    32 #include <errno.h>
    32 #include <errno.h>
   291 
   291 
   292     |retVal|
   292     |retVal|
   293 %{
   293 %{
   294     FILE *f;
   294     FILE *f;
   295     OBJ path;
   295     OBJ path;
   296     extern OBJ ErrorNumber, Filename;
   296     extern OBJ Filename;
   297     extern errno;
   297     extern errno;
   298 
   298 
   299     if (_INST(filePointer) == nil) {
   299     if (_INST(filePointer) == nil) {
   300         path = _INST(pathName);
   300         path = _INST(pathName);
   301         if (path != nil 
   301         if (path != nil 
   311 
   311 
   312                 f = (FILE *) fopen((char *) _stringVal(path), (char *) _stringVal(openmode));
   312                 f = (FILE *) fopen((char *) _stringVal(path), (char *) _stringVal(openmode));
   313 #endif
   313 #endif
   314             } while ((f == NULL) && (errno == EINTR));
   314             } while ((f == NULL) && (errno == EINTR));
   315             if (f == NULL) {
   315             if (f == NULL) {
   316                 ErrorNumber = _MKSMALLINT(errno);
   316                 ExternalStream_LastErrorNumber = _MKSMALLINT(errno);
   317                 _INST(position) = nil;
   317                 _INST(position) = nil;
   318             } else {
   318             } else {
   319                 _INST(filePointer) = MKOBJ((int)f);
   319                 _INST(filePointer) = MKOBJ((int)f);
   320                 _INST(position) = _MKSMALLINT(1);
   320                 _INST(position) = _MKSMALLINT(1);
   321                 retVal = self;
   321                 retVal = self;
   422 #else
   422 #else
   423     FILE *f;
   423     FILE *f;
   424     struct stat buf;
   424     struct stat buf;
   425     int ret;
   425     int ret;
   426     extern errno;
   426     extern errno;
   427     extern OBJ ErrorNumber;
       
   428     int fd;
   427     int fd;
   429 
   428 
   430     if (_INST(filePointer) != nil) {
   429     if (_INST(filePointer) != nil) {
   431         f = (FILE *)MKFD(_INST(filePointer));
   430         f = (FILE *)MKFD(_INST(filePointer));
   432         fd = fileno(f);
   431         fd = fileno(f);
   434             ret = fstat(fd, &buf);
   433             ret = fstat(fd, &buf);
   435         } while ((ret < 0) && (errno == EINTR));
   434         } while ((ret < 0) && (errno == EINTR));
   436         if (ret >= 0) {
   435         if (ret >= 0) {
   437             RETURN ( _MKSMALLINT(buf.st_size) );
   436             RETURN ( _MKSMALLINT(buf.st_size) );
   438         }
   437         }
   439         ErrorNumber = _MKSMALLINT(errno);
   438         ExternalStream_LastErrorNumber = _MKSMALLINT(errno);
   440     }
   439     }
   441 #endif
   440 #endif
   442 %}
   441 %}
   443 .
   442 .
   444     "could add a fall-back here:
   443     "could add a fall-back here:
   460 %{  /* NOCONTEXT */
   459 %{  /* NOCONTEXT */
   461 
   460 
   462     FILE *f;
   461     FILE *f;
   463     long currentPosition;
   462     long currentPosition;
   464     extern errno;
   463     extern errno;
   465     extern OBJ ErrorNumber;
       
   466 
   464 
   467     if (_INST(filePointer) != nil) {
   465     if (_INST(filePointer) != nil) {
   468         f = (FILE *)MKFD(_INST(filePointer));
   466         f = (FILE *)MKFD(_INST(filePointer));
   469         do {
   467         do {
   470             if (_INST(buffered) == true) {
   468             if (_INST(buffered) == true) {
   477             /*
   475             /*
   478              * notice: Smalltalk index starts at 1
   476              * notice: Smalltalk index starts at 1
   479              */
   477              */
   480             RETURN ( _MKSMALLINT(currentPosition + 1) );
   478             RETURN ( _MKSMALLINT(currentPosition + 1) );
   481         }
   479         }
   482         ErrorNumber = _MKSMALLINT(errno);
   480         ExternalStream_LastErrorNumber = _MKSMALLINT(errno);
   483     }
   481     }
   484 %}
   482 %}
   485 .
   483 .
   486     filePointer isNil ifTrue:[^ self errorNotOpen].
   484     filePointer isNil ifTrue:[^ self errorNotOpen].
   487     ^ self primitiveFailed
   485     ^ self primitiveFailed
   492 
   490 
   493 %{  /* NOCONTEXT */
   491 %{  /* NOCONTEXT */
   494 
   492 
   495     FILE *f;
   493     FILE *f;
   496     int ret;
   494     int ret;
   497     extern OBJ ErrorNumber;
       
   498     extern errno;
   495     extern errno;
   499 
   496 
   500     if (_INST(filePointer) != nil) {
   497     if (_INST(filePointer) != nil) {
   501         if (_isSmallInteger(newPos)) {
   498         if (_isSmallInteger(newPos)) {
   502             f = (FILE *)MKFD(_INST(filePointer));
   499             f = (FILE *)MKFD(_INST(filePointer));
   516                  * just to make certain ...
   513                  * just to make certain ...
   517                  */
   514                  */
   518                 _INST(hitEOF) = false;
   515                 _INST(hitEOF) = false;
   519                 RETURN ( self );
   516                 RETURN ( self );
   520             }
   517             }
   521             ErrorNumber = _MKSMALLINT(errno);
   518             ExternalStream_LastErrorNumber = _MKSMALLINT(errno);
   522         }
   519         }
   523     }
   520     }
   524 %}
   521 %}
   525 .
   522 .
   526     filePointer isNil ifTrue:[^ self errorNotOpen].
   523     filePointer isNil ifTrue:[^ self errorNotOpen].
   531     "set the read/write position in the file to be at the end of the file"
   528     "set the read/write position in the file to be at the end of the file"
   532 
   529 
   533 %{
   530 %{
   534     FILE *f;
   531     FILE *f;
   535     int ret;
   532     int ret;
   536     extern OBJ ErrorNumber;
       
   537     extern errno;
   533     extern errno;
   538 
   534 
   539     if (_INST(filePointer) != nil) {
   535     if (_INST(filePointer) != nil) {
   540         f = (FILE *)MKFD(_INST(filePointer));
   536         f = (FILE *)MKFD(_INST(filePointer));
   541         _INST(position) = nil;
   537         _INST(position) = nil;
   547             }
   543             }
   548         } while ((ret < 0) && (errno == EINTR));
   544         } while ((ret < 0) && (errno == EINTR));
   549         if (ret >= 0) {
   545         if (ret >= 0) {
   550             RETURN ( self );
   546             RETURN ( self );
   551         }
   547         }
   552         ErrorNumber = _MKSMALLINT(errno);
   548         ExternalStream_LastErrorNumber = _MKSMALLINT(errno);
   553     }
   549     }
   554 %}
   550 %}
   555 .
   551 .
   556     filePointer isNil ifTrue:[^ self errorNotOpen].
   552     filePointer isNil ifTrue:[^ self errorNotOpen].
   557     DemoMode ifTrue:[^ self warn:'no save in Demo mode'].
   553     DemoMode ifTrue:[^ self warn:'no save in Demo mode'].