FileStr.st
author claus
Fri, 16 Jul 1993 11:39:45 +0200
changeset 1 a27a279701f8
child 2 6526dde5f3ac
permissions -rw-r--r--
Initial revision
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1989-93 by Claus Gittinger
a27a279701f8 Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
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'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    15
       classVariableNames:''
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:'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    21
COPYRIGHT (c) 1989-93 by Claus Gittinger
a27a279701f8 Initial revision
claus
parents:
diff changeset
    22
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
    23
a27a279701f8 Initial revision
claus
parents:
diff changeset
    24
This class provides access to the operating systems underlying file
a27a279701f8 Initial revision
claus
parents:
diff changeset
    25
system (i.e. its an interface to the stdio library).
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
a27a279701f8 Initial revision
claus
parents:
diff changeset
    27
%W% %E%
a27a279701f8 Initial revision
claus
parents:
diff changeset
    28
'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    29
a27a279701f8 Initial revision
claus
parents:
diff changeset
    30
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
    31
#include <stdio.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    32
a27a279701f8 Initial revision
claus
parents:
diff changeset
    33
#ifdef transputer
a27a279701f8 Initial revision
claus
parents:
diff changeset
    34
# include <iocntrl.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    35
# ifndef fileno
a27a279701f8 Initial revision
claus
parents:
diff changeset
    36
   /* kludge: inmos forgot fileno */
a27a279701f8 Initial revision
claus
parents:
diff changeset
    37
#  define fileno(f)     ((f)->__file)
a27a279701f8 Initial revision
claus
parents:
diff changeset
    38
# endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
    39
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
    40
# include <sys/types.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    41
# include <sys/stat.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    42
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
    43
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
    44
a27a279701f8 Initial revision
claus
parents:
diff changeset
    45
!FileStream class methodsFor:'instance creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    46
a27a279701f8 Initial revision
claus
parents:
diff changeset
    47
newFileNamed:filename
a27a279701f8 Initial revision
claus
parents:
diff changeset
    48
    "return a FileStream for new file named filename, aString.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    49
     If the file exists, it is truncated, otherwise created.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    50
     The file is opened for write access only."
a27a279701f8 Initial revision
claus
parents:
diff changeset
    51
a27a279701f8 Initial revision
claus
parents:
diff changeset
    52
    |newStream|
a27a279701f8 Initial revision
claus
parents:
diff changeset
    53
    newStream := (self basicNew) pathName:filename.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    54
    newStream createForWriting isNil ifTrue:[^nil].
a27a279701f8 Initial revision
claus
parents:
diff changeset
    55
    ^ newStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
    56
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    57
a27a279701f8 Initial revision
claus
parents:
diff changeset
    58
newFileNamed:filename in:aDirectory
a27a279701f8 Initial revision
claus
parents:
diff changeset
    59
    "return a FileStream for new file named filename, aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
    60
     in aDirectory, a FileDirectory.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    61
     If the file exists, it is truncated, otherwise created.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    62
     The file is opened for write access only."
a27a279701f8 Initial revision
claus
parents:
diff changeset
    63
a27a279701f8 Initial revision
claus
parents:
diff changeset
    64
    |newStream|
a27a279701f8 Initial revision
claus
parents:
diff changeset
    65
    newStream := (self basicNew) pathName:filename in:aDirectory.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    66
    newStream createForWriting isNil ifTrue:[^nil].
a27a279701f8 Initial revision
claus
parents:
diff changeset
    67
    ^ newStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
    68
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    69
a27a279701f8 Initial revision
claus
parents:
diff changeset
    70
oldFileNamed:filename
a27a279701f8 Initial revision
claus
parents:
diff changeset
    71
    "return a FileStream for existing file named filename, aString.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    72
     The file is opened for read/write access."
a27a279701f8 Initial revision
claus
parents:
diff changeset
    73
a27a279701f8 Initial revision
claus
parents:
diff changeset
    74
    |newStream|
a27a279701f8 Initial revision
claus
parents:
diff changeset
    75
a27a279701f8 Initial revision
claus
parents:
diff changeset
    76
    (OperatingSystem isReadable:filename) ifFalse:[^nil].
a27a279701f8 Initial revision
claus
parents:
diff changeset
    77
    newStream := (self basicNew) pathName:filename.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    78
    newStream readwrite.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    79
    newStream openForReadWrite isNil ifTrue:[^nil].
a27a279701f8 Initial revision
claus
parents:
diff changeset
    80
    newStream readLimit:(newStream size).
a27a279701f8 Initial revision
claus
parents:
diff changeset
    81
    ^ newStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
    82
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    83
a27a279701f8 Initial revision
claus
parents:
diff changeset
    84
oldFileNamed:filename in:aDirectory
a27a279701f8 Initial revision
claus
parents:
diff changeset
    85
    "return a FileStream for existing file named filename, aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
    86
     in aDirectory, a FileDirectory.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    87
     The file is opened for read/write access."
a27a279701f8 Initial revision
claus
parents:
diff changeset
    88
a27a279701f8 Initial revision
claus
parents:
diff changeset
    89
    |newStream|
a27a279701f8 Initial revision
claus
parents:
diff changeset
    90
    newStream := (self basicNew) pathName:filename in:aDirectory.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    91
    newStream openForReadWrite isNil ifTrue:[^nil].
a27a279701f8 Initial revision
claus
parents:
diff changeset
    92
    newStream readLimit:(newStream size).
a27a279701f8 Initial revision
claus
parents:
diff changeset
    93
    ^ newStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
    94
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    95
a27a279701f8 Initial revision
claus
parents:
diff changeset
    96
fileNamed:filename
a27a279701f8 Initial revision
claus
parents:
diff changeset
    97
    "return a stream on file filename - if the file does not
a27a279701f8 Initial revision
claus
parents:
diff changeset
    98
     already exist, create it."
a27a279701f8 Initial revision
claus
parents:
diff changeset
    99
a27a279701f8 Initial revision
claus
parents:
diff changeset
   100
    |stream|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   101
a27a279701f8 Initial revision
claus
parents:
diff changeset
   102
    stream := self oldFileNamed:filename.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   103
    stream isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   104
        stream := self newFileNamed:filename
a27a279701f8 Initial revision
claus
parents:
diff changeset
   105
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   106
    ^ stream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   107
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   108
a27a279701f8 Initial revision
claus
parents:
diff changeset
   109
fileNamed:filename in:aDirectory
a27a279701f8 Initial revision
claus
parents:
diff changeset
   110
    "return a stream on file filename - if the file does not
a27a279701f8 Initial revision
claus
parents:
diff changeset
   111
     already exist, create it."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   112
a27a279701f8 Initial revision
claus
parents:
diff changeset
   113
    |stream|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   114
a27a279701f8 Initial revision
claus
parents:
diff changeset
   115
    stream := self oldFileNamed:filename in:aDirectory.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   116
    stream isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   117
        stream := self newFileNamed:filename in:aDirectory
a27a279701f8 Initial revision
claus
parents:
diff changeset
   118
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   119
    ^ stream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   120
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   121
a27a279701f8 Initial revision
claus
parents:
diff changeset
   122
readonlyFileNamed:filename
a27a279701f8 Initial revision
claus
parents:
diff changeset
   123
    "return a readonly FileStream for existing file named filename, aString"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   124
a27a279701f8 Initial revision
claus
parents:
diff changeset
   125
    |newStream|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   126
a27a279701f8 Initial revision
claus
parents:
diff changeset
   127
    (OperatingSystem isReadable:filename) ifFalse:[^nil].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   128
a27a279701f8 Initial revision
claus
parents:
diff changeset
   129
    newStream := (self basicNew) pathName:filename.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   130
    newStream openForReading isNil ifTrue:[^nil].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   131
    newStream readLimit:(newStream size).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   132
    ^ newStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   133
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   134
a27a279701f8 Initial revision
claus
parents:
diff changeset
   135
readonlyFileNamed:filename in:aDirectory
a27a279701f8 Initial revision
claus
parents:
diff changeset
   136
    "return a readonly FileStream for existing file named filename, aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   137
     in aDirectory, a FileDirectory"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   138
a27a279701f8 Initial revision
claus
parents:
diff changeset
   139
    |newStream|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   140
    newStream := (self basicNew) pathName:filename in:aDirectory.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   141
    newStream openForReading isNil ifTrue:[^nil].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   142
    newStream readLimit:(newStream size).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   143
    ^ newStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   144
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   145
a27a279701f8 Initial revision
claus
parents:
diff changeset
   146
appendingOldFileNamed:filename
a27a279701f8 Initial revision
claus
parents:
diff changeset
   147
    "return a FileStream for existing file named filename, aString"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   148
a27a279701f8 Initial revision
claus
parents:
diff changeset
   149
    |newStream|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   150
    newStream := (self basicNew) pathName:filename.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   151
    newStream openForAppending isNil ifTrue:[^nil].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   152
    newStream readLimit:(newStream size).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   153
    ^ newStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   154
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   155
a27a279701f8 Initial revision
claus
parents:
diff changeset
   156
appendingOldFileNamed:filename in:aDirectory
a27a279701f8 Initial revision
claus
parents:
diff changeset
   157
    "return a FileStream for existing file named filename, aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   158
     in aDirectory, a FileDirectory"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   159
a27a279701f8 Initial revision
claus
parents:
diff changeset
   160
    |newStream|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   161
    newStream := (self basicNew) pathName:filename in:aDirectory.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   162
    newStream openForAppending isNil ifTrue:[^nil].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   163
    newStream readLimit:(newStream size).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   164
    ^ newStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   165
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   166
a27a279701f8 Initial revision
claus
parents:
diff changeset
   167
!FileStream methodsFor:'accessing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   168
a27a279701f8 Initial revision
claus
parents:
diff changeset
   169
store:something
a27a279701f8 Initial revision
claus
parents:
diff changeset
   170
    "what really should this do"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   171
a27a279701f8 Initial revision
claus
parents:
diff changeset
   172
    self nextPutAll:something
a27a279701f8 Initial revision
claus
parents:
diff changeset
   173
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   174
a27a279701f8 Initial revision
claus
parents:
diff changeset
   175
directoryName
a27a279701f8 Initial revision
claus
parents:
diff changeset
   176
    "return the name of the directory I'm in"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   177
a27a279701f8 Initial revision
claus
parents:
diff changeset
   178
    |path lastIndex index|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   179
a27a279701f8 Initial revision
claus
parents:
diff changeset
   180
    path := pathName.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   181
    lastIndex := 0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   182
    index := path indexOf:$/.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   183
    [index ~~ 0] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   184
        lastIndex := index.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   185
        index := path indexOf:$/ startingAt:(index + 1)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   186
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   187
    (lastIndex == 0) ifTrue:[^ '.'].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   188
    (lastIndex == 1) ifTrue:[^ '/'].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   189
    ^ path copyFrom:1 to:(lastIndex - 1)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   190
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   191
a27a279701f8 Initial revision
claus
parents:
diff changeset
   192
name
a27a279701f8 Initial revision
claus
parents:
diff changeset
   193
    "return my name without leading direcory-path"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   194
a27a279701f8 Initial revision
claus
parents:
diff changeset
   195
    |lastIndex index|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   196
a27a279701f8 Initial revision
claus
parents:
diff changeset
   197
    lastIndex := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   198
    [true] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   199
        index := pathName indexOf:$/ startingAt:lastIndex.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   200
        (index == 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   201
            ^ pathName copyFrom:lastIndex
a27a279701f8 Initial revision
claus
parents:
diff changeset
   202
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   203
        lastIndex := index + 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   204
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   205
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   206
a27a279701f8 Initial revision
claus
parents:
diff changeset
   207
pathName
a27a279701f8 Initial revision
claus
parents:
diff changeset
   208
    "return the pathname"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   209
a27a279701f8 Initial revision
claus
parents:
diff changeset
   210
    ^ pathName
a27a279701f8 Initial revision
claus
parents:
diff changeset
   211
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   212
a27a279701f8 Initial revision
claus
parents:
diff changeset
   213
!FileStream methodsFor:'private'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   214
a27a279701f8 Initial revision
claus
parents:
diff changeset
   215
pathName:filename
a27a279701f8 Initial revision
claus
parents:
diff changeset
   216
    "set the pathname"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   217
a27a279701f8 Initial revision
claus
parents:
diff changeset
   218
    pathName := filename
a27a279701f8 Initial revision
claus
parents:
diff changeset
   219
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   220
a27a279701f8 Initial revision
claus
parents:
diff changeset
   221
pathName:filename in:aDirectory
a27a279701f8 Initial revision
claus
parents:
diff changeset
   222
    "set the pathname starting at aDirectory, a FileDirectory"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   223
a27a279701f8 Initial revision
claus
parents:
diff changeset
   224
    ((filename at:1) == $/) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   225
        "filename may not start with a '/'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   226
        pathName := nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   227
    ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   228
        pathName := aDirectory pathName.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   229
        (pathName endsWith:'/') ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   230
            pathName := pathName , '/'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   231
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   232
        pathName := pathName , filename
a27a279701f8 Initial revision
claus
parents:
diff changeset
   233
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   234
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   235
a27a279701f8 Initial revision
claus
parents:
diff changeset
   236
open
a27a279701f8 Initial revision
claus
parents:
diff changeset
   237
    "open the file"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   238
a27a279701f8 Initial revision
claus
parents:
diff changeset
   239
    pathName isNil ifTrue:[^nil].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   240
    (mode == #readonly) ifTrue: [
a27a279701f8 Initial revision
claus
parents:
diff changeset
   241
        ^ self openForReading
a27a279701f8 Initial revision
claus
parents:
diff changeset
   242
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   243
    (mode == #writeonly) ifTrue: [
a27a279701f8 Initial revision
claus
parents:
diff changeset
   244
        ^ self openForWriting
a27a279701f8 Initial revision
claus
parents:
diff changeset
   245
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   246
    ^ self openForReadWrite
a27a279701f8 Initial revision
claus
parents:
diff changeset
   247
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   248
a27a279701f8 Initial revision
claus
parents:
diff changeset
   249
openWithMode:openmode
a27a279701f8 Initial revision
claus
parents:
diff changeset
   250
    "open the file; openmode is the string defining the way to open"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   251
a27a279701f8 Initial revision
claus
parents:
diff changeset
   252
    |retVal|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   253
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   254
    FILE *f;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   255
    OBJ path;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   256
    extern OBJ ErrorNumber, Filename;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   257
    extern errno;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   258
a27a279701f8 Initial revision
claus
parents:
diff changeset
   259
    if (_INST(filePointer) == nil) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   260
        path = _INST(pathName);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   261
        if (_isString(path) || (_Class(path) == Filename)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   262
            f = (FILE *)fopen((char *) _stringVal(path), (char *) _stringVal(openmode));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   263
            if (f == NULL) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   264
                ErrorNumber = _MKSMALLINT(errno);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   265
                _INST(position) = nil;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   266
            } else {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   267
                _INST(filePointer) = _MKSMALLINT((int)f);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   268
                _INST(position) = _MKSMALLINT(1);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   269
                retVal = self;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   270
            }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   271
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   272
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   273
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   274
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   275
    retVal notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   276
        lobby register:self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   277
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   278
    ^ retVal
a27a279701f8 Initial revision
claus
parents:
diff changeset
   279
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   280
a27a279701f8 Initial revision
claus
parents:
diff changeset
   281
openForReading
a27a279701f8 Initial revision
claus
parents:
diff changeset
   282
    "open the file for readonly"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   283
a27a279701f8 Initial revision
claus
parents:
diff changeset
   284
    mode := #readonly.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   285
    ^ self openWithMode:'r'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   286
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   287
a27a279701f8 Initial revision
claus
parents:
diff changeset
   288
openForWriting
a27a279701f8 Initial revision
claus
parents:
diff changeset
   289
    "open the file for writeonly"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   290
a27a279701f8 Initial revision
claus
parents:
diff changeset
   291
    mode := #writeonly.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   292
    ^ self openWithMode:'w'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   293
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   294
a27a279701f8 Initial revision
claus
parents:
diff changeset
   295
openForAppending
a27a279701f8 Initial revision
claus
parents:
diff changeset
   296
    "open the file for writeonly appending to the end"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   297
a27a279701f8 Initial revision
claus
parents:
diff changeset
   298
    mode := #writeonly.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   299
    ^ self openWithMode:'a+'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   300
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   301
a27a279701f8 Initial revision
claus
parents:
diff changeset
   302
createForWriting
a27a279701f8 Initial revision
claus
parents:
diff changeset
   303
    "create/truncate the file for writeonly"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   304
a27a279701f8 Initial revision
claus
parents:
diff changeset
   305
    mode := #writeonly.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   306
    ^ self openWithMode:'w+'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   307
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   308
a27a279701f8 Initial revision
claus
parents:
diff changeset
   309
openForReadWrite
a27a279701f8 Initial revision
claus
parents:
diff changeset
   310
    "open the file for read/write"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   311
a27a279701f8 Initial revision
claus
parents:
diff changeset
   312
    mode := #readwrite.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   313
    ^ self openWithMode:'r+w'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   314
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   315
a27a279701f8 Initial revision
claus
parents:
diff changeset
   316
createForReadWrite
a27a279701f8 Initial revision
claus
parents:
diff changeset
   317
    "create/truncate the file for read/write"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   318
a27a279701f8 Initial revision
claus
parents:
diff changeset
   319
    mode := #readwrite.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   320
    ^ self openWithMode:'rw+'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   321
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   322
a27a279701f8 Initial revision
claus
parents:
diff changeset
   323
reOpen
a27a279701f8 Initial revision
claus
parents:
diff changeset
   324
    "sent after snapin to reopen streams"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   325
a27a279701f8 Initial revision
claus
parents:
diff changeset
   326
    filePointer notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   327
        "it was open, when snapped-out"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   328
        filePointer := nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   329
        self open.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   330
        filePointer isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   331
            Transcript showCr:('could not reopen file: ', pathName)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   332
        ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   333
            self position:position
a27a279701f8 Initial revision
claus
parents:
diff changeset
   334
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   335
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   336
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   337
a27a279701f8 Initial revision
claus
parents:
diff changeset
   338
size
a27a279701f8 Initial revision
claus
parents:
diff changeset
   339
    "return the size in bytes of the file"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   340
a27a279701f8 Initial revision
claus
parents:
diff changeset
   341
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   342
a27a279701f8 Initial revision
claus
parents:
diff changeset
   343
#ifdef transputer
a27a279701f8 Initial revision
claus
parents:
diff changeset
   344
    FILE *f;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   345
    int size;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   346
a27a279701f8 Initial revision
claus
parents:
diff changeset
   347
    if (_INST(filePointer) != nil) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   348
        f = (FILE *)_intVal(_INST(filePointer));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   349
        if ((size = filesize(fileno(f))) >= 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   350
            RETURN ( _MKSMALLINT(size) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   351
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   352
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   353
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
   354
    FILE *f;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   355
    struct stat buf;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   356
a27a279701f8 Initial revision
claus
parents:
diff changeset
   357
    if (_INST(filePointer) != nil) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   358
        f = (FILE *)_intVal(_INST(filePointer));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   359
        if (fstat(fileno(f), &buf) >= 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   360
            RETURN ( _MKSMALLINT(buf.st_size) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   361
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   362
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   363
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   364
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   365
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   366
    "could add a fall-back here:
a27a279701f8 Initial revision
claus
parents:
diff changeset
   367
a27a279701f8 Initial revision
claus
parents:
diff changeset
   368
        oldPosition := self position.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   369
        self setToEnd.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   370
        sz := self position.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   371
        self position:oldPosition.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   372
        ^ sz
a27a279701f8 Initial revision
claus
parents:
diff changeset
   373
    "
a27a279701f8 Initial revision
claus
parents:
diff changeset
   374
    filePointer isNil ifTrue:[^ self errorNotOpen].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   375
    ^ self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   376
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   377
a27a279701f8 Initial revision
claus
parents:
diff changeset
   378
position
a27a279701f8 Initial revision
claus
parents:
diff changeset
   379
    "return the read/write position in the file -
a27a279701f8 Initial revision
claus
parents:
diff changeset
   380
     notice, in smalltalk indices start at 1 so begin of file is 1""
a27a279701f8 Initial revision
claus
parents:
diff changeset
   381
a27a279701f8 Initial revision
claus
parents:
diff changeset
   382
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   383
a27a279701f8 Initial revision
claus
parents:
diff changeset
   384
    FILE *f;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   385
    long currentPosition;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   386
a27a279701f8 Initial revision
claus
parents:
diff changeset
   387
    if (_INST(filePointer) != nil) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   388
        f = (FILE *)_intVal(_INST(filePointer));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   389
        currentPosition = ftell(f);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   390
        if (currentPosition >= 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   391
            /*
a27a279701f8 Initial revision
claus
parents:
diff changeset
   392
             * notice: Smalltalk index starts at 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   393
             */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   394
            RETURN ( _MKSMALLINT(currentPosition + 1) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   395
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   396
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   397
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   398
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   399
    filePointer isNil ifTrue:[^ self errorNotOpen].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   400
    ^ self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   401
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   402
a27a279701f8 Initial revision
claus
parents:
diff changeset
   403
position:newPos
a27a279701f8 Initial revision
claus
parents:
diff changeset
   404
    "set the read/write position in the file"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   405
a27a279701f8 Initial revision
claus
parents:
diff changeset
   406
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   407
a27a279701f8 Initial revision
claus
parents:
diff changeset
   408
    FILE *f;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   409
    extern OBJ ErrorNumber;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   410
    extern errno;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   411
a27a279701f8 Initial revision
claus
parents:
diff changeset
   412
    if (_INST(filePointer) != nil) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   413
        if (_isSmallInteger(newPos)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   414
            f = (FILE *)_intVal(_INST(filePointer));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   415
            /*
a27a279701f8 Initial revision
claus
parents:
diff changeset
   416
             * notice: Smalltalk index starts at 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   417
             */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   418
            if (fseek(f, _intVal(newPos) - 1, 0) >= 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   419
                _INST(position) = newPos;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   420
                RETURN ( self );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   421
            }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   422
            ErrorNumber = _MKSMALLINT(errno);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   423
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   424
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   425
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   426
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   427
    filePointer isNil ifTrue:[^ self errorNotOpen].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   428
    ^ self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   429
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   430
a27a279701f8 Initial revision
claus
parents:
diff changeset
   431
setToEnd
a27a279701f8 Initial revision
claus
parents:
diff changeset
   432
    "set the read/write position in the file to be at the end of the file"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   433
a27a279701f8 Initial revision
claus
parents:
diff changeset
   434
    filePointer isNil ifTrue:[^ self errorNotOpen].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   435
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   436
    FILE *f;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   437
    extern OBJ ErrorNumber;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   438
    extern errno;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   439
a27a279701f8 Initial revision
claus
parents:
diff changeset
   440
    f = (FILE *)_intVal(_INST(filePointer));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   441
    _INST(position) = nil;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   442
    if (fseek(f, 0, 2) >= 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   443
        RETURN ( self );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   444
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   445
    ErrorNumber = _MKSMALLINT(errno);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   446
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   447
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   448
    ^ self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   449
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   450
a27a279701f8 Initial revision
claus
parents:
diff changeset
   451
!FileStream methodsFor:'printing & storing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   452
a27a279701f8 Initial revision
claus
parents:
diff changeset
   453
printOn:aStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   454
    aStream nextPutAll:'(a FileStream for:'.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   455
    aStream nextPutAll:pathName.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   456
    aStream nextPut:$)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   457
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   458
a27a279701f8 Initial revision
claus
parents:
diff changeset
   459
storeOn:aStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   460
    aStream nextPutAll:'(FileStream oldFileNamed:'.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   461
    aStream nextPutAll:pathName.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   462
    (self position ~~ 1) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   463
        aStream nextPutAll:'; position:'.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   464
        self position storeOn:aStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
   465
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   466
    aStream nextPut:$)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   467
! !