FileStream.st
author claus
Wed, 15 Feb 1995 11:22:05 +0100
changeset 249 810798c5c2e5
parent 223 3075043790b8
child 255 2b2c5c0facab
permissions -rw-r--r--
.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
     2
 COPYRIGHT (c) 1989 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
     3
	      All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     4
a27a279701f8 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
a27a279701f8 Initial revision
claus
parents:
diff changeset
    13
ExternalStream subclass:#FileStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:'pathName'
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
    15
       classVariableNames:'OpenErrorSignal'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    16
       poolDictionaries:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    17
       category:'Streams-External'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    19
a27a279701f8 Initial revision
claus
parents:
diff changeset
    20
FileStream comment:'
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
    21
COPYRIGHT (c) 1989 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
    22
	      All Rights Reserved
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
    23
249
claus
parents: 223
diff changeset
    24
$Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.19 1995-02-15 10:22:03 claus Exp $
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    25
'!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    27
!FileStream class methodsFor:'documentation'!
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    28
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    29
copyright
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    30
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    31
 COPYRIGHT (c) 1989 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
    32
	      All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    33
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    34
 This software is furnished under a license and may be used
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    35
 only in accordance with the terms of that license and with the
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    36
 inclusion of the above copyright notice.   This software may not
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    37
 be provided or otherwise made available to, or used by, any
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    38
 other person.  No title to or ownership of the software is
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    39
 hereby transferred.
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    40
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    41
!
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    42
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    43
version
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    44
"
249
claus
parents: 223
diff changeset
    45
$Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.19 1995-02-15 10:22:03 claus Exp $
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    46
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    47
!
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    48
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    49
documentation
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    50
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    51
    This class provides access to the operating systems underlying file
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    52
    system (i.e. its an interface to the stdio library).
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
    53
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
    54
    Notice, that on some systems, the standard I/O library has performance
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
    55
    problems when a file is opened for readwrite. 
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
    56
    For best results, open files either readonly or writeonly.
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    57
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    58
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    59
216
a8abff749575 *** empty log message ***
claus
parents: 173
diff changeset
    60
!FileStream primitiveDefinitions!
173
58e9778954bc reposition
claus
parents: 159
diff changeset
    61
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    62
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
    63
#include <stdio.h>
10
claus
parents: 5
diff changeset
    64
#include <errno.h>
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    65
a27a279701f8 Initial revision
claus
parents:
diff changeset
    66
#ifdef transputer
a27a279701f8 Initial revision
claus
parents:
diff changeset
    67
# include <iocntrl.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    68
# ifndef fileno
a27a279701f8 Initial revision
claus
parents:
diff changeset
    69
   /* kludge: inmos forgot fileno */
a27a279701f8 Initial revision
claus
parents:
diff changeset
    70
#  define fileno(f)     ((f)->__file)
a27a279701f8 Initial revision
claus
parents:
diff changeset
    71
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
    72
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
    73
# include <sys/types.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    74
# include <sys/stat.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    75
#endif
10
claus
parents: 5
diff changeset
    76
42
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
    77
#ifdef hpux
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
    78
# define fileno(f)      ((f->__fileH << 8) | (f->__fileL))
42
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
    79
#endif
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
    80
10
claus
parents: 5
diff changeset
    81
#ifndef SEEK_SET
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    82
# define SEEK_SET       0
10
claus
parents: 5
diff changeset
    83
#endif
claus
parents: 5
diff changeset
    84
#ifndef SEEK_CUR
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    85
# define SEEK_CUR       1
10
claus
parents: 5
diff changeset
    86
#endif
claus
parents: 5
diff changeset
    87
#ifndef SEEK_END
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    88
# define SEEK_END       2
10
claus
parents: 5
diff changeset
    89
#endif
claus
parents: 5
diff changeset
    90
223
3075043790b8 immediateInterr & errno cleanup
claus
parents: 216
diff changeset
    91
/*
3075043790b8 immediateInterr & errno cleanup
claus
parents: 216
diff changeset
    92
 * on some systems errno is a macro ... check for it here
3075043790b8 immediateInterr & errno cleanup
claus
parents: 216
diff changeset
    93
 */
3075043790b8 immediateInterr & errno cleanup
claus
parents: 216
diff changeset
    94
#ifndef errno
3075043790b8 immediateInterr & errno cleanup
claus
parents: 216
diff changeset
    95
 extern errno;
3075043790b8 immediateInterr & errno cleanup
claus
parents: 216
diff changeset
    96
#endif
3075043790b8 immediateInterr & errno cleanup
claus
parents: 216
diff changeset
    97
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    98
%}
173
58e9778954bc reposition
claus
parents: 159
diff changeset
    99
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   100
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   101
!FileStream class methodsFor:'initialization'!
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   102
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   103
initialize
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   104
    OpenErrorSignal isNil ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   105
	super initialize.
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   106
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   107
	OpenErrorSignal := StreamErrorSignal newSignalMayProceed:true.
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   108
	OpenErrorSignal nameClass:self message:#openErrorSignal.
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   109
	OpenErrorSignal notifierString:'open error'.
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   110
    ].
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   111
! !
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   112
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   113
!FileStream class methodsFor:'instance creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   114
a27a279701f8 Initial revision
claus
parents:
diff changeset
   115
newFileNamed:filename
a27a279701f8 Initial revision
claus
parents:
diff changeset
   116
    "return a FileStream for new file named filename, aString.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   117
     If the file exists, it is truncated, otherwise created.
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   118
     The file is opened for read/write access."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   119
a27a279701f8 Initial revision
claus
parents:
diff changeset
   120
    |newStream|
2
claus
parents: 1
diff changeset
   121
    newStream := self new pathName:filename.
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   122
    newStream createForReadWrite isNil ifTrue:[^nil].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   123
    ^ newStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   124
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   125
a27a279701f8 Initial revision
claus
parents:
diff changeset
   126
newFileNamed:filename in:aDirectory
a27a279701f8 Initial revision
claus
parents:
diff changeset
   127
    "return a FileStream for new file named filename, aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   128
     in aDirectory, a FileDirectory.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   129
     If the file exists, it is truncated, otherwise created.
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   130
     The file is opened for read/write access."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   131
a27a279701f8 Initial revision
claus
parents:
diff changeset
   132
    |newStream|
2
claus
parents: 1
diff changeset
   133
    newStream := self new pathName:filename in:aDirectory.
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   134
    newStream createForReadWrite isNil ifTrue:[^nil].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   135
    ^ newStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   136
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   137
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   138
newFileForWritingNamed:filename
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   139
    "return a FileStream for new file named filename, aString.
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   140
     If the file exists, it is truncated, otherwise created.
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   141
     The file is opened for writeonly access."
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   142
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   143
    |newStream|
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   144
    newStream := self new pathName:filename.
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   145
    newStream createForWriting isNil ifTrue:[^nil].
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   146
    ^ newStream
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   147
!
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   148
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   149
newFileForWritingNamed:filename in:aDirectory
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   150
    "return a FileStream for new file named filename, aString
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   151
     in aDirectory, a FileDirectory.
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   152
     If the file exists, it is truncated, otherwise created.
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   153
     The file is opened for writeonly access."
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   154
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   155
    |newStream|
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   156
    newStream := self new pathName:filename in:aDirectory.
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   157
    newStream createForWriting isNil ifTrue:[^nil].
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   158
    ^ newStream
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   159
!
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   160
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   161
oldFileNamed:filename
a27a279701f8 Initial revision
claus
parents:
diff changeset
   162
    "return a FileStream for existing file named filename, aString.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   163
     The file is opened for read/write access."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   164
a27a279701f8 Initial revision
claus
parents:
diff changeset
   165
    |newStream|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   166
a27a279701f8 Initial revision
claus
parents:
diff changeset
   167
    (OperatingSystem isReadable:filename) ifFalse:[^nil].
2
claus
parents: 1
diff changeset
   168
    newStream := self new pathName:filename.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   169
    newStream readwrite.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   170
    newStream openForReadWrite isNil ifTrue:[^nil].
42
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   171
"
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   172
    this is not a good idea; someone else might be appending ...
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   173
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   174
    newStream readLimit:(newStream size).
42
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   175
"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   176
    ^ newStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   177
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   178
a27a279701f8 Initial revision
claus
parents:
diff changeset
   179
oldFileNamed:filename in:aDirectory
a27a279701f8 Initial revision
claus
parents:
diff changeset
   180
    "return a FileStream for existing file named filename, aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   181
     in aDirectory, a FileDirectory.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   182
     The file is opened for read/write access."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   183
a27a279701f8 Initial revision
claus
parents:
diff changeset
   184
    |newStream|
2
claus
parents: 1
diff changeset
   185
    newStream := self new pathName:filename in:aDirectory.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   186
    newStream openForReadWrite isNil ifTrue:[^nil].
42
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   187
"
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   188
    this is not a good idea; someone else might be appending ...
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   189
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   190
    newStream readLimit:(newStream size).
42
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   191
"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   192
    ^ newStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   193
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   194
a27a279701f8 Initial revision
claus
parents:
diff changeset
   195
fileNamed:filename
a27a279701f8 Initial revision
claus
parents:
diff changeset
   196
    "return a stream on file filename - if the file does not
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   197
     already exist, create it.
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   198
     The file is opened for read/write access."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   199
a27a279701f8 Initial revision
claus
parents:
diff changeset
   200
    |stream|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   201
a27a279701f8 Initial revision
claus
parents:
diff changeset
   202
    stream := self oldFileNamed:filename.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   203
    stream isNil ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   204
	stream := self newFileNamed:filename
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   205
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   206
    ^ stream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   207
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   208
a27a279701f8 Initial revision
claus
parents:
diff changeset
   209
fileNamed:filename in:aDirectory
a27a279701f8 Initial revision
claus
parents:
diff changeset
   210
    "return a stream on file filename - if the file does not
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   211
     already exist, create it.
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   212
     The file is opened for read/write access."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   213
a27a279701f8 Initial revision
claus
parents:
diff changeset
   214
    |stream|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   215
a27a279701f8 Initial revision
claus
parents:
diff changeset
   216
    stream := self oldFileNamed:filename in:aDirectory.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   217
    stream isNil ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   218
	stream := self newFileNamed:filename in:aDirectory
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   219
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   220
    ^ stream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   221
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   222
a27a279701f8 Initial revision
claus
parents:
diff changeset
   223
readonlyFileNamed:filename
a27a279701f8 Initial revision
claus
parents:
diff changeset
   224
    "return a readonly FileStream for existing file named filename, aString"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   225
a27a279701f8 Initial revision
claus
parents:
diff changeset
   226
    |newStream|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   227
a27a279701f8 Initial revision
claus
parents:
diff changeset
   228
    (OperatingSystem isReadable:filename) ifFalse:[^nil].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   229
2
claus
parents: 1
diff changeset
   230
    newStream := self new pathName:filename.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   231
    newStream openForReading isNil ifTrue:[^nil].
42
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   232
"
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   233
    this is not a good idea; someone else might be appending ...
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   234
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   235
    newStream readLimit:(newStream size).
42
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   236
"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   237
    ^ newStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   238
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   239
a27a279701f8 Initial revision
claus
parents:
diff changeset
   240
readonlyFileNamed:filename in:aDirectory
a27a279701f8 Initial revision
claus
parents:
diff changeset
   241
    "return a readonly FileStream for existing file named filename, aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   242
     in aDirectory, a FileDirectory"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   243
a27a279701f8 Initial revision
claus
parents:
diff changeset
   244
    |newStream|
2
claus
parents: 1
diff changeset
   245
    newStream := self new pathName:filename in:aDirectory.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   246
    newStream openForReading isNil ifTrue:[^nil].
42
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   247
"
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   248
    this is not a good idea; someone else might be appending ...
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   249
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   250
    newStream readLimit:(newStream size).
42
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   251
"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   252
    ^ newStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   253
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   254
a27a279701f8 Initial revision
claus
parents:
diff changeset
   255
appendingOldFileNamed:filename
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   256
    "return a FileStream for existing file named filename, aString.
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   257
     The file is opened for writeonly access."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   258
a27a279701f8 Initial revision
claus
parents:
diff changeset
   259
    |newStream|
2
claus
parents: 1
diff changeset
   260
    newStream := self new pathName:filename.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   261
    newStream openForAppending isNil ifTrue:[^nil].
42
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   262
"
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   263
    this is not a good idea; I might like to read the written stuff ...
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   264
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   265
    newStream readLimit:(newStream size).
42
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   266
"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   267
    ^ newStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   268
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   269
a27a279701f8 Initial revision
claus
parents:
diff changeset
   270
appendingOldFileNamed:filename in:aDirectory
a27a279701f8 Initial revision
claus
parents:
diff changeset
   271
    "return a FileStream for existing file named filename, aString
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   272
     in aDirectory, a FileDirectory.
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   273
     The file is opened for writeonly access."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   274
a27a279701f8 Initial revision
claus
parents:
diff changeset
   275
    |newStream|
2
claus
parents: 1
diff changeset
   276
    newStream := self new pathName:filename in:aDirectory.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   277
    newStream openForAppending isNil ifTrue:[^nil].
42
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   278
"
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   279
    this is not a good idea; I might like to read the written stuff ...
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   280
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   281
    newStream readLimit:(newStream size).
42
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   282
"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   283
    ^ newStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   284
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   285
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   286
!FileStream methodsFor:'error handling'!
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   287
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   288
errorOpen
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   289
    "report an error, that the stream is already opened"
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   290
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   291
    ^ StreamErrorSignal
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   292
	raiseRequestWith:self
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   293
	errorString:(self class name , ' is already open')
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   294
!
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   295
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   296
openError
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   297
    "report an error, that file open failed"
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   298
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   299
    LastErrorNumber := lastErrorNumber.
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   300
^nil.
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   301
    ^ OpenErrorSignal
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   302
	raiseRequestWith:self
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   303
	errorString:('error on open: ' , self lastErrorString)
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   304
! !
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   305
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   306
!FileStream methodsFor:'accessing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   307
a27a279701f8 Initial revision
claus
parents:
diff changeset
   308
store:something
a27a279701f8 Initial revision
claus
parents:
diff changeset
   309
    "what really should this do"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   310
31
75f2b9f78be2 *** empty log message ***
claus
parents: 13
diff changeset
   311
    self nextPutAll:something storeString
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   312
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   313
a27a279701f8 Initial revision
claus
parents:
diff changeset
   314
directoryName
a27a279701f8 Initial revision
claus
parents:
diff changeset
   315
    "return the name of the directory I'm in"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   316
a27a279701f8 Initial revision
claus
parents:
diff changeset
   317
    |path lastIndex index|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   318
a27a279701f8 Initial revision
claus
parents:
diff changeset
   319
    path := pathName.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   320
    lastIndex := 0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   321
    index := path indexOf:$/.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   322
    [index ~~ 0] whileTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   323
	lastIndex := index.
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   324
	index := path indexOf:$/ startingAt:(index + 1)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   325
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   326
    (lastIndex == 0) ifTrue:[^ '.'].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   327
    (lastIndex == 1) ifTrue:[^ '/'].
31
75f2b9f78be2 *** empty log message ***
claus
parents: 13
diff changeset
   328
    ^ path copyTo:(lastIndex - 1)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   329
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   330
a27a279701f8 Initial revision
claus
parents:
diff changeset
   331
name
a27a279701f8 Initial revision
claus
parents:
diff changeset
   332
    "return my name without leading direcory-path"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   333
a27a279701f8 Initial revision
claus
parents:
diff changeset
   334
    |lastIndex index|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   335
a27a279701f8 Initial revision
claus
parents:
diff changeset
   336
    lastIndex := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   337
    [true] whileTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   338
	index := pathName indexOf:$/ startingAt:lastIndex.
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   339
	(index == 0) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   340
	    ^ pathName copyFrom:lastIndex
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   341
	].
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   342
	lastIndex := index + 1
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   343
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   344
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   345
a27a279701f8 Initial revision
claus
parents:
diff changeset
   346
pathName
a27a279701f8 Initial revision
claus
parents:
diff changeset
   347
    "return the pathname"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   348
a27a279701f8 Initial revision
claus
parents:
diff changeset
   349
    ^ pathName
a27a279701f8 Initial revision
claus
parents:
diff changeset
   350
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   351
a27a279701f8 Initial revision
claus
parents:
diff changeset
   352
!FileStream methodsFor:'private'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   353
a27a279701f8 Initial revision
claus
parents:
diff changeset
   354
pathName:filename
a27a279701f8 Initial revision
claus
parents:
diff changeset
   355
    "set the pathname"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   356
a27a279701f8 Initial revision
claus
parents:
diff changeset
   357
    pathName := filename
a27a279701f8 Initial revision
claus
parents:
diff changeset
   358
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   359
a27a279701f8 Initial revision
claus
parents:
diff changeset
   360
pathName:filename in:aDirectory
a27a279701f8 Initial revision
claus
parents:
diff changeset
   361
    "set the pathname starting at aDirectory, a FileDirectory"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   362
a27a279701f8 Initial revision
claus
parents:
diff changeset
   363
    ((filename at:1) == $/) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   364
	"filename may not start with a '/'"
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   365
	pathName := nil
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   366
    ] ifFalse:[
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   367
	pathName := aDirectory pathName.
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   368
	(pathName endsWith:'/') ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   369
	    pathName := pathName , '/'
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   370
	].
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   371
	pathName := pathName , filename
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   372
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   373
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   374
a27a279701f8 Initial revision
claus
parents:
diff changeset
   375
open
a27a279701f8 Initial revision
claus
parents:
diff changeset
   376
    "open the file"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   377
a27a279701f8 Initial revision
claus
parents:
diff changeset
   378
    pathName isNil ifTrue:[^nil].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   379
    (mode == #readonly) ifTrue: [
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   380
	didWrite := false.
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   381
	^ self openWithMode:'r'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   382
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   383
    (mode == #writeonly) ifTrue: [
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   384
	didWrite := true.
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   385
	^ self openWithMode:'w'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   386
    ].
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   387
    ^ self openWithMode:'r+'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   388
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   389
a27a279701f8 Initial revision
claus
parents:
diff changeset
   390
openWithMode:openmode
a27a279701f8 Initial revision
claus
parents:
diff changeset
   391
    "open the file; openmode is the string defining the way to open"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   392
a27a279701f8 Initial revision
claus
parents:
diff changeset
   393
    |retVal|
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   394
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   395
    filePointer notNil ifTrue:[^ self errorOpen].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   396
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   397
    FILE *f;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   398
    OBJ path;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   399
a27a279701f8 Initial revision
claus
parents:
diff changeset
   400
    if (_INST(filePointer) == nil) {
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   401
	path = _INST(pathName);
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   402
	if (_isNonNilObject(path) && (_qClass(path)==String)) {
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   403
	    do {
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   404
#ifdef LINUX
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   405
		/* LINUX returns a non-NULL f even when interrupted */
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   406
		errno = 0;
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   407
		f = (FILE *) fopen((char *) _stringVal(path), (char *) _stringVal(openmode));
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   408
		if (errno == EINTR)
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   409
		    f = NULL;
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   410
#else
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   411
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   412
		f = (FILE *) fopen((char *) _stringVal(path), (char *) _stringVal(openmode));
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   413
#endif
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   414
	    } while ((f == NULL) && (errno == EINTR));
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   415
	    if (f == NULL) {
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   416
		_INST(lastErrorNumber) = _MKSMALLINT(errno);
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   417
		_INST(position) = nil;
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   418
	    } else {
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   419
		_INST(filePointer) = MKOBJ((int)f);
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   420
		_INST(position) = _MKSMALLINT(1);
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   421
		retVal = self;
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   422
	    }
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   423
	}
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   424
    }
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   425
%}.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   426
    retVal notNil ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   427
	buffered := true.       "default is buffered"
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   428
	Lobby register:self
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   429
    ].
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   430
    lastErrorNumber notNil ifTrue:[^ self openError].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   431
    ^ retVal
a27a279701f8 Initial revision
claus
parents:
diff changeset
   432
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   433
a27a279701f8 Initial revision
claus
parents:
diff changeset
   434
openForReading
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   435
    "open the file for readonly.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   436
     If the file does not exist its an error, return nil; 
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   437
     otherwise return the receiver."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   438
a27a279701f8 Initial revision
claus
parents:
diff changeset
   439
    mode := #readonly.
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   440
    didWrite := false.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   441
    ^ self openWithMode:'r'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   442
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   443
a27a279701f8 Initial revision
claus
parents:
diff changeset
   444
openForWriting
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   445
    "open the file writeonly.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   446
     If the file does not exist its an error, return nil; 
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   447
     otherwise return the receiver."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   448
a27a279701f8 Initial revision
claus
parents:
diff changeset
   449
    mode := #writeonly.
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   450
    didWrite := true.
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   451
    ^ self openWithMode:'r+'   "unix-io does not allow this; open for update here"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   452
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   453
a27a279701f8 Initial revision
claus
parents:
diff changeset
   454
openForAppending
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   455
    "open the file for writeonly appending to the end.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   456
     If the file does not exist its an error, return nil; 
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   457
     otherwise return the receiver."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   458
a27a279701f8 Initial revision
claus
parents:
diff changeset
   459
    mode := #writeonly.
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   460
    didWrite := true.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   461
    ^ self openWithMode:'a+'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   462
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   463
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   464
openForReadWrite
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   465
    "open the file for read/write.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   466
     If the file does not exist its an error, return nil; 
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   467
     otherwise return the receiver."
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   468
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   469
    mode := #readwrite.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   470
    ^ self openWithMode:'r+'
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   471
!
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   472
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   473
createForWriting
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   474
    "create/truncate the file for writeonly.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   475
     If the file existed, its truncated; otherwise its created."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   476
a27a279701f8 Initial revision
claus
parents:
diff changeset
   477
    mode := #writeonly.
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   478
    didWrite := true.
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   479
    ^ self openWithMode:'w'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   480
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   481
a27a279701f8 Initial revision
claus
parents:
diff changeset
   482
createForReadWrite
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   483
    "create/truncate the file for read/write.
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   484
     If the file existed, its truncated; otherwise its created."
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   485
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   486
a27a279701f8 Initial revision
claus
parents:
diff changeset
   487
    mode := #readwrite.
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   488
    ^ self openWithMode:'w+'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   489
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   490
a27a279701f8 Initial revision
claus
parents:
diff changeset
   491
reOpen
a27a279701f8 Initial revision
claus
parents:
diff changeset
   492
    "sent after snapin to reopen streams"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   493
173
58e9778954bc reposition
claus
parents: 159
diff changeset
   494
    |oldPos|
58e9778954bc reposition
claus
parents: 159
diff changeset
   495
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   496
    filePointer notNil ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   497
	"it was open, when snapped-out"
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   498
	filePointer := nil.
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   499
	Lobby unregister:self.
173
58e9778954bc reposition
claus
parents: 159
diff changeset
   500
	oldPos := position.
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   501
	self open.
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   502
	filePointer isNil ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   503
	    "this happens, if after a restart, the file is no longer accessable ..."
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   504
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   505
	    ('could not reopen file: ', pathName) errorPrintNewline.
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   506
	] ifFalse:[
173
58e9778954bc reposition
claus
parents: 159
diff changeset
   507
	    self position:oldPos.
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   508
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   509
    ]
31
75f2b9f78be2 *** empty log message ***
claus
parents: 13
diff changeset
   510
! !
75f2b9f78be2 *** empty log message ***
claus
parents: 13
diff changeset
   511
75f2b9f78be2 *** empty log message ***
claus
parents: 13
diff changeset
   512
!FileStream methodsFor:'queries'!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   513
a27a279701f8 Initial revision
claus
parents:
diff changeset
   514
size
a27a279701f8 Initial revision
claus
parents:
diff changeset
   515
    "return the size in bytes of the file"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   516
a27a279701f8 Initial revision
claus
parents:
diff changeset
   517
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   518
a27a279701f8 Initial revision
claus
parents:
diff changeset
   519
#ifdef transputer
a27a279701f8 Initial revision
claus
parents:
diff changeset
   520
    FILE *f;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   521
    int size;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   522
a27a279701f8 Initial revision
claus
parents:
diff changeset
   523
    if (_INST(filePointer) != nil) {
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   524
	f = (FILE *)MKFD(_INST(filePointer));
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   525
	if ((size = filesize(fileno(f))) >= 0) {
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   526
	    RETURN ( _MKSMALLINT(size) );
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   527
	}
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   528
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   529
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   530
    FILE *f;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   531
    struct stat buf;
10
claus
parents: 5
diff changeset
   532
    int ret;
42
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
   533
    int fd;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   534
a27a279701f8 Initial revision
claus
parents:
diff changeset
   535
    if (_INST(filePointer) != nil) {
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   536
	f = (FILE *)MKFD(_INST(filePointer));
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   537
	fd = fileno(f);
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   538
	do {
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   539
	    ret = fstat(fd, &buf);
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   540
	} while ((ret < 0) && (errno == EINTR));
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   541
	if (ret >= 0) {
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   542
	    RETURN ( _MKSMALLINT(buf.st_size) );
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   543
	}
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   544
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   545
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   546
#endif
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   547
%}.
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   548
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   549
    "could add a fall-back here:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   550
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   551
	oldPosition := self position.
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   552
	self setToEnd.
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   553
	sz := self position.
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   554
	self position:oldPosition.
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   555
	^ sz
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   556
    "
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   557
    lastErrorNumber notNil ifTrue:[^ self ioError].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   558
    filePointer isNil ifTrue:[^ self errorNotOpen].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   559
    ^ self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   560
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   561
a27a279701f8 Initial revision
claus
parents:
diff changeset
   562
position
a27a279701f8 Initial revision
claus
parents:
diff changeset
   563
    "return the read/write position in the file -
31
75f2b9f78be2 *** empty log message ***
claus
parents: 13
diff changeset
   564
     notice, in smalltalk indices start at 1 so begin of file is 1"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   565
a27a279701f8 Initial revision
claus
parents:
diff changeset
   566
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   567
a27a279701f8 Initial revision
claus
parents:
diff changeset
   568
    FILE *f;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   569
    long currentPosition;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   570
a27a279701f8 Initial revision
claus
parents:
diff changeset
   571
    if (_INST(filePointer) != nil) {
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   572
	f = (FILE *)MKFD(_INST(filePointer));
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   573
	do {
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   574
	    if (_INST(buffered) == true) {
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   575
		currentPosition = (long) ftell(f);
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   576
	    } else {
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   577
		currentPosition = (long) lseek(fileno(f), 0L, SEEK_CUR);
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   578
	    }
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   579
	} while ((currentPosition < 0) && (errno == EINTR));
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   580
	if (currentPosition >= 0) {
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   581
	    /*
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   582
	     * notice: Smalltalk index starts at 1
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   583
	     */
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   584
	    RETURN ( _MKSMALLINT(currentPosition + 1) );
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   585
	}
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   586
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   587
    }
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   588
%}.
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   589
    lastErrorNumber notNil ifTrue:[^ self ioError].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   590
    filePointer isNil ifTrue:[^ self errorNotOpen].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   591
    ^ self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   592
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   593
a27a279701f8 Initial revision
claus
parents:
diff changeset
   594
position:newPos
a27a279701f8 Initial revision
claus
parents:
diff changeset
   595
    "set the read/write position in the file"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   596
a27a279701f8 Initial revision
claus
parents:
diff changeset
   597
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   598
a27a279701f8 Initial revision
claus
parents:
diff changeset
   599
    FILE *f;
10
claus
parents: 5
diff changeset
   600
    int ret;
249
claus
parents: 223
diff changeset
   601
    OBJ fp;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   602
249
claus
parents: 223
diff changeset
   603
    if ((fp = _INST(filePointer)) != nil) {
claus
parents: 223
diff changeset
   604
	if (__isSmallInteger(newPos)) {
claus
parents: 223
diff changeset
   605
	    f = (FILE *)MKFD(fp);
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   606
	    /*
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   607
	     * notice: Smalltalk index starts at 1
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   608
	     */
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   609
	    do {
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   610
		if (_INST(buffered) == true) {
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   611
		    ret = fseek(f, (long) (_intVal(newPos) - 1), SEEK_SET);
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   612
		} else {
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   613
		    ret = (long) lseek(fileno(f), (long)(_intVal(newPos) - 1), SEEK_SET);
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   614
		}
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   615
	    } while ((ret < 0) && (errno == EINTR));
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   616
	    if (ret >= 0) {
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   617
		_INST(position) = newPos;
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   618
		/*
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   619
		 * just to make certain ...
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   620
		 */
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   621
		_INST(hitEOF) = false;
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   622
		RETURN ( self );
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   623
	    }
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   624
	    _INST(lastErrorNumber) = _MKSMALLINT(errno);
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   625
	}
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   626
    }
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   627
%}.
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   628
    lastErrorNumber notNil ifTrue:[^ self ioError].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   629
    filePointer isNil ifTrue:[^ self errorNotOpen].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   630
    ^ self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   631
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   632
a27a279701f8 Initial revision
claus
parents:
diff changeset
   633
setToEnd
a27a279701f8 Initial revision
claus
parents:
diff changeset
   634
    "set the read/write position in the file to be at the end of the file"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   635
a27a279701f8 Initial revision
claus
parents:
diff changeset
   636
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   637
    FILE *f;
10
claus
parents: 5
diff changeset
   638
    int ret;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   639
49
f1c2d75f2eb6 *** empty log message ***
claus
parents: 42
diff changeset
   640
    if (_INST(filePointer) != nil) {
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   641
	f = (FILE *)MKFD(_INST(filePointer));
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   642
	_INST(position) = nil;
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   643
	do {
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   644
	    if (_INST(buffered) == true) {
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   645
		ret = fseek(f, 0L, SEEK_END);
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   646
	    } else {
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   647
		ret = (long)lseek(fileno(f), 0L, SEEK_END);
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   648
	    }
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   649
	} while ((ret < 0) && (errno == EINTR));
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   650
	if (ret >= 0) {
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   651
	    RETURN ( self );
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   652
	}
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   653
	_INST(lastErrorNumber) = _MKSMALLINT(errno);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   654
    }
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   655
%}.
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   656
    lastErrorNumber notNil ifTrue:[^ self ioError].
49
f1c2d75f2eb6 *** empty log message ***
claus
parents: 42
diff changeset
   657
    filePointer isNil ifTrue:[^ self errorNotOpen].
f1c2d75f2eb6 *** empty log message ***
claus
parents: 42
diff changeset
   658
    DemoMode ifTrue:[^ self warn:'no save in Demo mode'].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   659
    ^ self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   660
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   661
2
claus
parents: 1
diff changeset
   662
!FileStream methodsFor:'testing'!
claus
parents: 1
diff changeset
   663
claus
parents: 1
diff changeset
   664
isFileStream
claus
parents: 1
diff changeset
   665
    "return true, if the receiver is some kind of fileStream.
claus
parents: 1
diff changeset
   666
     redefined from Object"
claus
parents: 1
diff changeset
   667
claus
parents: 1
diff changeset
   668
    ^ true
claus
parents: 1
diff changeset
   669
! !
claus
parents: 1
diff changeset
   670
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   671
!FileStream methodsFor:'printing & storing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   672
a27a279701f8 Initial revision
claus
parents:
diff changeset
   673
printOn:aStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   674
    aStream nextPutAll:'(a FileStream for:'.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   675
    aStream nextPutAll:pathName.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   676
    aStream nextPut:$)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   677
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   678
a27a279701f8 Initial revision
claus
parents:
diff changeset
   679
storeOn:aStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   680
    aStream nextPutAll:'(FileStream oldFileNamed:'.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   681
    aStream nextPutAll:pathName.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   682
    (self position ~~ 1) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   683
	aStream nextPutAll:'; position:'.
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   684
	self position storeOn:aStream
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   685
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   686
    aStream nextPut:$)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   687
! !