DirectoryStream.st
author Jan Vrany <jan.vrany@labware.com>
Thu, 25 Mar 2021 20:30:03 +0000
branchjv
changeset 25411 248600ba8fd9
parent 23107 40173e082cbc
permissions -rw-r--r--
Fix unlikely but possible race in `WeakValueDictionary` It may happen that value in `valueArray` could have been already collected by the GC but #clearDeadSlots have not yet been called. When this happened, `#at:ifAbsentPut:` returned tombstone rather than updating the dictionary with value from block. This commit fixes this by checking whether `valueArray` contain the tombstone and if so, clearing up the dead slots and restarting the operation. HTH.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
     2
 COPYRIGHT (c) 1989 by Claus Gittinger
23107
40173e082cbc Copyright updates
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21604
diff changeset
     3
 COPYRIGHT (c) 2017 Jan Vrany
155
edd7fc34e104 *** empty log message ***
claus
parents: 92
diff changeset
     4
	      All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     5
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
"
7826
c32044219031 comment
Claus Gittinger <cg@exept.de>
parents: 6268
diff changeset
    13
"{ Package: 'stx:libbasic' }"
c32044219031 comment
Claus Gittinger <cg@exept.de>
parents: 6268
diff changeset
    14
17287
04ef8ce2c146 class: DirectoryStream
ca
parents: 17076
diff changeset
    15
"{ NameSpace: Smalltalk }"
04ef8ce2c146 class: DirectoryStream
ca
parents: 17076
diff changeset
    16
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    17
FileStream subclass:#DirectoryStream
1664
82793bcf229c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1631
diff changeset
    18
	instanceVariableNames:'dirPointer readAheadEntry'
1281
b4b3abffdf32 Support optional signal generation on end of stream.
Stefan Vogel <sv@exept.de>
parents: 1133
diff changeset
    19
	classVariableNames:''
b4b3abffdf32 Support optional signal generation on end of stream.
Stefan Vogel <sv@exept.de>
parents: 1133
diff changeset
    20
	poolDictionaries:''
b4b3abffdf32 Support optional signal generation on end of stream.
Stefan Vogel <sv@exept.de>
parents: 1133
diff changeset
    21
	category:'Streams-External'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    22
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    23
217
a0400fdbc933 *** empty log message ***
claus
parents: 206
diff changeset
    24
!DirectoryStream primitiveDefinitions!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    25
%{
17076
8f4112c86cac include stxOSDefs
Claus Gittinger <cg@exept.de>
parents: 16788
diff changeset
    26
#include "stxOSDefs.h"
8f4112c86cac include stxOSDefs
Claus Gittinger <cg@exept.de>
parents: 16788
diff changeset
    27
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19651
diff changeset
    28
#if defined(__win32__)
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    29
# undef UNIX_LIKE
16297
b196cf04f0c7 fix error processing
Stefan Vogel <sv@exept.de>
parents: 14644
diff changeset
    30
#else
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19651
diff changeset
    31
# if defined(__transputer__)
16297
b196cf04f0c7 fix error processing
Stefan Vogel <sv@exept.de>
parents: 14644
diff changeset
    32
#  undef UNIX_LIKE
b196cf04f0c7 fix error processing
Stefan Vogel <sv@exept.de>
parents: 14644
diff changeset
    33
# else
b196cf04f0c7 fix error processing
Stefan Vogel <sv@exept.de>
parents: 14644
diff changeset
    34
#  define UNIX_LIKE
b196cf04f0c7 fix error processing
Stefan Vogel <sv@exept.de>
parents: 14644
diff changeset
    35
# endif
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    36
#endif
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    37
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    38
#ifdef UNIX_LIKE
7955
f3a24f9588ee 64bit readdir bug workaround
Claus Gittinger <cg@exept.de>
parents: 7826
diff changeset
    39
# if defined(__GLIBC__) && (__GLIBC__ == 2)
f3a24f9588ee 64bit readdir bug workaround
Claus Gittinger <cg@exept.de>
parents: 7826
diff changeset
    40
#  if defined(__GLIBC_MINOR__) && (__GLIBC_MINOR__ == 1)
f3a24f9588ee 64bit readdir bug workaround
Claus Gittinger <cg@exept.de>
parents: 7826
diff changeset
    41
    /* there is a bug there, preventing 64bit readdir. */
f3a24f9588ee 64bit readdir bug workaround
Claus Gittinger <cg@exept.de>
parents: 7826
diff changeset
    42
#   undef __USE_FILE_OFFSET64
f3a24f9588ee 64bit readdir bug workaround
Claus Gittinger <cg@exept.de>
parents: 7826
diff changeset
    43
#   undef __USE_LARGEFILE64
f3a24f9588ee 64bit readdir bug workaround
Claus Gittinger <cg@exept.de>
parents: 7826
diff changeset
    44
#  endif
f3a24f9588ee 64bit readdir bug workaround
Claus Gittinger <cg@exept.de>
parents: 7826
diff changeset
    45
# endif
f3a24f9588ee 64bit readdir bug workaround
Claus Gittinger <cg@exept.de>
parents: 7826
diff changeset
    46
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    47
# include <stdio.h>
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    48
# define _STDIO_H_INCLUDED_
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    49
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    50
# include <errno.h>
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    51
# define _ERRNO_H_INCLUDED_
10
claus
parents: 5
diff changeset
    52
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    53
# include <sys/types.h>
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    54
# include <sys/stat.h>
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    55
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    56
# ifdef HAS_OPENDIR
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    57
#  include <sys/types.h>
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    58
#  ifdef NEXT
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    59
#   include <sys/dir.h>
8881
53e94478133f STORE macro fix (gcc3.4 bug)
Claus Gittinger <cg@exept.de>
parents: 8775
diff changeset
    60
#   define DIRENT_STRUCT        struct direct
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    61
#  else
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    62
#   include <dirent.h>
8881
53e94478133f STORE macro fix (gcc3.4 bug)
Claus Gittinger <cg@exept.de>
parents: 8775
diff changeset
    63
#   define DIRENT_STRUCT        struct dirent
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    64
#  endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
    65
# endif
223
3075043790b8 immediateInterr & errno cleanup
claus
parents: 217
diff changeset
    66
3075043790b8 immediateInterr & errno cleanup
claus
parents: 217
diff changeset
    67
/*
3075043790b8 immediateInterr & errno cleanup
claus
parents: 217
diff changeset
    68
 * on some systems errno is a macro ... check for it here
3075043790b8 immediateInterr & errno cleanup
claus
parents: 217
diff changeset
    69
 */
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    70
# ifndef errno
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    71
  extern errno;
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    72
# endif
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    73
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    74
#endif /* UNIX_LIKE */
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    75
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19651
diff changeset
    76
#ifdef __win32__
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    77
8901
824a89d0b5c7 alpha64 vs. POINTER_SIZE cleanup
Claus Gittinger <cg@exept.de>
parents: 8881
diff changeset
    78
# ifdef __i386__
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    79
#  define _X86_
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    80
# endif
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    81
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    82
# undef INT
14644
e5f19ef20dcd mingw changes
Claus Gittinger <cg@exept.de>
parents: 14581
diff changeset
    83
# undef UINT
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    84
# undef Array
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    85
# undef Number
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    86
# undef Method
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    87
# undef Point
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    88
# undef Context
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    89
# undef Rectangle
1989
92b10a0e8a51 win32 changes
Claus Gittinger <cg@exept.de>
parents: 1688
diff changeset
    90
# undef Block
4298
1889f8051f69 *** empty log message ***
ps
parents: 3980
diff changeset
    91
# undef Time
1889f8051f69 *** empty log message ***
ps
parents: 3980
diff changeset
    92
# undef Date
10342
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
    93
# undef Message
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
    94
# undef Process
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
    95
# undef Processor
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
    96
# undef INT
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    97
2685
6576fb7af338 nt stuff
Claus Gittinger <cg@exept.de>
parents: 2609
diff changeset
    98
/* # include <types.h> /* */
1989
92b10a0e8a51 win32 changes
Claus Gittinger <cg@exept.de>
parents: 1688
diff changeset
    99
# include <stdarg.h> /* */
5120
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   100
# include <errno.h>
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   101
# define _ERRNO_H_INCLUDED_
1989
92b10a0e8a51 win32 changes
Claus Gittinger <cg@exept.de>
parents: 1688
diff changeset
   102
# include <windef.h> /* */
92b10a0e8a51 win32 changes
Claus Gittinger <cg@exept.de>
parents: 1688
diff changeset
   103
# include <winbase.h> /* */
4298
1889f8051f69 *** empty log message ***
ps
parents: 3980
diff changeset
   104
/* # include <wingdi.h> /* */
1889f8051f69 *** empty log message ***
ps
parents: 3980
diff changeset
   105
/* # include <winuser.h> /* */
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   106
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   107
# ifdef __DEF_Array
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   108
#  define Array __DEF_Array
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   109
# endif
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   110
# ifdef __DEF_Number
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   111
#  define Number __DEF_Number
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   112
# endif
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   113
# ifdef __DEF_Method
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   114
#  define Method __DEF_Method
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   115
# endif
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   116
# ifdef __DEF_Point
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   117
#  define Point __DEF_Point
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   118
# endif
1989
92b10a0e8a51 win32 changes
Claus Gittinger <cg@exept.de>
parents: 1688
diff changeset
   119
# ifdef __DEF_Block
92b10a0e8a51 win32 changes
Claus Gittinger <cg@exept.de>
parents: 1688
diff changeset
   120
#  define Block __DEF_Block
92b10a0e8a51 win32 changes
Claus Gittinger <cg@exept.de>
parents: 1688
diff changeset
   121
# endif
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   122
# ifdef __DEF_Context
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   123
#  define Context __DEF_Context
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   124
# endif
4298
1889f8051f69 *** empty log message ***
ps
parents: 3980
diff changeset
   125
# ifdef __DEF_Date
1889f8051f69 *** empty log message ***
ps
parents: 3980
diff changeset
   126
#  define Date __DEF_Date
1889f8051f69 *** empty log message ***
ps
parents: 3980
diff changeset
   127
# endif
1889f8051f69 *** empty log message ***
ps
parents: 3980
diff changeset
   128
# ifdef __DEF_Time
1889f8051f69 *** empty log message ***
ps
parents: 3980
diff changeset
   129
#  define Time __DEF_Time
1889f8051f69 *** empty log message ***
ps
parents: 3980
diff changeset
   130
# endif
10342
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
   131
# ifdef __DEF_Message
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
   132
#  define Message __DEF_Message
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
   133
# endif
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
   134
# ifdef __DEF_Process
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
   135
#  define Process __DEF_Process
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
   136
# endif
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
   137
# ifdef __DEF_Processor
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
   138
#  define Processor __DEF_Processor
58ce3aabaa4b Visual-C support
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
   139
# endif
14644
e5f19ef20dcd mingw changes
Claus Gittinger <cg@exept.de>
parents: 14581
diff changeset
   140
e5f19ef20dcd mingw changes
Claus Gittinger <cg@exept.de>
parents: 14581
diff changeset
   141
# define INT STX_INT
e5f19ef20dcd mingw changes
Claus Gittinger <cg@exept.de>
parents: 14581
diff changeset
   142
# define UINT STX_UINT
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   143
2999
b0e55440cf12 eliminate MKOBJ & MKCP (use MKEXTERNALADDRESS & externalAddressVal)
Claus Gittinger <cg@exept.de>
parents: 2982
diff changeset
   144
# define __HANDLEVal(o)  (HANDLE)__externalAddressVal(o)
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   145
// extern OBJ FileTimeToOsTime();
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   146
extern OBJ FileTimeToOsTime1970();
20488
3743c00c7735 comment only
Claus Gittinger <cg@exept.de>
parents: 19860
diff changeset
   147
#endif /* __win32__ */
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   148
12714
1b221a2eb0d8 Need stxOSDefs.h
Stefan Vogel <sv@exept.de>
parents: 12713
diff changeset
   149
#include "stxOSDefs.h"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   150
%}
206
5858b2c9d0c6 fixed close
claus
parents: 155
diff changeset
   151
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   152
438
claus
parents: 437
diff changeset
   153
!DirectoryStream primitiveFunctions!
claus
parents: 437
diff changeset
   154
%{
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   155
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   156
#ifndef HAS_OPENDIR
7955
f3a24f9588ee 64bit readdir bug workaround
Claus Gittinger <cg@exept.de>
parents: 7826
diff changeset
   157
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   158
# if defined(__VMS__)
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   159
3816
af3f917c7759 use wrapCalls for FindFirstFile & FindNextFile (win32 - dir-reading)
Claus Gittinger <cg@exept.de>
parents: 3164
diff changeset
   160
#  define lib$find_file LIB$FIND_FILE
438
claus
parents: 437
diff changeset
   161
claus
parents: 437
diff changeset
   162
/*
claus
parents: 437
diff changeset
   163
**  VMS readdir() routines.
claus
parents: 437
diff changeset
   164
**  Written by Rich $alz, <rsalz@bbn.com> in August, 1990.
claus
parents: 437
diff changeset
   165
**  This code has no copyright.
claus
parents: 437
diff changeset
   166
*/
claus
parents: 437
diff changeset
   167
8881
53e94478133f STORE macro fix (gcc3.4 bug)
Claus Gittinger <cg@exept.de>
parents: 8775
diff changeset
   168
/* 12-NOV-1990 added d_namlen field and special case "." name -GJC@MITECH.COM
438
claus
parents: 437
diff changeset
   169
 */
claus
parents: 437
diff changeset
   170
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   171
#   ifndef _STDIO_H_INCLUDED_
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   172
#    include <stdio.h>
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   173
#    define _STDIO_H_INCLUDED_
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   174
#   endif
438
claus
parents: 437
diff changeset
   175
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   176
#   ifndef _CTYPE_H_INCLUDED_
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   177
#    include <ctype.h>
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   178
#    define _CTYPE_H_INCLUDED_
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   179
#   endif
438
claus
parents: 437
diff changeset
   180
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   181
#   ifndef _ERRNO_H_INCLUDED_
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   182
#    include <errno.h>
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   183
#    define _ERRNO_H_INCLUDED_
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   184
#   endif
438
claus
parents: 437
diff changeset
   185
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   186
#   ifndef _DESCRIP_H_INCLUDED_
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   187
#    include <descrip.h>
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   188
#    define _DESCRIP_H_INCLUDED_
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   189
#   endif
438
claus
parents: 437
diff changeset
   190
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   191
#   ifndef _RMSDEF_H_INCLUDED_
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   192
#    include <rmsdef.h>
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   193
#    define _RMSDEF_H_INCLUDED_
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   194
#   endif
438
claus
parents: 437
diff changeset
   195
claus
parents: 437
diff changeset
   196
/*
claus
parents: 437
diff changeset
   197
 * actually, the following has to go into dirent.h ...
claus
parents: 437
diff changeset
   198
 */
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   199
/* BEGIN included dirent.h
438
claus
parents: 437
diff changeset
   200
 *
claus
parents: 437
diff changeset
   201
**  Header file for VMS readdir() routines.
claus
parents: 437
diff changeset
   202
**  Written by Rich $alz, <rsalz@bbn.com> in August, 1990.
claus
parents: 437
diff changeset
   203
**  This code has no copyright.
claus
parents: 437
diff changeset
   204
**
claus
parents: 437
diff changeset
   205
**  You must #include <descrip.h> before this file.
claus
parents: 437
diff changeset
   206
*/
claus
parents: 437
diff changeset
   207
claus
parents: 437
diff changeset
   208
/* 12-NOV-1990 added d_namlen field -GJC@MITECH.COM */
claus
parents: 437
diff changeset
   209
claus
parents: 437
diff changeset
   210
    /* Data structure returned by READDIR(). */
claus
parents: 437
diff changeset
   211
struct dirent {
claus
parents: 437
diff changeset
   212
    char        d_name[100];            /* File name            */
claus
parents: 437
diff changeset
   213
    int         d_namlen;
2957
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   214
    int         vms_verscount;          /* Number of versions   */
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   215
    int         vms_versions[20];       /* Version numbers      */
438
claus
parents: 437
diff changeset
   216
};
claus
parents: 437
diff changeset
   217
claus
parents: 437
diff changeset
   218
    /* Handle returned by opendir(), used by the other routines.  You
claus
parents: 437
diff changeset
   219
     * are not supposed to care what's inside this structure. */
claus
parents: 437
diff changeset
   220
typedef struct _dirdesc {
claus
parents: 437
diff changeset
   221
    long                        context;
2957
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   222
    int                         vms_wantversions;
438
claus
parents: 437
diff changeset
   223
    char                        *pattern;
claus
parents: 437
diff changeset
   224
    struct dirent               entry;
claus
parents: 437
diff changeset
   225
    struct dsc$descriptor_s     pat;
claus
parents: 437
diff changeset
   226
} DIR;
claus
parents: 437
diff changeset
   227
claus
parents: 437
diff changeset
   228
claus
parents: 437
diff changeset
   229
#define rewinddir(dirp)                 seekdir((dirp), 0L)
claus
parents: 437
diff changeset
   230
claus
parents: 437
diff changeset
   231
claus
parents: 437
diff changeset
   232
extern DIR              *opendir();
claus
parents: 437
diff changeset
   233
extern struct dirent    *readdir();
claus
parents: 437
diff changeset
   234
extern long             telldir();
claus
parents: 437
diff changeset
   235
extern void             seekdir();
claus
parents: 437
diff changeset
   236
extern void             closedir();
claus
parents: 437
diff changeset
   237
extern void             vmsreaddirversions();
claus
parents: 437
diff changeset
   238
/*
claus
parents: 437
diff changeset
   239
 * END dirent.h
claus
parents: 437
diff changeset
   240
 */
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   241
#define _DIRENT_H_INCLUDED_
438
claus
parents: 437
diff changeset
   242
claus
parents: 437
diff changeset
   243
claus
parents: 437
diff changeset
   244
    /* Number of elements in vms_versions array */
claus
parents: 437
diff changeset
   245
#define VERSIZE(e)      (sizeof e->vms_versions / sizeof e->vms_versions[0])
claus
parents: 437
diff changeset
   246
claus
parents: 437
diff changeset
   247
    /* Linked in later. */
claus
parents: 437
diff changeset
   248
extern char     *strrchr();
claus
parents: 437
diff changeset
   249
extern char     *strcpy();
claus
parents: 437
diff changeset
   250
/*  Don't need this when all these programs are lumped together.    RLD
claus
parents: 437
diff changeset
   251
extern char     *malloc();
claus
parents: 437
diff changeset
   252
*/
claus
parents: 437
diff changeset
   253
claus
parents: 437
diff changeset
   254
/*
claus
parents: 437
diff changeset
   255
**  Open a directory, return a handle for later use.
claus
parents: 437
diff changeset
   256
*/
claus
parents: 437
diff changeset
   257
DIR *
claus
parents: 437
diff changeset
   258
opendir(name)
claus
parents: 437
diff changeset
   259
    char        *name;
claus
parents: 437
diff changeset
   260
{
claus
parents: 437
diff changeset
   261
    DIR                 *dd;
claus
parents: 437
diff changeset
   262
claus
parents: 437
diff changeset
   263
    /* Get memory for the handle, and the pattern. */
claus
parents: 437
diff changeset
   264
    if ((dd = (DIR *)malloc(sizeof *dd)) == NULL) {
5120
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   265
	__threadErrno = ENOMEM;
438
claus
parents: 437
diff changeset
   266
	return NULL;
claus
parents: 437
diff changeset
   267
    }
claus
parents: 437
diff changeset
   268
claus
parents: 437
diff changeset
   269
    if (strcmp(".",name) == 0) name = "";
claus
parents: 437
diff changeset
   270
claus
parents: 437
diff changeset
   271
    dd->pattern = malloc((unsigned int)(strlen(name) + sizeof "*.*" + 1));
claus
parents: 437
diff changeset
   272
    if (dd->pattern == NULL) {
claus
parents: 437
diff changeset
   273
	free((char *)dd);
5120
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   274
	__threadErrno = ENOMEM;
438
claus
parents: 437
diff changeset
   275
	return NULL;
claus
parents: 437
diff changeset
   276
    }
claus
parents: 437
diff changeset
   277
claus
parents: 437
diff changeset
   278
    /* Fill in the fields; mainly playing with the descriptor. */
claus
parents: 437
diff changeset
   279
    (void)sprintf(dd->pattern, "%s*.*", name);
claus
parents: 437
diff changeset
   280
    dd->context = 0;
claus
parents: 437
diff changeset
   281
    dd->vms_wantversions = 0;
claus
parents: 437
diff changeset
   282
    dd->pat.dsc$a_pointer = dd->pattern;
claus
parents: 437
diff changeset
   283
    dd->pat.dsc$w_length = strlen(dd->pattern);
claus
parents: 437
diff changeset
   284
    dd->pat.dsc$b_dtype = DSC$K_DTYPE_T;
claus
parents: 437
diff changeset
   285
    dd->pat.dsc$b_class = DSC$K_CLASS_S;
claus
parents: 437
diff changeset
   286
claus
parents: 437
diff changeset
   287
    return dd;
claus
parents: 437
diff changeset
   288
}
claus
parents: 437
diff changeset
   289
claus
parents: 437
diff changeset
   290
/*
claus
parents: 437
diff changeset
   291
**  Set the flag to indicate we want versions or not.
claus
parents: 437
diff changeset
   292
*/
claus
parents: 437
diff changeset
   293
void
claus
parents: 437
diff changeset
   294
vmsreaddirversions(dd, flag)
claus
parents: 437
diff changeset
   295
    DIR                 *dd;
claus
parents: 437
diff changeset
   296
    int                 flag;
claus
parents: 437
diff changeset
   297
{
claus
parents: 437
diff changeset
   298
    dd->vms_wantversions = flag;
claus
parents: 437
diff changeset
   299
}
claus
parents: 437
diff changeset
   300
claus
parents: 437
diff changeset
   301
/*
claus
parents: 437
diff changeset
   302
**  Free up an opened directory.
claus
parents: 437
diff changeset
   303
*/
claus
parents: 437
diff changeset
   304
void
claus
parents: 437
diff changeset
   305
closedir(dd)
claus
parents: 437
diff changeset
   306
    DIR                 *dd;
claus
parents: 437
diff changeset
   307
{
claus
parents: 437
diff changeset
   308
    free(dd->pattern);
claus
parents: 437
diff changeset
   309
    free((char *)dd);
claus
parents: 437
diff changeset
   310
}
claus
parents: 437
diff changeset
   311
claus
parents: 437
diff changeset
   312
/*
claus
parents: 437
diff changeset
   313
**  Collect all the version numbers for the current file.
claus
parents: 437
diff changeset
   314
*/
claus
parents: 437
diff changeset
   315
static void
claus
parents: 437
diff changeset
   316
collectversions(dd)
claus
parents: 437
diff changeset
   317
    DIR                                 *dd;
claus
parents: 437
diff changeset
   318
{
claus
parents: 437
diff changeset
   319
    struct dsc$descriptor_s     pat;
claus
parents: 437
diff changeset
   320
    struct dsc$descriptor_s     res;
claus
parents: 437
diff changeset
   321
    struct dirent               *e;
claus
parents: 437
diff changeset
   322
    char                        *p;
claus
parents: 437
diff changeset
   323
    char                        buff[sizeof dd->entry.d_name];
claus
parents: 437
diff changeset
   324
    int                                 i;
claus
parents: 437
diff changeset
   325
    char                        *text;
claus
parents: 437
diff changeset
   326
    long                        context;
claus
parents: 437
diff changeset
   327
claus
parents: 437
diff changeset
   328
    /* Convenient shorthand. */
claus
parents: 437
diff changeset
   329
    e = &dd->entry;
claus
parents: 437
diff changeset
   330
claus
parents: 437
diff changeset
   331
    /* Add the version wildcard, ignoring the "*.*" put on before */
claus
parents: 437
diff changeset
   332
    i = strlen(dd->pattern);
claus
parents: 437
diff changeset
   333
    text = malloc((unsigned int)(i + strlen(e->d_name)+ 2 + 1));
claus
parents: 437
diff changeset
   334
    if (text == NULL)
claus
parents: 437
diff changeset
   335
	return;
claus
parents: 437
diff changeset
   336
    (void)strcpy(text, dd->pattern);
claus
parents: 437
diff changeset
   337
    (void)sprintf(&text[i - 3], "%s;*", e->d_name);
claus
parents: 437
diff changeset
   338
claus
parents: 437
diff changeset
   339
    /* Set up the pattern descriptor. */
claus
parents: 437
diff changeset
   340
    pat.dsc$a_pointer = text;
claus
parents: 437
diff changeset
   341
    pat.dsc$w_length = strlen(text);
claus
parents: 437
diff changeset
   342
    pat.dsc$b_dtype = DSC$K_DTYPE_T;
claus
parents: 437
diff changeset
   343
    pat.dsc$b_class = DSC$K_CLASS_S;
claus
parents: 437
diff changeset
   344
claus
parents: 437
diff changeset
   345
    /* Set up result descriptor. */
claus
parents: 437
diff changeset
   346
    res.dsc$a_pointer = buff;
claus
parents: 437
diff changeset
   347
    res.dsc$w_length = sizeof buff - 2;
claus
parents: 437
diff changeset
   348
    res.dsc$b_dtype = DSC$K_DTYPE_T;
claus
parents: 437
diff changeset
   349
    res.dsc$b_class = DSC$K_CLASS_S;
claus
parents: 437
diff changeset
   350
claus
parents: 437
diff changeset
   351
    /* Read files, collecting versions. */
claus
parents: 437
diff changeset
   352
    for (context = 0; e->vms_verscount < VERSIZE(e); e->vms_verscount++) {
claus
parents: 437
diff changeset
   353
	if (lib$find_file(&pat, &res, &context) == RMS$_NMF || context == 0)
claus
parents: 437
diff changeset
   354
	    break;
claus
parents: 437
diff changeset
   355
	buff[sizeof buff - 1] = '\0';
claus
parents: 437
diff changeset
   356
	if (p = strchr(buff, ';'))
claus
parents: 437
diff changeset
   357
	    e->vms_versions[e->vms_verscount] = atoi(p + 1);
claus
parents: 437
diff changeset
   358
	else
claus
parents: 437
diff changeset
   359
	    e->vms_versions[e->vms_verscount] = -1;
claus
parents: 437
diff changeset
   360
    }
claus
parents: 437
diff changeset
   361
claus
parents: 437
diff changeset
   362
    free(text);
claus
parents: 437
diff changeset
   363
}
claus
parents: 437
diff changeset
   364
claus
parents: 437
diff changeset
   365
/*
claus
parents: 437
diff changeset
   366
**  Read the next entry from the directory.
claus
parents: 437
diff changeset
   367
*/
claus
parents: 437
diff changeset
   368
struct dirent *
claus
parents: 437
diff changeset
   369
readdir(dd)
2957
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   370
    DIR *dd;
438
claus
parents: 437
diff changeset
   371
{
2957
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   372
    struct dsc$descriptor_s res;
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   373
    char                    *p;
2982
3032a3a7e17a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2957
diff changeset
   374
    char                    buff[sizeof dd->entry.d_name + 10];
2957
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   375
    int                     i;
438
claus
parents: 437
diff changeset
   376
claus
parents: 437
diff changeset
   377
    /* Set up result descriptor, and get next file. */
claus
parents: 437
diff changeset
   378
    res.dsc$a_pointer = buff;
claus
parents: 437
diff changeset
   379
    res.dsc$w_length = sizeof buff - 2;
claus
parents: 437
diff changeset
   380
    res.dsc$b_dtype = DSC$K_DTYPE_T;
claus
parents: 437
diff changeset
   381
    res.dsc$b_class = DSC$K_CLASS_S;
claus
parents: 437
diff changeset
   382
    if (lib$find_file(&dd->pat, &res, &dd->context) == RMS$_NMF
claus
parents: 437
diff changeset
   383
     || dd->context == 0L)
claus
parents: 437
diff changeset
   384
	/* None left... */
claus
parents: 437
diff changeset
   385
	return NULL;
claus
parents: 437
diff changeset
   386
claus
parents: 437
diff changeset
   387
    /* Force the buffer to end with a NUL. */
claus
parents: 437
diff changeset
   388
    buff[sizeof buff - 1] = '\0';
claus
parents: 437
diff changeset
   389
    for (p = buff; !isspace(*p); p++)
claus
parents: 437
diff changeset
   390
	;
claus
parents: 437
diff changeset
   391
    *p = '\0';
claus
parents: 437
diff changeset
   392
claus
parents: 437
diff changeset
   393
    /* Skip any directory component and just copy the name. */
claus
parents: 437
diff changeset
   394
    if (p = strchr(buff, ']'))
claus
parents: 437
diff changeset
   395
	(void)strcpy(dd->entry.d_name, p + 1);
claus
parents: 437
diff changeset
   396
    else
claus
parents: 437
diff changeset
   397
	(void)strcpy(dd->entry.d_name, buff);
claus
parents: 437
diff changeset
   398
claus
parents: 437
diff changeset
   399
    /* Clobber the version. */
claus
parents: 437
diff changeset
   400
    if (p = strchr(dd->entry.d_name, ';'))
claus
parents: 437
diff changeset
   401
	*p = '\0';
claus
parents: 437
diff changeset
   402
2982
3032a3a7e17a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2957
diff changeset
   403
    /* claus: empty dirs seems to leave *.* in the buffer ... */
3032a3a7e17a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2957
diff changeset
   404
    if (strcmp(dd->entry.d_name, "*.*") == 0) {
3032a3a7e17a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2957
diff changeset
   405
	return NULL;
3032a3a7e17a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2957
diff changeset
   406
    }
3032a3a7e17a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2957
diff changeset
   407
438
claus
parents: 437
diff changeset
   408
    dd->entry.d_namlen = strlen(dd->entry.d_name);
claus
parents: 437
diff changeset
   409
claus
parents: 437
diff changeset
   410
    dd->entry.vms_verscount = 0;
claus
parents: 437
diff changeset
   411
    if (dd->vms_wantversions)
claus
parents: 437
diff changeset
   412
	collectversions(dd);
claus
parents: 437
diff changeset
   413
    return &dd->entry;
claus
parents: 437
diff changeset
   414
}
claus
parents: 437
diff changeset
   415
claus
parents: 437
diff changeset
   416
/*
claus
parents: 437
diff changeset
   417
**  Return something that can be used in a seekdir later.
claus
parents: 437
diff changeset
   418
*/
claus
parents: 437
diff changeset
   419
long
claus
parents: 437
diff changeset
   420
telldir(dd)
2957
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   421
    DIR  *dd;
438
claus
parents: 437
diff changeset
   422
{
claus
parents: 437
diff changeset
   423
    return dd->context;
claus
parents: 437
diff changeset
   424
}
claus
parents: 437
diff changeset
   425
claus
parents: 437
diff changeset
   426
/*
claus
parents: 437
diff changeset
   427
**  Return to a spot where we used to be.
claus
parents: 437
diff changeset
   428
*/
claus
parents: 437
diff changeset
   429
void
claus
parents: 437
diff changeset
   430
seekdir(dd, pos)
2957
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   431
    DIR  *dd;
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   432
    long pos;
438
claus
parents: 437
diff changeset
   433
{
claus
parents: 437
diff changeset
   434
    dd->context = pos;
claus
parents: 437
diff changeset
   435
}
claus
parents: 437
diff changeset
   436
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   437
#  define HAS_OPENDIR
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   438
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   439
# endif /* __VMS__ */
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   440
#endif /* not HAS_OPENDIR */
438
claus
parents: 437
diff changeset
   441
%}
claus
parents: 437
diff changeset
   442
! !
claus
parents: 437
diff changeset
   443
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   444
!DirectoryStream class methodsFor:'documentation'!
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   445
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   446
copyright
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   447
"
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   448
 COPYRIGHT (c) 1989 by Claus Gittinger
23107
40173e082cbc Copyright updates
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21604
diff changeset
   449
 COPYRIGHT (c) 2017 Jan Vrany
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   450
	      All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   451
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   452
 This software is furnished under a license and may be used
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   453
 only in accordance with the terms of that license and with the
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   454
 inclusion of the above copyright notice.   This software may not
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   455
 be provided or otherwise made available to, or used by, any
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   456
 other person.  No title to or ownership of the software is
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   457
 hereby transferred.
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   458
"
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   459
!
360
claus
parents: 249
diff changeset
   460
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   461
documentation
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   462
"
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   463
    Instances of DirectoryStream allow reading a file-directory,
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   464
    as if it was a stream of filenames.
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   465
    Basically, its an interface to opendir, readdir and closedir.
8881
53e94478133f STORE macro fix (gcc3.4 bug)
Claus Gittinger <cg@exept.de>
parents: 8775
diff changeset
   466
    Notice:
53e94478133f STORE macro fix (gcc3.4 bug)
Claus Gittinger <cg@exept.de>
parents: 8775
diff changeset
   467
	DirectoryStream is an ST/X special;
2957
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   468
	for portability, we recommend the use of Filename protocol.
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
   469
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
   470
    [author:]
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   471
	Claus Gittinger
2957
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   472
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   473
    [see also:]
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   474
	Filename
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   475
"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   476
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   477
a27a279701f8 Initial revision
claus
parents:
diff changeset
   478
!DirectoryStream class methodsFor:'instance creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   479
a27a279701f8 Initial revision
claus
parents:
diff changeset
   480
directoryNamed:dirName
7826
c32044219031 comment
Claus Gittinger <cg@exept.de>
parents: 6268
diff changeset
   481
    "return a DirectoryStream for directory named dirName, aString
c32044219031 comment
Claus Gittinger <cg@exept.de>
parents: 6268
diff changeset
   482
     Raises an openError, if the directory does not exists."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   483
a27a279701f8 Initial revision
claus
parents:
diff changeset
   484
    |newStream|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   485
8775
93e7cf3805e6 text-mode default.
Claus Gittinger <cg@exept.de>
parents: 8614
diff changeset
   486
    newStream := (self basicNew) text; pathName:dirName.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   487
    newStream openForReading isNil ifTrue:[^nil].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   488
    ^ newStream
7826
c32044219031 comment
Claus Gittinger <cg@exept.de>
parents: 6268
diff changeset
   489
c32044219031 comment
Claus Gittinger <cg@exept.de>
parents: 6268
diff changeset
   490
    "
8881
53e94478133f STORE macro fix (gcc3.4 bug)
Claus Gittinger <cg@exept.de>
parents: 8775
diff changeset
   491
     self directoryNamed:'adadasd'
53e94478133f STORE macro fix (gcc3.4 bug)
Claus Gittinger <cg@exept.de>
parents: 8775
diff changeset
   492
     self directoryNamed:'.'
7826
c32044219031 comment
Claus Gittinger <cg@exept.de>
parents: 6268
diff changeset
   493
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   494
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   495
5245
fb27aee25da6 category change
Claus Gittinger <cg@exept.de>
parents: 5120
diff changeset
   496
!DirectoryStream methodsFor:'access-reading'!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   497
12909
e844bd18a3aa added: #contents
Stefan Vogel <sv@exept.de>
parents: 12714
diff changeset
   498
contents
e844bd18a3aa added: #contents
Stefan Vogel <sv@exept.de>
parents: 12714
diff changeset
   499
    "answer all of the directory entries as an OrderedCollection"
e844bd18a3aa added: #contents
Stefan Vogel <sv@exept.de>
parents: 12714
diff changeset
   500
e844bd18a3aa added: #contents
Stefan Vogel <sv@exept.de>
parents: 12714
diff changeset
   501
    |contents|
e844bd18a3aa added: #contents
Stefan Vogel <sv@exept.de>
parents: 12714
diff changeset
   502
e844bd18a3aa added: #contents
Stefan Vogel <sv@exept.de>
parents: 12714
diff changeset
   503
    contents := OrderedCollection new.
13778
8e34483d10dd MAXPATHLEN cleanup;
Claus Gittinger <cg@exept.de>
parents: 12909
diff changeset
   504
    [self atEnd] whileFalse:[
8e34483d10dd MAXPATHLEN cleanup;
Claus Gittinger <cg@exept.de>
parents: 12909
diff changeset
   505
	|l|
8e34483d10dd MAXPATHLEN cleanup;
Claus Gittinger <cg@exept.de>
parents: 12909
diff changeset
   506
	l := self nextLine.
8e34483d10dd MAXPATHLEN cleanup;
Claus Gittinger <cg@exept.de>
parents: 12909
diff changeset
   507
	l isNil ifTrue:[
8e34483d10dd MAXPATHLEN cleanup;
Claus Gittinger <cg@exept.de>
parents: 12909
diff changeset
   508
	    ^ contents
8e34483d10dd MAXPATHLEN cleanup;
Claus Gittinger <cg@exept.de>
parents: 12909
diff changeset
   509
	].
8e34483d10dd MAXPATHLEN cleanup;
Claus Gittinger <cg@exept.de>
parents: 12909
diff changeset
   510
	contents add:l
12909
e844bd18a3aa added: #contents
Stefan Vogel <sv@exept.de>
parents: 12714
diff changeset
   511
    ].
e844bd18a3aa added: #contents
Stefan Vogel <sv@exept.de>
parents: 12714
diff changeset
   512
    ^ contents
e844bd18a3aa added: #contents
Stefan Vogel <sv@exept.de>
parents: 12714
diff changeset
   513
!
e844bd18a3aa added: #contents
Stefan Vogel <sv@exept.de>
parents: 12714
diff changeset
   514
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   515
nextLine
17287
04ef8ce2c146 class: DirectoryStream
ca
parents: 17076
diff changeset
   516
    "return the next filename as a string or nil"
17292
1def0bd4e51d class: DirectoryStream
Claus Gittinger <cg@exept.de>
parents: 17291
diff changeset
   517
17287
04ef8ce2c146 class: DirectoryStream
ca
parents: 17076
diff changeset
   518
    |linkInfo|
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   519
17287
04ef8ce2c146 class: DirectoryStream
ca
parents: 17076
diff changeset
   520
    linkInfo := self nextLinkInfo.
04ef8ce2c146 class: DirectoryStream
ca
parents: 17076
diff changeset
   521
    linkInfo notNil ifTrue:[^ linkInfo sourcePath].
04ef8ce2c146 class: DirectoryStream
ca
parents: 17076
diff changeset
   522
    ^ nil
04ef8ce2c146 class: DirectoryStream
ca
parents: 17076
diff changeset
   523
!
04ef8ce2c146 class: DirectoryStream
ca
parents: 17076
diff changeset
   524
04ef8ce2c146 class: DirectoryStream
ca
parents: 17076
diff changeset
   525
nextLinkInfo
04ef8ce2c146 class: DirectoryStream
ca
parents: 17076
diff changeset
   526
    "return the next FileStatusInfo or nil"
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   527
17287
04ef8ce2c146 class: DirectoryStream
ca
parents: 17076
diff changeset
   528
    |nextResult resultInfo|
6259
164d7efc1eb2 api call stuff (more calls wrapped; care for EINTR)
Claus Gittinger <cg@exept.de>
parents: 5245
diff changeset
   529
17302
a8f3099d0b64 class: DirectoryStream
Claus Gittinger <cg@exept.de>
parents: 17292
diff changeset
   530
    (hitEOF or:[readAheadEntry isNil]) ifTrue:[
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   531
	^ self pastEndRead
17290
47f6863bcbce class: DirectoryStream
Claus Gittinger <cg@exept.de>
parents: 17287
diff changeset
   532
    ].
47f6863bcbce class: DirectoryStream
Claus Gittinger <cg@exept.de>
parents: 17287
diff changeset
   533
47f6863bcbce class: DirectoryStream
Claus Gittinger <cg@exept.de>
parents: 17287
diff changeset
   534
    nextResult := OperatingSystem nextLinkInfoFrom:self dirPointer:dirPointer.
47f6863bcbce class: DirectoryStream
Claus Gittinger <cg@exept.de>
parents: 17287
diff changeset
   535
    nextResult isNil ifTrue:[
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   536
	hitEOF := true.
16297
b196cf04f0c7 fix error processing
Stefan Vogel <sv@exept.de>
parents: 14644
diff changeset
   537
    ].
17290
47f6863bcbce class: DirectoryStream
Claus Gittinger <cg@exept.de>
parents: 17287
diff changeset
   538
    readAheadEntry notNil ifTrue:[
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   539
	resultInfo := readAheadEntry.
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   540
	readAheadEntry := nextResult.
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   541
	^ resultInfo
17290
47f6863bcbce class: DirectoryStream
Claus Gittinger <cg@exept.de>
parents: 17287
diff changeset
   542
    ].
47f6863bcbce class: DirectoryStream
Claus Gittinger <cg@exept.de>
parents: 17287
diff changeset
   543
    nextResult isNil ifTrue:[
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   544
	^ self pastEndRead
17290
47f6863bcbce class: DirectoryStream
Claus Gittinger <cg@exept.de>
parents: 17287
diff changeset
   545
    ].
47f6863bcbce class: DirectoryStream
Claus Gittinger <cg@exept.de>
parents: 17287
diff changeset
   546
    ^ nextResult
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   547
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   548
8519
bc7747a6971d Protect #closeFile.
Stefan Vogel <sv@exept.de>
parents: 7955
diff changeset
   549
!DirectoryStream protectedMethodsFor:'instance release'!
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   550
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   551
closeFile
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   552
    "low level close of a directoryStream"
16299
1ca7a21475c9 class: DirectoryStream
Stefan Vogel <sv@exept.de>
parents: 16297
diff changeset
   553
1ca7a21475c9 class: DirectoryStream
Stefan Vogel <sv@exept.de>
parents: 16297
diff changeset
   554
    |dp|
1ca7a21475c9 class: DirectoryStream
Stefan Vogel <sv@exept.de>
parents: 16297
diff changeset
   555
1ca7a21475c9 class: DirectoryStream
Stefan Vogel <sv@exept.de>
parents: 16297
diff changeset
   556
    dp := dirPointer.
1ca7a21475c9 class: DirectoryStream
Stefan Vogel <sv@exept.de>
parents: 16297
diff changeset
   557
    dp isNil ifTrue:[
17287
04ef8ce2c146 class: DirectoryStream
ca
parents: 17076
diff changeset
   558
	^ self errorNotOpen.
16299
1ca7a21475c9 class: DirectoryStream
Stefan Vogel <sv@exept.de>
parents: 16297
diff changeset
   559
    ].
1ca7a21475c9 class: DirectoryStream
Stefan Vogel <sv@exept.de>
parents: 16297
diff changeset
   560
    dirPointer := nil.
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   561
%{
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   562
#ifdef HAS_OPENDIR
16299
1ca7a21475c9 class: DirectoryStream
Stefan Vogel <sv@exept.de>
parents: 16297
diff changeset
   563
    closedir( (DIR *)(__FILEVal(dp)) );
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   564
#else
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19651
diff changeset
   565
# ifdef __win32__
16299
1ca7a21475c9 class: DirectoryStream
Stefan Vogel <sv@exept.de>
parents: 16297
diff changeset
   566
    FindClose( __HANDLEVal(dp) );
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   567
# endif
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   568
#endif
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   569
%}
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   570
! !
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   571
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   572
!DirectoryStream methodsFor:'private'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   573
a27a279701f8 Initial revision
claus
parents:
diff changeset
   574
openForReading
a27a279701f8 Initial revision
claus
parents:
diff changeset
   575
    "open the file for readonly"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   576
17287
04ef8ce2c146 class: DirectoryStream
ca
parents: 17076
diff changeset
   577
    |ok encodedPathName error fileSize osPathname osModTime osCrtTime osAccTime osFileAttributes |
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   578
14581
9b67f236a32c class: DirectoryStream
Stefan Vogel <sv@exept.de>
parents: 14437
diff changeset
   579
    encodedPathName := OperatingSystem encodePath:pathName.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   580
    mode := #readonly.
17290
47f6863bcbce class: DirectoryStream
Claus Gittinger <cg@exept.de>
parents: 17287
diff changeset
   581
    hitEOF := false.
17287
04ef8ce2c146 class: DirectoryStream
ca
parents: 17076
diff changeset
   582
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   583
%{
21604
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   584
    enum {
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   585
    	PASS_INITIAL = 1,
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   586
    	PASS_RETRY_AFTER_SCAVENGE = 2,
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   587
    	PASS_RETRY_AFTER_GARBAGE_COLLECT = 3,
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   588
    	PASS_FINAL = PASS_RETRY_AFTER_GARBAGE_COLLECT
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   589
    } pass = PASS_INITIAL;
77
6c38ca59927f *** empty log message ***
claus
parents: 54
diff changeset
   590
#ifdef HAS_OPENDIR
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   591
    DIR *d;
477
8710aba7876b oops - making id's real objects requires a store macro
Claus Gittinger <cg@exept.de>
parents: 475
diff changeset
   592
    OBJ path, dp;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   593
21604
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   594
retry:
155
edd7fc34e104 *** empty log message ***
claus
parents: 92
diff changeset
   595
    ok = false;
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 613
diff changeset
   596
    if (__INST(dirPointer) == nil) {
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   597
	if (__isStringLike(encodedPathName)) {
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   598
	    __BEGIN_INTERRUPTABLE__
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   599
	    __threadErrno = 0;
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   600
	    do {
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   601
		d = opendir((char *) __stringVal(encodedPathName));
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   602
	    } while ((d == NULL) && (__threadErrno == EINTR));
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   603
	    __END_INTERRUPTABLE__
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   604
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   605
	    if (d == NULL) {
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   606
		error = __mkSmallInteger(__threadErrno);
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   607
	    } else {
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   608
		dp = __MKEXTERNALADDRESS(d); __INST(dirPointer) = dp; __STORE(self, dp);
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   609
		ok = true;
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   610
	    }
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   611
	}
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   612
    }
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   613
#else
19860
324edacff5cc unified cpu and os defines;
Claus Gittinger <cg@exept.de>
parents: 19651
diff changeset
   614
#ifdef __win32__
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   615
    HANDLE d;
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   616
    OBJ path, dp;
11294
ecf21f4ab995 unicode filenames
Claus Gittinger <cg@exept.de>
parents: 11288
diff changeset
   617
    union {
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   618
	char pattern[MAXPATHLEN];
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   619
	wchar_t wpattern[MAXPATHLEN];
11294
ecf21f4ab995 unicode filenames
Claus Gittinger <cg@exept.de>
parents: 11288
diff changeset
   620
    } uP;
ecf21f4ab995 unicode filenames
Claus Gittinger <cg@exept.de>
parents: 11288
diff changeset
   621
    union {
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   622
	WIN32_FIND_DATAA data;
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   623
	WIN32_FIND_DATAW wdata;
11294
ecf21f4ab995 unicode filenames
Claus Gittinger <cg@exept.de>
parents: 11288
diff changeset
   624
    } uD;
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   625
21604
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   626
retry:
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   627
    ok = false;
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   628
    if (__INST(dirPointer) == nil) {
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   629
	path = __INST(pathName);
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   630
	if (__isStringLike(path)) {
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   631
	    int l = __stringSize(path);
17287
04ef8ce2c146 class: DirectoryStream
ca
parents: 17076
diff changeset
   632
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   633
	    if (l < (MAXPATHLEN-4)) {
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   634
		strncpy(uP.pattern, __stringVal(path), l);
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   635
		strcpy(uP.pattern+l, "\\*");
3164
4f37ae9c8961 use strncpy to avoid buffer-overruns
Claus Gittinger <cg@exept.de>
parents: 2999
diff changeset
   636
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   637
		do {
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   638
		    __threadErrno = 0;
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   639
		    d = STX_API_NOINT_CALL2( "FindFirstFileA", FindFirstFileA, uP.pattern, &uD.data );
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   640
		} while ((d < 0) && (__threadErrno == EINTR));
11294
ecf21f4ab995 unicode filenames
Claus Gittinger <cg@exept.de>
parents: 11288
diff changeset
   641
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   642
		if (d == INVALID_HANDLE_VALUE) {
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   643
		    error = __mkSmallInteger(GetLastError());
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   644
		} else {
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   645
		    dp = __MKEXTERNALADDRESS(d); __INST(dirPointer) = dp; __STORE(self, dp);
17287
04ef8ce2c146 class: DirectoryStream
ca
parents: 17076
diff changeset
   646
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   647
		    fileSize   = __MKLARGEINT64(1, uD.data.nFileSizeLow, uD.data.nFileSizeHigh );
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   648
		    osPathname = __MKSTRING( uD.data.cFileName );
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   649
		    osFileAttributes = __mkSmallInteger( uD.data.dwFileAttributes );
6259
164d7efc1eb2 api call stuff (more calls wrapped; care for EINTR)
Claus Gittinger <cg@exept.de>
parents: 5245
diff changeset
   650
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   651
		    osCrtTime = FileTimeToOsTime1970(&uD.data.ftCreationTime);
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   652
		    osAccTime = FileTimeToOsTime1970(&uD.data.ftLastAccessTime);
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   653
		    osModTime = FileTimeToOsTime1970(&uD.data.ftLastWriteTime);
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   654
		    ok = true;
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   655
		}
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   656
	    }
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   657
	}
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   658
	else if (__isUnicode16String(path)) {
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   659
	    int l = __unicode16StringSize(path);
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   660
	    int i;
17287
04ef8ce2c146 class: DirectoryStream
ca
parents: 17076
diff changeset
   661
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   662
	    if (l < (MAXPATHLEN-4)) {
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   663
		for (i=0; i<l; i++) {
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   664
		    uP.wpattern[i] = __unicode16StringVal(path)[i];
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   665
		}
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   666
		uP.wpattern[i++] = '\\';
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   667
		uP.wpattern[i++] = '*';
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   668
		uP.wpattern[i] = 0;
6259
164d7efc1eb2 api call stuff (more calls wrapped; care for EINTR)
Claus Gittinger <cg@exept.de>
parents: 5245
diff changeset
   669
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   670
		do {
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   671
		    __threadErrno = 0;
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   672
		    d = STX_API_NOINT_CALL2( "FindFirstFileW", FindFirstFileW, uP.wpattern, &uD.wdata );
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   673
		} while ((d < 0) && (__threadErrno == EINTR));
17287
04ef8ce2c146 class: DirectoryStream
ca
parents: 17076
diff changeset
   674
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   675
		if (d == INVALID_HANDLE_VALUE) {
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   676
		    error = __mkSmallInteger(GetLastError());
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   677
		} else {
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   678
		    dp = __MKEXTERNALADDRESS(d); __INST(dirPointer) = dp; __STORE(self, dp);
11294
ecf21f4ab995 unicode filenames
Claus Gittinger <cg@exept.de>
parents: 11288
diff changeset
   679
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   680
		    fileSize   = __MKLARGEINT64(1, uD.wdata.nFileSizeLow, uD.wdata.nFileSizeHigh );
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   681
		    osPathname = __MKU16STRING( uD.wdata.cFileName );
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   682
		    osFileAttributes = __mkSmallInteger( uD.data.dwFileAttributes );
11294
ecf21f4ab995 unicode filenames
Claus Gittinger <cg@exept.de>
parents: 11288
diff changeset
   683
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   684
		    osCrtTime = FileTimeToOsTime1970(&uD.wdata.ftCreationTime);
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   685
		    osAccTime = FileTimeToOsTime1970(&uD.wdata.ftLastAccessTime);
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   686
		    osModTime = FileTimeToOsTime1970(&uD.wdata.ftLastWriteTime);
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   687
		    ok = true;
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   688
		}
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   689
	    }
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   690
	}
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   691
    }
17287
04ef8ce2c146 class: DirectoryStream
ca
parents: 17076
diff changeset
   692
#endif
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   693
#endif
21604
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   694
    /*
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   695
    * If no filedescriptors available, try to finalize
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   696
    * possibly collected fd's and try again.
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   697
    */
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   698
    if ((__threadErrno == ENFILE || __threadErrno == EMFILE) && pass < PASS_FINAL) {
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   699
        switch (pass) {
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   700
       	    case PASS_INITIAL:
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   701
                {
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   702
                    pass = PASS_RETRY_AFTER_SCAVENGE;
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   703
                    __SSEND0(@global(ObjectMemory), @symbol(scavenge), 0);	    
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   704
                    __SSEND0(@global(ObjectMemory), @symbol(finalize), 0);
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   705
                }
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   706
                goto retry;
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   707
            case PASS_RETRY_AFTER_SCAVENGE:
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   708
                {
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   709
                     pass = PASS_RETRY_AFTER_GARBAGE_COLLECT;
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   710
                    __SSEND0(@global(ObjectMemory), @symbol(garbageCollect), 0);	    
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   711
                    __SSEND0(@global(ObjectMemory), @symbol(finalize), 0);
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   712
                }
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   713
                goto retry;
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   714
            case PASS_RETRY_AFTER_GARBAGE_COLLECT:
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   715
                /* Should never be reached */
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   716
                goto getOutOfHere;
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   717
        }                    
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   718
    }
10256dd38558 Improved handling of `EMFILE` / `ENFILE` when opening files / directories
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 20578
diff changeset
   719
    getOutOfHere:;
155
edd7fc34e104 *** empty log message ***
claus
parents: 92
diff changeset
   720
%}.
17287
04ef8ce2c146 class: DirectoryStream
ca
parents: 17076
diff changeset
   721
04ef8ce2c146 class: DirectoryStream
ca
parents: 17076
diff changeset
   722
    ok == true ifTrue:[
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   723
	self registerForFinalization.
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   724
	osPathname isNil ifTrue:[
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   725
	    "UNIX: does not automatically provide the first entry"
17291
3177810ab9ae *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17290
diff changeset
   726
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   727
	    StreamError handle:[:ex |
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   728
		self close.
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   729
		ex reject.
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   730
	    ] do:[
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   731
		readAheadEntry := OperatingSystem nextLinkInfoFrom:self dirPointer:dirPointer.
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   732
	    ].
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   733
	] ifFalse:[
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   734
	    "Windows already provides the first entry's info"
17291
3177810ab9ae *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17290
diff changeset
   735
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   736
	    readAheadEntry := OperatingSystem
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   737
		linkInfoFor:osPathname
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   738
		fileSize:fileSize
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   739
		fileAttributes:osFileAttributes
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   740
		osCrtTime:osCrtTime
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   741
		osAccTime:osAccTime
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   742
		osModTime:osModTime
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   743
	].
17287
04ef8ce2c146 class: DirectoryStream
ca
parents: 17076
diff changeset
   744
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   745
	^ self
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   746
    ].
155
edd7fc34e104 *** empty log message ***
claus
parents: 92
diff changeset
   747
17287
04ef8ce2c146 class: DirectoryStream
ca
parents: 17076
diff changeset
   748
    ok notNil ifTrue:[
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   749
	dirPointer notNil ifTrue:[^ self errorAlreadyOpen].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   750
    ].
16297
b196cf04f0c7 fix error processing
Stefan Vogel <sv@exept.de>
parents: 14644
diff changeset
   751
    error notNil ifTrue:[
19651
59a06f7e5116 avoid largeinteger arithmetic in osTime handling
Claus Gittinger <cg@exept.de>
parents: 18780
diff changeset
   752
	^ self openError:(lastErrorNumber := error).
16297
b196cf04f0c7 fix error processing
Stefan Vogel <sv@exept.de>
parents: 14644
diff changeset
   753
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   754
    ^ nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   755
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   756
a27a279701f8 Initial revision
claus
parents:
diff changeset
   757
reOpen
8604
3079fcbdecb2 Fix #reOpen handling:
Stefan Vogel <sv@exept.de>
parents: 8519
diff changeset
   758
    "USERS WILL NEVER INVOKE THIS METHOD
3079fcbdecb2 Fix #reOpen handling:
Stefan Vogel <sv@exept.de>
parents: 8519
diff changeset
   759
     sent after snapin to reopen streams."
38
454b1b94a48e *** empty log message ***
claus
parents: 31
diff changeset
   760
2
claus
parents: 1
diff changeset
   761
    dirPointer := nil.
claus
parents: 1
diff changeset
   762
    super reOpen
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   763
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   764
a27a279701f8 Initial revision
claus
parents:
diff changeset
   765
!DirectoryStream methodsFor:'testing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   766
a27a279701f8 Initial revision
claus
parents:
diff changeset
   767
atEnd
a27a279701f8 Initial revision
claus
parents:
diff changeset
   768
    "return true, if position is at end"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   769
17302
a8f3099d0b64 class: DirectoryStream
Claus Gittinger <cg@exept.de>
parents: 17292
diff changeset
   770
    ^ readAheadEntry == nil
2945
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   771
!
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   772
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   773
isEmpty
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   774
    "test for if the unread portion of the directory stream is empty.
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   775
     This query changes the readPointer of the DirectoryStream"
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   776
2957
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   777
    |entry|
2945
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   778
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   779
    [self atEnd] whileFalse:[
3816
af3f917c7759 use wrapCalls for FindFirstFile & FindNextFile (win32 - dir-reading)
Claus Gittinger <cg@exept.de>
parents: 3164
diff changeset
   780
	entry := self nextLine.
af3f917c7759 use wrapCalls for FindFirstFile & FindNextFile (win32 - dir-reading)
Claus Gittinger <cg@exept.de>
parents: 3164
diff changeset
   781
	entry asFilename isImplicit ifFalse:[
af3f917c7759 use wrapCalls for FindFirstFile & FindNextFile (win32 - dir-reading)
Claus Gittinger <cg@exept.de>
parents: 3164
diff changeset
   782
	    ^ false.
af3f917c7759 use wrapCalls for FindFirstFile & FindNextFile (win32 - dir-reading)
Claus Gittinger <cg@exept.de>
parents: 3164
diff changeset
   783
	]
2945
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   784
    ].
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   785
    ^ true
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   786
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   787
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   788
    "
3816
af3f917c7759 use wrapCalls for FindFirstFile & FindNextFile (win32 - dir-reading)
Claus Gittinger <cg@exept.de>
parents: 3164
diff changeset
   789
	(DirectoryStream directoryNamed:'/') isEmpty
af3f917c7759 use wrapCalls for FindFirstFile & FindNextFile (win32 - dir-reading)
Claus Gittinger <cg@exept.de>
parents: 3164
diff changeset
   790
	(DirectoryStream directoryNamed:'/var/tmp') isEmpty
2945
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   791
    "
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   792
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   793
    "Modified: 18.9.1997 / 18:05:31 / stefan"
16299
1ca7a21475c9 class: DirectoryStream
Stefan Vogel <sv@exept.de>
parents: 16297
diff changeset
   794
!
1ca7a21475c9 class: DirectoryStream
Stefan Vogel <sv@exept.de>
parents: 16297
diff changeset
   795
1ca7a21475c9 class: DirectoryStream
Stefan Vogel <sv@exept.de>
parents: 16297
diff changeset
   796
isOpen
1ca7a21475c9 class: DirectoryStream
Stefan Vogel <sv@exept.de>
parents: 16297
diff changeset
   797
    ^ dirPointer notNil.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   798
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   799
1281
b4b3abffdf32 Support optional signal generation on end of stream.
Stefan Vogel <sv@exept.de>
parents: 1133
diff changeset
   800
!DirectoryStream class methodsFor:'documentation'!
b4b3abffdf32 Support optional signal generation on end of stream.
Stefan Vogel <sv@exept.de>
parents: 1133
diff changeset
   801
b4b3abffdf32 Support optional signal generation on end of stream.
Stefan Vogel <sv@exept.de>
parents: 1133
diff changeset
   802
version
18780
cdf7956a75e1 #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 17302
diff changeset
   803
    ^ '$Header$'
12468
cc062d075d2a __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12414
diff changeset
   804
!
cc062d075d2a __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12414
diff changeset
   805
cc062d075d2a __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12414
diff changeset
   806
version_CVS
18780
cdf7956a75e1 #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 17302
diff changeset
   807
    ^ '$Header$'
1281
b4b3abffdf32 Support optional signal generation on end of stream.
Stefan Vogel <sv@exept.de>
parents: 1133
diff changeset
   808
! !