FileStream.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 28 Feb 2017 09:32:24 +0000
branchjv
changeset 21604 10256dd38558
parent 21285 7770135c2b54
child 23107 40173e082cbc
permissions -rw-r--r--
Improved handling of `EMFILE` / `ENFILE` when opening files / directories When a file fails to open because there are already too many files open, system performs a scavenge in hope some of files might get finalized and closed. However, if GC is under load these open but otherwise garbage files may already have tenured so newspace scavenge won't collect them. Moreover no such mechanism was implemented for directories. To handle these cases, retry once gain after a full GC if scavenge does not help. Still, try scavenge-only first as it is much faster than full GC.
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
7872
634e73a5cdd9 preps for 64bit positions
Claus Gittinger <cg@exept.de>
parents: 7871
diff changeset
     3
	      All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     4
a27a279701f8 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
"
5439
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
    12
"{ Package: 'stx:libbasic' }"
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
    13
17309
cbe100c27478 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17151
diff changeset
    14
"{ NameSpace: Smalltalk }"
cbe100c27478 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17151
diff changeset
    15
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    16
ExternalStream subclass:#FileStream
7872
634e73a5cdd9 preps for 64bit positions
Claus Gittinger <cg@exept.de>
parents: 7871
diff changeset
    17
	instanceVariableNames:'pathName canPosition removeOnClose'
634e73a5cdd9 preps for 64bit positions
Claus Gittinger <cg@exept.de>
parents: 7871
diff changeset
    18
	classVariableNames:'UserInitiatedFileSaveQuerySignal'
634e73a5cdd9 preps for 64bit positions
Claus Gittinger <cg@exept.de>
parents: 7871
diff changeset
    19
	poolDictionaries:''
634e73a5cdd9 preps for 64bit positions
Claus Gittinger <cg@exept.de>
parents: 7871
diff changeset
    20
	category:'Streams-External'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    21
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    22
216
a8abff749575 *** empty log message ***
claus
parents: 173
diff changeset
    23
!FileStream primitiveDefinitions!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    24
%{
17078
f3ded8a6f9d9 include os defss
Claus Gittinger <cg@exept.de>
parents: 16577
diff changeset
    25
#include "stxOSDefs.h"
f3ded8a6f9d9 include os defss
Claus Gittinger <cg@exept.de>
parents: 16577
diff changeset
    26
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14578
diff changeset
    27
#undef String
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14578
diff changeset
    28
#undef Character
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14578
diff changeset
    29
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    30
#include <stdio.h>
437
claus
parents: 384
diff changeset
    31
#define _STDIO_H_INCLUDED_
claus
parents: 384
diff changeset
    32
10
claus
parents: 5
diff changeset
    33
#include <errno.h>
437
claus
parents: 384
diff changeset
    34
#define _ERRNO_H_INCLUDED_
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    35
a27a279701f8 Initial revision
claus
parents:
diff changeset
    36
#ifdef transputer
a27a279701f8 Initial revision
claus
parents:
diff changeset
    37
# include <iocntrl.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    38
# ifndef fileno
a27a279701f8 Initial revision
claus
parents:
diff changeset
    39
   /* kludge: inmos forgot fileno */
a27a279701f8 Initial revision
claus
parents:
diff changeset
    40
#  define fileno(f)     ((f)->__file)
8627
5a86b95bebbb gcc3.3.1 insn-scheduling bug workaround
Claus Gittinger <cg@exept.de>
parents: 8604
diff changeset
    41
# endif
4910
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    42
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    43
#else /* not transputer */
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    44
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    45
# include <sys/types.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    46
# include <sys/stat.h>
4910
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    47
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    48
#endif /* not transputer */
10
claus
parents: 5
diff changeset
    49
42
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
    50
#ifdef hpux
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
    51
# define fileno(f)      ((f->__fileH << 8) | (f->__fileL))
42
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
    52
#endif
e33491f6f260 *** empty log message ***
claus
parents: 31
diff changeset
    53
2921
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
    54
#ifdef __VMS__
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
    55
# include <rms.h>
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
    56
#endif
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
    57
14635
aa0d74813208 Add __ before STX_String, STX_Character
Stefan Vogel <sv@exept.de>
parents: 14633
diff changeset
    58
#define String  __STX_String
aa0d74813208 Add __ before STX_String, STX_Character
Stefan Vogel <sv@exept.de>
parents: 14633
diff changeset
    59
#define Character __STX_Character
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14578
diff changeset
    60
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
    61
#ifdef __win32__
4910
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    62
# define NO_STDIO
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
    63
# if defined(__i386__) || defined(__x86__)
4910
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    64
#  define _X86_
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    65
# endif
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    66
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    67
# undef INT
10345
f6d031b8edcb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10342
diff changeset
    68
# undef UINT
4910
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    69
# undef Array
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    70
# undef Number
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    71
# undef Method
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    72
# undef Point
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    73
# undef Rectangle
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    74
# undef Block
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    75
# undef Time
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    76
# undef Date
5120
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4910
diff changeset
    77
# undef Set
5910
10a06503f787 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5493
diff changeset
    78
# undef Signal
5120
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4910
diff changeset
    79
# undef Delay
5910
10a06503f787 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5493
diff changeset
    80
# undef Context
9025
e9fff455ecfb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
    81
# undef Message
e9fff455ecfb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
    82
# undef Process
10342
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 9025
diff changeset
    83
# undef Processor
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14578
diff changeset
    84
# undef String
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14578
diff changeset
    85
# undef Character
4910
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    86
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    87
# define NOATOM
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    88
# define NOGDICAPMASKS
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    89
# define NOMETAFILE
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    90
# define NOMINMAX
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    91
//# define NOOPENFILE
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    92
# define NOSOUND
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    93
# define NOWH
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    94
//# define NOCOMM
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    95
# define NOKANJI
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    96
# define NOCRYPT
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    97
//# define NOMCX
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    98
# define WIN32_LEAN_AND_MEAN
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
    99
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   100
# include <windows.h>
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   101
14633
d123ac34e915 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
   102
# if 1 // defined(__MINGW64__)
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14578
diff changeset
   103
#  include <fcntl.h>
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14578
diff changeset
   104
# endif
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14578
diff changeset
   105
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10407
diff changeset
   106
# if defined(__BORLANDC__)
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10407
diff changeset
   107
#  include <io.h>
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10407
diff changeset
   108
# else
10342
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 9025
diff changeset
   109
#  define lseek _lseek
4910
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   110
# endif
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   111
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   112
# ifdef __DEF_Array
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   113
#  define Array __DEF_Array
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   114
# endif
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   115
# ifdef __DEF_Number
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   116
#  define Number __DEF_Number
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   117
# endif
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   118
# ifdef __DEF_Method
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   119
#  define Method __DEF_Method
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   120
# endif
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   121
# ifdef __DEF_Point
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   122
#  define Point __DEF_Point
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   123
# endif
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   124
# ifdef __DEF_Block
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   125
#  define Block __DEF_Block
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   126
# endif
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   127
# ifdef __DEF_Time
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   128
#  define Time __DEF_Time
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   129
# endif
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   130
# ifdef __DEF_Date
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   131
#  define Date __DEF_Date
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   132
# endif
5120
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4910
diff changeset
   133
# ifdef __DEF_Set
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4910
diff changeset
   134
#  define Set __DEF_Set
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4910
diff changeset
   135
# endif
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4910
diff changeset
   136
# ifdef __DEF_Signal
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4910
diff changeset
   137
#  define Signal __DEF_Signal
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4910
diff changeset
   138
# endif
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4910
diff changeset
   139
# ifdef __DEF_Delay
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4910
diff changeset
   140
#  define Delay __DEF_Delay
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4910
diff changeset
   141
# endif
5910
10a06503f787 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5493
diff changeset
   142
# ifdef __DEF_Context
10a06503f787 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5493
diff changeset
   143
#  define Context __DEF_Context
10a06503f787 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5493
diff changeset
   144
# endif
9025
e9fff455ecfb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
   145
# ifdef __DEF_Message
e9fff455ecfb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
   146
#  define Message __DEF_Message
e9fff455ecfb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
   147
# endif
e9fff455ecfb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
   148
# ifdef __DEF_Process
e9fff455ecfb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
   149
#  define Process __DEF_Process
e9fff455ecfb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
   150
# endif
10342
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 9025
diff changeset
   151
# ifdef __DEF_Processor
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 9025
diff changeset
   152
#  define Processor __DEF_Processor
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 9025
diff changeset
   153
# endif
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14578
diff changeset
   154
# ifdef __DEF_String
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14578
diff changeset
   155
#  define String __DEF_String
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14578
diff changeset
   156
# endif
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14578
diff changeset
   157
# ifdef __DEF_Character
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14578
diff changeset
   158
#  define Character __DEF_Character
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14578
diff changeset
   159
# endif
4910
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   160
14644
e5f19ef20dcd mingw changes
Claus Gittinger <cg@exept.de>
parents: 14635
diff changeset
   161
# define INT  STX_INT
e5f19ef20dcd mingw changes
Claus Gittinger <cg@exept.de>
parents: 14635
diff changeset
   162
# define UINT STX_UINT
4910
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   163
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14578
diff changeset
   164
# if 0
6259
164d7efc1eb2 api call stuff (more calls wrapped; care for EINTR)
Claus Gittinger <cg@exept.de>
parents: 6244
diff changeset
   165
# ifndef DO_WRAP_CALLS
6267
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
   166
#  define STX_C_CALL0(__nm__, __f__)                            __f__((__a1__))
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
   167
#  define STX_C_CALL1(__nm__, __f__, __a1__)                    __f__((__a1__))
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
   168
#  define STX_C_CALL2(__nm__, __f__, __a1__, __a2__)            __f__((__a1__), (__a2__))
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
   169
#  define STX_C_CALL3(__nm__, __f__, __a1__, __a2__, __a3__)    __f__((__a1__), (__a2__), (__a3__))
6259
164d7efc1eb2 api call stuff (more calls wrapped; care for EINTR)
Claus Gittinger <cg@exept.de>
parents: 6244
diff changeset
   170
# else
6267
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
   171
#  define STX_C_CALL0(__nm__, __f__)                            __STX_C_CALL0(__nm__, (void*)__f__)
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
   172
#  define STX_C_CALL1(__nm__, __f__, __a1__)                    __STX_C_CALL1(__nm__, (void*)__f__, (void*)(__a1__))
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
   173
#  define STX_C_CALL2(__nm__, __f__, __a1__, __a2__)            __STX_C_CALL2(__nm__, (void*)__f__, (void*)(__a1__), (void*)(__a2__))
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
   174
#  define STX_C_CALL3(__nm__, __f__, __a1__, __a2__, __a3__)    __STX_C_CALL3(__nm__, (void*)__f__, (void*)(__a1__), (void*)(__a2__), (void*)(__a3__))
6259
164d7efc1eb2 api call stuff (more calls wrapped; care for EINTR)
Claus Gittinger <cg@exept.de>
parents: 6244
diff changeset
   175
# endif
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14578
diff changeset
   176
# endif
4910
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   177
6259
164d7efc1eb2 api call stuff (more calls wrapped; care for EINTR)
Claus Gittinger <cg@exept.de>
parents: 6244
diff changeset
   178
/* #  define HFILE HANDLE */
4910
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   179
#  define HFILE FILE *
6259
164d7efc1eb2 api call stuff (more calls wrapped; care for EINTR)
Claus Gittinger <cg@exept.de>
parents: 6244
diff changeset
   180
/* #  define fileno(f) f */
4910
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   181
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   182
#else /* not __win32__ */
7970
2ae69eb663eb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7965
diff changeset
   183
# define HFILE FILE *
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   184
#endif /* ! __win32__ */
4910
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
   185
16298
5fd8d5ceab59 Fix error processing
Stefan Vogel <sv@exept.de>
parents: 16113
diff changeset
   186
//#define DO_WRAP_CALL_FSEEK
14853
63ffca691137 fseek does not need a WRAP_CALL (I hope)
Claus Gittinger <cg@exept.de>
parents: 14848
diff changeset
   187
7570
15dfed16d0e4 *** empty log message ***
penk
parents: 7379
diff changeset
   188
#include "stxOSDefs.h"
15dfed16d0e4 *** empty log message ***
penk
parents: 7379
diff changeset
   189
10342
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 9025
diff changeset
   190
#ifndef SEEK_SET
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 9025
diff changeset
   191
# define SEEK_SET       0
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 9025
diff changeset
   192
#endif
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 9025
diff changeset
   193
#ifndef SEEK_CUR
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 9025
diff changeset
   194
# define SEEK_CUR       1
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 9025
diff changeset
   195
#endif
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 9025
diff changeset
   196
#ifndef SEEK_END
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 9025
diff changeset
   197
# define SEEK_END       2
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 9025
diff changeset
   198
#endif
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   199
%}
173
58e9778954bc reposition
claus
parents: 159
diff changeset
   200
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   201
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   202
!FileStream class methodsFor:'documentation'!
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   203
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   204
copyright
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   205
"
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   206
 COPYRIGHT (c) 1989 by Claus Gittinger
7872
634e73a5cdd9 preps for 64bit positions
Claus Gittinger <cg@exept.de>
parents: 7871
diff changeset
   207
	      All Rights Reserved
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   208
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   209
 This software is furnished under a license and may be used
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   210
 only in accordance with the terms of that license and with the
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   211
 inclusion of the above copyright notice.   This software may not
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   212
 be provided or otherwise made available to, or used by, any
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   213
 other person.  No title to or ownership of the software is
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   214
 hereby transferred.
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   215
"
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   216
!
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   217
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   218
documentation
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   219
"
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   220
    This class provides access to the operating systems underlying file
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   221
    system (i.e. its an interface to the stdio library).
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   222
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   223
    Notice, that on some systems, the standard I/O library has performance
8627
5a86b95bebbb gcc3.3.1 insn-scheduling bug workaround
Claus Gittinger <cg@exept.de>
parents: 8604
diff changeset
   224
    problems when a file is opened for readwrite.
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   225
    For best results, open files either readonly or writeonly.
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   226
2921
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   227
    Also notice, that some OperatingSystems do not fully support
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   228
    positioning a file stream.
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   229
    For example, poor VMS does not allow positioning onto arbitrary
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   230
    byte boundaries if the file is a variable-record-RMS file.
15480
9a4e6bbb20d5 class: FileStream
Claus Gittinger <cg@exept.de>
parents: 15479
diff changeset
   231
    (stupid enough, this is the default for textfiles as created by some tools ...)
2921
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   232
    Therefore, the instance variable canPosition is set according to
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   233
    this and an error is raised, if a position: is attemted.
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   234
    I know, this is ugly, but what else could we do ?
15542
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   235
    Late note: who cares for VMS these days?
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   236
	       (and how much useless effort has been put in the past,
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   237
		to support lousy operating systems?)
2921
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   238
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   239
    [instance variables:]
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   240
	pathName        <String>        the file's path (if known)
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   241
	canPosition     <Boolean>       positionable - read above comment
2921
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   242
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   243
    [author:]
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   244
	Claus Gittinger
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   245
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   246
    [see also:]
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   247
	Filename DirectoryStream PipeStream Socket
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   248
"
2921
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   249
!
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   250
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   251
examples
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   252
"
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   253
  for VMS users only:
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   254
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   255
    The #openWithMode:attributes: entry allows additional RMS attributes
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   256
    to be passed in the second argument, which must be an array of strings
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   257
    as described in the 'creat' RTL Library documentation.
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   258
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   259
    For example, to create a file with fixed records and recordLength of 100,
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   260
    use:
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   261
7872
634e73a5cdd9 preps for 64bit positions
Claus Gittinger <cg@exept.de>
parents: 7871
diff changeset
   262
	|newFile|
2921
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   263
7872
634e73a5cdd9 preps for 64bit positions
Claus Gittinger <cg@exept.de>
parents: 7871
diff changeset
   264
	newFile := FileStream new pathName:'<nameOfFile>'.
634e73a5cdd9 preps for 64bit positions
Claus Gittinger <cg@exept.de>
parents: 7871
diff changeset
   265
	newFile setMode:#writeonly.
634e73a5cdd9 preps for 64bit positions
Claus Gittinger <cg@exept.de>
parents: 7871
diff changeset
   266
	newFile openWithMode:'w' attributes:#('rfm=fix' 'fsz=100').
2921
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   267
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   268
    since all of the above is private protocol, and it is considered bad style to
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   269
    access these from user programs, we recommend subclassing FileStream as
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   270
    something like VMSFixedRecordFileStream, and redefine the instance creation
8627
5a86b95bebbb gcc3.3.1 insn-scheduling bug workaround
Claus Gittinger <cg@exept.de>
parents: 8604
diff changeset
   271
    method(s) there as appropriate.
2921
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   272
    This will retain VMS specifics in one place and enhance maintanability.
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   273
"
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   274
! !
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   275
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   276
!FileStream class methodsFor:'initialization'!
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   277
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   278
initialize
7379
3eba1d6dd8d3 Raise an error when open fails
Stefan Vogel <sv@exept.de>
parents: 7298
diff changeset
   279
    UserInitiatedFileSaveQuerySignal isNil ifTrue:[
7965
fe275967a21c win32: do not pass pointers into OBJMEM to api calls
ca
parents: 7883
diff changeset
   280
	"/
fe275967a21c win32: do not pass pointers into OBJMEM to api calls
ca
parents: 7883
diff changeset
   281
	"/ this is temporary - for now allow an openError to
fe275967a21c win32: do not pass pointers into OBJMEM to api calls
ca
parents: 7883
diff changeset
   282
	"/ be unhandled and proceed by returning a nil from the
fe275967a21c win32: do not pass pointers into OBJMEM to api calls
ca
parents: 7883
diff changeset
   283
	"/ stream creation method.
fe275967a21c win32: do not pass pointers into OBJMEM to api calls
ca
parents: 7883
diff changeset
   284
	"/ In the future, this will be a hard signal.
fe275967a21c win32: do not pass pointers into OBJMEM to api calls
ca
parents: 7883
diff changeset
   285
	"/ THE FUTURE IS NOW!!!!
fe275967a21c win32: do not pass pointers into OBJMEM to api calls
ca
parents: 7883
diff changeset
   286
	"/
7379
3eba1d6dd8d3 Raise an error when open fails
Stefan Vogel <sv@exept.de>
parents: 7298
diff changeset
   287
"/        OpenErrorSignal := QuerySignal new.
3eba1d6dd8d3 Raise an error when open fails
Stefan Vogel <sv@exept.de>
parents: 7298
diff changeset
   288
"/        OpenErrorSignal parent:(super openErrorSignal) mayProceed:true.
3eba1d6dd8d3 Raise an error when open fails
Stefan Vogel <sv@exept.de>
parents: 7298
diff changeset
   289
"/        OpenErrorSignal nameClass:self message:#openErrorSignal.
3eba1d6dd8d3 Raise an error when open fails
Stefan Vogel <sv@exept.de>
parents: 7298
diff changeset
   290
"/        OpenErrorSignal notifierString:'open error'.
4907
0b09209a95c8 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   291
7965
fe275967a21c win32: do not pass pointers into OBJMEM to api calls
ca
parents: 7883
diff changeset
   292
	UserInitiatedFileSaveQuerySignal := QuerySignal new defaultAnswer:true.
fe275967a21c win32: do not pass pointers into OBJMEM to api calls
ca
parents: 7883
diff changeset
   293
	UserInitiatedFileSaveQuerySignal nameClass:self message:#userInitiatedFileSaveQuerySignal.
2921
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   294
    ]
3006
b3530950854a use new initialization message of signal.
Claus Gittinger <cg@exept.de>
parents: 2998
diff changeset
   295
b3530950854a use new initialization message of signal.
Claus Gittinger <cg@exept.de>
parents: 2998
diff changeset
   296
    "Modified: 8.10.1997 / 11:56:39 / cg"
2921
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   297
! !
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
   298
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   299
!FileStream class methodsFor:'instance creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   300
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   301
appendingOldFileNamed:filename
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   302
    "return a FileStream for existing file named filename, aString.
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   303
     The file is opened for writeonly access."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   304
7827
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   305
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   306
    |newStream|
7827
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   307
2
claus
parents: 1
diff changeset
   308
    newStream := self new pathName:filename.
8508
68cd95545196 Allow to proceed with any stream from an #openError handler
Stefan Vogel <sv@exept.de>
parents: 8472
diff changeset
   309
    ^ newStream openForAppending.
7827
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   310
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   311
    "
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   312
     FileStream appendingOldFileNamed:'adasdasasd'
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   313
    "
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   314
!
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   315
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   316
appendingOldFileNamed:filename in:aDirectory
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   317
    "return a FileStream for existing file named filename, aString
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   318
     in aDirectory, a FileDirectory.
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   319
     The file is opened for writeonly access."
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   320
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   321
    |newStream|
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   322
    newStream := self new pathName:filename in:aDirectory.
8508
68cd95545196 Allow to proceed with any stream from an #openError handler
Stefan Vogel <sv@exept.de>
parents: 8472
diff changeset
   323
    ^ newStream openForAppending.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   324
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   325
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   326
fileNamed:filename
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   327
    "return a stream on file filename - if the file does not
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   328
     already exist, create it.
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   329
     The file is opened for read/write access."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   330
7091
b399f3d19084 Handle openErrorSignal in preparition for change openErrorSignal
Stefan Vogel <sv@exept.de>
parents: 7053
diff changeset
   331
    [
7965
fe275967a21c win32: do not pass pointers into OBJMEM to api calls
ca
parents: 7883
diff changeset
   332
	^ self oldFileNamed:filename.
7091
b399f3d19084 Handle openErrorSignal in preparition for change openErrorSignal
Stefan Vogel <sv@exept.de>
parents: 7053
diff changeset
   333
    ] on:self openErrorSignal do:[:ex| ].
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   334
7091
b399f3d19084 Handle openErrorSignal in preparition for change openErrorSignal
Stefan Vogel <sv@exept.de>
parents: 7053
diff changeset
   335
    ^ self newFileNamed:filename
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   336
!
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   337
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   338
fileNamed:filename in:aDirectory
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   339
    "return a stream on file filename - if the file does not
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   340
     already exist, create it.
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   341
     The file is opened for read/write access."
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   342
7091
b399f3d19084 Handle openErrorSignal in preparition for change openErrorSignal
Stefan Vogel <sv@exept.de>
parents: 7053
diff changeset
   343
    [
7965
fe275967a21c win32: do not pass pointers into OBJMEM to api calls
ca
parents: 7883
diff changeset
   344
	^ self oldFileNamed:filename in:aDirectory.
7091
b399f3d19084 Handle openErrorSignal in preparition for change openErrorSignal
Stefan Vogel <sv@exept.de>
parents: 7053
diff changeset
   345
    ] on:self openErrorSignal do:[:ex| ].
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   346
7091
b399f3d19084 Handle openErrorSignal in preparition for change openErrorSignal
Stefan Vogel <sv@exept.de>
parents: 7053
diff changeset
   347
    ^ self newFileNamed:filename in:aDirectory
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   348
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   349
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   350
newFileForWritingNamed:filename
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   351
    "return a FileStream for new file named filename, aString.
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   352
     If the file exists, it is truncated, otherwise created.
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   353
     The file is opened for writeonly access."
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   354
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   355
    |newStream|
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   356
    newStream := self new pathName:filename.
8508
68cd95545196 Allow to proceed with any stream from an #openError handler
Stefan Vogel <sv@exept.de>
parents: 8472
diff changeset
   357
    ^ newStream createForWriting.
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   358
!
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   359
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   360
newFileForWritingNamed:filename in:aDirectory
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   361
    "return a FileStream for new file named filename, aString
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   362
     in aDirectory, a FileDirectory.
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   363
     If the file exists, it is truncated, otherwise created.
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   364
     The file is opened for writeonly access."
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   365
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   366
    |newStream|
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   367
    newStream := self new pathName:filename in:aDirectory.
8508
68cd95545196 Allow to proceed with any stream from an #openError handler
Stefan Vogel <sv@exept.de>
parents: 8472
diff changeset
   368
    ^ newStream createForWriting.
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   369
!
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   370
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   371
newFileNamed:filename
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   372
    "return a FileStream for new file named filename, aString.
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   373
     If the file exists, it is truncated, otherwise created.
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   374
     The file is opened for read/write access."
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   375
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   376
    |newStream|
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   377
    newStream := self new pathName:filename.
8508
68cd95545196 Allow to proceed with any stream from an #openError handler
Stefan Vogel <sv@exept.de>
parents: 8472
diff changeset
   378
    ^ newStream createForReadWrite.
3051
29d10c26d6a3 allow for fileNames to be passed to #pathName:
Claus Gittinger <cg@exept.de>
parents: 3044
diff changeset
   379
29d10c26d6a3 allow for fileNames to be passed to #pathName:
Claus Gittinger <cg@exept.de>
parents: 3044
diff changeset
   380
    "Modified: / 28.10.1997 / 14:28:08 / cg"
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   381
!
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   382
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   383
newFileNamed:filename in:aDirectory
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   384
    "return a FileStream for new file named filename, aString
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   385
     in aDirectory, a FileDirectory.
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   386
     If the file exists, it is truncated, otherwise created.
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   387
     The file is opened for read/write access."
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   388
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   389
    |newStream|
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   390
    newStream := self new pathName:filename in:aDirectory.
8508
68cd95545196 Allow to proceed with any stream from an #openError handler
Stefan Vogel <sv@exept.de>
parents: 8472
diff changeset
   391
    ^ newStream createForReadWrite.
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   392
!
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   393
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   394
newTemporary
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   395
    "create atomically a new file and return the file stream - use this for temporary files.
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   396
     The created file has the name '/tmp/stxtmp_xx_nn' where xx is our
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   397
     unix process id, and nn is a unique number, incremented with every call to this method.
15542
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   398
     If any of the environment variables ST_TMPDIR or TMPDIR is set,
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   399
     its value defines the temp directory."
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   400
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   401
    ^ self newTemporaryIn:Filename tempDirectory
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   402
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   403
    "
15542
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   404
     FileStream newTemporary
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   405
     FileStream newTemporary
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   406
    "
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   407
!
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   408
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   409
newTemporaryIn:aDirectoryOrNil
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   410
    "create atomically a new file and return the file stream - use this for temporary files.
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   411
     The created file is in aDirectoryPrefix and named 'stxtmp_xx_nn',
15542
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   412
     where xx is our unix process id, and nn is a unique number, incremented
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   413
     with every call to this method."
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   414
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   415
    ^ self newTemporaryIn:aDirectoryOrNil nameTemplate:Filename tempFileNameTemplate
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   416
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   417
    "temp files in '/tmp':
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   418
15542
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   419
     FileStream newTemporary
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   420
    "
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   421
15542
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   422
    "temp files somewhere
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   423
     (not recommended - use above since it can be controlled via shell variables):
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   424
15542
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   425
     FileStream newTemporaryIn:'/tmp'
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   426
     FileStream newTemporaryIn:'/tmp'
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   427
     FileStream newTemporaryIn:'/usr/tmp'
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   428
     FileStream newTemporaryIn:'/'
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   429
    "
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   430
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   431
    "a local temp file:
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   432
15542
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   433
     FileStream newTemporaryIn:''
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   434
     FileStream newTemporaryIn:nil
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   435
     FileStream newTemporaryIn:'.'
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   436
     FileStream newTemporaryIn:('source' asFilename)
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   437
    "
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   438
!
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   439
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   440
newTemporaryIn:aDirectoryOrNil nameTemplate:template
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   441
    "create atomically a new file and return the file stream - use this for temporary files.
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   442
     The created file is in aDirectoryOrNil and named after the given template,
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   443
     in which %1 and %2 are expanded to the unix process id, and a unique number, incremented
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   444
     with every call to this method respectively.
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   445
     See also: #newTemporary which looks for a good temp directory."
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   446
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   447
    |nameString random prevRandom prevNameString newTempFilename stream|
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   448
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   449
    [
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   450
	prevRandom := random.
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   451
	prevNameString := nameString.
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   452
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   453
	"Use random numbers in order to improve the security
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   454
	 by making the generated names less predictable"
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   455
	[
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   456
	    random := RandomGenerator nextLettersOrDigits:4.
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   457
	] doWhile:[random = prevRandom].
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   458
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   459
	nameString := template bindWith:(OperatingSystem getProcessId) with:random.
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   460
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   461
	aDirectoryOrNil isNil ifTrue:[
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   462
	    newTempFilename := nameString.
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   463
	] ifFalse:[
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   464
	    newTempFilename := aDirectoryOrNil asFilename constructString:nameString.
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   465
	].
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   466
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   467
	[
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   468
	    stream := self open:newTempFilename withMode:#(CREATE_NEW GENERIC_READ_WRITE).
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   469
	] on:OpenError do:[:ex|
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   470
	   ex errorCategory ~~ #existingReferentSignal ifTrue:[
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   471
		"some fundamental error, raise exception"
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   472
		ex reject.
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   473
	    ].
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   474
	    prevNameString = nameString ifTrue:[
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   475
		"no more names - probably a bad template"
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   476
		ex reject.
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   477
	    ].
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   478
	    "file exists, retry another one"
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   479
	].
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   480
    ] doWhile:[
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   481
	stream isNil and:[prevNameString ~= nameString]   "/ if namestring didn't change, the template is bad
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   482
    ].
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   483
    ^ stream
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   484
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   485
    "temp files in '/tmp':
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   486
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   487
	FileStream newTemporaryIn:'/tmp' asFilename nameTemplate:'foo%1_%2'
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   488
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   489
     This must fail on the second try:
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   490
	FileStream newTemporaryIn:'/tmp' asFilename nameTemplate:'foo'
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
   491
	FileStream newTemporaryIn:'c:\temp' asFilename nameTemplate:'foo'
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   492
    "
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   493
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   494
    "temp files somewhere
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   495
     (not recommended - use above since it can be controlled via shell variables):
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   496
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   497
     FileStream newTemporaryIn:'/tmp'     nameTemplate:'foo%1_%2'
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   498
     FileStream newTemporaryIn:'/tmp'     nameTemplate:'foo%1_%2'
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   499
     FileStream newTemporaryIn:'/usr/tmp' nameTemplate:'foo%1_%2'
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   500
     FileStream newTemporaryIn:'/'        nameTemplate:'foo%1_%2'
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   501
    "
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   502
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   503
    "a local temp file:
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   504
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   505
     FileStream newTemporaryIn:''             nameTemplate:'foo%1_%2'
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   506
     FileStream newTemporaryIn:nil            nameTemplate:'foo%1_%2'
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   507
     FileStream newTemporaryIn:'.'            nameTemplate:'foo%1_%2'
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   508
     FileStream newTemporaryIn:('source' asFilename) nameTemplate:'foo%1_%2'
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   509
    "
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   510
!
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   511
15542
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   512
newTemporaryIn:aDirectoryOrNil withSuffix:aSuffixString
15469
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   513
    "create atomically a new file and return the file stream - use this for temporary files.
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   514
     The created file is in aDirectoryPrefix and named 'stxtmp_xx_nn',
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   515
     where xx is our unix process id, and nn is a unique number, incremented
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   516
     with every call to this method."
15542
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   517
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   518
    ^ self
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   519
	newTemporaryIn:aDirectoryOrNil
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   520
	nameTemplate:(Filename tempFileNameTemplate asFilename
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   521
					withSuffix:aSuffixString) asString
15469
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   522
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   523
    "
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   524
     FileStream newTemporaryWithSuffix:'txt'
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   525
     FileStream newTemporaryIn:'/tmp' withSuffix:'txt'
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   526
    "
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   527
!
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   528
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   529
newTemporaryWithSuffix:aString
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   530
    "create atomically a new file and return the file stream - use this for temporary files.
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   531
     The created file has the name '/tmp/stxtmp_xx_nn' where xx is our
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   532
     unix process id, and nn is a unique number, incremented with every call to this method.
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   533
     If any of the environment variables ST_TMPDIR or TMPDIR is set,
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   534
     its value defines the temp directory."
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   535
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   536
    ^ self newTemporaryIn:Filename tempDirectory withSuffix:aString
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   537
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   538
    "
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   539
     FileStream newTemporaryWithSuffix:'txt'
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   540
    "
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   541
!
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   542
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   543
oldFileNamed:filename
a27a279701f8 Initial revision
claus
parents:
diff changeset
   544
    "return a FileStream for existing file named filename, aString.
7827
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   545
     The file is opened for read/write access.
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   546
     Raises an error if the file does not exist."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   547
a27a279701f8 Initial revision
claus
parents:
diff changeset
   548
    |newStream|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   549
7091
b399f3d19084 Handle openErrorSignal in preparition for change openErrorSignal
Stefan Vogel <sv@exept.de>
parents: 7053
diff changeset
   550
"/ We can do the following, but is is an extra OS-systemcall:
b399f3d19084 Handle openErrorSignal in preparition for change openErrorSignal
Stefan Vogel <sv@exept.de>
parents: 7053
diff changeset
   551
"/    (OperatingSystem isReadable:filename) ifFalse:[^ self new openError].
b399f3d19084 Handle openErrorSignal in preparition for change openErrorSignal
Stefan Vogel <sv@exept.de>
parents: 7053
diff changeset
   552
2
claus
parents: 1
diff changeset
   553
    newStream := self new pathName:filename.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   554
    newStream readwrite.
8508
68cd95545196 Allow to proceed with any stream from an #openError handler
Stefan Vogel <sv@exept.de>
parents: 8472
diff changeset
   555
    ^ newStream openForReadWrite.
7827
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   556
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   557
    "
15489
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   558
     '/tmp/dAsGiBtEsNiChT' asFilename remove.
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   559
     FileStream oldFileNamed:'/tmp/dAsGiBtEsNiChT'
7827
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   560
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   561
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   562
a27a279701f8 Initial revision
claus
parents:
diff changeset
   563
oldFileNamed:filename in:aDirectory
a27a279701f8 Initial revision
claus
parents:
diff changeset
   564
    "return a FileStream for existing file named filename, aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   565
     in aDirectory, a FileDirectory.
7827
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   566
     The file is opened for read/write access.
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   567
     Raises an error if the file does not exist."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   568
a27a279701f8 Initial revision
claus
parents:
diff changeset
   569
    |newStream|
2
claus
parents: 1
diff changeset
   570
    newStream := self new pathName:filename in:aDirectory.
8508
68cd95545196 Allow to proceed with any stream from an #openError handler
Stefan Vogel <sv@exept.de>
parents: 8472
diff changeset
   571
    ^ newStream openForReadWrite.
7827
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   572
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   573
    "
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   574
     FileStream oldFileNamed:'dAsGiBtEsNiChT' in:'/'
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   575
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   576
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   577
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   578
open:aFilenameString withMode:anArrayOrString
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   579
    "The argument de
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   580
     The file is opened for read/write access."
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   581
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   582
    |stream|
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   583
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   584
    stream := self new pathName:aFilenameString.
15542
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   585
    stream
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   586
	readwrite;        "/ assume read/write mode, but this depends on the args
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   587
	openWithMode:anArrayOrString attributes:nil.
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   588
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   589
    ^ stream
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   590
!
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
   591
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   592
readonlyFileNamed:filename
20157
98d5b57a7576 #OTHER by mawalch
mawalch
parents: 20096
diff changeset
   593
    "Return a readonly FileStream for existing file named filename, a String.
7827
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   594
     Raises an error if the file does not exist."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   595
a27a279701f8 Initial revision
claus
parents:
diff changeset
   596
    |newStream|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   597
20157
98d5b57a7576 #OTHER by mawalch
mawalch
parents: 20096
diff changeset
   598
"/ We can do the following, but it is an extra system call:
7091
b399f3d19084 Handle openErrorSignal in preparition for change openErrorSignal
Stefan Vogel <sv@exept.de>
parents: 7053
diff changeset
   599
"/    (OperatingSystem isReadable:filename) ifFalse:[^ self new openError].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   600
2
claus
parents: 1
diff changeset
   601
    newStream := self new pathName:filename.
8508
68cd95545196 Allow to proceed with any stream from an #openError handler
Stefan Vogel <sv@exept.de>
parents: 8472
diff changeset
   602
    ^ newStream openForReading.
7827
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   603
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   604
    "
8627
5a86b95bebbb gcc3.3.1 insn-scheduling bug workaround
Claus Gittinger <cg@exept.de>
parents: 8604
diff changeset
   605
     FileStream readonlyFileNamed:'dAsGiBtEsNiChT'
7827
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   606
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   607
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   608
a27a279701f8 Initial revision
claus
parents:
diff changeset
   609
readonlyFileNamed:filename in:aDirectory
a27a279701f8 Initial revision
claus
parents:
diff changeset
   610
    "return a readonly FileStream for existing file named filename, aString
7827
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   611
     in aDirectory, a fileName or string instance representing a directory.
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   612
     Raises an error if the file does not exist."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   613
a27a279701f8 Initial revision
claus
parents:
diff changeset
   614
    |newStream|
2
claus
parents: 1
diff changeset
   615
    newStream := self new pathName:filename in:aDirectory.
8508
68cd95545196 Allow to proceed with any stream from an #openError handler
Stefan Vogel <sv@exept.de>
parents: 8472
diff changeset
   616
    ^ newStream openForReading.
7827
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   617
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   618
    "
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   619
     FileStream readonlyFileNamed:'dAsGiBtEsNiChT' in:'/'
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   620
     FileStream readonlyFileNamed:'dAsGiBtEsNiChT' in:'/' asFilename
4f2f905d1c93 comment
Claus Gittinger <cg@exept.de>
parents: 7570
diff changeset
   621
    "
159
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   622
! !
514c749165c3 *** empty log message ***
claus
parents: 92
diff changeset
   623
7298
9b3c69eb2c5d category
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
   624
!FileStream class methodsFor:'Compatibility-ANSI'!
6586
0c9731524c07 added for ansi compatibiliy
penk
parents: 6488
diff changeset
   625
0c9731524c07 added for ansi compatibiliy
penk
parents: 6488
diff changeset
   626
write:filename
0c9731524c07 added for ansi compatibiliy
penk
parents: 6488
diff changeset
   627
    "return a FileStream for new file named filename, aString.
0c9731524c07 added for ansi compatibiliy
penk
parents: 6488
diff changeset
   628
     If the file exists, it is truncated, otherwise created.
0c9731524c07 added for ansi compatibiliy
penk
parents: 6488
diff changeset
   629
     The file is opened for read/write access.
0c9731524c07 added for ansi compatibiliy
penk
parents: 6488
diff changeset
   630
     Same as newFileNamed: for ANSI compatibilily"
0c9731524c07 added for ansi compatibiliy
penk
parents: 6488
diff changeset
   631
0c9731524c07 added for ansi compatibiliy
penk
parents: 6488
diff changeset
   632
    ^ self newFileNamed:filename
0c9731524c07 added for ansi compatibiliy
penk
parents: 6488
diff changeset
   633
! !
0c9731524c07 added for ansi compatibiliy
penk
parents: 6488
diff changeset
   634
7298
9b3c69eb2c5d category
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
   635
!FileStream class methodsFor:'Compatibility-Dolphin'!
6244
48163a4cd89e dolphin support
Claus Gittinger <cg@exept.de>
parents: 6170
diff changeset
   636
48163a4cd89e dolphin support
Claus Gittinger <cg@exept.de>
parents: 6170
diff changeset
   637
read:filename text:text
48163a4cd89e dolphin support
Claus Gittinger <cg@exept.de>
parents: 6170
diff changeset
   638
    "return a readonly FileStream for the existing file named filename, aString.
48163a4cd89e dolphin support
Claus Gittinger <cg@exept.de>
parents: 6170
diff changeset
   639
     If the argument, text is false, the stream is setup to read binary bytes,
48163a4cd89e dolphin support
Claus Gittinger <cg@exept.de>
parents: 6170
diff changeset
   640
     if false, it reads characters."
48163a4cd89e dolphin support
Claus Gittinger <cg@exept.de>
parents: 6170
diff changeset
   641
48163a4cd89e dolphin support
Claus Gittinger <cg@exept.de>
parents: 6170
diff changeset
   642
    |s|
48163a4cd89e dolphin support
Claus Gittinger <cg@exept.de>
parents: 6170
diff changeset
   643
48163a4cd89e dolphin support
Claus Gittinger <cg@exept.de>
parents: 6170
diff changeset
   644
    s := self readOnlyFileNamed:filename.
48163a4cd89e dolphin support
Claus Gittinger <cg@exept.de>
parents: 6170
diff changeset
   645
    text ifTrue:[
7872
634e73a5cdd9 preps for 64bit positions
Claus Gittinger <cg@exept.de>
parents: 7871
diff changeset
   646
	s text
6244
48163a4cd89e dolphin support
Claus Gittinger <cg@exept.de>
parents: 6170
diff changeset
   647
    ] ifFalse:[
7872
634e73a5cdd9 preps for 64bit positions
Claus Gittinger <cg@exept.de>
parents: 7871
diff changeset
   648
	s binary
6244
48163a4cd89e dolphin support
Claus Gittinger <cg@exept.de>
parents: 6170
diff changeset
   649
    ].
48163a4cd89e dolphin support
Claus Gittinger <cg@exept.de>
parents: 6170
diff changeset
   650
    ^ s
6474
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6464
diff changeset
   651
!
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6464
diff changeset
   652
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6464
diff changeset
   653
write:filename mode:modeSymbol
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6464
diff changeset
   654
    "return a writable FileStream for the file named filename, aString.
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6464
diff changeset
   655
     The modeSymbol controls how the file is opened; currently supported are:
7965
fe275967a21c win32: do not pass pointers into OBJMEM to api calls
ca
parents: 7883
diff changeset
   656
	#append
6474
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6464
diff changeset
   657
    "
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6464
diff changeset
   658
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6464
diff changeset
   659
    modeSymbol == #append ifTrue:[
7965
fe275967a21c win32: do not pass pointers into OBJMEM to api calls
ca
parents: 7883
diff changeset
   660
	^ self appendingOldFileNamed:filename
6474
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6464
diff changeset
   661
    ].
7091
b399f3d19084 Handle openErrorSignal in preparition for change openErrorSignal
Stefan Vogel <sv@exept.de>
parents: 7053
diff changeset
   662
    "/ self openErrorSignal is a Notification. This will change..
b399f3d19084 Handle openErrorSignal in preparition for change openErrorSignal
Stefan Vogel <sv@exept.de>
parents: 7053
diff changeset
   663
    "/ We want to raise a real error here
b399f3d19084 Handle openErrorSignal in preparition for change openErrorSignal
Stefan Vogel <sv@exept.de>
parents: 7053
diff changeset
   664
    super openErrorSignal raiseRequestErrorString:' - unsupported mode'.
6474
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6464
diff changeset
   665
    ^ nil
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6464
diff changeset
   666
!
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6464
diff changeset
   667
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6464
diff changeset
   668
write:filename text:textModeBoolean
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6464
diff changeset
   669
    "return a writable FileStream for the file named filename, aString.
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6464
diff changeset
   670
     If the argument, text is false, the stream is setup to write binary bytes,
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6464
diff changeset
   671
     if false, it writes characters."
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6464
diff changeset
   672
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6464
diff changeset
   673
    |s|
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6464
diff changeset
   674
6475
64529b4dc41b dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6474
diff changeset
   675
    s := self newFileNamed:filename.
6474
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6464
diff changeset
   676
    s notNil ifTrue:[
7872
634e73a5cdd9 preps for 64bit positions
Claus Gittinger <cg@exept.de>
parents: 7871
diff changeset
   677
	textModeBoolean ifTrue:[
634e73a5cdd9 preps for 64bit positions
Claus Gittinger <cg@exept.de>
parents: 7871
diff changeset
   678
	    s text
634e73a5cdd9 preps for 64bit positions
Claus Gittinger <cg@exept.de>
parents: 7871
diff changeset
   679
	] ifFalse:[
634e73a5cdd9 preps for 64bit positions
Claus Gittinger <cg@exept.de>
parents: 7871
diff changeset
   680
	    s binary
634e73a5cdd9 preps for 64bit positions
Claus Gittinger <cg@exept.de>
parents: 7871
diff changeset
   681
	]
6474
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6464
diff changeset
   682
    ].
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6464
diff changeset
   683
    ^ s
6244
48163a4cd89e dolphin support
Claus Gittinger <cg@exept.de>
parents: 6170
diff changeset
   684
! !
48163a4cd89e dolphin support
Claus Gittinger <cg@exept.de>
parents: 6170
diff changeset
   685
7298
9b3c69eb2c5d category
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
   686
!FileStream class methodsFor:'Compatibility-Squeak'!
5186
ed0c5597034f category renamining
Claus Gittinger <cg@exept.de>
parents: 5120
diff changeset
   687
19638
9ca7425d4ef2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 19363
diff changeset
   688
fileIn:aPath
9ca7425d4ef2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 19363
diff changeset
   689
    aPath asFilename fileIn
9ca7425d4ef2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 19363
diff changeset
   690
!
9ca7425d4ef2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 19363
diff changeset
   691
16109
0e7d694bfc7a class: FileStream
Claus Gittinger <cg@exept.de>
parents: 15620
diff changeset
   692
forceNewFileNamed:filename
0e7d694bfc7a class: FileStream
Claus Gittinger <cg@exept.de>
parents: 15620
diff changeset
   693
    "return a writing FileStream for new file named filename, aString.
16113
411bfb1ec52c class: FileStream
Claus Gittinger <cg@exept.de>
parents: 16109
diff changeset
   694
     If it already exists, it is overwritten silently."
16109
0e7d694bfc7a class: FileStream
Claus Gittinger <cg@exept.de>
parents: 15620
diff changeset
   695
0e7d694bfc7a class: FileStream
Claus Gittinger <cg@exept.de>
parents: 15620
diff changeset
   696
    ^ self newFileNamed:filename
0e7d694bfc7a class: FileStream
Claus Gittinger <cg@exept.de>
parents: 15620
diff changeset
   697
!
0e7d694bfc7a class: FileStream
Claus Gittinger <cg@exept.de>
parents: 15620
diff changeset
   698
5186
ed0c5597034f category renamining
Claus Gittinger <cg@exept.de>
parents: 5120
diff changeset
   699
readOnlyFileNamed:filename
6244
48163a4cd89e dolphin support
Claus Gittinger <cg@exept.de>
parents: 6170
diff changeset
   700
    "return a readonly FileStream for the existing file named filename, aString."
48163a4cd89e dolphin support
Claus Gittinger <cg@exept.de>
parents: 6170
diff changeset
   701
5186
ed0c5597034f category renamining
Claus Gittinger <cg@exept.de>
parents: 5120
diff changeset
   702
    ^ self readonlyFileNamed:filename
ed0c5597034f category renamining
Claus Gittinger <cg@exept.de>
parents: 5120
diff changeset
   703
! !
ed0c5597034f category renamining
Claus Gittinger <cg@exept.de>
parents: 5120
diff changeset
   704
7298
9b3c69eb2c5d category
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
   705
!FileStream class methodsFor:'Compatibility-VW'!
6170
c00688d17b16 + #badArgumentSignal (VW compat.)
Claus Gittinger <cg@exept.de>
parents: 5910
diff changeset
   706
c00688d17b16 + #badArgumentSignal (VW compat.)
Claus Gittinger <cg@exept.de>
parents: 5910
diff changeset
   707
badArgumentsSignal
c00688d17b16 + #badArgumentSignal (VW compat.)
Claus Gittinger <cg@exept.de>
parents: 5910
diff changeset
   708
    ^ Error
c00688d17b16 + #badArgumentSignal (VW compat.)
Claus Gittinger <cg@exept.de>
parents: 5910
diff changeset
   709
! !
c00688d17b16 + #badArgumentSignal (VW compat.)
Claus Gittinger <cg@exept.de>
parents: 5910
diff changeset
   710
3233
1d29ae45b333 Must redefine #openErrorSignal.
Stefan Vogel <sv@exept.de>
parents: 3231
diff changeset
   711
!FileStream class methodsFor:'Signal constants'!
1d29ae45b333 Must redefine #openErrorSignal.
Stefan Vogel <sv@exept.de>
parents: 3231
diff changeset
   712
4907
0b09209a95c8 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   713
userInitiatedFileSaveQuerySignal
0b09209a95c8 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   714
    "return the query signal, which is raised before a user-initiated
0b09209a95c8 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   715
     file-save / file-saveAs operation is performed.
0b09209a95c8 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   716
     The query will be invoked with the fileName which is about to be
0b09209a95c8 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   717
     written to.
0b09209a95c8 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   718
     The default signal here returnes true, which will grant the save.
0b09209a95c8 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   719
     End-user applications may want to catch this signal,
0b09209a95c8 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   720
     and only return true for certain directories."
0b09209a95c8 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   721
0b09209a95c8 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   722
    ^ UserInitiatedFileSaveQuerySignal
0b09209a95c8 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   723
3233
1d29ae45b333 Must redefine #openErrorSignal.
Stefan Vogel <sv@exept.de>
parents: 3231
diff changeset
   724
! !
1d29ae45b333 Must redefine #openErrorSignal.
Stefan Vogel <sv@exept.de>
parents: 3231
diff changeset
   725
7261
f35fc9cee675 method category rename
Claus Gittinger <cg@exept.de>
parents: 7100
diff changeset
   726
!FileStream methodsFor:'Compatibility-Squeak'!
3044
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
   727
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
   728
fullName
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
   729
    "Squeak compatibility: return the full pathname"
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
   730
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
   731
    ^ pathName asFilename pathName
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
   732
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
   733
    "Created: 17.10.1997 / 17:04:12 / cg"
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
   734
    "Modified: 20.10.1997 / 19:22:44 / cg"
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
   735
! !
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
   736
15489
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   737
!FileStream methodsFor:'access rights'!
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   738
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   739
accessRights
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   740
    "return the access rights of the file as opaque data
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   741
     (SmallInteger in unix/linux)"
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   742
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   743
    ^ OperatingSystem accessModeOfFd:self fileDescriptor.
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   744
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   745
    "
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   746
      'Make.proto' asFilename readingFileDo:[:s|
15542
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
   747
	  s accessRights
15489
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   748
      ]
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   749
    "
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   750
!
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   751
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   752
accessRights:opaqueData
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   753
    "set the access rights of the file to opaqueData,
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   754
     which is normally retrieved by Filename>>#accessRights
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   755
     or FileStreamm>>#accessRights."
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   756
21237
d2ad73cbbee4 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21004
diff changeset
   757
    (OperatingSystem changeAccessModeOfFd:self fileHandle to:opaqueData) ifFalse:[
d2ad73cbbee4 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21004
diff changeset
   758
        OperatingSystem accessDeniedErrorSignal
d2ad73cbbee4 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21004
diff changeset
   759
            raiseRequestWith:self
d2ad73cbbee4 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21004
diff changeset
   760
            errorString:(' - cannot change access rights: ' , self pathName).
15489
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   761
    ].
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   762
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   763
    "
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   764
      'Make.proto' asFilename readingFileDo:[:s|
21237
d2ad73cbbee4 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21004
diff changeset
   765
          s accessRights:s accessRights
15489
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   766
      ]
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   767
    "
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   768
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   769
    "
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   770
      '/' asFilename readingFileDo:[:s|
21237
d2ad73cbbee4 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21004
diff changeset
   771
          s accessRights:s accessRights
15489
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   772
      ]
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   773
    "
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   774
! !
6b39f710c80d class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15486
diff changeset
   775
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   776
!FileStream methodsFor:'accessing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   777
17309
cbe100c27478 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17151
diff changeset
   778
asFilename
cbe100c27478 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17151
diff changeset
   779
    "return the file name"
cbe100c27478 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17151
diff changeset
   780
cbe100c27478 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17151
diff changeset
   781
    ^ pathName asFilename
cbe100c27478 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17151
diff changeset
   782
!
cbe100c27478 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17151
diff changeset
   783
12950
5a6dbcf1a274 added: #contentsOfEntireFile
Claus Gittinger <cg@exept.de>
parents: 12711
diff changeset
   784
contentsOfEntireFile
5a6dbcf1a274 added: #contentsOfEntireFile
Claus Gittinger <cg@exept.de>
parents: 12711
diff changeset
   785
    "ST-80 compatibility: return contents as a String (or byteArray, if in binary mode).
5a6dbcf1a274 added: #contentsOfEntireFile
Claus Gittinger <cg@exept.de>
parents: 12711
diff changeset
   786
     See also #contents, which returns the lines as stringCollection for text files."
5a6dbcf1a274 added: #contentsOfEntireFile
Claus Gittinger <cg@exept.de>
parents: 12711
diff changeset
   787
5a6dbcf1a274 added: #contentsOfEntireFile
Claus Gittinger <cg@exept.de>
parents: 12711
diff changeset
   788
    position == 0 ifTrue:[
13778
8e34483d10dd MAXPATHLEN cleanup;
Claus Gittinger <cg@exept.de>
parents: 13051
diff changeset
   789
	^ self next:(self fileSize)
12950
5a6dbcf1a274 added: #contentsOfEntireFile
Claus Gittinger <cg@exept.de>
parents: 12711
diff changeset
   790
    ].
5a6dbcf1a274 added: #contentsOfEntireFile
Claus Gittinger <cg@exept.de>
parents: 12711
diff changeset
   791
5a6dbcf1a274 added: #contentsOfEntireFile
Claus Gittinger <cg@exept.de>
parents: 12711
diff changeset
   792
    ^ super contentsOfEntireFile
5a6dbcf1a274 added: #contentsOfEntireFile
Claus Gittinger <cg@exept.de>
parents: 12711
diff changeset
   793
5a6dbcf1a274 added: #contentsOfEntireFile
Claus Gittinger <cg@exept.de>
parents: 12711
diff changeset
   794
    "Created: / 18-07-2010 / 22:17:49 / cg"
5a6dbcf1a274 added: #contentsOfEntireFile
Claus Gittinger <cg@exept.de>
parents: 12711
diff changeset
   795
!
5a6dbcf1a274 added: #contentsOfEntireFile
Claus Gittinger <cg@exept.de>
parents: 12711
diff changeset
   796
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   797
directoryName
2903
e64704e86cce various VMS changes
Claus Gittinger <cg@exept.de>
parents: 2817
diff changeset
   798
    "return the name of the directory I'm in as a string"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   799
2903
e64704e86cce various VMS changes
Claus Gittinger <cg@exept.de>
parents: 2817
diff changeset
   800
    ^ pathName asFilename directoryName
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   801
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   802
11437
7869fd22df88 #reset reopens a closed file (compatibility with other smalltalks)
Stefan Vogel <sv@exept.de>
parents: 11290
diff changeset
   803
fileName
7869fd22df88 #reset reopens a closed file (compatibility with other smalltalks)
Stefan Vogel <sv@exept.de>
parents: 11290
diff changeset
   804
    "return the file name - same as pathName for compatibility with
7869fd22df88 #reset reopens a closed file (compatibility with other smalltalks)
Stefan Vogel <sv@exept.de>
parents: 11290
diff changeset
   805
     other smalltalks"
7869fd22df88 #reset reopens a closed file (compatibility with other smalltalks)
Stefan Vogel <sv@exept.de>
parents: 11290
diff changeset
   806
7869fd22df88 #reset reopens a closed file (compatibility with other smalltalks)
Stefan Vogel <sv@exept.de>
parents: 11290
diff changeset
   807
    ^ pathName asFilename
7869fd22df88 #reset reopens a closed file (compatibility with other smalltalks)
Stefan Vogel <sv@exept.de>
parents: 11290
diff changeset
   808
!
7869fd22df88 #reset reopens a closed file (compatibility with other smalltalks)
Stefan Vogel <sv@exept.de>
parents: 11290
diff changeset
   809
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   810
name
2903
e64704e86cce various VMS changes
Claus Gittinger <cg@exept.de>
parents: 2817
diff changeset
   811
    "return my name without leading direcory-path (i.e. the plain fileName)
e64704e86cce various VMS changes
Claus Gittinger <cg@exept.de>
parents: 2817
diff changeset
   812
     as a string"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   813
2903
e64704e86cce various VMS changes
Claus Gittinger <cg@exept.de>
parents: 2817
diff changeset
   814
    ^ pathName asFilename baseName
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   815
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   816
a27a279701f8 Initial revision
claus
parents:
diff changeset
   817
pathName
a27a279701f8 Initial revision
claus
parents:
diff changeset
   818
    "return the pathname"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   819
a27a279701f8 Initial revision
claus
parents:
diff changeset
   820
    ^ pathName
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   821
!
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   822
3754
e281b9479361 added removeOnClose feature.
Claus Gittinger <cg@exept.de>
parents: 3233
diff changeset
   823
removeOnClose:aBoolean
e281b9479361 added removeOnClose feature.
Claus Gittinger <cg@exept.de>
parents: 3233
diff changeset
   824
    "set/clear the removeOnClose flag.
e281b9479361 added removeOnClose feature.
Claus Gittinger <cg@exept.de>
parents: 3233
diff changeset
   825
     If set, the file will be removed when closed.
e281b9479361 added removeOnClose feature.
Claus Gittinger <cg@exept.de>
parents: 3233
diff changeset
   826
     Provided mostly for OS's which do not allow an
e281b9479361 added removeOnClose feature.
Claus Gittinger <cg@exept.de>
parents: 3233
diff changeset
   827
     open file to be removed (i.e. non unixes),
12207
cb911af5184f comment in: #removeOnClose:
Claus Gittinger <cg@exept.de>
parents: 11813
diff changeset
   828
     when a fileStream for a tempFile is used.
3754
e281b9479361 added removeOnClose feature.
Claus Gittinger <cg@exept.de>
parents: 3233
diff changeset
   829
     Especially, the CVS-SourceCodeManager returns
e281b9479361 added removeOnClose feature.
Claus Gittinger <cg@exept.de>
parents: 3233
diff changeset
   830
     this kind of file-handles occasionally.
e281b9479361 added removeOnClose feature.
Claus Gittinger <cg@exept.de>
parents: 3233
diff changeset
   831
     This is an ST/X special feature which is not portable
e281b9479361 added removeOnClose feature.
Claus Gittinger <cg@exept.de>
parents: 3233
diff changeset
   832
     to other systems."
e281b9479361 added removeOnClose feature.
Claus Gittinger <cg@exept.de>
parents: 3233
diff changeset
   833
15475
763fdc270fb8 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15474
diff changeset
   834
    removeOnClose := aBoolean.
18781
58f9cf53b2ae #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 18651
diff changeset
   835
    self reRegisterForFinalization.
3754
e281b9479361 added removeOnClose feature.
Claus Gittinger <cg@exept.de>
parents: 3233
diff changeset
   836
e281b9479361 added removeOnClose feature.
Claus Gittinger <cg@exept.de>
parents: 3233
diff changeset
   837
    "Modified: / 13.8.1998 / 12:10:07 / cg"
e281b9479361 added removeOnClose feature.
Claus Gittinger <cg@exept.de>
parents: 3233
diff changeset
   838
!
e281b9479361 added removeOnClose feature.
Claus Gittinger <cg@exept.de>
parents: 3233
diff changeset
   839
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   840
store:something
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   841
    "what really should this do"
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   842
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   843
    self nextPutAll:something storeString
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   844
! !
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   845
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   846
!FileStream methodsFor:'error handling'!
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   847
12687
db30e2741635 added: #openError:
Stefan Vogel <sv@exept.de>
parents: 12675
diff changeset
   848
openError:errorNumber
db30e2741635 added: #openError:
Stefan Vogel <sv@exept.de>
parents: 12675
diff changeset
   849
    "report an error, that file open failed"
db30e2741635 added: #openError:
Stefan Vogel <sv@exept.de>
parents: 12675
diff changeset
   850
db30e2741635 added: #openError:
Stefan Vogel <sv@exept.de>
parents: 12675
diff changeset
   851
    "This has changed from previous releases:
db30e2741635 added: #openError:
Stefan Vogel <sv@exept.de>
parents: 12675
diff changeset
   852
     in earlier versions of ST/X, failed file open operations
db30e2741635 added: #openError:
Stefan Vogel <sv@exept.de>
parents: 12675
diff changeset
   853
     returned nil - now, an error is raised.
db30e2741635 added: #openError:
Stefan Vogel <sv@exept.de>
parents: 12675
diff changeset
   854
     The old behavior is simulated by providing an exception
db30e2741635 added: #openError:
Stefan Vogel <sv@exept.de>
parents: 12675
diff changeset
   855
     handler, which proceeds with nil:
db30e2741635 added: #openError:
Stefan Vogel <sv@exept.de>
parents: 12675
diff changeset
   856
13778
8e34483d10dd MAXPATHLEN cleanup;
Claus Gittinger <cg@exept.de>
parents: 13051
diff changeset
   857
	OpenError ignoreIn:[
8e34483d10dd MAXPATHLEN cleanup;
Claus Gittinger <cg@exept.de>
parents: 13051
diff changeset
   858
	    'old code expecting nil return values on errors when doing an open'.
12687
db30e2741635 added: #openError:
Stefan Vogel <sv@exept.de>
parents: 12675
diff changeset
   859
13778
8e34483d10dd MAXPATHLEN cleanup;
Claus Gittinger <cg@exept.de>
parents: 13051
diff changeset
   860
	    ('/dasGIBtEsbeStimmtNiChT' asFilename readStream) isNil ifTrue:[
8e34483d10dd MAXPATHLEN cleanup;
Claus Gittinger <cg@exept.de>
parents: 13051
diff changeset
   861
		self warn:'open failed'.
8e34483d10dd MAXPATHLEN cleanup;
Claus Gittinger <cg@exept.de>
parents: 13051
diff changeset
   862
	    ].
8e34483d10dd MAXPATHLEN cleanup;
Claus Gittinger <cg@exept.de>
parents: 13051
diff changeset
   863
	]
12687
db30e2741635 added: #openError:
Stefan Vogel <sv@exept.de>
parents: 12675
diff changeset
   864
    "
db30e2741635 added: #openError:
Stefan Vogel <sv@exept.de>
parents: 12675
diff changeset
   865
db30e2741635 added: #openError:
Stefan Vogel <sv@exept.de>
parents: 12675
diff changeset
   866
    "{ Pragma: +optSpace }"
db30e2741635 added: #openError:
Stefan Vogel <sv@exept.de>
parents: 12675
diff changeset
   867
db30e2741635 added: #openError:
Stefan Vogel <sv@exept.de>
parents: 12675
diff changeset
   868
    LastErrorNumber := errorNumber.
db30e2741635 added: #openError:
Stefan Vogel <sv@exept.de>
parents: 12675
diff changeset
   869
    ^ super openError:errorNumber.
db30e2741635 added: #openError:
Stefan Vogel <sv@exept.de>
parents: 12675
diff changeset
   870
db30e2741635 added: #openError:
Stefan Vogel <sv@exept.de>
parents: 12675
diff changeset
   871
    "
db30e2741635 added: #openError:
Stefan Vogel <sv@exept.de>
parents: 12675
diff changeset
   872
     '/dasGIBtEsbeStimmtNiChT' asFilename readStream
db30e2741635 added: #openError:
Stefan Vogel <sv@exept.de>
parents: 12675
diff changeset
   873
    "
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   874
! !
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   875
15469
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   876
!FileStream methodsFor:'finalization'!
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   877
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   878
executor
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   879
    |executor|
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   880
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   881
    executor := super executor.
18985
3dc624c18346 #FEATURE
Stefan Vogel <sv@exept.de>
parents: 18784
diff changeset
   882
    "keep the pathname for any FileStream"
3dc624c18346 #FEATURE
Stefan Vogel <sv@exept.de>
parents: 18784
diff changeset
   883
    executor setPathName:pathName removeOnClose:removeOnClose.
15469
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   884
    ^ executor
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   885
! !
93ba2e2700b0 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15462
diff changeset
   886
20367
e59fe9911b4a #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 20157
diff changeset
   887
8362
e17d9ffb6fa8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8063
diff changeset
   888
!FileStream methodsFor:'misc functions'!
e17d9ffb6fa8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8063
diff changeset
   889
8768
Claus Gittinger <cg@exept.de>
parents: 8627
diff changeset
   890
copyToEndInto:outStream bufferSize:bufferSize
8362
e17d9ffb6fa8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8063
diff changeset
   891
    "copy the data into another stream."
e17d9ffb6fa8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8063
diff changeset
   892
e17d9ffb6fa8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8063
diff changeset
   893
    |pos n nWritten|
e17d9ffb6fa8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8063
diff changeset
   894
e17d9ffb6fa8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8063
diff changeset
   895
    "the sendfile() system call currently (2004-05-07) handles only descriptors that
e17d9ffb6fa8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8063
diff changeset
   896
     support mmap-like operations as from-fd.
e17d9ffb6fa8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8063
diff changeset
   897
     Therefore, this method is reimplemented here (from ExternalStream)"
e17d9ffb6fa8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8063
diff changeset
   898
e17d9ffb6fa8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8063
diff changeset
   899
    outStream isExternalStream ifTrue:[
21237
d2ad73cbbee4 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21004
diff changeset
   900
        pos := self position.
d2ad73cbbee4 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21004
diff changeset
   901
        n := self size - pos.
d2ad73cbbee4 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21004
diff changeset
   902
        nWritten := OperatingSystem
d2ad73cbbee4 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21004
diff changeset
   903
                        copyFromFd:self fileHandle
d2ad73cbbee4 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21004
diff changeset
   904
                        toFd:outStream fileHandle
d2ad73cbbee4 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21004
diff changeset
   905
                        startIndex:pos
d2ad73cbbee4 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21004
diff changeset
   906
                        count:n.
d2ad73cbbee4 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21004
diff changeset
   907
        nWritten > 0 ifTrue:[
d2ad73cbbee4 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21004
diff changeset
   908
            self position:pos+nWritten.
d2ad73cbbee4 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21004
diff changeset
   909
        ].
d2ad73cbbee4 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21004
diff changeset
   910
        nWritten = n ifTrue:[
d2ad73cbbee4 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21004
diff changeset
   911
            ^ self
d2ad73cbbee4 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21004
diff changeset
   912
        ].
8362
e17d9ffb6fa8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8063
diff changeset
   913
    ].
8768
Claus Gittinger <cg@exept.de>
parents: 8627
diff changeset
   914
    ^ super copyToEndInto:outStream bufferSize:bufferSize.
8362
e17d9ffb6fa8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8063
diff changeset
   915
e17d9ffb6fa8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8063
diff changeset
   916
    "
e17d9ffb6fa8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8063
diff changeset
   917
     |in out|
e17d9ffb6fa8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8063
diff changeset
   918
e17d9ffb6fa8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8063
diff changeset
   919
     in := 'Makefile' asFilename readStream.
e17d9ffb6fa8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8063
diff changeset
   920
     out := Stdout.
e17d9ffb6fa8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8063
diff changeset
   921
     in copyToEndInto:out.
e17d9ffb6fa8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8063
diff changeset
   922
     in close.
e17d9ffb6fa8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8063
diff changeset
   923
    "
16369
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   924
!
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   925
17151
2b1e0d36cd6f class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17144
diff changeset
   926
syncFileSystem
2b1e0d36cd6f class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17144
diff changeset
   927
    "sync the filesystem containing this FileStream"
2b1e0d36cd6f class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17144
diff changeset
   928
2b1e0d36cd6f class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17144
diff changeset
   929
    OperatingSystem syncFileSystem:handle.
2b1e0d36cd6f class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17144
diff changeset
   930
!
2b1e0d36cd6f class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17144
diff changeset
   931
16369
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   932
truncateTo:newSize
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   933
    "truncate the underlying OS file to newSize.
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   934
     Warning: this may not be implemented on all platforms."
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   935
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   936
%{
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   937
#ifdef HAS_FTRUNCATE
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   938
    OBJ fp = __INST(handle);
16373
9b9827530bf4 Adapt previous change for linux
Stefan Vogel <sv@exept.de>
parents: 16369
diff changeset
   939
    FILE *f;
16369
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   940
    off_t truncateSize;
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   941
16373
9b9827530bf4 Adapt previous change for linux
Stefan Vogel <sv@exept.de>
parents: 16369
diff changeset
   942
    if ((fp != nil) && (__INST(mode) != @symbol(readonly))) {
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   943
	if (__isSmallInteger(newSize)) {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   944
	    truncateSize = __intVal(newSize);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   945
	    if (truncateSize < 0) {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   946
		goto getOutOfHere;
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   947
	    }
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   948
	} else {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   949
	    truncateSize = __signedLongIntVal(newSize);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   950
	    if (truncateSize < 0) {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   951
		goto getOutOfHere;
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   952
	    }
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   953
	    if (truncateSize == 0) {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   954
		if (sizeof(truncateSize) == 8) {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   955
		    if (__signedLong64IntVal(newSize, &truncateSize) == 0 || truncateSize < 0) {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   956
			goto getOutOfHere;
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   957
		    }
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   958
		} else {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   959
		    goto getOutOfHere;
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   960
		}
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   961
	    }
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   962
	}
16369
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   963
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   964
	f = __FILEVal(fp);
16369
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   965
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   966
	if (__INST(buffered) == true) {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   967
	    fflush(f);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   968
	    fseek(f, 0L, SEEK_END); /* needed in stdio */
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   969
	}
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   970
	ftruncate(fileno(f), truncateSize);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   971
	RETURN (self);
16369
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   972
    }
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   973
getOutOfHere: ;
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   974
#endif
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   975
%}.
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   976
    handle isNil ifTrue:[self errorNotOpen. ^ self].
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   977
    (mode == #readonly) ifTrue:[self errorReadOnly. ^ self].
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   978
    newSize < 0 ifTrue:[
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   979
	self error:'wrong arg'.
16369
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   980
    ].
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   981
    self errorUnsupportedOperation
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   982
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   983
    "
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   984
     |f s|
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   985
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   986
     f := 'testTTTT' asFilename.
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   987
     s := f writeStream.
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   988
     s next:1000 put:$a.
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   989
     s truncateTo:100.
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   990
     s close.
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   991
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   992
     Transcript showCR:(f fileSize).
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
   993
     f remove.
16369
a938f5cbc31d Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 16298
diff changeset
   994
    "
8362
e17d9ffb6fa8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8063
diff changeset
   995
! !
e17d9ffb6fa8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8063
diff changeset
   996
2936
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
   997
!FileStream methodsFor:'positioning'!
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
   998
15620
264cf9877dda class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15573
diff changeset
   999
position
7053
13e04c48e23c prep for 0-based stream position
Claus Gittinger <cg@exept.de>
parents: 7051
diff changeset
  1000
    "return the read/write position in the file"
2936
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1001
16298
5fd8d5ceab59 Fix error processing
Stefan Vogel <sv@exept.de>
parents: 16113
diff changeset
  1002
    |error|
3971
aad506cdc5d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3956
diff changeset
  1003
%{
4910
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
  1004
    HFILE f;
7872
634e73a5cdd9 preps for 64bit positions
Claus Gittinger <cg@exept.de>
parents: 7871
diff changeset
  1005
    off_t currentPosition;
2936
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1006
12395
1db7ea277c93 filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 12207
diff changeset
  1007
    if (__INST(handle) != nil) {
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1008
	do {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1009
	    f = __FILEVal(__INST(handle));
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1010
#ifdef __win32__
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1011
	    __threadErrno = 0;
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1012
	    if (__INST(buffered) == true) {
6333
9682533bce75 win32 fixes
Claus Gittinger <cg@exept.de>
parents: 6267
diff changeset
  1013
# if 0
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1014
		currentPosition = STX_C_CALL1( "ftell", ftell, f);
6333
9682533bce75 win32 fixes
Claus Gittinger <cg@exept.de>
parents: 6267
diff changeset
  1015
# else
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1016
		currentPosition = ftell(f);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1017
		__threadErrno = errno;
6333
9682533bce75 win32 fixes
Claus Gittinger <cg@exept.de>
parents: 6267
diff changeset
  1018
# endif
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1019
	    } else {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1020
		OBJ rA = __INST(readAhead);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1021
		off_t offs = 0;
6333
9682533bce75 win32 fixes
Claus Gittinger <cg@exept.de>
parents: 6267
diff changeset
  1022
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1023
		if (rA != nil) {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1024
		    __INST(readAhead) = nil;
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1025
		    offs = -1;
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1026
		}
6333
9682533bce75 win32 fixes
Claus Gittinger <cg@exept.de>
parents: 6267
diff changeset
  1027
# if 0
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1028
		currentPosition = STX_C_CALL3( "lseek", lseek, fileno(f), offs, SEEK_CUR);
6333
9682533bce75 win32 fixes
Claus Gittinger <cg@exept.de>
parents: 6267
diff changeset
  1029
# else
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1030
		currentPosition = lseek(fileno(f), offs, SEEK_CUR);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1031
		__threadErrno = errno;
6333
9682533bce75 win32 fixes
Claus Gittinger <cg@exept.de>
parents: 6267
diff changeset
  1032
# endif
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1033
	    }
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1034
#else /* !__win32__ */
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1035
	    if (__INST(buffered) == true) {
7883
1039acd0624b Large file support (off_t with 64 bits) for UNIX
Stefan Vogel <sv@exept.de>
parents: 7874
diff changeset
  1036
#ifdef _LFS_LARGEFILE
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1037
		currentPosition = ftello(f);
7883
1039acd0624b Large file support (off_t with 64 bits) for UNIX
Stefan Vogel <sv@exept.de>
parents: 7874
diff changeset
  1038
#else
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1039
		currentPosition = ftell(f);
8039
6ef0379296cc #position0Based did not work on unbuffered streams (with 64 bit off_t).
Stefan Vogel <sv@exept.de>
parents: 8034
diff changeset
  1040
#endif /* ! _LFS_LARGEFILE */
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1041
	    } else {
18421
5e7e40d367f2 Use lseek64() instead of lseek() when off_t is 64bit signed integer.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18120
diff changeset
  1042
		if (sizeof(off_t) == 8) {
5e7e40d367f2 Use lseek64() instead of lseek() when off_t is 64bit signed integer.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18120
diff changeset
  1043
                    currentPosition = lseek64(fileno(f), (off_t)0, SEEK_CUR);
5e7e40d367f2 Use lseek64() instead of lseek() when off_t is 64bit signed integer.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18120
diff changeset
  1044
                } else {
5e7e40d367f2 Use lseek64() instead of lseek() when off_t is 64bit signed integer.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18120
diff changeset
  1045
                    currentPosition = lseek(fileno(f), (off_t)0, SEEK_CUR);
5e7e40d367f2 Use lseek64() instead of lseek() when off_t is 64bit signed integer.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18120
diff changeset
  1046
                }
15620
264cf9877dda class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15573
diff changeset
  1047
            }
8039
6ef0379296cc #position0Based did not work on unbuffered streams (with 64 bit off_t).
Stefan Vogel <sv@exept.de>
parents: 8034
diff changeset
  1048
#endif /* !WIN32 */
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1049
	} while ((currentPosition < 0) && (__threadErrno == EINTR));
6267
10016cc16511 pass name of API/C wrap function
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
  1050
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1051
	if (currentPosition >= 0) {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1052
	    OBJ rslt;
7872
634e73a5cdd9 preps for 64bit positions
Claus Gittinger <cg@exept.de>
parents: 7871
diff changeset
  1053
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1054
	    if (sizeof(currentPosition) == 8) {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1055
		rslt = __MKINT64 (&currentPosition);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1056
	    } else {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1057
		rslt = __MKINT(currentPosition);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1058
	    }
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1059
	    RETURN ( rslt );
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1060
	}
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1061
	error = __mkSmallInteger(__threadErrno);
2936
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1062
    }
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1063
%}.
16298
5fd8d5ceab59 Fix error processing
Stefan Vogel <sv@exept.de>
parents: 16113
diff changeset
  1064
    error notNil ifTrue:[
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1065
	lastErrorNumber := error.
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1066
	^ self ioError:error.
16298
5fd8d5ceab59 Fix error processing
Stefan Vogel <sv@exept.de>
parents: 16113
diff changeset
  1067
    ].
12395
1db7ea277c93 filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 12207
diff changeset
  1068
    handle isNil ifTrue:[^ self errorNotOpen].
2936
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1069
    ^ self primitiveFailed
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1070
!
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1071
15620
264cf9877dda class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15573
diff changeset
  1072
position:newPos
2936
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1073
    "set the read/write position in the file"
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1074
16298
5fd8d5ceab59 Fix error processing
Stefan Vogel <sv@exept.de>
parents: 16113
diff changeset
  1075
    |rslt error|
3971
aad506cdc5d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3956
diff changeset
  1076
%{
4910
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
  1077
    HFILE f;
2936
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1078
    long ret;
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1079
    OBJ fp;
7871
5c357f1ba0c9 preps for 64bit positions; fixed 32bit position
Claus Gittinger <cg@exept.de>
parents: 7870
diff changeset
  1080
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  1081
    if ((__INST(canPosition) != false) || (newPos == __mkSmallInteger(0))) {
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1082
	if ((fp = __INST(handle)) != nil) {
7883
1039acd0624b Large file support (off_t with 64 bits) for UNIX
Stefan Vogel <sv@exept.de>
parents: 7874
diff changeset
  1083
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1084
#if defined(_LFS_LARGE_FILE) && !defined(__win32__)
7883
1039acd0624b Large file support (off_t with 64 bits) for UNIX
Stefan Vogel <sv@exept.de>
parents: 7874
diff changeset
  1085
# define FSEEK fseeko
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1086
	    off_t nP;
7883
1039acd0624b Large file support (off_t with 64 bits) for UNIX
Stefan Vogel <sv@exept.de>
parents: 7874
diff changeset
  1087
#else
1039acd0624b Large file support (off_t with 64 bits) for UNIX
Stefan Vogel <sv@exept.de>
parents: 7874
diff changeset
  1088
#define FSEEK fseek
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1089
	    long nP;
7883
1039acd0624b Large file support (off_t with 64 bits) for UNIX
Stefan Vogel <sv@exept.de>
parents: 7874
diff changeset
  1090
#endif
2936
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1091
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1092
	    if (__isSmallInteger(newPos)) {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1093
		nP = __intVal(newPos);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1094
		if (nP < 0) {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1095
		    __INST(lastErrorNumber) = __mkSmallInteger(EINVAL);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1096
		    goto getOutOfHere;
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1097
		}
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1098
	    } else {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1099
		nP = __signedLongIntVal(newPos);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1100
		if (nP < 0) {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1101
		    __INST(lastErrorNumber) = __mkSmallInteger(EINVAL);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1102
		    goto getOutOfHere;
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1103
		}
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1104
		if (nP == 0) {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1105
		    if (sizeof(nP) == 8) {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1106
			if (__signedLong64IntVal(newPos, &nP) == 0 || nP < 0) {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1107
			    __INST(lastErrorNumber) = __mkSmallInteger(EINVAL);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1108
			    goto getOutOfHere;
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1109
			}
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1110
		    } else {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1111
			__INST(lastErrorNumber) = __mkSmallInteger(EINVAL);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1112
			goto getOutOfHere;
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1113
		    }
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1114
		}
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1115
	    }
7871
5c357f1ba0c9 preps for 64bit positions; fixed 32bit position
Claus Gittinger <cg@exept.de>
parents: 7870
diff changeset
  1116
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1117
	    f = __FILEVal(fp);
4910
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
  1118
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1119
	    do {
14853
63ffca691137 fseek does not need a WRAP_CALL (I hope)
Claus Gittinger <cg@exept.de>
parents: 14848
diff changeset
  1120
#if defined(DO_WRAP_CALL_FSEEK)
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1121
		__threadErrno = 0;
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1122
		if (__INST(buffered) == true) {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1123
		    ret = STX_C_CALL3( "fseek", fseek, f, nP, SEEK_SET);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1124
		} else {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1125
		    __INST(readAhead) = nil;
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1126
		    ret = STX_C_CALL3( "lseek", lseek, fileno(f), nP, SEEK_SET);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1127
		}
4910
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
  1128
#else
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1129
		if (__INST(buffered) == true) {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1130
		    ret = FSEEK(f, nP, SEEK_SET);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1131
		} else {
18421
5e7e40d367f2 Use lseek64() instead of lseek() when off_t is 64bit signed integer.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18120
diff changeset
  1132
 #if !defined(__BORLANDC__)                
5e7e40d367f2 Use lseek64() instead of lseek() when off_t is 64bit signed integer.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18120
diff changeset
  1133
                    if (sizeof(nP) == 8)
5e7e40d367f2 Use lseek64() instead of lseek() when off_t is 64bit signed integer.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18120
diff changeset
  1134
                        ret = lseek64(fileno(f), nP, SEEK_SET);
5e7e40d367f2 Use lseek64() instead of lseek() when off_t is 64bit signed integer.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18120
diff changeset
  1135
                    else
5e7e40d367f2 Use lseek64() instead of lseek() when off_t is 64bit signed integer.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18120
diff changeset
  1136
#endif
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1137
		    ret = lseek(fileno(f), nP, SEEK_SET);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1138
		}
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1139
		__threadErrno = errno;
4910
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
  1140
#endif
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1141
	    } while ((ret < 0) && (__threadErrno == EINTR));
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1142
	    if (ret >= 0) {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1143
		__INST(position) = newPos; __STORE(self, newPos);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1144
		/*
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1145
		 * just to make certain ...
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1146
		 */
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1147
		__INST(hitEOF) = false;
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1148
		RETURN ( self );
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1149
	    }
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1150
	    error = __mkSmallInteger(__threadErrno);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1151
	}
2936
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1152
    }
7871
5c357f1ba0c9 preps for 64bit positions; fixed 32bit position
Claus Gittinger <cg@exept.de>
parents: 7870
diff changeset
  1153
    getOutOfHere: ;
7883
1039acd0624b Large file support (off_t with 64 bits) for UNIX
Stefan Vogel <sv@exept.de>
parents: 7874
diff changeset
  1154
#undef FSEEK
2936
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1155
%}.
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1156
    canPosition == false ifTrue:[
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1157
	"/ position by rewinding & re-reading everything up-to
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1158
	"/ that point.
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1159
	^ self slowPosition:newPos
2936
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1160
    ].
16298
5fd8d5ceab59 Fix error processing
Stefan Vogel <sv@exept.de>
parents: 16113
diff changeset
  1161
    error notNil ifTrue:[
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1162
	lastErrorNumber := error.
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1163
	(OperatingSystem errorSymbolForNumber:error) == #EINVAL ifTrue:[
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1164
	    "/ invalid position
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1165
	    ^ self positionError.
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1166
	].
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1167
	"/ assume I/O error
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1168
	^ self ioError:error.
2963
17bd9be72f9b lots of VMS changes
Claus Gittinger <cg@exept.de>
parents: 2936
diff changeset
  1169
    ].
12395
1db7ea277c93 filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 12207
diff changeset
  1170
    handle isNil ifTrue:[^ self errorNotOpen].
7871
5c357f1ba0c9 preps for 64bit positions; fixed 32bit position
Claus Gittinger <cg@exept.de>
parents: 7870
diff changeset
  1171
12395
1db7ea277c93 filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 12207
diff changeset
  1172
    rslt := self positionFile:handle position:newPos.
5493
4efa5b89498b rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5439
diff changeset
  1173
    rslt >= 0 ifTrue:[
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1174
	position := newPos.
5493
4efa5b89498b rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5439
diff changeset
  1175
    ] ifFalse:[
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1176
	hitEOF := true.
5493
4efa5b89498b rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5439
diff changeset
  1177
    ]
2936
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1178
!
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1179
11437
7869fd22df88 #reset reopens a closed file (compatibility with other smalltalks)
Stefan Vogel <sv@exept.de>
parents: 11290
diff changeset
  1180
reset
7869fd22df88 #reset reopens a closed file (compatibility with other smalltalks)
Stefan Vogel <sv@exept.de>
parents: 11290
diff changeset
  1181
    "additionaly to setting the position to the beginning of the file,
7869fd22df88 #reset reopens a closed file (compatibility with other smalltalks)
Stefan Vogel <sv@exept.de>
parents: 11290
diff changeset
  1182
     re-open a previously closed file. This behavior is compatible
7869fd22df88 #reset reopens a closed file (compatibility with other smalltalks)
Stefan Vogel <sv@exept.de>
parents: 11290
diff changeset
  1183
     with other Smalltalk dialects"
7869fd22df88 #reset reopens a closed file (compatibility with other smalltalks)
Stefan Vogel <sv@exept.de>
parents: 11290
diff changeset
  1184
12395
1db7ea277c93 filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 12207
diff changeset
  1185
    handle isNil ifTrue:[
1db7ea277c93 filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 12207
diff changeset
  1186
	"reopen the file"
1db7ea277c93 filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 12207
diff changeset
  1187
	mode == #readonly ifTrue: [
1db7ea277c93 filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 12207
diff changeset
  1188
	    self openForReading
1db7ea277c93 filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 12207
diff changeset
  1189
	] ifFalse:[mode == #writeonly ifTrue: [
1db7ea277c93 filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 12207
diff changeset
  1190
	    self openForWriting.
1db7ea277c93 filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 12207
diff changeset
  1191
	] ifFalse:[
1db7ea277c93 filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 12207
diff changeset
  1192
	    self openForReadWrite.
1db7ea277c93 filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 12207
diff changeset
  1193
	]].
11437
7869fd22df88 #reset reopens a closed file (compatibility with other smalltalks)
Stefan Vogel <sv@exept.de>
parents: 11290
diff changeset
  1194
    ] ifFalse:[
12395
1db7ea277c93 filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 12207
diff changeset
  1195
	super reset.
11437
7869fd22df88 #reset reopens a closed file (compatibility with other smalltalks)
Stefan Vogel <sv@exept.de>
parents: 11290
diff changeset
  1196
    ].
7869fd22df88 #reset reopens a closed file (compatibility with other smalltalks)
Stefan Vogel <sv@exept.de>
parents: 11290
diff changeset
  1197
!
7869fd22df88 #reset reopens a closed file (compatibility with other smalltalks)
Stefan Vogel <sv@exept.de>
parents: 11290
diff changeset
  1198
2936
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1199
setToEnd
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1200
    "set the read/write position in the file to be at the end of the file"
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1201
16298
5fd8d5ceab59 Fix error processing
Stefan Vogel <sv@exept.de>
parents: 16113
diff changeset
  1202
    |error|
2936
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1203
%{
4910
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
  1204
    HFILE f;
7883
1039acd0624b Large file support (off_t with 64 bits) for UNIX
Stefan Vogel <sv@exept.de>
parents: 7874
diff changeset
  1205
    off_t ret;
2936
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1206
12395
1db7ea277c93 filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 12207
diff changeset
  1207
    if (__INST(handle) != nil) {
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1208
	f = __FILEVal(__INST(handle));
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1209
	__INST(position) = nil;    /* i.e. unknown */
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1210
	do {
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1211
#ifdef __win32__
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1212
	    __threadErrno = 0;
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1213
	    if (__INST(buffered) == true) {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1214
		ret = STX_C_CALL3( "fseek", fseek, f, 0L, SEEK_END);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1215
	    } else {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1216
		__INST(readAhead) = nil;
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1217
		ret = STX_C_CALL3( "lseek", lseek, fileno(f), 0L, SEEK_END);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1218
	    }
4910
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
  1219
#else
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1220
	    if (__INST(buffered) == true) {
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1221
# ifdef _LFS_LARGE_FILE
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1222
		ret = fseeko(f, (off_t)0, SEEK_END);
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1223
# else
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1224
		ret = fseek(f, 0L, SEEK_END);
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1225
# endif
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1226
	    } else {
18421
5e7e40d367f2 Use lseek64() instead of lseek() when off_t is 64bit signed integer.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18120
diff changeset
  1227
                if (sizeof(off_t) == 8) {
5e7e40d367f2 Use lseek64() instead of lseek() when off_t is 64bit signed integer.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18120
diff changeset
  1228
                    ret = lseek64(fileno(f), (off_t)0, SEEK_END);
5e7e40d367f2 Use lseek64() instead of lseek() when off_t is 64bit signed integer.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18120
diff changeset
  1229
                } else {
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1230
		ret = lseek(fileno(f), (off_t)0, SEEK_END);
18421
5e7e40d367f2 Use lseek64() instead of lseek() when off_t is 64bit signed integer.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18120
diff changeset
  1231
                }
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1232
	    }
7883
1039acd0624b Large file support (off_t with 64 bits) for UNIX
Stefan Vogel <sv@exept.de>
parents: 7874
diff changeset
  1233
#endif
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1234
	} while ((ret < 0) && (__threadErrno == EINTR));
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1235
	if (ret >= 0) {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1236
	    RETURN ( self );
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1237
	}
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1238
	error = __mkSmallInteger(__threadErrno);
2936
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1239
    }
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1240
%}.
16298
5fd8d5ceab59 Fix error processing
Stefan Vogel <sv@exept.de>
parents: 16113
diff changeset
  1241
    error notNil ifTrue:[
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1242
	lastErrorNumber := error.
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1243
	self ioError:error.
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1244
	^ self.
16298
5fd8d5ceab59 Fix error processing
Stefan Vogel <sv@exept.de>
parents: 16113
diff changeset
  1245
    ].
12395
1db7ea277c93 filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 12207
diff changeset
  1246
    handle isNil ifTrue:[^ self errorNotOpen].
2936
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1247
    ^ self primitiveFailed
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1248
!
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1249
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1250
slowPosition:newPos
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1251
    "position the file by re-reading everything up-to newPos.
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1252
     The effect is the same as that of #position:, but its much slower.
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1253
     This is required to reposition nonPositionable streams, such
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1254
     as tape-streams or variable-record-RMS files under VMS.
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1255
     Caveat:
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1256
	 This should really be done transparently by the stdio library."
15620
264cf9877dda class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15573
diff changeset
  1257
264cf9877dda class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15573
diff changeset
  1258
    |buffer amount pos0Based|
264cf9877dda class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15573
diff changeset
  1259
264cf9877dda class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15573
diff changeset
  1260
    self isReadable ifFalse:[
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1261
	"/ sorry
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1262
	^ self positionError
15620
264cf9877dda class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15573
diff changeset
  1263
    ].
264cf9877dda class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15573
diff changeset
  1264
264cf9877dda class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15573
diff changeset
  1265
    buffer := ByteArray new:8*1024.
2936
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1266
15620
264cf9877dda class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15573
diff changeset
  1267
    (position isNil "/ i.e. unknown
264cf9877dda class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15573
diff changeset
  1268
    or:[newPos < (pos0Based := self position)]) ifTrue:[
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1269
	self reset.
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1270
	pos0Based := self position.
15620
264cf9877dda class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15573
diff changeset
  1271
    ].
264cf9877dda class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15573
diff changeset
  1272
    [pos0Based < newPos] whileTrue:[
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1273
	amount := (buffer size) min:(newPos-pos0Based).
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1274
	(self nextBytes:amount into:buffer startingAt:1) ~~ amount ifTrue:[
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1275
	    ^ self positionError
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1276
	].
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  1277
	pos0Based := self position.
15620
264cf9877dda class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15573
diff changeset
  1278
    ].
264cf9877dda class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15573
diff changeset
  1279
    "/ ('FileStream [info]: slow position - please convert ''' , pathName printString , ''' to streamLF format') infoPrintCR.
2936
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1280
! !
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  1281
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1282
!FileStream methodsFor:'printing & storing'!
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1283
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1284
printOn:aStream
4392
26fb48f04e1b comment
Claus Gittinger <cg@exept.de>
parents: 4353
diff changeset
  1285
    "append a user printed representation of the receiver to aStream.
26fb48f04e1b comment
Claus Gittinger <cg@exept.de>
parents: 4353
diff changeset
  1286
     The format is suitable for a human - not meant to be read back."
2903
e64704e86cce various VMS changes
Claus Gittinger <cg@exept.de>
parents: 2817
diff changeset
  1287
10354
8de4bf3f28e8 changed #printOn:
Stefan Vogel <sv@exept.de>
parents: 10345
diff changeset
  1288
    aStream nextPutAll:self className,'(for: '.
8de4bf3f28e8 changed #printOn:
Stefan Vogel <sv@exept.de>
parents: 10345
diff changeset
  1289
    pathName printOn:aStream.
8de4bf3f28e8 changed #printOn:
Stefan Vogel <sv@exept.de>
parents: 10345
diff changeset
  1290
    aStream nextPut:$).
2811
21136662e8f1 dont crash into debugger when printing with nil pathName
Claus Gittinger <cg@exept.de>
parents: 2808
diff changeset
  1291
10354
8de4bf3f28e8 changed #printOn:
Stefan Vogel <sv@exept.de>
parents: 10345
diff changeset
  1292
    "
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10407
diff changeset
  1293
	'/' asFilename readStream printString
10354
8de4bf3f28e8 changed #printOn:
Stefan Vogel <sv@exept.de>
parents: 10345
diff changeset
  1294
    "
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1295
!
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1296
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1297
storeOn:aStream
2903
e64704e86cce various VMS changes
Claus Gittinger <cg@exept.de>
parents: 2817
diff changeset
  1298
    "append a representation of the receiver to aStream,
e64704e86cce various VMS changes
Claus Gittinger <cg@exept.de>
parents: 2817
diff changeset
  1299
     from which a copy can be reconstructed later."
e64704e86cce various VMS changes
Claus Gittinger <cg@exept.de>
parents: 2817
diff changeset
  1300
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1301
    aStream nextPutAll:'(FileStream oldFileNamed:'.
2811
21136662e8f1 dont crash into debugger when printing with nil pathName
Claus Gittinger <cg@exept.de>
parents: 2808
diff changeset
  1302
    aStream nextPutAll:pathName storeString.
15360
7bf49766c324 class: FileStream
Claus Gittinger <cg@exept.de>
parents: 14853
diff changeset
  1303
    (self position ~~ 0) ifTrue:[
15542
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
  1304
	aStream nextPutAll:'; position:'.
3a22ba499a82 open non-inheritable
Claus Gittinger <cg@exept.de>
parents: 15489
diff changeset
  1305
	self position storeOn:aStream
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1306
    ].
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1307
    aStream nextPut:$)
2811
21136662e8f1 dont crash into debugger when printing with nil pathName
Claus Gittinger <cg@exept.de>
parents: 2808
diff changeset
  1308
21136662e8f1 dont crash into debugger when printing with nil pathName
Claus Gittinger <cg@exept.de>
parents: 2808
diff changeset
  1309
    "Modified: 30.7.1997 / 16:43:50 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1310
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1311
18784
82b13911ae7b #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 18781
diff changeset
  1312
!FileStream protectedMethodsFor:'private'!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1313
8471
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  1314
closeFile
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  1315
    "low level close - may be redefined in subclasses.
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  1316
     Don't send this message, send #close instead"
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  1317
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  1318
    super closeFile.
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  1319
    removeOnClose == true ifTrue:[
8627
5a86b95bebbb gcc3.3.1 insn-scheduling bug workaround
Claus Gittinger <cg@exept.de>
parents: 8604
diff changeset
  1320
	pathName asFilename remove.
8471
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  1321
    ]
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  1322
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  1323
    "Created: / 13.8.1998 / 12:11:22 / cg"
18784
82b13911ae7b #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 18781
diff changeset
  1324
! !
82b13911ae7b #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 18781
diff changeset
  1325
82b13911ae7b #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 18781
diff changeset
  1326
!FileStream methodsFor:'private'!
8471
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  1327
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1328
createForReadWrite
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1329
    "create/truncate the file for read/write.
20921
cc986f069175 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 20412
diff changeset
  1330
     If the file existed, it's truncated; otherwise it's created."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1331
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1332
    mode := #readwrite.
2921
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1333
    ^ self openWithMode:CreateReadWriteMode
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1334
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1335
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1336
createForWriting
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1337
    "create/truncate the file for writeonly.
20921
cc986f069175 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 20412
diff changeset
  1338
     If the file existed, it's truncated; otherwise it's created."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1339
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1340
    mode := #writeonly.
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1341
    didWrite := true.
8604
3079fcbdecb2 Fix #reOpen handling:
Stefan Vogel <sv@exept.de>
parents: 8575
diff changeset
  1342
    ^ self openWithMode:WriteMode
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1343
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1344
5439
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1345
openFile:pathName withMode:openmode attributes:attributeSpec
8627
5a86b95bebbb gcc3.3.1 insn-scheduling bug workaround
Claus Gittinger <cg@exept.de>
parents: 8604
diff changeset
  1346
    "open the file;
5439
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1347
     openmode is the string defining the way to open as defined by the stdio library
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1348
     (i.e. the 2nd fopen argument).
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1349
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1350
     attributeSpec is an additional argument, only used with VMS - it allows a file to
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1351
     be created as fixedRecord, variableRecord, streamLF, streamCR, ...
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1352
     In VMS, if nonNil, it must consist of an array of strings (max:10), giving additional
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1353
     attributes (see fopen description).
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1354
     Passing a nil specifies the default format (streamLF) - ST/X always invokes this with nil.
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1355
     This argument is ignored in UNIX & MSDOS systems.
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1356
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1357
     This is a private entry, but maybe useful to open/create a file in a special mode,
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1358
     which is proprietrary to the operatingSystem."
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1359
16298
5fd8d5ceab59 Fix error processing
Stefan Vogel <sv@exept.de>
parents: 16113
diff changeset
  1360
    |wasBlocked encodedPathName error|
14578
bc436b9a1ee3 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 14439
diff changeset
  1361
bc436b9a1ee3 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 14439
diff changeset
  1362
    encodedPathName := OperatingSystem encodePath:pathName.
5439
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1363
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1364
%{
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
  1365
    HFILE f = NULL;
21604
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1366
    enum {
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1367
    	PASS_INITIAL = 1,
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1368
    	PASS_RETRY_AFTER_SCAVENGE = 2,
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1369
    	PASS_RETRY_AFTER_GARBAGE_COLLECT = 3,
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1370
    	PASS_FINAL = PASS_RETRY_AFTER_GARBAGE_COLLECT
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1371
    } pass = PASS_INITIAL;
5439
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1372
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
  1373
    if (!__isNonNilObject(encodedPathName)
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1374
        || !(__isStringLike(openmode) || __isArrayLike(openmode)))
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1375
            goto badArgument;
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
  1376
5439
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1377
retry:
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1378
#ifdef __VMS__
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
  1379
      if (__isStringLike(encodedPathName)) {
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1380
        do {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1381
            /*
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1382
             * allow passing additional RMS arguments.
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1383
             * stupid: DEC does not seem to offer an interface for passing a char **.
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1384
             */
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1385
            __threadErrno = 0;
5439
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1386
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1387
            {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1388
                if (__isArray(attributeSpec)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1389
                    OBJ *ap = __ArrayInstPtr(attributeSpec)->a_element;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1390
                    int numAttrib = 0;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1391
                    int i;
5439
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1392
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1393
                    numAttrib = __arraySize(attributeSpec);
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1394
                    for (i=0; i<numAttrib;i++) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1395
                        if (! __isStringLike(ap[i])) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1396
                            __threadErrno = EINVAL; /* invalid argument */
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1397
                            goto getOutOfHere;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1398
                        }
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1399
                    }
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1400
                    switch (numAttrib) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1401
                        case 0:
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1402
                            __BEGIN_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1403
                            f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode));
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1404
                            __END_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1405
                            break;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1406
                        case 1:
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1407
                            __BEGIN_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1408
                            f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1409
                                      __stringVal(ap[0]));
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1410
                            __END_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1411
                            break;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1412
                        case 2:
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1413
                            __BEGIN_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1414
                            f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1415
                                      __stringVal(ap[0]), __stringVal(ap[1]));
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1416
                            __END_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1417
                            break;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1418
                        case 3:
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1419
                            __BEGIN_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1420
                            f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1421
                                      __stringVal(ap[0]), __stringVal(ap[1]), __stringVal(ap[2]));
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1422
                            __END_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1423
                            break;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1424
                        case 4:
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1425
                            __BEGIN_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1426
                            f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1427
                                      __stringVal(ap[0]), __stringVal(ap[1]), __stringVal(ap[2]),
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1428
                                      __stringVal(ap[3]));
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1429
                            __END_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1430
                            break;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1431
                        case 5:
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1432
                            __BEGIN_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1433
                            f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1434
                                      __stringVal(ap[0]), __stringVal(ap[1]), __stringVal(ap[2]),
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1435
                                      __stringVal(ap[3]), __stringVal(ap[4]));
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1436
                            __END_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1437
                            break;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1438
                        case 6:
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1439
                            __BEGIN_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1440
                            f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1441
                                      __stringVal(ap[0]), __stringVal(ap[1]), __stringVal(ap[2]),
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1442
                                      __stringVal(ap[3]), __stringVal(ap[4]), __stringVal(ap[5]));
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1443
                            __END_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1444
                            break;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1445
                        case 7:
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1446
                            __BEGIN_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1447
                            f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1448
                                      __stringVal(ap[0]), __stringVal(ap[1]), __stringVal(ap[2]),
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1449
                                      __stringVal(ap[3]), __stringVal(ap[4]), __stringVal(ap[5]),
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1450
                                      __stringVal(ap[6]));
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1451
                            __END_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1452
                            break;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1453
                        case 8:
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1454
                            __BEGIN_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1455
                            f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1456
                                      __stringVal(ap[0]), __stringVal(ap[1]), __stringVal(ap[2]),
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1457
                                      __stringVal(ap[3]), __stringVal(ap[4]), __stringVal(ap[5]),
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1458
                                      __stringVal(ap[6]), __stringVal(ap[7]));
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1459
                            __END_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1460
                            break;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1461
                        case 9:
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1462
                            __BEGIN_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1463
                            f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1464
                                      __stringVal(ap[0]), __stringVal(ap[1]), __stringVal(ap[2]),
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1465
                                      __stringVal(ap[3]), __stringVal(ap[4]), __stringVal(ap[5]),
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1466
                                      __stringVal(ap[6]), __stringVal(ap[7]), __stringVal(ap[8]));
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1467
                            __END_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1468
                            break;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1469
                        case 10:
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1470
                            __BEGIN_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1471
                            f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode),
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1472
                                      __stringVal(ap[0]), __stringVal(ap[1]), __stringVal(ap[2]),
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1473
                                      __stringVal(ap[3]), __stringVal(ap[4]), __stringVal(ap[5]),
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1474
                                      __stringVal(ap[6]), __stringVal(ap[7]), __stringVal(ap[8]),
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1475
                                      __stringVal(ap[9]));
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1476
                            __END_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1477
                            break;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1478
                        default:
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1479
                            __threadErrno = E2BIG; /* too many args */
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1480
                            goto getOutOfHere;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1481
                    }
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1482
                } else if (attributeSpec != nil) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1483
                    __threadErrno = EINVAL; /* invalid argument */
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1484
                    goto getOutOfHere;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1485
                } else {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1486
                    /*
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1487
                     * create file as sequential streamLF by default.
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1488
                     */
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1489
                    __BEGIN_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1490
                    f = fopen((char *)__stringVal(pathName), (char *)__stringVal(openmode), "rfm=stmlf");
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1491
                    __END_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1492
                }
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1493
            }
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1494
        } while ((f == NULL) && (__threadErrno == EINTR));
11290
4226ed9c9a94 unicode filenames
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  1495
      }
5439
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1496
#else /* not VMS */
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1497
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1498
# ifdef __win32__
11812
fae9f7c22dbd Windows: user CreateFile() instead of fopen() to avoid wrong data to be read
Stefan Vogel <sv@exept.de>
parents: 11454
diff changeset
  1499
    {
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1500
          DWORD share = 0, access = 0, create = 0, attr = 0;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1501
          char * __openmode;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1502
          HANDLE handle;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1503
          SECURITY_ATTRIBUTES sa;
11290
4226ed9c9a94 unicode filenames
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  1504
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1505
          if (__isStringLike(openmode)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1506
              share = FILE_SHARE_READ|FILE_SHARE_WRITE;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1507
              __openmode = __stringVal(openmode);
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1508
              if (strcmp(__openmode, "rb") == 0) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1509
                  access = GENERIC_READ;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1510
                  create = OPEN_EXISTING;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1511
              } else if (strcmp(__openmode, "rb+") == 0) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1512
                  access = GENERIC_READ | GENERIC_WRITE;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1513
                  create = OPEN_EXISTING;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1514
              } else if (strcmp(__openmode, "wb") == 0) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1515
                  access = GENERIC_WRITE;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1516
                  create = CREATE_ALWAYS;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1517
              } else if (strcmp(__openmode, "wb+") == 0) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1518
                  access = GENERIC_READ | GENERIC_WRITE;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1519
                  create = CREATE_ALWAYS;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1520
              } else if (strcmp(__openmode, "ab") == 0) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1521
                  access = FILE_APPEND_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA|
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1522
                                STANDARD_RIGHTS_WRITE|SYNCHRONIZE;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1523
                  create = OPEN_ALWAYS;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1524
              } else if (strcmp(__openmode, "ab+") == 0) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1525
                  access = GENERIC_READ |FILE_APPEND_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA|
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1526
                                STANDARD_RIGHTS_WRITE|SYNCHRONIZE;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1527
                  create = OPEN_ALWAYS;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1528
              } else {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1529
                  console_fprintf(stderr, "Win32OS [warning]: unsupported open mode\n");
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1530
              }
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1531
          } else if (__isArrayLike(openmode)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1532
              OBJ *ap = __arrayVal(openmode);
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1533
              int numAttrib = __arraySize(openmode);
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1534
              int i;
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
  1535
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1536
              __openmode = "rb+";
11812
fae9f7c22dbd Windows: user CreateFile() instead of fopen() to avoid wrong data to be read
Stefan Vogel <sv@exept.de>
parents: 11454
diff changeset
  1537
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1538
              for (i=0; i<numAttrib; i++) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1539
                  OBJ attrSym = ap[i];
11812
fae9f7c22dbd Windows: user CreateFile() instead of fopen() to avoid wrong data to be read
Stefan Vogel <sv@exept.de>
parents: 11454
diff changeset
  1540
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1541
                  if (attrSym == @symbol(FILE_SHARE_READ)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1542
                      share |= FILE_SHARE_READ;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1543
                  } else if (attrSym == @symbol(FILE_SHARE_WRITE)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1544
                      share |= FILE_SHARE_WRITE;
11812
fae9f7c22dbd Windows: user CreateFile() instead of fopen() to avoid wrong data to be read
Stefan Vogel <sv@exept.de>
parents: 11454
diff changeset
  1545
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1546
                  } else if (attrSym == @symbol(GENERIC_READ)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1547
                      access |= GENERIC_READ;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1548
                  } else if (attrSym == @symbol(GENERIC_WRITE)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1549
                      access |= GENERIC_WRITE;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1550
                  } else if (attrSym == @symbol(GENERIC_READ_WRITE)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1551
                      access |= GENERIC_READ|GENERIC_WRITE;
11812
fae9f7c22dbd Windows: user CreateFile() instead of fopen() to avoid wrong data to be read
Stefan Vogel <sv@exept.de>
parents: 11454
diff changeset
  1552
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1553
                  } else if (attrSym == @symbol(CREATE_NEW)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1554
                      create |= CREATE_NEW;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1555
                  } else if (attrSym == @symbol(CREATE_ALWAYS)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1556
                      create |= CREATE_ALWAYS;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1557
                  } else if (attrSym == @symbol(OPEN_EXISTING)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1558
                      create |= OPEN_EXISTING;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1559
                  } else if (attrSym == @symbol(OPEN_ALWAYS)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1560
                      create |= OPEN_ALWAYS;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1561
                  } else if (attrSym == @symbol(TRUNCATE_EXISTING)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1562
                      create |= TRUNCATE_EXISTING;
5439
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1563
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1564
                  } else if (attrSym == @symbol(FILE_ATTRIBUTE_HIDDEN)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1565
                      attr |= FILE_ATTRIBUTE_HIDDEN;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1566
                  } else if (attrSym == @symbol(FILE_ATTRIBUTE_READONLY)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1567
                      attr |= FILE_ATTRIBUTE_READONLY;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1568
                  } else if (attrSym == @symbol(FILE_FLAG_WRITE_THROUGH)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1569
                      attr |= FILE_FLAG_WRITE_THROUGH;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1570
                  } else if (attrSym == @symbol(FILE_FLAG_SEQUENTIAL_SCAN)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1571
                      attr |= FILE_FLAG_SEQUENTIAL_SCAN;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1572
                  } else if (attrSym == @symbol(FILE_FLAG_DELETE_ON_CLOSE)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1573
                      attr |= FILE_FLAG_DELETE_ON_CLOSE;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1574
                  } else if (!__isSymbol(attrSym) && __isStringLike(attrSym)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1575
                      __openmode = __stringVal(attrSym);
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1576
                  } else {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1577
                      console_fprintf(stderr, "Win32OS [warning]: unsupported open mode\n");
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1578
                  }
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1579
              }
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1580
          }
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1581
          if (create == 0) {
11812
fae9f7c22dbd Windows: user CreateFile() instead of fopen() to avoid wrong data to be read
Stefan Vogel <sv@exept.de>
parents: 11454
diff changeset
  1582
//              argumentError = @symbol(missingCreateMode);
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1583
              goto badArgument;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1584
          }
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1585
          if (attr == 0) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1586
              attr = FILE_ATTRIBUTE_NORMAL;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1587
          }
11812
fae9f7c22dbd Windows: user CreateFile() instead of fopen() to avoid wrong data to be read
Stefan Vogel <sv@exept.de>
parents: 11454
diff changeset
  1588
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1589
          /*
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1590
           * create security attributes - make handle inheritable by subprocesses
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1591
           */
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1592
          memset(&sa, 0, sizeof (sa));
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1593
          sa.nLength = sizeof( sa );
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1594
          // sa.bInheritHandle = TRUE;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1595
          sa.bInheritHandle = FALSE;
12630
c6151f8f6854 changed: #openFile:withMode:attributes:
Stefan Vogel <sv@exept.de>
parents: 12467
diff changeset
  1596
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1597
          if (__isStringLike(pathName)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1598
                char _aPathName[MAXPATHLEN];
11290
4226ed9c9a94 unicode filenames
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  1599
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1600
                strncpy(_aPathName, __stringVal(pathName), MAXPATHLEN-1); _aPathName[MAXPATHLEN-1] = '\0';
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1601
                do {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1602
                    __threadErrno = 0;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1603
                    handle = STX_API_NOINT_CALL7( "CreateFileA", CreateFileA, _aPathName, access, share, &sa, create, attr, 0 /* hTempl */);
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1604
                    if (__threadErrno == EINTR) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1605
                        handle = INVALID_HANDLE_VALUE;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1606
                    }
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1607
                } while ((handle == INVALID_HANDLE_VALUE) && (__threadErrno == EINTR));
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1608
          } else if (__isUnicode16String(pathName)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1609
                wchar_t _aPathName[MAXPATHLEN+1];
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1610
                int i, l;
11812
fae9f7c22dbd Windows: user CreateFile() instead of fopen() to avoid wrong data to be read
Stefan Vogel <sv@exept.de>
parents: 11454
diff changeset
  1611
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1612
                l = __unicode16StringSize(pathName);
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1613
                if (l > MAXPATHLEN) l = MAXPATHLEN;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1614
                for (i=0; i<l; i++) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1615
                    _aPathName[i] = __unicode16StringVal(pathName)[i];
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1616
                }
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1617
                _aPathName[i] = 0;
11812
fae9f7c22dbd Windows: user CreateFile() instead of fopen() to avoid wrong data to be read
Stefan Vogel <sv@exept.de>
parents: 11454
diff changeset
  1618
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1619
                do {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1620
                    __threadErrno = 0;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1621
                    handle = STX_API_NOINT_CALL7( "CreateFileW", CreateFileW, _aPathName, access, share, &sa, create, attr, 0 /* hTempl */);
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1622
                    if (__threadErrno == EINTR) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1623
                        handle = INVALID_HANDLE_VALUE;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1624
                    }
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1625
                } while ((handle == INVALID_HANDLE_VALUE) && (__threadErrno == EINTR));
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1626
          }
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1627
          if (handle != INVALID_HANDLE_VALUE) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1628
              int fd;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1629
              extern void __stxWrapApiEnterCritical(), __stxWrapApiLeaveCritical();
12692
6150a8d7c87e changed: #openFile:withMode:attributes:
Stefan Vogel <sv@exept.de>
parents: 12687
diff changeset
  1630
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1631
              __stxWrapApiEnterCritical();
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1632
              fd = _open_osfhandle((long)handle, O_BINARY);
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1633
              if (fd < 0) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1634
                  if (__threadErrno == 0) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1635
                      // no more file descriptors
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1636
                      __threadErrno = EMFILE;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1637
                  }
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1638
                  CloseHandle(handle);
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1639
              } else {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1640
                  f = fdopen(fd, __openmode);
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1641
              }
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1642
              __stxWrapApiLeaveCritical();
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1643
          }  else {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1644
            __threadErrno = __WIN32_ERR(GetLastError());
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1645
          }
11290
4226ed9c9a94 unicode filenames
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  1646
      }
5439
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1647
# else /* not WIN32 */
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1648
14578
bc436b9a1ee3 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 14439
diff changeset
  1649
      if (__isStringLike(encodedPathName)) {
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1650
          int accessMode = 0666;        // default access mode of fopen(), relies on umask()
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1651
          int flags = 0;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1652
          int fd;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1653
          char * __openmode;
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
  1654
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1655
          if (__isStringLike(openmode)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1656
              __openmode = __stringVal(openmode);
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1657
              if (strcmp(__openmode, "r") == 0) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1658
                  flags = O_RDONLY;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1659
              } else if (strcmp(__openmode, "r+") == 0) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1660
                  flags = O_RDWR;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1661
              } else if (strcmp(__openmode, "w") == 0) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1662
                  flags = O_WRONLY | O_CREAT | O_TRUNC;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1663
              } else if (strcmp(__openmode, "w+") == 0) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1664
                  flags = O_RDWR | O_CREAT | O_TRUNC;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1665
              } else if (strcmp(__openmode, "a") == 0) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1666
                  flags = O_WRONLY | O_CREAT | O_APPEND;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1667
              } else if (strcmp(__openmode, "a+") == 0) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1668
                  flags = O_RDWR | O_CREAT| O_APPEND;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1669
              } else {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1670
                  console_fprintf(stderr, "UNIXOS [warning]: unsupported open mode\n");
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1671
              }
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1672
          } else if (__isArrayLike(openmode)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1673
              OBJ *ap = __arrayVal(openmode);
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1674
              int numAttrib = __arraySize(openmode);
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1675
              int i;
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
  1676
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1677
              __openmode = "r+";
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
  1678
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1679
              for (i=0; i<numAttrib; i++) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1680
                  OBJ attrSym = ap[i];
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
  1681
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1682
                  if (attrSym == @symbol(FILE_SHARE_READ)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1683
                      // ignore
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1684
                  } else if (attrSym == @symbol(FILE_SHARE_WRITE)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1685
                     // ignore
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1686
                  } else if (attrSym == @symbol(GENERIC_READ)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1687
                      flags |= O_RDONLY;
21004
6bf6de31cd6a #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 20921
diff changeset
  1688
                      __openmode = "r";
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1689
                  } else if (attrSym == @symbol(GENERIC_WRITE)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1690
                      flags |= O_WRONLY;
21004
6bf6de31cd6a #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 20921
diff changeset
  1691
                      __openmode = "w";
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1692
                  } else if (attrSym == @symbol(GENERIC_READ_WRITE)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1693
                      flags |= O_RDWR;
21004
6bf6de31cd6a #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 20921
diff changeset
  1694
                      __openmode = "r+";
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1695
                  } else if (attrSym == @symbol(CREATE_NEW)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1696
                      flags |= O_CREAT|O_EXCL;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1697
                      accessMode = 0600;     // simulate mkstemp()
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1698
                  } else if (attrSym == @symbol(CREATE_ALWAYS)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1699
                      flags |= O_CREAT|O_TRUNC;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1700
                  } else if (attrSym == @symbol(OPEN_EXISTING)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1701
                      // nothing to be set
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1702
                  } else if (attrSym == @symbol(OPEN_ALWAYS)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1703
                      flags |= O_CREAT;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1704
                  } else if (attrSym == @symbol(TRUNCATE_EXISTING)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1705
                      flags |= O_TRUNC;
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
  1706
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1707
                  } else if (attrSym == @symbol(FILE_ATTRIBUTE_HIDDEN)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1708
                      // ignore
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1709
                  } else if (attrSym == @symbol(FILE_ATTRIBUTE_READONLY)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1710
                      accessMode &= 0444;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1711
                  } else if (attrSym == @symbol(FILE_FLAG_WRITE_THROUGH)) {
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
  1712
#ifdef O_DIRECT
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1713
                      flags |= O_DIRECT;
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
  1714
#endif
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1715
                  } else if (attrSym == @symbol(FILE_FLAG_SEQUENTIAL_SCAN)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1716
                      // ignore
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1717
                  } else if (attrSym == @symbol(FILE_FLAG_DELETE_ON_CLOSE)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1718
                      // ignore;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1719
                  } else if (!__isSymbol(attrSym) && __isStringLike(attrSym)) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1720
                      __openmode = __stringVal(attrSym);
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1721
                  } else {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1722
                      console_fprintf(stderr, "UNIXOS [warning]: unsupported open mode\n");
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1723
                  }
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1724
              }
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1725
          }
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1726
          do {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1727
              __BEGIN_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1728
              fd = open((char *) __stringVal(encodedPathName), flags, accessMode);
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1729
              __END_INTERRUPTABLE__
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1730
          } while ((fd < 0) && (__threadErrno == EINTR));
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
  1731
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1732
          if (fd >= 0) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1733
              __threadErrno = 0;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1734
              f = fdopen(fd, __openmode);
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1735
              if (f == NULL) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1736
                  close(fd);            // fdopen failed, close before retry.
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1737
              }
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1738
          }
11290
4226ed9c9a94 unicode filenames
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  1739
      }
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
  1740
5439
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1741
# endif /* not WIN32 */
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1742
#endif /* not VMS */
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1743
15462
daed379229a2 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 15360
diff changeset
  1744
11290
4226ed9c9a94 unicode filenames
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  1745
    if (f == NULL) {
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1746
        /*
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1747
         * If no filedescriptors available, try to finalize
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1748
         * possibly collected fd's and try again.
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1749
         */
21604
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1750
        if ((__threadErrno == ENFILE || __threadErrno == EMFILE) && pass < PASS_FINAL) {
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1751
            switch (pass) {
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1752
            	case PASS_INITIAL:
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1753
            	    {
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1754
            	        pass = PASS_RETRY_AFTER_SCAVENGE;
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1755
            	        __SSEND0(@global(ObjectMemory), @symbol(scavenge), 0);	    
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1756
            	        __SSEND0(@global(ObjectMemory), @symbol(finalize), 0);
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1757
            	    }
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1758
            	    goto retry;
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1759
                case PASS_RETRY_AFTER_SCAVENGE:
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1760
                    {
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1761
            	        pass = PASS_RETRY_AFTER_GARBAGE_COLLECT;
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1762
            	        __SSEND0(@global(ObjectMemory), @symbol(garbageCollect), 0);	    
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1763
            	        __SSEND0(@global(ObjectMemory), @symbol(finalize), 0);
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1764
            	    }
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1765
            	    goto retry;
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1766
            	case PASS_RETRY_AFTER_GARBAGE_COLLECT:
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1767
            	    /* Should never be reached */
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1768
            	    goto getOutOfHere;
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21285
diff changeset
  1769
            }            
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1770
        }
11812
fae9f7c22dbd Windows: user CreateFile() instead of fopen() to avoid wrong data to be read
Stefan Vogel <sv@exept.de>
parents: 11454
diff changeset
  1771
    badArgument:
fae9f7c22dbd Windows: user CreateFile() instead of fopen() to avoid wrong data to be read
Stefan Vogel <sv@exept.de>
parents: 11454
diff changeset
  1772
    getOutOfHere:
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1773
        error = __mkSmallInteger(__threadErrno);
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1774
        __INST(position) = nil;
11290
4226ed9c9a94 unicode filenames
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  1775
    } else {
5439
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1776
#ifdef __VMS__
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1777
        /*
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1778
         * check to see if this is positionable ...
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1779
         */
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1780
        __INST(canPosition) = false;
5439
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1781
# ifndef _POSIX_C_SOURCE
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1782
        {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1783
            struct stat statBuffer;
5439
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1784
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1785
            if (fstat(fileno(f), &statBuffer) >= 0) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1786
                switch (statBuffer.st_fab_rfm) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1787
                    case FAB$C_UDF: /* undefined (also stream binary)   */
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1788
                    case FAB$C_VAR: /* variable length records          */
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1789
                    case FAB$C_VFC: /* variable fixed control           */
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1790
                    case FAB$C_STM: /* RMS-11 stream (valid only for sequen) */
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1791
                    default:
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1792
                        __INST(canPosition) = false;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1793
                        break;
5439
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1794
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1795
                    case FAB$C_FIX: /* fixed length records             */
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1796
                    case FAB$C_STMLF: /* LF stream (valid only for sequential) */
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1797
                    case FAB$C_STMCR: /* CR stream (valid only for sequential) */
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1798
                        __INST(canPosition) = true;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1799
                        break;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1800
                }
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1801
            }
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1802
        }
8627
5a86b95bebbb gcc3.3.1 insn-scheduling bug workaround
Claus Gittinger <cg@exept.de>
parents: 8604
diff changeset
  1803
# endif
5439
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1804
#else /* not VMS */
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1805
        __INST(canPosition) = true;
11812
fae9f7c22dbd Windows: user CreateFile() instead of fopen() to avoid wrong data to be read
Stefan Vogel <sv@exept.de>
parents: 11454
diff changeset
  1806
#endif /* not VMS */
5439
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1807
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1808
        if (@global(FileOpenTrace) == true) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1809
            console_fprintf(stderr, "fopen %s [FileStream] -> %"_lx_"\n", __stringVal(pathName), (INT)f);
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1810
        }
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1811
        if (f != NULL) {
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1812
            OBJ fp;
8627
5a86b95bebbb gcc3.3.1 insn-scheduling bug workaround
Claus Gittinger <cg@exept.de>
parents: 8604
diff changeset
  1813
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1814
            wasBlocked = __BLOCKINTERRUPTS();
8627
5a86b95bebbb gcc3.3.1 insn-scheduling bug workaround
Claus Gittinger <cg@exept.de>
parents: 8604
diff changeset
  1815
#if 0
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1816
            // The original code was:
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1817
            __INST(handle) = fp = __MKEXTERNALADDRESS(f); __STORE(self, fp);
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1818
            // but for that, gcc generates wrong code, which loads self (volatile) into
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1819
            // a register (bp), then calls __MKEXTERNALADDRESS, then stores indirect bp.
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1820
            // That is wrong if a scavenge occurs in __MKEXTERNALADDRESS, as bp is now still pointing to the old
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1821
            // object.
8627
5a86b95bebbb gcc3.3.1 insn-scheduling bug workaround
Claus Gittinger <cg@exept.de>
parents: 8604
diff changeset
  1822
#else
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1823
            fp = __MKEXTERNALADDRESS(f);
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1824
            __INST(handle) = fp;
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1825
            __STORE(self, fp);
8627
5a86b95bebbb gcc3.3.1 insn-scheduling bug workaround
Claus Gittinger <cg@exept.de>
parents: 8604
diff changeset
  1826
#endif
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1827
        }
5439
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1828
    }
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1829
%}.
16298
5fd8d5ceab59 Fix error processing
Stefan Vogel <sv@exept.de>
parents: 16113
diff changeset
  1830
    error notNil ifTrue:[
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1831
        lastErrorNumber := error.
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1832
        ^ self openError:error.
8034
716b32d832bf raise condition interrupt: interrupt between creation and lobby
ca
parents: 7970
diff changeset
  1833
    ].
16298
5fd8d5ceab59 Fix error processing
Stefan Vogel <sv@exept.de>
parents: 16113
diff changeset
  1834
    handle isNil ifTrue:[
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1835
        ^ self openError:0.
16298
5fd8d5ceab59 Fix error processing
Stefan Vogel <sv@exept.de>
parents: 16113
diff changeset
  1836
    ].
5fd8d5ceab59 Fix error processing
Stefan Vogel <sv@exept.de>
parents: 16113
diff changeset
  1837
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1838
    buffered := true.   "default is buffered"
16298
5fd8d5ceab59 Fix error processing
Stefan Vogel <sv@exept.de>
parents: 16113
diff changeset
  1839
    position := 0.
5fd8d5ceab59 Fix error processing
Stefan Vogel <sv@exept.de>
parents: 16113
diff changeset
  1840
    handleType := #filePointer.
18781
58f9cf53b2ae #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 18651
diff changeset
  1841
    self registerForFinalization.
16298
5fd8d5ceab59 Fix error processing
Stefan Vogel <sv@exept.de>
parents: 16113
diff changeset
  1842
    wasBlocked == false ifTrue:[OperatingSystem unblockInterrupts].
12395
1db7ea277c93 filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 12207
diff changeset
  1843
    ^ handle
5439
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1844
!
956c8095c4ff rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  1845
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1846
openForAppending
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1847
    "open the file for writeonly appending to the end.
20921
cc986f069175 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 20412
diff changeset
  1848
     If the file does not exist, raise OpenError;
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1849
     otherwise return the receiver."
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1850
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1851
    mode := #writeonly.
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1852
    didWrite := true.
2921
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1853
    ^ self openWithMode:AppendMode
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1854
!
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1855
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1856
openForReadWrite
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1857
    "open the file for read/write.
20921
cc986f069175 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 20412
diff changeset
  1858
     If the file does not exist, raise OpenError;
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1859
     otherwise return the receiver."
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1860
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1861
    mode := #readwrite.
2921
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1862
    ^ self openWithMode:ReadWriteMode
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1863
!
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1864
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1865
openForReading
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1866
    "open the file for readonly.
20921
cc986f069175 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 20412
diff changeset
  1867
     If the file does not exist, raise OpenError;
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1868
     otherwise return the receiver."
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1869
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1870
    mode := #readonly.
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1871
    didWrite := false.
2921
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1872
    ^ self openWithMode:ReadMode
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1873
!
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1874
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1875
openForWriting
8604
3079fcbdecb2 Fix #reOpen handling:
Stefan Vogel <sv@exept.de>
parents: 8575
diff changeset
  1876
    "open the file writeonly. The contents of the file is preserved.
20921
cc986f069175 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 20412
diff changeset
  1877
     If the file does not exist, raise OpenError;
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1878
     otherwise return the receiver."
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1879
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1880
    mode := #writeonly.
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1881
    didWrite := true.
8604
3079fcbdecb2 Fix #reOpen handling:
Stefan Vogel <sv@exept.de>
parents: 8575
diff changeset
  1882
    "we must not truncate the file!! So do not use WriteMode"
3079fcbdecb2 Fix #reOpen handling:
Stefan Vogel <sv@exept.de>
parents: 8575
diff changeset
  1883
    ^ self openWithMode:ReadWriteMode
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1884
!
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1885
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1886
openWithMode:openmode
2921
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1887
    "open the file;
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1888
     openmode is the string defining the way to open as defined by the stdio library
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1889
     (i.e. the 2nd fopen argument).
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1890
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1891
     This is a private entry, but maybe useful to open a file in a special mode,
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1892
     which is proprietrary to the operatingSystem."
8627
5a86b95bebbb gcc3.3.1 insn-scheduling bug workaround
Claus Gittinger <cg@exept.de>
parents: 8604
diff changeset
  1893
2921
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1894
    ^ self openWithMode:openmode attributes:nil
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1895
!
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1896
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1897
openWithMode:openmode attributes:attributeSpec
8627
5a86b95bebbb gcc3.3.1 insn-scheduling bug workaround
Claus Gittinger <cg@exept.de>
parents: 8604
diff changeset
  1898
    "open the file;
2921
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1899
     openmode is the string defining the way to open as defined by the stdio library
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1900
     (i.e. the 2nd fopen argument).
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1901
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1902
     attributeSpec is an additional argument, only used with VMS - it allows a file to
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1903
     be created as fixedRecord, variableRecord, streamLF, streamCR, ...
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1904
     In VMS, if nonNil, it must consist of an array of strings (max:10), giving additional
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1905
     attributes (see fopen description).
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1906
     Passing a nil specifies the default format (streamLF) - ST/X always invokes this with nil.
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1907
     This argument is ignored in UNIX & MSDOS systems.
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1908
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1909
     This is a private entry, but maybe useful to open/create a file in a special mode,
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1910
     which is proprietrary to the operatingSystem."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1911
12395
1db7ea277c93 filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 12207
diff changeset
  1912
    handle notNil ifTrue:[^ self errorAlreadyOpen].
2921
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1913
12395
1db7ea277c93 filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 12207
diff changeset
  1914
    handle := self openFile:pathName withMode:openmode attributes:attributeSpec.
17144
5aa46b24fa21 class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17078
diff changeset
  1915
    handle isNil ifTrue:[
20096
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1916
        "this happens, if proceeding from an OpenError raised in #openFile..."
18e793f4cb78 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19860
diff changeset
  1917
        ^ nil.
8604
3079fcbdecb2 Fix #reOpen handling:
Stefan Vogel <sv@exept.de>
parents: 8575
diff changeset
  1918
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1919
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1920
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1921
pathName:filename
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1922
    "set the pathname"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1923
3051
29d10c26d6a3 allow for fileNames to be passed to #pathName:
Claus Gittinger <cg@exept.de>
parents: 3044
diff changeset
  1924
    pathName := filename asString
29d10c26d6a3 allow for fileNames to be passed to #pathName:
Claus Gittinger <cg@exept.de>
parents: 3044
diff changeset
  1925
29d10c26d6a3 allow for fileNames to be passed to #pathName:
Claus Gittinger <cg@exept.de>
parents: 3044
diff changeset
  1926
    "Modified: / 28.10.1997 / 14:29:01 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1927
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1928
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1929
pathName:filename in:aDirectory
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1930
    "set the pathname starting at aDirectory, a FileDirectory"
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1931
3051
29d10c26d6a3 allow for fileNames to be passed to #pathName:
Claus Gittinger <cg@exept.de>
parents: 3044
diff changeset
  1932
    pathName := aDirectory asFilename constructString:filename
29d10c26d6a3 allow for fileNames to be passed to #pathName:
Claus Gittinger <cg@exept.de>
parents: 3044
diff changeset
  1933
29d10c26d6a3 allow for fileNames to be passed to #pathName:
Claus Gittinger <cg@exept.de>
parents: 3044
diff changeset
  1934
    "Modified: / 28.10.1997 / 14:28:54 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1935
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1936
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1937
reOpen
8604
3079fcbdecb2 Fix #reOpen handling:
Stefan Vogel <sv@exept.de>
parents: 8575
diff changeset
  1938
    "USERS WILL NEVER INVOKE THIS METHOD
3079fcbdecb2 Fix #reOpen handling:
Stefan Vogel <sv@exept.de>
parents: 8575
diff changeset
  1939
     sent after snapin to reopen streams."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1940
12395
1db7ea277c93 filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 12207
diff changeset
  1941
    handle notNil ifTrue:[
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1942
	"it was open, when snapped-out"
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1943
	handle := nil.
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1944
	self unregisterForFinalization.
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1945
	pathName isNil ifTrue:[
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1946
	    ^ self.
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1947
	].
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1948
	[
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1949
	    |oldPos|
173
58e9778954bc reposition
claus
parents: 159
diff changeset
  1950
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1951
	    "should take care of appending files and open them for
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1952
	     append / position them to the end"
8604
3079fcbdecb2 Fix #reOpen handling:
Stefan Vogel <sv@exept.de>
parents: 8575
diff changeset
  1953
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1954
	    oldPos := position.
8604
3079fcbdecb2 Fix #reOpen handling:
Stefan Vogel <sv@exept.de>
parents: 8575
diff changeset
  1955
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1956
	    mode == #readonly ifTrue: [
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1957
		self openForReading
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1958
	    ] ifFalse:[mode == #writeonly ifTrue: [
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1959
		self openForWriting.
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1960
	    ] ifFalse:[
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1961
		self openForReadWrite.
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1962
	    ]].
8604
3079fcbdecb2 Fix #reOpen handling:
Stefan Vogel <sv@exept.de>
parents: 8575
diff changeset
  1963
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1964
	    oldPos notNil ifTrue:[
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1965
		self position:oldPos.
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1966
	    ]
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1967
	] on:OpenError do:[:ex|
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1968
	    "this happens, if after a restart,
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1969
	     the file is no longer present or accessible ..."
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
  1970
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1971
	    (self class name , ' [warning]: could not reopen file: ', pathName) errorPrintCR.
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19638
diff changeset
  1972
	].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1973
    ]
1088
989f0e510a32 nicer message
Claus Gittinger <cg@exept.de>
parents: 857
diff changeset
  1974
2134
246a3bdab8b4 newStyle info & error messages
Claus Gittinger <cg@exept.de>
parents: 2078
diff changeset
  1975
    "Modified: 10.1.1997 / 17:50:51 / cg"
2921
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1976
!
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1977
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1978
setMode:aModeSymbol
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  1979
    mode := aModeSymbol
15479
7f6fdc8ff911 class: FileStream
Claus Gittinger <cg@exept.de>
parents: 15475
diff changeset
  1980
!
7f6fdc8ff911 class: FileStream
Claus Gittinger <cg@exept.de>
parents: 15475
diff changeset
  1981
7f6fdc8ff911 class: FileStream
Claus Gittinger <cg@exept.de>
parents: 15475
diff changeset
  1982
setPathName:pathNameString removeOnClose:aBoolean
7f6fdc8ff911 class: FileStream
Claus Gittinger <cg@exept.de>
parents: 15475
diff changeset
  1983
    pathName := pathNameString.
7f6fdc8ff911 class: FileStream
Claus Gittinger <cg@exept.de>
parents: 15475
diff changeset
  1984
    removeOnClose := aBoolean.
31
75f2b9f78be2 *** empty log message ***
claus
parents: 13
diff changeset
  1985
! !
75f2b9f78be2 *** empty log message ***
claus
parents: 13
diff changeset
  1986
10395
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  1987
!FileStream methodsFor:'private fileIn'!
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  1988
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  1989
fileInNotifying:notifiedLoader passChunk:passChunk
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  1990
    "central method to file in from the receiver, i.e. read chunks and evaluate them -
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  1991
     return the value of the last chunk.
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  1992
     Someone (which is usually some codeView) is notified of errors."
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  1993
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  1994
    ^ self fileInNotifying:notifiedLoader passChunk:passChunk inDirectory:(self pathName asFilename directory).
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  1995
!
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  1996
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  1997
fileInNotifying:notifiedLoader passChunk:passChunk inDirectory:aDirectory
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  1998
    "central method to file in from the receiver, i.e. read chunks and evaluate them -
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  1999
     return the value of the last chunk.
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  2000
     Someone (which is usually some codeView) is notified of errors.
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  2001
     Add aDirectory to the search path for classes, while performing the fileIn."
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  2002
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  2003
    |oldPath val thisDirectory thisDirectoryPathName|
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  2004
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  2005
    thisDirectory := aDirectory asFilename.
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  2006
    thisDirectoryPathName := thisDirectory pathName.
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  2007
    oldPath := Smalltalk systemPath.
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  2008
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10407
diff changeset
  2009
    [
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10407
diff changeset
  2010
	Smalltalk systemPath:(oldPath copy addFirst:thisDirectoryPathName; yourself).
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10407
diff changeset
  2011
	self class currentFileInDirectoryQuerySignal answer:thisDirectory do:[
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10407
diff changeset
  2012
	    self class currentSourceContainerQuery answer:self do:[
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10407
diff changeset
  2013
		val := self basicFileInNotifying:notifiedLoader passChunk:passChunk.
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10407
diff changeset
  2014
	    ].
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10407
diff changeset
  2015
	]
10395
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  2016
    ] ensure:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10407
diff changeset
  2017
	"take care, someone could have changed SystemPath during fileIn!!"
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10407
diff changeset
  2018
	(Smalltalk systemPath copyFrom:2) = oldPath ifTrue:[
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10407
diff changeset
  2019
	    Smalltalk systemPath:oldPath.
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10407
diff changeset
  2020
	] ifFalse:[
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10407
diff changeset
  2021
	    (oldPath includes:thisDirectoryPathName) ifFalse:[
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10407
diff changeset
  2022
		Smalltalk systemPath remove:thisDirectoryPathName ifAbsent:[].
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10407
diff changeset
  2023
		Smalltalk flushPathCaches.
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10407
diff changeset
  2024
	    ].
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10407
diff changeset
  2025
	].
10395
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  2026
    ].
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  2027
    ^ val
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  2028
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  2029
    "Modified: / 23-10-2006 / 16:35:10 / cg"
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  2030
! !
62fd9eba5c4b Move fileIn methods refering to filenames from PeekableStream
Stefan Vogel <sv@exept.de>
parents: 10354
diff changeset
  2031
2921
f42da059311e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2908
diff changeset
  2032
!FileStream methodsFor:'queries'!
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  2033
17603
d87df1b3568f class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17309
diff changeset
  2034
collectionSize
d87df1b3568f class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17309
diff changeset
  2035
    "common stream protocol: return the size of the stream;
20412
aee4d28b38c5 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 20370
diff changeset
  2036
     that's the number of bytes of the file."
17603
d87df1b3568f class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17309
diff changeset
  2037
d87df1b3568f class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17309
diff changeset
  2038
    ^ self fileSize.
d87df1b3568f class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17309
diff changeset
  2039
!
d87df1b3568f class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17309
diff changeset
  2040
2903
e64704e86cce various VMS changes
Claus Gittinger <cg@exept.de>
parents: 2817
diff changeset
  2041
fileSize
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  2042
    "return the size in bytes of the file"
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  2043
16298
5fd8d5ceab59 Fix error processing
Stefan Vogel <sv@exept.de>
parents: 16113
diff changeset
  2044
    |error|
3971
aad506cdc5d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3956
diff changeset
  2045
%{
4910
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
  2046
    HFILE f;
33b0edbb1920 merged back FileStream_win32 into FileStream
Claus Gittinger <cg@exept.de>
parents: 4907
diff changeset
  2047
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  2048
#ifdef transputer
7874
5e0319ca5e60 stats filesize can be up-to 32bit now.
Claus Gittinger <cg@exept.de>
parents: 7872
diff changeset
  2049
    unsigned int size;
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  2050
12395
1db7ea277c93 filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 12207
diff changeset
  2051
    if (__INST(handle) != nil) {
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2052
	f = __FILEVal(__INST(handle));
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2053
	if ((size = filesize(fileno(f))) >= 0) {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2054
	    RETURN ( __MKUINT(size) );
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2055
	}
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  2056
    }
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  2057
#else
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  2058
    struct stat buf;
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  2059
    int ret;
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  2060
    int fd;
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  2061
12395
1db7ea277c93 filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 12207
diff changeset
  2062
    if (__INST(handle) != nil) {
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2063
	f = __FILEVal(__INST(handle));
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2064
	fd = fileno(f);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2065
	do {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2066
	    ret = fstat(fd, &buf);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2067
	} while ((ret < 0) && (__threadErrno == EINTR));
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2068
	if (ret >= 0) {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2069
	    OBJ rslt;
7883
1039acd0624b Large file support (off_t with 64 bits) for UNIX
Stefan Vogel <sv@exept.de>
parents: 7874
diff changeset
  2070
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2071
	    if (sizeof(buf.st_size) == 8) {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2072
		rslt = __MKINT64(&buf.st_size);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2073
	    } else {
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2074
		rslt = __MKINT(buf.st_size);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2075
	    }
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2076
	    RETURN(rslt);
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2077
	}
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2078
	error = __mkSmallInteger(__threadErrno);
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  2079
    }
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  2080
#endif
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  2081
%}.
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  2082
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  2083
    "could add a fall-back here:
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  2084
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2085
	oldPosition := self position.
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2086
	self setToEnd.
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2087
	sz := self position.
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2088
	self position:oldPosition.
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2089
	^ sz
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  2090
    "
16298
5fd8d5ceab59 Fix error processing
Stefan Vogel <sv@exept.de>
parents: 16113
diff changeset
  2091
    error notNil ifTrue:[
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2092
	lastErrorNumber := error.
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2093
	self ioError:error.
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2094
	^ self.
16298
5fd8d5ceab59 Fix error processing
Stefan Vogel <sv@exept.de>
parents: 16113
diff changeset
  2095
    ].
12395
1db7ea277c93 filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 12207
diff changeset
  2096
    handle isNil ifTrue:[^ self errorNotOpen].
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  2097
    ^ self primitiveFailed
2936
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  2098
!
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  2099
13051
e50451e3a086 added: #isDirectory
Stefan Vogel <sv@exept.de>
parents: 12950
diff changeset
  2100
isDirectory
e50451e3a086 added: #isDirectory
Stefan Vogel <sv@exept.de>
parents: 12950
diff changeset
  2101
    ^ OperatingSystem isDirectory:pathName
e50451e3a086 added: #isDirectory
Stefan Vogel <sv@exept.de>
parents: 12950
diff changeset
  2102
!
e50451e3a086 added: #isDirectory
Stefan Vogel <sv@exept.de>
parents: 12950
diff changeset
  2103
14093
a1b853b10448 added: #isEmpty
Stefan Vogel <sv@exept.de>
parents: 13778
diff changeset
  2104
isEmpty
a1b853b10448 added: #isEmpty
Stefan Vogel <sv@exept.de>
parents: 13778
diff changeset
  2105
    "common stream protocol: are there no bytes in the file?"
a1b853b10448 added: #isEmpty
Stefan Vogel <sv@exept.de>
parents: 13778
diff changeset
  2106
a1b853b10448 added: #isEmpty
Stefan Vogel <sv@exept.de>
parents: 13778
diff changeset
  2107
    ^ self fileSize == 0.
a1b853b10448 added: #isEmpty
Stefan Vogel <sv@exept.de>
parents: 13778
diff changeset
  2108
!
a1b853b10448 added: #isEmpty
Stefan Vogel <sv@exept.de>
parents: 13778
diff changeset
  2109
17603
d87df1b3568f class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17309
diff changeset
  2110
remainingSize
d87df1b3568f class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17309
diff changeset
  2111
    "return the number of remaining elements in the streamed collection."
d87df1b3568f class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17309
diff changeset
  2112
d87df1b3568f class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17309
diff changeset
  2113
    ^ self fileSize - self position.
d87df1b3568f class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17309
diff changeset
  2114
!
d87df1b3568f class: FileStream
Stefan Vogel <sv@exept.de>
parents: 17309
diff changeset
  2115
2936
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  2116
size
11454
b451c165163a comment
Stefan Vogel <sv@exept.de>
parents: 11437
diff changeset
  2117
    "common stream protocol: return the size of the stream;
20412
aee4d28b38c5 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 20370
diff changeset
  2118
     that's the number of bytes of the file."
2998
930360fb3f12 #size is not really obsolete
Claus Gittinger <cg@exept.de>
parents: 2992
diff changeset
  2119
2936
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  2120
    ^ self fileSize.
2998
930360fb3f12 #size is not really obsolete
Claus Gittinger <cg@exept.de>
parents: 2992
diff changeset
  2121
930360fb3f12 #size is not really obsolete
Claus Gittinger <cg@exept.de>
parents: 2992
diff changeset
  2122
    "Modified: 4.10.1997 / 18:01:09 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2123
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2124
5493
4efa5b89498b rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5439
diff changeset
  2125
!FileStream methodsFor:'rel5 protocol'!
4efa5b89498b rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5439
diff changeset
  2126
12395
1db7ea277c93 filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 12207
diff changeset
  2127
positionFile:handle position:newPos
5493
4efa5b89498b rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5439
diff changeset
  2128
    "for migration to rel5 only"
4efa5b89498b rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5439
diff changeset
  2129
4efa5b89498b rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5439
diff changeset
  2130
    self primitiveFailed
4efa5b89498b rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5439
diff changeset
  2131
! !
4efa5b89498b rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5439
diff changeset
  2132
2
claus
parents: 1
diff changeset
  2133
!FileStream methodsFor:'testing'!
claus
parents: 1
diff changeset
  2134
claus
parents: 1
diff changeset
  2135
isFileStream
claus
parents: 1
diff changeset
  2136
    "return true, if the receiver is some kind of fileStream.
claus
parents: 1
diff changeset
  2137
     redefined from Object"
claus
parents: 1
diff changeset
  2138
claus
parents: 1
diff changeset
  2139
    ^ true
claus
parents: 1
diff changeset
  2140
! !
claus
parents: 1
diff changeset
  2141
1088
989f0e510a32 nicer message
Claus Gittinger <cg@exept.de>
parents: 857
diff changeset
  2142
!FileStream class methodsFor:'documentation'!
989f0e510a32 nicer message
Claus Gittinger <cg@exept.de>
parents: 857
diff changeset
  2143
989f0e510a32 nicer message
Claus Gittinger <cg@exept.de>
parents: 857
diff changeset
  2144
version
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2145
    ^ '$Header$'
12207
cb911af5184f comment in: #removeOnClose:
Claus Gittinger <cg@exept.de>
parents: 11813
diff changeset
  2146
!
cb911af5184f comment in: #removeOnClose:
Claus Gittinger <cg@exept.de>
parents: 11813
diff changeset
  2147
cb911af5184f comment in: #removeOnClose:
Claus Gittinger <cg@exept.de>
parents: 11813
diff changeset
  2148
version_CVS
18651
36567dd3b8d1 printf of INTs
Claus Gittinger <cg@exept.de>
parents: 17603
diff changeset
  2149
    ^ '$Header$'
1088
989f0e510a32 nicer message
Claus Gittinger <cg@exept.de>
parents: 857
diff changeset
  2150
! !
6798
cc084e7ecc88 checkin from browser
penk
parents: 6586
diff changeset
  2151
15360
7bf49766c324 class: FileStream
Claus Gittinger <cg@exept.de>
parents: 14853
diff changeset
  2152
2936
5cce0f2166d9 OpenErrorSignal already defined in super (ExternalStream).
Stefan Vogel <sv@exept.de>
parents: 2921
diff changeset
  2153
FileStream initialize!