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