FileStream_win32.st
author Claus Gittinger <cg@exept.de>
Thu, 11 Mar 1999 00:14:46 +0100
changeset 4042 526c79cadbf8
parent 3824 d515d22eca90
child 4298 1889f8051f69
permissions -rw-r--r--
preserve the exitWhenNoMoreUserProcesses flag setting across snapshots.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
 COPYRIGHT (c) 1989 by Claus Gittinger
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
	      All Rights Reserved
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
 This software is furnished under a license and may be used
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 hereby transferred.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
ExternalStream subclass:#FileStream
3755
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
    14
	instanceVariableNames:'pathName canPosition removeOnClose'
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
	classVariableNames:'OpenErrorSignal'
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
	poolDictionaries:''
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
	category:'Streams-External'
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
!FileStream primitiveDefinitions!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
%{
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
#ifdef __openVMS__
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
# undef __new
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
#endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
#include <stdio.h>
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
#define _STDIO_H_INCLUDED_
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
#include <errno.h>
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
#define _ERRNO_H_INCLUDED_
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
#ifdef transputer
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
# include <iocntrl.h>
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
# ifndef fileno
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
   /* kludge: inmos forgot fileno */
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
#  define fileno(f)     ((f)->__file)
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
# endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
#else
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
# include <sys/types.h>
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
# include <sys/stat.h>
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
#endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
#ifdef hpux
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
# define fileno(f)      ((f->__fileH << 8) | (f->__fileL))
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
#endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
#ifndef SEEK_SET
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
# define SEEK_SET       0
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
#endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
#ifndef SEEK_CUR
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
# define SEEK_CUR       1
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
#endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
#ifndef SEEK_END
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
# define SEEK_END       2
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
#endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
/*
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
 * not all systems have off_t
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
 * explicit add of those we know to have ...
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
 */
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
#ifdef __osf__
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
# define OFF_T  off_t
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
#endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
#ifndef OFF_T
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
# define OFF_T  long
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
#endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
#ifdef __VMS__
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
/*
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
 * get those VMS definitions ...
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
 */
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
# include <rms.h>
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
#endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
#ifdef WIN32
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
    77
# if 1
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
    78
#  define NO_STDIO
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
    79
# else
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
    80
#  undef __BEGIN_INTERRUPTABLE__
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
    81
#  undef __END_INTERRUPTABLE__
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
    82
#  define __BEGIN_INTERRUPTABLE__
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
    83
#  define __END_INTERRUPTABLE__
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
    84
# endif
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
# ifdef i386
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
#  define _X86_
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
# endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
    89
# undef INT
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
# undef Array
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
# undef Number
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
# undef Method
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
# undef Point
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
# undef Rectangle
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
# undef Block
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
    97
# define NOATOM
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
    98
# define NOGDICAPMASKS
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
    99
# define NOMETAFILE
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   100
# define NOMINMAX
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   101
//# define NOOPENFILE
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   102
# define NOSOUND
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   103
# define NOWH
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   104
//# define NOCOMM
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   105
# define NOKANJI
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   106
# define NOCRYPT
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   107
//# define NOMCX
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   108
# define WIN32_LEAN_AND_MEAN
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   109
# include <windows.h>
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   110
# include <winsock.h> /* */
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   111
# if !defined(__BORLANDC__)
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   112
#  define stat _stat
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   113
# endif
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
# ifdef __DEF_Array
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
#   define Array __DEF_Array
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
# endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
# ifdef __DEF_Number
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
#   define Number __DEF_Number
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
# endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
# ifdef __DEF_Method
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
#   define Method __DEF_Method
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
# endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
# ifdef __DEF_Point
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
#   define Point __DEF_Point
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
# endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
# ifdef __DEF_Block
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
#   define Block __DEF_Block
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
# endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   131
# define INT int
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   132
#endif /* WIN32 */
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   133
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
#ifdef NO_STDIO
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   135
/*# define HFILE HANDLE*/
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   136
# define HFILE FILE *
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   137
//# define fileno(f) f
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   138
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
# define TELL(currentPosition,f,buffered)                               \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
    if (buffered) {                                             \
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   141
	currentPosition = ftell(f);                             \
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
    } else {                                                    \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
      OBJ rA = __INST(readAhead);                                       \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
      if (rA != nil) {                                                  \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
	  __INST(readAhead) = nil;                                      \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
	currentPosition = lseek(fileno(f), -1L, SEEK_CUR);                      \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
      }                                                                 \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
      else \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
	currentPosition = lseek(fileno(f), 0L, SEEK_CUR);                       \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
    }
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   151
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
# define SEEK(ret,f,nP,buffered)                                        \
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   153
	  if (buffered) {                                     \
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   154
	      ret = fseek(f, nP, SEEK_SET);                   \
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   155
	  } else {                                            \
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
	    OBJ rA = __INST(readAhead);                                 \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
	    if (rA != nil) {                                            \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
		__INST(readAhead) = nil;                                \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
	    }                                                           \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
	    ret = lseek(fileno(f), nP, SEEK_SET);                       \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
	  }
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   162
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
# define TOEND(ret,f,buffered) \
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   164
	  if (buffered) {                                             \
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   165
	      ret = fseek(f, 0L, SEEK_END);                           \
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   166
	  } else {                                                    \
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
	    OBJ rA = __INST(readAhead);                                 \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
	    if (rA != nil) {                                            \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
		__INST(readAhead) = nil;                                \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
	    }                                                           \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
	    ret = lseek(fileno(f), 0L, SEEK_END);                       \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
	  }
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
#else
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   174
# define HFILE FILE *
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   175
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
# define TELL(currentPosition,f,buffered) \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
	    if (buffered) {                                             \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
		currentPosition = ftell(f);                             \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
	    } else {                                                    \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
		currentPosition = lseek(fileno(f), 0L, SEEK_CUR);       \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
	    }
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   182
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
# define SEEK(ret,f,nP,buffered)                                        \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
		    if (buffered) {                                     \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
			ret = fseek(f, nP, SEEK_SET);                   \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
		    } else {                                            \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
			ret = lseek(fileno(f), nP, SEEK_SET);           \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
		    }
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   189
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
# define TOEND(ret,f,buffered) \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
	    if (buffered) {                                             \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
		ret = fseek(f, 0L, SEEK_END);                           \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
	    } else {                                                    \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
		ret = lseek(fileno(f), 0L, SEEK_END);                   \
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
	    }
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
            
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
 extern long ftell(), lseek();
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
#endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
/*
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
 * on some systems errno is a macro ... check for it here
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
 */
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
#ifndef errno
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
 extern errno;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
#endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
%}
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
!FileStream class methodsFor:'documentation'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
copyright
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
 COPYRIGHT (c) 1989 by Claus Gittinger
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
	      All Rights Reserved
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
 This software is furnished under a license and may be used
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
 only in accordance with the terms of that license and with the
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
 inclusion of the above copyright notice.   This software may not
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
 be provided or otherwise made available to, or used by, any
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
 other person.  No title to or ownership of the software is
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
 hereby transferred.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
documentation
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
    This class provides access to the operating systems underlying file
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
    system (i.e. its an interface to the stdio library).
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
    Notice, that on some systems, the standard I/O library has performance
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
    problems when a file is opened for readwrite. 
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
    For best results, open files either readonly or writeonly.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
    Also notice, that some OperatingSystems do not fully support
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
    positioning a file stream.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
    For example, poor VMS does not allow positioning onto arbitrary
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
    byte boundaries if the file is a variable-record-RMS file.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
    (stupid enough, this is the default for textfiles as created by
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
     some tools ...)
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
    Therefore, the instance variable canPosition is set according to
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
    this and an error is raised, if a position: is attemted.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
    I know, this is ugly, but what else could we do ?
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
    [instance variables:]
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
	pathName        <String>        the files path (if known)
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
	canPosition     <Boolean>       positionable - read above comment
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
    [author:]
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
	Claus Gittinger
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
    [see also:]
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
	Filename DirectoryStream PipeStream Socket
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
examples
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
  for VMS users only:
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
    The #openWithMode:attributes: entry allows additional RMS attributes
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
    to be passed in the second argument, which must be an array of strings
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
    as described in the 'creat' RTL Library documentation.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
    For example, to create a file with fixed records and recordLength of 100,
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
    use:
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
	|newFile|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
	newFile := FileStream new pathName:'<nameOfFile>'.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
	newFile setMode:#writeonly.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
	newFile openWithMode:'w' attributes:#('rfm=fix' 'fsz=100').
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
    since all of the above is private protocol, and it is considered bad style to
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
    access these from user programs, we recommend subclassing FileStream as
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
    something like VMSFixedRecordFileStream, and redefine the instance creation
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
    method(s) there as appropriate. 
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
    This will retain VMS specifics in one place and enhance maintanability.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
!FileStream class methodsFor:'initialization'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
initialize
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
    OpenErrorSignal isNil ifTrue:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
	"/
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
	"/ this is temporary - for now allow an openError to
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
	"/ be unhandled and proceed by returning a nil from the
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
	"/ stream creation method.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
	"/ In the future, this will be a hard signal.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
	"/
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
	OpenErrorSignal := QuerySignal new.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
	OpenErrorSignal parent:(super openErrorSignal) mayProceed:true.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
	OpenErrorSignal nameClass:self message:#openErrorSignal.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
	OpenErrorSignal notifierString:'open error'.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
    ]
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
    "Modified: 8.10.1997 / 11:56:39 / cg"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
!FileStream class methodsFor:'instance creation'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
appendingOldFileNamed:filename
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
    "return a FileStream for existing file named filename, aString.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
     The file is opened for writeonly access."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
    |newStream|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   308
    newStream := self new pathName:filename.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   309
    newStream openForAppending isNil ifTrue:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   310
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   311
    this is not a good idea; I might like to read the written stuff ...
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   312
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   313
    newStream readLimit:(newStream size).
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   314
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   315
    ^ newStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   316
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   317
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   318
appendingOldFileNamed:filename in:aDirectory
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   319
    "return a FileStream for existing file named filename, aString
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   320
     in aDirectory, a FileDirectory.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   321
     The file is opened for writeonly access."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   323
    |newStream|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   324
    newStream := self new pathName:filename in:aDirectory.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   325
    newStream openForAppending isNil ifTrue:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   326
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   327
    this is not a good idea; I might like to read the written stuff ...
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   328
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   329
    newStream readLimit:(newStream size).
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   330
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   331
    ^ newStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   332
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   333
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   334
fileNamed:filename
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   335
    "return a stream on file filename - if the file does not
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   336
     already exist, create it.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   337
     The file is opened for read/write access."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   338
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   339
    |stream|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   340
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   341
    stream := self oldFileNamed:filename.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   342
    stream isNil ifTrue:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   343
	stream := self newFileNamed:filename
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   344
    ].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   345
    ^ stream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   346
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   347
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   348
fileNamed:filename in:aDirectory
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   349
    "return a stream on file filename - if the file does not
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   350
     already exist, create it.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   351
     The file is opened for read/write access."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   352
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   353
    |stream|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   354
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   355
    stream := self oldFileNamed:filename in:aDirectory.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   356
    stream isNil ifTrue:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   357
	stream := self newFileNamed:filename in:aDirectory
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   358
    ].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   359
    ^ stream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   360
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   361
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   362
newFileForWritingNamed:filename
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   363
    "return a FileStream for new file named filename, aString.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   364
     If the file exists, it is truncated, otherwise created.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   365
     The file is opened for writeonly access."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   366
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   367
    |newStream|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   368
    newStream := self new pathName:filename.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   369
    newStream createForWriting isNil ifTrue:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   370
    ^ newStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   371
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   372
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   373
newFileForWritingNamed:filename in:aDirectory
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   374
    "return a FileStream for new file named filename, aString
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   375
     in aDirectory, a FileDirectory.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   376
     If the file exists, it is truncated, otherwise created.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   377
     The file is opened for writeonly access."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   378
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   379
    |newStream|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   380
    newStream := self new pathName:filename in:aDirectory.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   381
    newStream createForWriting isNil ifTrue:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   382
    ^ newStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   383
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   384
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   385
newFileNamed:filename
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   386
    "return a FileStream for new file named filename, aString.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   387
     If the file exists, it is truncated, otherwise created.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   388
     The file is opened for read/write access."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   389
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   390
    |newStream|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   391
    newStream := self new pathName:filename.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   392
    newStream createForReadWrite isNil ifTrue:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   393
    ^ newStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   394
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   395
    "Modified: / 28.10.1997 / 14:28:08 / cg"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   396
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   397
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   398
newFileNamed:filename in:aDirectory
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   399
    "return a FileStream for new file named filename, aString
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   400
     in aDirectory, a FileDirectory.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   401
     If the file exists, it is truncated, otherwise created.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   402
     The file is opened for read/write access."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   403
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   404
    |newStream|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   405
    newStream := self new pathName:filename in:aDirectory.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   406
    newStream createForReadWrite isNil ifTrue:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   407
    ^ newStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   408
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   409
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   410
oldFileNamed:filename
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   411
    "return a FileStream for existing file named filename, aString.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   412
     The file is opened for read/write access."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   413
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   414
    |newStream|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   415
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   416
    (OperatingSystem isReadable:filename) ifFalse:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   417
    newStream := self new pathName:filename.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   418
    newStream readwrite.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   419
    newStream openForReadWrite isNil ifTrue:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   420
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   421
    this is not a good idea; someone else might be appending ...
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   422
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   423
    newStream readLimit:(newStream size).
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   424
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   425
    ^ newStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   426
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   427
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   428
oldFileNamed:filename in:aDirectory
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   429
    "return a FileStream for existing file named filename, aString
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   430
     in aDirectory, a FileDirectory.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   431
     The file is opened for read/write access."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   432
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   433
    |newStream|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   434
    newStream := self new pathName:filename in:aDirectory.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   435
    newStream openForReadWrite isNil ifTrue:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   436
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   437
    this is not a good idea; someone else might be appending ...
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   438
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   439
    newStream readLimit:(newStream size).
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   440
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   441
    ^ newStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   442
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   443
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   444
readonlyFileNamed:filename
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   445
    "return a readonly FileStream for existing file named filename, aString"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   446
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   447
    |newStream|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   448
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   449
    (OperatingSystem isReadable:filename) ifFalse:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   450
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   451
    newStream := self new pathName:filename.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   452
    newStream openForReading isNil ifTrue:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   453
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   454
    this is not a good idea; someone else might be appending ...
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   455
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   456
    newStream readLimit:(newStream size).
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   457
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   458
    ^ newStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   459
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   460
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   461
readonlyFileNamed:filename in:aDirectory
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   462
    "return a readonly FileStream for existing file named filename, aString
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   463
     in aDirectory, a FileDirectory"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   464
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   465
    |newStream|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   466
    newStream := self new pathName:filename in:aDirectory.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   467
    newStream openForReading isNil ifTrue:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   468
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   469
    this is not a good idea; someone else might be appending ...
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   470
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   471
    newStream readLimit:(newStream size).
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   472
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   473
    ^ newStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   474
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   475
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   476
!FileStream class methodsFor:'Signal constants'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   477
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   478
openErrorSignal
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   479
    "return the FileStream specific openErrorSignal.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   480
     This is different from ExternalStream>>OpenErrorSignal!!"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   481
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   482
    ^ OpenErrorSignal
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   483
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   484
    "Created: / 28.1.1998 / 14:41:18 / stefan"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   485
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   486
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   487
!FileStream methodsFor:'Squeak compatibility'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   488
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   489
fullName
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   490
    "Squeak compatibility: return the full pathname"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   491
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   492
    ^ pathName asFilename pathName
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   493
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   494
    "Created: 17.10.1997 / 17:04:12 / cg"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   495
    "Modified: 20.10.1997 / 19:22:44 / cg"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   496
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   497
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   498
!FileStream methodsFor:'accessing'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   499
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   500
directoryName
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   501
    "return the name of the directory I'm in as a string"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   502
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   503
    ^ pathName asFilename directoryName
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   504
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   505
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   506
name
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   507
    "return my name without leading direcory-path (i.e. the plain fileName)
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   508
     as a string"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   509
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   510
    ^ pathName asFilename baseName
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   511
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   512
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   513
pathName
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   514
    "return the pathname"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   515
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   516
    ^ pathName
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   517
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   518
3755
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   519
removeOnClose:aBoolean
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   520
    "set/clear the removeOnClose flag.
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   521
     If set, the file will be removed when closed.
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   522
     Provided mostly for OS's which do not allow an
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   523
     open file to be removed (i.e. non unixes),
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   524
     and a fileStream for a tempFile is used.
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   525
     Especially, the CVS-SourceCodeManager returns
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   526
     this kind of file-handles occasionally.
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   527
     This is an ST/X special feature which is not portable
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   528
     to other systems."
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   529
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   530
    removeOnClose := aBoolean
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   531
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   532
    "Modified: / 13.8.1998 / 12:10:07 / cg"
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   533
!
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   534
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   535
store:something
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   536
    "what really should this do"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   537
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   538
    self nextPutAll:something storeString
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   539
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   540
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   541
!FileStream methodsFor:'error handling'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   542
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   543
openError
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   544
    "{ Pragma: +optSpace }"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   545
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   546
    "report an error, that file open failed"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   547
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   548
    "/
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   549
    "/ for now, error on open only raises a querySignal.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   550
    "/ If its not handled, a failing open will return nil.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   551
    "/ Currently, all users of fileStream check for this
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   552
    "/ nil return value (which is a historic leftover)
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   553
    "/
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   554
    "/ This will change in one of the next ST/X releases - for
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   555
    "/ now, it is best to provide an exceptionHandler AND check the
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   556
    "/ return value. 
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   557
    "/ Sorry about that.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   558
    "/
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   559
    LastErrorNumber := lastErrorNumber.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   560
    super openError.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   561
    ^ nil
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   562
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   563
3755
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   564
!FileStream methodsFor:'instance release'!
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   565
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   566
closeFile
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   567
    "low level close - may be redefined in subclasses"
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   568
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   569
    super closeFile.
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   570
    removeOnClose == true ifTrue:[
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   571
	pathName asFilename remove.
3755
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   572
    ]
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   573
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   574
    "Created: / 13.8.1998 / 12:11:22 / cg"
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   575
! !
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   576
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   577
!FileStream methodsFor:'positioning'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   578
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   579
position
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   580
    "return the read/write position in the file -
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   581
     notice, in smalltalk indices start at 1 so begin of file is 1"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   582
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   583
%{  /* NOCONTEXT */
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   584
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   585
    HFILE f;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   586
    long currentPosition;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   587
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   588
    if (__INST(filePointer) != nil) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   589
	f = __FILEVal(__INST(filePointer));
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   590
	do {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   591
	    TELL(currentPosition,f,__INST(buffered) == true);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   592
	} while ((currentPosition < 0) && (errno == EINTR));
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   593
	if (currentPosition >= 0) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   594
	    /*
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   595
	     * notice: Smalltalk index starts at 1
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   596
	     */
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   597
	    RETURN ( __MKSMALLINT(currentPosition + 1) );
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   598
	}
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   599
	__INST(lastErrorNumber) = __MKSMALLINT(errno);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   600
    }
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   601
%}.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   602
    lastErrorNumber notNil ifTrue:[^ self ioError].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   603
    filePointer isNil ifTrue:[^ self errorNotOpen].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   604
    ^ self primitiveFailed
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   605
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   606
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   607
position:newPos
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   608
    "set the read/write position in the file"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   609
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   610
%{  /* NOCONTEXT */
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   611
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   612
    HFILE f;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   613
    long ret;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   614
    OBJ fp;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   615
    long nP;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   616
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   617
    if ((__INST(canPosition) != false) 
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   618
     || (newPos == __MKSMALLINT(1))) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   619
	if ((fp = __INST(filePointer)) != nil) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   620
	    if (__isSmallInteger(newPos)) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   621
		f = __FILEVal(fp);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   622
		nP = (long)__intVal(newPos);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   623
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   624
		/*
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   625
		 * notice: Smalltalk index starts at 1
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   626
		 */
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   627
		nP--;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   628
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   629
		do {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   630
		    SEEK(ret,f,nP,__INST(buffered) == true);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   631
		} while ((ret < 0) && (errno == EINTR));
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   632
		if (ret >= 0) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   633
		    __INST(position) = newPos;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   634
		    /*
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   635
		     * just to make certain ...
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   636
		     */
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   637
		    __INST(hitEOF) = false;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   638
		    RETURN ( self );
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   639
		}
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   640
		__INST(lastErrorNumber) = __MKSMALLINT(errno);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   641
	    }
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   642
	}
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   643
    }
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   644
%}.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   645
    canPosition == false ifTrue:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   646
	"/ position by rewinding & re-reading everything up-to
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   647
	"/ that point.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   648
	^ self slowPosition:newPos
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   649
    ].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   650
    lastErrorNumber notNil ifTrue:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   651
	(OperatingSystem errorSymbolForNumber:lastErrorNumber) == #EINVAL ifTrue:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   652
	    "/ invalid position
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   653
	    ^ self positionError
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   654
	].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   655
	"/ assume I/O error
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   656
	^ self ioError
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   657
    ].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   658
    filePointer isNil ifTrue:[^ self errorNotOpen].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   659
    ^ self primitiveFailed
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   660
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   661
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   662
setToEnd
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   663
    "set the read/write position in the file to be at the end of the file"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   664
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   665
%{
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   666
    HFILE f;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   667
    long ret;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   668
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   669
    if (__INST(filePointer) != nil) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   670
	f = __FILEVal(__INST(filePointer));
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   671
	__INST(position) = nil;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   672
	do {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   673
	    TOEND(ret,f,__INST(buffered) == true);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   674
	} while ((ret < 0) && (errno == EINTR));
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   675
	if (ret >= 0) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   676
	    RETURN ( self );
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   677
	}
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   678
	__INST(lastErrorNumber) = __MKSMALLINT(errno);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   679
    }
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   680
%}.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   681
    lastErrorNumber notNil ifTrue:[^ self ioError].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   682
    filePointer isNil ifTrue:[^ self errorNotOpen].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   683
    ^ self primitiveFailed
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   684
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   685
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   686
slowPosition:newPos
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   687
    "position the file by re-reading everything up-to newPos.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   688
     The effect is the same as that of #position:, but its much slower.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   689
     This is required to reposition nonPositionable streams, such
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   690
     as tape-streams or variable-record-RMS files under VMS.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   691
     Caveat:
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   692
	 This should really be done transparently by the stdio library."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   693
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   694
    |buffer amount|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   695
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   696
    self isReadable ifFalse:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   697
	"/ sorry
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   698
	^ self positionError
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   699
    ].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   700
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   701
    buffer := ByteArray new:8*1024.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   702
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   703
    (position isNil "/ i.e. unknown
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   704
    or:[newPos < position]) ifTrue:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   705
	self reset.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   706
    ].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   707
    [position < newPos] whileTrue:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   708
	amount := (buffer size) min:(newPos-position).
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   709
	(self nextBytes:amount into:buffer startingAt:1) ~~ amount ifTrue:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   710
	    ^ self positionError
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   711
	].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   712
    ].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   713
    "/ ('FileStream [info]: slow position - please convert ''' , pathName printString , ''' to streamLF format') infoPrintCR.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   714
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   715
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   716
!FileStream methodsFor:'printing & storing'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   717
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   718
printOn:aStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   719
    "append a human readable representation of the receiver to aStream"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   720
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   721
    aStream nextPutAll:'(a FileStream for:'.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   722
    aStream nextPutAll:pathName printString.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   723
    aStream nextPut:$)
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   724
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   725
    "Modified: 30.7.1997 / 13:51:01 / cg"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   726
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   727
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   728
storeOn:aStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   729
    "append a representation of the receiver to aStream,
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   730
     from which a copy can be reconstructed later."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   731
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   732
    aStream nextPutAll:'(FileStream oldFileNamed:'.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   733
    aStream nextPutAll:pathName storeString.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   734
    (self position ~~ 1) ifTrue:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   735
	aStream nextPutAll:'; position:'.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   736
	self position storeOn:aStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   737
    ].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   738
    aStream nextPut:$)
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   739
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   740
    "Modified: 30.7.1997 / 16:43:50 / cg"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   741
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   742
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   743
!FileStream methodsFor:'private'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   744
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   745
createForReadWrite
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   746
    "create/truncate the file for read/write.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   747
     If the file existed, its truncated; otherwise its created."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   748
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   749
    mode := #readwrite.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   750
    ^ self openWithMode:CreateReadWriteMode
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   751
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   752
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   753
createForWriting
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   754
    "create/truncate the file for writeonly.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   755
     If the file existed, its truncated; otherwise its created."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   756
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   757
    mode := #writeonly.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   758
    didWrite := true.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   759
    ^ self openWithMode:WriteMode
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   760
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   761
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   762
open
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   763
    "open the file"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   764
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   765
    pathName isNil ifTrue:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   766
    (mode == #readonly) ifTrue: [
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   767
	didWrite := false.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   768
	^ self openWithMode:ReadMode
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   769
    ].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   770
    (mode == #writeonly) ifTrue: [
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   771
	didWrite := true.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   772
	^ self openWithMode:WriteMode
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   773
    ].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   774
    ^ self openWithMode:ReadWriteMode
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   775
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   776
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   777
openForAppending
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   778
    "open the file for writeonly appending to the end.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   779
     If the file does not exist its an error, return nil; 
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   780
     otherwise return the receiver."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   781
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   782
    mode := #writeonly.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   783
    didWrite := true.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   784
    ^ self openWithMode:AppendMode
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   785
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   786
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   787
openForReadWrite
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   788
    "open the file for read/write.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   789
     If the file does not exist its an error, return nil; 
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   790
     otherwise return the receiver."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   791
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   792
    mode := #readwrite.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   793
    ^ self openWithMode:ReadWriteMode
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   794
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   795
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   796
openForReading
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   797
    "open the file for readonly.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   798
     If the file does not exist its an error, return nil; 
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   799
     otherwise return the receiver."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   800
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   801
    mode := #readonly.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   802
    didWrite := false.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   803
    ^ self openWithMode:ReadMode
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   804
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   805
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   806
openForWriting
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   807
    "open the file writeonly.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   808
     If the file does not exist its an error, return nil; 
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   809
     otherwise return the receiver."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   810
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   811
    mode := #writeonly.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   812
    didWrite := true.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   813
    ^ self openWithMode:ReadWriteMode   "unix-io does not allow this; open for update here"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   814
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   815
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   816
openWithMode:openmode
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   817
    "open the file;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   818
     openmode is the string defining the way to open as defined by the stdio library
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   819
     (i.e. the 2nd fopen argument).
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   820
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   821
     This is a private entry, but maybe useful to open a file in a special mode,
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   822
     which is proprietrary to the operatingSystem."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   823
     
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   824
    ^ self openWithMode:openmode attributes:nil
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   825
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   826
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   827
openWithMode:openmode attributes:attributeSpec
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   828
    "open the file; 
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   829
     openmode is the string defining the way to open as defined by the stdio library
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   830
     (i.e. the 2nd fopen argument).
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   831
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   832
     attributeSpec is an additional argument, only used with VMS - it allows a file to
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   833
     be created as fixedRecord, variableRecord, streamLF, streamCR, ...
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   834
     In VMS, if nonNil, it must consist of an array of strings (max:10), giving additional
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   835
     attributes (see fopen description).
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   836
     Passing a nil specifies the default format (streamLF) - ST/X always invokes this with nil.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   837
     This argument is ignored in UNIX & MSDOS systems.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   838
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   839
     This is a private entry, but maybe useful to open/create a file in a special mode,
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   840
     which is proprietrary to the operatingSystem."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   841
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   842
    |ok|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   843
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   844
    filePointer notNil ifTrue:[^ self errorOpen].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   845
    ok := false.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   846
%{
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   847
    HFILE f;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   848
#ifndef xxNO_STDIO
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   849
    HFILE fopen();
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   850
#endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   851
    OBJ path, fp;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   852
    int pass = 0;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   853
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   854
retry:
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   855
    path = __INST(pathName);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   856
    if (__isNonNilObject(path) && (__qClass(path)==String)) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   857
	do {
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   858
# ifdef NO_STDIO
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   859
	    /*printf("open %s mode=%s\n",__stringVal(path),__stringVal(openmode)); */
3818
6ba9a7f08d11 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3807
diff changeset
   860
#  ifdef DO_WRAP_CALLS
3824
d515d22eca90 removed VMS code;
Claus Gittinger <cg@exept.de>
parents: 3818
diff changeset
   861
	    f = __STX_C_CALL2((void*)fopen,(void *)__stringVal(path), (void *)__stringVal(openmode));
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   862
#  else
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   863
	    f = fopen((char *) __stringVal(path), (char *) __stringVal(openmode));
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   864
#  endif
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   865
# else        
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   866
	    __BEGIN_INTERRUPTABLE__
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   867
	    f = fopen((char *) __stringVal(path), (char *) __stringVal(openmode)); 
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   868
	    __END_INTERRUPTABLE__
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   869
# endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   870
	    /* must refetch - could be GC'd */
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   871
	    path = __INST(pathName);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   872
	} while ((f == NULL) && (errno == EINTR));
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   873
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   874
	if (f == NULL) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   875
	    /*
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   876
	     * If no filedescriptors available, try to finalize
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   877
	     * possibly collected fd's and try again.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   878
	     */
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   879
	    if (pass == 0 && (errno == ENFILE || errno == EMFILE)) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   880
		pass = 1;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   881
		__SSEND0(@global(ObjectMemory), @symbol(scavenge), 0);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   882
		__SSEND0(@global(ObjectMemory), @symbol(finalize), 0);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   883
		goto retry;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   884
	    }
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   885
	getOutOfHere: ;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   886
	    __INST(lastErrorNumber) = __MKSMALLINT(errno);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   887
	    __INST(position) = nil;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   888
	} else {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   889
	    __INST(canPosition) = true;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   890
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   891
	    __INST(filePointer) = fp = __MKOBJ((INT)f); __STORE(self, fp);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   892
	    __INST(position) = __MKSMALLINT(1);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   893
	    ok = true;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   894
	}
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   895
    }
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   896
%}.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   897
    ok ifFalse:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   898
	"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   899
	 the open failed for some reason ...
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   900
	"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   901
	^ self openError
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   902
    ].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   903
    self buffered:true.       "default is buffered"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   904
    Lobby register:self.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   905
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   906
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   907
pathName:filename
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   908
    "set the pathname"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   909
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   910
    pathName := filename asString
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   911
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   912
    "Modified: / 28.10.1997 / 14:29:01 / cg"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   913
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   914
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   915
pathName:filename in:aDirectory
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   916
    "set the pathname starting at aDirectory, a FileDirectory"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   917
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   918
    pathName := aDirectory asFilename constructString:filename
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   919
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   920
    "Modified: / 28.10.1997 / 14:28:54 / cg"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   921
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   922
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   923
reOpen
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   924
    "sent after snapin to reopen streams"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   925
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   926
    |oldPos|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   927
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   928
    filePointer notNil ifTrue:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   929
	"it was open, when snapped-out"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   930
	filePointer := nil.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   931
	Lobby unregister:self.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   932
	oldPos := position.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   933
	self open.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   934
	filePointer isNil ifTrue:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   935
	    "/ this happens, if after a restart, 
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   936
	    "/ the file is no longer present or accessable ..."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   937
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   938
	    (self class name , ' [warning]: could not reOpen file: ', pathName) errorPrintCR.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   939
	] ifFalse:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   940
	    self position:oldPos.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   941
	]
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   942
    ]
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   943
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   944
    "Modified: 10.1.1997 / 17:50:51 / cg"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   945
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   946
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   947
setMode:aModeSymbol
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   948
    mode := aModeSymbol
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   949
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   950
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   951
!FileStream methodsFor:'queries'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   952
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   953
fileSize
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   954
    "return the size in bytes of the file"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   955
    |oldPosition sz|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   956
%{  
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   957
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   958
#ifndef xxNO_STDIO
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   959
    HFILE f;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   960
    struct stat buf;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   961
    int ret;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   962
    int fd;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   963
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   964
    if (__INST(filePointer) != nil) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   965
	f = __FILEVal(__INST(filePointer));
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   966
	fd = fileno(f);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   967
	do {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   968
	    ret = fstat(fd, &buf);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   969
	} while ((ret < 0) && (errno == EINTR));
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   970
	if (ret >= 0) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   971
	    RETURN ( __MKSMALLINT(buf.st_size) );
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   972
	}
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   973
	__INST(lastErrorNumber) = __MKSMALLINT(errno);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   974
    }
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   975
#endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   976
%}.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   977
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   978
    "could add a fall-back here:
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   979
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   980
	oldPosition := self position.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   981
	self setToEnd.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   982
	sz := self position.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   983
	self position:oldPosition.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   984
	^ sz
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   985
    "
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   986
    lastErrorNumber notNil ifTrue:[^ self ioError].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   987
    filePointer isNil ifTrue:[^ self errorNotOpen].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   988
    oldPosition := self position.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   989
    self setToEnd.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   990
    sz := self position.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   991
    self position:oldPosition.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   992
    ^ sz
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   993
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   994
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   995
size
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   996
    "return the size of the stream;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   997
     thats the number of bytes of the file."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   998
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   999
    "/ no obsoleteMethodWarning - size is ok for streams.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1000
    "/ self obsoleteMethodWarning:'use #fileSize'.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1001
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1002
    ^ self fileSize.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1003
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1004
    "Modified: 4.10.1997 / 18:01:09 / cg"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1005
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1006
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1007
!FileStream methodsFor:'testing'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1008
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1009
isFileStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1010
    "return true, if the receiver is some kind of fileStream.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1011
     redefined from Object"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1012
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1013
    ^ true
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1014
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1015
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1016
!FileStream class methodsFor:'documentation'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1017
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1018
version
3824
d515d22eca90 removed VMS code;
Claus Gittinger <cg@exept.de>
parents: 3818
diff changeset
  1019
    ^ '$Header: /cvs/stx/stx/libbasic/Attic/FileStream_win32.st,v 1.5 1998-09-11 11:49:45 cg Exp $'
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1020
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1021
FileStream initialize!