FileStream_win32.st
author Claus Gittinger <cg@exept.de>
Wed, 22 Sep 1999 17:39:21 +0200
changeset 4789 72a61dc595ad
parent 4369 eaac1c04a81d
permissions -rw-r--r--
loadAll/Make.proto file generation
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
 COPYRIGHT (c) 1989 by Claus Gittinger
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
	      All Rights Reserved
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
 This software is furnished under a license and may be used
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 hereby transferred.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
ExternalStream subclass:#FileStream
3755
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
    14
	instanceVariableNames:'pathName canPosition removeOnClose'
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
	classVariableNames:'OpenErrorSignal'
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
	poolDictionaries:''
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
	category:'Streams-External'
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
!FileStream primitiveDefinitions!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
%{
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
#include <stdio.h>
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
#define _STDIO_H_INCLUDED_
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
#include <errno.h>
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
#define _ERRNO_H_INCLUDED_
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
4361
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    29
#include <sys/types.h>
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    30
#include <sys/stat.h>
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
#ifndef SEEK_SET
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
# define SEEK_SET       0
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
#endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
#ifndef SEEK_CUR
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
# define SEEK_CUR       1
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
#endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
#ifndef SEEK_END
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
# define SEEK_END       2
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
#endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
/*
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
 * not all systems have off_t
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
 * explicit add of those we know to have ...
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
 */
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
#ifndef OFF_T
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
# define OFF_T  long
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
#endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
4361
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    51
#if 1
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    52
# define NO_STDIO
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    53
#else
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    54
# undef __BEGIN_INTERRUPTABLE__
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    55
# undef __END_INTERRUPTABLE__
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    56
# define __BEGIN_INTERRUPTABLE__
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    57
# define __END_INTERRUPTABLE__
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    58
#endif
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    59
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    60
#ifdef i386
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    61
# define _X86_
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
#endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
4361
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    64
#undef INT
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    65
#undef Array
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    66
#undef Number
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    67
#undef Method
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    68
#undef Point
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    69
#undef Rectangle
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    70
#undef Block
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    71
#undef Time
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    72
#undef Date
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
4361
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    74
#define NOATOM
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    75
#define NOGDICAPMASKS
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    76
#define NOMETAFILE
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    77
#define NOMINMAX
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
    78
//# define NOOPENFILE
4361
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    79
#define NOSOUND
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    80
#define NOWH
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
    81
//# define NOCOMM
4361
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    82
#define NOKANJI
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    83
#define NOCRYPT
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
    84
//# define NOMCX
4361
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    85
#define WIN32_LEAN_AND_MEAN
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    86
#include <windows.h>
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    87
#include <winsock.h> /* */
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    88
#if !defined(__BORLANDC__)
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    89
# define stat _stat
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    90
#endif
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
4361
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    92
#ifdef __DEF_Array
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    93
#  define Array __DEF_Array
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    94
#endif
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    95
#ifdef __DEF_Number
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    96
#  define Number __DEF_Number
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    97
#endif
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    98
#ifdef __DEF_Method
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
    99
#  define Method __DEF_Method
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   100
#endif
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   101
#ifdef __DEF_Point
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   102
#  define Point __DEF_Point
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   103
#endif
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   104
#ifdef __DEF_Block
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   105
#  define Block __DEF_Block
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   106
#endif
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   107
#ifdef __DEF_Time
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   108
#  define Time __DEF_Time
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   109
#endif
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   110
#ifdef __DEF_Date
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   111
#  define Date __DEF_Date
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   112
#endif
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
4361
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   114
#define INT int
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   115
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
#ifdef NO_STDIO
4361
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   117
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   118
/*# define HFILE HANDLE*/
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   119
# define HFILE FILE *
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   120
//# define fileno(f) f
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   121
4361
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   122
# define TELL(currentPosition,f,buffered)                       \
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
    if (buffered) {                                             \
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   124
	currentPosition = ftell(f);                             \
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
    } else {                                                    \
4361
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   126
	OBJ rA = __INST(readAhead);                             \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   127
	if (rA != nil) {                                        \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   128
	    __INST(readAhead) = nil;                            \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   129
	    currentPosition = lseek(fileno(f), -1L, SEEK_CUR);  \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   130
	} else {                                                \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   131
	  currentPosition = lseek(fileno(f), 0L, SEEK_CUR);     \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   132
	}                                                       \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   133
    }
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   134
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   135
# define SEEK(ret,f,nP,buffered)                        \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   136
    if (buffered) {                                     \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   137
	ret = fseek(f, nP, SEEK_SET);                   \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   138
    } else {                                            \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   139
	OBJ rA = __INST(readAhead);                     \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   140
	if (rA != nil) {                                \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   141
	    __INST(readAhead) = nil;                    \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   142
	}                                               \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   143
	ret = lseek(fileno(f), nP, SEEK_SET);           \
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
    }
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   145
4361
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   146
# define TOEND(ret,f,buffered)                          \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   147
    if (buffered) {                                     \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   148
	ret = fseek(f, 0L, SEEK_END);                   \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   149
    } else {                                            \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   150
	OBJ rA = __INST(readAhead);                     \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   151
	if (rA != nil) {                                \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   152
	    __INST(readAhead) = nil;                    \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   153
	}                                               \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   154
	ret = lseek(fileno(f), 0L, SEEK_END);           \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   155
    }
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   156
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
#else
4361
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   158
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   159
# define HFILE FILE *
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   160
4361
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   161
# define TELL(currentPosition,f,buffered)                 \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   162
    if (buffered) {                                       \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   163
	currentPosition = ftell(f);                       \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   164
    } else {                                              \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   165
	currentPosition = lseek(fileno(f), 0L, SEEK_CUR); \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   166
    }
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   167
4361
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   168
# define SEEK(ret,f,nP,buffered)                        \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   169
    if (buffered) {                                     \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   170
	ret = fseek(f, nP, SEEK_SET);                   \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   171
    } else {                                            \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   172
	ret = lseek(fileno(f), nP, SEEK_SET);           \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   173
    }
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   174
4361
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   175
# define TOEND(ret,f,buffered)                          \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   176
    if (buffered) {                                     \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   177
	ret = fseek(f, 0L, SEEK_END);                   \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   178
    } else {                                            \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   179
	ret = lseek(fileno(f), 0L, SEEK_END);           \
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   180
    }
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   181
            
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
 extern long ftell(), lseek();
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
#endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
/*
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
 * on some systems errno is a macro ... check for it here
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
 */
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
#ifndef errno
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
 extern errno;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
#endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
%}
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
!FileStream class methodsFor:'documentation'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
copyright
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
 COPYRIGHT (c) 1989 by Claus Gittinger
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
	      All Rights Reserved
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
 This software is furnished under a license and may be used
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
 only in accordance with the terms of that license and with the
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
 inclusion of the above copyright notice.   This software may not
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
 be provided or otherwise made available to, or used by, any
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
 other person.  No title to or ownership of the software is
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
 hereby transferred.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
documentation
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
    This class provides access to the operating systems underlying file
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
    system (i.e. its an interface to the stdio library).
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
    Notice, that on some systems, the standard I/O library has performance
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
    problems when a file is opened for readwrite. 
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
    For best results, open files either readonly or writeonly.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
    Also notice, that some OperatingSystems do not fully support
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
    positioning a file stream.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
    For example, poor VMS does not allow positioning onto arbitrary
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
    byte boundaries if the file is a variable-record-RMS file.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
    (stupid enough, this is the default for textfiles as created by
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
     some tools ...)
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
    Therefore, the instance variable canPosition is set according to
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
    this and an error is raised, if a position: is attemted.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
    I know, this is ugly, but what else could we do ?
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
    [instance variables:]
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
	pathName        <String>        the files path (if known)
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
	canPosition     <Boolean>       positionable - read above comment
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
    [author:]
4361
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   235
	Claus Gittinger (original Unix version)
6ce4ff1e7f3c care for fopen returning a FILE* of -1
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   236
	Manfred Dierolf (dos port)
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
    [see also:]
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
	Filename DirectoryStream PipeStream Socket
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
!FileStream class methodsFor:'initialization'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
initialize
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
    OpenErrorSignal isNil ifTrue:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
	"/
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
	"/ this is temporary - for now allow an openError to
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
	"/ be unhandled and proceed by returning a nil from the
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
	"/ stream creation method.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
	"/ In the future, this will be a hard signal.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
	"/
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
	OpenErrorSignal := QuerySignal new.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
	OpenErrorSignal parent:(super openErrorSignal) mayProceed:true.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
	OpenErrorSignal nameClass:self message:#openErrorSignal.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
	OpenErrorSignal notifierString:'open error'.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
    ]
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
    "Modified: 8.10.1997 / 11:56:39 / cg"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
!FileStream class methodsFor:'instance creation'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
appendingOldFileNamed:filename
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
    "return a FileStream for existing file named filename, aString.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
     The file is opened for writeonly access."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
    |newStream|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
    newStream := self new pathName:filename.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
    newStream openForAppending isNil ifTrue:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
    this is not a good idea; I might like to read the written stuff ...
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
    newStream readLimit:(newStream size).
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
    ^ newStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
appendingOldFileNamed:filename in:aDirectory
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
    "return a FileStream for existing file named filename, aString
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
     in aDirectory, a FileDirectory.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
     The file is opened for writeonly access."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
    |newStream|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
    newStream := self new pathName:filename in:aDirectory.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
    newStream openForAppending isNil ifTrue:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
    this is not a good idea; I might like to read the written stuff ...
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
    newStream readLimit:(newStream size).
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
    ^ newStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
fileNamed:filename
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
    "return a stream on file filename - if the file does not
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
     already exist, create it.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
     The file is opened for read/write access."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
    |stream|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
    stream := self oldFileNamed:filename.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
    stream isNil ifTrue:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
	stream := self newFileNamed:filename
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
    ].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
    ^ stream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   308
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   309
fileNamed:filename in:aDirectory
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   310
    "return a stream on file filename - if the file does not
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   311
     already exist, create it.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   312
     The file is opened for read/write access."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   313
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   314
    |stream|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   315
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   316
    stream := self oldFileNamed:filename in:aDirectory.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   317
    stream isNil ifTrue:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   318
	stream := self newFileNamed:filename in:aDirectory
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   319
    ].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   320
    ^ stream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   321
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   323
newFileForWritingNamed:filename
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   324
    "return a FileStream for new file named filename, aString.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   325
     If the file exists, it is truncated, otherwise created.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   326
     The file is opened for writeonly access."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   327
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   328
    |newStream|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   329
    newStream := self new pathName:filename.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   330
    newStream createForWriting isNil ifTrue:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   331
    ^ newStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   332
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   333
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   334
newFileForWritingNamed:filename in:aDirectory
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   335
    "return a FileStream for new file named filename, aString
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   336
     in aDirectory, a FileDirectory.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   337
     If the file exists, it is truncated, otherwise created.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   338
     The file is opened for writeonly access."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   339
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   340
    |newStream|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   341
    newStream := self new pathName:filename in:aDirectory.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   342
    newStream createForWriting isNil ifTrue:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   343
    ^ newStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   344
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   345
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   346
newFileNamed:filename
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   347
    "return a FileStream for new file named filename, aString.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   348
     If the file exists, it is truncated, otherwise created.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   349
     The file is opened for read/write access."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   350
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   351
    |newStream|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   352
    newStream := self new pathName:filename.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   353
    newStream createForReadWrite isNil ifTrue:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   354
    ^ newStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   355
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   356
    "Modified: / 28.10.1997 / 14:28:08 / cg"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   357
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   358
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   359
newFileNamed:filename in:aDirectory
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   360
    "return a FileStream for new file named filename, aString
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   361
     in aDirectory, a FileDirectory.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   362
     If the file exists, it is truncated, otherwise created.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   363
     The file is opened for read/write access."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   364
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   365
    |newStream|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   366
    newStream := self new pathName:filename in:aDirectory.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   367
    newStream createForReadWrite isNil ifTrue:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   368
    ^ newStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   369
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   370
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   371
oldFileNamed:filename
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   372
    "return a FileStream for existing file named filename, aString.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   373
     The file is opened for read/write access."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   374
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   375
    |newStream|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   376
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   377
    (OperatingSystem isReadable:filename) ifFalse:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   378
    newStream := self new pathName:filename.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   379
    newStream readwrite.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   380
    newStream openForReadWrite isNil ifTrue:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   381
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   382
    this is not a good idea; someone else might be appending ...
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   383
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   384
    newStream readLimit:(newStream size).
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   385
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   386
    ^ newStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   387
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   388
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   389
oldFileNamed:filename in:aDirectory
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   390
    "return a FileStream for existing file named filename, aString
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   391
     in aDirectory, a FileDirectory.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   392
     The file is opened for read/write access."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   393
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   394
    |newStream|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   395
    newStream := self new pathName:filename in:aDirectory.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   396
    newStream openForReadWrite isNil ifTrue:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   397
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   398
    this is not a good idea; someone else might be appending ...
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   399
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   400
    newStream readLimit:(newStream size).
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   401
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   402
    ^ newStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   403
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   404
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   405
readonlyFileNamed:filename
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   406
    "return a readonly FileStream for existing file named filename, aString"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   407
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   408
    |newStream|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   409
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   410
    (OperatingSystem isReadable:filename) ifFalse:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   411
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   412
    newStream := self new pathName:filename.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   413
    newStream openForReading isNil ifTrue:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   414
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   415
    this is not a good idea; someone else might be appending ...
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   416
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   417
    newStream readLimit:(newStream size).
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   418
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   419
    ^ newStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   420
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   421
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   422
readonlyFileNamed:filename in:aDirectory
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   423
    "return a readonly FileStream for existing file named filename, aString
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   424
     in aDirectory, a FileDirectory"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   425
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   426
    |newStream|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   427
    newStream := self new pathName:filename in:aDirectory.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   428
    newStream openForReading isNil ifTrue:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   429
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   430
    this is not a good idea; someone else might be appending ...
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   431
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   432
    newStream readLimit:(newStream size).
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   433
"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   434
    ^ newStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   435
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   436
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   437
!FileStream class methodsFor:'Signal constants'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   438
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   439
openErrorSignal
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   440
    "return the FileStream specific openErrorSignal.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   441
     This is different from ExternalStream>>OpenErrorSignal!!"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   442
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   443
    ^ OpenErrorSignal
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   444
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   445
    "Created: / 28.1.1998 / 14:41:18 / stefan"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   446
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   447
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   448
!FileStream methodsFor:'Squeak compatibility'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   449
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   450
fullName
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   451
    "Squeak compatibility: return the full pathname"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   452
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   453
    ^ pathName asFilename pathName
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   454
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   455
    "Created: 17.10.1997 / 17:04:12 / cg"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   456
    "Modified: 20.10.1997 / 19:22:44 / cg"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   457
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   458
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   459
!FileStream methodsFor:'accessing'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   460
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   461
directoryName
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   462
    "return the name of the directory I'm in as a string"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   463
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   464
    ^ pathName asFilename directoryName
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   465
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   466
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   467
name
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   468
    "return my name without leading direcory-path (i.e. the plain fileName)
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   469
     as a string"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   470
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   471
    ^ pathName asFilename baseName
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   472
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   473
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   474
pathName
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   475
    "return the pathname"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   476
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   477
    ^ pathName
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   478
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   479
3755
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   480
removeOnClose:aBoolean
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   481
    "set/clear the removeOnClose flag.
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   482
     If set, the file will be removed when closed.
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   483
     Provided mostly for OS's which do not allow an
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   484
     open file to be removed (i.e. non unixes),
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   485
     and a fileStream for a tempFile is used.
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   486
     Especially, the CVS-SourceCodeManager returns
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   487
     this kind of file-handles occasionally.
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   488
     This is an ST/X special feature which is not portable
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   489
     to other systems."
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   490
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   491
    removeOnClose := aBoolean
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   492
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   493
    "Modified: / 13.8.1998 / 12:10:07 / cg"
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   494
!
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   495
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   496
store:something
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   497
    "what really should this do"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   498
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   499
    self nextPutAll:something storeString
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   500
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   501
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   502
!FileStream methodsFor:'error handling'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   503
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   504
openError
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   505
    "{ Pragma: +optSpace }"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   506
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   507
    "report an error, that file open failed"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   508
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   509
    "/
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   510
    "/ for now, error on open only raises a querySignal.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   511
    "/ If its not handled, a failing open will return nil.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   512
    "/ Currently, all users of fileStream check for this
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   513
    "/ nil return value (which is a historic leftover)
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   514
    "/
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   515
    "/ This will change in one of the next ST/X releases - for
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   516
    "/ now, it is best to provide an exceptionHandler AND check the
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   517
    "/ return value. 
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   518
    "/ Sorry about that.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   519
    "/
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   520
    LastErrorNumber := lastErrorNumber.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   521
    super openError.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   522
    ^ nil
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   523
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   524
3755
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   525
!FileStream methodsFor:'instance release'!
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   526
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   527
closeFile
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   528
    "low level close - may be redefined in subclasses"
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   529
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   530
    super closeFile.
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   531
    removeOnClose == true ifTrue:[
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   532
	pathName asFilename remove.
3755
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   533
    ]
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   534
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   535
    "Created: / 13.8.1998 / 12:11:22 / cg"
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   536
! !
965501e22c3c added removeOnClose feature
Claus Gittinger <cg@exept.de>
parents: 3746
diff changeset
   537
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   538
!FileStream methodsFor:'positioning'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   539
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   540
position
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   541
    "return the read/write position in the file -
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   542
     notice, in smalltalk indices start at 1 so begin of file is 1"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   543
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   544
%{  /* NOCONTEXT */
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   545
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   546
    HFILE f;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   547
    long currentPosition;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   548
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   549
    if (__INST(filePointer) != nil) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   550
	f = __FILEVal(__INST(filePointer));
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   551
	do {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   552
	    TELL(currentPosition,f,__INST(buffered) == true);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   553
	} while ((currentPosition < 0) && (errno == EINTR));
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   554
	if (currentPosition >= 0) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   555
	    /*
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   556
	     * notice: Smalltalk index starts at 1
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   557
	     */
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   558
	    RETURN ( __MKSMALLINT(currentPosition + 1) );
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   559
	}
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   560
	__INST(lastErrorNumber) = __MKSMALLINT(errno);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   561
    }
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   562
%}.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   563
    lastErrorNumber notNil ifTrue:[^ self ioError].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   564
    filePointer isNil ifTrue:[^ self errorNotOpen].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   565
    ^ self primitiveFailed
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   566
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   567
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   568
position:newPos
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   569
    "set the read/write position in the file"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   570
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   571
%{  /* NOCONTEXT */
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   572
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   573
    HFILE f;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   574
    long ret;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   575
    OBJ fp;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   576
    long nP;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   577
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   578
    if ((__INST(canPosition) != false) 
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   579
     || (newPos == __MKSMALLINT(1))) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   580
	if ((fp = __INST(filePointer)) != nil) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   581
	    if (__isSmallInteger(newPos)) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   582
		f = __FILEVal(fp);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   583
		nP = (long)__intVal(newPos);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   584
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   585
		/*
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   586
		 * notice: Smalltalk index starts at 1
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   587
		 */
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   588
		nP--;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   589
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   590
		do {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   591
		    SEEK(ret,f,nP,__INST(buffered) == true);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   592
		} while ((ret < 0) && (errno == EINTR));
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   593
		if (ret >= 0) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   594
		    __INST(position) = newPos;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   595
		    /*
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   596
		     * just to make certain ...
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   597
		     */
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   598
		    __INST(hitEOF) = false;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   599
		    RETURN ( self );
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   600
		}
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   601
		__INST(lastErrorNumber) = __MKSMALLINT(errno);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   602
	    }
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   603
	}
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   604
    }
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   605
%}.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   606
    canPosition == false ifTrue:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   607
	"/ position by rewinding & re-reading everything up-to
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   608
	"/ that point.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   609
	^ self slowPosition:newPos
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   610
    ].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   611
    lastErrorNumber notNil ifTrue:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   612
	(OperatingSystem errorSymbolForNumber:lastErrorNumber) == #EINVAL ifTrue:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   613
	    "/ invalid position
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   614
	    ^ self positionError
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   615
	].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   616
	"/ assume I/O error
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   617
	^ self ioError
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   618
    ].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   619
    filePointer isNil ifTrue:[^ self errorNotOpen].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   620
    ^ self primitiveFailed
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   621
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   622
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   623
setToEnd
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   624
    "set the read/write position in the file to be at the end of the file"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   625
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   626
%{
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   627
    HFILE f;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   628
    long ret;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   629
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   630
    if (__INST(filePointer) != nil) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   631
	f = __FILEVal(__INST(filePointer));
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   632
	__INST(position) = nil;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   633
	do {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   634
	    TOEND(ret,f,__INST(buffered) == true);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   635
	} while ((ret < 0) && (errno == EINTR));
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   636
	if (ret >= 0) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   637
	    RETURN ( self );
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   638
	}
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   639
	__INST(lastErrorNumber) = __MKSMALLINT(errno);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   640
    }
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   641
%}.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   642
    lastErrorNumber notNil ifTrue:[^ self ioError].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   643
    filePointer isNil ifTrue:[^ self errorNotOpen].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   644
    ^ self primitiveFailed
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   645
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   646
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   647
slowPosition:newPos
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   648
    "position the file by re-reading everything up-to newPos.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   649
     The effect is the same as that of #position:, but its much slower.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   650
     This is required to reposition nonPositionable streams, such
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   651
     as tape-streams or variable-record-RMS files under VMS.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   652
     Caveat:
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   653
	 This should really be done transparently by the stdio library."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   654
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   655
    |buffer amount|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   656
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   657
    self isReadable ifFalse:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   658
	"/ sorry
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   659
	^ self positionError
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   660
    ].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   661
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   662
    buffer := ByteArray new:8*1024.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   663
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   664
    (position isNil "/ i.e. unknown
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   665
    or:[newPos < position]) ifTrue:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   666
	self reset.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   667
    ].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   668
    [position < newPos] whileTrue:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   669
	amount := (buffer size) min:(newPos-position).
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   670
	(self nextBytes:amount into:buffer startingAt:1) ~~ amount ifTrue:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   671
	    ^ self positionError
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   672
	].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   673
    ].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   674
    "/ ('FileStream [info]: slow position - please convert ''' , pathName printString , ''' to streamLF format') infoPrintCR.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   675
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   676
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   677
!FileStream methodsFor:'printing & storing'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   678
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   679
printOn:aStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   680
    "append a human readable representation of the receiver to aStream"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   681
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   682
    aStream nextPutAll:'(a FileStream for:'.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   683
    aStream nextPutAll:pathName printString.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   684
    aStream nextPut:$)
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   685
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   686
    "Modified: 30.7.1997 / 13:51:01 / cg"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   687
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   688
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   689
storeOn:aStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   690
    "append a representation of the receiver to aStream,
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   691
     from which a copy can be reconstructed later."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   692
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   693
    aStream nextPutAll:'(FileStream oldFileNamed:'.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   694
    aStream nextPutAll:pathName storeString.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   695
    (self position ~~ 1) ifTrue:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   696
	aStream nextPutAll:'; position:'.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   697
	self position storeOn:aStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   698
    ].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   699
    aStream nextPut:$)
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   700
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   701
    "Modified: 30.7.1997 / 16:43:50 / cg"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   702
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   703
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   704
!FileStream methodsFor:'private'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   705
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   706
createForReadWrite
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   707
    "create/truncate the file for read/write.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   708
     If the file existed, its truncated; otherwise its created."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   709
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   710
    mode := #readwrite.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   711
    ^ self openWithMode:CreateReadWriteMode
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   712
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   713
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   714
createForWriting
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   715
    "create/truncate the file for writeonly.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   716
     If the file existed, its truncated; otherwise its created."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   717
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   718
    mode := #writeonly.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   719
    didWrite := true.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   720
    ^ self openWithMode:WriteMode
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   721
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   722
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   723
open
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   724
    "open the file"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   725
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   726
    pathName isNil ifTrue:[^nil].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   727
    (mode == #readonly) ifTrue: [
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   728
	didWrite := false.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   729
	^ self openWithMode:ReadMode
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   730
    ].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   731
    (mode == #writeonly) ifTrue: [
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   732
	didWrite := true.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   733
	^ self openWithMode:WriteMode
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   734
    ].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   735
    ^ self openWithMode:ReadWriteMode
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   736
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   737
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   738
openForAppending
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   739
    "open the file for writeonly appending to the end.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   740
     If the file does not exist its an error, return nil; 
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   741
     otherwise return the receiver."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   742
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   743
    mode := #writeonly.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   744
    didWrite := true.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   745
    ^ self openWithMode:AppendMode
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   746
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   747
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   748
openForReadWrite
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   749
    "open the file for read/write.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   750
     If the file does not exist its an error, return nil; 
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   751
     otherwise return the receiver."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   752
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   753
    mode := #readwrite.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   754
    ^ self openWithMode:ReadWriteMode
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   755
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   756
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   757
openForReading
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   758
    "open the file for readonly.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   759
     If the file does not exist its an error, return nil; 
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   760
     otherwise return the receiver."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   761
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   762
    mode := #readonly.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   763
    didWrite := false.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   764
    ^ self openWithMode:ReadMode
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   765
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   766
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   767
openForWriting
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   768
    "open the file writeonly.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   769
     If the file does not exist its an error, return nil; 
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   770
     otherwise return the receiver."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   771
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   772
    mode := #writeonly.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   773
    didWrite := true.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   774
    ^ self openWithMode:ReadWriteMode   "unix-io does not allow this; open for update here"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   775
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   776
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   777
openWithMode:openmode
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   778
    "open the file;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   779
     openmode is the string defining the way to open as defined by the stdio library
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   780
     (i.e. the 2nd fopen argument).
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   781
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   782
     This is a private entry, but maybe useful to open a file in a special mode,
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   783
     which is proprietrary to the operatingSystem."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   784
     
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   785
    ^ self openWithMode:openmode attributes:nil
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   786
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   787
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   788
openWithMode:openmode attributes:attributeSpec
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   789
    "open the file; 
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   790
     openmode is the string defining the way to open as defined by the stdio library
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   791
     (i.e. the 2nd fopen argument).
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   792
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   793
     attributeSpec is an additional argument, only used with VMS - it allows a file to
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   794
     be created as fixedRecord, variableRecord, streamLF, streamCR, ...
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   795
     In VMS, if nonNil, it must consist of an array of strings (max:10), giving additional
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   796
     attributes (see fopen description).
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   797
     Passing a nil specifies the default format (streamLF) - ST/X always invokes this with nil.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   798
     This argument is ignored in UNIX & MSDOS systems.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   799
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   800
     This is a private entry, but maybe useful to open/create a file in a special mode,
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   801
     which is proprietrary to the operatingSystem."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   802
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   803
    |ok|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   804
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   805
    filePointer notNil ifTrue:[^ self errorOpen].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   806
    ok := false.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   807
%{
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   808
    HFILE f;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   809
#ifndef xxNO_STDIO
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   810
    HFILE fopen();
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   811
#endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   812
    OBJ path, fp;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   813
    int pass = 0;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   814
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   815
retry:
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   816
    path = __INST(pathName);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   817
    if (__isNonNilObject(path) && (__qClass(path)==String)) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   818
	do {
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   819
# ifdef NO_STDIO
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   820
	    /*printf("open %s mode=%s\n",__stringVal(path),__stringVal(openmode)); */
3818
6ba9a7f08d11 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3807
diff changeset
   821
#  ifdef DO_WRAP_CALLS
3824
d515d22eca90 removed VMS code;
Claus Gittinger <cg@exept.de>
parents: 3818
diff changeset
   822
	    f = __STX_C_CALL2((void*)fopen,(void *)__stringVal(path), (void *)__stringVal(openmode));
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   823
#  else
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   824
	    f = fopen((char *) __stringVal(path), (char *) __stringVal(openmode));
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   825
#  endif
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   826
# else        
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   827
	    __BEGIN_INTERRUPTABLE__
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   828
	    f = fopen((char *) __stringVal(path), (char *) __stringVal(openmode)); 
3807
59b3b3518ad5 do wrapCall for fopen; removed unneeded VMS code;
Claus Gittinger <cg@exept.de>
parents: 3755
diff changeset
   829
	    __END_INTERRUPTABLE__
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   830
# endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   831
	    /* must refetch - could be GC'd */
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   832
	    path = __INST(pathName);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   833
	} while ((f == NULL) && (errno == EINTR));
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   834
4369
eaac1c04a81d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4361
diff changeset
   835
	if ((f == NULL) || (f == (HFILE)(-1))) {
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   836
	    /*
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   837
	     * If no filedescriptors available, try to finalize
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   838
	     * possibly collected fd's and try again.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   839
	     */
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   840
	    if (pass == 0 && (errno == ENFILE || errno == EMFILE)) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   841
		pass = 1;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   842
		__SSEND0(@global(ObjectMemory), @symbol(scavenge), 0);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   843
		__SSEND0(@global(ObjectMemory), @symbol(finalize), 0);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   844
		goto retry;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   845
	    }
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   846
	getOutOfHere: ;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   847
	    __INST(lastErrorNumber) = __MKSMALLINT(errno);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   848
	    __INST(position) = nil;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   849
	} else {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   850
	    __INST(canPosition) = true;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   851
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   852
	    __INST(filePointer) = fp = __MKOBJ((INT)f); __STORE(self, fp);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   853
	    __INST(position) = __MKSMALLINT(1);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   854
	    ok = true;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   855
	}
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   856
    }
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   857
%}.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   858
    ok ifFalse:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   859
	"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   860
	 the open failed for some reason ...
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   861
	"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   862
	^ self openError
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   863
    ].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   864
    self buffered:true.       "default is buffered"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   865
    Lobby register:self.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   866
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   867
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   868
pathName:filename
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   869
    "set the pathname"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   870
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   871
    pathName := filename asString
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   872
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   873
    "Modified: / 28.10.1997 / 14:29:01 / cg"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   874
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   875
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   876
pathName:filename in:aDirectory
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   877
    "set the pathname starting at aDirectory, a FileDirectory"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   878
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   879
    pathName := aDirectory asFilename constructString:filename
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   880
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   881
    "Modified: / 28.10.1997 / 14:28:54 / cg"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   882
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   883
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   884
reOpen
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   885
    "sent after snapin to reopen streams"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   886
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   887
    |oldPos|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   888
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   889
    filePointer notNil ifTrue:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   890
	"it was open, when snapped-out"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   891
	filePointer := nil.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   892
	Lobby unregister:self.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   893
	oldPos := position.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   894
	self open.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   895
	filePointer isNil ifTrue:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   896
	    "/ this happens, if after a restart, 
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   897
	    "/ the file is no longer present or accessable ..."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   898
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   899
	    (self class name , ' [warning]: could not reOpen file: ', pathName) errorPrintCR.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   900
	] ifFalse:[
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   901
	    self position:oldPos.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   902
	]
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   903
    ]
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   904
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   905
    "Modified: 10.1.1997 / 17:50:51 / cg"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   906
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   907
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   908
setMode:aModeSymbol
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   909
    mode := aModeSymbol
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   910
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   911
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   912
!FileStream methodsFor:'queries'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   913
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   914
fileSize
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   915
    "return the size in bytes of the file"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   916
    |oldPosition sz|
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   917
%{  
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   918
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   919
#ifndef xxNO_STDIO
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   920
    HFILE f;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   921
    struct stat buf;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   922
    int ret;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   923
    int fd;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   924
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   925
    if (__INST(filePointer) != nil) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   926
	f = __FILEVal(__INST(filePointer));
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   927
	fd = fileno(f);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   928
	do {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   929
	    ret = fstat(fd, &buf);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   930
	} while ((ret < 0) && (errno == EINTR));
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   931
	if (ret >= 0) {
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   932
	    RETURN ( __MKSMALLINT(buf.st_size) );
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   933
	}
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   934
	__INST(lastErrorNumber) = __MKSMALLINT(errno);
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   935
    }
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   936
#endif
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   937
%}.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   938
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   939
    "could add a fall-back here:
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   940
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   941
	oldPosition := self position.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   942
	self setToEnd.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   943
	sz := self position.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   944
	self position:oldPosition.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   945
	^ sz
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   946
    "
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   947
    lastErrorNumber notNil ifTrue:[^ self ioError].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   948
    filePointer isNil ifTrue:[^ self errorNotOpen].
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   949
    oldPosition := self position.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   950
    self setToEnd.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   951
    sz := self position.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   952
    self position:oldPosition.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   953
    ^ sz
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   954
!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   955
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   956
size
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   957
    "return the size of the stream;
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   958
     thats the number of bytes of the file."
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   959
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   960
    "/ no obsoleteMethodWarning - size is ok for streams.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   961
    "/ self obsoleteMethodWarning:'use #fileSize'.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   962
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   963
    ^ self fileSize.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   964
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   965
    "Modified: 4.10.1997 / 18:01:09 / cg"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   966
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   967
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   968
!FileStream methodsFor:'testing'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   969
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   970
isFileStream
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   971
    "return true, if the receiver is some kind of fileStream.
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   972
     redefined from Object"
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   973
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   974
    ^ true
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   975
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   976
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   977
!FileStream class methodsFor:'documentation'!
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   978
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   979
version
4369
eaac1c04a81d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4361
diff changeset
   980
    ^ '$Header: /cvs/stx/stx/libbasic/Attic/FileStream_win32.st,v 1.8 1999-07-10 22:17:00 cg Exp $'
3746
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   981
! !
86d218d5b735 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   982
FileStream initialize!