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