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