ExternalStream.st
author Claus Gittinger <cg@exept.de>
Mon, 16 Feb 2009 10:46:56 +0100
changeset 11550 eea8c88e8de7
parent 11396 cf8df63632da
child 11648 1d9d6c39b050
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
     2
 COPYRIGHT (c) 1988 by Claus Gittinger
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
     3
	      All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     4
a27a279701f8 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
"
5414
8557e4e71e51 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 5323
diff changeset
    12
"{ Package: 'stx:libbasic' }"
8557e4e71e51 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 5323
diff changeset
    13
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    14
ReadWriteStream subclass:#ExternalStream
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
    15
	instanceVariableNames:'filePointer mode buffered binary eolMode hitEOF didWrite
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
    16
		lastErrorNumber readAhead'
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
    17
	classVariableNames:'Lobby LastErrorNumber InvalidReadSignal InvalidWriteSignal
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
    18
		InvalidModeSignal OpenErrorSignal StreamNotOpenSignal
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
    19
		InvalidOperationSignal DefaultEOLMode ReadMode ReadWriteMode
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
    20
		WriteMode AppendMode CreateReadWriteMode StreamIOErrorSignal
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
    21
		FileOpenTrace'
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
    22
	poolDictionaries:''
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
    23
	category:'Streams-External'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    24
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    25
216
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
    26
!ExternalStream primitiveDefinitions!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    27
%{
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2875
diff changeset
    28
10328
ad731a7584a3 ensure that win32_fwrite is used for stdout and stderr
Claus Gittinger <cg@exept.de>
parents: 9053
diff changeset
    29
#undef fwrite
ad731a7584a3 ensure that win32_fwrite is used for stdout and stderr
Claus Gittinger <cg@exept.de>
parents: 9053
diff changeset
    30
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    31
#include <stdio.h>
437
claus
parents: 436
diff changeset
    32
#define _STDIO_H_INCLUDED_
claus
parents: 436
diff changeset
    33
3956
51f1a9a4d63f changes for egcs (stdio uses __new / utsname)
Claus Gittinger <cg@exept.de>
parents: 3949
diff changeset
    34
2903
e64704e86cce various VMS changes
Claus Gittinger <cg@exept.de>
parents: 2896
diff changeset
    35
#ifndef NO_FCNTL_H
e64704e86cce various VMS changes
Claus Gittinger <cg@exept.de>
parents: 2896
diff changeset
    36
# include <fcntl.h>
e64704e86cce various VMS changes
Claus Gittinger <cg@exept.de>
parents: 2896
diff changeset
    37
# define _FCNTL_H_INCLUDED_
e64704e86cce various VMS changes
Claus Gittinger <cg@exept.de>
parents: 2896
diff changeset
    38
#endif
437
claus
parents: 436
diff changeset
    39
10
claus
parents: 5
diff changeset
    40
#include <errno.h>
437
claus
parents: 436
diff changeset
    41
#define _ERRNO_H_INCLUDED_
42
e33491f6f260 *** empty log message ***
claus
parents: 38
diff changeset
    42
1141
8ea1b43f7034 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1138
diff changeset
    43
#ifdef LINUX
8ea1b43f7034 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1138
diff changeset
    44
  /* use inline string macros */
8ea1b43f7034 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1138
diff changeset
    45
# define __STRINGDEFS__
8ea1b43f7034 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1138
diff changeset
    46
# include <linuxIntern.h>
8ea1b43f7034 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1138
diff changeset
    47
#endif
8ea1b43f7034 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1138
diff changeset
    48
42
e33491f6f260 *** empty log message ***
claus
parents: 38
diff changeset
    49
#ifdef hpux
e33491f6f260 *** empty log message ***
claus
parents: 38
diff changeset
    50
# define fileno(f)      ((f->__fileH << 8) | (f->__fileL))
e33491f6f260 *** empty log message ***
claus
parents: 38
diff changeset
    51
#endif
216
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
    52
933
2eebae059045 oops - when truncating buffered streams, we must flush & seek first (stdio trouble)
Claus Gittinger <cg@exept.de>
parents: 932
diff changeset
    53
#ifndef SEEK_SET
2eebae059045 oops - when truncating buffered streams, we must flush & seek first (stdio trouble)
Claus Gittinger <cg@exept.de>
parents: 932
diff changeset
    54
# define SEEK_SET 0
2eebae059045 oops - when truncating buffered streams, we must flush & seek first (stdio trouble)
Claus Gittinger <cg@exept.de>
parents: 932
diff changeset
    55
#endif
2eebae059045 oops - when truncating buffered streams, we must flush & seek first (stdio trouble)
Claus Gittinger <cg@exept.de>
parents: 932
diff changeset
    56
#ifndef SEEK_CUR
2eebae059045 oops - when truncating buffered streams, we must flush & seek first (stdio trouble)
Claus Gittinger <cg@exept.de>
parents: 932
diff changeset
    57
# define SEEK_CUR 1
2eebae059045 oops - when truncating buffered streams, we must flush & seek first (stdio trouble)
Claus Gittinger <cg@exept.de>
parents: 932
diff changeset
    58
#endif
2eebae059045 oops - when truncating buffered streams, we must flush & seek first (stdio trouble)
Claus Gittinger <cg@exept.de>
parents: 932
diff changeset
    59
#ifndef SEEK_END
2eebae059045 oops - when truncating buffered streams, we must flush & seek first (stdio trouble)
Claus Gittinger <cg@exept.de>
parents: 932
diff changeset
    60
# define SEEK_END 2
2eebae059045 oops - when truncating buffered streams, we must flush & seek first (stdio trouble)
Claus Gittinger <cg@exept.de>
parents: 932
diff changeset
    61
#endif
2eebae059045 oops - when truncating buffered streams, we must flush & seek first (stdio trouble)
Claus Gittinger <cg@exept.de>
parents: 932
diff changeset
    62
8901
824a89d0b5c7 alpha64 vs. POINTER_SIZE cleanup
Claus Gittinger <cg@exept.de>
parents: 8881
diff changeset
    63
#if defined(__VMS__) || defined(__sparc__) || defined(WIN32)
5120
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 5101
diff changeset
    64
# define CLEAR_ERRNO            __threadErrno = 0;
2961
a188727d0619 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2920
diff changeset
    65
#else
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
    66
# define CLEAR_ERRNO            /* nothing */
2961
a188727d0619 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2920
diff changeset
    67
#endif
a188727d0619 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2920
diff changeset
    68
3420
4dc6667afda9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3419
diff changeset
    69
#ifdef LATER
3445
2639c1e3fd0b nextAvail also for externalBytes
Claus Gittinger <cg@exept.de>
parents: 3432
diff changeset
    70
#define __isFilePointer(x)      (__Class(x) == ExternalStream__FilePointer)
2639c1e3fd0b nextAvail also for externalBytes
Claus Gittinger <cg@exept.de>
parents: 3432
diff changeset
    71
#define __CHANGECLASS(o, x)     (__qClass(o) = (x), o)
10459
45c792f3ca07 unix does not know about stx__mkExternalAddress()
Stefan Vogel <sv@exept.de>
parents: 10455
diff changeset
    72
#define __MKFILEPOINTER(f)      __CHANGECLASS(__MKEXTERNALADDRESS(f), ExternalStream__FilePointer)
3420
4dc6667afda9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3419
diff changeset
    73
#else
10459
45c792f3ca07 unix does not know about stx__mkExternalAddress()
Stefan Vogel <sv@exept.de>
parents: 10455
diff changeset
    74
#define __MKFILEPOINTER(f)      __MKEXTERNALADDRESS(f)
3420
4dc6667afda9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3419
diff changeset
    75
#endif
4dc6667afda9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3419
diff changeset
    76
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
    77
#ifdef WIN32
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
    78
# define NO_STDIO
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
    79
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
    80
# undef __HANDLE_INTERRUPTS__
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
    81
# define __HANDLE_INTERRUPTS__    /* nothing */
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
    82
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
    83
# undef __BEGIN_INTERRUPTABLE__
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
    84
# define __BEGIN_INTERRUPTABLE__  /* nothing */
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
    85
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
    86
# undef __END_INTERRUPTABLE__
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
    87
# define __END_INTERRUPTABLE__    /* nothing */
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
    88
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
    89
#endif
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
    90
8901
824a89d0b5c7 alpha64 vs. POINTER_SIZE cleanup
Claus Gittinger <cg@exept.de>
parents: 8881
diff changeset
    91
# ifdef __i386__
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
    92
#  define _X86_
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
    93
# endif
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
    94
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
    95
#ifdef WIN32
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
    96
# undef INT
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
    97
# undef Array
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
    98
# undef Number
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
    99
# undef Method
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   100
# undef Point
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   101
# undef Rectangle
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   102
# undef Block
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   103
# undef Time
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   104
# undef Date
7832
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
   105
# undef Delay
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   106
# undef Set
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   107
# undef Signal
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   108
# undef Context
9023
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
   109
# undef Message
9024
8066b17d9ccf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9023
diff changeset
   110
# undef Process
10339
972d0164125a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10328
diff changeset
   111
# undef Processor
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   112
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   113
# define NOATOM
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   114
# define NOGDICAPMASKS
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   115
# define NOMETAFILE
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   116
# define NOMINMAX
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   117
//#d efine NOOPENFILE
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   118
# define NOSOUND
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   119
# define NOWH
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   120
//# define NOCOMM
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   121
# define NOKANJI
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   122
# define NOCRYPT
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   123
//# define NOMCX
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   124
# define WIN32_LEAN_AND_MEAN
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   125
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   126
# include <windows.h>
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   127
# include <winsock.h> /* */
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   128
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   129
# ifdef __DEF_Array
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   130
#  define Array __DEF_Array
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   131
# endif
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   132
# ifdef __DEF_Number
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   133
#  define Number __DEF_Number
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   134
# endif
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   135
# ifdef __DEF_Method
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   136
#  define Method __DEF_Method
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   137
# endif
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   138
# ifdef __DEF_Point
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   139
#  define Point __DEF_Point
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   140
# endif
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   141
# ifdef __DEF_Block
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   142
#  define Block __DEF_Block
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   143
# endif
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   144
# ifdef __DEF_Time
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   145
#  define Time __DEF_Time
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   146
# endif
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   147
# ifdef __DEF_Date
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   148
#  define Date __DEF_Date
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   149
# endif
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   150
# ifdef __DEF_Set
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   151
#  define Set __DEF_Set
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   152
# endif
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   153
# ifdef __DEF_Signal
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   154
#  define Signal __DEF_Signal
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   155
# endif
7832
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
   156
# ifdef __DEF_Delay
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
   157
#  define Delay __DEF_Delay
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
   158
# endif
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   159
# ifdef __DEF_Context
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   160
#  define Context __DEF_Context
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   161
# endif
9023
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
   162
# ifdef __DEF_Message
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
   163
#  define Message __DEF_Message
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
   164
# endif
9024
8066b17d9ccf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9023
diff changeset
   165
# ifdef __DEF_Process
8066b17d9ccf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9023
diff changeset
   166
#  define Process __DEF_Process
8066b17d9ccf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9023
diff changeset
   167
# endif
10339
972d0164125a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10328
diff changeset
   168
# ifdef __DEF_Processor
972d0164125a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10328
diff changeset
   169
#  define Processor __DEF_Processor
972d0164125a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10328
diff changeset
   170
# endif
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   171
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   172
# define INT    int
10339
972d0164125a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10328
diff changeset
   173
# define UINT   uint
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   174
# define off_t  long
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   175
#endif /* WIN32 */
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   176
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   177
#ifndef NO_STDIO /* use STDIO */
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   178
# define STDIO_NEEDS_FSEEK
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   179
# define FILEPOINTER            FILE *
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   180
# define READ(f, cp, n)         read(f, cp, n)
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   181
# define WRITE(f, cp, n)        write(f, cp, n)
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   182
# define FFLUSH(fp)             fflush(fp)
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   183
# define FILENO(f)              fileno(f)
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   184
#endif /* use STDIO */
3681
55dc17d40aab fixed nextAvail
Claus Gittinger <cg@exept.de>
parents: 3674
diff changeset
   185
3682
Claus Gittinger <cg@exept.de>
parents: 3681
diff changeset
   186
#ifdef DEBUGGING
4092
fee552eb3418 removed win32 stuff
Claus Gittinger <cg@exept.de>
parents: 3980
diff changeset
   187
  extern char *__survStartPtr, *__survEndPtr;
3682
Claus Gittinger <cg@exept.de>
parents: 3681
diff changeset
   188
# define DEBUGBUFFER(buf)  \
3681
55dc17d40aab fixed nextAvail
Claus Gittinger <cg@exept.de>
parents: 3674
diff changeset
   189
    if (((char *)(buf) >= __survStartPtr) \
55dc17d40aab fixed nextAvail
Claus Gittinger <cg@exept.de>
parents: 3674
diff changeset
   190
     && ((char *)(buf) < __survEndPtr)) { \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   191
	__fatal0("read into survivor\n"); \
3681
55dc17d40aab fixed nextAvail
Claus Gittinger <cg@exept.de>
parents: 3674
diff changeset
   192
    }
55dc17d40aab fixed nextAvail
Claus Gittinger <cg@exept.de>
parents: 3674
diff changeset
   193
3682
Claus Gittinger <cg@exept.de>
parents: 3681
diff changeset
   194
#else
Claus Gittinger <cg@exept.de>
parents: 3681
diff changeset
   195
# define DEBUGBUFFER(buf) /* nothing */
Claus Gittinger <cg@exept.de>
parents: 3681
diff changeset
   196
#endif
Claus Gittinger <cg@exept.de>
parents: 3681
diff changeset
   197
216
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
   198
/*
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
   199
 * stdio library requires an fseek before reading whenever a file
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
   200
 * is open for read/write and the last operation was a write.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
   201
 * (also vice-versa).
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
   202
 * All code should use the following macro before doing reads:
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
   203
 */
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
   204
#ifdef STDIO_NEEDS_FSEEK
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
   205
# define OPT_FSEEK(f, pos, whence)      fseek(f, pos, whence)
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
   206
#else
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
   207
# define OPT_FSEEK(f, pos, whence)      /* nothing */
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
   208
#endif
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
   209
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   210
#ifdef WIN32
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   211
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   212
# ifdef __BORLANDC__
10469
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   213
   int _rtl_read();
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   214
   int _rtl_write();
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   215
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   216
#  define READ(ret,f, cp, n) \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   217
      { int __res;\
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   218
	HANDLE h; \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   219
	h = _get_osfhandle(fileno(f)); \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   220
	if (ioctlsocket((SOCKET)h,FIONREAD,&__res)==0) \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   221
	  (ret) = __STX_WSA_NOINT_CALL4("recv", recv, h, (cp), (n), 0);\
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   222
	else \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   223
	  (ret) = __STX_C_NOINT_CALL3("_rtl_read", _rtl_read, fileno(f), (cp), (n));\
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   224
      }
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   225
#  define WRITE(ret,f, cp, n) \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   226
      { int __res;\
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   227
	HANDLE h; \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   228
	h = _get_osfhandle(fileno(f)); \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   229
	if (ioctlsocket((SOCKET)h,FIONREAD,&__res)==0) \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   230
	  (ret) = __STX_WSA_NOINT_CALL4("send", send, h, (cp), (n), 0);\
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   231
	else \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   232
	  (ret) = __STX_C_NOINT_CALL3("_rtl_write", _rtl_write, fileno(f), (cp), (n));\
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   233
      }
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   234
# else /* MSC */
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   235
#  define READ(ret,f, cp, n) \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   236
      { int __res;\
10469
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   237
	int fd; \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   238
	HANDLE h; \
10469
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   239
	fd = fileno(f); \
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   240
	if (ioctlsocket((SOCKET)fd,FIONREAD,&__res)==0) \
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   241
	  (ret) = __STX_WSA_NOINT_CALL4("recv", recv, fd, (cp), (n), 0);\
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   242
	else { \
10469
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   243
	  h = _get_osfhandle(fd); \
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   244
	  if (ioctlsocket((SOCKET)h,FIONREAD,&__res)==0) \
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   245
	    (ret) = __STX_WSA_NOINT_CALL4("recv", recv, h, (cp), (n), 0);\
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   246
	  else { \
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   247
	    (ret) = __STX_API_NOINT_CALL5("ReadFile", ReadFile, h, (cp), (n), &__res, 0);\
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   248
	    if (ret) \
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   249
	      ret = __res; \
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   250
	  } \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   251
	} \
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   252
      }
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   253
#  define WRITE(ret,f, cp, n) \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   254
      { int __res;\
10469
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   255
	int fd; \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   256
	HANDLE h; \
10469
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   257
	fd = fileno(f); \
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   258
	if (ioctlsocket((SOCKET)fd,FIONREAD,&__res)==0) \
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   259
	  (ret) = __STX_WSA_NOINT_CALL4("send", send, fd, (cp), (n), 0);\
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   260
	else {\
10469
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   261
	  h = _get_osfhandle(fd); \
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   262
	  if (ioctlsocket((SOCKET)h,FIONREAD,&__res)==0) \
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   263
	    (ret) = __STX_WSA_NOINT_CALL4("send", send, h, (cp), (n), 0);\
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   264
	  else {\
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   265
	    (ret) = __STX_API_NOINT_CALL5("WriteFile", WriteFile, h, (cp), (n), &__res, 0);\
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   266
	    if (ret) \
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   267
	      ret = __res; \
0411b84d6a6a msvc filehandle
Claus Gittinger <cg@exept.de>
parents: 10459
diff changeset
   268
	  } \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   269
	} \
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   270
      }
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   271
# endif /* MSC */
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   272
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   273
# define FFLUSH(fp)             fflush(fp)
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   274
# undef STDIO_NEEDS_FSEEK
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   275
# define FILEPOINTER            FILE *
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   276
# define FILENO(f)              fileno(f)
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   277
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   278
# define __READING__(f)                          \
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
   279
    if ((__INST(didWrite) != false)              \
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
   280
     && (__INST(mode) == @symbol(readwrite))) {  \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   281
	__INST(didWrite) = false;                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   282
	OPT_FSEEK(f, 0L, SEEK_CUR); /* needed in stdio */  \
216
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
   283
    }
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
   284
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   285
# define __WRITING__(f)                          \
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
   286
    if ((__INST(didWrite) != true)               \
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
   287
     && (__INST(mode) == @symbol(readwrite))) {  \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   288
	__INST(didWrite) = true;                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   289
	OPT_FSEEK(f, 0L, SEEK_CUR); /* needed in stdio */  \
216
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
   290
    }
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
   291
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   292
# define __UNGETC__(c, f, isBuffered)                   \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   293
    if (isBuffered) {                                   \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   294
	ungetc((c), (f));                               \
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   295
    } else {                                            \
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
   296
      __INST(readAhead) = __mkSmallInteger((c));            \
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   297
    }
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   298
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   299
# define __READBYTE__(ret, f, buf, isBuffered)          \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   300
    if (isBuffered) {                                   \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   301
	for (;;) {                                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   302
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   303
	    (ret) = getc(f);                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   304
	    if ((ret) >= 0) {                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   305
		*(buf) = (ret);                         \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   306
		(ret) = 1;                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   307
	    } else if (ferror(f)) {                     \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   308
		if (__threadErrno == EINTR) {           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   309
		    clearerr(f);                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   310
		    continue;                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   311
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   312
	    } else {                                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   313
		(ret) = 0;                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   314
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   315
	    break;                                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   316
	}                                               \
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   317
    } else {                                            \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   318
	OBJ rA = __INST(readAhead);                     \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   319
	if (rA != nil) {                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   320
	    *(buf) = (char)__intVal(rA);                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   321
	    __INST(readAhead) = nil;                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   322
	    (ret) = 1;                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   323
	} else {                                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   324
	    for (;;) {                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   325
		CLEAR_ERRNO;                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   326
		READ(ret,f, buf, 1);                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   327
		if ((ret) >= 0 || __threadErrno != EINTR)       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   328
		    break;                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   329
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   330
	}                                               \
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   331
    }
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   332
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   333
  /*
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   334
   * read_bytes into a c-buffer
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   335
   * (which may NOT move)
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   336
   */
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   337
# define __READBYTES__(ret, f, buf, cnt, isBuffered)    \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   338
    (ret) = 0;                                          \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   339
    if (isBuffered) {                                   \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   340
	int __offs = 0;                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   341
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   342
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   343
	    (ret) = getc(f);                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   344
	    if ((ret) < 0) {                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   345
		if (ferror(f)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   346
		    if (__threadErrno == EINTR) {               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   347
			clearerr(f);                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   348
			continue;                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   349
		    }                                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   350
		} else {                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   351
		    (ret) = 0;                          \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   352
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   353
		break;                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   354
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   355
	    (buf)[__offs++] = (ret);                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   356
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   357
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   358
	    (ret) = __offs;                             \
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   359
    } else {                                            \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   360
	int __offs = 0;                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   361
							\
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   362
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   363
	    OBJ rA = __INST(readAhead);                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   364
	    if (rA != nil) {                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   365
		(buf)[__offs] = __intVal(rA);           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   366
		__INST(readAhead) = nil;                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   367
		(ret) = 1;                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   368
	    } else {                                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   369
		CLEAR_ERRNO;                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   370
		READ(ret,f, (buf)+__offs, (cnt)-__offs); \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   371
		if ((ret) <= 0) {                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   372
		    if ((ret) < 0 && __threadErrno == EINTR) {  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   373
			continue;                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   374
		    }                                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   375
		    break;                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   376
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   377
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   378
	    __offs += (ret);                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   379
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   380
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   381
	    (ret) = __offs;                             \
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   382
   }
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   383
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   384
# define __READAVAILBYTES__(ret, f, buf, cnt, isBuffered) \
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   385
  {                                                     \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   386
    int __offs = 0;                                     \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   387
    int oldFlags;                                       \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   388
							\
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   389
    (ret) = 0;                                          \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   390
    if (isBuffered) {                                   \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   391
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   392
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   393
	    (ret) = getc(f);                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   394
	    if ((ret) < 0) {                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   395
		if (ferror(f)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   396
		    if (__threadErrno == EINTR) {               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   397
			clearerr(f);                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   398
			continue;                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   399
		    }                                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   400
		} else {                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   401
		    (ret) = 0;                          \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   402
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   403
		break;                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   404
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   405
	    (buf)[__offs++] = (ret);                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   406
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   407
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   408
	    (ret) = __offs;                             \
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   409
    } else {                                            \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   410
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   411
	    OBJ rA = __INST(readAhead);                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   412
	    if (rA != nil) {                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   413
		(buf)[__offs] = __intVal(rA);           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   414
		__INST(readAhead) = nil;                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   415
		(ret) = 1;                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   416
		__offs += (ret);                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   417
		continue;                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   418
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   419
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   420
	    {                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   421
	      int res;                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   422
	      if (ioctlsocket((SOCKET)_get_osfhandle(fileno(f)),FIONREAD,&res)==0) { \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   423
		  if (res > 0) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   424
		      if (res > ((cnt)-__offs))         \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   425
			res = (cnt)-__offs;             \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   426
		      READ(ret,f, (buf)+__offs, res);   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   427
		  } else {                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   428
		      (ret) = 0;                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   429
		  }                                     \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   430
	      } else if (PeekNamedPipe((HANDLE)_get_osfhandle(fileno(f)),0, 0,0,&res,0)) { \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   431
		  if (res > 0) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   432
		      if (res > ((cnt)-__offs))         \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   433
			res = (cnt)-__offs;             \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   434
		      READ(ret,f, (buf)+__offs, res);   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   435
		  } else                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   436
		      ret = 0;                          \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   437
	      } else {                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   438
		  READ(ret,f, (buf)+__offs, (cnt)-__offs); \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   439
	      }                                         \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   440
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   441
	    if ((ret) < 0) {                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   442
		if (__threadErrno == EINTR) {                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   443
		    continue;                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   444
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   445
		break;                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   446
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   447
	    __offs += (ret);                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   448
	    break;                                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   449
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   450
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   451
	    (ret) = __offs;                             \
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   452
    }                                                   \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   453
  }
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   454
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   455
# define IO_BUFFER_SIZE        (8*1024)
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   456
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   457
# define __READBYTES_OBJ__(ret, f, obj, obj_offs, cnt, isBuffered) \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   458
  {                                                     \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   459
    int __ooffs = obj_offs;                             \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   460
    int __offs = 0;                                     \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   461
    char *buf = (char *)(obj);                          \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   462
							\
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   463
    (ret) = 0;                                          \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   464
    if (isBuffered) {                                   \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   465
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   466
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   467
	    (ret) = getc(f);                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   468
	    if ((ret) < 0) {                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   469
		if (ferror(f)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   470
		    if (__threadErrno == EINTR) {               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   471
			clearerr(f);                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   472
			/* refetch */                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   473
			buf = (char *)(obj);            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   474
			continue;                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   475
		    }                                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   476
		} else {                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   477
		    (ret) = 0;                          \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   478
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   479
		break;                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   480
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   481
	    (buf)[__ooffs+__offs] = (ret);              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   482
	    __offs++;                                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   483
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   484
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   485
	    (ret) = __offs;                             \
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   486
    } else {                                            \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   487
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   488
	    char __buf[IO_BUFFER_SIZE];                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   489
	    OBJ rA = __INST(readAhead);                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   490
	    if (rA != nil) {                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   491
		(buf)[__ooffs+__offs] = __intVal(rA);   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   492
		__INST(readAhead) = nil;                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   493
		(ret) = 1;                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   494
	    } else {                                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   495
		int l;                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   496
		CLEAR_ERRNO;                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   497
		l = (cnt)-__offs;                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   498
		if ( l > IO_BUFFER_SIZE)                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   499
		  l = IO_BUFFER_SIZE;                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   500
		READ(ret,f, __buf, l);                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   501
		if ((ret) <= 0) {                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   502
		    if ((ret) < 0 && __threadErrno == EINTR) {  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   503
			continue;                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   504
		    }                                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   505
		    break;                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   506
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   507
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   508
	    if( (ret) > 0 ) {                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   509
		/* refetch */                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   510
		buf = (volatile char *)(obj);               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   511
		memcpy((buf)+__ooffs+__offs,__buf,(ret));   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   512
		__offs += (ret);                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   513
	    } else {                                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   514
		(ret) = 0;                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   515
	    }                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   516
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   517
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   518
	    (ret) = __offs;                             \
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   519
    }                                                   \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   520
  }
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   521
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   522
# define __READAVAILBYTES_OBJ__(ret, f, obj, obj_offs, cnt, isBuffered)\
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   523
  {                                                  \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   524
    int __ooffs = obj_offs;                          \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   525
    int __offs = 0;                                  \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   526
    char *buf = (char *)(obj);                       \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   527
						     \
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   528
    (ret) = 0;                                       \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   529
    if (isBuffered) {                                \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   530
	while (__offs < (cnt)) {                     \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   531
	    CLEAR_ERRNO;                             \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   532
	    (ret) = getc(f);                         \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   533
	    if ((ret) < 0) {                         \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   534
		if (ferror(f)) {                     \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   535
		    if (__threadErrno == EINTR) {            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   536
			clearerr(f);                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   537
			/* refetch */                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   538
			buf = (char *)(obj);         \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   539
			continue;                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   540
		    }                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   541
		} else {                             \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   542
		    (ret) = 0;                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   543
		}                                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   544
		break;                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   545
	    }                                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   546
	    (buf)[__ooffs+__offs] = (ret);           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   547
	    __offs++;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   548
	}                                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   549
	if (__offs > 0)                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   550
	    (ret) = __offs;                          \
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   551
    } else {                                         \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   552
	while (__offs < (cnt)) {                     \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   553
	    char __buf[IO_BUFFER_SIZE];              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   554
	    OBJ rA = __INST(readAhead);              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   555
	    if (rA != nil) {                         \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   556
		(buf)[__ooffs+__offs] = __intVal(rA);\
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   557
		__INST(readAhead) = nil;             \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   558
		(ret) = 1;                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   559
		__offs += (ret);                     \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   560
		continue;                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   561
	    }                                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   562
	    {                                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   563
		int l;                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   564
		int res;                             \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   565
		CLEAR_ERRNO;                         \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   566
		l = (cnt)-__offs;                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   567
		if ( l > IO_BUFFER_SIZE)             \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   568
		    l = IO_BUFFER_SIZE;              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   569
		if (ioctlsocket((SOCKET)_get_osfhandle(fileno(f)),FIONREAD,&res)==0) { \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   570
		if (res > 0) {                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   571
			if (res > l)                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   572
			    res = l;                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   573
			READ(ret,f, __buf, res);     \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   574
		    } else {                         \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   575
			(ret) = 0;                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   576
		    }                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   577
		} else if (PeekNamedPipe((HANDLE)_get_osfhandle(fileno(f)),0, 0,0,&res,0)) { \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   578
		    if (res > 0) {                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   579
			if (res > l)                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   580
			    res = l;                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   581
			READ(ret,f, __buf, res);     \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   582
		    } else                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   583
			(ret) = 0;                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   584
		} else {                             \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   585
		    READ(ret,f, __buf, l);           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   586
		}                                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   587
		if ((ret) < 0 && __threadErrno == EINTR) {   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   588
		    continue;                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   589
		}                                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   590
	    }                                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   591
	    if( (ret) > 0 ) {                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   592
		/* refetch */                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   593
		buf = (volatile char *)(obj);               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   594
		memcpy((buf)+__ooffs+__offs,__buf,(ret));   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   595
		__offs += (ret);                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   596
	    } else {                                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   597
		(ret) = 0;                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   598
	    }                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   599
	    break;                                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   600
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   601
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   602
	    (ret) = __offs;                             \
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   603
    }                                                   \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   604
  }
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   605
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   606
# define __WRITEBYTE__(ret, f, buf, isBuffered)         \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   607
    if (isBuffered) {                                   \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   608
	for (;;) {                                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   609
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   610
	    ret = putc(*(buf), f);                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   611
	    if ((ret) >= 0) {                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   612
		(ret) = 1;                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   613
	    } else if (ferror(f)) {                     \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   614
		if (__threadErrno == EINTR) {                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   615
		    clearerr(f);                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   616
		    continue;                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   617
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   618
	    } else                                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   619
		(ret) = 0;                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   620
	    break;                                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   621
	}                                               \
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   622
    } else {                                            \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   623
	for (;;) {                                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   624
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   625
	    WRITE(ret,f, buf, 1);                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   626
	    if ((ret) >= 0 || __threadErrno != EINTR)           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   627
		break;                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   628
	}                                               \
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   629
   }
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   630
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   631
# define __WRITEBYTES__(ret, f, buf, cnt, isBuffered)   \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   632
    (ret) = 0;                                          \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   633
    if (isBuffered) {                                   \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   634
	int __offs = 0;                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   635
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   636
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   637
	    ret = fwrite((buf)+__offs, 1, (cnt)-__offs, f);\
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   638
	    if ((ret) <= 0) {                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   639
		if (ferror(f)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   640
		    if (__threadErrno == EINTR) {               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   641
			clearerr(f);                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   642
			continue;                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   643
		    }                                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   644
		    break;                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   645
		} else {                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   646
		    (ret) = 0;                          \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   647
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   648
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   649
	    __offs += (ret);                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   650
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   651
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   652
	    (ret) = __offs;                             \
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   653
    } else {                                            \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   654
	int __offs = 0;                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   655
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   656
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   657
	    WRITE(ret,f, (buf)+__offs, (cnt)-__offs);   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   658
	    if (ret <= 0) {                             \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   659
		if (ret < 0 && __threadErrno == EINTR) {        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   660
		    continue;                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   661
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   662
		break;                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   663
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   664
	    __offs += (ret);                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   665
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   666
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   667
	    (ret) = __offs;                             \
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   668
   }
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   669
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   670
# define __WRITEBYTES_OBJ__(ret, f, obj, obj_offs, cnt, isBuffered) \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   671
  {                                                     \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   672
    int __ooffs = obj_offs;                             \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   673
    int __offs = 0;                                     \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   674
    char *buf = (char *)(obj);                          \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   675
							\
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   676
    (ret) = 0;                                          \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   677
    if (isBuffered) {                                   \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   678
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   679
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   680
	    ret = fwrite((buf)+__ooffs+__offs, 1, (cnt)-__offs, f); \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   681
	    if ((ret) <= 0) {                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   682
		if (ferror(f)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   683
		    if (__threadErrno == EINTR) {               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   684
			/* refetch */                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   685
			buf = (char *)(obj);            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   686
			clearerr(f);                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   687
			continue;                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   688
		    }                                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   689
		    break;                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   690
		} else {                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   691
		    (ret) = 0;                          \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   692
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   693
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   694
	    __offs += (ret);                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   695
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   696
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   697
	    (ret) = __offs;                             \
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   698
    } else {                                            \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   699
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   700
	    char __buf[IO_BUFFER_SIZE];                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   701
	    int l;                                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   702
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   703
	    l = (cnt)-__offs;                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   704
	    if ( l > IO_BUFFER_SIZE)                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   705
	      l = IO_BUFFER_SIZE;                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   706
	    /* refetch */                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   707
	    buf = (volatile char *)(obj);               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   708
	    memcpy(__buf,(buf)+__ooffs+__offs,l);       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   709
	    WRITE(ret,f, __buf, l);                     \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   710
	    if (ret <= 0) {                             \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   711
		if (ret < 0 && __threadErrno == EINTR) {        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   712
		    continue;                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   713
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   714
		break;                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   715
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   716
	    __offs += (ret);                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   717
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   718
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   719
	    (ret) = __offs;                             \
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   720
    }                                                   \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   721
  }
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   722
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   723
#else /* no WIN32 */
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   724
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   725
# define __READING__(f)                          \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   726
    if ((__INST(didWrite) != false)              \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   727
     && (__INST(mode) == @symbol(readwrite))) {  \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   728
	__INST(didWrite) = false;                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   729
	OPT_FSEEK(f, 0L, SEEK_CUR); /* needed in stdio */  \
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   730
    }
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   731
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   732
# define __WRITING__(f)                          \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   733
    if ((__INST(didWrite) != true)               \
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   734
     && (__INST(mode) == @symbol(readwrite))) {  \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   735
	__INST(didWrite) = true;                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   736
	OPT_FSEEK(f, 0L, SEEK_CUR); /* needed in stdio */  \
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   737
    }
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   738
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   739
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   740
# ifdef NO_STDIO
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   741
#  define __UNGETC__(c, f, isBuffered)                  \
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
   742
    __INST(readAhead) = __mkSmallInteger((c));
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   743
# else /* use STDIO */
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   744
#  define __UNGETC__(c, f, isBuffered)                  \
2264
ac5dfc03aa26 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2262
diff changeset
   745
    if (isBuffered) {                                   \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   746
	ungetc((c), (f));                               \
2264
ac5dfc03aa26 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2262
diff changeset
   747
    } else {                                            \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   748
	__INST(readAhead) = __mkSmallInteger((c));          \
2120
71c1870df7ba implemented 1-character readAhead for unbuffered streams;
Claus Gittinger <cg@exept.de>
parents: 2045
diff changeset
   749
    }
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   750
# endif /* use STDIO */
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   751
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   752
# ifdef NO_STDIO
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   753
#  define __READBYTE__(ret, f, buf, isBuffered)         \
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
   754
    {                                                   \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   755
	OBJ rA = __INST(readAhead);                     \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   756
	if (rA != nil) {                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   757
	    *(buf) = __intVal(rA);                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   758
	    DEBUGBUFFER(buf);                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   759
	    __INST(readAhead) = nil;                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   760
	    (ret) = 1;                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   761
	} else {                                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   762
	    for (;;) {                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   763
		CLEAR_ERRNO;                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   764
		(ret) = READ(f, buf, 1);                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   765
		DEBUGBUFFER(buf);                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   766
		if ((ret) >= 0 || __threadErrno != EINTR)       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   767
		    break;                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   768
		__HANDLE_INTERRUPTS__;                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   769
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   770
	}                                               \
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
   771
    }
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   772
# else /* use STDIO */
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   773
#  define __READBYTE__(ret, f, buf, isBuffered)         \
2264
ac5dfc03aa26 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2262
diff changeset
   774
    if (isBuffered) {                                   \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   775
	for (;;) {                                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   776
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   777
	    (ret) = getc(f);                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   778
	    if ((ret) >= 0) {                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   779
		DEBUGBUFFER(buf);                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   780
		*(buf) = (ret);                         \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   781
		(ret) = 1;                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   782
	    } else if (ferror(f)) {                     \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   783
		if (__threadErrno == EINTR) {                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   784
		    __HANDLE_INTERRUPTS__;              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   785
		    clearerr(f);                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   786
		    continue;                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   787
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   788
	    } else                                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   789
		(ret) = 0;                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   790
	    break;                                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   791
	}                                               \
2264
ac5dfc03aa26 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2262
diff changeset
   792
    } else {                                            \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   793
	OBJ rA = __INST(readAhead);                     \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   794
	if (rA != nil) {                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   795
	    *(buf) = __intVal(rA);                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   796
	    DEBUGBUFFER(buf);                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   797
	    __INST(readAhead) = nil;                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   798
	    (ret) = 1;                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   799
	} else {                                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   800
	    for (;;) {                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   801
		CLEAR_ERRNO;                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   802
		(ret) = read(fileno(f), buf, 1);        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   803
		DEBUGBUFFER(buf);                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   804
		if ((ret) >= 0 || __threadErrno != EINTR)       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   805
		    break;                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   806
		__HANDLE_INTERRUPTS__;                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   807
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   808
	}                                               \
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   809
   }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   810
# endif /* use STDIO */
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
   811
2513
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
   812
/*
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
   813
 * read_bytes into a c-buffer
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
   814
 * (which may NOT move)
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
   815
 */
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   816
# ifdef NO_STDIO
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   817
#  define __READBYTES__(ret, f, buf, cnt, isBuffered)   \
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
   818
    {                                                   \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   819
	int __offs = 0, __cnt;                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   820
							\
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   821
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   822
	    OBJ rA = __INST(readAhead);                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   823
	    if (rA != nil) {                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   824
		(buf)[__offs] = __intVal(rA);           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   825
		DEBUGBUFFER(buf);                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   826
		__INST(readAhead) = nil;                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   827
		__offs++;                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   828
	    } else {                                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   829
		CLEAR_ERRNO;                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   830
		__cnt = READ(f, (buf)+__offs, (cnt)-__offs); \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   831
		DEBUGBUFFER(buf);                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   832
		if (__cnt <= 0) {                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   833
		    if (__cnt < 0 && __threadErrno == EINTR) {  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   834
			__HANDLE_INTERRUPTS__;          \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   835
			continue;                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   836
		    }                                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   837
		    break;                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   838
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   839
		__offs += __cnt;                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   840
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   841
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   842
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   843
	    (ret) = __offs;                             \
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
   844
   }
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   845
# else /* use STDIO */
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   846
#  define __READBYTES__(ret, f, buf, cnt, isBuffered)     \
2120
71c1870df7ba implemented 1-character readAhead for unbuffered streams;
Claus Gittinger <cg@exept.de>
parents: 2045
diff changeset
   847
    (ret) = 0;                                          \
71c1870df7ba implemented 1-character readAhead for unbuffered streams;
Claus Gittinger <cg@exept.de>
parents: 2045
diff changeset
   848
    if (isBuffered) {                                   \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   849
	int __offs = 0;                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   850
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   851
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   852
	    (ret) = getc(f);                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   853
	    if ((ret) < 0) {                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   854
		if (ferror(f)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   855
		    if (__threadErrno == EINTR) {               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   856
			__HANDLE_INTERRUPTS__;          \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   857
			clearerr(f);                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   858
			continue;                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   859
		    }                                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   860
		} else {                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   861
		    (ret) = 0;                          \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   862
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   863
		break;                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   864
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   865
	    DEBUGBUFFER(buf);                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   866
	    (buf)[__offs++] = (ret);                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   867
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   868
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   869
	    (ret) = __offs;                             \
2120
71c1870df7ba implemented 1-character readAhead for unbuffered streams;
Claus Gittinger <cg@exept.de>
parents: 2045
diff changeset
   870
    } else {                                            \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   871
	int __offs = 0, __cnt;                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   872
	int fd = fileno(f);                             \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   873
							\
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   874
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   875
	    OBJ rA = __INST(readAhead);                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   876
	    if (rA != nil) {                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   877
		DEBUGBUFFER(buf);                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   878
		(buf)[__offs] = __intVal(rA);           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   879
		__INST(readAhead) = nil;                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   880
		__offs++;                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   881
	    } else {                                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   882
		CLEAR_ERRNO;                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   883
		__cnt = read(fd, (buf)+__offs, (cnt)-__offs);                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   884
		DEBUGBUFFER(buf);                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   885
		if (__cnt <= 0) {                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   886
		    if (__cnt < 0 && __threadErrno == EINTR) {  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   887
			__HANDLE_INTERRUPTS__;          \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   888
			continue;                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   889
		    }                                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   890
		    break;                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   891
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   892
		__offs += __cnt;                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   893
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   894
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   895
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   896
	    (ret) = __offs;                             \
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
   897
   }
3445
2639c1e3fd0b nextAvail also for externalBytes
Claus Gittinger <cg@exept.de>
parents: 3432
diff changeset
   898
6563
f786651428c8 Support O_NONBLOCK which is the POSIX way of FNDELAY
Stefan Vogel <sv@exept.de>
parents: 6487
diff changeset
   899
f786651428c8 Support O_NONBLOCK which is the POSIX way of FNDELAY
Stefan Vogel <sv@exept.de>
parents: 6487
diff changeset
   900
/*
f786651428c8 Support O_NONBLOCK which is the POSIX way of FNDELAY
Stefan Vogel <sv@exept.de>
parents: 6487
diff changeset
   901
 * FNDELAY and O_NDELAY is deprecated, O_NONBLOCK is used in POSIX, XPG, etc...
f786651428c8 Support O_NONBLOCK which is the POSIX way of FNDELAY
Stefan Vogel <sv@exept.de>
parents: 6487
diff changeset
   902
 */
f786651428c8 Support O_NONBLOCK which is the POSIX way of FNDELAY
Stefan Vogel <sv@exept.de>
parents: 6487
diff changeset
   903
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   904
#  if defined(F_GETFL) && defined(F_SETFL) && (defined(O_NONBLOCK) || defined(O_NDELAY) || defined(FNDELAY))
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   905
#   define GETFLAGS(fd) \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   906
	fcntl(fd, F_GETFL, 0);
3554
320cbfef9382 made nextAvail really unblocking
Claus Gittinger <cg@exept.de>
parents: 3551
diff changeset
   907
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   908
#   define SETFLAGS(fd, flags) \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   909
	fcntl(fd, F_SETFL, flags)
6563
f786651428c8 Support O_NONBLOCK which is the POSIX way of FNDELAY
Stefan Vogel <sv@exept.de>
parents: 6487
diff changeset
   910
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   911
#   if defined(O_NONBLOCK)
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   912
#    define __STX_NONBLOCK_FLAG O_NONBLOCK
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   913
#   else
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   914
#    if defined(O_NDELAY)
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   915
#     define __STX_NONBLOCK_FLAG O_NDELAY
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   916
#    else
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   917
#     define __STX_NONBLOCK_FLAG FNDELAY
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   918
#    endif
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   919
#   endif
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   920
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   921
#   define SETNONBLOCKING(fd) \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   922
	{ \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   923
	    int flags; \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   924
	    flags = fcntl(fd, F_GETFL, 0); \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   925
	    if (flags >= 0) { \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   926
		fcntl(fd, F_SETFL, flags | __STX_NONBLOCK_FLAG); \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   927
	    } \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   928
	}
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   929
#  else
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   930
#   define GETFLAGS(fd) 0
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   931
#   define SETFLAGS(fd, flags) /* nothing */
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   932
#   define SETNONBLOCKING(fd) /* nothing */
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   933
#  endif
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   934
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   935
#  define __READAVAILBYTES__(ret, f, buf, cnt, isBuffered) \
3445
2639c1e3fd0b nextAvail also for externalBytes
Claus Gittinger <cg@exept.de>
parents: 3432
diff changeset
   936
  {                                                     \
7540
7cd542f29024 Fix reading when readAheadBuffer is filled and following read fails
Stefan Vogel <sv@exept.de>
parents: 7503
diff changeset
   937
    int __offs = 0, __cnt;                                     \
3681
55dc17d40aab fixed nextAvail
Claus Gittinger <cg@exept.de>
parents: 3674
diff changeset
   938
    int oldFlags;                                       \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   939
							\
3445
2639c1e3fd0b nextAvail also for externalBytes
Claus Gittinger <cg@exept.de>
parents: 3432
diff changeset
   940
    (ret) = 0;                                          \
3681
55dc17d40aab fixed nextAvail
Claus Gittinger <cg@exept.de>
parents: 3674
diff changeset
   941
    oldFlags = GETFLAGS(fileno(f));                     \
55dc17d40aab fixed nextAvail
Claus Gittinger <cg@exept.de>
parents: 3674
diff changeset
   942
    SETNONBLOCKING(fileno(f));                          \
3445
2639c1e3fd0b nextAvail also for externalBytes
Claus Gittinger <cg@exept.de>
parents: 3432
diff changeset
   943
    if (isBuffered) {                                   \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   944
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   945
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   946
	    (ret) = getc(f);                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   947
	    if ((ret) < 0) {                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   948
		if (ferror(f)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   949
		    if (__threadErrno == EINTR) {               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   950
			(ret) = 0;                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   951
			clearerr(f);                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   952
			break;                          \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   953
		    }                                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   954
		} else {                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   955
		    (ret) = 0;                          \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   956
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   957
		break;                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   958
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   959
	    (buf)[__offs++] = (ret);                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   960
	    DEBUGBUFFER(buf);                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   961
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   962
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   963
	    (ret) = __offs;                             \
3445
2639c1e3fd0b nextAvail also for externalBytes
Claus Gittinger <cg@exept.de>
parents: 3432
diff changeset
   964
    } else {                                            \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   965
	int fd = fileno(f);                             \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   966
							\
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   967
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   968
	    OBJ rA = __INST(readAhead);                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   969
	    if (rA != nil) {                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   970
		(buf)[__offs] = __intVal(rA);           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   971
		DEBUGBUFFER(buf);                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   972
		__INST(readAhead) = nil;                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   973
		__offs++;                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   974
		continue;                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   975
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   976
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   977
	    __cnt = read(fd, (buf)+__offs, (cnt)-__offs); \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   978
	    DEBUGBUFFER(buf);                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   979
	    if (__cnt > 0) {                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   980
		__offs += __cnt;                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   981
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   982
	    break;                                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   983
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   984
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
   985
	    (ret) = __offs;                             \
3445
2639c1e3fd0b nextAvail also for externalBytes
Claus Gittinger <cg@exept.de>
parents: 3432
diff changeset
   986
    }                                                   \
3681
55dc17d40aab fixed nextAvail
Claus Gittinger <cg@exept.de>
parents: 3674
diff changeset
   987
    SETFLAGS(fileno(f), oldFlags);                      \
3445
2639c1e3fd0b nextAvail also for externalBytes
Claus Gittinger <cg@exept.de>
parents: 3432
diff changeset
   988
  }
2639c1e3fd0b nextAvail also for externalBytes
Claus Gittinger <cg@exept.de>
parents: 3432
diff changeset
   989
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
   990
# endif /* use STDIO */
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
   991
2513
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
   992
/*
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
   993
 * read_bytes into an object
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
   994
 * (which may be moved by GC)
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
   995
 */
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   996
# ifdef NO_STDIO
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
   997
#  define __READBYTES_OBJ__(ret, f, obj, obj_offs, cnt, isBuffered)     \
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
   998
  {                                                     \
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
   999
    int __ooffs = obj_offs;                             \
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1000
    int __offs = 0;                                     \
7540
7cd542f29024 Fix reading when readAheadBuffer is filled and following read fails
Stefan Vogel <sv@exept.de>
parents: 7503
diff changeset
  1001
    int __cnt;                                          \
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1002
    char *buf = (char *)(obj);                          \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1003
							\
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  1004
    (ret) = 0;                                          \
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1005
    {                                                   \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1006
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1007
	    OBJ rA = __INST(readAhead);                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1008
	    if (rA != nil) {                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1009
		(buf)[__ooffs+__offs] = __intVal(rA);   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1010
		DEBUGBUFFER(buf);                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1011
		__INST(readAhead) = nil;                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1012
		__offs++;                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1013
	    } else {                                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1014
		CLEAR_ERRNO;                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1015
		__cnt = READ(f, (buf)+__ooffs+__offs, (cnt)-__offs); \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1016
		DEBUGBUFFER(buf);                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1017
		if (__cnt <= 0) {                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1018
		    if (__cnt < 0 && __threadErrno == EINTR) {  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1019
			__HANDLE_INTERRUPTS__;          \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1020
			/* refetch */                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1021
			buf = (char *)(obj);            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1022
			continue;                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1023
		    }                                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1024
		    break;                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1025
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1026
		__offs += __cnt;                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1027
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1028
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1029
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1030
	    (ret) = __offs;                             \
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1031
    }                                                   \
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  1032
  }
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1033
# else /* use STDIO */
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
  1034
#  define __READBYTES_OBJ__(ret, f, obj, obj_offs, cnt, isBuffered)     \
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1035
  {                                                     \
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1036
    int __ooffs = obj_offs;                             \
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1037
    int __offs = 0;                                     \
7540
7cd542f29024 Fix reading when readAheadBuffer is filled and following read fails
Stefan Vogel <sv@exept.de>
parents: 7503
diff changeset
  1038
    int __cnt;                                          \
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1039
    char *buf = (char *)(obj);                          \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1040
							\
2513
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1041
    (ret) = 0;                                          \
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1042
    if (isBuffered) {                                   \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1043
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1044
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1045
	    (ret) = getc(f);                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1046
	    if ((ret) < 0) {                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1047
		if (ferror(f)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1048
		    if (__threadErrno == EINTR) {               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1049
			__HANDLE_INTERRUPTS__;          \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1050
			clearerr(f);                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1051
			/* refetch */                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1052
			buf = (char *)(obj);            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1053
			DEBUGBUFFER(buf);               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1054
			continue;                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1055
		    }                                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1056
		} else {                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1057
		    (ret) = 0;                          \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1058
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1059
		break;                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1060
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1061
	    (buf)[__ooffs+__offs] = (ret);              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1062
	    DEBUGBUFFER(buf);                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1063
	    __offs++;                                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1064
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1065
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1066
	    (ret) = __offs;                             \
2513
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1067
    } else {                                            \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1068
	int fd = fileno(f);                             \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1069
							\
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1070
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1071
	    OBJ rA = __INST(readAhead);                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1072
	    if (rA != nil) {                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1073
		(buf)[__ooffs+__offs] = __intVal(rA);   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1074
		DEBUGBUFFER(buf);                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1075
		__INST(readAhead) = nil;                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1076
		__offs++;                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1077
	    } else {                                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1078
		CLEAR_ERRNO;                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1079
		__cnt = read(fd, (buf)+__ooffs+__offs, (cnt)-__offs); \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1080
		DEBUGBUFFER(buf);                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1081
		if (__cnt <= 0) {                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1082
		    if (__cnt < 0 && __threadErrno == EINTR) {  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1083
			__HANDLE_INTERRUPTS__;          \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1084
			/* refetch */                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1085
			buf = (char *)(obj);            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1086
			continue;                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1087
		    }                                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1088
		    break;                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1089
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1090
		__offs += __cnt;                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1091
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1092
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1093
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1094
	    (ret) = __offs;                             \
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1095
    }                                                   \
2513
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1096
  }
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1097
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
  1098
# define __READAVAILBYTES_OBJ__(ret, f, obj, obj_offs, cnt, isBuffered)     \
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1099
  {                                                     \
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1100
    int __ooffs = obj_offs;                             \
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1101
    int __offs = 0;                                     \
7540
7cd542f29024 Fix reading when readAheadBuffer is filled and following read fails
Stefan Vogel <sv@exept.de>
parents: 7503
diff changeset
  1102
    int __cnt;                                          \
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1103
    char *buf = (char *)(obj);                          \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1104
							\
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1105
    (ret) = 0;                                          \
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1106
    if (isBuffered) {                                   \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1107
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1108
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1109
	    (ret) = getc(f);                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1110
	    if ((ret) < 0) {                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1111
		if (ferror(f)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1112
		    if (__threadErrno == EINTR) {       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1113
			clearerr(f);                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1114
			/* refetch */                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1115
			buf = (char *)(obj);            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1116
			(ret) = 0;                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1117
			break;                          \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1118
		    }                                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1119
		} else {                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1120
		    (ret) = 0;                          \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1121
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1122
		break;                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1123
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1124
	    (buf)[__ooffs+__offs] = (ret);              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1125
	    DEBUGBUFFER(buf);                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1126
	    __offs++;                                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1127
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1128
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1129
	    (ret) = __offs;                             \
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1130
    } else {                                            \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1131
	int fd = fileno(f);                             \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1132
							\
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1133
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1134
	    OBJ rA = __INST(readAhead);                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1135
	    if (rA != nil) {                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1136
		(buf)[__ooffs+__offs] = __intVal(rA);   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1137
		DEBUGBUFFER(buf);                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1138
		__INST(readAhead) = nil;                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1139
		__offs++;                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1140
		continue;                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1141
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1142
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1143
	    __cnt = read(fd, (buf)+__ooffs+__offs, (cnt)-__offs); \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1144
	    DEBUGBUFFER(buf);                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1145
	    if (__cnt > 0) {                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1146
		__offs += __cnt;                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1147
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1148
	    break;                                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1149
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1150
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1151
	    (ret) = __offs;                             \
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1152
    }                                                   \
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1153
  }
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1154
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1155
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1156
# endif /* use STDIO */
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
  1157
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
  1158
# ifdef NO_STDIO
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
  1159
#  define __WRITEBYTE__(ret, f, buf, isBuffered)          \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1160
	for (;;) {                                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1161
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1162
	    (ret) = WRITE(f, buf, 1);                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1163
	    if ((ret) >= 0 || __threadErrno != EINTR)           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1164
		break;                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1165
	    __HANDLE_INTERRUPTS__;                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1166
	}
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1167
# else /* use STDIO */
4968
ff01ac91efa3 Fix buffered nexPut: for Solaris/Sparc
Stefan Vogel <sv@exept.de>
parents: 4914
diff changeset
  1168
#  define __WRITEBYTE__(ret, f, buf, isBuffered)        \
2120
71c1870df7ba implemented 1-character readAhead for unbuffered streams;
Claus Gittinger <cg@exept.de>
parents: 2045
diff changeset
  1169
    if (isBuffered) {                                   \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1170
	for (;;) {                                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1171
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1172
	    ret = putc(*(buf), f);                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1173
	    if ((ret) >= 0) {                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1174
		(ret) = 1;                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1175
	    } else if (ferror(f)) {                     \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1176
		/* SOLARIS/SPARC (2.6) generates spurious errors with errno = 0 */ \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1177
		if (__threadErrno == EINTR || __threadErrno == 0) {     \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1178
		    __HANDLE_INTERRUPTS__;              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1179
		    clearerr(f);                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1180
		    continue;                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1181
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1182
	    } else                                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1183
		(ret) = 0;                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1184
	    break;                                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1185
	}                                               \
2120
71c1870df7ba implemented 1-character readAhead for unbuffered streams;
Claus Gittinger <cg@exept.de>
parents: 2045
diff changeset
  1186
    } else {                                            \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1187
	for (;;) {                                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1188
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1189
	    (ret) = write(fileno(f), buf, 1);           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1190
	    if ((ret) >= 0 || __threadErrno != EINTR)           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1191
		break;                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1192
	    __HANDLE_INTERRUPTS__;                      \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1193
	}                                               \
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1194
   }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1195
# endif /* use STDIO */
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  1196
2513
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1197
/*
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1198
 * write_bytes from a c-buffer
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1199
 * (which may NOT move)
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1200
 */
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
  1201
# ifdef NO_STDIO
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
  1202
#  define __WRITEBYTES__(ret, f, buf, cnt, isBuffered)    \
2961
a188727d0619 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2920
diff changeset
  1203
    (ret) = 0;                                          \
a188727d0619 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2920
diff changeset
  1204
    {                                                   \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1205
	int __offs = 0;                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1206
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1207
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1208
	    ret = WRITE(f, (buf)+__offs, (cnt)-__offs); \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1209
	    if (ret <= 0) {                             \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1210
		if (ret < 0 && __threadErrno == EINTR) {        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1211
		    __HANDLE_INTERRUPTS__;              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1212
		    continue;                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1213
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1214
		break;                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1215
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1216
	    __offs += (ret);                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1217
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1218
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1219
	    (ret) = __offs;                             \
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  1220
   }
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1221
# else /* use STDIO */
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
  1222
#  define __WRITEBYTES__(ret, f, buf, cnt, isBuffered)    \
2961
a188727d0619 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2920
diff changeset
  1223
    (ret) = 0;                                          \
a188727d0619 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2920
diff changeset
  1224
    if (isBuffered) {                                   \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1225
	int __offs = 0;                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1226
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1227
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1228
	    ret = fwrite((buf)+__offs, 1, (cnt)-__offs, f);\
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1229
	    if ((ret) <= 0) {                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1230
		if (ferror(f)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1231
		    if (__threadErrno == EINTR) {               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1232
			__HANDLE_INTERRUPTS__;          \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1233
			clearerr(f);                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1234
			continue;                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1235
		    }                                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1236
		    break;                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1237
		} else {                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1238
		    (ret) = 0;                          \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1239
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1240
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1241
	    __offs += (ret);                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1242
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1243
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1244
	    (ret) = __offs;                             \
2961
a188727d0619 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2920
diff changeset
  1245
    } else {                                            \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1246
	int __offs = 0;                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1247
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1248
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1249
	    ret = write(fileno(f), (buf)+__offs, (cnt)-__offs);\
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1250
	    if (ret <= 0) {                             \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1251
		if (ret < 0 && __threadErrno == EINTR) {        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1252
		    __HANDLE_INTERRUPTS__;              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1253
		    continue;                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1254
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1255
		break;                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1256
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1257
	    __offs += (ret);                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1258
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1259
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1260
	    (ret) = __offs;                             \
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  1261
   }
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1262
# endif /* use STDIO */
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  1263
223
3075043790b8 immediateInterr & errno cleanup
claus
parents: 216
diff changeset
  1264
/*
2513
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1265
 * write_bytes from an object
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1266
 * (which may be moved around by GC)
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1267
 */
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
  1268
# ifdef NO_STDIO
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
  1269
#  define __WRITEBYTES_OBJ__(ret, f, obj, obj_offs, cnt, isBuffered)            \
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1270
  {                                                     \
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1271
    int __ooffs = obj_offs;                             \
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1272
    int __offs = 0;                                     \
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1273
    char *buf = (char *)(obj);                          \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1274
							\
2961
a188727d0619 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2920
diff changeset
  1275
    (ret) = 0;                                          \
a188727d0619 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2920
diff changeset
  1276
    {                                                   \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1277
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1278
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1279
	    ret = WRITE(f, (buf)+__ooffs+__offs, (cnt)-__offs);               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1280
	    if (ret <= 0) {                             \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1281
		if (ret < 0 && __threadErrno == EINTR) {        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1282
		    __HANDLE_INTERRUPTS__;              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1283
		    /* refetch */                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1284
		    buf = (char *)(obj);                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1285
		    continue;                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1286
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1287
		break;                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1288
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1289
	    __offs += (ret);                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1290
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1291
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1292
	    (ret) = __offs;                             \
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1293
    }                                                   \
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  1294
  }
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1295
# else /* use STDIO */
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
  1296
#  define __WRITEBYTES_OBJ__(ret, f, obj, obj_offs, cnt, isBuffered)            \
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1297
  {                                                     \
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1298
    int __ooffs = obj_offs;                             \
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1299
    int __offs = 0;                                     \
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1300
    char *buf = (char *)(obj);                          \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1301
							\
2961
a188727d0619 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2920
diff changeset
  1302
    (ret) = 0;                                          \
a188727d0619 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2920
diff changeset
  1303
    if (isBuffered) {                                   \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1304
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1305
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1306
	    ret = fwrite((buf)+__ooffs+__offs, 1, (cnt)-__offs, f);           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1307
	    if ((ret) <= 0) {                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1308
		if (ferror(f)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1309
		    if (__threadErrno == EINTR) {               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1310
			__HANDLE_INTERRUPTS__;          \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1311
			/* refetch */                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1312
			buf = (char *)(obj);            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1313
			clearerr(f);                    \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1314
			continue;                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1315
		    }                                   \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1316
		    break;                              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1317
		} else {                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1318
		    (ret) = 0;                          \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1319
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1320
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1321
	    __offs += (ret);                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1322
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1323
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1324
	    (ret) = __offs;                             \
2961
a188727d0619 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2920
diff changeset
  1325
    } else {                                            \
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1326
	while (__offs < (cnt)) {                        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1327
	    CLEAR_ERRNO;                                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1328
	    ret = write(fileno(f), (buf)+__ooffs+__offs, (cnt)-__offs);       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1329
	    if (ret <= 0) {                             \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1330
		if (ret < 0 && __threadErrno == EINTR) {        \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1331
		    __HANDLE_INTERRUPTS__;              \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1332
		    /* refetch */                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1333
		    buf = (char *)(obj);                \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1334
		    continue;                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1335
		}                                       \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1336
		break;                                  \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1337
	    }                                           \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1338
	    __offs += (ret);                            \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1339
	}                                               \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1340
	if (__offs > 0)                                 \
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  1341
	    (ret) = __offs;                             \
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  1342
    }                                                   \
2513
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1343
  }
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1344
# endif /* use STDIO */
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
  1345
#endif /* unix */
2513
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1346
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1347
/*
223
3075043790b8 immediateInterr & errno cleanup
claus
parents: 216
diff changeset
  1348
 * on some systems errno is a macro ... check for it here
3075043790b8 immediateInterr & errno cleanup
claus
parents: 216
diff changeset
  1349
 */
3075043790b8 immediateInterr & errno cleanup
claus
parents: 216
diff changeset
  1350
#ifndef errno
3075043790b8 immediateInterr & errno cleanup
claus
parents: 216
diff changeset
  1351
 extern errno;
3075043790b8 immediateInterr & errno cleanup
claus
parents: 216
diff changeset
  1352
#endif
3075043790b8 immediateInterr & errno cleanup
claus
parents: 216
diff changeset
  1353
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1354
%}
188
454ed0ee733e EINTR problems
claus
parents: 159
diff changeset
  1355
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1356
2045
1ad17ca6520f fall back to super>>nextPutLine: if argument is not a string.
Claus Gittinger <cg@exept.de>
parents: 2044
diff changeset
  1357
!ExternalStream class methodsFor:'documentation'!
22
847106305963 *** empty log message ***
claus
parents: 12
diff changeset
  1358
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
  1359
copyright
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
  1360
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
  1361
 COPYRIGHT (c) 1988 by Claus Gittinger
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1362
	      All Rights Reserved
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
  1363
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
  1364
 This software is furnished under a license and may be used
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
  1365
 only in accordance with the terms of that license and with the
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
  1366
 inclusion of the above copyright notice.   This software may not
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
  1367
 be provided or otherwise made available to, or used by, any
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
  1368
 other person.  No title to or ownership of the software is
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
  1369
 hereby transferred.
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
  1370
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
  1371
!
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
  1372
22
847106305963 *** empty log message ***
claus
parents: 12
diff changeset
  1373
documentation
847106305963 *** empty log message ***
claus
parents: 12
diff changeset
  1374
"
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1375
    ExternalStream defines protocol common to Streams which have a file-descriptor and
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1376
    represent some file or communicationChannel of the underlying OperatingSystem.
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1377
    ExternalStream is abstract; concrete classes are FileStream, PipeStream etc.
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1378
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1379
    ExternalStreams can be in two modes: text- (the default) and binary-mode.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1380
    In text-mode, the elements read/written are characters;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1381
    while in binary-mode the basic elements are bytes which read/write as SmallIntegers
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1382
    in the range 0..255.
22
847106305963 *** empty log message ***
claus
parents: 12
diff changeset
  1383
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1384
    Also, the stream can be either in buffered or unbuffered mode. In buffered mode,
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1385
    data is not written until either a cr is written (in text mode) or a synchronizeOutput
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1386
    is sent (in both modes).
22
847106305963 *** empty log message ***
claus
parents: 12
diff changeset
  1387
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1388
    The underlying OperatingSystem streams may either be closed explicitely (sending a close)
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1389
    or just forgotten - in this case, the garbage collector will eventually collect the
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1390
    object AND a close will be performed automatically (but you will NOT know when this
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1391
    happens - so it is recommended, that you close your files when no longer needed).
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1392
    Closing is also suggested, since if smalltalk is finished (be it by purpose, or due to
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1393
    some crash) the data will not be in the file, if unclosed.
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1394
    All streams understand the close message, so it never hurts to use it (it is defined as
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  1395
    a noop in one of the superclasses).
22
847106305963 *** empty log message ***
claus
parents: 12
diff changeset
  1396
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1397
    Most of the methods found here redefine inherited methods for better performance,
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1398
    since I/O from/to files should be fast.
22
847106305963 *** empty log message ***
claus
parents: 12
diff changeset
  1399
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  1400
    Recovering a snapshot:
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  1401
      not all streams can be restored to the state they had before - see the implementation of
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  1402
      reOpen in subclasses for more information.
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  1403
      For streams sitting on some communication channel (i.e. Pipes and Sockets) you should
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  1404
      reestablish the stream upon image restart (make someone dependent on ObjectMemory).
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  1405
      FileStreams are reopened and positioned to their offset they had at snapshot time.
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  1406
      This may fail, if the file was removed or renamed - or lead to confusion
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  1407
      if the contents changed in the meantime.
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  1408
      Therefore, it is a good idea to reopen files and check for these things at restart time.
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  1409
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  1410
    [Instance variables:]
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  1411
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1412
	filePointer     <Integer>       the unix FILE*; somehow mapped to an integer
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1413
					(notice: not the fd)
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1414
					on Windows: the fileHandle
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1415
	mode            <Symbol>        #readwrite, #readonly or #writeonly
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1416
	buffered        <Boolean>       true, if buffered (i.e. collects characters - does
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1417
					not output immediately)
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1418
	binary          <Boolean>       true if in binary mode (reads bytes instead of chars)
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1419
	eolMode         <Symbol>        one of nil, #cr or #crlf.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1420
					determines how lines should be terminated.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1421
					nil -> newLine (as in Unix);
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1422
					#crlf -> with cr-lf (as in MSDOS)
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1423
					#cr -> with cr (as in VMS)
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1424
	hitEOF          <Boolean>       true, if EOF was reached
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1425
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1426
	lastErrorNumber <Integer>       the value of errno (only valid right after the error -
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1427
					updated with next i/o operation)
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  1428
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  1429
    [Class variables:]
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1430
	Lobby           <Registry>      keeps track of used ext-streams (to free up FILE*'s)
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1431
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1432
	StreamErrorSignal       <Signal> parent of all stream errors (see Stream class)
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1433
	InvalidReadSignal       <Signal> raised on read from writeonly stream
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1434
	InvalidWriteSignal      <Signal> raised on write to readonly stream
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1435
	InvalidModeSignal       <Signal> raised on text I/O with binary-stream
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1436
					 or binary I/O with text-stream
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1437
	OpenErrorSignal         <Signal> raised if open fails
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1438
	StreamNotOpenSignal     <Signal> raised on I/O with non-open stream
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1439
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1440
    Additional notes:
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1441
      This class is implemented using the underlying stdio-c library package, which
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1442
      has both advantages and disadvantages: since it is portable (posix defined), porting
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1443
      ST/X to non-Unix machines is simplified. The disadvantage is that the stdio library
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1444
      has big problems handling unbounded Streams, since the EOF handling in stdio is
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1445
      not prepared for data to arrive after EOF has been reached - time will show, if we need
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1446
      a complete rewrite for UnboundedStream ...
325
claus
parents: 308
diff changeset
  1447
188
454ed0ee733e EINTR problems
claus
parents: 159
diff changeset
  1448
      Also, depending on the system, the stdio library behaves infriendly when signals
454ed0ee733e EINTR problems
claus
parents: 159
diff changeset
  1449
      occur while reading (for example, timer interrupts) - on real unixes (i.e. BSD) the signal
454ed0ee733e EINTR problems
claus
parents: 159
diff changeset
  1450
      is handled transparently - on SYS5.3 (i.e. non unixes :-) the read operation returns
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1451
      an error and errno is set to EINTR.
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  1452
      Thats what the ugly code around all getc-calls is for ...
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  1453
      Since things get more and more ugly - we will rewrite ExternalStream
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  1454
      completely, to NOT use any stdio stuff (and do its buffering itself).
325
claus
parents: 308
diff changeset
  1455
claus
parents: 308
diff changeset
  1456
      Notice that typical stdio's use a single errno global variable to return an error code,
claus
parents: 308
diff changeset
  1457
      this was bad design in the stdio lib (right from the very beginning), since its much
claus
parents: 308
diff changeset
  1458
      harder to deal with this in the presence of lightweight processes, where errno gets
claus
parents: 308
diff changeset
  1459
      overwritten by an I/O operation done in another thread. (stdio should have been written
claus
parents: 308
diff changeset
  1460
      to return errno as a negative number ...).
claus
parents: 308
diff changeset
  1461
      To deal with this, the scheduler treats errno like a per-thread private variable,
claus
parents: 308
diff changeset
  1462
      and saves/restores the errno setting when switching to another thread.
claus
parents: 308
diff changeset
  1463
      (Notice that some thread packages do this also, but ST/X's thread implementation
claus
parents: 308
diff changeset
  1464
      does not depend on those, but instead uses a portable private package).
claus
parents: 308
diff changeset
  1465
216
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1466
      Finally, if an stdio-stream is open for both reading and writing, we have to call
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1467
      fseek whenever we are about to read after write and vice versa.
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1468
      Two macros (__READING__ and __WRITING__) have been defined to be used before every
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  1469
      fread/fgetc and fwrite/putc respectively.
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  1470
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  1471
    [author:]
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1472
	Claus Gittinger
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1473
	Stefan Vogel (many, many fixes ...)
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  1474
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  1475
    [see also:]
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1476
	FileStream Socket PipeStream
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1477
	Filename OperatingSystem
22
847106305963 *** empty log message ***
claus
parents: 12
diff changeset
  1478
"
3255
eb76cba071a1 example
Claus Gittinger <cg@exept.de>
parents: 3235
diff changeset
  1479
!
eb76cba071a1 example
Claus Gittinger <cg@exept.de>
parents: 3235
diff changeset
  1480
eb76cba071a1 example
Claus Gittinger <cg@exept.de>
parents: 3235
diff changeset
  1481
examples
eb76cba071a1 example
Claus Gittinger <cg@exept.de>
parents: 3235
diff changeset
  1482
"
eb76cba071a1 example
Claus Gittinger <cg@exept.de>
parents: 3235
diff changeset
  1483
    open a file, read the contents and display it in a textView:
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1484
									[exBegin]
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1485
	|topView scrollPane textView fileStream text|
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1486
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1487
	topView := StandardSystemView new.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1488
	topView label:'contents of Makefile'.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1489
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1490
	scrollPane := HVScrollableView in:topView.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1491
	scrollPane origin:0.0@0.0 corner:1.0@1.0.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1492
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1493
	textView := EditTextView new.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1494
	scrollPane scrolledView:textView.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1495
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1496
	fileStream := 'Makefile' asFilename readStream.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1497
	text := fileStream upToEnd.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1498
	fileStream close.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1499
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1500
	textView contents:text.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1501
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1502
	topView open.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1503
									[exEnd]
3255
eb76cba071a1 example
Claus Gittinger <cg@exept.de>
parents: 3235
diff changeset
  1504
eb76cba071a1 example
Claus Gittinger <cg@exept.de>
parents: 3235
diff changeset
  1505
eb76cba071a1 example
Claus Gittinger <cg@exept.de>
parents: 3235
diff changeset
  1506
    Notice, all of the above can also be done (simply) as:
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1507
									[exBegin]
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1508
	EditTextView openOn:'Makefile'
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1509
									[exEnd]
3255
eb76cba071a1 example
Claus Gittinger <cg@exept.de>
parents: 3235
diff changeset
  1510
"
22
847106305963 *** empty log message ***
claus
parents: 12
diff changeset
  1511
! !
847106305963 *** empty log message ***
claus
parents: 12
diff changeset
  1512
2045
1ad17ca6520f fall back to super>>nextPutLine: if argument is not a string.
Claus Gittinger <cg@exept.de>
parents: 2044
diff changeset
  1513
!ExternalStream class methodsFor:'initialization'!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1514
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1515
initDefaultEOLMode
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1516
    OperatingSystem isUNIXlike ifTrue:[
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1517
	"/ unix EOL conventions
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1518
	DefaultEOLMode := #nl
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1519
    ] ifFalse:[
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1520
	OperatingSystem isVMSlike ifTrue:[
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1521
	    "/ vms EOL conventions
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1522
	    DefaultEOLMode := #cr
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1523
	] ifFalse:[
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1524
	    "/ msdos EOL conventions
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1525
	    DefaultEOLMode := #crlf
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1526
	]
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1527
    ]
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1528
!
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1529
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1530
initModeStrings
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1531
    "initialize modeStrings which are passed down to the underlying
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1532
     fopen/fdopen functions."
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1533
3132
037027ae20fd msdos MUST use binary mode in I/O
Claus Gittinger <cg@exept.de>
parents: 3044
diff changeset
  1534
    OperatingSystem isMSDOSlike ifTrue:[
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1535
	ReadMode := 'rb'.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1536
	ReadWriteMode := 'rb+'.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1537
	WriteMode := 'wb'.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1538
	AppendMode := 'ab+'.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1539
	CreateReadWriteMode := 'wb+'.
3132
037027ae20fd msdos MUST use binary mode in I/O
Claus Gittinger <cg@exept.de>
parents: 3044
diff changeset
  1540
    ] ifFalse:[
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1541
	ReadMode := 'r'.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1542
	ReadWriteMode := 'r+'.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1543
	WriteMode := 'w'.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1544
	AppendMode := 'a+'.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1545
	CreateReadWriteMode := 'w+'.
3132
037027ae20fd msdos MUST use binary mode in I/O
Claus Gittinger <cg@exept.de>
parents: 3044
diff changeset
  1546
    ]
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1547
!
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1548
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1549
initialize
593
19d568779cf7 moved StreamErrorSignal into Stream;
Claus Gittinger <cg@exept.de>
parents: 583
diff changeset
  1550
    OpenErrorSignal isNil ifTrue:[
8066
0dbcbe8989b8 OpenError is now a class based exception
Claus Gittinger <cg@exept.de>
parents: 8008
diff changeset
  1551
"/        OpenErrorSignal := OpenError.
0dbcbe8989b8 OpenError is now a class based exception
Claus Gittinger <cg@exept.de>
parents: 8008
diff changeset
  1552
"/        OpenErrorSignal nameClass:self message:#openErrorSignal.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1553
	OpenErrorSignal := OpenError.
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1554
	OpenErrorSignal notifierString:'open error'.
8074
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  1555
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  1556
"/        InvalidReadSignal := ReadErrorSignal newSignalMayProceed:false.
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  1557
"/        InvalidReadSignal nameClass:self message:#invalidReadSignal.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1558
	InvalidReadSignal := InvalidReadError.
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1559
	InvalidReadSignal notifierString:'stream does not support reading'.
8074
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  1560
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  1561
"/        InvalidWriteSignal := WriteErrorSignal newSignalMayProceed:false.
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  1562
"/        InvalidWriteSignal nameClass:self message:#invalidWriteSignal.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1563
	InvalidWriteSignal := InvalidWriteError.
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1564
	InvalidWriteSignal notifierString:'stream does not support writing'.
8074
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  1565
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  1566
"/        InvalidModeSignal :=  StreamErrorSignal newSignalMayProceed:false.
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  1567
"/        InvalidModeSignal nameClass:self message:#invalidModeSignal.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1568
	InvalidModeSignal := InvalidModeError.
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1569
	InvalidModeSignal notifierString:'binary/text mode mismatch'.
8074
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  1570
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  1571
"/        InvalidOperationSignal :=  StreamErrorSignal newSignalMayProceed:false.
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  1572
"/        InvalidOperationSignal nameClass:self message:#invalidOperationSignal.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1573
	InvalidOperationSignal := InvalidOperationError.
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1574
	InvalidOperationSignal notifierString:'unsupported file operation'.
8074
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  1575
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  1576
"/        StreamNotOpenSignal := StreamErrorSignal newSignalMayProceed:false.
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  1577
"/        StreamNotOpenSignal nameClass:self message:#streamNotOpenSignal.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1578
	StreamNotOpenSignal := StreamNotOpenError.
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1579
	StreamNotOpenSignal notifierString:'stream is not open'.
8074
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  1580
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  1581
"/        StreamIOErrorSignal := StreamErrorSignal newSignalMayProceed:false.
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  1582
"/        StreamIOErrorSignal nameClass:self message:#streamIOErrorSignal.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1583
	StreamIOErrorSignal := StreamIOError.
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1584
	StreamIOErrorSignal notifierString:'I/O error'.
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1585
    ].
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1586
31
75f2b9f78be2 *** empty log message ***
claus
parents: 25
diff changeset
  1587
    Lobby isNil ifTrue:[
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1588
	Lobby := Registry new.
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1589
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1590
	"want to get informed when returning from snapshot"
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1591
	ObjectMemory addDependent:self
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1592
    ].
5442
24b88d75396d only init once
Claus Gittinger <cg@exept.de>
parents: 5441
diff changeset
  1593
    DefaultEOLMode isNil ifTrue:[
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1594
	self initDefaultEOLMode.
5442
24b88d75396d only init once
Claus Gittinger <cg@exept.de>
parents: 5441
diff changeset
  1595
    ].
24b88d75396d only init once
Claus Gittinger <cg@exept.de>
parents: 5441
diff changeset
  1596
    ReadMode isNil ifTrue:[
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1597
	self initModeStrings.
5442
24b88d75396d only init once
Claus Gittinger <cg@exept.de>
parents: 5441
diff changeset
  1598
    ].
3474
1af4d150dab4 added extra streamIOError signal.
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
  1599
    "Modified: / 21.5.1998 / 16:33:53 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1600
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1601
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1602
reOpenFiles
4108
8c4a45bc70eb perform reOpen of streams earlier (before doing the view-reinit)
Claus Gittinger <cg@exept.de>
parents: 4093
diff changeset
  1603
    "reopen all files (if possible) after a snapShot load.
8c4a45bc70eb perform reOpen of streams earlier (before doing the view-reinit)
Claus Gittinger <cg@exept.de>
parents: 4093
diff changeset
  1604
     This is invoked via the #earlyRestart change notification."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1605
301
35e40a6fc72b *** empty log message ***
claus
parents: 269
diff changeset
  1606
    Lobby do:[:aFileStream |
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1607
	aFileStream reOpen
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1608
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1609
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1610
1469
570ef7f8667b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1464
diff changeset
  1611
update:something with:aParameter from:changedObject
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1612
    "have to reopen files when returning from snapshot"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1613
4108
8c4a45bc70eb perform reOpen of streams earlier (before doing the view-reinit)
Claus Gittinger <cg@exept.de>
parents: 4093
diff changeset
  1614
    something == #earlyRestart ifTrue:[
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1615
	self reOpenFiles.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1616
	self initDefaultEOLMode
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1617
    ]
1469
570ef7f8667b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1464
diff changeset
  1618
570ef7f8667b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1464
diff changeset
  1619
    "Created: 15.6.1996 / 15:19:59 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1620
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1621
2045
1ad17ca6520f fall back to super>>nextPutLine: if argument is not a string.
Claus Gittinger <cg@exept.de>
parents: 2044
diff changeset
  1622
!ExternalStream class methodsFor:'instance creation'!
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1623
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1624
forFileDescriptor:aFileDescriptor mode:modeString
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1625
    "given a fileDescriptor, create an ExternalStream object
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1626
     to operate on this fd.
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1627
     The mode-argument is passed to the fdopen call.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1628
     This may be used to wrap fd's as returned by user
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1629
     primitive code, or to wrap pipe-fds into externalStreams."
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1630
7002
7a5d55f87cd7 make pseudoTTYs unbuffered (req'd for UNIXWARE)
penk
parents: 6812
diff changeset
  1631
    ^ self forFileDescriptor:aFileDescriptor mode:modeString buffered:true
7a5d55f87cd7 make pseudoTTYs unbuffered (req'd for UNIXWARE)
penk
parents: 6812
diff changeset
  1632
7a5d55f87cd7 make pseudoTTYs unbuffered (req'd for UNIXWARE)
penk
parents: 6812
diff changeset
  1633
    "
7a5d55f87cd7 make pseudoTTYs unbuffered (req'd for UNIXWARE)
penk
parents: 6812
diff changeset
  1634
     the example below will probably fail (15 is a random FD):
7a5d55f87cd7 make pseudoTTYs unbuffered (req'd for UNIXWARE)
penk
parents: 6812
diff changeset
  1635
7a5d55f87cd7 make pseudoTTYs unbuffered (req'd for UNIXWARE)
penk
parents: 6812
diff changeset
  1636
     |s|
7a5d55f87cd7 make pseudoTTYs unbuffered (req'd for UNIXWARE)
penk
parents: 6812
diff changeset
  1637
7a5d55f87cd7 make pseudoTTYs unbuffered (req'd for UNIXWARE)
penk
parents: 6812
diff changeset
  1638
     s := ExternalStream forFileDescriptor:15 mode:'r'.
7a5d55f87cd7 make pseudoTTYs unbuffered (req'd for UNIXWARE)
penk
parents: 6812
diff changeset
  1639
     s next.
7a5d55f87cd7 make pseudoTTYs unbuffered (req'd for UNIXWARE)
penk
parents: 6812
diff changeset
  1640
    "
7a5d55f87cd7 make pseudoTTYs unbuffered (req'd for UNIXWARE)
penk
parents: 6812
diff changeset
  1641
7a5d55f87cd7 make pseudoTTYs unbuffered (req'd for UNIXWARE)
penk
parents: 6812
diff changeset
  1642
    "Created: 29.2.1996 / 18:05:00 / cg"
7a5d55f87cd7 make pseudoTTYs unbuffered (req'd for UNIXWARE)
penk
parents: 6812
diff changeset
  1643
    "Modified: 29.2.1996 / 18:17:07 / cg"
7a5d55f87cd7 make pseudoTTYs unbuffered (req'd for UNIXWARE)
penk
parents: 6812
diff changeset
  1644
!
7a5d55f87cd7 make pseudoTTYs unbuffered (req'd for UNIXWARE)
penk
parents: 6812
diff changeset
  1645
7a5d55f87cd7 make pseudoTTYs unbuffered (req'd for UNIXWARE)
penk
parents: 6812
diff changeset
  1646
forFileDescriptor:aFileDescriptor mode:modeString buffered:buffered
7a5d55f87cd7 make pseudoTTYs unbuffered (req'd for UNIXWARE)
penk
parents: 6812
diff changeset
  1647
    "given a fileDescriptor, create an ExternalStream object
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1648
     to operate on this fd.
7002
7a5d55f87cd7 make pseudoTTYs unbuffered (req'd for UNIXWARE)
penk
parents: 6812
diff changeset
  1649
     The mode-argument is passed to the fdopen call.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1650
     This may be used to wrap fd's as returned by user
7002
7a5d55f87cd7 make pseudoTTYs unbuffered (req'd for UNIXWARE)
penk
parents: 6812
diff changeset
  1651
     primitive code, or to wrap pipe-fds into externalStreams."
7a5d55f87cd7 make pseudoTTYs unbuffered (req'd for UNIXWARE)
penk
parents: 6812
diff changeset
  1652
1048
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1653
    |newStream|
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1654
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1655
    newStream := self basicNew.
7002
7a5d55f87cd7 make pseudoTTYs unbuffered (req'd for UNIXWARE)
penk
parents: 6812
diff changeset
  1656
    newStream text; buffered:buffered; eolMode:DefaultEOLMode; clearEOF.
3535
03890e8be43d added #makePTYPair
Claus Gittinger <cg@exept.de>
parents: 3490
diff changeset
  1657
    ^ newStream connectTo:aFileDescriptor withMode:modeString
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1658
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1659
    "
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1660
     the example below will probably fail (15 is a random FD):
1048
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1661
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1662
     |s|
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1663
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1664
     s := ExternalStream forFileDescriptor:15 mode:'r'.
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1665
     s next.
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1666
    "
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1667
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1668
    "Created: 29.2.1996 / 18:05:00 / cg"
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1669
    "Modified: 29.2.1996 / 18:17:07 / cg"
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1670
!
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1671
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1672
forReadWriteToFileDescriptor:aFileDescriptor
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1673
    "given a fileDescriptor, create an ExternalStream object
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1674
     to read/write from/to this fd. This may be used to wrap fd's
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1675
     as returned by user primitive code, or to wrap pipe-
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1676
     filedescriptors into externalStreams."
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1677
3535
03890e8be43d added #makePTYPair
Claus Gittinger <cg@exept.de>
parents: 3490
diff changeset
  1678
    ^ (self forFileDescriptor:aFileDescriptor mode:ReadWriteMode) readwrite
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1679
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1680
    "
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1681
     the example below will probably fail (15 is a random FD):
1048
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1682
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1683
     |s|
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1684
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1685
     s := ExternalStream forReadWriteToFileDescriptor:15.
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1686
     s next.
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1687
    "
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1688
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1689
    "Created: 29.2.1996 / 18:15:08 / cg"
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1690
    "Modified: 29.2.1996 / 18:16:25 / cg"
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1691
!
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1692
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1693
forReadingFromFileDescriptor:aFileDescriptor
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1694
    "given a fileDescriptor, create an ExternalStream object
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1695
     to read from this fd. This may be used to wrap fd's
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1696
     as returned by user primitive code, or to wrap pipe-
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1697
     filedescriptors into externalStreams."
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1698
3535
03890e8be43d added #makePTYPair
Claus Gittinger <cg@exept.de>
parents: 3490
diff changeset
  1699
    ^ (self forFileDescriptor:aFileDescriptor mode:ReadMode) readonly
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1700
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1701
    "
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1702
     the example below will probably fail (15 is a random FD):
1048
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1703
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1704
     |s|
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1705
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1706
     s := ExternalStream forReadingFromFileDescriptor:15.
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1707
     s next.
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1708
    "
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1709
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1710
    "
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1711
     |pipe readFd writeFd rs ws|
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1712
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1713
     'create OS pipe ...'.
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1714
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1715
     pipe := OperatingSystem makePipe.
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1716
     readFd := pipe at:1.
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1717
     writeFd := pipe at:2.
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1718
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1719
     'connect Smalltalk streams ...'.
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1720
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1721
     rs := ExternalStream forReadingFromFileDescriptor:readFd.
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1722
     ws := ExternalStream forWritingToFileDescriptor:writeFd.
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1723
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1724
     'read ...'.
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1725
     [
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1726
	 1 to:10 do:[:i |
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1727
	     Transcript showCR:rs nextLine
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1728
	 ].
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1729
	 rs close.
1048
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1730
     ] forkAt:7.
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1731
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1732
     'write ...'.
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1733
     [
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1734
	 1 to:10 do:[:i |
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1735
	     ws nextPutAll:'hello world '; nextPutAll:i printString; cr
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1736
	 ].
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1737
	 ws close.
1048
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1738
     ] fork.
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1739
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1740
    "
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1741
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1742
    "Created: 29.2.1996 / 18:14:24 / cg"
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1743
    "Modified: 29.2.1996 / 18:25:02 / cg"
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1744
!
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1745
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1746
forWritingToFileDescriptor:aFileDescriptor
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1747
    "given a fileDescriptor, create an ExternalStream object
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1748
     to write to this fd. This may be used to wrap fd's
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1749
     as returned by user primitive code, or to wrap pipe-
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1750
     filedescriptors into externalStreams."
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1751
3535
03890e8be43d added #makePTYPair
Claus Gittinger <cg@exept.de>
parents: 3490
diff changeset
  1752
    ^ (self forFileDescriptor:aFileDescriptor mode:WriteMode) writeonly
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1753
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1754
    "
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1755
     the example below will probably fail (15 is a random FD):
1048
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1756
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1757
     |s|
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1758
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1759
     s := ExternalStream forWritingToFileDescriptor:15.
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1760
     s binary.
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1761
     s nextPut:1.
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1762
    "
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1763
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1764
    "Created: 29.2.1996 / 18:14:43 / cg"
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1765
    "Modified: 29.2.1996 / 18:15:54 / cg"
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1766
!
c535c5a73cba added facilities to connect to given Fd's and #makePipe
Claus Gittinger <cg@exept.de>
parents: 1044
diff changeset
  1767
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1768
new
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1769
    |newStream|
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1770
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1771
    newStream := self basicNew.
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  1772
    newStream text; buffered:true; eolMode:DefaultEOLMode; clearEOF.
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1773
    ^ newStream
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1774
! !
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1775
2045
1ad17ca6520f fall back to super>>nextPutLine: if argument is not a string.
Claus Gittinger <cg@exept.de>
parents: 2044
diff changeset
  1776
!ExternalStream class methodsFor:'Signal constants'!
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1777
1522
1d0b4bc2e563 ST-80 compatibility: #contentsOfEntireFile must return a String.
Stefan Vogel <sv@exept.de>
parents: 1515
diff changeset
  1778
inaccessibleSignal
1d0b4bc2e563 ST-80 compatibility: #contentsOfEntireFile must return a String.
Stefan Vogel <sv@exept.de>
parents: 1515
diff changeset
  1779
    "ST-80 compatibility: return openErrorSignal"
1d0b4bc2e563 ST-80 compatibility: #contentsOfEntireFile must return a String.
Stefan Vogel <sv@exept.de>
parents: 1515
diff changeset
  1780
1d0b4bc2e563 ST-80 compatibility: #contentsOfEntireFile must return a String.
Stefan Vogel <sv@exept.de>
parents: 1515
diff changeset
  1781
    ^ self openErrorSignal
1d0b4bc2e563 ST-80 compatibility: #contentsOfEntireFile must return a String.
Stefan Vogel <sv@exept.de>
parents: 1515
diff changeset
  1782
1d0b4bc2e563 ST-80 compatibility: #contentsOfEntireFile must return a String.
Stefan Vogel <sv@exept.de>
parents: 1515
diff changeset
  1783
    "Created: 2.7.1996 / 12:27:16 / stefan"
1d0b4bc2e563 ST-80 compatibility: #contentsOfEntireFile must return a String.
Stefan Vogel <sv@exept.de>
parents: 1515
diff changeset
  1784
!
1d0b4bc2e563 ST-80 compatibility: #contentsOfEntireFile must return a String.
Stefan Vogel <sv@exept.de>
parents: 1515
diff changeset
  1785
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1786
invalidModeSignal
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1787
    "return the signal raised when doing text-I/O with a binary stream
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1788
     or binary-I/O with a text stream"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1789
8074
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  1790
    ^ InvalidModeError
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1791
!
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1792
932
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  1793
invalidOperationSignal
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  1794
    "return the signal raised when an unsupported or invalid
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  1795
     I/O operation is attempted"
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  1796
8074
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  1797
    ^ InvalidOperationError
932
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  1798
!
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  1799
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1800
invalidReadSignal
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1801
    "return the signal raised when reading from writeonly streams"
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1802
8074
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  1803
    ^ InvalidReadError
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1804
!
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1805
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1806
invalidWriteSignal
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1807
    "return the signal raised when writing to readonly streams"
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1808
8074
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  1809
    ^ InvalidWriteError
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1810
!
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1811
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1812
openErrorSignal
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1813
    "return the signal raised when a file open failed"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1814
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1815
    ^ OpenErrorSignal
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1816
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1817
3474
1af4d150dab4 added extra streamIOError signal.
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
  1818
streamIOErrorSignal
1af4d150dab4 added extra streamIOError signal.
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
  1819
    "return the signal raised when an I/O error occurs.
1af4d150dab4 added extra streamIOError signal.
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
  1820
     (for example, a device-IO-error, or reading an NFS-dir,
1af4d150dab4 added extra streamIOError signal.
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
  1821
     which is no longer available and has been mounted soft)"
1af4d150dab4 added extra streamIOError signal.
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
  1822
8074
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  1823
    ^ StreamIOError
3474
1af4d150dab4 added extra streamIOError signal.
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
  1824
1af4d150dab4 added extra streamIOError signal.
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
  1825
    "Created: / 21.5.1998 / 16:32:55 / cg"
1af4d150dab4 added extra streamIOError signal.
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
  1826
!
1af4d150dab4 added extra streamIOError signal.
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
  1827
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1828
streamNotOpenSignal
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1829
    "return the signal raised on I/O with closed streams"
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1830
8074
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  1831
    ^ StreamNotOpenError
2
claus
parents: 1
diff changeset
  1832
! !
claus
parents: 1
diff changeset
  1833
2045
1ad17ca6520f fall back to super>>nextPutLine: if argument is not a string.
Claus Gittinger <cg@exept.de>
parents: 2044
diff changeset
  1834
!ExternalStream class methodsFor:'error handling'!
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1835
6269
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  1836
errorReporter
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  1837
    "I know about error codes"
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  1838
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  1839
    ^ self
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  1840
!
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  1841
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1842
lastErrorNumber
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1843
    "return the errno of the last error"
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1844
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1845
    ^ LastErrorNumber
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1846
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1847
    "
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1848
     ExternalStream lastErrorNumber
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  1849
    "
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1850
!
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1851
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1852
lastErrorString
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1853
    "return a message string describing the last error"
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1854
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1855
    ^ OperatingSystem errorTextForNumber:LastErrorNumber
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1856
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1857
    "
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1858
     ExternalStream lastErrorString
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1859
    "
6269
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  1860
!
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  1861
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1862
reportOn:anErrorSymbolOrNumber
6269
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  1863
    "an error occured.
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  1864
     Report it via an Exception"
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  1865
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  1866
    anErrorSymbolOrNumber isInteger ifTrue:[
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1867
	StreamError
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1868
	    raiseRequestWith:anErrorSymbolOrNumber
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1869
	    errorString:(' - os error:' , (OperatingSystem errorTextForNumber:anErrorSymbolOrNumber))
6269
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  1870
    ].
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  1871
    (self respondsTo:anErrorSymbolOrNumber) ifTrue:[
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1872
	self perform:anErrorSymbolOrNumber
6269
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  1873
    ] ifFalse:[
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1874
	StreamError
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1875
	    raiseRequestWith:anErrorSymbolOrNumber
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  1876
	    errorString:(' - ' , anErrorSymbolOrNumber printString)
6269
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  1877
    ].
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  1878
    ^ false
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1879
! !
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1880
7497
cc29afd51151 Do not block when writing to pipes
Stefan Vogel <sv@exept.de>
parents: 7261
diff changeset
  1881
!ExternalStream class methodsFor:'obsolete'!
cc29afd51151 Do not block when writing to pipes
Stefan Vogel <sv@exept.de>
parents: 7261
diff changeset
  1882
cc29afd51151 Do not block when writing to pipes
Stefan Vogel <sv@exept.de>
parents: 7261
diff changeset
  1883
makePTYPair
cc29afd51151 Do not block when writing to pipes
Stefan Vogel <sv@exept.de>
parents: 7261
diff changeset
  1884
    "obsolete since 12-07-2003"
cc29afd51151 Do not block when writing to pipes
Stefan Vogel <sv@exept.de>
parents: 7261
diff changeset
  1885
    <resource:#obsolete>
cc29afd51151 Do not block when writing to pipes
Stefan Vogel <sv@exept.de>
parents: 7261
diff changeset
  1886
cc29afd51151 Do not block when writing to pipes
Stefan Vogel <sv@exept.de>
parents: 7261
diff changeset
  1887
    self obsoleteMethodWarning:'use NonPositionableExternalStream makePTYPair'.
cc29afd51151 Do not block when writing to pipes
Stefan Vogel <sv@exept.de>
parents: 7261
diff changeset
  1888
cc29afd51151 Do not block when writing to pipes
Stefan Vogel <sv@exept.de>
parents: 7261
diff changeset
  1889
    ^ NonPositionableExternalStream makePTYPair.
cc29afd51151 Do not block when writing to pipes
Stefan Vogel <sv@exept.de>
parents: 7261
diff changeset
  1890
!
cc29afd51151 Do not block when writing to pipes
Stefan Vogel <sv@exept.de>
parents: 7261
diff changeset
  1891
cc29afd51151 Do not block when writing to pipes
Stefan Vogel <sv@exept.de>
parents: 7261
diff changeset
  1892
makePipe
cc29afd51151 Do not block when writing to pipes
Stefan Vogel <sv@exept.de>
parents: 7261
diff changeset
  1893
    "obsolete since 12-07-2003"
cc29afd51151 Do not block when writing to pipes
Stefan Vogel <sv@exept.de>
parents: 7261
diff changeset
  1894
    <resource:#obsolete>
cc29afd51151 Do not block when writing to pipes
Stefan Vogel <sv@exept.de>
parents: 7261
diff changeset
  1895
cc29afd51151 Do not block when writing to pipes
Stefan Vogel <sv@exept.de>
parents: 7261
diff changeset
  1896
    self obsoleteMethodWarning:'use NonPositionableExternalStream makePipe'.
cc29afd51151 Do not block when writing to pipes
Stefan Vogel <sv@exept.de>
parents: 7261
diff changeset
  1897
cc29afd51151 Do not block when writing to pipes
Stefan Vogel <sv@exept.de>
parents: 7261
diff changeset
  1898
    ^ NonPositionableExternalStream makePipe.
cc29afd51151 Do not block when writing to pipes
Stefan Vogel <sv@exept.de>
parents: 7261
diff changeset
  1899
! !
cc29afd51151 Do not block when writing to pipes
Stefan Vogel <sv@exept.de>
parents: 7261
diff changeset
  1900
7261
f35fc9cee675 method category rename
Claus Gittinger <cg@exept.de>
parents: 7195
diff changeset
  1901
!ExternalStream methodsFor:'Compatibility-Dolphin'!
6474
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6461
diff changeset
  1902
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6461
diff changeset
  1903
beText
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6461
diff changeset
  1904
    self text
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6461
diff changeset
  1905
! !
92a666c5b104 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6461
diff changeset
  1906
7261
f35fc9cee675 method category rename
Claus Gittinger <cg@exept.de>
parents: 7195
diff changeset
  1907
!ExternalStream methodsFor:'Compatibility-Squeak'!
3044
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3029
diff changeset
  1908
3872
cab901645d2a added #nextInto: and #readInto: for Squeak compatibility.
Claus Gittinger <cg@exept.de>
parents: 3863
diff changeset
  1909
nextInto:aByteArrayOrString
cab901645d2a added #nextInto: and #readInto: for Squeak compatibility.
Claus Gittinger <cg@exept.de>
parents: 3863
diff changeset
  1910
    "read elements into the argument, whose size determines the amount
cab901645d2a added #nextInto: and #readInto: for Squeak compatibility.
Claus Gittinger <cg@exept.de>
parents: 3863
diff changeset
  1911
     of bytes to read. If not enough elements could be read, return
cab901645d2a added #nextInto: and #readInto: for Squeak compatibility.
Claus Gittinger <cg@exept.de>
parents: 3863
diff changeset
  1912
     a copy of the argument; otherwise, return the filled argument."
cab901645d2a added #nextInto: and #readInto: for Squeak compatibility.
Claus Gittinger <cg@exept.de>
parents: 3863
diff changeset
  1913
cab901645d2a added #nextInto: and #readInto: for Squeak compatibility.
Claus Gittinger <cg@exept.de>
parents: 3863
diff changeset
  1914
    |n nWanted|
cab901645d2a added #nextInto: and #readInto: for Squeak compatibility.
Claus Gittinger <cg@exept.de>
parents: 3863
diff changeset
  1915
4368
d69568f9ad95 squeak compatibility fixes
Claus Gittinger <cg@exept.de>
parents: 4161
diff changeset
  1916
    nWanted := aByteArrayOrString byteSize.
3872
cab901645d2a added #nextInto: and #readInto: for Squeak compatibility.
Claus Gittinger <cg@exept.de>
parents: 3863
diff changeset
  1917
    n := self nextAvailableBytes:nWanted into:aByteArrayOrString startingAt:1.
cab901645d2a added #nextInto: and #readInto: for Squeak compatibility.
Claus Gittinger <cg@exept.de>
parents: 3863
diff changeset
  1918
    n == nWanted ifTrue:[^ aByteArrayOrString].
cab901645d2a added #nextInto: and #readInto: for Squeak compatibility.
Claus Gittinger <cg@exept.de>
parents: 3863
diff changeset
  1919
    ^ aByteArrayOrString copyTo:n
cab901645d2a added #nextInto: and #readInto: for Squeak compatibility.
Claus Gittinger <cg@exept.de>
parents: 3863
diff changeset
  1920
cab901645d2a added #nextInto: and #readInto: for Squeak compatibility.
Claus Gittinger <cg@exept.de>
parents: 3863
diff changeset
  1921
!
cab901645d2a added #nextInto: and #readInto: for Squeak compatibility.
Claus Gittinger <cg@exept.de>
parents: 3863
diff changeset
  1922
4368
d69568f9ad95 squeak compatibility fixes
Claus Gittinger <cg@exept.de>
parents: 4161
diff changeset
  1923
readInto:aContainer startingAt:index count:nElements
d69568f9ad95 squeak compatibility fixes
Claus Gittinger <cg@exept.de>
parents: 4161
diff changeset
  1924
    "same as #nextBytes:into:startingAt: for ByteArrays;
d69568f9ad95 squeak compatibility fixes
Claus Gittinger <cg@exept.de>
parents: 4161
diff changeset
  1925
     for LongArrays, nelements longs are read.
3872
cab901645d2a added #nextInto: and #readInto: for Squeak compatibility.
Claus Gittinger <cg@exept.de>
parents: 3863
diff changeset
  1926
     Squeak compatibility."
cab901645d2a added #nextInto: and #readInto: for Squeak compatibility.
Claus Gittinger <cg@exept.de>
parents: 3863
diff changeset
  1927
4368
d69568f9ad95 squeak compatibility fixes
Claus Gittinger <cg@exept.de>
parents: 4161
diff changeset
  1928
    |elementSize n|
d69568f9ad95 squeak compatibility fixes
Claus Gittinger <cg@exept.de>
parents: 4161
diff changeset
  1929
d69568f9ad95 squeak compatibility fixes
Claus Gittinger <cg@exept.de>
parents: 4161
diff changeset
  1930
    elementSize := aContainer class elementByteSize.
d69568f9ad95 squeak compatibility fixes
Claus Gittinger <cg@exept.de>
parents: 4161
diff changeset
  1931
    n := self nextBytes:nElements*elementSize into:aContainer startingAt:1.
d69568f9ad95 squeak compatibility fixes
Claus Gittinger <cg@exept.de>
parents: 4161
diff changeset
  1932
    ^ n // elementSize
3872
cab901645d2a added #nextInto: and #readInto: for Squeak compatibility.
Claus Gittinger <cg@exept.de>
parents: 3863
diff changeset
  1933
cab901645d2a added #nextInto: and #readInto: for Squeak compatibility.
Claus Gittinger <cg@exept.de>
parents: 3863
diff changeset
  1934
!
cab901645d2a added #nextInto: and #readInto: for Squeak compatibility.
Claus Gittinger <cg@exept.de>
parents: 3863
diff changeset
  1935
3044
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3029
diff changeset
  1936
readOnly
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3029
diff changeset
  1937
    "Squeak compatibility: make the stream readOnly"
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3029
diff changeset
  1938
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3029
diff changeset
  1939
    mode := #readonly
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3029
diff changeset
  1940
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3029
diff changeset
  1941
    "Modified: 20.10.1997 / 19:23:04 / cg"
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3029
diff changeset
  1942
    "Created: 20.10.1997 / 19:23:19 / cg"
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3029
diff changeset
  1943
! !
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3029
diff changeset
  1944
5187
4bf3787cc63a category renamining
Claus Gittinger <cg@exept.de>
parents: 5120
diff changeset
  1945
!ExternalStream methodsFor:'Signal constants'!
4bf3787cc63a category renamining
Claus Gittinger <cg@exept.de>
parents: 5120
diff changeset
  1946
4bf3787cc63a category renamining
Claus Gittinger <cg@exept.de>
parents: 5120
diff changeset
  1947
invalidReadSignal
4bf3787cc63a category renamining
Claus Gittinger <cg@exept.de>
parents: 5120
diff changeset
  1948
    ^ self class invalidReadSignal
4bf3787cc63a category renamining
Claus Gittinger <cg@exept.de>
parents: 5120
diff changeset
  1949
4bf3787cc63a category renamining
Claus Gittinger <cg@exept.de>
parents: 5120
diff changeset
  1950
    "Created: / 3.12.1998 / 15:12:06 / cg"
4bf3787cc63a category renamining
Claus Gittinger <cg@exept.de>
parents: 5120
diff changeset
  1951
!
4bf3787cc63a category renamining
Claus Gittinger <cg@exept.de>
parents: 5120
diff changeset
  1952
4bf3787cc63a category renamining
Claus Gittinger <cg@exept.de>
parents: 5120
diff changeset
  1953
invalidWriteSignal
4bf3787cc63a category renamining
Claus Gittinger <cg@exept.de>
parents: 5120
diff changeset
  1954
    ^ self class invalidWriteSignal
4bf3787cc63a category renamining
Claus Gittinger <cg@exept.de>
parents: 5120
diff changeset
  1955
4bf3787cc63a category renamining
Claus Gittinger <cg@exept.de>
parents: 5120
diff changeset
  1956
    "Created: / 3.12.1998 / 15:12:10 / cg"
4bf3787cc63a category renamining
Claus Gittinger <cg@exept.de>
parents: 5120
diff changeset
  1957
! !
4bf3787cc63a category renamining
Claus Gittinger <cg@exept.de>
parents: 5120
diff changeset
  1958
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1959
!ExternalStream methodsFor:'accessing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1960
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1961
binary
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1962
    "switch to binary mode - default is text"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1963
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1964
    binary := true
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1965
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1966
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1967
buffered:aBoolean
10
claus
parents: 5
diff changeset
  1968
    "turn buffering on or off - default is on"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1969
10
claus
parents: 5
diff changeset
  1970
    buffered := aBoolean
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1971
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1972
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1973
contents
2
claus
parents: 1
diff changeset
  1974
    "return the contents of the file from the current position up-to
claus
parents: 1
diff changeset
  1975
     the end. If the stream is in binary mode, a ByteArray containing
claus
parents: 1
diff changeset
  1976
     the byte values is returned.
claus
parents: 1
diff changeset
  1977
     In text-mode, a collection of strings, each representing one line,
claus
parents: 1
diff changeset
  1978
     is returned."
claus
parents: 1
diff changeset
  1979
claus
parents: 1
diff changeset
  1980
    |text l chunks sizes chunk byteCount cnt bytes offset|
claus
parents: 1
diff changeset
  1981
claus
parents: 1
diff changeset
  1982
    binary ifTrue:[
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1983
	"adding to a ByteArray produces quadratic time-space
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1984
	 behavior - therefore we allocate chunks, and concatenate them
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1985
	 at the end."
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1986
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1987
	chunks := OrderedCollection new.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1988
	sizes := OrderedCollection new.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1989
	byteCount := 0.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1990
	[self atEnd] whileFalse:[
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1991
	    chunk := ByteArray uninitializedNew:4096.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1992
	    cnt := self nextBytes:(chunk size) into:chunk.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1993
	    cnt notNil ifTrue:[
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1994
		chunks add:chunk.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1995
		sizes add:cnt.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1996
		byteCount := byteCount + cnt
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1997
	    ]
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1998
	].
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  1999
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2000
	"now, create one big ByteArray"
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2001
	bytes := ByteArray uninitializedNew:byteCount.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2002
	offset := 1.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2003
	1 to:chunks size do:[:index |
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2004
	    chunk := chunks at:index.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2005
	    cnt := sizes at:index.
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2006
	    bytes replaceFrom:offset to:(offset + cnt - 1) with:chunk.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2007
	    offset := offset + cnt
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2008
	].
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2009
	^ bytes
2
claus
parents: 1
diff changeset
  2010
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2011
244
9faa2da0650a Text <-> StringCollection
claus
parents: 223
diff changeset
  2012
    text := StringCollection new.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2013
    [self atEnd] whileFalse:[
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2014
	l := self nextLine.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2015
	l isNil ifTrue:[
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2016
	    ^ text
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2017
	].
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2018
	text add:l
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2019
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2020
    ^ text
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2021
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2022
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2023
contentsOfEntireFile
3938
4e7d1880336b oops - #contentsOfEntireFile must return a byteArray if in binaryMode.
Claus Gittinger <cg@exept.de>
parents: 3906
diff changeset
  2024
    "ST-80 compatibility: return contents as a String (or byteArray, if in binary mode).
3876
a680b41a014c comment
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  2025
     See also #contents, which returns the lines as stringCollection for text files."
1522
1d0b4bc2e563 ST-80 compatibility: #contentsOfEntireFile must return a String.
Stefan Vogel <sv@exept.de>
parents: 1515
diff changeset
  2026
6305
53b87502fc21 Fix #contentsOfEntireFile
Stefan Vogel <sv@exept.de>
parents: 6269
diff changeset
  2027
    binary ifTrue:[
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2028
	^ self contents.
3938
4e7d1880336b oops - #contentsOfEntireFile must return a byteArray if in binaryMode.
Claus Gittinger <cg@exept.de>
parents: 3906
diff changeset
  2029
    ].
6305
53b87502fc21 Fix #contentsOfEntireFile
Stefan Vogel <sv@exept.de>
parents: 6269
diff changeset
  2030
    ^ self upToEnd
1522
1d0b4bc2e563 ST-80 compatibility: #contentsOfEntireFile must return a String.
Stefan Vogel <sv@exept.de>
parents: 1515
diff changeset
  2031
3876
a680b41a014c comment
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  2032
    "Modified: / 3.7.1996 / 13:22:16 / stefan"
3938
4e7d1880336b oops - #contentsOfEntireFile must return a byteArray if in binaryMode.
Claus Gittinger <cg@exept.de>
parents: 3906
diff changeset
  2033
    "Modified: / 27.11.1998 / 16:29:43 / cg"
2
claus
parents: 1
diff changeset
  2034
!
claus
parents: 1
diff changeset
  2035
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2036
contentsSpecies
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2037
    "return the kind of object to be returned by sub-collection builders
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2038
     (such as upTo)"
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  2039
5441
e88302747bbd rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5431
diff changeset
  2040
    binary == true ifTrue:[
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2041
	^ ByteArray
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  2042
    ].
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2043
    ^ String
2
claus
parents: 1
diff changeset
  2044
!
claus
parents: 1
diff changeset
  2045
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2046
eolMode:aSymbolOrNil
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2047
    "specify how end-of-line (EOL) is to be marked.
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2048
     The argument may be one of:
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2049
	#crlf         -> add a CR-NL, as in MSDOS
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2050
	#cr           -> add a CR, as in VMS
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2051
	#nl           -> add a NL, as in Unix
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2052
	anyOther      -> like #nl
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2053
    "
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2054
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2055
    eolMode := aSymbolOrNil
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2056
!
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2057
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2058
fileDescriptor
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2059
    "return the fileDescriptor of the receiver -
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2060
     notice: this one returns the underlying OSs fileDescriptor -
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2061
     this may not be available on all platforms (i.e. non unix systems)."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2062
3971
aad506cdc5d9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3956
diff changeset
  2063
%{
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2064
    OBJ fp;
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2065
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  2066
    if ((fp = __INST(filePointer)) != nil) {
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2067
	FILEPOINTER f;
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2068
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2069
	f = __FILEVal(fp);
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2070
	RETURN ( __MKINT(fileno(f)) );
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2071
    }
1067
1e7959af0821 removed all NOCONTEXT (last version did no good - PROTECT-stack overflow ...)
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
  2072
%}.
5852
338c6e0cab8f rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5851
diff changeset
  2073
    filePointer isNil ifTrue:[^ self errorNotOpen].
338c6e0cab8f rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5851
diff changeset
  2074
    ^ self fileDescriptorOfFile:filePointer
338c6e0cab8f rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5851
diff changeset
  2075
!
338c6e0cab8f rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5851
diff changeset
  2076
338c6e0cab8f rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5851
diff changeset
  2077
fileDescriptorOfFile:filePointer
338c6e0cab8f rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5851
diff changeset
  2078
    "for migration to rel5 only:
338c6e0cab8f rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5851
diff changeset
  2079
     return the fileDescriptor of the argument filePointer -
338c6e0cab8f rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5851
diff changeset
  2080
     notice: this one returns the underlying OSs fileDescriptor -
338c6e0cab8f rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5851
diff changeset
  2081
     this may not be available on all platforms (i.e. non unix systems)."
338c6e0cab8f rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5851
diff changeset
  2082
338c6e0cab8f rel5 migration
Claus Gittinger <cg@exept.de>
parents: 5851
diff changeset
  2083
    self primitiveFailed
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2084
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2085
10455
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2086
fileHandle
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2087
    "return the fileHandle of the receiver.
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2088
     Under unix, this is the fileDescriptor; under windows, this is the Handle."
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2089
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2090
%{
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2091
    OBJ fp;
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2092
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2093
    if ((fp = __INST(filePointer)) != nil) {
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2094
	FILEPOINTER f;
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2095
	int fd;
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2096
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2097
	f = __FILEVal(fp);
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2098
	fd = fileno(f);
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2099
#ifdef WIN32
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2100
	{
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2101
	    HANDLE h;
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2102
	    h = _get_osfhandle(fd);
10459
45c792f3ca07 unix does not know about stx__mkExternalAddress()
Stefan Vogel <sv@exept.de>
parents: 10455
diff changeset
  2103
	    RETURN (__MKEXTERNALADDRESS(h));
10455
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2104
	}
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2105
#else
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2106
	RETURN ( __MKINT(fileno(f)) );
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2107
#endif
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2108
    }
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2109
%}.
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2110
    filePointer isNil ifTrue:[^ self errorNotOpen].
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2111
    ^ self fileHandleOfFile:filePointer
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2112
!
8a434bc03256 +fileHandle
Claus Gittinger <cg@exept.de>
parents: 10450
diff changeset
  2113
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2114
filePointer
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2115
    "return the filePointer of the receiver -
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2116
     notice: for portability stdio is used; this means you will get
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2117
     a FILE * - not a fileDescriptor.
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2118
     (what you really get is a corresponding integer).
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2119
     You cannot do much with the returned value
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2120
     - except passing it to a primitive, for example."
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2121
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2122
    ^ filePointer
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2123
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2124
5323
f4c3a230f42f more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  2125
lineEndCRLF
f4c3a230f42f more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  2126
    eolMode := #crlf
f4c3a230f42f more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  2127
!
f4c3a230f42f more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 5204
diff changeset
  2128
3016
42466b291fae more ST80 compatibility
ca
parents: 2999
diff changeset
  2129
lineEndTransparent
42466b291fae more ST80 compatibility
ca
parents: 2999
diff changeset
  2130
    eolMode := #cr
42466b291fae more ST80 compatibility
ca
parents: 2999
diff changeset
  2131
!
42466b291fae more ST80 compatibility
ca
parents: 2999
diff changeset
  2132
8069
fdf460457c96 acessing: pathName added (returns nil)
Michael Beyl <mb@exept.de>
parents: 8066
diff changeset
  2133
pathName
8511
eb02df149f42 Raise proceedable exception proceedable.
Stefan Vogel <sv@exept.de>
parents: 8472
diff changeset
  2134
    "answer the pathName of the stream.
eb02df149f42 Raise proceedable exception proceedable.
Stefan Vogel <sv@exept.de>
parents: 8472
diff changeset
  2135
     Only FileStreams know the pathName, so we return an empty string here"
eb02df149f42 Raise proceedable exception proceedable.
Stefan Vogel <sv@exept.de>
parents: 8472
diff changeset
  2136
eb02df149f42 Raise proceedable exception proceedable.
Stefan Vogel <sv@exept.de>
parents: 8472
diff changeset
  2137
    ^ ''
8069
fdf460457c96 acessing: pathName added (returns nil)
Michael Beyl <mb@exept.de>
parents: 8066
diff changeset
  2138
!
fdf460457c96 acessing: pathName added (returns nil)
Michael Beyl <mb@exept.de>
parents: 8066
diff changeset
  2139
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2140
readonly
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2141
    "set access mode to readonly"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2142
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2143
    mode := #readonly
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2144
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2145
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2146
readwrite
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2147
    "set access mode to readwrite"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2148
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2149
    mode := #readwrite
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2150
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2151
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2152
text
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2153
    "switch to text mode - default is text"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2154
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2155
    binary := false
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2156
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2157
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2158
useCRLF:aBoolean
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2159
    "turn on or off CRLF sending (instead of LF only) - default is off.
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2160
     This method is provided for backward compatibility - see #eolMode:
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2161
     which offers another choice."
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2162
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2163
    aBoolean ifTrue:[
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2164
	eolMode := #crlf
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2165
    ] ifFalse:[
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2166
	eolMode := #nl
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2167
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2168
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2169
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2170
writeonly
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2171
    "set access mode to writeonly"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2172
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2173
    mode := #writeonly
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2174
! !
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2175
8966
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  2176
!ExternalStream methodsFor:'closing'!
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  2177
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  2178
close
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  2179
    "close the stream - tell operating system"
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  2180
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  2181
    self isOpen ifTrue:[
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  2182
	Lobby unregister:self.
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  2183
	self closeFile.
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  2184
    ]
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  2185
!
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  2186
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  2187
shutDown
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  2188
    "close the stream - added for protocol compatibility with PipeStream.
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  2189
     see comment there"
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  2190
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  2191
    self isOpen ifTrue:[
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  2192
	Lobby unregister:self.
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  2193
	self closeFile
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  2194
    ]
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  2195
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  2196
    "Modified: 30.8.1996 / 00:39:21 / cg"
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  2197
! !
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  2198
10982
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  2199
!ExternalStream methodsFor:'copying'!
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  2200
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  2201
copy
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  2202
    "answer a copy of myself.
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  2203
     Have to dup the filedescriptor"
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  2204
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  2205
    |copy|
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  2206
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  2207
    copy := super copy.
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  2208
    copy dupFd.
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  2209
    Lobby register:copy.
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  2210
    ^ copy
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  2211
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  2212
    "
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  2213
       |stream1 stream2|
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  2214
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  2215
       stream1 := Filename newTemporary writeStream.
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  2216
       stream2 := stream1 copy.
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  2217
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  2218
       stream1 inspect.
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  2219
       stream2 inspect.
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  2220
    "
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  2221
! !
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  2222
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2223
!ExternalStream methodsFor:'error handling'!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2224
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2225
argumentMustBeCharacter
1119
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2226
    "{ Pragma: +optSpace }"
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2227
8209
908ba4b9543e check for written characters to be in 00..FF
Claus Gittinger <cg@exept.de>
parents: 8074
diff changeset
  2228
    "report an error, that the argument must be a character in 0..FF"
908ba4b9543e check for written characters to be in 00..FF
Claus Gittinger <cg@exept.de>
parents: 8074
diff changeset
  2229
908ba4b9543e check for written characters to be in 00..FF
Claus Gittinger <cg@exept.de>
parents: 8074
diff changeset
  2230
    ^ self error:'argument must be a single byte character'
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2231
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2232
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2233
argumentMustBeInteger
1119
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2234
    "{ Pragma: +optSpace }"
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2235
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2236
    "report an error, that the argument must be an integer"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2237
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2238
    ^ self error:'argument must be an integer'
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2239
!
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
  2240
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2241
argumentMustBeString
1119
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2242
    "{ Pragma: +optSpace }"
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2243
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2244
    "report an error, that the argument must be a string"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2245
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2246
    ^ self error:'argument must be a string'
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2247
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2248
4526
a42dc8e09586 errorOpen renamed to errorAlreadyOpen
Claus Gittinger <cg@exept.de>
parents: 4468
diff changeset
  2249
errorAlreadyOpen
a42dc8e09586 errorOpen renamed to errorAlreadyOpen
Claus Gittinger <cg@exept.de>
parents: 4468
diff changeset
  2250
    "{ Pragma: +optSpace }"
a42dc8e09586 errorOpen renamed to errorAlreadyOpen
Claus Gittinger <cg@exept.de>
parents: 4468
diff changeset
  2251
a42dc8e09586 errorOpen renamed to errorAlreadyOpen
Claus Gittinger <cg@exept.de>
parents: 4468
diff changeset
  2252
    "report an error, that the stream is already opened"
a42dc8e09586 errorOpen renamed to errorAlreadyOpen
Claus Gittinger <cg@exept.de>
parents: 4468
diff changeset
  2253
8074
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  2254
    ^ OpenError
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2255
	raiseRequestWith:self
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2256
	errorString:' - stream is already open'
8511
eb02df149f42 Raise proceedable exception proceedable.
Stefan Vogel <sv@exept.de>
parents: 8472
diff changeset
  2257
eb02df149f42 Raise proceedable exception proceedable.
Stefan Vogel <sv@exept.de>
parents: 8472
diff changeset
  2258
    "
eb02df149f42 Raise proceedable exception proceedable.
Stefan Vogel <sv@exept.de>
parents: 8472
diff changeset
  2259
      self new errorAlreadyOpen
eb02df149f42 Raise proceedable exception proceedable.
Stefan Vogel <sv@exept.de>
parents: 8472
diff changeset
  2260
    "
4526
a42dc8e09586 errorOpen renamed to errorAlreadyOpen
Claus Gittinger <cg@exept.de>
parents: 4468
diff changeset
  2261
a42dc8e09586 errorOpen renamed to errorAlreadyOpen
Claus Gittinger <cg@exept.de>
parents: 4468
diff changeset
  2262
    "Modified: / 8.5.1999 / 20:12:30 / cg"
a42dc8e09586 errorOpen renamed to errorAlreadyOpen
Claus Gittinger <cg@exept.de>
parents: 4468
diff changeset
  2263
!
a42dc8e09586 errorOpen renamed to errorAlreadyOpen
Claus Gittinger <cg@exept.de>
parents: 4468
diff changeset
  2264
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2265
errorBinary
1119
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2266
    "{ Pragma: +optSpace }"
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2267
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2268
    "report an error, that the stream is in binary mode"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2269
8074
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  2270
    ^ InvalidModeError
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2271
	raiseRequestWith:self
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2272
	errorString:(self class name , ' is in binary mode')
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2273
	"/ in:thisContext sender
4161
3f2758cfeff5 raise errors in thisContext (not in sender context)
Claus Gittinger <cg@exept.de>
parents: 4152
diff changeset
  2274
3f2758cfeff5 raise errors in thisContext (not in sender context)
Claus Gittinger <cg@exept.de>
parents: 4152
diff changeset
  2275
    "Modified: / 8.5.1999 / 20:12:43 / cg"
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2276
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2277
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2278
errorNotBinary
1119
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2279
    "{ Pragma: +optSpace }"
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2280
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2281
    "report an error, that the stream is not in binary mode"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2282
8074
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  2283
    ^ InvalidModeError
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2284
	raiseRequestWith:self
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2285
	errorString:(self class name , ' is not in binary mode')
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2286
	"/ in:thisContext sender
4161
3f2758cfeff5 raise errors in thisContext (not in sender context)
Claus Gittinger <cg@exept.de>
parents: 4152
diff changeset
  2287
3f2758cfeff5 raise errors in thisContext (not in sender context)
Claus Gittinger <cg@exept.de>
parents: 4152
diff changeset
  2288
    "Modified: / 8.5.1999 / 20:12:40 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2289
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2290
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2291
errorNotBuffered
1119
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2292
    "{ Pragma: +optSpace }"
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2293
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2294
    "report an error, that the stream is not in buffered mode"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2295
8074
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  2296
    ^ StreamError
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2297
	raiseRequestWith:self
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2298
	errorString:(self class name , ' is unbuffered - operation not allowed')
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2299
	"/ in:thisContext sender
4161
3f2758cfeff5 raise errors in thisContext (not in sender context)
Claus Gittinger <cg@exept.de>
parents: 4152
diff changeset
  2300
3f2758cfeff5 raise errors in thisContext (not in sender context)
Claus Gittinger <cg@exept.de>
parents: 4152
diff changeset
  2301
    "Modified: / 8.5.1999 / 20:12:36 / cg"
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2302
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2303
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2304
errorNotOpen
1119
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2305
    "{ Pragma: +optSpace }"
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2306
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2307
    "report an error, that the stream has not been opened"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2308
8511
eb02df149f42 Raise proceedable exception proceedable.
Stefan Vogel <sv@exept.de>
parents: 8472
diff changeset
  2309
    ^ StreamNotOpenError raiseRequestWith:self  "/ in:thisContext sender
4161
3f2758cfeff5 raise errors in thisContext (not in sender context)
Claus Gittinger <cg@exept.de>
parents: 4152
diff changeset
  2310
3f2758cfeff5 raise errors in thisContext (not in sender context)
Claus Gittinger <cg@exept.de>
parents: 4152
diff changeset
  2311
    "Modified: / 8.5.1999 / 20:12:33 / cg"
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2312
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2313
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2314
errorReadOnly
1119
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2315
    "{ Pragma: +optSpace }"
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2316
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2317
    "report an error, that the stream is a readOnly stream"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2318
8511
eb02df149f42 Raise proceedable exception proceedable.
Stefan Vogel <sv@exept.de>
parents: 8472
diff changeset
  2319
    ^ InvalidWriteSignal raiseRequestWith:self "/ in:thisContext sender
4161
3f2758cfeff5 raise errors in thisContext (not in sender context)
Claus Gittinger <cg@exept.de>
parents: 4152
diff changeset
  2320
4468
8c67b4f973d8 raise vs. raiseRequest
Claus Gittinger <cg@exept.de>
parents: 4456
diff changeset
  2321
    "Modified: / 30.7.1999 / 17:08:19 / cg"
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2322
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2323
6255
d68343dc8288 Define #errorReporter and #reportError: (ST-80 protocol)
Stefan Vogel <sv@exept.de>
parents: 6012
diff changeset
  2324
errorReporter
d68343dc8288 Define #errorReporter and #reportError: (ST-80 protocol)
Stefan Vogel <sv@exept.de>
parents: 6012
diff changeset
  2325
    "ST-80 mimicry."
d68343dc8288 Define #errorReporter and #reportError: (ST-80 protocol)
Stefan Vogel <sv@exept.de>
parents: 6012
diff changeset
  2326
6269
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  2327
    ^ self class
6255
d68343dc8288 Define #errorReporter and #reportError: (ST-80 protocol)
Stefan Vogel <sv@exept.de>
parents: 6012
diff changeset
  2328
!
d68343dc8288 Define #errorReporter and #reportError: (ST-80 protocol)
Stefan Vogel <sv@exept.de>
parents: 6012
diff changeset
  2329
932
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  2330
errorUnsupportedOperation
1119
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2331
    "{ Pragma: +optSpace }"
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2332
932
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  2333
    "report an error, that some unsupported operation was attempted"
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  2334
8511
eb02df149f42 Raise proceedable exception proceedable.
Stefan Vogel <sv@exept.de>
parents: 8472
diff changeset
  2335
    ^ InvalidOperationError raiseRequestWith:self  "/ in:thisContext sender
4161
3f2758cfeff5 raise errors in thisContext (not in sender context)
Claus Gittinger <cg@exept.de>
parents: 4152
diff changeset
  2336
3f2758cfeff5 raise errors in thisContext (not in sender context)
Claus Gittinger <cg@exept.de>
parents: 4152
diff changeset
  2337
    "Modified: / 8.5.1999 / 20:12:24 / cg"
932
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  2338
!
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  2339
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2340
errorWriteOnly
1119
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2341
    "{ Pragma: +optSpace }"
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2342
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2343
    "report an error, that the stream is a writeOnly stream"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2344
8511
eb02df149f42 Raise proceedable exception proceedable.
Stefan Vogel <sv@exept.de>
parents: 8472
diff changeset
  2345
    ^ InvalidReadError raiseRequestWith:self  "/ in:thisContext sender
4161
3f2758cfeff5 raise errors in thisContext (not in sender context)
Claus Gittinger <cg@exept.de>
parents: 4152
diff changeset
  2346
3f2758cfeff5 raise errors in thisContext (not in sender context)
Claus Gittinger <cg@exept.de>
parents: 4152
diff changeset
  2347
    "Modified: / 8.5.1999 / 20:12:20 / cg"
2
claus
parents: 1
diff changeset
  2348
!
claus
parents: 1
diff changeset
  2349
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2350
ioError
1119
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2351
    "{ Pragma: +optSpace }"
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2352
3474
1af4d150dab4 added extra streamIOError signal.
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
  2353
    "report an error, that some I/O error occured.
1af4d150dab4 added extra streamIOError signal.
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
  2354
     (for example, a device-IO-error, or reading an NFS-dir,
1af4d150dab4 added extra streamIOError signal.
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
  2355
     which is no longer available and has been mounted soft)"
1af4d150dab4 added extra streamIOError signal.
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
  2356
8074
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  2357
    ^ StreamIOError
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2358
	raiseRequestWith:self
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2359
	errorString:(' : ' , self lastErrorString)
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2360
	"/ in:thisContext sender
4161
3f2758cfeff5 raise errors in thisContext (not in sender context)
Claus Gittinger <cg@exept.de>
parents: 4152
diff changeset
  2361
3f2758cfeff5 raise errors in thisContext (not in sender context)
Claus Gittinger <cg@exept.de>
parents: 4152
diff changeset
  2362
    "Modified: / 8.5.1999 / 20:12:16 / cg"
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2363
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2364
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2365
lastErrorNumber
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2366
    "return the last error"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2367
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2368
    ^ lastErrorNumber
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2369
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2370
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2371
lastErrorString
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2372
    "return a message string describing the last error"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2373
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2374
    (lastErrorNumber isNil or:[lastErrorNumber == 0]) ifTrue:[
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2375
	^ 'I/O error'
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2376
    ].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2377
    ^ OperatingSystem errorTextForNumber:lastErrorNumber
2
claus
parents: 1
diff changeset
  2378
!
claus
parents: 1
diff changeset
  2379
10932
c9148f19b2ea add #lastErrorSymbol
Stefan Vogel <sv@exept.de>
parents: 10852
diff changeset
  2380
lastErrorSymbol
c9148f19b2ea add #lastErrorSymbol
Stefan Vogel <sv@exept.de>
parents: 10852
diff changeset
  2381
    "return an error symbol describing the last error"
c9148f19b2ea add #lastErrorSymbol
Stefan Vogel <sv@exept.de>
parents: 10852
diff changeset
  2382
c9148f19b2ea add #lastErrorSymbol
Stefan Vogel <sv@exept.de>
parents: 10852
diff changeset
  2383
    ^ OperatingSystem errorSymbolForNumber:lastErrorNumber
c9148f19b2ea add #lastErrorSymbol
Stefan Vogel <sv@exept.de>
parents: 10852
diff changeset
  2384
!
c9148f19b2ea add #lastErrorSymbol
Stefan Vogel <sv@exept.de>
parents: 10852
diff changeset
  2385
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2386
openError
1119
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2387
    "{ Pragma: +optSpace }"
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2388
8007
adfabcb563e0 openError backWard compatibility.
Claus Gittinger <cg@exept.de>
parents: 7887
diff changeset
  2389
    "/ for backward compatibility, use:
adfabcb563e0 openError backWard compatibility.
Claus Gittinger <cg@exept.de>
parents: 7887
diff changeset
  2390
    "/ self class openErrorSignal isHandled ifFalse:[^ nil].
adfabcb563e0 openError backWard compatibility.
Claus Gittinger <cg@exept.de>
parents: 7887
diff changeset
  2391
8008
e80739d6c312 openError backWard compatibility.
Claus Gittinger <cg@exept.de>
parents: 8007
diff changeset
  2392
    "/ or even:
e80739d6c312 openError backWard compatibility.
Claus Gittinger <cg@exept.de>
parents: 8007
diff changeset
  2393
    "/ ^ nil.
e80739d6c312 openError backWard compatibility.
Claus Gittinger <cg@exept.de>
parents: 8007
diff changeset
  2394
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2395
    "report an error, that the open failed"
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2396
    ^ OpenError
11396
cf8df63632da changed #openError raise with stream as parameter
Stefan Vogel <sv@exept.de>
parents: 10997
diff changeset
  2397
        raiseRequestWith:self
10852
e8dd1b4af8da always pass the pathname as a string to the OpenError
Claus Gittinger <cg@exept.de>
parents: 10552
diff changeset
  2398
        errorString:(' : ' , self lastErrorString)
e8dd1b4af8da always pass the pathname as a string to the OpenError
Claus Gittinger <cg@exept.de>
parents: 10552
diff changeset
  2399
        "/ in:thisContext sender
3235
cc254b307159 FileStream redefines #openErrorSignal.
Stefan Vogel <sv@exept.de>
parents: 3221
diff changeset
  2400
cc254b307159 FileStream redefines #openErrorSignal.
Stefan Vogel <sv@exept.de>
parents: 3221
diff changeset
  2401
    "Modified: / 28.1.1998 / 14:37:42 / stefan"
4161
3f2758cfeff5 raise errors in thisContext (not in sender context)
Claus Gittinger <cg@exept.de>
parents: 4152
diff changeset
  2402
    "Modified: / 8.5.1999 / 20:12:12 / cg"
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2403
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2404
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2405
readError
1119
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2406
    "{ Pragma: +optSpace }"
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2407
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2408
    "report an error, that some read error occured"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2409
8074
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  2410
    ^ ReadError
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2411
	raiseRequestWith:self
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2412
	errorString:(' : ' , self lastErrorString)
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2413
	"/ in:thisContext sender
4161
3f2758cfeff5 raise errors in thisContext (not in sender context)
Claus Gittinger <cg@exept.de>
parents: 4152
diff changeset
  2414
3f2758cfeff5 raise errors in thisContext (not in sender context)
Claus Gittinger <cg@exept.de>
parents: 4152
diff changeset
  2415
    "Modified: / 8.5.1999 / 20:12:00 / cg"
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2416
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2417
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2418
writeError
1119
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2419
    "{ Pragma: +optSpace }"
956d62a5656c compile seldom used methods with optSpace (is this a good idea ?)
Claus Gittinger <cg@exept.de>
parents: 1079
diff changeset
  2420
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2421
    "report an error, that some write error occured"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2422
8074
4dce05d6d0a1 class based exceptions
Claus Gittinger <cg@exept.de>
parents: 8070
diff changeset
  2423
    ^ WriteError
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2424
	raiseRequestWith:self
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2425
	errorString:(' : ' , self lastErrorString)
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2426
	"/ in:thisContext sender
4161
3f2758cfeff5 raise errors in thisContext (not in sender context)
Claus Gittinger <cg@exept.de>
parents: 4152
diff changeset
  2427
3f2758cfeff5 raise errors in thisContext (not in sender context)
Claus Gittinger <cg@exept.de>
parents: 4152
diff changeset
  2428
    "Modified: / 8.5.1999 / 20:12:09 / cg"
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2429
! !
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2430
6461
f5efaff3457b Allow #registerForFinalization for classes defining their own Lobby.
Stefan Vogel <sv@exept.de>
parents: 6441
diff changeset
  2431
!ExternalStream methodsFor:'finalization'!
f5efaff3457b Allow #registerForFinalization for classes defining their own Lobby.
Stefan Vogel <sv@exept.de>
parents: 6441
diff changeset
  2432
f5efaff3457b Allow #registerForFinalization for classes defining their own Lobby.
Stefan Vogel <sv@exept.de>
parents: 6441
diff changeset
  2433
finalizationLobby
f5efaff3457b Allow #registerForFinalization for classes defining their own Lobby.
Stefan Vogel <sv@exept.de>
parents: 6441
diff changeset
  2434
    "answer the registry used for finalization.
f5efaff3457b Allow #registerForFinalization for classes defining their own Lobby.
Stefan Vogel <sv@exept.de>
parents: 6441
diff changeset
  2435
     ExternalStreams have their own Registry"
f5efaff3457b Allow #registerForFinalization for classes defining their own Lobby.
Stefan Vogel <sv@exept.de>
parents: 6441
diff changeset
  2436
f5efaff3457b Allow #registerForFinalization for classes defining their own Lobby.
Stefan Vogel <sv@exept.de>
parents: 6441
diff changeset
  2437
    ^ Lobby
f5efaff3457b Allow #registerForFinalization for classes defining their own Lobby.
Stefan Vogel <sv@exept.de>
parents: 6441
diff changeset
  2438
!
f5efaff3457b Allow #registerForFinalization for classes defining their own Lobby.
Stefan Vogel <sv@exept.de>
parents: 6441
diff changeset
  2439
f5efaff3457b Allow #registerForFinalization for classes defining their own Lobby.
Stefan Vogel <sv@exept.de>
parents: 6441
diff changeset
  2440
finalize
f5efaff3457b Allow #registerForFinalization for classes defining their own Lobby.
Stefan Vogel <sv@exept.de>
parents: 6441
diff changeset
  2441
    "some Stream has been collected - close the file if not already done"
f5efaff3457b Allow #registerForFinalization for classes defining their own Lobby.
Stefan Vogel <sv@exept.de>
parents: 6441
diff changeset
  2442
f5efaff3457b Allow #registerForFinalization for classes defining their own Lobby.
Stefan Vogel <sv@exept.de>
parents: 6441
diff changeset
  2443
    self closeFile
f5efaff3457b Allow #registerForFinalization for classes defining their own Lobby.
Stefan Vogel <sv@exept.de>
parents: 6441
diff changeset
  2444
! !
f5efaff3457b Allow #registerForFinalization for classes defining their own Lobby.
Stefan Vogel <sv@exept.de>
parents: 6441
diff changeset
  2445
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2446
!ExternalStream methodsFor:'instance release'!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2447
6441
2be4aa0d2991 Use #finalize instead of #disposed
Stefan Vogel <sv@exept.de>
parents: 6305
diff changeset
  2448
executor
2be4aa0d2991 Use #finalize instead of #disposed
Stefan Vogel <sv@exept.de>
parents: 6305
diff changeset
  2449
    "return a copy for finalization-registration;
2be4aa0d2991 Use #finalize instead of #disposed
Stefan Vogel <sv@exept.de>
parents: 6305
diff changeset
  2450
     since all we need at finalization time is the fileDescriptor,
2be4aa0d2991 Use #finalize instead of #disposed
Stefan Vogel <sv@exept.de>
parents: 6305
diff changeset
  2451
     a cheaper copy is possible."
2be4aa0d2991 Use #finalize instead of #disposed
Stefan Vogel <sv@exept.de>
parents: 6305
diff changeset
  2452
2be4aa0d2991 Use #finalize instead of #disposed
Stefan Vogel <sv@exept.de>
parents: 6305
diff changeset
  2453
    ^ self class basicNew setFilePointer:filePointer
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2454
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2455
2
claus
parents: 1
diff changeset
  2456
!ExternalStream methodsFor:'line reading/writing'!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2457
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2458
nextLine
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2459
    "read the next line (characters up to newline).
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2460
     Return a string containing those characters excluding the newline.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2461
     If the previous-to-last character is a cr, this is also removed,
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2462
     so its possible to read alien (i.e. ms-dos) text as well.
2120
71c1870df7ba implemented 1-character readAhead for unbuffered streams;
Claus Gittinger <cg@exept.de>
parents: 2045
diff changeset
  2463
     The line must be shorter than 16K characters - otherwise an error is signalled."
71c1870df7ba implemented 1-character readAhead for unbuffered streams;
Claus Gittinger <cg@exept.de>
parents: 2045
diff changeset
  2464
71c1870df7ba implemented 1-character readAhead for unbuffered streams;
Claus Gittinger <cg@exept.de>
parents: 2045
diff changeset
  2465
    |line|
971
eb70f5674303 max lineLength (in nextLine) increased to 16k
Claus Gittinger <cg@exept.de>
parents: 933
diff changeset
  2466
3029
aa14768e0e6a larger lineBuffer in #nextLine
Claus Gittinger <cg@exept.de>
parents: 3016
diff changeset
  2467
%{  /* STACK:34000 */
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2468
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  2469
    FILEPOINTER f;
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  2470
    int len, ret;
3029
aa14768e0e6a larger lineBuffer in #nextLine
Claus Gittinger <cg@exept.de>
parents: 3016
diff changeset
  2471
    char buffer[32*1024];
521
70533ec40482 use new MKSTRING_L if length is known (avoids a useless strlen)
Claus Gittinger <cg@exept.de>
parents: 481
diff changeset
  2472
    char *rslt, *nextPtr, *limit;
22
847106305963 *** empty log message ***
claus
parents: 12
diff changeset
  2473
    int fd, ch;
1068
92fdcccf12a3 alles MIST - zurueck zu 1.89 und NOCONTEXT entfernt
Claus Gittinger <cg@exept.de>
parents: 1067
diff changeset
  2474
    int _buffered;
216
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  2475
    OBJ fp;
2120
71c1870df7ba implemented 1-character readAhead for unbuffered streams;
Claus Gittinger <cg@exept.de>
parents: 2045
diff changeset
  2476
    int lineTooLong = 0;
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2477
    int cutOff = 0;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2478
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  2479
    __INST(lastErrorNumber) = nil;
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  2480
    if (((fp = __INST(filePointer)) != nil)
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2481
	&& (__INST(mode) != @symbol(writeonly))
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2482
	&& (__INST(binary) != true)
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  2483
    ) {
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2484
	f = __FILEVal(fp);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2485
	buffer[0] = '\0';
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2486
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2487
	_buffered = (__INST(buffered) == true);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2488
	if (_buffered) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2489
	    __READING__(f);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2490
	}
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2491
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2492
	rslt = nextPtr = buffer;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2493
	limit = buffer + sizeof(buffer) - 2;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2494
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2495
	for (;;) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2496
	    __READBYTE__(ret, f, nextPtr, _buffered);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2497
	    if (ret <= 0) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2498
		if (nextPtr == buffer)
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2499
		    rslt = NULL;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2500
		if (ret == 0) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2501
		    __INST(hitEOF) = true;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2502
		    break;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2503
		} else {
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2504
		    __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2505
		    goto err;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2506
		}
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2507
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2508
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2509
	    if (*nextPtr == '\n') {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2510
		cutOff = 1;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2511
		*nextPtr = '\0';
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2512
		break;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2513
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2514
	    if (*nextPtr == '\r') {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2515
		char peekChar;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2516
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2517
		/*
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2518
		 * peek ahead for a newLine ...
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2519
		 */
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2520
		__READBYTE__(ret, f, &peekChar, _buffered);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2521
		if (ret <= 0) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2522
		    cutOff = 1;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2523
		    *nextPtr = '\0';
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2524
		    if (ret == 0) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2525
			__INST(hitEOF) = true;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2526
			break;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2527
		    }
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2528
		    __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2529
		    goto err;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2530
		}
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2531
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2532
		if (peekChar == '\n') {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2533
		    cutOff = 2;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2534
		    *nextPtr = '\0';
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2535
		    break;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2536
		}
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2537
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2538
		__UNGETC__(peekChar, f, _buffered);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2539
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2540
		cutOff = 1;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2541
		*nextPtr = '\0';
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2542
		break;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2543
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2544
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2545
	    nextPtr++;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2546
	    if (nextPtr >= limit) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2547
		*nextPtr = '\0';
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2548
		lineTooLong = 1;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2549
		if (@global(InfoPrinting) == true) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2550
		    fprintf(stderr, "ExtStream [warning]: line truncated in nextLine\n");
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2551
		}
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2552
		break;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2553
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2554
	}
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2555
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2556
	if (rslt != NULL) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2557
	    len = nextPtr-buffer;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2558
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2559
	    if (__isSmallInteger(__INST(position))) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2560
		INT np = __intVal(__INST(position)) + len + cutOff;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2561
		OBJ t;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2562
8881
53e94478133f STORE macro fix (gcc3.4 bug)
Claus Gittinger <cg@exept.de>
parents: 8818
diff changeset
  2563
		t = __MKINT(np); __INST(position) = t; __STORE(self, t);
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2564
	    } else {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2565
		__INST(position) = nil; /* i.e. do not know */
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2566
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2567
	    /* remove any EOL character */
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2568
	    if (len != 0) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2569
		if (buffer[len-1] == '\n') {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2570
		    buffer[--len] = '\0';
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2571
		}
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2572
		if ((len != 0) && (buffer[len-1] == '\r')) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2573
		    buffer[--len] = '\0';
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2574
		}
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2575
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2576
	    line = __MKSTRING_L(buffer, len);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2577
	    if (! lineTooLong) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2578
		RETURN ( line );
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2579
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2580
	}
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2581
    }
1478
aae07192b7d1 labels in empty statements need a semi
Claus Gittinger <cg@exept.de>
parents: 1469
diff changeset
  2582
err: ;
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  2583
%}.
2120
71c1870df7ba implemented 1-character readAhead for unbuffered streams;
Claus Gittinger <cg@exept.de>
parents: 2045
diff changeset
  2584
    line notNil ifTrue:[
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2585
	"/ the line as read is longer than 32k characters (boy - what a line)
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2586
	"/ The exception could be handled by reading more and returning the
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2587
	"/ concatenation in your exception handler (the receiver and the partial
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2588
	"/ line are passed as parameter)
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2589
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2590
	LineTooLongErrorSignal isHandled ifTrue:[
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2591
	    ^ LineTooLongErrorSignal
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2592
		raiseRequestWith:(Array with:self with:line)
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2593
		     errorString:('line too long read error')
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2594
	].
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2595
	^ line , self nextLine
2120
71c1870df7ba implemented 1-character readAhead for unbuffered streams;
Claus Gittinger <cg@exept.de>
parents: 2045
diff changeset
  2596
    ].
71c1870df7ba implemented 1-character readAhead for unbuffered streams;
Claus Gittinger <cg@exept.de>
parents: 2045
diff changeset
  2597
8614
88421fbd4ab6 pastEnd -> pastEndRead
Claus Gittinger <cg@exept.de>
parents: 8604
diff changeset
  2598
    (hitEOF == true) ifTrue:[^ self pastEndRead].
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  2599
    lastErrorNumber notNil ifTrue:[^ self readError].
2
claus
parents: 1
diff changeset
  2600
    filePointer isNil ifTrue:[^ self errorNotOpen].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2601
    (mode == #writeonly) ifTrue:[^ self errorWriteOnly].
5431
24ce291c71f2 migration support
Claus Gittinger <cg@exept.de>
parents: 5430
diff changeset
  2602
    (binary == true) ifTrue:[^ self errorBinary].
24ce291c71f2 migration support
Claus Gittinger <cg@exept.de>
parents: 5430
diff changeset
  2603
    ^ super nextLine
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2604
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2605
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2606
nextPutLine:aString
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2607
    "write the characters in aString and append an end-of-Line marker
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2608
     (LF, CR or CRLF - depending in the setting of eolMode)"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2609
1067
1e7959af0821 removed all NOCONTEXT (last version did no good - PROTECT-stack overflow ...)
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
  2610
%{
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  2611
    FILEPOINTER f;
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  2612
    int len, cnt, len1, _buffered;
7875
eb7d48b0425d made all position-handling code 32bit save
Claus Gittinger <cg@exept.de>
parents: 7832
diff changeset
  2613
    OBJ fp;
537
dc4dad8a5ddd many ExtStream rewrites - has to be reevaluated in all platforms
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  2614
    char *cp;
2513
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  2615
    int o_offs;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2616
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  2617
    __INST(lastErrorNumber) = nil;
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2618
    if (((fp = __INST(filePointer)) != nil)
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2619
	&& (__INST(mode) != @symbol(readonly))
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2620
	&& (__INST(binary) != true)
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2621
	&& __isString(aString)
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  2622
    ) {
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2623
	f = __FILEVal(fp);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2624
	len = __stringSize(aString);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2625
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2626
	if (_buffered = (__INST(buffered) == true)) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2627
	    __WRITING__(f)
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2628
	}
9053
f3f3d48d6f44 fix writing to stdout/stderr for winstx non-console operation
Claus Gittinger <cg@exept.de>
parents: 9024
diff changeset
  2629
#ifdef WIN32
10328
ad731a7584a3 ensure that win32_fwrite is used for stdout and stderr
Claus Gittinger <cg@exept.de>
parents: 9053
diff changeset
  2630
	if ((f == __win32_stdout()) || (f == __win32_stderr())) {
ad731a7584a3 ensure that win32_fwrite is used for stdout and stderr
Claus Gittinger <cg@exept.de>
parents: 9053
diff changeset
  2631
	    cnt = __win32_fwrite(__stringVal(aString), 1, len, f);
9053
f3f3d48d6f44 fix writing to stdout/stderr for winstx non-console operation
Claus Gittinger <cg@exept.de>
parents: 9024
diff changeset
  2632
	} else
f3f3d48d6f44 fix writing to stdout/stderr for winstx non-console operation
Claus Gittinger <cg@exept.de>
parents: 9024
diff changeset
  2633
#endif
f3f3d48d6f44 fix writing to stdout/stderr for winstx non-console operation
Claus Gittinger <cg@exept.de>
parents: 9024
diff changeset
  2634
	{
2513
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  2635
#ifdef BUGGY
9053
f3f3d48d6f44 fix writing to stdout/stderr for winstx non-console operation
Claus Gittinger <cg@exept.de>
parents: 9024
diff changeset
  2636
	    __WRITEBYTES__(cnt, f, __stringVal(aString), len, _buffered);
2513
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  2637
#else
9053
f3f3d48d6f44 fix writing to stdout/stderr for winstx non-console operation
Claus Gittinger <cg@exept.de>
parents: 9024
diff changeset
  2638
	    o_offs = (char *)__stringVal(aString)-(char *)aString;
f3f3d48d6f44 fix writing to stdout/stderr for winstx non-console operation
Claus Gittinger <cg@exept.de>
parents: 9024
diff changeset
  2639
	    __WRITEBYTES_OBJ__(cnt, f, aString, o_offs, len, _buffered);
2513
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  2640
#endif
9053
f3f3d48d6f44 fix writing to stdout/stderr for winstx non-console operation
Claus Gittinger <cg@exept.de>
parents: 9024
diff changeset
  2641
	}
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2642
	if (cnt == len) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2643
	    OBJ mode = __INST(eolMode);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2644
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2645
	    len1 = len;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2646
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2647
	    if (mode == @symbol(cr)) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2648
		cp = "\r"; len = 1;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2649
	    } else if (mode == @symbol(crlf)) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2650
		cp = "\r\n"; len = 2;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2651
	    } else {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2652
		cp = "\n"; len = 1;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2653
	    }
9053
f3f3d48d6f44 fix writing to stdout/stderr for winstx non-console operation
Claus Gittinger <cg@exept.de>
parents: 9024
diff changeset
  2654
#ifdef WIN32
10328
ad731a7584a3 ensure that win32_fwrite is used for stdout and stderr
Claus Gittinger <cg@exept.de>
parents: 9053
diff changeset
  2655
	    if ((f == __win32_stdout()) || (f == __win32_stderr())) {
ad731a7584a3 ensure that win32_fwrite is used for stdout and stderr
Claus Gittinger <cg@exept.de>
parents: 9053
diff changeset
  2656
		cnt = __win32_fwrite(cp, 1, len, f);
9053
f3f3d48d6f44 fix writing to stdout/stderr for winstx non-console operation
Claus Gittinger <cg@exept.de>
parents: 9024
diff changeset
  2657
	    } else
f3f3d48d6f44 fix writing to stdout/stderr for winstx non-console operation
Claus Gittinger <cg@exept.de>
parents: 9024
diff changeset
  2658
#endif
f3f3d48d6f44 fix writing to stdout/stderr for winstx non-console operation
Claus Gittinger <cg@exept.de>
parents: 9024
diff changeset
  2659
	    {
f3f3d48d6f44 fix writing to stdout/stderr for winstx non-console operation
Claus Gittinger <cg@exept.de>
parents: 9024
diff changeset
  2660
		__WRITEBYTES__(cnt, f, cp, len, _buffered);
f3f3d48d6f44 fix writing to stdout/stderr for winstx non-console operation
Claus Gittinger <cg@exept.de>
parents: 9024
diff changeset
  2661
	    }
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2662
	    if (cnt > 0) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2663
		if (__isSmallInteger(__INST(position))) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2664
		    INT np = __intVal(__INST(position)) + cnt;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2665
		    OBJ t;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2666
8881
53e94478133f STORE macro fix (gcc3.4 bug)
Claus Gittinger <cg@exept.de>
parents: 8818
diff changeset
  2667
		    t = __MKINT(np); __INST(position) = t; __STORE(self, t);
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2668
		} else {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2669
		    __INST(position) = nil; /* i.e. do not know */
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2670
		}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2671
		RETURN ( self );
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2672
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2673
	}
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2674
	__INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2675
    }
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  2676
%}.
2045
1ad17ca6520f fall back to super>>nextPutLine: if argument is not a string.
Claus Gittinger <cg@exept.de>
parents: 2044
diff changeset
  2677
    super nextPutLine:aString.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2678
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2679
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2680
nextPutLinesFrom:aStream upToLineStartingWith:aStringOrNil
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2681
    "read from aStream up to and including a line starting with aStringOrNil
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2682
     and append all lines to self.
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  2683
     Can be used to copy/create large files or copy from a pipe/socket.
68
59faa75185ba *** empty log message ***
claus
parents: 54
diff changeset
  2684
22
847106305963 *** empty log message ***
claus
parents: 12
diff changeset
  2685
     If aStringOrNil is nil or not matched, copy preceeds to the end.
847106305963 *** empty log message ***
claus
parents: 12
diff changeset
  2686
     (this allows for example to read a Socket and transfer the data quickly
847106305963 *** empty log message ***
claus
parents: 12
diff changeset
  2687
      into a file - without creating zillions of temporary strings)"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2688
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  2689
    |srcFilePointer readError line|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2690
2331
d6ddf452adc9 return codes in error cases
Claus Gittinger <cg@exept.de>
parents: 2326
diff changeset
  2691
    (mode == #readonly) ifTrue:[self errorReadOnly. ^ self].
d6ddf452adc9 return codes in error cases
Claus Gittinger <cg@exept.de>
parents: 2326
diff changeset
  2692
    filePointer isNil ifTrue:[self errorNotOpen. ^ self].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2693
    srcFilePointer := aStream filePointer.
2331
d6ddf452adc9 return codes in error cases
Claus Gittinger <cg@exept.de>
parents: 2326
diff changeset
  2694
    srcFilePointer isNil ifTrue:[aStream errorNotOpen. ^ self].
12
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
  2695
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
  2696
%{  /* STACK:2000 */
22
847106305963 *** empty log message ***
claus
parents: 12
diff changeset
  2697
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  2698
#ifndef NO_STDIO
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  2699
    FILEPOINTER dst;
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  2700
    FILEPOINTER src;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2701
    char *matchString;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2702
    int matchLen = 0;
12
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
  2703
    char buffer[1024];
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2704
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  2705
    __INST(lastErrorNumber) = nil;
249
claus
parents: 244
diff changeset
  2706
    if (__isSmallInteger(srcFilePointer)) {
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2707
	if ((aStringOrNil == nil) || __isString(aStringOrNil)) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2708
	    if (aStringOrNil != nil) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2709
		matchString = (char *) __stringVal(aStringOrNil);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2710
		matchLen = __stringSize(aStringOrNil);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2711
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2712
	    dst = __FILEVal(__INST(filePointer));
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2713
	    src = __FILEVal(srcFilePointer);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2714
	    __BEGIN_INTERRUPTABLE__
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2715
	    __threadErrno = 0;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2716
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2717
	    __WRITING__(dst)
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2718
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2719
	    for (;;) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2720
		if (fgets(buffer, sizeof(buffer)-1, src) == NULL) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2721
		    if (ferror(src)) {
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2722
			readError = __mkSmallInteger(__threadErrno);
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2723
			__END_INTERRUPTABLE__
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2724
			goto err;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2725
		    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2726
		    break;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2727
		}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2728
		if (fputs(buffer, dst) == EOF) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2729
		    if (ferror(dst)) {
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2730
			__INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2731
			__END_INTERRUPTABLE__
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2732
			goto err;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2733
		    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2734
		    break;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2735
		}
10339
972d0164125a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10328
diff changeset
  2736
# ifndef OLD
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2737
		if (__INST(buffered) == false) {
10352
f2e9bb8906db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10348
diff changeset
  2738
#  ifdef WIN32
f2e9bb8906db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10348
diff changeset
  2739
		    if ((dst == __win32_stdout()) || (dst == __win32_stderr())) {
f2e9bb8906db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10348
diff changeset
  2740
			win32_fflush(dst);
f2e9bb8906db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10348
diff changeset
  2741
		    } else
f2e9bb8906db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10348
diff changeset
  2742
#  endif
f2e9bb8906db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10348
diff changeset
  2743
		    {
f2e9bb8906db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10348
diff changeset
  2744
			FFLUSH(dst);
f2e9bb8906db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10348
diff changeset
  2745
		    }
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2746
		}
10339
972d0164125a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10328
diff changeset
  2747
# endif
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2748
		if (matchLen) {
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2749
		    if (strncmp(matchString, buffer, matchLen) == 0)
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2750
			break;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2751
		}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2752
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2753
	    __END_INTERRUPTABLE__
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2754
	    __INST(position) = nil; /* i.e. do not know */
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2755
	    RETURN (self);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2756
	}
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2757
    }
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  2758
err: ;
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  2759
#endif /* ! NO_STDIO */
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  2760
%}.
10339
972d0164125a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10328
diff changeset
  2761
    readError == true ifTrue:[
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2762
	aStream setLastErrorNumber:readError.
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2763
	aStream readError.
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2764
	^ self
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  2765
    ].
2331
d6ddf452adc9 return codes in error cases
Claus Gittinger <cg@exept.de>
parents: 2326
diff changeset
  2766
    lastErrorNumber notNil ifTrue:[self writeError. ^ self].
d6ddf452adc9 return codes in error cases
Claus Gittinger <cg@exept.de>
parents: 2326
diff changeset
  2767
    buffered ifFalse:[self errorNotBuffered. ^ self].
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  2768
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  2769
    "
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  2770
     argument error or unimplemented; try it linewise
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  2771
    "
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  2772
    [aStream atEnd] whileFalse:[
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2773
	line := aStream nextLine.
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2774
	line isNil ifTrue:[
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2775
	    ^ self.
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2776
	].
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2777
	self nextPutLine:line.
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2778
	(aStringOrNil notNil and:[line startsWith:aStringOrNil]) ifTrue:[
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2779
	    ^ self
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2780
	]
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  2781
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2782
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2783
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2784
peekForLineStartingWith:aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2785
    "read ahead for next line starting with aString;
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  2786
     return the line-string if found, or nil if EOF is encountered.
7118
10b067555add *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7054
diff changeset
  2787
     If matched, do not advance position beyond that line
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  2788
     i.e. nextLine will read the matched line.
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2789
     If not matched, reposition to original position for further reading."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2790
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  2791
    |firstPos lastPos line|
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  2792
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2793
    (mode == #writeonly) ifTrue:[^ self errorWriteOnly].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2794
    filePointer isNil ifTrue:[^ self errorNotOpen].
2
claus
parents: 1
diff changeset
  2795
    binary ifTrue:[^ self errorBinary].
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  2796
    buffered ifFalse:[^ self errorNotBuffered].
12
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
  2797
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
  2798
%{  /* STACK: 2000 */
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2799
#ifndef NO_STDIO
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2800
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  2801
    FILEPOINTER f;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2802
    int l;
12
8e03bd717355 *** empty log message ***
claus
parents: 10
diff changeset
  2803
    char buffer[1024];
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2804
    char *cp;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2805
    char *matchString;
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2806
    int gotFirst = 0;
10339
972d0164125a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10328
diff changeset
  2807
# if defined(__VMS__)
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2808
    fpos_t firstpos, lastpos;
3445
2639c1e3fd0b nextAvail also for externalBytes
Claus Gittinger <cg@exept.de>
parents: 3432
diff changeset
  2809
#   define FTELL(__f__, __pos__)        fgetpos(__f__, &(__pos__))
2639c1e3fd0b nextAvail also for externalBytes
Claus Gittinger <cg@exept.de>
parents: 3432
diff changeset
  2810
#   define FSEEK(__f__, __pos__)        fsetpos(__f__, &(__pos__))
10339
972d0164125a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10328
diff changeset
  2811
# elif defined(_LFS_LARGEFILE)
7883
1039acd0624b Large file support (off_t with 64 bits) for UNIX
Stefan Vogel <sv@exept.de>
parents: 7875
diff changeset
  2812
    off_t firstpos, lastpos;
1039acd0624b Large file support (off_t with 64 bits) for UNIX
Stefan Vogel <sv@exept.de>
parents: 7875
diff changeset
  2813
#   define FTELL(__f__, __pos__)        __pos__ = ftello(__f__)
1039acd0624b Large file support (off_t with 64 bits) for UNIX
Stefan Vogel <sv@exept.de>
parents: 7875
diff changeset
  2814
#   define FSEEK(__f__, __pos__)        fseeko(__f__, __pos__, SEEK_SET)
10339
972d0164125a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10328
diff changeset
  2815
# else
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2816
    long firstpos, lastpos;
3445
2639c1e3fd0b nextAvail also for externalBytes
Claus Gittinger <cg@exept.de>
parents: 3432
diff changeset
  2817
#   define FTELL(__f__, __pos__)        __pos__ = ftell(__f__)
2639c1e3fd0b nextAvail also for externalBytes
Claus Gittinger <cg@exept.de>
parents: 3432
diff changeset
  2818
#   define FSEEK(__f__, __pos__)        fseek(__f__, __pos__, SEEK_SET)
10339
972d0164125a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10328
diff changeset
  2819
# endif
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2820
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  2821
    __INST(lastErrorNumber) = nil;
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
  2822
    if (__isString(aString)) {
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2823
	matchString = (char *) __stringVal(aString);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2824
	l = __stringSize(aString);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2825
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2826
	f = __FILEVal(__INST(filePointer));
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2827
	__READING__(f)
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2828
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2829
	for (;;) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2830
	    FTELL(f, lastpos);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2831
	    if (!gotFirst) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2832
		firstpos = lastpos;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2833
		gotFirst = 1;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2834
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2835
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2836
	    __BEGIN_INTERRUPTABLE__
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2837
	    do {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2838
		cp = fgets(buffer, sizeof(buffer)-1, f);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2839
	    } while ((cp == NULL) && ferror(f) && (__threadErrno == EINTR) && (clearerr(f), 1));
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2840
	    buffer[sizeof(buffer)-1] = '\0';
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2841
	    __END_INTERRUPTABLE__
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2842
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2843
	    if (cp == NULL) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2844
		if (ferror(f)) {
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2845
		    __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2846
		    goto err;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2847
		} else {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2848
		    FSEEK(f, firstpos);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2849
		    RETURN (nil);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2850
		}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2851
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2852
	    if (strncmp(cp, matchString, l) == 0) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2853
		FSEEK(f, lastpos);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2854
		break;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2855
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2856
	}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2857
	/* remove EOL character */
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2858
	cp = buffer;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2859
	while (*cp && (*cp != '\n') && (*cp != '\r')) cp++;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2860
	*cp = '\0';
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2861
	__INST(position) = nil; /* i.e. do not know */
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2862
	RETURN ( __MKSTRING(buffer) );
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2863
    }
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  2864
err: ;
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2865
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2866
# undef FTELL
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2867
# undef FSEEK
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  2868
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  2869
#endif
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  2870
%}.
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  2871
    lastErrorNumber notNil ifTrue:[^ self readError].
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  2872
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  2873
    "/ try using generic code ...
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  2874
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  2875
    firstPos := self position.
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  2876
    [self atEnd] whileFalse:[
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2877
	lastPos := self position.
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2878
	line := self nextLine.
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2879
	line isNil ifTrue:[
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2880
	    self position:firstPos.
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2881
	    ^ nil
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2882
	].
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2883
	(line startsWith:aString) ifTrue:[
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2884
	    self position:lastPos.
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2885
	    ^ line
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  2886
	]
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  2887
    ].
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  2888
    self position:firstPos.
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  2889
    ^ nil
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2890
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2891
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2892
peekForLineStartingWithAny:aCollectionOfStrings
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2893
    "read ahead for next line starting with any of aCollectionOfStrings;
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2894
     return the index in aCollection if found, nil otherwise..
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2895
     If no match, do not change position; otherwise advance right before the
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2896
     matched line so that nextLine will return this line."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2897
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2898
    |line startPos linePos index|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2899
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2900
    (mode == #writeonly) ifTrue:[^ self errorWriteOnly].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2901
    filePointer isNil ifTrue:[^ self errorNotOpen].
2
claus
parents: 1
diff changeset
  2902
    binary ifTrue:[^ self errorBinary].
claus
parents: 1
diff changeset
  2903
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2904
    startPos := self position.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2905
    [self atEnd] whileFalse:[
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2906
	linePos := self position.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2907
	line := self nextLine.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2908
	line notNil ifTrue:[
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2909
	    index := 1.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2910
	    aCollectionOfStrings do:[:prefix |
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2911
		(line startsWith:prefix) ifTrue:[
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2912
		    self position:linePos.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2913
		    ^ index
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2914
		].
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2915
		index := index + 1
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2916
	    ]
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2917
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2918
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2919
    self position:startPos.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2920
    ^ nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2921
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2922
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2923
!ExternalStream methodsFor:'misc functions'!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2924
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2925
async:aBoolean
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2926
    "set/clear the async attribute - if set, the availability of data on
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2927
     the receiver will trigger an ioInterrupt.
779
0e41a665038a commentary
Claus Gittinger <cg@exept.de>
parents: 730
diff changeset
  2928
     If cleared (which is the default) no special notification is made.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2929
     Notice:
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  2930
	not every OS supports this
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2931
	- check with OS>>supportsIOInterrupts before using"
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  2932
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  2933
    |fd|
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  2934
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  2935
    filePointer isNil ifTrue:[^ self errorNotOpen].
2151
5f1fd65f8c3b next: must raise pastEnd, if EOF is hit;
Claus Gittinger <cg@exept.de>
parents: 2134
diff changeset
  2936
5f1fd65f8c3b next: must raise pastEnd, if EOF is hit;
Claus Gittinger <cg@exept.de>
parents: 2134
diff changeset
  2937
    OperatingSystem supportsIOInterrupts ifFalse:[
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2938
	^ self errorUnsupportedOperation
2151
5f1fd65f8c3b next: must raise pastEnd, if EOF is hit;
Claus Gittinger <cg@exept.de>
parents: 2134
diff changeset
  2939
    ].
5f1fd65f8c3b next: must raise pastEnd, if EOF is hit;
Claus Gittinger <cg@exept.de>
parents: 2134
diff changeset
  2940
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  2941
    fd := self fileDescriptor.
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2942
    aBoolean ifTrue:[
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  2943
	^ OperatingSystem enableIOInterruptsOn:fd
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2944
    ].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2945
    ^ OperatingSystem disableIOInterruptsOn:fd
2151
5f1fd65f8c3b next: must raise pastEnd, if EOF is hit;
Claus Gittinger <cg@exept.de>
parents: 2134
diff changeset
  2946
5f1fd65f8c3b next: must raise pastEnd, if EOF is hit;
Claus Gittinger <cg@exept.de>
parents: 2134
diff changeset
  2947
    "Modified: 11.1.1997 / 17:50:21 / cg"
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  2948
!
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  2949
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2950
blocking:aBoolean
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2951
    "set/clear the blocking attribute - if set (which is the default)
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2952
     a read (using next) on the receiver will block until data is available.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2953
     If cleared, a read operation will immediately return with a value of
2151
5f1fd65f8c3b next: must raise pastEnd, if EOF is hit;
Claus Gittinger <cg@exept.de>
parents: 2134
diff changeset
  2954
     nil.
5f1fd65f8c3b next: must raise pastEnd, if EOF is hit;
Claus Gittinger <cg@exept.de>
parents: 2134
diff changeset
  2955
     Turning off blocking is useful when reading from PipeStreams
5f1fd65f8c3b next: must raise pastEnd, if EOF is hit;
Claus Gittinger <cg@exept.de>
parents: 2134
diff changeset
  2956
     or Sockets, and the amount of data to be read is not known
5f1fd65f8c3b next: must raise pastEnd, if EOF is hit;
Claus Gittinger <cg@exept.de>
parents: 2134
diff changeset
  2957
     in advance. However, the data must then be read using #nextBytes:
8616
6014ed5c67f9 pastEnd -> pastEndRead
Claus Gittinger <cg@exept.de>
parents: 8614
diff changeset
  2958
     methods, in order to avoid other (pastEndRead) exceptions."
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  2959
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  2960
    filePointer isNil ifTrue:[^ self errorNotOpen].
7499
53b7a86e1f0b ExternalStream>>blocking: returns previous blocking status
Stefan Vogel <sv@exept.de>
parents: 7497
diff changeset
  2961
    ^ OperatingSystem setBlocking:aBoolean on:self fileDescriptor.
2151
5f1fd65f8c3b next: must raise pastEnd, if EOF is hit;
Claus Gittinger <cg@exept.de>
parents: 2134
diff changeset
  2962
3174
668414a73de9 Typo in comment
Stefan Vogel <sv@exept.de>
parents: 3132
diff changeset
  2963
    "Modified: / 11.1.1997 / 17:48:01 / cg"
668414a73de9 Typo in comment
Stefan Vogel <sv@exept.de>
parents: 3132
diff changeset
  2964
    "Modified: / 15.1.1998 / 11:49:48 / stefan"
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2965
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2966
6804
caf6a4521d4c added utility: ExternalStream >> copyToEndInto:
Claus Gittinger <cg@exept.de>
parents: 6758
diff changeset
  2967
copyToEndInto:outStream
7017
03f1bd57c001 no one cares about the signal in copyToEndInto:
Claus Gittinger <cg@exept.de>
parents: 7013
diff changeset
  2968
    "copy the data into another stream."
03f1bd57c001 no one cares about the signal in copyToEndInto:
Claus Gittinger <cg@exept.de>
parents: 7013
diff changeset
  2969
8362
e17d9ffb6fa8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8339
diff changeset
  2970
    |bufferSize|
7700
767e11efc326 use sendfile if supported by OS
Claus Gittinger <cg@exept.de>
parents: 7685
diff changeset
  2971
6804
caf6a4521d4c added utility: ExternalStream >> copyToEndInto:
Claus Gittinger <cg@exept.de>
parents: 6758
diff changeset
  2972
    OperatingSystem isMSDOSlike ifTrue:[
9023
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  2973
	"/ mhmh - NT hangs, when copying bigger blocks to a network drive - why ?
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  2974
	bufferSize := 1 * 1024.
6804
caf6a4521d4c added utility: ExternalStream >> copyToEndInto:
Claus Gittinger <cg@exept.de>
parents: 6758
diff changeset
  2975
    ] ifFalse:[
9023
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  2976
	bufferSize := 8 * 1024.
6804
caf6a4521d4c added utility: ExternalStream >> copyToEndInto:
Claus Gittinger <cg@exept.de>
parents: 6758
diff changeset
  2977
    ].
caf6a4521d4c added utility: ExternalStream >> copyToEndInto:
Claus Gittinger <cg@exept.de>
parents: 6758
diff changeset
  2978
7017
03f1bd57c001 no one cares about the signal in copyToEndInto:
Claus Gittinger <cg@exept.de>
parents: 7013
diff changeset
  2979
    ^ self copyToEndInto:outStream bufferSize:bufferSize
7700
767e11efc326 use sendfile if supported by OS
Claus Gittinger <cg@exept.de>
parents: 7685
diff changeset
  2980
767e11efc326 use sendfile if supported by OS
Claus Gittinger <cg@exept.de>
parents: 7685
diff changeset
  2981
    "
767e11efc326 use sendfile if supported by OS
Claus Gittinger <cg@exept.de>
parents: 7685
diff changeset
  2982
     |in out|
767e11efc326 use sendfile if supported by OS
Claus Gittinger <cg@exept.de>
parents: 7685
diff changeset
  2983
767e11efc326 use sendfile if supported by OS
Claus Gittinger <cg@exept.de>
parents: 7685
diff changeset
  2984
     in := 'Makefile' asFilename readStream.
767e11efc326 use sendfile if supported by OS
Claus Gittinger <cg@exept.de>
parents: 7685
diff changeset
  2985
     out := Stdout.
767e11efc326 use sendfile if supported by OS
Claus Gittinger <cg@exept.de>
parents: 7685
diff changeset
  2986
     in copyToEndInto:out.
767e11efc326 use sendfile if supported by OS
Claus Gittinger <cg@exept.de>
parents: 7685
diff changeset
  2987
     in close.
767e11efc326 use sendfile if supported by OS
Claus Gittinger <cg@exept.de>
parents: 7685
diff changeset
  2988
    "
6804
caf6a4521d4c added utility: ExternalStream >> copyToEndInto:
Claus Gittinger <cg@exept.de>
parents: 6758
diff changeset
  2989
!
caf6a4521d4c added utility: ExternalStream >> copyToEndInto:
Claus Gittinger <cg@exept.de>
parents: 6758
diff changeset
  2990
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2991
create
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2992
    "create the stream
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2993
     - this must be redefined in subclass"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2994
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2995
    ^ self subclassResponsibility
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2996
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2997
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2998
ioctl:ioctlNumber
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  2999
    "to provide a simple ioctl facility - an ioctl is performed
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3000
     on the underlying file; no arguments are passed."
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3001
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  3002
    ^ self ioctl:ioctlNumber with:nil
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  3003
!
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  3004
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  3005
ioctl:ioctlNumber with:arg
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  3006
    "to provide a simple ioctl facility - an ioctl is performed
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  3007
     on the underlying file; the argument is passed as argument.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3008
     This is not used by ST/X, but provided for special situations
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  3009
     - for example, to control proprietrary I/O devices.
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  3010
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  3011
     Since the type of the argument depends on the ioctl being
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  3012
     performed, different arg types are allowed here.
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  3013
     If the argument is nil, an ioctl without argument is performed.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3014
     If the argument is an integral number, its directly passed;
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  3015
     if its a kind of ByteArray (ByteArray, String or Structure),
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  3016
     or external data (ExternalBytes or ExternalAddress),
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3017
     a pointer to the data is passed.
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3018
     This allows performing most ioctls
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  3019
     - however, it might be tricky to setup the buffer.
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  3020
     Be careful in what you pass - ST/X cannot validate its correctness."
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  3021
1067
1e7959af0821 removed all NOCONTEXT (last version did no good - PROTECT-stack overflow ...)
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
  3022
%{
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2875
diff changeset
  3023
#if !defined(MSDOS_LIKE)
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2875
diff changeset
  3024
# if !defined(__openVMS__)
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  3025
    FILEPOINTER f;
10552
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3026
    int ret;
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3027
    unsigned int ioNum;
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3028
    OBJ fp;
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  3029
    INT ioArg;
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3030
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  3031
    __INST(lastErrorNumber) = nil;
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  3032
    if ((fp = __INST(filePointer)) != nil) {
10552
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3033
        if (__isInteger(ioctlNumber)
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3034
         && (__isInteger(arg)
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3035
             || (arg == nil)
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3036
             || __isBytes(arg)
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3037
             || __isExternalBytesLike(arg)
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3038
             || __isExternalAddress(arg))) {
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3039
            f = __FILEVal(fp);
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3040
            ioNum = __unsignedLongIntVal(ioctlNumber);
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3041
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3042
            __BEGIN_INTERRUPTABLE__
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3043
            do {
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3044
                __threadErrno = 0;
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3045
                if (arg == nil) {
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3046
                    ioArg = 0;
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3047
                } else if (__isSmallInteger(arg)) {
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3048
                    ioArg = __intVal(arg);
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3049
                } else if (__isInteger(arg)) {
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3050
                    ioArg = __unsignedLongIntVal(arg);
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3051
                } else if (__isExternalBytesLike(arg)) {
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3052
                    ioArg = (INT)(__externalBytesAddress(arg));
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3053
                } else if (__isExternalAddress(arg)) {
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3054
                    ioArg = (INT)(__externalAddressVal(arg));
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3055
                } else {
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3056
                    ioArg = (INT)(__ByteArrayInstPtr(arg)->ba_element);
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3057
                }
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3058
                ret = ioctl(fileno(f), ioNum, ioArg);
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3059
            } while ((ret < 0) && (__threadErrno == EINTR));
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3060
            __END_INTERRUPTABLE__
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3061
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3062
            if (ret >= 0) {
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3063
                RETURN ( __mkSmallInteger(ret) );
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3064
            }
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3065
            __INST(position) = nil; /* i.e. do not know */
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3066
            __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
d52aa8e066e5 #ioctl:with: accept 32-bit integers as arguments
Stefan Vogel <sv@exept.de>
parents: 10469
diff changeset
  3067
        }
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3068
    }
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2875
diff changeset
  3069
# endif
791
b1c153b1c719 WIN32 has no ioctl
Claus Gittinger <cg@exept.de>
parents: 779
diff changeset
  3070
#endif
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3071
%}.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3072
    lastErrorNumber notNil ifTrue:[^ self ioError].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3073
    filePointer isNil ifTrue:[^ self errorNotOpen].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3074
    "
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  3075
     argument is not an integer
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  3076
    "
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  3077
    (ioctlNumber isMemberOf:SmallInteger) ifFalse:[^ self primitiveFailed].
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3078
    "
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  3079
     the system does not support ioctl (MSDOS or VMS)
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3080
    "
2920
9c10b66e1ba8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2903
diff changeset
  3081
    ^ self errorUnsupportedOperation
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3082
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3083
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3084
reset
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3085
    "set the read position to the beginning of the collection"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3086
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  3087
    self position:ZeroPosition
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3088
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3089
1044
c2fb3818e097 ExtSTream>>next: did not work correct if interrupted.
Stefan Vogel <sv@exept.de>
parents: 971
diff changeset
  3090
setToEnd
c2fb3818e097 ExtSTream>>next: did not work correct if interrupted.
Stefan Vogel <sv@exept.de>
parents: 971
diff changeset
  3091
    "redefined since it must be implemented differently"
c2fb3818e097 ExtSTream>>next: did not work correct if interrupted.
Stefan Vogel <sv@exept.de>
parents: 971
diff changeset
  3092
c2fb3818e097 ExtSTream>>next: did not work correct if interrupted.
Stefan Vogel <sv@exept.de>
parents: 971
diff changeset
  3093
    ^ self subclassResponsibility
c2fb3818e097 ExtSTream>>next: did not work correct if interrupted.
Stefan Vogel <sv@exept.de>
parents: 971
diff changeset
  3094
!
c2fb3818e097 ExtSTream>>next: did not work correct if interrupted.
Stefan Vogel <sv@exept.de>
parents: 971
diff changeset
  3095
932
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  3096
truncateTo:newSize
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  3097
    "truncate the underlying OS file to newSize.
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  3098
     Warning: this may not be implemented on all platforms."
1066
cffbbdea7e01 care for GC while being interruptable
Claus Gittinger <cg@exept.de>
parents: 1048
diff changeset
  3099
1068
92fdcccf12a3 alles MIST - zurueck zu 1.89 und NOCONTEXT entfernt
Claus Gittinger <cg@exept.de>
parents: 1067
diff changeset
  3100
%{
932
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  3101
#ifdef HAS_FTRUNCATE
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  3102
    FILEPOINTER f;
932
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  3103
    OBJ fp;
7887
c5df7cf8d667 LargeFile support for truncateTo:
Stefan Vogel <sv@exept.de>
parents: 7883
diff changeset
  3104
    off_t truncateSize;
932
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  3105
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  3106
    if (((fp = __INST(filePointer)) != nil)
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3107
	&& (__INST(mode) != @symbol(readonly))) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3108
	if (__isSmallInteger(newSize)) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3109
	    truncateSize = __intVal(newSize);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3110
	    if (truncateSize < 0) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3111
		goto getOutOfHere;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3112
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3113
	} else {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3114
	    truncateSize = __signedLongIntVal(newSize);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3115
	    if (truncateSize < 0) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3116
		goto getOutOfHere;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3117
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3118
	    if (truncateSize == 0) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3119
		if (sizeof(truncateSize) == 8) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3120
		    if (__signedLong64IntVal(newSize, &truncateSize) == 0 || truncateSize < 0) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3121
			goto getOutOfHere;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3122
		    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3123
		} else {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3124
		    goto getOutOfHere;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3125
		}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3126
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3127
	}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3128
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3129
	f = __FILEVal(fp);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3130
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3131
	if (__INST(buffered) == true) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3132
	    __READING__(f)
10352
f2e9bb8906db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10348
diff changeset
  3133
#ifdef WIN32
f2e9bb8906db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10348
diff changeset
  3134
	    if ((dst == __win32_stdout()) || (dst == __win32_stderr())) {
f2e9bb8906db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10348
diff changeset
  3135
		win32_fflush(f);
f2e9bb8906db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10348
diff changeset
  3136
	    } else
f2e9bb8906db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10348
diff changeset
  3137
#endif
f2e9bb8906db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10348
diff changeset
  3138
	    {
f2e9bb8906db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10348
diff changeset
  3139
		FFLUSH(f);
f2e9bb8906db *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10348
diff changeset
  3140
	    }
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3141
	    OPT_FSEEK(f, 0L, SEEK_END); /* needed in stdio */
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3142
	}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3143
	ftruncate(fileno(f), truncateSize);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3144
	RETURN (self);
932
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  3145
    }
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3146
getOutOfHere: ;
932
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  3147
#endif
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  3148
%}.
2331
d6ddf452adc9 return codes in error cases
Claus Gittinger <cg@exept.de>
parents: 2326
diff changeset
  3149
    filePointer isNil ifTrue:[self errorNotOpen. ^ self].
d6ddf452adc9 return codes in error cases
Claus Gittinger <cg@exept.de>
parents: 2326
diff changeset
  3150
    (mode == #readonly) ifTrue:[self errorReadOnly. ^ self].
7887
c5df7cf8d667 LargeFile support for truncateTo:
Stefan Vogel <sv@exept.de>
parents: 7883
diff changeset
  3151
    newSize < 0 ifTrue:[
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  3152
	self error:'wrong arg'.
7887
c5df7cf8d667 LargeFile support for truncateTo:
Stefan Vogel <sv@exept.de>
parents: 7883
diff changeset
  3153
    ].
2331
d6ddf452adc9 return codes in error cases
Claus Gittinger <cg@exept.de>
parents: 2326
diff changeset
  3154
    self errorUnsupportedOperation
932
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  3155
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  3156
    "
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  3157
     |s|
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  3158
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  3159
     s := 'test' asFilename writeStream.
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  3160
     s next:1000 put:$a.
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  3161
     s truncateTo:100.
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  3162
     s close.
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  3163
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  3164
     ('test' asFilename fileSize) printNL
f57ec42ceb44 added interface to truncate & ftruncate (req. by Mr. Olberding)
Claus Gittinger <cg@exept.de>
parents: 872
diff changeset
  3165
    "
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3166
! !
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3167
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3168
!ExternalStream methodsFor:'no longer reimplemented for speed'!
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3169
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3170
XXXnextAlphaNumericWord
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3171
    "read the next word (i.e. up to non letter-or-digit) after first
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3172
     skipping any whiteSpace.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3173
     Return a string containing those characters.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3174
     There is a limit of 1023 characters in the word - if longer,
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3175
     it is truncated."
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3176
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3177
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3178
%{  /* STACK: 2000 */
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3179
    FILEPOINTER f;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3180
    int len;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3181
    char buffer[1024];
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3182
    unsigned char ch;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3183
    int cnt = 0;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3184
    int ret, _buffered;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3185
    OBJ fp;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3186
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3187
    if (((fp = __INST(filePointer)) != nil)
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3188
     && (__INST(mode) != @symbol(writeonly))
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3189
    ) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3190
	f = __FILEVal(fp);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3191
	_buffered = (__INST(buffered) == true);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3192
	if (_buffered) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3193
	    __READING__(f)
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3194
	}
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3195
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3196
	/*
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3197
	 * skip whiteSpace first ...
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3198
	 */
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3199
	do {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3200
	    __READBYTE__(ret, f, &ch, _buffered);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3201
	    if (ret > 0)
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3202
		cnt++;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3203
	    else
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3204
		break;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3205
	} while (
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3206
#ifndef NON_ASCII
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3207
		 (ch < ' ') ||
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3208
#endif
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3209
		 (ch == ' ' ) || (ch == '\t') || (ch == '\r')
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3210
	      || (ch == '\n') || (ch == 0x0b));
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3211
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3212
	len = 0;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3213
	while (ret > 0 &&
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3214
	       (((ch >= 'a') && (ch <= 'z')) ||
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3215
		((ch >= 'A') && (ch <= 'Z')) ||
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3216
		((ch >= '0') && (ch <= '9')))
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3217
	) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3218
	    buffer[len++] = ch;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3219
	    if (len >= (sizeof(buffer)-1)) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3220
		/* emergency */
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3221
		break;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3222
	    }
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3223
	    __READBYTE__(ret, f, &ch, _buffered);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3224
	    if (ret > 0)
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3225
		cnt++;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3226
	    else
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3227
		break;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3228
	}
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3229
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3230
	if (ret <= 0) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3231
	    if (ret < 0) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3232
		__INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3233
		goto err;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3234
	    }
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3235
	    else if (ret == 0)
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3236
		__INST(hitEOF) = true;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3237
	} else {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3238
	    __UNGETC__(ch, f, _buffered);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3239
	    cnt--;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3240
	}
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3241
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3242
	if (__isSmallInteger(__INST(position))) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3243
	    INT np = __intVal(__INST(position)) + cnt;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3244
	    OBJ t;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3245
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3246
	    t = __MKINT(np); __INST(position) = t; __STORE(self, t);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3247
	} else {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3248
	    __INST(position) = nil; /* i.e. do not know */
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3249
	}
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3250
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3251
	if (len != 0) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3252
	    buffer[len] = '\0';
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3253
	    RETURN ( __MKSTRING_L(buffer, len) );
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3254
	}
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3255
    }
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3256
err: ;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3257
%}.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3258
    hitEOF ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3259
	^ self pastEndRead
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3260
    ].
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3261
    lastErrorNumber notNil ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3262
	^ self readError
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3263
    ].
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3264
    filePointer isNil ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3265
	^ self errorNotOpen
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3266
    ].
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3267
    mode == #writeonly ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3268
	^ self errorWriteOnly
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3269
    ].
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3270
    ^ super nextAlphaNumericWord
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3271
!
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3272
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3273
XXXpeekFor:anObject
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3274
    "return true and move past next element, if next == something.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3275
     Otherwise, stay and return false. False is also returned
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3276
     when EOF is encountered.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3277
     The argument must be an integer if in binary, a character if in
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3278
     text mode; only single byte characters are currently supported."
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3279
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3280
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3281
%{
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3282
    FILEPOINTER f;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3283
    unsigned char c;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3284
    int ret, peekValue, _buffered;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3285
    OBJ fp;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3286
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3287
    __INST(lastErrorNumber) = nil;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3288
    if (((fp = __INST(filePointer)) != nil)
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3289
	&& (__INST(mode) != @symbol(writeonly))
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3290
    ) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3291
	if (__INST(binary) == true) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3292
	    if (__isSmallInteger(anObject)) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3293
		peekValue = __intVal(anObject) & 0xFF;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3294
	    } else {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3295
		goto bad;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3296
	    }
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3297
	} else {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3298
	    if (__isCharacter(anObject)) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3299
		peekValue = __intVal(_characterVal(anObject)) & 0xFF;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3300
	    } else {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3301
		goto bad;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3302
	    }
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3303
	}
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3304
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3305
	f = __FILEVal(fp);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3306
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3307
	_buffered = (__INST(buffered) == true);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3308
	if (_buffered) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3309
	    __READING__(f)
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3310
	}
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3311
	__READBYTE__(ret, f, &c, _buffered);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3312
	if (ret > 0) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3313
	    if (c == peekValue) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3314
		if (__isSmallInteger(__INST(position))) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3315
		    INT np = __intVal(__INST(position)) + 1;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3316
		    OBJ t;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3317
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3318
		    t = __MKINT(np); __INST(position) = t; __STORE(self, t);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3319
		} else {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3320
		    __INST(position) = nil; /* i.e. do not know */
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3321
		}
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3322
		RETURN (true);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3323
	    }
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3324
	    __UNGETC__(c, f, _buffered);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3325
	    RETURN (false);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3326
	}
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3327
	if (ret < 0) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3328
	    __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3329
	} else /* ret == 0 */
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3330
	    __INST(hitEOF) = true;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3331
	}
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3332
bad: ;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3333
%}.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3334
    ^ super peekFor:anObject
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3335
!
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3336
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3337
XXXskipLine
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3338
    "read the next line (characters up to newline) skip only;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3339
     return nil if EOF reached, self otherwise.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3340
     Not allowed in binary mode."
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3341
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3342
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3343
%{  /* STACK:2000 */
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3344
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3345
    FILEPOINTER f;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3346
    OBJ fp;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3347
    int ret, _buffered;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3348
    char c;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3349
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3350
    __INST(lastErrorNumber) = nil;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3351
    if (((fp = __INST(filePointer)) != nil)
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3352
	&& (__INST(mode) != @symbol(writeonly))
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3353
	&& (__INST(binary) != true)
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3354
    ) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3355
	f = __FILEVal(fp);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3356
	if (_buffered = (__INST(buffered) == true)) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3357
	    __READING__(f)
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3358
	}
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3359
	for (;;) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3360
	    __READBYTE__(ret, f, &c, _buffered);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3361
	    if (ret > 0) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3362
		if (c == '\n')
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3363
		    RETURN(self)
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3364
	    } else
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3365
		break;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3366
	}
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3367
	if (ret < 0) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3368
	    __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3369
	} else /* ret == 0 */ {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3370
	    __INST(hitEOF) = true;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3371
	}
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3372
    }
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3373
%}.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3374
    hitEOF ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3375
	^ self pastEndRead
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3376
    ].
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3377
    lastErrorNumber notNil ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3378
	self readError.
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3379
	^ self
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3380
    ].
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3381
    filePointer isNil ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3382
	self errorNotOpen.
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3383
	^ self
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3384
    ].
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3385
    binary ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3386
	self errorBinary.
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3387
	^ self
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3388
    ].
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3389
    self errorWriteOnly
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3390
!
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3391
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3392
XXXskipSeparators
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3393
    "skip all whitespace; next will return next non-white-space character
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3394
     or nil if endOfFile reached. Not allowed in binary mode.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3395
     - reimplemented for speed"
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3396
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3397
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3398
%{
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3399
    FILEPOINTER f;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3400
    char c;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3401
    int ret, _buffered;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3402
    OBJ fp;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3403
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3404
    __INST(lastErrorNumber) = nil;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3405
    if (((fp = __INST(filePointer)) != nil)
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3406
	&& (__INST(mode) != @symbol(writeonly))
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3407
	&& (__INST(binary) != true)
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3408
    ) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3409
	f = __FILEVal(fp);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3410
	_buffered = (__INST(buffered) == true);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3411
	if (_buffered) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3412
	    __READING__(f)
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3413
	}
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3414
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3415
	while (1) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3416
	    __READBYTE__(ret, f, &c, _buffered);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3417
	    if (ret <= 0) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3418
		if (ret < 0) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3419
		    __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3420
		} else /* ret == 0 */ {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3421
		    __INST(hitEOF) = true;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3422
		}
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3423
		break;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3424
	    }
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3425
	    switch (c) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3426
		case ' ':
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3427
		case '\t':
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3428
		case '\n':
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3429
		case '\r':
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3430
		case '\b':
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3431
		case '\f':
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3432
		    break;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3433
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3434
		default:
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3435
		    __UNGETC__(c, f, _buffered);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3436
		    RETURN ( __MKCHARACTER(c & 0xFF) );
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3437
	    }
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3438
	}
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3439
    }
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3440
%}.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3441
    hitEOF == true ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3442
	^ self pastEndRead
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3443
    ].
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3444
    lastErrorNumber notNil ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3445
	^ self readError
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3446
    ].
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3447
    filePointer isNil ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3448
	^ self errorNotOpen
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3449
    ].
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3450
    (mode == #writeonly) ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3451
	^ self errorWriteOnly
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3452
    ].
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3453
    (binary == true) ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3454
	^ self errorBinary
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3455
    ].
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3456
    ^ super skipSeparators.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3457
!
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3458
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3459
XXXskipSeparatorsExceptCR
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3460
    "skip all whitespace but no newlines;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3461
     next will return next non-white-space character
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3462
     or nil if endOfFile reached. Not allowed in binary mode.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3463
     - reimplemented for speed"
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3464
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3465
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3466
%{
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3467
    FILEPOINTER f;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3468
    char c;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3469
    int ret, _buffered;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3470
    OBJ fp;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3471
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3472
    __INST(lastErrorNumber) = nil;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3473
    if (((fp = __INST(filePointer)) != nil)
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3474
	&& (__INST(mode) != @symbol(writeonly))
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3475
	&& (__INST(binary) != true)
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3476
    ) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3477
	f = __FILEVal(fp);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3478
	_buffered = (__INST(buffered) == true);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3479
	if (_buffered) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3480
	    __READING__(f)
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3481
	}
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3482
	while (1) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3483
	    __READBYTE__(ret, f, &c, _buffered);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3484
	    if (ret <= 0) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3485
		if (ret < 0) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3486
		    __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3487
		} else /* ret == 0 */ {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3488
		    __INST(hitEOF) = true;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3489
		}
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3490
		break;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3491
	    }
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3492
	    switch (c) {
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3493
		case ' ':
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3494
		case '\t':
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3495
		case '\b':
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3496
		case '\f':
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3497
		    break;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3498
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3499
		default:
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3500
		    __UNGETC__(c, f, _buffered);
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3501
		    RETURN ( __MKCHARACTER(c & 0xFF) );
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3502
	    }
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3503
	}
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3504
    }
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3505
%}.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3506
    hitEOF ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3507
	^ self pastEndRead
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3508
    ].
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3509
    lastErrorNumber notNil ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3510
	^ self readError
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3511
    ].
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3512
    filePointer isNil ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3513
	^ self errorNotOpen
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3514
    ].
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3515
    (mode == #writeonly) ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3516
	^ self errorWriteOnly
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3517
    ].
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3518
    ^ self errorBinary.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3519
!
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3520
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3521
XXXskipThrough:aCharacter
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3522
    "skip all characters up-to and including aCharacter.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3523
     Return the receiver if skip was successful,
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3524
     otherwise (i.e. if not found) return nil and leave the stream positioned at the end.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3525
     The next read operation will return the character after aCharacter.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3526
     The argument, aCharacter must be character, or integer when in binary mode.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3527
     Only single byte characters are currently supported."
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3528
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3529
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3530
%{
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3531
    FILEPOINTER f;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3532
    REGISTER int cSearch;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3533
    unsigned char c;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3534
    int ret, _buffered;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3535
    OBJ fp;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3536
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3537
    __INST(lastErrorNumber) = nil;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3538
    if (((fp = __INST(filePointer)) != nil)
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3539
	&& (__INST(mode) != @symbol(writeonly))
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3540
    ) {
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3541
	if (__INST(binary) == true) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3542
	    /* searched for object must be a smallInteger */
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3543
	    if (! __isSmallInteger(aCharacter)) goto badArgument;
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3544
	    cSearch = __intVal(aCharacter);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3545
	} else {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3546
	    /* searched for object must be a character */
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3547
	    if (! __isCharacter(aCharacter)) goto badArgument;
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3548
	    cSearch = __intVal(_characterVal(aCharacter));
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3549
	}
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3550
	/* Q: should we just say: "not found" ? */
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3551
	if ((cSearch < 0) || (cSearch > 255)) goto badArgument;
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3552
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3553
	f = __FILEVal(fp);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3554
	if (_buffered = (__INST(buffered) == true)) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3555
	    __READING__(f)
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3556
	}
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3557
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3558
	while (1) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3559
	    __READBYTE__(ret, f, &c, _buffered);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3560
	    if (ret <= 0) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3561
		if (ret < 0) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3562
		    __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3563
		} else /* ret == 0 */ {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3564
		    __INST(hitEOF) = true;
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3565
		}
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3566
		break;
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3567
	    }
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3568
	    if (c == cSearch) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3569
		RETURN (self);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3570
	    }
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3571
	}
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3572
    }
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3573
badArgument: ;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3574
%}.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3575
    hitEOF ifTrue:[ ^ nil ].
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3576
    lastErrorNumber notNil ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3577
	self readError.
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3578
	^ self
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3579
    ].
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3580
    filePointer isNil ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3581
	self errorNotOpen.
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3582
	^ self
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3583
    ].
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3584
    (mode == #writeonly) ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3585
	self errorWriteOnly.
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3586
	^ self
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3587
    ].
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3588
     "
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3589
     argument must be integer/character in binary mode,
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3590
     character in text mode
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3591
    "
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3592
    self error:'invalid argument'.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3593
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3594
    "
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3595
     |s|
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3596
     s := 'Makefile' asFilename readStream.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3597
     s skipThrough:$E.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3598
     s next:10
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3599
    "
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3600
!
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3601
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3602
XXXskipToAll:aString
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3603
    "skip for the sequence given by the argument, aCollection;
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3604
     return nil if not found, self otherwise.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3605
     On a successful match, the next read will return characters of aString."
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3606
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3607
    |oldPos|
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3608
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3609
    oldPos := self position.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3610
    (self skipThroughAll:aString) isNil ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3611
	"
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3612
	 restore position"
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3613
	self position:oldPos.
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3614
	^ nil
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3615
    ].
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3616
     "
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3617
     position before match-string
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3618
    "
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3619
    self position:(self position - aString size).
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3620
    ^ self
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3621
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3622
    "
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3623
     |s|
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3624
     s := 'Makefile' asFilename readStream.
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3625
     [
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3626
	 (s skipToAll:'EDIT') notNil ifTrue:[
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3627
	    s next:100.
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3628
	 ].
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3629
     ] ensure:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  3630
	s close.
10361
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3631
     ]"
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3632
    "Modified: 26.6.1996 / 09:22:05 / cg"
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3633
! !
ee6a8af317ce Disable methods, that were "reimplemented for speed"
Stefan Vogel <sv@exept.de>
parents: 10352
diff changeset
  3634
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3635
!ExternalStream methodsFor:'non homogenous reading'!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3636
3674
c51550d1df17 added #nextAvailable:
Claus Gittinger <cg@exept.de>
parents: 3672
diff changeset
  3637
nextAvailable:count
c51550d1df17 added #nextAvailable:
Claus Gittinger <cg@exept.de>
parents: 3672
diff changeset
  3638
    "return the next count elements of the stream as aCollection.
c51550d1df17 added #nextAvailable:
Claus Gittinger <cg@exept.de>
parents: 3672
diff changeset
  3639
     If the stream reaches the end before count elements have been read,
c51550d1df17 added #nextAvailable:
Claus Gittinger <cg@exept.de>
parents: 3672
diff changeset
  3640
     return what is available. (i.e. a shorter collection).
c51550d1df17 added #nextAvailable:
Claus Gittinger <cg@exept.de>
parents: 3672
diff changeset
  3641
     The type of collection is specified in #contentsSpecies."
c51550d1df17 added #nextAvailable:
Claus Gittinger <cg@exept.de>
parents: 3672
diff changeset
  3642
3956
51f1a9a4d63f changes for egcs (stdio uses __new / utsname)
Claus Gittinger <cg@exept.de>
parents: 3949
diff changeset
  3643
    |buffer n|
3674
c51550d1df17 added #nextAvailable:
Claus Gittinger <cg@exept.de>
parents: 3672
diff changeset
  3644
c51550d1df17 added #nextAvailable:
Claus Gittinger <cg@exept.de>
parents: 3672
diff changeset
  3645
    binary ifTrue:[
7832
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  3646
	buffer := ByteArray uninitializedNew:count
3674
c51550d1df17 added #nextAvailable:
Claus Gittinger <cg@exept.de>
parents: 3672
diff changeset
  3647
    ] ifFalse:[
7832
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  3648
	buffer := String uninitializedNew:count
3674
c51550d1df17 added #nextAvailable:
Claus Gittinger <cg@exept.de>
parents: 3672
diff changeset
  3649
    ].
c51550d1df17 added #nextAvailable:
Claus Gittinger <cg@exept.de>
parents: 3672
diff changeset
  3650
    n := self nextAvailableBytes:count into:buffer startingAt:1.
5202
e8130049b18f #nextAvailableBytes:into:startingAt: may NOT set EOF flag,
Claus Gittinger <cg@exept.de>
parents: 5187
diff changeset
  3651
    n == 0 ifTrue:[
7832
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  3652
	binary ifTrue:[
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3653
	    ^ #[]
7832
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  3654
	].
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  3655
	^ ''
5202
e8130049b18f #nextAvailableBytes:into:startingAt: may NOT set EOF flag,
Claus Gittinger <cg@exept.de>
parents: 5187
diff changeset
  3656
    ].
3674
c51550d1df17 added #nextAvailable:
Claus Gittinger <cg@exept.de>
parents: 3672
diff changeset
  3657
c51550d1df17 added #nextAvailable:
Claus Gittinger <cg@exept.de>
parents: 3672
diff changeset
  3658
    n ~~ count ifTrue:[
7832
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  3659
	^ buffer copyTo:n
3674
c51550d1df17 added #nextAvailable:
Claus Gittinger <cg@exept.de>
parents: 3672
diff changeset
  3660
    ].
c51550d1df17 added #nextAvailable:
Claus Gittinger <cg@exept.de>
parents: 3672
diff changeset
  3661
    ^ buffer.
c51550d1df17 added #nextAvailable:
Claus Gittinger <cg@exept.de>
parents: 3672
diff changeset
  3662
c51550d1df17 added #nextAvailable:
Claus Gittinger <cg@exept.de>
parents: 3672
diff changeset
  3663
    "
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3664
     (ReadStream on:#(1 2 3 4 5)) nextAvailable:3
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3665
     (ReadStream on:#(1 2 3 4 5)) nextAvailable:10
3674
c51550d1df17 added #nextAvailable:
Claus Gittinger <cg@exept.de>
parents: 3672
diff changeset
  3666
     (ReadStream on:'hello') nextAvailable:3
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3667
     (ReadStream on:'hello') nextAvailable:10
3674
c51550d1df17 added #nextAvailable:
Claus Gittinger <cg@exept.de>
parents: 3672
diff changeset
  3668
    "
c51550d1df17 added #nextAvailable:
Claus Gittinger <cg@exept.de>
parents: 3672
diff changeset
  3669
c51550d1df17 added #nextAvailable:
Claus Gittinger <cg@exept.de>
parents: 3672
diff changeset
  3670
    "Modified: / 16.6.1998 / 15:52:41 / cg"
c51550d1df17 added #nextAvailable:
Claus Gittinger <cg@exept.de>
parents: 3672
diff changeset
  3671
!
c51550d1df17 added #nextAvailable:
Claus Gittinger <cg@exept.de>
parents: 3672
diff changeset
  3672
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3673
nextAvailableBytes:count into:anObject startingAt:start
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3674
    "read the next count bytes into an object and return the number of
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3675
     bytes read or the number of bytes read, if EOF is encountered before,
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3676
     or no more bytes are available for reading (from the pipe/socket).
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3677
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3678
     If the receiver is some socket/pipe-like stream, an exception
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3679
     is raised if the connection is broken.
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3680
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3681
     Notice, that in contrast to other methods,
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3682
     this does NOT return nil on EOF, but the actual count.
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3683
     Thus allowing read of partial blocks.
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3684
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3685
     The object must have non-pointer indexed instvars
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3686
     (i.e. it must be a ByteArray, String, Float- or DoubleArray).
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3687
     If anObject is a string or byteArray and reused, this provides the
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3688
     fastest possible physical I/O (since no new objects are allocated).
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3689
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3690
     Use with care - non object oriented I/O.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3691
     Warning: in general, you cannot use this method to pass data from other
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3692
     architectures since it does not care for byte order or float representation."
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3693
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3694
%{
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3695
    FILEPOINTER f;
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3696
    int cnt, offs, ret, _buffered;
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3697
    int objSize, nInstVars, nInstBytes;
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3698
    char *cp;
3445
2639c1e3fd0b nextAvail also for externalBytes
Claus Gittinger <cg@exept.de>
parents: 3432
diff changeset
  3699
    char *extPtr;
7195
755c46f9b774 also handle subclasses of ExternalBytes (Mapped..)
Claus Gittinger <cg@exept.de>
parents: 7118
diff changeset
  3700
    OBJ fp;
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3701
    int o_offs;
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3702
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3703
    __INST(lastErrorNumber) = nil;
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3704
    if (((fp = __INST(filePointer)) != nil)
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3705
	&& (__INST(mode) != @symbol(writeonly))
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3706
	&& __bothSmallInteger(count, start)
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3707
    ) {
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3708
	f = __FILEVal(fp);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3709
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3710
	cnt = __intVal(count);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3711
	offs = __intVal(start) - 1;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3712
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3713
	if (__isExternalBytesLike(anObject)) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3714
	    OBJ sz;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3715
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3716
	    nInstBytes = 0;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3717
	    extPtr = (char *)(__externalBytesAddress(anObject));
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3718
	    sz = __externalBytesSize(anObject);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3719
	    if (__isSmallInteger(sz)) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3720
		objSize = __intVal(sz);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3721
	    } else {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3722
		objSize = 0; /* unknown */
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3723
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3724
	} else {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3725
	    OBJ oClass;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3726
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3727
	    oClass = __Class(anObject);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3728
	    switch (__intVal(__ClassInstPtr(oClass)->c_flags) & ARRAYMASK) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3729
		case BYTEARRAY:
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3730
		case WORDARRAY:
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3731
		case LONGARRAY:
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3732
		case SWORDARRAY:
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3733
		case SLONGARRAY:
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3734
		case FLOATARRAY:
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3735
		case DOUBLEARRAY:
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3736
		    break;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3737
		default:
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3738
		    goto bad;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3739
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3740
	    extPtr = (char *)0;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3741
	    nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3742
	    nInstBytes = OHDR_SIZE + __OBJS2BYTES__(nInstVars);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3743
	    objSize = __Size(anObject) - nInstBytes;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3744
	}
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3745
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3746
	if ((offs >= 0) && (cnt >= 0) && (objSize >= (cnt + offs))) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3747
	    _buffered = (__INST(buffered) == true);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3748
	    if (_buffered) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3749
		__READING__(f);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3750
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3751
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3752
	    if (extPtr) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3753
		__READAVAILBYTES__(ret, f, extPtr+offs, cnt, _buffered);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3754
	    } else {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3755
		/*
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3756
		 * on interrupt, anObject may be moved to another location.
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3757
		 * So we pass (char *)__InstPtr(anObject) + nInstBytes + offs to the macro __READ_BYTES__,
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3758
		 * to get a new address.
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3759
		 */
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3760
		offs += nInstBytes;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3761
		__READAVAILBYTES_OBJ__(ret, f, anObject, offs, cnt, _buffered);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3762
	    }
5202
e8130049b18f #nextAvailableBytes:into:startingAt: may NOT set EOF flag,
Claus Gittinger <cg@exept.de>
parents: 5187
diff changeset
  3763
#ifdef PRE_22_jan_2000
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3764
	    if (ret > 0)
5202
e8130049b18f #nextAvailableBytes:into:startingAt: may NOT set EOF flag,
Claus Gittinger <cg@exept.de>
parents: 5187
diff changeset
  3765
#else
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3766
	    /* 0 is NOT an EOF condition here ... */
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3767
	    if (ret >= 0)
5202
e8130049b18f #nextAvailableBytes:into:startingAt: may NOT set EOF flag,
Claus Gittinger <cg@exept.de>
parents: 5187
diff changeset
  3768
#endif
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3769
	    {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3770
		if (__isSmallInteger(__INST(position))) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3771
		    INT np = __intVal(__INST(position)) + ret;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3772
		    OBJ t;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3773
8881
53e94478133f STORE macro fix (gcc3.4 bug)
Claus Gittinger <cg@exept.de>
parents: 8818
diff changeset
  3774
		    t = __MKINT(np); __INST(position) = t; __STORE(self, t);
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3775
		} else {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3776
		    __INST(position) = nil; /* i.e. do not know */
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3777
		}
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  3778
		RETURN (__mkSmallInteger(ret));
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3779
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3780
#ifdef PRE_22_jan_2000
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3781
	    if (ret == 0) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3782
		__INST(hitEOF) = true;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3783
	    } else /* ret < 0 */
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3784
#endif
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3785
	    {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3786
		__INST(position) = nil;
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  3787
		__INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3788
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3789
	}
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3790
    }
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3791
bad: ;
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3792
%}.
8614
88421fbd4ab6 pastEnd -> pastEndRead
Claus Gittinger <cg@exept.de>
parents: 8604
diff changeset
  3793
    (hitEOF and:[self pastEndRead isNil]) ifTrue:[^ 0].
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3794
    lastErrorNumber notNil ifTrue:[^ self readError].
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3795
    filePointer isNil ifTrue:[^ self errorNotOpen].
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3796
    (mode == #writeonly) ifTrue:[^ self errorWriteOnly].
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3797
    "
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3798
     count not integer or arg not bit-like (String, ByteArray etc)
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3799
    "
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3800
    ^ self primitiveFailed
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3801
!
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3802
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3803
nextByte
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3804
    "read the next byte and return it as an Integer; return nil on error.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3805
     This is allowed in both text and binary modes, always returning the
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3806
     bytes binary value as an integer in 0..255."
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3807
1067
1e7959af0821 removed all NOCONTEXT (last version did no good - PROTECT-stack overflow ...)
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
  3808
%{
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  3809
    FILEPOINTER f;
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3810
    unsigned char byte;
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  3811
    int ret, _buffered;
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3812
    OBJ fp;
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3813
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  3814
    __INST(lastErrorNumber) = nil;
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  3815
    if (((fp = __INST(filePointer)) != nil)
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  3816
     && (__INST(mode) != @symbol(writeonly))) {
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3817
	f = __FILEVal(fp);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3819
	_buffered = (__INST(buffered) == true);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3820
	if (_buffered) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3821
	    __READING__(f)
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3822
	}
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3823
	__READBYTE__(ret, f, &byte, _buffered);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3824
	if (ret > 0) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3825
	    if (__isSmallInteger(__INST(position))) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3826
		INT np = __intVal(__INST(position)) + 1;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3827
		OBJ t;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3828
8881
53e94478133f STORE macro fix (gcc3.4 bug)
Claus Gittinger <cg@exept.de>
parents: 8818
diff changeset
  3829
		t = __MKINT(np); __INST(position) = t; __STORE(self, t);
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3830
	    } else {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3831
		__INST(position) = nil; /* i.e. do not know */
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3832
	    }
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  3833
	    RETURN (__mkSmallInteger(byte));
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3834
	}
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3835
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3836
	if (ret == 0) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3837
	    __INST(hitEOF) = true;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3838
	} else /* ret < 0 */ {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3839
	    __INST(position) = nil;
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  3840
	    __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3841
	}
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3842
    }
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3843
%}.
8614
88421fbd4ab6 pastEnd -> pastEndRead
Claus Gittinger <cg@exept.de>
parents: 8604
diff changeset
  3844
    hitEOF ifTrue:[^ self pastEndRead].
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3845
    lastErrorNumber notNil ifTrue:[^ self readError].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3846
    filePointer isNil ifTrue:[^ self errorNotOpen].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3847
    ^ self errorWriteOnly
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3848
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3849
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3850
nextBytes:count into:anObject startingAt:start
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3851
    "read the next count bytes into an object and return the number of
2151
5f1fd65f8c3b next: must raise pastEnd, if EOF is hit;
Claus Gittinger <cg@exept.de>
parents: 2134
diff changeset
  3852
     bytes read or the number of bytes read, if EOF is encountered before.
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3853
     If the receiver is some socket/pipe-like stream, an exception
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3854
     is raised if the connection is broken.
2151
5f1fd65f8c3b next: must raise pastEnd, if EOF is hit;
Claus Gittinger <cg@exept.de>
parents: 2134
diff changeset
  3855
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3856
     Warning: if used with a pipe/socket, this blocks until the requested number
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3857
     of bytes have been read. See #nextAvailableBytes:into:startingAt:
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3858
     to only read whats there.
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  3859
2151
5f1fd65f8c3b next: must raise pastEnd, if EOF is hit;
Claus Gittinger <cg@exept.de>
parents: 2134
diff changeset
  3860
     Notice, that in contrast to other methods,
5f1fd65f8c3b next: must raise pastEnd, if EOF is hit;
Claus Gittinger <cg@exept.de>
parents: 2134
diff changeset
  3861
     this does NOT return nil on EOF, but the actual count.
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3862
     Thus allowing read of partial blocks.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3863
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3864
     The object must have non-pointer indexed instvars
3432
1228d4ba9518 allow reading/writing from/to ExternalBytes
Claus Gittinger <cg@exept.de>
parents: 3420
diff changeset
  3865
     (i.e. it must be a ByteArray, String, Float- or DoubleArray),
1228d4ba9518 allow reading/writing from/to ExternalBytes
Claus Gittinger <cg@exept.de>
parents: 3420
diff changeset
  3866
     or an externalBytes object (with known size).
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3867
     If anObject is a string or byteArray and reused, this provides the
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3868
     fastest possible physical I/O (since no new objects are allocated).
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3869
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3870
     Use with care - non object oriented I/O.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3871
     Warning: in general, you cannot use this method to pass data from other
3432
1228d4ba9518 allow reading/writing from/to ExternalBytes
Claus Gittinger <cg@exept.de>
parents: 3420
diff changeset
  3872
     architectures (unless you prepared the buffer with care),
1228d4ba9518 allow reading/writing from/to ExternalBytes
Claus Gittinger <cg@exept.de>
parents: 3420
diff changeset
  3873
     since it does not care for byte order or float representation."
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3874
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3875
%{
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  3876
    FILEPOINTER f;
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  3877
    int cnt, offs, ret, _buffered;
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3878
    int objSize, nInstVars, nInstBytes;
3432
1228d4ba9518 allow reading/writing from/to ExternalBytes
Claus Gittinger <cg@exept.de>
parents: 3420
diff changeset
  3879
    char *extPtr;
7195
755c46f9b774 also handle subclasses of ExternalBytes (Mapped..)
Claus Gittinger <cg@exept.de>
parents: 7118
diff changeset
  3880
    OBJ fp;
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3881
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  3882
    __INST(lastErrorNumber) = nil;
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  3883
    if (((fp = __INST(filePointer)) != nil)
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3884
	&& (__INST(mode) != @symbol(writeonly))
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3885
	&& __bothSmallInteger(count, start)
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  3886
    ) {
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3887
	f = __FILEVal(fp);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3888
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3889
	cnt = __intVal(count);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3890
	offs = __intVal(start) - 1;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3891
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3892
	if (__isExternalBytesLike(anObject)) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3893
	    OBJ sz;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3894
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3895
	    nInstBytes = 0;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3896
	    extPtr = (char *)(__externalBytesAddress(anObject));
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3897
	    sz = __externalBytesSize(anObject);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3898
	    if (__isSmallInteger(sz)) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3899
		objSize = __intVal(sz);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3900
	    } else {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3901
		objSize = 0; /* unknown */
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3902
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3903
	} else {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3904
	    OBJ oClass;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3905
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3906
	    oClass = __Class(anObject);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3907
	    switch (__intVal(__ClassInstPtr(oClass)->c_flags) & ARRAYMASK) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3908
		case BYTEARRAY:
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3909
		case WORDARRAY:
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3910
		case LONGARRAY:
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3911
		case SWORDARRAY:
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3912
		case SLONGARRAY:
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3913
		case FLOATARRAY:
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3914
		case DOUBLEARRAY:
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3915
		    break;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3916
		default:
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3917
		    goto bad;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3918
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3919
	    extPtr = (char *)0;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3920
	    nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3921
	    nInstBytes = OHDR_SIZE + __OBJS2BYTES__(nInstVars);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3922
	    objSize = __Size(anObject) - nInstBytes;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3923
	}
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3924
	if ((offs >= 0) && (cnt >= 0) && (objSize >= (cnt + offs))) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3925
	    _buffered = (__INST(buffered) == true);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3926
	    if (_buffered) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3927
		__READING__(f);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3928
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3929
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3930
	    if (extPtr) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3931
		__READBYTES__(ret, f, extPtr+offs, cnt, _buffered);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3932
	    } else {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3933
		/*
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3934
		 * on interrupt, anObject may be moved to another location.
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3935
		 * So we pass anObject, and the offset to the __READBYTES_OBJ__ macro.
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3936
		 */
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3937
		offs += nInstBytes;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3938
		__READBYTES_OBJ__(ret, f, anObject, offs, cnt, _buffered);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3939
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3940
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3941
	    if (ret > 0) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3942
		if (__isSmallInteger(__INST(position))) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3943
		    INT np = __intVal(__INST(position)) + ret;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3944
		    OBJ t;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3945
8881
53e94478133f STORE macro fix (gcc3.4 bug)
Claus Gittinger <cg@exept.de>
parents: 8818
diff changeset
  3946
		    t = __MKINT(np); __INST(position) = t; __STORE(self, t);
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3947
		} else {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3948
		    __INST(position) = nil; /* i.e. do not know */
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3949
		}
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  3950
		RETURN (__mkSmallInteger(ret));
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3951
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3952
	    if (ret == 0) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3953
		__INST(hitEOF) = true;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3954
	    } else /* ret < 0 */ {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3955
		__INST(position) = nil;
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  3956
		__INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3957
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3958
	}
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3959
    }
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3960
bad: ;
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3961
%}.
8614
88421fbd4ab6 pastEnd -> pastEndRead
Claus Gittinger <cg@exept.de>
parents: 8604
diff changeset
  3962
    (hitEOF and:[self pastEndRead isNil]) ifTrue:[^ 0].
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3963
    lastErrorNumber notNil ifTrue:[^ self readError].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3964
    filePointer isNil ifTrue:[^ self errorNotOpen].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3965
    (mode == #writeonly) ifTrue:[^ self errorWriteOnly].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3966
    "
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3967
     count not integer or arg not bit-like (String, ByteArray etc)
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3968
    "
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3969
    ^ self primitiveFailed
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3970
!
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3971
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3972
nextLong
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3973
    "Read four bytes (msb-first) and return the value as a 32-bit signed Integer.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3974
     The returned value may be a LargeInteger.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3975
     (msb-first for compatibility with other smalltalks)"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3976
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3977
    ^ self nextUnsignedLongMSB:true
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3978
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3979
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3980
nextLongMSB:msbFlag
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3981
    "Read four bytes and return the value as a 32-bit signed Integer,
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3982
     which may be a LargeInteger.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3983
     If msbFlag is true, value is read with most-significant byte first,
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3984
     otherwise least-significant byte comes first.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3985
     A nil is returned, if EOF is hit before all 4 bytes have been read.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3986
     Works in both binary and text modes."
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3987
1067
1e7959af0821 removed all NOCONTEXT (last version did no good - PROTECT-stack overflow ...)
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
  3988
%{
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3989
    OBJ fp;
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  3990
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  3991
    __INST(lastErrorNumber) = nil;
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  3992
    if (((fp = __INST(filePointer)) != nil)
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3993
	&& (__INST(mode) != @symbol(writeonly))
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  3994
    ) {
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3995
	FILEPOINTER f;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3996
	int ret, _buffered;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3997
	int value;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3998
	union {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  3999
	    unsigned char buffer[4];
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4000
	    int intVal;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4001
	} u;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4002
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4003
	f = __FILEVal(fp);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4004
	_buffered = (__INST(buffered) == true);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4005
	if (_buffered) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4006
	    __READING__(f)
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4007
	}
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4008
	__READBYTES__(ret, f, u.buffer, 4, _buffered);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4009
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4010
	if (ret == 4) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4011
	    if (__isSmallInteger(__INST(position))) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4012
		INT np = __intVal(__INST(position)) + 4;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4013
		OBJ t;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4014
8881
53e94478133f STORE macro fix (gcc3.4 bug)
Claus Gittinger <cg@exept.de>
parents: 8818
diff changeset
  4015
		t = __MKINT(np); __INST(position) = t; __STORE(self, t);
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4016
	    } else {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4017
		__INST(position) = nil; /* i.e. do not know */
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4018
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4019
	    if (msbFlag == true) {
8901
824a89d0b5c7 alpha64 vs. POINTER_SIZE cleanup
Claus Gittinger <cg@exept.de>
parents: 8881
diff changeset
  4020
#if defined(__MSBFIRST__)
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4021
		value = u.intVal;
4383
7a5abc09fb39 slightly tuned nextXXXLongMSB: and nextUnsignedXXXMSB:
Claus Gittinger <cg@exept.de>
parents: 4368
diff changeset
  4022
#else
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4023
		value = (u.buffer[0] & 0xFF);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4024
		value = (value << 8) | (u.buffer[1] & 0xFF);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4025
		value = (value << 8) | (u.buffer[2] & 0xFF);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4026
		value = (value << 8) | (u.buffer[3] & 0xFF);
4383
7a5abc09fb39 slightly tuned nextXXXLongMSB: and nextUnsignedXXXMSB:
Claus Gittinger <cg@exept.de>
parents: 4368
diff changeset
  4027
#endif
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4028
	    } else {
8901
824a89d0b5c7 alpha64 vs. POINTER_SIZE cleanup
Claus Gittinger <cg@exept.de>
parents: 8881
diff changeset
  4029
#if defined(__LSBFIRST__)
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4030
		value = u.intVal;
4383
7a5abc09fb39 slightly tuned nextXXXLongMSB: and nextUnsignedXXXMSB:
Claus Gittinger <cg@exept.de>
parents: 4368
diff changeset
  4031
#else
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4032
		value = (u.buffer[3] & 0xFF);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4033
		value = (value << 8) | (u.buffer[2] & 0xFF);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4034
		value = (value << 8) | (u.buffer[1] & 0xFF);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4035
		value = (value << 8) | (u.buffer[0] & 0xFF);
4383
7a5abc09fb39 slightly tuned nextXXXLongMSB: and nextUnsignedXXXMSB:
Claus Gittinger <cg@exept.de>
parents: 4368
diff changeset
  4036
#endif
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4037
	    }
8901
824a89d0b5c7 alpha64 vs. POINTER_SIZE cleanup
Claus Gittinger <cg@exept.de>
parents: 8881
diff changeset
  4038
#if __POINTER_SIZE__ == 8
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  4039
	    RETURN ( __mkSmallInteger(value));
4383
7a5abc09fb39 slightly tuned nextXXXLongMSB: and nextUnsignedXXXMSB:
Claus Gittinger <cg@exept.de>
parents: 4368
diff changeset
  4040
#else
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4041
	    if ((value >= _MIN_INT) && (value <= _MAX_INT)) {
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  4042
		RETURN ( __mkSmallInteger(value));
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4043
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4044
	    RETURN ( __MKLARGEINT(value) );
4383
7a5abc09fb39 slightly tuned nextXXXLongMSB: and nextUnsignedXXXMSB:
Claus Gittinger <cg@exept.de>
parents: 4368
diff changeset
  4045
#endif
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4046
	}
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4047
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4048
	if (ret < 0) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4049
	    __INST(position) = nil;
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  4050
	    __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4051
	} else /* ret == 0 */ {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4052
	    __INST(hitEOF) = true;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4053
	}
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4054
    }
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4055
%}.
8614
88421fbd4ab6 pastEnd -> pastEndRead
Claus Gittinger <cg@exept.de>
parents: 8604
diff changeset
  4056
    hitEOF ifTrue:[^ self pastEndRead].
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4057
    filePointer isNil ifTrue:[^ self errorNotOpen].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4058
    (mode == #writeonly) ifTrue:[^ self errorWriteOnly].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4059
    ^ self readError.
362
claus
parents: 360
diff changeset
  4060
!
claus
parents: 360
diff changeset
  4061
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4062
nextShortMSB:msbFlag
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4063
    "Read two bytes and return the value as a 16-bit signed Integer.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4064
     If msbFlag is true, value is read with most-significant byte first,
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4065
     otherwise least-significant byte comes first.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4066
     A nil is returned if EOF is reached (also when EOF is hit after the first byte).
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4067
     Works in both binary and text modes."
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4068
1067
1e7959af0821 removed all NOCONTEXT (last version did no good - PROTECT-stack overflow ...)
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
  4069
%{
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4070
    OBJ fp;
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4071
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  4072
    __INST(lastErrorNumber) = nil;
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  4073
    if (((fp = __INST(filePointer)) != nil)
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4074
	&& (__INST(mode) != @symbol(writeonly))
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  4075
    ) {
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4076
	FILEPOINTER f;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4077
	int ret, _buffered;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4078
	short value;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4079
	union {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4080
	    unsigned char buffer[2];
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4081
	    short shortVal;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4082
	} u;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4083
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4084
	f = __FILEVal(fp);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4085
	_buffered = (__INST(buffered) == true);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4086
	if (_buffered) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4087
	    __READING__(f)
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4088
	}
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4089
	__READBYTES__(ret, f, u.buffer, 2, _buffered);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4090
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4091
	if (ret == 2) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4092
	    if (__isSmallInteger(__INST(position))) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4093
		INT np = __intVal(__INST(position)) + 2;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4094
		OBJ t;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4095
8881
53e94478133f STORE macro fix (gcc3.4 bug)
Claus Gittinger <cg@exept.de>
parents: 8818
diff changeset
  4096
		t = __MKINT(np); __INST(position) = t; __STORE(self, t);
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4097
	    } else {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4098
		__INST(position) = nil; /* i.e. do not know */
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4099
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4100
	    if (msbFlag == true) {
8901
824a89d0b5c7 alpha64 vs. POINTER_SIZE cleanup
Claus Gittinger <cg@exept.de>
parents: 8881
diff changeset
  4101
#if defined(__MSBFIRST__)
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4102
		value = u.shortVal;
4383
7a5abc09fb39 slightly tuned nextXXXLongMSB: and nextUnsignedXXXMSB:
Claus Gittinger <cg@exept.de>
parents: 4368
diff changeset
  4103
#else
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4104
		value = ((u.buffer[0] & 0xFF) << 8) | (u.buffer[1] & 0xFF);
4383
7a5abc09fb39 slightly tuned nextXXXLongMSB: and nextUnsignedXXXMSB:
Claus Gittinger <cg@exept.de>
parents: 4368
diff changeset
  4105
#endif
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4106
	    } else {
8901
824a89d0b5c7 alpha64 vs. POINTER_SIZE cleanup
Claus Gittinger <cg@exept.de>
parents: 8881
diff changeset
  4107
#if defined(__LSBFIRST__)
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4108
		value = u.shortVal;
4383
7a5abc09fb39 slightly tuned nextXXXLongMSB: and nextUnsignedXXXMSB:
Claus Gittinger <cg@exept.de>
parents: 4368
diff changeset
  4109
#else
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4110
		value = ((u.buffer[1] & 0xFF) << 8) | (u.buffer[0] & 0xFF);
4383
7a5abc09fb39 slightly tuned nextXXXLongMSB: and nextUnsignedXXXMSB:
Claus Gittinger <cg@exept.de>
parents: 4368
diff changeset
  4111
#endif
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4112
	    }
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  4113
	    RETURN (__mkSmallInteger(value));
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4114
	}
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4115
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4116
	if (ret < 0) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4117
	    __INST(position) = nil; /* i.e. do not know */
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  4118
	    __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4119
	} else /* ret == 0 */ {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4120
	    __INST(hitEOF) = true;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4121
	}
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4122
    }
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4123
%}.
8614
88421fbd4ab6 pastEnd -> pastEndRead
Claus Gittinger <cg@exept.de>
parents: 8604
diff changeset
  4124
    hitEOF ifTrue:[^ self pastEndRead].
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4125
    filePointer isNil ifTrue:[^ self errorNotOpen].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4126
    (mode == #writeonly) ifTrue:[^ self errorWriteOnly].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4127
    ^ self readError.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4128
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4129
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4130
nextUnsignedLongMSB:msbFlag
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4131
    "Read four bytes and return the value as a 32-bit unsigned Integer, which may be
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4132
     a LargeInteger.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4133
     If msbFlag is true, value is read with most-significant byte first, otherwise
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4134
     least-significant byte comes first.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4135
     A nil is returned, if endOfFile occurs before all 4 bytes have been read.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4136
     Works in both binary and text modes."
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4137
1067
1e7959af0821 removed all NOCONTEXT (last version did no good - PROTECT-stack overflow ...)
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
  4138
%{
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4139
    OBJ fp;
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4140
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  4141
    __INST(lastErrorNumber) = nil;
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  4142
    if (((fp = __INST(filePointer)) != nil)
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4143
	&& (__INST(mode) != @symbol(writeonly))
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  4144
    ) {
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4145
	FILEPOINTER f;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4146
	int ret, _buffered;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4147
	unsigned INT value;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4148
	union {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4149
	    unsigned char buffer[4];
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4150
	    unsigned int intVal;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4151
	} u;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4152
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4153
	f = __FILEVal(fp);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4154
	_buffered = (__INST(buffered) == true);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4155
	if (_buffered) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4156
	    __READING__(f)
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4157
	}
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4158
	__READBYTES__(ret, f, u.buffer, 4, _buffered);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4159
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4160
	if (ret == 4) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4161
	    if (__isSmallInteger(__INST(position))) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4162
		INT np = __intVal(__INST(position)) + 4;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4163
		OBJ t;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4164
8881
53e94478133f STORE macro fix (gcc3.4 bug)
Claus Gittinger <cg@exept.de>
parents: 8818
diff changeset
  4165
		t = __MKINT(np); __INST(position) = t; __STORE(self, t);
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4166
	    } else {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4167
		__INST(position) = nil; /* i.e. do not know */
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4168
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4169
	    if (msbFlag == true) {
8901
824a89d0b5c7 alpha64 vs. POINTER_SIZE cleanup
Claus Gittinger <cg@exept.de>
parents: 8881
diff changeset
  4170
#if defined(__MSBFIRST__)
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4171
		value = u.intVal;
4383
7a5abc09fb39 slightly tuned nextXXXLongMSB: and nextUnsignedXXXMSB:
Claus Gittinger <cg@exept.de>
parents: 4368
diff changeset
  4172
#else
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4173
		value = u.buffer[0];
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4174
		value = (value << 8) | u.buffer[1];
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4175
		value = (value << 8) | u.buffer[2];
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4176
		value = (value << 8) | u.buffer[3];
4383
7a5abc09fb39 slightly tuned nextXXXLongMSB: and nextUnsignedXXXMSB:
Claus Gittinger <cg@exept.de>
parents: 4368
diff changeset
  4177
#endif
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4178
	    } else {
8901
824a89d0b5c7 alpha64 vs. POINTER_SIZE cleanup
Claus Gittinger <cg@exept.de>
parents: 8881
diff changeset
  4179
#if defined(__LSBFIRST__)
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4180
		value = u.intVal;
4383
7a5abc09fb39 slightly tuned nextXXXLongMSB: and nextUnsignedXXXMSB:
Claus Gittinger <cg@exept.de>
parents: 4368
diff changeset
  4181
#else
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4182
		value = u.buffer[3];
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4183
		value = (value << 8) | u.buffer[2];
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4184
		value = (value << 8) | u.buffer[1];
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4185
		value = (value << 8) | u.buffer[0];
4383
7a5abc09fb39 slightly tuned nextXXXLongMSB: and nextUnsignedXXXMSB:
Claus Gittinger <cg@exept.de>
parents: 4368
diff changeset
  4186
#endif
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4187
	    }
8901
824a89d0b5c7 alpha64 vs. POINTER_SIZE cleanup
Claus Gittinger <cg@exept.de>
parents: 8881
diff changeset
  4188
#if __POINTER_SIZE__ == 8
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4189
	    value &= 0xFFFFFFFF;
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  4190
	    RETURN (__mkSmallInteger(value));
4383
7a5abc09fb39 slightly tuned nextXXXLongMSB: and nextUnsignedXXXMSB:
Claus Gittinger <cg@exept.de>
parents: 4368
diff changeset
  4191
#else
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4192
	    if (value <= _MAX_INT) {
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  4193
		RETURN (__mkSmallInteger(value));
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4194
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4195
	    RETURN (__MKULARGEINT(value) );
3456
0cdf451360b9 oops - nextUnsignedLong:MSB: on alpha.
Claus Gittinger <cg@exept.de>
parents: 3445
diff changeset
  4196
#endif
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4197
	}
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4198
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4199
	if (ret < 0) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4200
	    __INST(position) = nil; /* i.e. do not know */
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  4201
	    __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4202
	} else /* ret == 0 */ {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4203
	    __INST(hitEOF) = true;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4204
	}
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4205
    }
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4206
%}.
8614
88421fbd4ab6 pastEnd -> pastEndRead
Claus Gittinger <cg@exept.de>
parents: 8604
diff changeset
  4207
    hitEOF ifTrue:[^ self pastEndRead].
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4208
    filePointer isNil ifTrue:[^ self errorNotOpen].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4209
    (mode == #writeonly) ifTrue:[^ self errorWriteOnly].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4210
    ^ self readError.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4211
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4212
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4213
nextUnsignedShortMSB:msbFlag
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4214
    "Read two bytes and return the value as a 16-bit unsigned Integer.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4215
     If msbFlag is true, value is read with most-significant byte first,
1079
d47cd86b487b Make methods signal-proof.
Stefan Vogel <sv@exept.de>
parents: 1068
diff changeset
  4216
     otherwise least-significant byte comes first.
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4217
     A nil is returned if EOF is reached (also when EOF is hit after the first byte).
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4218
     Works in both binary and text modes."
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4219
1067
1e7959af0821 removed all NOCONTEXT (last version did no good - PROTECT-stack overflow ...)
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
  4220
%{
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4221
    OBJ fp;
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4222
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  4223
    __INST(lastErrorNumber) = nil;
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  4224
    if (((fp = __INST(filePointer)) != nil)
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4225
	&& (__INST(mode) != @symbol(writeonly))
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  4226
    ) {
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4227
	FILEPOINTER f;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4228
	int ret, _buffered;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4229
	unsigned int value;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4230
	union {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4231
	    unsigned char buffer[2];
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4232
	    unsigned short shortVal;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4233
	} u;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4234
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4235
	f = __FILEVal(fp);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4236
	_buffered = (__INST(buffered) == true);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4237
	if (_buffered) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4238
	    __READING__(f)
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4239
	}
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4240
	__READBYTES__(ret, f, u.buffer, 2, _buffered);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4241
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4242
	if (ret == 2) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4243
	    if (__isSmallInteger(__INST(position))) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4244
		INT np = __intVal(__INST(position)) + 2;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4245
		OBJ t;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4246
8881
53e94478133f STORE macro fix (gcc3.4 bug)
Claus Gittinger <cg@exept.de>
parents: 8818
diff changeset
  4247
		t = __MKINT(np); __INST(position) = t; __STORE(self, t);
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4248
	    } else {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4249
		__INST(position) = nil; /* i.e. do not know */
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4250
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4251
	    if (msbFlag == true) {
8901
824a89d0b5c7 alpha64 vs. POINTER_SIZE cleanup
Claus Gittinger <cg@exept.de>
parents: 8881
diff changeset
  4252
#if defined(__MSBFIRST__)
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4253
		value = u.shortVal;
4383
7a5abc09fb39 slightly tuned nextXXXLongMSB: and nextUnsignedXXXMSB:
Claus Gittinger <cg@exept.de>
parents: 4368
diff changeset
  4254
#else
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4255
		value = (u.buffer[0] << 8) | u.buffer[1];
4383
7a5abc09fb39 slightly tuned nextXXXLongMSB: and nextUnsignedXXXMSB:
Claus Gittinger <cg@exept.de>
parents: 4368
diff changeset
  4256
#endif
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4257
	    } else {
8901
824a89d0b5c7 alpha64 vs. POINTER_SIZE cleanup
Claus Gittinger <cg@exept.de>
parents: 8881
diff changeset
  4258
#if defined(__LSBFIRST__)
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4259
		value = u.shortVal;
4383
7a5abc09fb39 slightly tuned nextXXXLongMSB: and nextUnsignedXXXMSB:
Claus Gittinger <cg@exept.de>
parents: 4368
diff changeset
  4260
#else
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4261
		value = (u.buffer[1] << 8) | u.buffer[0];
4383
7a5abc09fb39 slightly tuned nextXXXLongMSB: and nextUnsignedXXXMSB:
Claus Gittinger <cg@exept.de>
parents: 4368
diff changeset
  4262
#endif
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4263
	    }
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  4264
	    RETURN (__mkSmallInteger(value));
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4265
	}
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4266
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4267
	if (ret < 0) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4268
	    __INST(position) = nil; /* i.e. do not know */
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  4269
	    __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4270
	} else /* ret == 0 */ {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4271
	    __INST(hitEOF) = true;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4272
	}
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4273
    }
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4274
%}.
8614
88421fbd4ab6 pastEnd -> pastEndRead
Claus Gittinger <cg@exept.de>
parents: 8604
diff changeset
  4275
    hitEOF ifTrue:[^ self pastEndRead].
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4276
    filePointer isNil ifTrue:[^ self errorNotOpen].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4277
    (mode == #writeonly) ifTrue:[^ self errorWriteOnly].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4278
    ^ self readError.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4279
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4280
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4281
nextWord
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4282
    "in text-mode:
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  4283
	 read the alphaNumeric next word (i.e. up to non letter-or-digit).
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  4284
	 return a string containing those characters.
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4285
     in binary-mode:
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4286
	 read two bytes (msb-first) and return the value as a 16-bit
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  4287
	 unsigned Integer (for compatibility with other smalltalks)"
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4288
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4289
    binary ifTrue:[
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  4290
	^ self nextUnsignedShortMSB:true
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  4291
    ].
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4292
    ^ self nextAlphaNumericWord
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4293
! !
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4294
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4295
!ExternalStream methodsFor:'non homogenous writing'!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4296
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4297
nextPutByte:aByteValue
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4298
    "write a byte.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4299
     Works in both binary and text modes."
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4300
1067
1e7959af0821 removed all NOCONTEXT (last version did no good - PROTECT-stack overflow ...)
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
  4301
%{
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  4302
    FILEPOINTER f;
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4303
    char c;
7875
eb7d48b0425d made all position-handling code 32bit save
Claus Gittinger <cg@exept.de>
parents: 7832
diff changeset
  4304
    OBJ fp;
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  4305
    int cnt, _buffered;
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4306
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  4307
    __INST(lastErrorNumber) = nil;
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  4308
    if (((fp = __INST(filePointer)) != nil)
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4309
	&& (__INST(mode) != @symbol(readonly))
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4310
	&& __isSmallInteger(aByteValue)
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  4311
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  4312
    ) {
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4313
	c = __intVal(aByteValue);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4314
	f = __FILEVal(fp);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4315
	if (_buffered = (__INST(buffered) == true)) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4316
	    __WRITING__(f)
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4317
	}
9053
f3f3d48d6f44 fix writing to stdout/stderr for winstx non-console operation
Claus Gittinger <cg@exept.de>
parents: 9024
diff changeset
  4318
#ifdef WIN32
10328
ad731a7584a3 ensure that win32_fwrite is used for stdout and stderr
Claus Gittinger <cg@exept.de>
parents: 9053
diff changeset
  4319
	if ((f == __win32_stdout()) || (f == __win32_stderr())) {
ad731a7584a3 ensure that win32_fwrite is used for stdout and stderr
Claus Gittinger <cg@exept.de>
parents: 9053
diff changeset
  4320
	    cnt = __win32_fwrite(&c, 1, 1, f);
9053
f3f3d48d6f44 fix writing to stdout/stderr for winstx non-console operation
Claus Gittinger <cg@exept.de>
parents: 9024
diff changeset
  4321
	} else
f3f3d48d6f44 fix writing to stdout/stderr for winstx non-console operation
Claus Gittinger <cg@exept.de>
parents: 9024
diff changeset
  4322
#endif
f3f3d48d6f44 fix writing to stdout/stderr for winstx non-console operation
Claus Gittinger <cg@exept.de>
parents: 9024
diff changeset
  4323
	{
f3f3d48d6f44 fix writing to stdout/stderr for winstx non-console operation
Claus Gittinger <cg@exept.de>
parents: 9024
diff changeset
  4324
	    __WRITEBYTE__(cnt, f, &c, _buffered);
f3f3d48d6f44 fix writing to stdout/stderr for winstx non-console operation
Claus Gittinger <cg@exept.de>
parents: 9024
diff changeset
  4325
	}
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4326
	if (cnt == 1) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4327
	    if (__isSmallInteger(__INST(position))) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4328
		INT np = __intVal(__INST(position)) + 1;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4329
		OBJ t;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4330
8881
53e94478133f STORE macro fix (gcc3.4 bug)
Claus Gittinger <cg@exept.de>
parents: 8818
diff changeset
  4331
		t = __MKINT(np); __INST(position) = t; __STORE(self, t);
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4332
	    } else {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4333
		__INST(position) = nil; /* i.e. do not know */
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4334
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4335
	    RETURN (self);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4336
	}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4337
	if (cnt < 0) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4338
	    __INST(position) = nil; /* i.e. do not know */
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4339
	}
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  4340
	__INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4341
    }
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4342
%}.
7801
d930c353588d writeError: care for EWOULDBLOCK in nonBlocking case.
penk
parents: 7737
diff changeset
  4343
    filePointer isNil ifTrue:[self errorNotOpen. ^ self].
d930c353588d writeError: care for EWOULDBLOCK in nonBlocking case.
penk
parents: 7737
diff changeset
  4344
    (mode == #readonly) ifTrue:[self errorReadOnly. ^ self].
2331
d6ddf452adc9 return codes in error cases
Claus Gittinger <cg@exept.de>
parents: 2326
diff changeset
  4345
    self writeError.
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4346
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4347
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4348
nextPutBytes:count from:anObject startingAt:start
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4349
    "write count bytes from an object starting at index start.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4350
     return the number of bytes written - which could be 0.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4351
     The object must have non-pointer indexed instvars
3432
1228d4ba9518 allow reading/writing from/to ExternalBytes
Claus Gittinger <cg@exept.de>
parents: 3420
diff changeset
  4352
     (i.e. be a ByteArray, String, Float- or DoubleArray),
1228d4ba9518 allow reading/writing from/to ExternalBytes
Claus Gittinger <cg@exept.de>
parents: 3420
diff changeset
  4353
     or an externalBytes object (with known size).
1228d4ba9518 allow reading/writing from/to ExternalBytes
Claus Gittinger <cg@exept.de>
parents: 3420
diff changeset
  4354
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4355
     Use with care - non object oriented i/o.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4356
     Warning:
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4357
	in general, you cannot use this method to pass non-byte data to other
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4358
	architectures (unless you prepared the buffer with care),
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4359
	since it does not care for byte order or float representation."
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4360
1067
1e7959af0821 removed all NOCONTEXT (last version did no good - PROTECT-stack overflow ...)
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
  4361
%{
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  4362
    FILEPOINTER f;
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  4363
    int cnt, len, offs, ret;
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  4364
    int objSize, nInstVars, nInstBytes, _buffered;
3432
1228d4ba9518 allow reading/writing from/to ExternalBytes
Claus Gittinger <cg@exept.de>
parents: 3420
diff changeset
  4365
    char *extPtr;
7875
eb7d48b0425d made all position-handling code 32bit save
Claus Gittinger <cg@exept.de>
parents: 7832
diff changeset
  4366
    OBJ fp;
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4367
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  4368
    __INST(lastErrorNumber) = nil;
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  4369
    if (((fp = __INST(filePointer)) != nil)
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4370
	&& (__INST(mode) != @symbol(readonly))
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4371
	&& __bothSmallInteger(count, start)
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  4372
    ) {
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4373
	len = __intVal(count);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4374
	offs = __intVal(start) - 1;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4375
	f = __FILEVal(fp);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4376
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4377
	if (__isExternalBytesLike(anObject)) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4378
	    OBJ sz;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4379
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4380
	    nInstBytes = 0;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4381
	    extPtr = (char *)__externalBytesAddress(anObject);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4382
	    sz = __externalBytesSize(anObject);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4383
	    if (__isSmallInteger(sz)) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4384
		objSize = __intVal(sz);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4385
	    } else {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4386
		objSize = 0; /* unknown */
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4387
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4388
	} else {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4389
	    OBJ oClass;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4390
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4391
	    oClass = __Class(anObject);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4392
	    switch (__intVal(__ClassInstPtr(oClass)->c_flags) & ARRAYMASK) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4393
		case BYTEARRAY:
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4394
		case WORDARRAY:
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4395
		case LONGARRAY:
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4396
		case SWORDARRAY:
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4397
		case SLONGARRAY:
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4398
		case FLOATARRAY:
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4399
		case DOUBLEARRAY:
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4400
		    break;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4401
		default:
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4402
		    goto bad;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4403
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4404
	    extPtr = (char *)0;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4405
	    nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4406
	    nInstBytes = OHDR_SIZE + __OBJS2BYTES__(nInstVars);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4407
	    objSize = __Size(anObject) - nInstBytes;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4408
	}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4409
	if ( (offs >= 0) && (len >= 0) && (objSize >= (len + offs)) ) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4410
	    if (_buffered = (__INST(buffered) == true)) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4411
		__WRITING__(f)
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4412
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4413
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4414
	    if (extPtr) {
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4415
		__WRITEBYTES__(cnt, f, extPtr+offs, len, _buffered);
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4416
	    } else {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4417
		/*
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4418
		 * on interrupt, anObject may be moved to another location.
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4419
		 * So we pass anObject, and the offset to the __WRITEBYTES_OBJ__ macro.
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4420
		 */
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4421
		offs += nInstBytes;
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4422
		__WRITEBYTES_OBJ__(cnt, f, anObject, offs, len, _buffered);
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4423
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4424
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4425
	    if (cnt >= 0) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4426
		if (__isSmallInteger(__INST(position))) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4427
		    INT np = __intVal(__INST(position)) + cnt;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4428
		    OBJ t;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4429
8881
53e94478133f STORE macro fix (gcc3.4 bug)
Claus Gittinger <cg@exept.de>
parents: 8818
diff changeset
  4430
		    t = __MKINT(np); __INST(position) = t; __STORE(self, t);
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4431
		} else {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4432
		    __INST(position) = nil; /* i.e. do not know */
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4433
		}
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  4434
		RETURN ( __mkSmallInteger(cnt) );
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4435
	    }
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4436
	    if (
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4437
#ifdef EWOULDBLOCK
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4438
		(__threadErrno == EWOULDBLOCK) ||
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4439
#endif
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4440
		(__threadErrno == EAGAIN)
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4441
	    ) {
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  4442
		RETURN ( __mkSmallInteger(0) );
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4443
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4444
	    __INST(position) = nil; /* i.e. do not know */
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  4445
	    __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4446
	}
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4447
    }
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4448
bad: ;
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4449
%}.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4450
    lastErrorNumber notNil ifTrue:[^ self writeError].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4451
    filePointer isNil ifTrue:[^ self errorNotOpen].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4452
    (mode == #readonly) ifTrue:[^ self errorReadOnly].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4453
    ^ self primitiveFailed
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4454
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4455
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4456
nextPutLong:aNumber MSB:msbFlag
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4457
    "Write the argument, aNumber as a long (four bytes). If msbFlag is
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4458
     true, data is written most-significant byte first; otherwise least
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4459
     first.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4460
     Works in both binary and text modes."
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4461
1067
1e7959af0821 removed all NOCONTEXT (last version did no good - PROTECT-stack overflow ...)
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
  4462
%{
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4463
    int num;
4384
f8e779b99b14 slightly tuned nextPutLongMSB: and nextPutShortMSB:
Claus Gittinger <cg@exept.de>
parents: 4383
diff changeset
  4464
    union {
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4465
	char bytes[4];
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4466
	int intVal;
4384
f8e779b99b14 slightly tuned nextPutLongMSB: and nextPutShortMSB:
Claus Gittinger <cg@exept.de>
parents: 4383
diff changeset
  4467
    } u;
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  4468
    FILEPOINTER f;
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  4469
    int cnt, _buffered;
4384
f8e779b99b14 slightly tuned nextPutLongMSB: and nextPutShortMSB:
Claus Gittinger <cg@exept.de>
parents: 4383
diff changeset
  4470
    OBJ fp;
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4471
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  4472
    __INST(lastErrorNumber) = nil;
4384
f8e779b99b14 slightly tuned nextPutLongMSB: and nextPutShortMSB:
Claus Gittinger <cg@exept.de>
parents: 4383
diff changeset
  4473
    if (__isSmallInteger(aNumber)) {
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4474
	num = __intVal(aNumber);
4384
f8e779b99b14 slightly tuned nextPutLongMSB: and nextPutShortMSB:
Claus Gittinger <cg@exept.de>
parents: 4383
diff changeset
  4475
    } else {
8901
824a89d0b5c7 alpha64 vs. POINTER_SIZE cleanup
Claus Gittinger <cg@exept.de>
parents: 8881
diff changeset
  4476
#if __POINTER_SIZE__ == 8
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4477
	goto badArg;
4384
f8e779b99b14 slightly tuned nextPutLongMSB: and nextPutShortMSB:
Claus Gittinger <cg@exept.de>
parents: 4383
diff changeset
  4478
#else
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4479
	num = __longIntVal(aNumber);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4480
	if (num == 0) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4481
	    num = __signedLongIntVal(aNumber);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4482
	    if (num == 0) {
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4483
		/* bad arg or out-of-range integer
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4484
		 * (handled by the fallBack code)
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4485
		 */
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4486
		goto badArg;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4487
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4488
	}
4384
f8e779b99b14 slightly tuned nextPutLongMSB: and nextPutShortMSB:
Claus Gittinger <cg@exept.de>
parents: 4383
diff changeset
  4489
#endif
f8e779b99b14 slightly tuned nextPutLongMSB: and nextPutShortMSB:
Claus Gittinger <cg@exept.de>
parents: 4383
diff changeset
  4490
    }
f8e779b99b14 slightly tuned nextPutLongMSB: and nextPutShortMSB:
Claus Gittinger <cg@exept.de>
parents: 4383
diff changeset
  4491
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  4492
    if (((fp = __INST(filePointer)) != nil)
4384
f8e779b99b14 slightly tuned nextPutLongMSB: and nextPutShortMSB:
Claus Gittinger <cg@exept.de>
parents: 4383
diff changeset
  4493
     && (__INST(mode) != @symbol(readonly))
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  4494
    ) {
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4495
	if (msbFlag == true) {
8901
824a89d0b5c7 alpha64 vs. POINTER_SIZE cleanup
Claus Gittinger <cg@exept.de>
parents: 8881
diff changeset
  4496
#if defined(__MSBFIRST__)
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4497
	    u.intVal = num;
4384
f8e779b99b14 slightly tuned nextPutLongMSB: and nextPutShortMSB:
Claus Gittinger <cg@exept.de>
parents: 4383
diff changeset
  4498
#else
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4499
	    u.bytes[0] = (num >> 24) & 0xFF;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4500
	    u.bytes[1] = (num >> 16) & 0xFF;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4501
	    u.bytes[2] = (num >> 8) & 0xFF;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4502
	    u.bytes[3] = num & 0xFF;
4384
f8e779b99b14 slightly tuned nextPutLongMSB: and nextPutShortMSB:
Claus Gittinger <cg@exept.de>
parents: 4383
diff changeset
  4503
#endif
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4504
	} else {
8901
824a89d0b5c7 alpha64 vs. POINTER_SIZE cleanup
Claus Gittinger <cg@exept.de>
parents: 8881
diff changeset
  4505
#if defined(__LSBFIRST__)
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4506
	    u.intVal = num;
4384
f8e779b99b14 slightly tuned nextPutLongMSB: and nextPutShortMSB:
Claus Gittinger <cg@exept.de>
parents: 4383
diff changeset
  4507
#else
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4508
	    u.bytes[3] = (num >> 24) & 0xFF;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4509
	    u.bytes[2] = (num >> 16) & 0xFF;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4510
	    u.bytes[1] = (num >> 8) & 0xFF;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4511
	    u.bytes[0] = num & 0xFF;
4384
f8e779b99b14 slightly tuned nextPutLongMSB: and nextPutShortMSB:
Claus Gittinger <cg@exept.de>
parents: 4383
diff changeset
  4512
#endif
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4513
	}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4514
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4515
	f = __FILEVal(fp);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4516
	if (_buffered = (__INST(buffered) == true)) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4517
	    __WRITING__(f)
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4518
	}
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4519
	__WRITEBYTES__(cnt, f, u.bytes, 4, _buffered);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4520
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4521
	if (cnt == 4) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4522
	    if (__isSmallInteger(__INST(position))) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4523
		INT np = __intVal(__INST(position)) + 4;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4524
		OBJ t;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4525
8881
53e94478133f STORE macro fix (gcc3.4 bug)
Claus Gittinger <cg@exept.de>
parents: 8818
diff changeset
  4526
		t = __MKINT(np); __INST(position) = t; __STORE(self, t);
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4527
	    } else {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4528
		__INST(position) = nil; /* i.e. do not know */
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4529
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4530
	    RETURN ( self );
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4531
	}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4532
	__INST(position) = nil; /* i.e. do not know */
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  4533
	__INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4534
    }
4384
f8e779b99b14 slightly tuned nextPutLongMSB: and nextPutShortMSB:
Claus Gittinger <cg@exept.de>
parents: 4383
diff changeset
  4535
badArg: ;
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4536
%}.
7801
d930c353588d writeError: care for EWOULDBLOCK in nonBlocking case.
penk
parents: 7737
diff changeset
  4537
    filePointer isNil ifTrue:[self errorNotOpen. ^ self].
d930c353588d writeError: care for EWOULDBLOCK in nonBlocking case.
penk
parents: 7737
diff changeset
  4538
    (mode == #readonly) ifTrue:[self errorReadOnly. ^ self].
d930c353588d writeError: care for EWOULDBLOCK in nonBlocking case.
penk
parents: 7737
diff changeset
  4539
    lastErrorNumber notNil ifTrue:[self writeError. ^ self].
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4540
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4541
    aNumber isInteger ifTrue:[
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4542
	^ super nextPutLong:aNumber MSB:msbFlag
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  4543
    ].
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4544
    self argumentMustBeInteger
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4545
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4546
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4547
nextPutShort:aNumber MSB:msbFlag
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4548
    "Write the argument, aNumber as a short (two bytes). If msbFlag is
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4549
     true, data is written most-significant byte first; otherwise least
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4550
     first.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4551
     Works in both binary and text modes."
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4552
1067
1e7959af0821 removed all NOCONTEXT (last version did no good - PROTECT-stack overflow ...)
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
  4553
%{
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4554
    int num;
4384
f8e779b99b14 slightly tuned nextPutLongMSB: and nextPutShortMSB:
Claus Gittinger <cg@exept.de>
parents: 4383
diff changeset
  4555
    union {
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4556
	char bytes[2];
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4557
	short shortVal;
4384
f8e779b99b14 slightly tuned nextPutLongMSB: and nextPutShortMSB:
Claus Gittinger <cg@exept.de>
parents: 4383
diff changeset
  4558
    } u;
f8e779b99b14 slightly tuned nextPutLongMSB: and nextPutShortMSB:
Claus Gittinger <cg@exept.de>
parents: 4383
diff changeset
  4559
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  4560
    FILEPOINTER f;
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  4561
    int cnt, _buffered;
4384
f8e779b99b14 slightly tuned nextPutLongMSB: and nextPutShortMSB:
Claus Gittinger <cg@exept.de>
parents: 4383
diff changeset
  4562
    OBJ fp;
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4563
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  4564
    __INST(lastErrorNumber) = nil;
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  4565
    if (((fp = __INST(filePointer)) != nil)
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4566
	&& (__INST(mode) != @symbol(readonly))
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4567
	&& __isSmallInteger(aNumber)
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  4568
    ) {
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4569
	num = __intVal(aNumber);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4570
	if (msbFlag == true) {
8901
824a89d0b5c7 alpha64 vs. POINTER_SIZE cleanup
Claus Gittinger <cg@exept.de>
parents: 8881
diff changeset
  4571
#if defined(__MSBFIRST__)
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4572
	    u.shortVal = num;
4384
f8e779b99b14 slightly tuned nextPutLongMSB: and nextPutShortMSB:
Claus Gittinger <cg@exept.de>
parents: 4383
diff changeset
  4573
#else
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4574
	    u.bytes[0] = (num >> 8) & 0xFF;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4575
	    u.bytes[1] = num & 0xFF;
4384
f8e779b99b14 slightly tuned nextPutLongMSB: and nextPutShortMSB:
Claus Gittinger <cg@exept.de>
parents: 4383
diff changeset
  4576
#endif
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4577
	} else {
8901
824a89d0b5c7 alpha64 vs. POINTER_SIZE cleanup
Claus Gittinger <cg@exept.de>
parents: 8881
diff changeset
  4578
#if defined(__LSBFIRST__)
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4579
	    u.shortVal = num;
4384
f8e779b99b14 slightly tuned nextPutLongMSB: and nextPutShortMSB:
Claus Gittinger <cg@exept.de>
parents: 4383
diff changeset
  4580
#else
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4581
	    u.bytes[1] = (num >> 8) & 0xFF;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4582
	    u.bytes[0] = num & 0xFF;
4384
f8e779b99b14 slightly tuned nextPutLongMSB: and nextPutShortMSB:
Claus Gittinger <cg@exept.de>
parents: 4383
diff changeset
  4583
#endif
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4584
	}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4585
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4586
	f = __FILEVal(fp);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4587
	if (_buffered = (__INST(buffered) == true)) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4588
	    __WRITING__(f)
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4589
	}
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4590
	__WRITEBYTES__(cnt, f, u.bytes, 2, _buffered);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4591
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4592
	if (cnt == 2) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4593
	    if (__isSmallInteger(__INST(position))) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4594
		INT np = __intVal(__INST(position)) + 2;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4595
		OBJ t;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4596
8881
53e94478133f STORE macro fix (gcc3.4 bug)
Claus Gittinger <cg@exept.de>
parents: 8818
diff changeset
  4597
		t = __MKINT(np); __INST(position) = t; __STORE(self, t);
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4598
	    } else {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4599
		__INST(position) = nil; /* i.e. do not know */
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4600
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4601
	    RETURN ( self );
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4602
	}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  4603
	__INST(position) = nil; /* i.e. do not know */
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  4604
	__INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4605
    }
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4606
%}.
7801
d930c353588d writeError: care for EWOULDBLOCK in nonBlocking case.
penk
parents: 7737
diff changeset
  4607
    lastErrorNumber notNil ifTrue:[self writeError. ^ self.].
d930c353588d writeError: care for EWOULDBLOCK in nonBlocking case.
penk
parents: 7737
diff changeset
  4608
    filePointer isNil ifTrue:[self errorNotOpen. ^ self].
d930c353588d writeError: care for EWOULDBLOCK in nonBlocking case.
penk
parents: 7737
diff changeset
  4609
    (mode == #readonly) ifTrue:[self errorReadOnly. ^ self].
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4610
    self argumentMustBeInteger
10
claus
parents: 5
diff changeset
  4611
! !
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4612
7053
13e04c48e23c prep for 0-based stream position
Claus Gittinger <cg@exept.de>
parents: 7051
diff changeset
  4613
!ExternalStream methodsFor:'positioning'!
13e04c48e23c prep for 0-based stream position
Claus Gittinger <cg@exept.de>
parents: 7051
diff changeset
  4614
13e04c48e23c prep for 0-based stream position
Claus Gittinger <cg@exept.de>
parents: 7051
diff changeset
  4615
position0Based
13e04c48e23c prep for 0-based stream position
Claus Gittinger <cg@exept.de>
parents: 7051
diff changeset
  4616
    self subclassResponsibility
13e04c48e23c prep for 0-based stream position
Claus Gittinger <cg@exept.de>
parents: 7051
diff changeset
  4617
!
13e04c48e23c prep for 0-based stream position
Claus Gittinger <cg@exept.de>
parents: 7051
diff changeset
  4618
13e04c48e23c prep for 0-based stream position
Claus Gittinger <cg@exept.de>
parents: 7051
diff changeset
  4619
position0Based:index0Based
13e04c48e23c prep for 0-based stream position
Claus Gittinger <cg@exept.de>
parents: 7051
diff changeset
  4620
    self subclassResponsibility
13e04c48e23c prep for 0-based stream position
Claus Gittinger <cg@exept.de>
parents: 7051
diff changeset
  4621
! !
13e04c48e23c prep for 0-based stream position
Claus Gittinger <cg@exept.de>
parents: 7051
diff changeset
  4622
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4623
!ExternalStream methodsFor:'private'!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4624
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4625
clearEOF
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4626
    hitEOF := false
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4627
! !
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4628
8966
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4629
!ExternalStream protectedMethodsFor:'private'!
8471
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4630
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4631
closeFile
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4632
    "low level close - may be redefined in subclasses
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4633
     Don't send this message, send #close instead"
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4634
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4635
    |fp|
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4636
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4637
%{
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4638
    if ((fp = __INST(filePointer)) != nil) {
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4639
	FILEPOINTER f;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4640
	int rslt;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4641
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4642
	__INST(filePointer) = nil;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4643
	f = __FILEVal(fp);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4644
	if (@global(FileOpenTrace) == true) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4645
	    fprintf(stderr, "fclose [ExternalStream] %x\n", f);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4646
	}
8471
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4647
#ifdef WIN32
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4648
	do {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4649
	    __threadErrno = 0;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4650
	    rslt = __STX_C_CALL1("fclose", fclose, f);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4651
	} while((rslt < 0) && (__threadErrno == EINTR));
8471
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4652
#else
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4653
	__BEGIN_INTERRUPTABLE__
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4654
	fclose(f);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4655
	__END_INTERRUPTABLE__
8471
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4656
#endif
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4657
    }
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4658
    RETURN (self);
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4659
%}.
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4660
    "/ fallback for rel5
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4661
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4662
    fp := filePointer.
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4663
    fp notNil ifTrue:[
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4664
	filePointer := nil.
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4665
	self closeFile:fp
8471
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4666
    ]
8472
5e8d452b5d75 Mark methods as private
Stefan Vogel <sv@exept.de>
parents: 8471
diff changeset
  4667
! !
5e8d452b5d75 Mark methods as private
Stefan Vogel <sv@exept.de>
parents: 8471
diff changeset
  4668
8966
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4669
!ExternalStream methodsFor:'private'!
8471
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4670
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4671
closeFile:filePointer
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4672
    "for rel5 only"
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4673
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4674
    self primitiveFailed
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4675
!
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4676
8966
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4677
connectTo:aFileDescriptor withMode:openmode
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4678
    "connect a fileDescriptor; openmode is the string defining the way to open.
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4679
     This can be used to connect an externally provided fileDescriptor (from
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4680
     primitive code) or a pipeFileDescriptor (as returned by makePipe) to
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4681
     a Stream object.
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4682
     The openMode ('r', 'w' etc.) must match the mode in which
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4683
     the fileDescriptor was originally opened (otherwise i/o errors will be reported later)."
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4684
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4685
    |retVal|
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4686
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4687
    filePointer notNil ifTrue:[^ self errorAlreadyOpen].
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4688
%{
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4689
    FILEPOINTER f;
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4690
    OBJ fp;
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4691
    FILE *fdopen();
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4692
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4693
    if (__isSmallInteger(aFileDescriptor) && __isStringLike(openmode)) {
9023
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4694
	f = (FILEPOINTER) fdopen(__intVal(aFileDescriptor), (char *)__stringVal(openmode));
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4695
	if (f == NULL) {
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4696
	    __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4697
	    __INST(position) = nil;
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4698
	} else {
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4699
	    if (@global(FileOpenTrace) == true) {
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4700
		fprintf(stderr, "fdopen [ExternalStream] %d -> %x\n", __intVal(aFileDescriptor), f);
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4701
	    }
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4702
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4703
	    fp = __MKFILEPOINTER(f); __INST(filePointer) = fp; __STORE(self, fp);
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4704
	    __INST(position) = @global(PositionableStream:ZeroPosition);
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4705
	    retVal = self;
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4706
	}
8966
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4707
    }
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4708
%}.
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4709
    retVal notNil ifTrue:[
9023
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4710
	buffered := true.       "default is buffered"
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4711
	Lobby register:self
8966
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4712
    ].
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4713
    lastErrorNumber notNil ifTrue:[
9023
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4714
	"
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4715
	 the open failed for some reason ...
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4716
	"
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4717
	^ self openError
8966
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4718
    ].
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4719
    ^ retVal
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4720
!
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4721
10982
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4722
dupFd
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4723
    "duplicate my file descriptor"
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4724
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4725
    |fd dupFd|
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4726
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4727
    fd := self fileHandle.
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4728
    dupFd := OperatingSystem dup:fd.
10989
f7d1de91344b fix #setFileHandle:mode:
Stefan Vogel <sv@exept.de>
parents: 10988
diff changeset
  4729
    self setFileHandle:dupFd mode:self fopenMode.
10995
94ed80f3bfc7 changed #gotErrorOrEOF
sr
parents: 10989
diff changeset
  4730
!
10989
f7d1de91344b fix #setFileHandle:mode:
Stefan Vogel <sv@exept.de>
parents: 10988
diff changeset
  4731
f7d1de91344b fix #setFileHandle:mode:
Stefan Vogel <sv@exept.de>
parents: 10988
diff changeset
  4732
fopenMode
f7d1de91344b fix #setFileHandle:mode:
Stefan Vogel <sv@exept.de>
parents: 10988
diff changeset
  4733
   "answer the mode for fopen.
f7d1de91344b fix #setFileHandle:mode:
Stefan Vogel <sv@exept.de>
parents: 10988
diff changeset
  4734
    Only used internally"
f7d1de91344b fix #setFileHandle:mode:
Stefan Vogel <sv@exept.de>
parents: 10988
diff changeset
  4735
f7d1de91344b fix #setFileHandle:mode:
Stefan Vogel <sv@exept.de>
parents: 10988
diff changeset
  4736
   mode == #readonly ifTrue:[
f7d1de91344b fix #setFileHandle:mode:
Stefan Vogel <sv@exept.de>
parents: 10988
diff changeset
  4737
        ^ ReadMode
f7d1de91344b fix #setFileHandle:mode:
Stefan Vogel <sv@exept.de>
parents: 10988
diff changeset
  4738
   ].
f7d1de91344b fix #setFileHandle:mode:
Stefan Vogel <sv@exept.de>
parents: 10988
diff changeset
  4739
   mode == #writeonly ifTrue:[
f7d1de91344b fix #setFileHandle:mode:
Stefan Vogel <sv@exept.de>
parents: 10988
diff changeset
  4740
        ^ WriteMode
f7d1de91344b fix #setFileHandle:mode:
Stefan Vogel <sv@exept.de>
parents: 10988
diff changeset
  4741
   ].
f7d1de91344b fix #setFileHandle:mode:
Stefan Vogel <sv@exept.de>
parents: 10988
diff changeset
  4742
   mode == #readWrite ifTrue:[
f7d1de91344b fix #setFileHandle:mode:
Stefan Vogel <sv@exept.de>
parents: 10988
diff changeset
  4743
        ^ ReadWriteMode
f7d1de91344b fix #setFileHandle:mode:
Stefan Vogel <sv@exept.de>
parents: 10988
diff changeset
  4744
   ].
f7d1de91344b fix #setFileHandle:mode:
Stefan Vogel <sv@exept.de>
parents: 10988
diff changeset
  4745
   mode == #append ifTrue:[
f7d1de91344b fix #setFileHandle:mode:
Stefan Vogel <sv@exept.de>
parents: 10988
diff changeset
  4746
        ^ AppendMode
f7d1de91344b fix #setFileHandle:mode:
Stefan Vogel <sv@exept.de>
parents: 10988
diff changeset
  4747
   ].
f7d1de91344b fix #setFileHandle:mode:
Stefan Vogel <sv@exept.de>
parents: 10988
diff changeset
  4748
   ^ ReadWriteMode
10995
94ed80f3bfc7 changed #gotErrorOrEOF
sr
parents: 10989
diff changeset
  4749
!
10982
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4750
8966
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4751
open:aPath withMode:openModeString
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4752
    "low level open; opens the file/device and sets the filePointer instance
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4753
     variable. Careful: this does not care for any other state."
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4754
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4755
    |ok|
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4756
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4757
    ok := false.
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4758
%{
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4759
    FILE *f;
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4760
    OBJ fp;
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4761
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4762
    if (__isStringLike(aPath) && __isStringLike(openModeString)) {
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4763
#ifdef WIN32
10339
972d0164125a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10328
diff changeset
  4764
# if 1
8966
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4765
       f = fopen((char *) __stringVal(aPath), (char *) __stringVal(openModeString));
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4766
# else
9023
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4767
	__BEGIN_INTERRUPTABLE__
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4768
	do {
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4769
	    f = fopen((char *) __stringVal(aPath), (char *) __stringVal(openModeString));
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4770
	} while ((f == NULL) && (__threadErrno == EINTR));
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4771
	__END_INTERRUPTABLE__
8966
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4772
# endif
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4773
#else /* UNIX */
9023
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4774
	__BEGIN_INTERRUPTABLE__
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4775
	do {
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4776
	    f = fopen((char *) __stringVal(aPath), (char *) __stringVal(openModeString));
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4777
	} while ((f == NULL) && (__threadErrno == EINTR));
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4778
	__END_INTERRUPTABLE__
8966
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4779
#endif /* UNIX */
9023
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4780
	if (f == NULL) {
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4781
	    __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4782
	} else {
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4783
	    if (@global(FileOpenTrace) == true) {
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4784
		fprintf(stderr, "fopen %s [ExternalStream] -> %x\n", __stringVal(aPath), f);
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4785
	    }
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4786
	    fp = __MKFILEPOINTER(f); __INST(filePointer) = fp; __STORE(self, fp);
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4787
	    ok = true;
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4788
	}
8966
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4789
    }
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4790
%}.
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4791
    ok ifFalse:[
9023
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4792
	"
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4793
	 the open failed for some reason ...
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4794
	"
7919c66b8fb0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9002
diff changeset
  4795
	^ self openError
8966
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4796
    ].
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4797
    position := ZeroPosition.
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4798
    Lobby register:self.
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4799
!
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4800
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4801
reOpen
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4802
    "USERS WILL NEVER INVOKE THIS METHOD
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4803
     sent after snapin to reopen streams.
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4804
     cannot reopen here since I am abstract and have no device knowledge"
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4805
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4806
    self class name errorPrint. ' [warning]: automatic reOpen not supported - stream closed' errorPrintCR.
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4807
    filePointer := nil.
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4808
    Lobby unregister:self.
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4809
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4810
    "Modified: 10.1.1997 / 17:50:44 / cg"
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4811
!
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4812
8471
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4813
setFileDescriptor:anInteger mode:openMode
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4814
    "set the filePointer based upon a given fileDescriptor -
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4815
     notice: this one is based on the underlying OSs fileDescriptor -
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4816
     this may not be available on all platforms (i.e. non unix systems)."
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4817
10982
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4818
    self setFileHandle:anInteger mode:openMode
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4819
!
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4820
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4821
setFileHandle:anIntegerOrExternalAddress mode:openMode
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4822
    "set the filePointer based upon a given fileHandle -
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4823
     notice: this one is based on the underlying OSs fileDescriptor -
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4824
     this is a fileDescriptor (Integer) on Unix and Windows, or an Handle (ExternalAddres) on Windows only.
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4825
     It may not be available on all platforms."
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4826
8471
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4827
%{
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4828
    FILEPOINTER f;
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4829
    OBJ fp;
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4830
    FILE *fdopen();
10982
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4831
    int fd;
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4832
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4833
    if (!__isStringLike(openMode))
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4834
        goto err;
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4835
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4836
#ifdef WIN32
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4837
    if (__isExternalAddressLike(anIntegerOrExternalAddress) ) {
10984
fbdee2becb0a changed #setFileHandle:mode:
Stefan Vogel <sv@exept.de>
parents: 10982
diff changeset
  4838
        HANDLE __fileHandle = (HANDLE)(__externalAddressVal(anIntegerOrExternalAddress));
10988
1637fba6badc changed #setFileHandle:mode:
Stefan Vogel <sv@exept.de>
parents: 10987
diff changeset
  4839
        fd = _open_osfhandle(__fileHandle, 0);      /* should we handle readonly, append or text mode? */
10982
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4840
    } else
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4841
#endif
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4842
    if (__isSmallInteger(anIntegerOrExternalAddress)) {
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4843
        fd = __smallIntegerVal(anIntegerOrExternalAddress);
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4844
    } else {
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4845
        goto err;
8471
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4846
    }
10997
8ec53332c725 _fdopen -> fdopen()
Stefan Vogel <sv@exept.de>
parents: 10995
diff changeset
  4847
    f = fdopen(fd, __stringVal(openMode));
10982
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4848
    if (f != NULL) {
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4849
        if (@global(FileOpenTrace) == true) {
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4850
            fprintf(stderr, "fdopen [ExternalStream] %d -> %x\n", fd, f);
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4851
        }
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4852
        fp = __MKFILEPOINTER(f); __INST(filePointer) = fp; __STORE(self, fp);
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4853
        RETURN (self);
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4854
    }
11fd48c1276d New: #copy duplicates the underlying file descriptor resp. file handle
Stefan Vogel <sv@exept.de>
parents: 10932
diff changeset
  4855
err:;
8471
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4856
%}.
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4857
    ^ self primitiveFailed
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4858
!
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4859
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4860
setFilePointer:something
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4861
    "set the filePointer to the given one;
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4862
     low level private & friend interface; may also be used to connect to some
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4863
     externally provided file handle."
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4864
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4865
    filePointer := something
8966
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4866
!
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4867
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4868
setLastError:aNumber
0b299dd8759c Allow Symbols as pathname and openMode
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
  4869
    lastErrorNumber := aNumber
8471
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4870
! !
e061e503bf03 Documentation: users shold never send #closeFile
Stefan Vogel <sv@exept.de>
parents: 8362
diff changeset
  4871
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4872
!ExternalStream methodsFor:'queries'!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4873
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4874
isBinary
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4875
    "return true, if the stream is in binary (as opposed to text-) mode.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4876
     The default when created is false."
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4877
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4878
    ^ binary
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4879
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4880
7804
7128efd3b504 isNonBlocking -> isBlocking
Claus Gittinger <cg@exept.de>
parents: 7801
diff changeset
  4881
isBlocking
7128efd3b504 isNonBlocking -> isBlocking
Claus Gittinger <cg@exept.de>
parents: 7801
diff changeset
  4882
    "return true, if O_NONBLOCK is NOT set in the fileDescriptor (propably UNIX specific)"
7128efd3b504 isNonBlocking -> isBlocking
Claus Gittinger <cg@exept.de>
parents: 7801
diff changeset
  4883
7128efd3b504 isNonBlocking -> isBlocking
Claus Gittinger <cg@exept.de>
parents: 7801
diff changeset
  4884
    filePointer isNil ifTrue:[^ self errorNotOpen].
7128efd3b504 isNonBlocking -> isBlocking
Claus Gittinger <cg@exept.de>
parents: 7801
diff changeset
  4885
    ^ OperatingSystem isBlockingOn:self fileDescriptor
7128efd3b504 isNonBlocking -> isBlocking
Claus Gittinger <cg@exept.de>
parents: 7801
diff changeset
  4886
!
7128efd3b504 isNonBlocking -> isBlocking
Claus Gittinger <cg@exept.de>
parents: 7801
diff changeset
  4887
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4888
isExternalStream
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4889
    "return true, if the receiver is some kind of externalStream;
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4890
     true is returned here - the method redefined from Object."
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4891
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4892
    ^ true
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4893
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4894
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4895
isOpen
3863
af67e6995a4a added #isOpen query
Claus Gittinger <cg@exept.de>
parents: 3682
diff changeset
  4896
    "return true, if this stream is open"
af67e6995a4a added #isOpen query
Claus Gittinger <cg@exept.de>
parents: 3682
diff changeset
  4897
af67e6995a4a added #isOpen query
Claus Gittinger <cg@exept.de>
parents: 3682
diff changeset
  4898
    ^ filePointer notNil
af67e6995a4a added #isOpen query
Claus Gittinger <cg@exept.de>
parents: 3682
diff changeset
  4899
!
af67e6995a4a added #isOpen query
Claus Gittinger <cg@exept.de>
parents: 3682
diff changeset
  4900
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4901
isReadable
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4902
    "return true, if this stream can be read from"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4903
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4904
    ^ (mode ~~ #writeonly)
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4905
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4906
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4907
isWritable
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4908
    "return true, if this stream can be written to"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4909
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4910
    ^ (mode ~~ #readonly)
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4911
! !
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4912
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4913
!ExternalStream methodsFor:'reading'!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4914
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4915
next
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4916
    "return the next element; advance read position.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4917
     In binary mode, an integer is returned, otherwise a character.
10348
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  4918
     If there are no more elements, either an exception is thrown or nil is returned
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  4919
     - see #pastEndRead."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  4920
5420
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  4921
    |c|
1067
1e7959af0821 removed all NOCONTEXT (last version did no good - PROTECT-stack overflow ...)
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
  4922
%{
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  4923
    FILEPOINTER f;
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  4924
    int ret, _buffered;
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4925
    OBJ pos, fp;
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4926
    unsigned char ch;
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4927
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  4928
    __INST(lastErrorNumber) = nil;
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  4929
    if (((fp = __INST(filePointer)) != nil)
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4930
	&& (__INST(mode) != @symbol(writeonly))
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  4931
    ) {
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4932
	f = __FILEVal(fp);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4933
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4934
	_buffered = (__INST(buffered) == true);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4935
	if (_buffered) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4936
	    __READING__(f)
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4937
	}
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4938
	__READBYTE__(ret, f, &ch, _buffered);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4939
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4940
	if (ret > 0) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4941
	    pos = __INST(position);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4942
	    if (__isSmallInteger(pos)) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4943
		OBJ t;
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4944
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4945
		t = __MKINT(__intVal(pos) + 1); __INST(position) = t; __STORE(self, t);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4946
	    } else {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4947
		__INST(position) = nil; /* i.e. do not know */
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4948
	    }
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4949
	    if (__INST(binary) == true) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4950
		RETURN ( __mkSmallInteger(ch) );
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4951
	    }
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4952
	    RETURN ( __MKCHARACTER(ch) );
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4953
	}
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4954
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4955
	__INST(position) = nil;
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4956
	if (ret < 0) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4957
	    __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4958
	} else /* ret == 0 */ {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4959
	    __INST(hitEOF) = true;
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4960
	}
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4961
    }
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4962
%}.
8614
88421fbd4ab6 pastEnd -> pastEndRead
Claus Gittinger <cg@exept.de>
parents: 8604
diff changeset
  4963
    hitEOF == true ifTrue:[^ self pastEndRead].
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4964
    lastErrorNumber notNil ifTrue:[^ self readError].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4965
    filePointer isNil ifTrue:[^ self errorNotOpen].
5420
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  4966
    (mode == #writeonly) ifTrue:[^ self errorWriteOnly].
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  4967
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  4968
    readAhead notNil ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4969
	c := readAhead.
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4970
	readAhead := nil.
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4971
	^ c.
5420
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  4972
    ].
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  4973
    c := self nextByteFromFile:filePointer.
5430
7d0aa5fc6c22 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 5420
diff changeset
  4974
    c isNil ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4975
	^ self pastEndRead.
5430
7d0aa5fc6c22 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 5420
diff changeset
  4976
    ].
5420
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  4977
    binary == true ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  4978
	^ c
5420
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  4979
    ].
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  4980
    ^ Character value:c
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4981
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4982
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4983
next:count
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4984
    "return the next count elements of the stream as a collection.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4985
     Redefined to return a String or ByteArray instead of the default: Array."
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4986
2151
5f1fd65f8c3b next: must raise pastEnd, if EOF is hit;
Claus Gittinger <cg@exept.de>
parents: 2134
diff changeset
  4987
    |coll nRead|
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4988
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4989
    binary ifTrue:[
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4990
	coll := ByteArray uninitializedNew:count
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4991
    ] ifFalse:[
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4992
	coll := String new:count
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  4993
    ].
2151
5f1fd65f8c3b next: must raise pastEnd, if EOF is hit;
Claus Gittinger <cg@exept.de>
parents: 2134
diff changeset
  4994
    nRead := self nextBytes:count into:coll startingAt:1.
5f1fd65f8c3b next: must raise pastEnd, if EOF is hit;
Claus Gittinger <cg@exept.de>
parents: 2134
diff changeset
  4995
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  4996
    "/ for readStream protocol compatibility,
2151
5f1fd65f8c3b next: must raise pastEnd, if EOF is hit;
Claus Gittinger <cg@exept.de>
parents: 2134
diff changeset
  4997
    "/ we must raise an exception here.
5f1fd65f8c3b next: must raise pastEnd, if EOF is hit;
Claus Gittinger <cg@exept.de>
parents: 2134
diff changeset
  4998
5f1fd65f8c3b next: must raise pastEnd, if EOF is hit;
Claus Gittinger <cg@exept.de>
parents: 2134
diff changeset
  4999
    nRead < count ifTrue:[
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5000
	^ self pastEndRead
2151
5f1fd65f8c3b next: must raise pastEnd, if EOF is hit;
Claus Gittinger <cg@exept.de>
parents: 2134
diff changeset
  5001
    ].
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5002
    ^ coll
2151
5f1fd65f8c3b next: must raise pastEnd, if EOF is hit;
Claus Gittinger <cg@exept.de>
parents: 2134
diff changeset
  5003
5f1fd65f8c3b next: must raise pastEnd, if EOF is hit;
Claus Gittinger <cg@exept.de>
parents: 2134
diff changeset
  5004
    "Modified: 11.1.1997 / 17:44:17 / cg"
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5005
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5006
10348
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5007
nextOrNil
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5008
    "return the next element; advance read position.
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5009
     In binary mode, an integer is returned, otherwise a character.
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5010
     If there are no more elements, nil is returned.
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5011
     This is #atEnd and #next in a single operation - to speed up some code"
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5012
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5013
    |c|
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5014
%{
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5015
    FILEPOINTER f;
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5016
    int ret, _buffered;
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5017
    OBJ pos, fp;
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5018
    unsigned char ch;
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5019
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5020
    __INST(lastErrorNumber) = nil;
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5021
    if (((fp = __INST(filePointer)) != nil)
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5022
	&& (__INST(mode) != @symbol(writeonly))
10348
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5023
    ) {
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5024
	f = __FILEVal(fp);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5025
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5026
	_buffered = (__INST(buffered) == true);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5027
	if (_buffered) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5028
	    __READING__(f)
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5029
	}
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5030
	__READBYTE__(ret, f, &ch, _buffered);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5031
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5032
	if (ret > 0) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5033
	    pos = __INST(position);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5034
	    if (__isSmallInteger(pos)) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5035
		OBJ t;
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5036
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5037
		t = __MKINT(__intVal(pos) + 1); __INST(position) = t; __STORE(self, t);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5038
	    } else {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5039
		__INST(position) = nil; /* i.e. do not know */
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5040
	    }
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5041
	    if (__INST(binary) == true) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5042
		RETURN ( __mkSmallInteger(ch) );
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5043
	    }
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5044
	    RETURN ( __MKCHARACTER(ch) );
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5045
	}
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5046
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5047
	__INST(position) = nil;
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5048
	if (ret < 0) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5049
	    __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5050
	} else /* ret == 0 */ {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5051
	    __INST(hitEOF) = true;
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5052
	}
10348
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5053
    }
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5054
%}.
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5055
    hitEOF == true ifTrue:[^ nil].
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5056
    lastErrorNumber notNil ifTrue:[^ self readError].
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5057
    filePointer isNil ifTrue:[^ self errorNotOpen].
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5058
    (mode == #writeonly) ifTrue:[^ self errorWriteOnly].
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5059
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5060
    readAhead notNil ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5061
	c := readAhead.
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5062
	readAhead := nil.
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5063
	^ c.
10348
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5064
    ].
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5065
    c := self nextByteFromFile:filePointer.
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5066
    c isNil ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5067
	^ nil.
10348
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5068
    ].
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5069
    binary == true ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5070
	^ c
10348
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5071
    ].
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5072
    ^ Character value:c
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5073
!
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5074
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5075
peek
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5076
    "return the element to be read next without advancing read position.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5077
     In binary mode, an integer is returned, otherwise a character.
10348
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5078
     If there are no more elements, either an exception is thrown or nil is returned
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5079
     - see #pastEndRead."
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5080
1067
1e7959af0821 removed all NOCONTEXT (last version did no good - PROTECT-stack overflow ...)
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
  5081
%{
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  5082
    FILEPOINTER f;
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  5083
    unsigned char c;
2120
71c1870df7ba implemented 1-character readAhead for unbuffered streams;
Claus Gittinger <cg@exept.de>
parents: 2045
diff changeset
  5084
    int ret, _buffered;
216
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  5085
    OBJ fp;
3672
49dff0652a2c fixed readAhead in peek with non-binary mode
Claus Gittinger <cg@exept.de>
parents: 3569
diff changeset
  5086
    OBJ ra;
49dff0652a2c fixed readAhead in peek with non-binary mode
Claus Gittinger <cg@exept.de>
parents: 3569
diff changeset
  5087
49dff0652a2c fixed readAhead in peek with non-binary mode
Claus Gittinger <cg@exept.de>
parents: 3569
diff changeset
  5088
    if ((ra = __INST(readAhead)) != nil) {
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5089
	if (__INST(binary) == true) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5090
	    RETURN ( ra );
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5091
	}
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5092
	c = __intVal(ra);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5093
	RETURN ( __MKCHARACTER(c) );
3029
aa14768e0e6a larger lineBuffer in #nextLine
Claus Gittinger <cg@exept.de>
parents: 3016
diff changeset
  5094
    }
aa14768e0e6a larger lineBuffer in #nextLine
Claus Gittinger <cg@exept.de>
parents: 3016
diff changeset
  5095
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  5096
    __INST(lastErrorNumber) = nil;
2120
71c1870df7ba implemented 1-character readAhead for unbuffered streams;
Claus Gittinger <cg@exept.de>
parents: 2045
diff changeset
  5097
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  5098
    if (((fp = __INST(filePointer)) != nil)
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5099
	&& (__INST(mode) != @symbol(writeonly))
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  5100
    ) {
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5101
	f = __FILEVal(fp);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5102
	_buffered = (__INST(buffered) == true);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5103
	if (_buffered) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5104
	    __READING__(f)
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5105
	}
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5106
	__READBYTE__(ret, f, &c, _buffered);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5107
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5108
	if (ret > 0) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5109
	    __UNGETC__(c, f, _buffered);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5110
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5111
	    if (__INST(binary) == true) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5112
		RETURN ( __mkSmallInteger(c) );
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5113
	    }
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5114
	    RETURN ( __MKCHARACTER(c) );
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5115
	}
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5116
	if (ret < 0) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5117
	    __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5118
	} else /* ret == 0 */ {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5119
	    __INST(hitEOF) = true;
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5120
	}
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  5121
    }
159
514c749165c3 *** empty log message ***
claus
parents: 108
diff changeset
  5122
%}.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5123
    hitEOF == true ifTrue:[^ self pastEndRead].
216
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  5124
    lastErrorNumber notNil ifTrue:[^ self readError].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  5125
    filePointer isNil ifTrue:[^ self errorNotOpen].
5420
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5126
    (mode == #writeonly) ifTrue:[^ self errorWriteOnly].
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5127
10348
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5128
    readAhead isNil ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5129
	readAhead := self nextOrNil.
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5130
	readAhead isNil ifTrue:[
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5131
	    ^ self pastEndRead.
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5132
	].
5420
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5133
    ].
10348
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5134
    ^ readAhead
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5135
!
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5136
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5137
peekOrNil
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5138
    "return the element to be read next without advancing read position.
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5139
     In binary mode, an integer is returned, otherwise a character.
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5140
     If there are no more elements, nil is returned.
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5141
     Same as #atEnd and #peek in a single operation - speeding up some code"
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5142
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5143
%{
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5144
    FILEPOINTER f;
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5145
    unsigned char c;
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5146
    int ret, _buffered;
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5147
    OBJ fp;
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5148
    OBJ ra;
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5149
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5150
    if ((ra = __INST(readAhead)) != nil) {
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5151
	if (__INST(binary) == true) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5152
	    RETURN ( ra );
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5153
	}
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5154
	c = __intVal(ra);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5155
	RETURN ( __MKCHARACTER(c) );
10348
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5156
    }
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5157
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5158
    __INST(lastErrorNumber) = nil;
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5159
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5160
    if (((fp = __INST(filePointer)) != nil)
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5161
	&& (__INST(mode) != @symbol(writeonly))
10348
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5162
    ) {
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5163
	f = __FILEVal(fp);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5164
	_buffered = (__INST(buffered) == true);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5165
	if (_buffered) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5166
	    __READING__(f)
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5167
	}
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5168
	__READBYTE__(ret, f, &c, _buffered);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5169
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5170
	if (ret > 0) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5171
	    __UNGETC__(c, f, _buffered);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5172
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5173
	    if (__INST(binary) == true) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5174
		RETURN ( __mkSmallInteger(c) );
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5175
	    }
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5176
	    RETURN ( __MKCHARACTER(c) );
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5177
	}
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5178
	if (ret < 0) {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5179
	    __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5180
	} else /* ret == 0 */ {
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5181
	    __INST(hitEOF) = true;
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5182
	}
10348
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5183
    }
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5184
%}.
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5185
    hitEOF == true ifTrue:[^ nil].
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5186
    lastErrorNumber notNil ifTrue:[^ self readError].
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5187
    filePointer isNil ifTrue:[^ self errorNotOpen].
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5188
    (mode == #writeonly) ifTrue:[^ self errorWriteOnly].
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5189
7ed317f7f2be Speedup ExternalStream>>#nextOrNil and ExternalStream>>#peekOrNil.
Stefan Vogel <sv@exept.de>
parents: 10339
diff changeset
  5190
    readAhead isNil ifTrue:[
10450
bb40b56ed6b6 Remove unused stat() redefinition
Stefan Vogel <sv@exept.de>
parents: 10361
diff changeset
  5191
	readAhead := self nextOrNil.
5420
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5192
    ].
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5193
    ^ readAhead
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  5194
!
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  5195
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  5196
upToEnd
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  5197
    "return a collection of the elements up-to the end.
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  5198
     Return nil if the stream-end is reached before."
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  5199
6569
f8336e46ec9f Speedup #upToEnd
Stefan Vogel <sv@exept.de>
parents: 6563
diff changeset
  5200
    |answerStream buffer count|
f8336e46ec9f Speedup #upToEnd
Stefan Vogel <sv@exept.de>
parents: 6563
diff changeset
  5201
f8336e46ec9f Speedup #upToEnd
Stefan Vogel <sv@exept.de>
parents: 6563
diff changeset
  5202
    buffer := self contentsSpecies new:4096.
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  5203
    [self atEnd] whileFalse:[
7832
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5204
	count := self nextAvailableBytes:4096 into:buffer startingAt:1.
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5205
	count ~~ 0 ifTrue:[
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5206
	    answerStream isNil ifTrue:[
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5207
		answerStream := WriteStream with:buffer.
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5208
		answerStream position0Based:count.
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5209
		buffer := self contentsSpecies new:4096.
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5210
	    ] ifFalse:[
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5211
		answerStream nextPutAll:buffer startingAt:1 to:count.
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5212
	    ].
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5213
	].
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  5214
    ].
6758
bc933037a1dc oops - upToEnd failed if already at the end
Claus Gittinger <cg@exept.de>
parents: 6661
diff changeset
  5215
    answerStream isNil ifTrue:[^ self contentsSpecies new].
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  5216
    ^ answerStream contents
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
  5217
7054
685d359f9847 code rewritten to be independent of stream zero-base
Claus Gittinger <cg@exept.de>
parents: 7053
diff changeset
  5218
    "
685d359f9847 code rewritten to be independent of stream zero-base
Claus Gittinger <cg@exept.de>
parents: 7053
diff changeset
  5219
     ('smalltalk.rc' asFilename readStream upToEnd)
685d359f9847 code rewritten to be independent of stream zero-base
Claus Gittinger <cg@exept.de>
parents: 7053
diff changeset
  5220
     =
685d359f9847 code rewritten to be independent of stream zero-base
Claus Gittinger <cg@exept.de>
parents: 7053
diff changeset
  5221
     ('smalltalk.rc' asFilename readStream contentsOfEntireFile)
685d359f9847 code rewritten to be independent of stream zero-base
Claus Gittinger <cg@exept.de>
parents: 7053
diff changeset
  5222
    "
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5223
! !
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5224
5420
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5225
!ExternalStream methodsFor:'rel5 protocol'!
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5226
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5227
atEndFile:filePointer
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5228
    "for migration to rel5 only"
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5229
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5230
    self primitiveFailed
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5231
!
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5232
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5233
nextByteFromFile:filePointer
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5234
    "for migration to rel5 only"
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5235
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5236
    self primitiveFailed
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5237
!
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5238
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5239
nextPutByte:aByte toFile:filePointer
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5240
    "for migration to rel5 only"
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5241
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5242
    self primitiveFailed
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5243
! !
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5244
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5245
!ExternalStream methodsFor:'testing'!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5246
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5247
atEnd
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5248
    "return true, if position is at end"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5249
1067
1e7959af0821 removed all NOCONTEXT (last version did no good - PROTECT-stack overflow ...)
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
  5250
%{
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  5251
    FILEPOINTER f;
7875
eb7d48b0425d made all position-handling code 32bit save
Claus Gittinger <cg@exept.de>
parents: 7832
diff changeset
  5252
    OBJ fp, pos, lim;
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  5253
    char c;
2861
c098e5766682 Fix #atEnd: for signed chars.
Stefan Vogel <sv@exept.de>
parents: 2854
diff changeset
  5254
    int ret, _buffered;
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5255
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  5256
    if (__INST(hitEOF) == true) {
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5257
	RETURN (true);
3906
7f2d4a3b63e2 oops - readLimit was not handled in #atEnd
Claus Gittinger <cg@exept.de>
parents: 3878
diff changeset
  5258
    }
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5259
    pos = __INST(position);
7875
eb7d48b0425d made all position-handling code 32bit save
Claus Gittinger <cg@exept.de>
parents: 7832
diff changeset
  5260
    lim = __INST(readLimit);
eb7d48b0425d made all position-handling code 32bit save
Claus Gittinger <cg@exept.de>
parents: 7832
diff changeset
  5261
    if (lim != nil) {
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5262
	off_t _pos, _readLimit;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5263
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5264
	_pos = __signedLongIntVal(pos);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5265
	_pos = _pos - __intVal( @global(PositionableStream:ZeroPosition)) + 1;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5266
	_readLimit = __signedLongIntVal(lim);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5267
	if (_pos > _readLimit) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5268
	    RETURN (true);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5269
	}
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5270
    }
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5271
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  5272
    __INST(lastErrorNumber) = nil;
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  5273
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  5274
    if ((fp = __INST(filePointer)) != nil) {
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5275
	f = __FILEVal(fp);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5276
	if (_buffered = (__INST(buffered) == true)) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5277
	    __READING__(f);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5278
	} else {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5279
	    if (__INST(readAhead) != nil) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5280
		RETURN (false);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5281
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5282
	}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5283
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5284
	/*
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5285
	 * read ahead ...
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5286
	 */
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5287
	do {
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5288
#ifdef WIN32
10339
972d0164125a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10328
diff changeset
  5289
# if 1
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5290
	    __READBYTE__(ret, f, &c, _buffered);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5291
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5292
# else
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5293
	    __BEGIN_INTERRUPTABLE__
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5294
	    __READBYTE__(ret, f, &c, _buffered);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5295
	    __END_INTERRUPTABLE__
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5296
# endif
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5297
#else /* not WIN32 */
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5298
	    __BEGIN_INTERRUPTABLE__
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5299
	    __READBYTE__(ret, f, &c, _buffered);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5300
	    __END_INTERRUPTABLE__
4914
Claus Gittinger <cg@exept.de>
parents: 4913
diff changeset
  5301
#endif
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5302
	} while ((ret < 0) && (__threadErrno == EINTR));
4152
0c1780ae527f dont return an error when interrupted in NEXTAVAILBYTES (return 0)
Claus Gittinger <cg@exept.de>
parents: 4108
diff changeset
  5303
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
  5304
#if defined(WIN32) && defined(EPIPE)
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5305
	if (ret < 0) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5306
	    if (__threadErrno == EPIPE) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5307
		ret = 0;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5308
		__threadErrno = 0;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5309
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5310
	    if (__threadErrno == 0) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5311
		ret = 0;   /* how comes ? */
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5312
	    }
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5313
	}
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
  5314
#endif
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5315
	if (ret > 0) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5316
	    __UNGETC__(c&0xff, f, _buffered);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5317
	    RETURN (false);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5318
	}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5319
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5320
	if (ret == 0) {
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5321
	    __INST(hitEOF) = true;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5322
	    RETURN (true);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5323
	}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5324
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5325
	/* ret < 0 */
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  5326
	__INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5327
    }
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5328
%}.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5329
    lastErrorNumber notNil ifTrue:[^ self readError].
5420
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5330
    filePointer isNil ifTrue:[^ self errorNotOpen].
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5331
    mode == #writeonly ifTrue:[^ self errorWriteOnly].
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5332
    readAhead notNil ifTrue:[^ false].
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5333
cec8306dff39 migration
Claus Gittinger <cg@exept.de>
parents: 5417
diff changeset
  5334
    "/ migration support
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5335
    ^ self
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5336
	atEndFile:filePointer
3906
7f2d4a3b63e2 oops - readLimit was not handled in #atEnd
Claus Gittinger <cg@exept.de>
parents: 3878
diff changeset
  5337
7f2d4a3b63e2 oops - readLimit was not handled in #atEnd
Claus Gittinger <cg@exept.de>
parents: 3878
diff changeset
  5338
    "Modified: / 30.10.1998 / 20:16:06 / cg"
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5339
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5340
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5341
canReadWithoutBlocking
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5342
    "return true, if any data is available for reading (i.e.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5343
     a read operation will not block the smalltalk process), false otherwise."
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5344
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5345
    |fd|
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5346
2986
c6957cf6128f Handle readAhead in #canReadWithoutBlocking
Stefan Vogel <sv@exept.de>
parents: 2963
diff changeset
  5347
    readAhead notNil ifTrue:[^ true].
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5348
    filePointer isNil ifTrue:[^ self errorNotOpen].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5349
    mode == #writeonly ifTrue:[^ self errorWriteOnly].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5350
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5351
    fd := self fileDescriptor.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5352
    ^ OperatingSystem readCheck:fd
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5353
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5354
    "
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5355
     |pipe|
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5356
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5357
     pipe := PipeStream readingFrom:'(sleep 10; echo hello)'.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5358
     pipe canReadWithoutBlocking ifTrue:[
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5359
	 Transcript showCR:'data available'
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5360
     ] ifFalse:[
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5361
	 Transcript showCR:'no data available'
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5362
     ].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5363
     pipe close
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5364
    "
2986
c6957cf6128f Handle readAhead in #canReadWithoutBlocking
Stefan Vogel <sv@exept.de>
parents: 2963
diff changeset
  5365
c6957cf6128f Handle readAhead in #canReadWithoutBlocking
Stefan Vogel <sv@exept.de>
parents: 2963
diff changeset
  5366
    "Modified: 25.9.1997 / 13:08:45 / stefan"
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5367
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5368
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5369
canWriteWithoutBlocking
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5370
    "return true, if data can be written into the stream
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5371
     (i.e. a write operation will not block the smalltalk process)."
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5372
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5373
    |fd|
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5374
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5375
    filePointer isNil ifTrue:[^ self errorNotOpen].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5376
    mode == #readonly ifTrue:[^ self errorReadOnly].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5377
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5378
    fd := self fileDescriptor.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5379
    ^ OperatingSystem writeCheck:fd
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  5380
!
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  5381
10995
94ed80f3bfc7 changed #gotErrorOrEOF
sr
parents: 10989
diff changeset
  5382
gotErrorOrEOF
94ed80f3bfc7 changed #gotErrorOrEOF
sr
parents: 10989
diff changeset
  5383
    "answerv true, if amn error or eof has been occured on the stream"
94ed80f3bfc7 changed #gotErrorOrEOF
sr
parents: 10989
diff changeset
  5384
94ed80f3bfc7 changed #gotErrorOrEOF
sr
parents: 10989
diff changeset
  5385
    ^ hitEOF == true or:[lastErrorNumber notNil]
94ed80f3bfc7 changed #gotErrorOrEOF
sr
parents: 10989
diff changeset
  5386
!
94ed80f3bfc7 changed #gotErrorOrEOF
sr
parents: 10989
diff changeset
  5387
6269
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  5388
nextError
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  5389
    "return the error by trying to read something.
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  5390
     Should only be used, when we know, that a read operation
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  5391
     will return an error (otherwise a character may be lost).
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  5392
     Return an integer (error number), 0 (EOF) or nil (no error)"
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  5393
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5394
%{ /*NOCONTEXT*/
6269
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  5395
    FILEPOINTER f;
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  5396
    int ret, _buffered;
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  5397
    OBJ fp;
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  5398
    unsigned char ch;
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  5399
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  5400
    if (((fp = __INST(filePointer)) != nil)
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5401
	&& (__INST(mode) != @symbol(writeonly))
6269
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  5402
    ) {
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5403
	f = __FILEVal(fp);
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5404
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5405
	_buffered = (__INST(buffered) == true);
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5406
	if (_buffered) {
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5407
	    __READING__(f)
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5408
	}
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5409
	__READBYTE__(ret, f, &ch, _buffered);
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5410
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5411
	if (ret > 0) {
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5412
	    RETURN(nil)
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5413
	}
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5414
	if (ret < 0) {
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  5415
	    RETURN(__mkSmallInteger(__threadErrno));
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5416
	} else /* ret == 0 */ {
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  5417
	    RETURN(__mkSmallInteger(0)); /* EOF */
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5418
	}
6269
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  5419
    }
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  5420
%}.
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  5421
!
3a888523e3a6 #errorReporter and #reportOn class-methods
Stefan Vogel <sv@exept.de>
parents: 6255
diff changeset
  5422
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  5423
numAvailable
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  5424
    "return the number of bytes available for reading"
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  5425
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  5426
    |fd|
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  5427
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  5428
    filePointer isNil ifTrue:[^ self errorNotOpen].
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  5429
    mode == #writeonly ifTrue:[^ self errorWriteOnly].
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  5430
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  5431
    fd := self fileDescriptor.
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  5432
    ^ OperatingSystem numAvailableForReadOn:fd.
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  5433
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  5434
"/    self atEnd ifTrue:[^ 0].
3432
1228d4ba9518 allow reading/writing from/to ExternalBytes
Claus Gittinger <cg@exept.de>
parents: 3420
diff changeset
  5435
"/    self canReadWithoutBlocking ifTrue:[
1228d4ba9518 allow reading/writing from/to ExternalBytes
Claus Gittinger <cg@exept.de>
parents: 3420
diff changeset
  5436
"/        ^ 1
1228d4ba9518 allow reading/writing from/to ExternalBytes
Claus Gittinger <cg@exept.de>
parents: 3420
diff changeset
  5437
"/    ].
1228d4ba9518 allow reading/writing from/to ExternalBytes
Claus Gittinger <cg@exept.de>
parents: 3420
diff changeset
  5438
"/    ^ 0
3274
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  5439
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  5440
    "Created: / 4.2.1998 / 16:56:01 / cg"
92a24829f14a added #nextAvailableBytes - very useful for pipes & sockets.
Claus Gittinger <cg@exept.de>
parents: 3255
diff changeset
  5441
    "Modified: / 4.2.1998 / 17:31:11 / cg"
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5442
! !
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5443
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5444
!ExternalStream methodsFor:'waiting for I/O'!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5445
5101
901c91d6dd50 support to poll write-fds
Claus Gittinger <cg@exept.de>
parents: 4968
diff changeset
  5446
canBeSelected
901c91d6dd50 support to poll write-fds
Claus Gittinger <cg@exept.de>
parents: 4968
diff changeset
  5447
    "return true, if this stream can be selected upon"
901c91d6dd50 support to poll write-fds
Claus Gittinger <cg@exept.de>
parents: 4968
diff changeset
  5448
901c91d6dd50 support to poll write-fds
Claus Gittinger <cg@exept.de>
parents: 4968
diff changeset
  5449
    ^ OperatingSystem supportsSelect
901c91d6dd50 support to poll write-fds
Claus Gittinger <cg@exept.de>
parents: 4968
diff changeset
  5450
!
901c91d6dd50 support to poll write-fds
Claus Gittinger <cg@exept.de>
parents: 4968
diff changeset
  5451
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5452
readWait
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5453
    "suspend the current process, until the receiver
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5454
     becomes ready for reading. If data is already available,
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5455
     return immediate.
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5456
     The other threads are not affected by the wait."
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5457
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5458
    self readWaitWithTimeoutMs:nil
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5459
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5460
3016
42466b291fae more ST80 compatibility
ca
parents: 2999
diff changeset
  5461
readWaitTimeoutMs:timeout
42466b291fae more ST80 compatibility
ca
parents: 2999
diff changeset
  5462
    "ST-80 compatibility"
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5463
    ^ self readWaitWithTimeoutMs:timeout
3016
42466b291fae more ST80 compatibility
ca
parents: 2999
diff changeset
  5464
!
42466b291fae more ST80 compatibility
ca
parents: 2999
diff changeset
  5465
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5466
readWaitWithTimeout:timeout
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5467
    "suspend the current process, until the receiver
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5468
     becomes ready for reading or a timeout (in seconds) expired.
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5469
     If data is already available, return immediate.
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5470
     Return true if a timeout occured (i.e. false, if data is available).
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5471
     The other threads are not affected by the wait."
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5472
4640
034c028a5463 care for nil arg in readWaitWithTimeout / writeWaitWithTimeout
Claus Gittinger <cg@exept.de>
parents: 4627
diff changeset
  5473
    |ms|
034c028a5463 care for nil arg in readWaitWithTimeout / writeWaitWithTimeout
Claus Gittinger <cg@exept.de>
parents: 4627
diff changeset
  5474
034c028a5463 care for nil arg in readWaitWithTimeout / writeWaitWithTimeout
Claus Gittinger <cg@exept.de>
parents: 4627
diff changeset
  5475
    timeout notNil ifTrue:[
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5476
	ms := timeout * 1000
4640
034c028a5463 care for nil arg in readWaitWithTimeout / writeWaitWithTimeout
Claus Gittinger <cg@exept.de>
parents: 4627
diff changeset
  5477
    ].
034c028a5463 care for nil arg in readWaitWithTimeout / writeWaitWithTimeout
Claus Gittinger <cg@exept.de>
parents: 4627
diff changeset
  5478
    ^ self readWaitWithTimeoutMs:ms
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5479
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5480
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5481
readWaitWithTimeoutMs:timeout
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5482
    "suspend the current process, until the receiver
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5483
     becomes ready for reading or a timeout (in milliseconds) expired.
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5484
     If data is already available, return immediate.
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5485
     Return true if a timeout occured (i.e. false, if data is available).
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5486
     The other threads are not affected by the wait."
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5487
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5488
    |fd inputSema hasData wasBlocked|
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5489
2120
71c1870df7ba implemented 1-character readAhead for unbuffered streams;
Claus Gittinger <cg@exept.de>
parents: 2045
diff changeset
  5490
    readAhead notNil ifTrue:[^ false].
71c1870df7ba implemented 1-character readAhead for unbuffered streams;
Claus Gittinger <cg@exept.de>
parents: 2045
diff changeset
  5491
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5492
    filePointer isNil ifTrue:[^ self errorNotOpen].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5493
    mode == #writeonly ifTrue:[^ self errorWriteOnly].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5494
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5495
    fd := self fileDescriptor.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5496
    (OperatingSystem readCheck:fd) ifTrue:[^ false].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5497
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5498
    wasBlocked := OperatingSystem blockInterrupts.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5499
    hasData := OperatingSystem readCheck:fd.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5500
    hasData ifFalse:[
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5501
	inputSema := Semaphore new name:'readWait'.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5502
	[
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5503
	    timeout notNil ifTrue:[
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5504
		Processor signal:inputSema afterMilliseconds:timeout
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5505
	    ].
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5506
	    Processor signal:inputSema onInput:fd.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5507
	    Processor activeProcess state:#ioWait.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5508
	    inputSema wait.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5509
	    Processor disableSemaphore:inputSema.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5510
	    hasData := OperatingSystem readCheck:fd
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5511
	] ifCurtailed:[
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5512
	    Processor disableSemaphore:inputSema.
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5513
	    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5514
	]
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5515
    ].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5516
    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5517
    ^ hasData not
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5518
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5519
3490
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5520
readWriteWait
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5521
    "suspend the current process, until the receiver
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5522
     becomes ready for writing or reading.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5523
     Return immediate if the receiver is already ready.
5506
ffa0d32f4a51 Comment
Stefan Vogel <sv@exept.de>
parents: 5494
diff changeset
  5524
     The other threads are not affected by the wait."
3490
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5525
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5526
    self readWriteWaitWithTimeoutMs:nil
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5527
!
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5528
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5529
readWriteWaitWithTimeoutMs:timeout
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5530
    "suspend the current process, until the receiver
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5531
     becomes ready for reading or writing or a timeout (in milliseconds) expired.
3490
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5532
     Return true if a timeout occured (i.e. false, if data is available).
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5533
     Return immediate if the receiver is already ready.
5506
ffa0d32f4a51 Comment
Stefan Vogel <sv@exept.de>
parents: 5494
diff changeset
  5534
     The other threads are not affected by the wait."
3490
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5535
3672
49dff0652a2c fixed readAhead in peek with non-binary mode
Claus Gittinger <cg@exept.de>
parents: 3569
diff changeset
  5536
    |fd sema canReadWrite wasBlocked|
3490
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5537
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5538
    filePointer isNil ifTrue:[
7832
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5539
	^ self errorNotOpen
3490
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5540
    ].
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5541
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5542
    fd := self fileDescriptor.
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5543
    (OperatingSystem readWriteCheck:fd) ifTrue:[^ false].
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5544
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5545
    wasBlocked := OperatingSystem blockInterrupts.
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5546
    canReadWrite := OperatingSystem readWriteCheck:fd.
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5547
    canReadWrite ifFalse:[
7832
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5548
	sema := Semaphore new name:'readWriteWait'.
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5549
	[
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5550
	    timeout notNil ifTrue:[
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5551
		Processor signal:sema afterMilliseconds:timeout
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5552
	    ].
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5553
	    Processor signal:sema onOutput:fd.
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5554
	    Processor signal:sema onInput:fd.
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5555
	    Processor activeProcess state:#ioWait.
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5556
	    sema wait.
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5557
	    Processor disableSemaphore:sema.
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5558
	    canReadWrite := OperatingSystem readWriteCheck:fd
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5559
	] ifCurtailed:[
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5560
	    Processor disableSemaphore:sema.
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5561
	    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5562
	]
3490
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5563
    ].
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5564
    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5565
    ^ canReadWrite not
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5566
!
6a87c2b37fd4 added #readWriteWait methods.
Claus Gittinger <cg@exept.de>
parents: 3474
diff changeset
  5567
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5568
writeWait
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5569
    "suspend the current process, until the receiver
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5570
     becomes ready for writing.
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5571
     Return immediate if the receiver is already ready.
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5572
     The other threads are not affected by the wait."
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5573
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5574
    self writeWaitWithTimeoutMs:nil
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5575
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5576
3016
42466b291fae more ST80 compatibility
ca
parents: 2999
diff changeset
  5577
writeWaitTimeoutMs:timeout
42466b291fae more ST80 compatibility
ca
parents: 2999
diff changeset
  5578
    "ST-80 compatibility"
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5579
    ^ self writeWaitWithTimeoutMs:timeout
3016
42466b291fae more ST80 compatibility
ca
parents: 2999
diff changeset
  5580
!
42466b291fae more ST80 compatibility
ca
parents: 2999
diff changeset
  5581
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5582
writeWaitWithTimeout:timeout
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5583
    "suspend the current process, until the receiver
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5584
     becomes ready for writing or a timeout (in seconds) expired.
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5585
     Return true if a timeout occured (i.e. false, if data is available).
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5586
     Return immediate if the receiver is already ready.
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5587
     The other threads are not affected by the wait."
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5588
4640
034c028a5463 care for nil arg in readWaitWithTimeout / writeWaitWithTimeout
Claus Gittinger <cg@exept.de>
parents: 4627
diff changeset
  5589
    |ms|
034c028a5463 care for nil arg in readWaitWithTimeout / writeWaitWithTimeout
Claus Gittinger <cg@exept.de>
parents: 4627
diff changeset
  5590
034c028a5463 care for nil arg in readWaitWithTimeout / writeWaitWithTimeout
Claus Gittinger <cg@exept.de>
parents: 4627
diff changeset
  5591
    timeout notNil ifTrue:[
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5592
	ms := timeout * 1000
4640
034c028a5463 care for nil arg in readWaitWithTimeout / writeWaitWithTimeout
Claus Gittinger <cg@exept.de>
parents: 4627
diff changeset
  5593
    ].
034c028a5463 care for nil arg in readWaitWithTimeout / writeWaitWithTimeout
Claus Gittinger <cg@exept.de>
parents: 4627
diff changeset
  5594
    ^ self writeWaitWithTimeoutMs:ms
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5595
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5596
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5597
writeWaitWithTimeoutMs:timeout
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5598
    "suspend the current process, until the receiver
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5599
     becomes ready for writing or a timeout (in milliseconds) expired.
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5600
     Return true if a timeout occured (i.e. false, if data is available).
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5601
     Return immediate if the receiver is already ready.
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5602
     The other threads are not affected by the wait."
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5603
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5604
    |fd outputSema canWrite wasBlocked|
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5605
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5606
    filePointer isNil ifTrue:[
7832
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5607
	^ self errorNotOpen
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5608
    ].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5609
    mode == #readonly ifTrue:[
7832
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5610
	^ self errorReadOnly
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5611
    ].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5613
    fd := self fileDescriptor.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5614
    (OperatingSystem writeCheck:fd) ifTrue:[^ false].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5615
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5616
    wasBlocked := OperatingSystem blockInterrupts.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5617
    canWrite := OperatingSystem writeCheck:fd.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5618
    canWrite ifFalse:[
7832
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5619
	outputSema := Semaphore new name:'writeWait'.
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5620
	[
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5621
	    timeout notNil ifTrue:[
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5622
		Processor signal:outputSema afterMilliseconds:timeout
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5623
	    ].
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5624
	    Processor signal:outputSema onOutput:fd.
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5625
	    Processor activeProcess state:#ioWait.
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5626
	    outputSema wait.
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5627
	    Processor disableSemaphore:outputSema.
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5628
	    canWrite := OperatingSystem writeCheck:fd
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5629
	] ifCurtailed:[
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5630
	    Processor disableSemaphore:outputSema.
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5631
	    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
f8a02752ca28 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7806
diff changeset
  5632
	]
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5633
    ].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5634
    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5635
    ^ canWrite not
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5636
! !
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5637
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5638
!ExternalStream methodsFor:'writing'!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5639
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5640
cr
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5641
    "append an end-of-line character (or CRLF if in crlf mode).
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5642
     reimplemented for speed"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5643
1067
1e7959af0821 removed all NOCONTEXT (last version did no good - PROTECT-stack overflow ...)
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
  5644
%{
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  5645
    FILEPOINTER f;
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  5646
    int len, cnt, _buffered;
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5647
    OBJ fp;
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5648
    char *cp;
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5649
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  5650
    __INST(lastErrorNumber) = nil;
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  5651
    if (((fp = __INST(filePointer)) != nil)
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5652
	&& (__INST(mode) != @symbol(readonly))
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5653
	&& (__INST(binary) != true)
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  5654
    ) {
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5655
	f = __FILEVal(fp);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5656
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5657
	if (_buffered = (__INST(buffered) == true)) {
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5658
	    __WRITING__(f)
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5659
	}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5660
	{
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5661
	    OBJ mode = __INST(eolMode);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5662
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5663
	    if (mode == @symbol(cr)) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5664
		cp = "\r"; len = 1;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5665
	    } else if (mode == @symbol(crlf)) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5666
		cp = "\r\n"; len = 2;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5667
	    } else {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5668
		cp = "\n"; len = 1;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5669
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5670
	}
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
  5671
#ifdef WIN32
10328
ad731a7584a3 ensure that win32_fwrite is used for stdout and stderr
Claus Gittinger <cg@exept.de>
parents: 9053
diff changeset
  5672
	if ((f == __win32_stdout()) || (f == __win32_stderr())) {
ad731a7584a3 ensure that win32_fwrite is used for stdout and stderr
Claus Gittinger <cg@exept.de>
parents: 9053
diff changeset
  5673
	    cnt = __win32_fwrite(cp, 1, len, f);
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5674
	} else
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
  5675
#endif
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5676
	{
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5677
	    __WRITEBYTES__(cnt, f, cp, len, _buffered);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5678
	}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5679
	if (cnt == len) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5680
	    if (__isSmallInteger(__INST(position))) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5681
		INT np = __intVal(__INST(position)) + len;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5682
		OBJ t;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5683
8881
53e94478133f STORE macro fix (gcc3.4 bug)
Claus Gittinger <cg@exept.de>
parents: 8818
diff changeset
  5684
		t = __MKINT(np); __INST(position) = t; __STORE(self, t);
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5685
	    } else {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5686
		__INST(position) = nil; /* i.e: dont know */
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5687
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5688
	    RETURN ( self );
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5689
	}
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  5690
	__INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5691
    }
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5692
%}.
2326
01fa309e48d9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2325
diff changeset
  5693
    lastErrorNumber notNil ifTrue:[self writeError. ^ self].
01fa309e48d9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2325
diff changeset
  5694
    filePointer isNil ifTrue:[self errorNotOpen. ^ self].
01fa309e48d9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2325
diff changeset
  5695
    (mode == #readonly) ifTrue:[self errorReadOnly. ^ self].
5414
8557e4e71e51 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 5323
diff changeset
  5696
    (binary==true) ifTrue:[self errorBinary. ^ self].
8557e4e71e51 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 5323
diff changeset
  5697
8557e4e71e51 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 5323
diff changeset
  5698
    (eolMode == #cr) ifTrue:[self nextPut:(Character return). ^ self].
8557e4e71e51 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 5323
diff changeset
  5699
    (eolMode ~~ #crlf) ifTrue:[self nextPut:(Character nl). ^ self].
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5700
    self nextPut:(Character return).
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5701
    self nextPut:(Character nl).
5414
8557e4e71e51 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 5323
diff changeset
  5702
    ^ self
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5703
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5704
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  5705
flush
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  5706
    "write all buffered data - ignored if unbuffered"
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  5707
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  5708
%{
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  5709
    OBJ fp;
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  5710
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  5711
    __INST(lastErrorNumber) = nil;
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  5712
    if ((fp = __INST(filePointer)) != nil) {
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5713
	if (__INST(mode) != @symbol(readonly)) {
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5714
	    if (__INST(buffered) == true) {
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5715
		FILEPOINTER f = __FILEVal(fp);
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
  5716
#ifdef WIN32
10328
ad731a7584a3 ensure that win32_fwrite is used for stdout and stderr
Claus Gittinger <cg@exept.de>
parents: 9053
diff changeset
  5717
		if ((f == __win32_stdout()) || (f == __win32_stderr())) {
ad731a7584a3 ensure that win32_fwrite is used for stdout and stderr
Claus Gittinger <cg@exept.de>
parents: 9053
diff changeset
  5718
		    __win32_fflush(f);
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5719
		} else
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
  5720
#endif
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5721
		{
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5722
#ifdef WIN32
10339
972d0164125a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 10328
diff changeset
  5723
# if 1
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5724
		    FFLUSH(f);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5725
# else
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5726
		    __BEGIN_INTERRUPTABLE__
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5727
		    FFLUSH(f);
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5728
		    __END_INTERRUPTABLE__
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5729
# endif
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5730
#else
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5731
		    __BEGIN_INTERRUPTABLE__
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5732
		    FFLUSH(f);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5733
		    __END_INTERRUPTABLE__
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5734
#endif
7051
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5735
		}
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5736
	    }
984d8271d06b preps for 0-based stream positions
Claus Gittinger <cg@exept.de>
parents: 7017
diff changeset
  5737
	}
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  5738
    }
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  5739
%}
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  5740
!
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  5741
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5742
nextPut:aCharacter
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5743
    "write the argument, aCharacter - return nil if failed, self if ok.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5744
     Only single-byte characters are currently supported"
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5745
1067
1e7959af0821 removed all NOCONTEXT (last version did no good - PROTECT-stack overflow ...)
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
  5746
%{
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  5747
    FILEPOINTER f;
8209
908ba4b9543e check for written characters to be in 00..FF
Claus Gittinger <cg@exept.de>
parents: 8074
diff changeset
  5748
    unsigned codePoint;
908ba4b9543e check for written characters to be in 00..FF
Claus Gittinger <cg@exept.de>
parents: 8074
diff changeset
  5749
    unsigned char c;
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  5750
    int cnt, _buffered;
7875
eb7d48b0425d made all position-handling code 32bit save
Claus Gittinger <cg@exept.de>
parents: 7832
diff changeset
  5751
    OBJ fp;
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5752
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  5753
    __INST(lastErrorNumber) = nil;
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5754
    if (((fp = __INST(filePointer)) != nil)
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5755
	&& (__INST(mode) != @symbol(readonly))
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  5756
    ) {
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5757
	if (__INST(binary) != true) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5758
	    if (__isCharacter(aCharacter)) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5759
		codePoint = __intVal(__characterVal(aCharacter));
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5760
		if (codePoint <= 0xFF) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5761
		    c = codePoint;
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5762
    doWrite:
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5763
		    f = __FILEVal(fp);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5764
		    if (! f) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5765
			fprintf(stderr, "oops - fileHandle is NULL in nextPut:\n");
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5766
			__INST(filePointer) = nil;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5767
			goto out;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5768
		    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5769
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5770
		    if (_buffered = (__INST(buffered) == true)) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5771
			__WRITING__(f)
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5772
		    }
9053
f3f3d48d6f44 fix writing to stdout/stderr for winstx non-console operation
Claus Gittinger <cg@exept.de>
parents: 9024
diff changeset
  5773
#ifdef WIN32
10328
ad731a7584a3 ensure that win32_fwrite is used for stdout and stderr
Claus Gittinger <cg@exept.de>
parents: 9053
diff changeset
  5774
		    if ((f == __win32_stdout()) || (f == __win32_stderr())) {
ad731a7584a3 ensure that win32_fwrite is used for stdout and stderr
Claus Gittinger <cg@exept.de>
parents: 9053
diff changeset
  5775
			cnt = __win32_fwrite(&c, 1, 1, f);
9053
f3f3d48d6f44 fix writing to stdout/stderr for winstx non-console operation
Claus Gittinger <cg@exept.de>
parents: 9024
diff changeset
  5776
		    } else
f3f3d48d6f44 fix writing to stdout/stderr for winstx non-console operation
Claus Gittinger <cg@exept.de>
parents: 9024
diff changeset
  5777
#endif
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5778
		    __WRITEBYTE__(cnt, f, &c, _buffered);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5779
		    if (cnt == 1) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5780
			if (__isSmallInteger(__INST(position))) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5781
			    INT np = __intVal(__INST(position)) + 1;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5782
			    OBJ t;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5783
8881
53e94478133f STORE macro fix (gcc3.4 bug)
Claus Gittinger <cg@exept.de>
parents: 8818
diff changeset
  5784
			    t = __MKINT(np); __INST(position) = t; __STORE(self, t);
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5785
			} else {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5786
			    __INST(position) = nil; /* i.e. do not know */
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5787
			}
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5788
			RETURN ( self );
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5789
		    }
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  5790
		    __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5791
		}
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5792
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5793
	} else {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5794
	    if (__isSmallInteger(aCharacter)) {
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5795
		c = __intVal(aCharacter);
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5796
		goto doWrite;
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5797
	    }
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5798
	}
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5799
    }
7737
616d849b7838 fileHandle check
Claus Gittinger <cg@exept.de>
parents: 7700
diff changeset
  5800
out: ;
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5801
%}.
2331
d6ddf452adc9 return codes in error cases
Claus Gittinger <cg@exept.de>
parents: 2326
diff changeset
  5802
    lastErrorNumber notNil ifTrue:[self writeError. ^ self].
d6ddf452adc9 return codes in error cases
Claus Gittinger <cg@exept.de>
parents: 2326
diff changeset
  5803
    filePointer isNil ifTrue:[self errorNotOpen. ^ self].
d6ddf452adc9 return codes in error cases
Claus Gittinger <cg@exept.de>
parents: 2326
diff changeset
  5804
    (mode == #readonly) ifTrue:[self errorReadOnly. ^ self].
5417
0478ac31e042 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5414
diff changeset
  5805
    binary == true ifFalse:[
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5806
	(aCharacter isCharacter not
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5807
	or:[aCharacter codePoint > 16rFF]) ifTrue:[
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5808
	    self argumentMustBeCharacter.
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5809
	    ^ self.
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5810
	].
5417
0478ac31e042 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5414
diff changeset
  5811
    ] ifTrue:[
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5812
	aCharacter isInteger ifFalse:[
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5813
	    self argumentMustBeInteger.
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5814
	    ^ self.
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5815
	].
5417
0478ac31e042 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5414
diff changeset
  5816
    ].
0478ac31e042 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5414
diff changeset
  5817
    "/ migration support
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5818
    self
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5819
	nextPutByte:aCharacter asInteger
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5820
	toFile:filePointer
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5821
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5822
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5823
nextPutAll:aCollection
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5824
    "write all elements of the argument, aCollection.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5825
     Reimplemented for speed when writing strings or byteArrays.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5826
     For others, falls back to general method in superclass."
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5827
1067
1e7959af0821 removed all NOCONTEXT (last version did no good - PROTECT-stack overflow ...)
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
  5828
%{
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  5829
    FILEPOINTER f;
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5830
    int len, cnt;
7875
eb7d48b0425d made all position-handling code 32bit save
Claus Gittinger <cg@exept.de>
parents: 7832
diff changeset
  5831
    OBJ fp;
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  5832
    int _buffered;
2513
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  5833
    int o_offs;
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5834
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  5835
    __INST(lastErrorNumber) = nil;
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  5836
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  5837
    if (((fp = __INST(filePointer)) != nil)
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5838
	&& (__INST(mode) != @symbol(readonly))
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  5839
    ) {
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5840
	f = __FILEVal(fp);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5841
	if (! f) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5842
	    fprintf(stderr, "oops - fileHandle is NULL in nextPutAll:\n");
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5843
	    __INST(filePointer) = nil;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5844
	    goto out;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5845
	}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5846
	if (_buffered = (__INST(buffered) == true)) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5847
	    __WRITING__(f)
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5848
	}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5849
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5850
	if (__isString(aCollection) || __isSymbol(aCollection)) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5851
	    len = __stringSize(aCollection);
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
  5852
#ifdef WIN32
10328
ad731a7584a3 ensure that win32_fwrite is used for stdout and stderr
Claus Gittinger <cg@exept.de>
parents: 9053
diff changeset
  5853
	    if ((f == __win32_stdout()) || (f == __win32_stderr())) {
ad731a7584a3 ensure that win32_fwrite is used for stdout and stderr
Claus Gittinger <cg@exept.de>
parents: 9053
diff changeset
  5854
		cnt = __win32_fwrite(__stringVal(aCollection), 1, len, f);
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5855
	    } else
2513
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  5856
#endif
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5857
	    {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5858
		o_offs = (char *)__stringVal(aCollection)-(char *)__InstPtr(aCollection);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5859
		__WRITEBYTES_OBJ__(cnt, f, aCollection, o_offs, len, _buffered);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5860
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5861
	} else {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5862
	    if (__INST(binary) == true) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5863
		int offs;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5864
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5865
		if (__isByteArray(aCollection)) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5866
		    offs = 0;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5867
		    len = __byteArraySize(aCollection);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5868
		} else if (__isBytes(aCollection)) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5869
		    offs = __OBJS2BYTES__(__intVal(__ClassInstPtr(__qClass(aCollection))->c_ninstvars));
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5870
		    len = __byteArraySize(aCollection) - offs;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5871
		} else
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5872
		    goto out;
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
  5873
#ifdef WIN32
10328
ad731a7584a3 ensure that win32_fwrite is used for stdout and stderr
Claus Gittinger <cg@exept.de>
parents: 9053
diff changeset
  5874
		if ((f == __win32_stdout()) || (f == __win32_stderr())) {
ad731a7584a3 ensure that win32_fwrite is used for stdout and stderr
Claus Gittinger <cg@exept.de>
parents: 9053
diff changeset
  5875
		    cnt = __win32_fwrite(__stringVal(aCollection), 1, len, f);
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5876
		} else
2513
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  5877
#endif
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5878
		{
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5879
		    o_offs = (char *)(__ByteArrayInstPtr(aCollection)->ba_element) - (char *)__InstPtr(aCollection);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5880
		    o_offs += offs;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5881
		    __WRITEBYTES_OBJ__(cnt, f, aCollection, o_offs, len, _buffered);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5882
		}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5883
	    } else
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5884
		goto out;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5885
	}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5886
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5887
	if (cnt == len) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5888
	    if (__isSmallInteger(__INST(position))) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5889
		INT np = __intVal(__INST(position)) + len;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5890
		OBJ t;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5891
8881
53e94478133f STORE macro fix (gcc3.4 bug)
Claus Gittinger <cg@exept.de>
parents: 8818
diff changeset
  5892
		t = __MKINT(np); __INST(position) = t; __STORE(self, t);
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5893
	    } else {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5894
		__INST(position) = nil; /* i.e. do not know */
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5895
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5896
	    RETURN (self);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5897
	}
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  5898
	__INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5899
    }
1478
aae07192b7d1 labels in empty statements need a semi
Claus Gittinger <cg@exept.de>
parents: 1469
diff changeset
  5900
out: ;
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5901
%}.
2331
d6ddf452adc9 return codes in error cases
Claus Gittinger <cg@exept.de>
parents: 2326
diff changeset
  5902
    lastErrorNumber notNil ifTrue:[self writeError. ^ self].
d6ddf452adc9 return codes in error cases
Claus Gittinger <cg@exept.de>
parents: 2326
diff changeset
  5903
    filePointer isNil ifTrue:[self errorNotOpen. ^ self].
d6ddf452adc9 return codes in error cases
Claus Gittinger <cg@exept.de>
parents: 2326
diff changeset
  5904
    (mode == #readonly) ifTrue:[self errorReadOnly. ^ self].
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5905
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5906
    ^ super nextPutAll:aCollection
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5907
!
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5908
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5909
nextPutAll:aCollection startingAt:start to:stop
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5910
    "write a range of elements of the argument, aCollection.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5911
     Reimplemented for speed when writing strings or byteArrays.
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5912
     For others, falls back to general method in superclass."
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5913
1067
1e7959af0821 removed all NOCONTEXT (last version did no good - PROTECT-stack overflow ...)
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
  5914
%{
2593
d678527ef34e changes for NT; prepare to use HANDLES instead of FILES (NT)
Claus Gittinger <cg@exept.de>
parents: 2591
diff changeset
  5915
    FILEPOINTER f;
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  5916
    int offs, len, cnt, iStart, iStop, _buffered;
7875
eb7d48b0425d made all position-handling code 32bit save
Claus Gittinger <cg@exept.de>
parents: 7832
diff changeset
  5917
    OBJ fp;
2513
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  5918
    int o_offs;
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5919
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  5920
    __INST(lastErrorNumber) = nil;
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1119
diff changeset
  5921
    if (((fp = __INST(filePointer)) != nil)
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5922
	&& (__INST(mode) != @symbol(readonly))
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5923
	&& __bothSmallInteger(start, stop)
1463
ace6b72b6f4a Use common macros to make interruptable system calls signal proof.
Stefan Vogel <sv@exept.de>
parents: 1422
diff changeset
  5924
    ) {
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5925
	f = __FILEVal(fp);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5926
	if (_buffered = (__INST(buffered) == true)) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5927
	    __WRITING__(f)
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5928
	}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5929
	iStart = __intVal(start);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5930
	iStop = __intVal(stop);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5931
	if ((iStart < 1) || (iStop < iStart)) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5932
	    RETURN(self);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5933
	}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5934
	if (__isString(aCollection) || __isSymbol(aCollection)) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5935
	    len = __stringSize(aCollection);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5936
	    if (iStop > len) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5937
		RETURN(self);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5938
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5939
	    if (iStop > len)
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5940
		iStop = len;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5941
	    len = iStop - iStart + 1;
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
  5942
#ifdef WIN32
10328
ad731a7584a3 ensure that win32_fwrite is used for stdout and stderr
Claus Gittinger <cg@exept.de>
parents: 9053
diff changeset
  5943
	    if ((f == __win32_stdout()) || (f == __win32_stderr())) {
ad731a7584a3 ensure that win32_fwrite is used for stdout and stderr
Claus Gittinger <cg@exept.de>
parents: 9053
diff changeset
  5944
		cnt = __win32_fwrite(__stringVal(aCollection)+iStart-1, 1, len, f);
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5945
	    } else
2513
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  5946
#endif
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5947
	    {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5948
		o_offs = (char *)__stringVal(aCollection)-(char *)__InstPtr(aCollection);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5949
		__WRITEBYTES_OBJ__(cnt, f, aCollection, o_offs+iStart-1, len, _buffered);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5950
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5951
	} else {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5952
	    if (__INST(binary) == true) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5953
		int offs;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5954
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5955
		if (__isByteArray(aCollection)) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5956
		    offs = 0;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5957
		    len = __byteArraySize(aCollection);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5958
		} else if (__isBytes(aCollection)) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5959
		    offs = __OBJS2BYTES__(__intVal(__ClassInstPtr(__qClass(aCollection))->c_ninstvars));
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5960
		    len = __byteArraySize(aCollection) - offs;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5961
		} else
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5962
		    goto out;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5963
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5964
		if (iStop > len) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5965
		    RETURN(self);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5966
		}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5967
		if (iStop > len)
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5968
		    iStop = len;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5969
		len = iStop - iStart + 1;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5970
		offs += iStart - 1;
4913
4964b2c71d31 remerged ExtSTream_win32 into ExtStream.
Claus Gittinger <cg@exept.de>
parents: 4640
diff changeset
  5971
#ifdef WIN32
10328
ad731a7584a3 ensure that win32_fwrite is used for stdout and stderr
Claus Gittinger <cg@exept.de>
parents: 9053
diff changeset
  5972
		if ((f == __win32_stdout()) || (f == __win32_stderr())) {
ad731a7584a3 ensure that win32_fwrite is used for stdout and stderr
Claus Gittinger <cg@exept.de>
parents: 9053
diff changeset
  5973
		    cnt = __win32_fwrite(__stringVal(aCollection)+iStart-1, 1, len, f);
8818
4b1ffc19e3ce remerged WIN32 and Unix versions into common source
Claus Gittinger <cg@exept.de>
parents: 8616
diff changeset
  5974
		} else
2513
a589586a3828 big bug: READBYTES & WRITEBYTES did not care for moving objects when interrupted.
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  5975
#endif
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5976
		{
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5977
		    o_offs = (char *)(__ByteArrayInstPtr(aCollection)->ba_element)-(char *)__InstPtr(aCollection);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5978
		    __WRITEBYTES_OBJ__(cnt, f,  aCollection, o_offs+offs, len, _buffered);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5979
		}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5980
	    } else
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5981
		goto out;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5982
	}
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5983
	if (cnt == len) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5984
	    if (__isSmallInteger(__INST(position))) {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5985
		INT np = __intVal(__INST(position)) + len;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5986
		OBJ t;
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5987
8881
53e94478133f STORE macro fix (gcc3.4 bug)
Claus Gittinger <cg@exept.de>
parents: 8818
diff changeset
  5988
		t = __MKINT(np); __INST(position) = t; __STORE(self, t);
8070
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5989
	    } else {
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5990
		__INST(position) = nil; /* i.e. do not know */
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5991
	    }
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5992
	    RETURN (self);
2fec8e67e119 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8069
diff changeset
  5993
	}
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  5994
	__INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5995
    }
1478
aae07192b7d1 labels in empty statements need a semi
Claus Gittinger <cg@exept.de>
parents: 1469
diff changeset
  5996
out: ;
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5997
%}.
7801
d930c353588d writeError: care for EWOULDBLOCK in nonBlocking case.
penk
parents: 7737
diff changeset
  5998
    lastErrorNumber notNil ifTrue:[self writeError. ^ self].
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  5999
    ^ super nextPutAll:aCollection startingAt:start to:stop
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  6000
! !
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  6001
2045
1ad17ca6520f fall back to super>>nextPutLine: if argument is not a string.
Claus Gittinger <cg@exept.de>
parents: 2044
diff changeset
  6002
!ExternalStream class methodsFor:'documentation'!
730
62643519bf68 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 711
diff changeset
  6003
62643519bf68 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 711
diff changeset
  6004
version
11396
cf8df63632da changed #openError raise with stream as parameter
Stefan Vogel <sv@exept.de>
parents: 10997
diff changeset
  6005
    ^ '$Header: /cvs/stx/stx/libbasic/ExternalStream.st,v 1.318 2008-12-08 11:52:48 stefan Exp $'
730
62643519bf68 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 711
diff changeset
  6006
! !
6804
caf6a4521d4c added utility: ExternalStream >> copyToEndInto:
Claus Gittinger <cg@exept.de>
parents: 6758
diff changeset
  6007
612
e640bef6170e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  6008
ExternalStream initialize!