DirectoryStream.st
author Claus Gittinger <cg@exept.de>
Wed, 14 Jan 2004 13:56:39 +0100
changeset 7826 c32044219031
parent 6268 e4bf390583ac
child 7955 f3a24f9588ee
permissions -rw-r--r--
comment
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
"
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
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    15
FileStream subclass:#DirectoryStream
1664
82793bcf229c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1631
diff changeset
    16
	instanceVariableNames:'dirPointer readAheadEntry'
1281
b4b3abffdf32 Support optional signal generation on end of stream.
Stefan Vogel <sv@exept.de>
parents: 1133
diff changeset
    17
	classVariableNames:''
b4b3abffdf32 Support optional signal generation on end of stream.
Stefan Vogel <sv@exept.de>
parents: 1133
diff changeset
    18
	poolDictionaries:''
b4b3abffdf32 Support optional signal generation on end of stream.
Stefan Vogel <sv@exept.de>
parents: 1133
diff changeset
    19
	category:'Streams-External'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    20
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    21
217
a0400fdbc933 *** empty log message ***
claus
parents: 206
diff changeset
    22
!DirectoryStream primitiveDefinitions!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    23
%{
437
claus
parents: 384
diff changeset
    24
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    25
#define UNIX_LIKE
2609
68abf045b637 stat call emulation
Claus Gittinger <cg@exept.de>
parents: 1989
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
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    29
#endif
437
claus
parents: 384
diff changeset
    30
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    31
#if defined(transputer)
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    32
# undef UNIX_LIKE
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    33
#endif
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    34
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    35
#ifdef UNIX_LIKE
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    36
# include <stdio.h>
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    37
# define _STDIO_H_INCLUDED_
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    38
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    39
# include <errno.h>
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    40
# define _ERRNO_H_INCLUDED_
10
claus
parents: 5
diff changeset
    41
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    42
# include <sys/types.h>
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    43
# include <sys/stat.h>
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    44
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    45
# ifdef HAS_OPENDIR
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    46
#  include <sys/types.h>
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    47
#  ifdef NEXT
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    48
#   include <sys/dir.h>
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    49
#  else
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    50
#   include <dirent.h>
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    51
#  endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
    52
# endif
223
3075043790b8 immediateInterr & errno cleanup
claus
parents: 217
diff changeset
    53
3075043790b8 immediateInterr & errno cleanup
claus
parents: 217
diff changeset
    54
/*
3075043790b8 immediateInterr & errno cleanup
claus
parents: 217
diff changeset
    55
 * on some systems errno is a macro ... check for it here
3075043790b8 immediateInterr & errno cleanup
claus
parents: 217
diff changeset
    56
 */
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    57
# ifndef errno
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    58
  extern errno;
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    59
# endif
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    60
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    61
#endif /* UNIX_LIKE */
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    62
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
    63
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    64
#ifdef WIN32
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    65
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    66
# ifdef i386
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    67
#  define _X86_
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    68
# endif
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    69
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    70
# undef INT
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    71
# undef Array
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    72
# undef Number
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    73
# undef Method
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    74
# undef Point
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    75
# undef Context
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    76
# undef Rectangle
1989
92b10a0e8a51 win32 changes
Claus Gittinger <cg@exept.de>
parents: 1688
diff changeset
    77
# undef Block
4298
1889f8051f69 *** empty log message ***
ps
parents: 3980
diff changeset
    78
# undef Time
1889f8051f69 *** empty log message ***
ps
parents: 3980
diff changeset
    79
# undef Date
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    80
2685
6576fb7af338 nt stuff
Claus Gittinger <cg@exept.de>
parents: 2609
diff changeset
    81
/* # include <types.h> /* */
1989
92b10a0e8a51 win32 changes
Claus Gittinger <cg@exept.de>
parents: 1688
diff changeset
    82
# include <stdarg.h> /* */
5120
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
    83
# include <errno.h>
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
    84
# define _ERRNO_H_INCLUDED_
1989
92b10a0e8a51 win32 changes
Claus Gittinger <cg@exept.de>
parents: 1688
diff changeset
    85
# include <windef.h> /* */
92b10a0e8a51 win32 changes
Claus Gittinger <cg@exept.de>
parents: 1688
diff changeset
    86
# include <winbase.h> /* */
4298
1889f8051f69 *** empty log message ***
ps
parents: 3980
diff changeset
    87
/* # include <wingdi.h> /* */
1889f8051f69 *** empty log message ***
ps
parents: 3980
diff changeset
    88
/* # include <winuser.h> /* */
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    89
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    90
# ifdef __DEF_Array
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    91
#  define Array __DEF_Array
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    92
# endif
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    93
# ifdef __DEF_Number
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    94
#  define Number __DEF_Number
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    95
# endif
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    96
# ifdef __DEF_Method
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    97
#  define Method __DEF_Method
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    98
# endif
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
    99
# ifdef __DEF_Point
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   100
#  define Point __DEF_Point
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   101
# endif
1989
92b10a0e8a51 win32 changes
Claus Gittinger <cg@exept.de>
parents: 1688
diff changeset
   102
# ifdef __DEF_Block
92b10a0e8a51 win32 changes
Claus Gittinger <cg@exept.de>
parents: 1688
diff changeset
   103
#  define Block __DEF_Block
92b10a0e8a51 win32 changes
Claus Gittinger <cg@exept.de>
parents: 1688
diff changeset
   104
# endif
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   105
# ifdef __DEF_Context
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   106
#  define Context __DEF_Context
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   107
# endif
4298
1889f8051f69 *** empty log message ***
ps
parents: 3980
diff changeset
   108
# ifdef __DEF_Date
1889f8051f69 *** empty log message ***
ps
parents: 3980
diff changeset
   109
#  define Date __DEF_Date
1889f8051f69 *** empty log message ***
ps
parents: 3980
diff changeset
   110
# endif
1889f8051f69 *** empty log message ***
ps
parents: 3980
diff changeset
   111
# ifdef __DEF_Time
1889f8051f69 *** empty log message ***
ps
parents: 3980
diff changeset
   112
#  define Time __DEF_Time
1889f8051f69 *** empty log message ***
ps
parents: 3980
diff changeset
   113
# endif
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   114
2999
b0e55440cf12 eliminate MKOBJ & MKCP (use MKEXTERNALADDRESS & externalAddressVal)
Claus Gittinger <cg@exept.de>
parents: 2982
diff changeset
   115
# define __HANDLEVal(o)  (HANDLE)__externalAddressVal(o)
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   116
6259
164d7efc1eb2 api call stuff (more calls wrapped; care for EINTR)
Claus Gittinger <cg@exept.de>
parents: 5245
diff changeset
   117
# ifndef DO_WRAP_CALLS
6266
b12e2e6a84d7 pass name of called API/C function in wrap
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
   118
#  define STX_C_CALL0(__nm__, __f__)                            __f__((__a1__))
b12e2e6a84d7 pass name of called API/C function in wrap
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
   119
#  define STX_C_CALL1(__nm__, __f__, __a1__)                    __f__((__a1__))
b12e2e6a84d7 pass name of called API/C function in wrap
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
   120
#  define STX_C_CALL2(__nm__, __f__, __a1__, __a2__)            __f__((__a1__), (__a2__))
b12e2e6a84d7 pass name of called API/C function in wrap
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
   121
#  define STX_C_CALL3(__nm__, __f__, __a1__, __a2__, __a3__)    __f__((__a1__), (__a2__), (__a3__))
b12e2e6a84d7 pass name of called API/C function in wrap
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
   122
#  define STX_API_CALL0(__nm__, __f__)                          __f__((__a1__))
b12e2e6a84d7 pass name of called API/C function in wrap
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
   123
#  define STX_API_CALL1(__nm__, __f__, __a1__)                  __f__((__a1__))
b12e2e6a84d7 pass name of called API/C function in wrap
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
   124
#  define STX_API_CALL2(__nm__, __f__, __a1__, __a2__)          __f__((__a1__), (__a2__))
b12e2e6a84d7 pass name of called API/C function in wrap
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
   125
#  define STX_API_CALL3(__nm__, __f__, __a1__, __a2__, __a3__)  __f__((__a1__), (__a2__), (__a3__))
6259
164d7efc1eb2 api call stuff (more calls wrapped; care for EINTR)
Claus Gittinger <cg@exept.de>
parents: 5245
diff changeset
   126
# else
6266
b12e2e6a84d7 pass name of called API/C function in wrap
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
   127
#  define STX_C_CALL0(__nm__, __f__)                            __STX_C_CALL0(__nm__,(void*)__f__)
b12e2e6a84d7 pass name of called API/C function in wrap
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
   128
#  define STX_C_CALL1(__nm__, __f__, __a1__)                    __STX_C_CALL1(__nm__,(void*)__f__, (void*)(__a1__))
b12e2e6a84d7 pass name of called API/C function in wrap
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
   129
#  define STX_C_CALL2(__nm__, __f__, __a1__, __a2__)            __STX_C_CALL2(__nm__,(void*)__f__, (void*)(__a1__), (void*)(__a2__))
b12e2e6a84d7 pass name of called API/C function in wrap
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
   130
#  define STX_C_CALL3(__nm__, __f__, __a1__, __a2__, __a3__)    __STX_C_CALL3(__nm__,(void*)__f__, (void*)(__a1__), (void*)(__a2__), (void*)(__a3__))
b12e2e6a84d7 pass name of called API/C function in wrap
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
   131
#  define STX_API_CALL0(__nm__, __f__)                          __STX_API_CALL0(__nm__,(void*)__f__)
b12e2e6a84d7 pass name of called API/C function in wrap
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
   132
#  define STX_API_CALL1(__nm__, __f__, __a1__)                  __STX_API_CALL1(__nm__,(void*)__f__, (void*)(__a1__))
b12e2e6a84d7 pass name of called API/C function in wrap
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
   133
#  define STX_API_CALL2(__nm__, __f__, __a1__, __a2__)          __STX_API_CALL2(__nm__,(void*)__f__, (void*)(__a1__), (void*)(__a2__))
b12e2e6a84d7 pass name of called API/C function in wrap
Claus Gittinger <cg@exept.de>
parents: 6259
diff changeset
   134
#  define STX_API_CALL3(__nm__, __f__, __a1__, __a2__, __a3__)  __STX_API_CALL3(__nm__,(void*)__f__, (void*)(__a1__), (void*)(__a2__), (void*)(__a3__))
6259
164d7efc1eb2 api call stuff (more calls wrapped; care for EINTR)
Claus Gittinger <cg@exept.de>
parents: 5245
diff changeset
   135
# endif
164d7efc1eb2 api call stuff (more calls wrapped; care for EINTR)
Claus Gittinger <cg@exept.de>
parents: 5245
diff changeset
   136
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   137
#endif /* WIN32 */
223
3075043790b8 immediateInterr & errno cleanup
claus
parents: 217
diff changeset
   138
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   139
%}
206
5858b2c9d0c6 fixed close
claus
parents: 155
diff changeset
   140
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   141
438
claus
parents: 437
diff changeset
   142
!DirectoryStream primitiveFunctions!
claus
parents: 437
diff changeset
   143
%{
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   144
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   145
#ifndef HAS_OPENDIR
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   146
# if defined(__VMS__)
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   147
3816
af3f917c7759 use wrapCalls for FindFirstFile & FindNextFile (win32 - dir-reading)
Claus Gittinger <cg@exept.de>
parents: 3164
diff changeset
   148
#  define lib$find_file LIB$FIND_FILE
438
claus
parents: 437
diff changeset
   149
claus
parents: 437
diff changeset
   150
/*
claus
parents: 437
diff changeset
   151
**  VMS readdir() routines.
claus
parents: 437
diff changeset
   152
**  Written by Rich $alz, <rsalz@bbn.com> in August, 1990.
claus
parents: 437
diff changeset
   153
**  This code has no copyright.
claus
parents: 437
diff changeset
   154
*/
claus
parents: 437
diff changeset
   155
claus
parents: 437
diff changeset
   156
/* 12-NOV-1990 added d_namlen field and special case "." name -GJC@MITECH.COM 
claus
parents: 437
diff changeset
   157
 */
claus
parents: 437
diff changeset
   158
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   159
#   ifndef _STDIO_H_INCLUDED_
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   160
#    include <stdio.h>
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   161
#    define _STDIO_H_INCLUDED_
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   162
#   endif
438
claus
parents: 437
diff changeset
   163
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   164
#   ifndef _CTYPE_H_INCLUDED_
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   165
#    include <ctype.h>
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   166
#    define _CTYPE_H_INCLUDED_
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   167
#   endif
438
claus
parents: 437
diff changeset
   168
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   169
#   ifndef _ERRNO_H_INCLUDED_
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   170
#    include <errno.h>
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   171
#    define _ERRNO_H_INCLUDED_
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   172
#   endif
438
claus
parents: 437
diff changeset
   173
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   174
#   ifndef _DESCRIP_H_INCLUDED_
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   175
#    include <descrip.h>
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   176
#    define _DESCRIP_H_INCLUDED_
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   177
#   endif
438
claus
parents: 437
diff changeset
   178
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   179
#   ifndef _RMSDEF_H_INCLUDED_
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   180
#    include <rmsdef.h>
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   181
#    define _RMSDEF_H_INCLUDED_
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   182
#   endif
438
claus
parents: 437
diff changeset
   183
claus
parents: 437
diff changeset
   184
/*
claus
parents: 437
diff changeset
   185
 * actually, the following has to go into dirent.h ...
claus
parents: 437
diff changeset
   186
 */
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   187
/* BEGIN included dirent.h
438
claus
parents: 437
diff changeset
   188
 *
claus
parents: 437
diff changeset
   189
**  Header file for VMS readdir() routines.
claus
parents: 437
diff changeset
   190
**  Written by Rich $alz, <rsalz@bbn.com> in August, 1990.
claus
parents: 437
diff changeset
   191
**  This code has no copyright.
claus
parents: 437
diff changeset
   192
**
claus
parents: 437
diff changeset
   193
**  You must #include <descrip.h> before this file.
claus
parents: 437
diff changeset
   194
*/
claus
parents: 437
diff changeset
   195
claus
parents: 437
diff changeset
   196
/* 12-NOV-1990 added d_namlen field -GJC@MITECH.COM */
claus
parents: 437
diff changeset
   197
claus
parents: 437
diff changeset
   198
    /* Data structure returned by READDIR(). */
claus
parents: 437
diff changeset
   199
struct dirent {
claus
parents: 437
diff changeset
   200
    char        d_name[100];            /* File name            */
claus
parents: 437
diff changeset
   201
    int         d_namlen;
2957
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   202
    int         vms_verscount;          /* Number of versions   */
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   203
    int         vms_versions[20];       /* Version numbers      */
438
claus
parents: 437
diff changeset
   204
};
claus
parents: 437
diff changeset
   205
claus
parents: 437
diff changeset
   206
    /* Handle returned by opendir(), used by the other routines.  You
claus
parents: 437
diff changeset
   207
     * are not supposed to care what's inside this structure. */
claus
parents: 437
diff changeset
   208
typedef struct _dirdesc {
claus
parents: 437
diff changeset
   209
    long                        context;
2957
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   210
    int                         vms_wantversions;
438
claus
parents: 437
diff changeset
   211
    char                        *pattern;
claus
parents: 437
diff changeset
   212
    struct dirent               entry;
claus
parents: 437
diff changeset
   213
    struct dsc$descriptor_s     pat;
claus
parents: 437
diff changeset
   214
} DIR;
claus
parents: 437
diff changeset
   215
claus
parents: 437
diff changeset
   216
claus
parents: 437
diff changeset
   217
#define rewinddir(dirp)                 seekdir((dirp), 0L)
claus
parents: 437
diff changeset
   218
claus
parents: 437
diff changeset
   219
claus
parents: 437
diff changeset
   220
extern DIR              *opendir();
claus
parents: 437
diff changeset
   221
extern struct dirent    *readdir();
claus
parents: 437
diff changeset
   222
extern long             telldir();
claus
parents: 437
diff changeset
   223
extern void             seekdir();
claus
parents: 437
diff changeset
   224
extern void             closedir();
claus
parents: 437
diff changeset
   225
extern void             vmsreaddirversions();
claus
parents: 437
diff changeset
   226
/*
claus
parents: 437
diff changeset
   227
 * END dirent.h
claus
parents: 437
diff changeset
   228
 */
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   229
#define _DIRENT_H_INCLUDED_
438
claus
parents: 437
diff changeset
   230
claus
parents: 437
diff changeset
   231
claus
parents: 437
diff changeset
   232
    /* Number of elements in vms_versions array */
claus
parents: 437
diff changeset
   233
#define VERSIZE(e)      (sizeof e->vms_versions / sizeof e->vms_versions[0])
claus
parents: 437
diff changeset
   234
claus
parents: 437
diff changeset
   235
    /* Linked in later. */
claus
parents: 437
diff changeset
   236
extern char     *strrchr();
claus
parents: 437
diff changeset
   237
extern char     *strcpy();
claus
parents: 437
diff changeset
   238
/*  Don't need this when all these programs are lumped together.    RLD
claus
parents: 437
diff changeset
   239
extern char     *malloc();
claus
parents: 437
diff changeset
   240
*/
claus
parents: 437
diff changeset
   241
claus
parents: 437
diff changeset
   242
/*
claus
parents: 437
diff changeset
   243
**  Open a directory, return a handle for later use.
claus
parents: 437
diff changeset
   244
*/
claus
parents: 437
diff changeset
   245
DIR *
claus
parents: 437
diff changeset
   246
opendir(name)
claus
parents: 437
diff changeset
   247
    char        *name;
claus
parents: 437
diff changeset
   248
{
claus
parents: 437
diff changeset
   249
    DIR                 *dd;
claus
parents: 437
diff changeset
   250
claus
parents: 437
diff changeset
   251
    /* Get memory for the handle, and the pattern. */
claus
parents: 437
diff changeset
   252
    if ((dd = (DIR *)malloc(sizeof *dd)) == NULL) {
5120
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   253
	__threadErrno = ENOMEM;
438
claus
parents: 437
diff changeset
   254
	return NULL;
claus
parents: 437
diff changeset
   255
    }
claus
parents: 437
diff changeset
   256
claus
parents: 437
diff changeset
   257
    if (strcmp(".",name) == 0) name = "";
claus
parents: 437
diff changeset
   258
claus
parents: 437
diff changeset
   259
    dd->pattern = malloc((unsigned int)(strlen(name) + sizeof "*.*" + 1));
claus
parents: 437
diff changeset
   260
    if (dd->pattern == NULL) {
claus
parents: 437
diff changeset
   261
	free((char *)dd);
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
    /* Fill in the fields; mainly playing with the descriptor. */
claus
parents: 437
diff changeset
   267
    (void)sprintf(dd->pattern, "%s*.*", name);
claus
parents: 437
diff changeset
   268
    dd->context = 0;
claus
parents: 437
diff changeset
   269
    dd->vms_wantversions = 0;
claus
parents: 437
diff changeset
   270
    dd->pat.dsc$a_pointer = dd->pattern;
claus
parents: 437
diff changeset
   271
    dd->pat.dsc$w_length = strlen(dd->pattern);
claus
parents: 437
diff changeset
   272
    dd->pat.dsc$b_dtype = DSC$K_DTYPE_T;
claus
parents: 437
diff changeset
   273
    dd->pat.dsc$b_class = DSC$K_CLASS_S;
claus
parents: 437
diff changeset
   274
claus
parents: 437
diff changeset
   275
    return dd;
claus
parents: 437
diff changeset
   276
}
claus
parents: 437
diff changeset
   277
claus
parents: 437
diff changeset
   278
/*
claus
parents: 437
diff changeset
   279
**  Set the flag to indicate we want versions or not.
claus
parents: 437
diff changeset
   280
*/
claus
parents: 437
diff changeset
   281
void
claus
parents: 437
diff changeset
   282
vmsreaddirversions(dd, flag)
claus
parents: 437
diff changeset
   283
    DIR                 *dd;
claus
parents: 437
diff changeset
   284
    int                 flag;
claus
parents: 437
diff changeset
   285
{
claus
parents: 437
diff changeset
   286
    dd->vms_wantversions = flag;
claus
parents: 437
diff changeset
   287
}
claus
parents: 437
diff changeset
   288
claus
parents: 437
diff changeset
   289
/*
claus
parents: 437
diff changeset
   290
**  Free up an opened directory.
claus
parents: 437
diff changeset
   291
*/
claus
parents: 437
diff changeset
   292
void
claus
parents: 437
diff changeset
   293
closedir(dd)
claus
parents: 437
diff changeset
   294
    DIR                 *dd;
claus
parents: 437
diff changeset
   295
{
claus
parents: 437
diff changeset
   296
    free(dd->pattern);
claus
parents: 437
diff changeset
   297
    free((char *)dd);
claus
parents: 437
diff changeset
   298
}
claus
parents: 437
diff changeset
   299
claus
parents: 437
diff changeset
   300
/*
claus
parents: 437
diff changeset
   301
**  Collect all the version numbers for the current file.
claus
parents: 437
diff changeset
   302
*/
claus
parents: 437
diff changeset
   303
static void
claus
parents: 437
diff changeset
   304
collectversions(dd)
claus
parents: 437
diff changeset
   305
    DIR                                 *dd;
claus
parents: 437
diff changeset
   306
{
claus
parents: 437
diff changeset
   307
    struct dsc$descriptor_s     pat;
claus
parents: 437
diff changeset
   308
    struct dsc$descriptor_s     res;
claus
parents: 437
diff changeset
   309
    struct dirent               *e;
claus
parents: 437
diff changeset
   310
    char                        *p;
claus
parents: 437
diff changeset
   311
    char                        buff[sizeof dd->entry.d_name];
claus
parents: 437
diff changeset
   312
    int                                 i;
claus
parents: 437
diff changeset
   313
    char                        *text;
claus
parents: 437
diff changeset
   314
    long                        context;
claus
parents: 437
diff changeset
   315
claus
parents: 437
diff changeset
   316
    /* Convenient shorthand. */
claus
parents: 437
diff changeset
   317
    e = &dd->entry;
claus
parents: 437
diff changeset
   318
claus
parents: 437
diff changeset
   319
    /* Add the version wildcard, ignoring the "*.*" put on before */
claus
parents: 437
diff changeset
   320
    i = strlen(dd->pattern);
claus
parents: 437
diff changeset
   321
    text = malloc((unsigned int)(i + strlen(e->d_name)+ 2 + 1));
claus
parents: 437
diff changeset
   322
    if (text == NULL)
claus
parents: 437
diff changeset
   323
	return;
claus
parents: 437
diff changeset
   324
    (void)strcpy(text, dd->pattern);
claus
parents: 437
diff changeset
   325
    (void)sprintf(&text[i - 3], "%s;*", e->d_name);
claus
parents: 437
diff changeset
   326
claus
parents: 437
diff changeset
   327
    /* Set up the pattern descriptor. */
claus
parents: 437
diff changeset
   328
    pat.dsc$a_pointer = text;
claus
parents: 437
diff changeset
   329
    pat.dsc$w_length = strlen(text);
claus
parents: 437
diff changeset
   330
    pat.dsc$b_dtype = DSC$K_DTYPE_T;
claus
parents: 437
diff changeset
   331
    pat.dsc$b_class = DSC$K_CLASS_S;
claus
parents: 437
diff changeset
   332
claus
parents: 437
diff changeset
   333
    /* Set up result descriptor. */
claus
parents: 437
diff changeset
   334
    res.dsc$a_pointer = buff;
claus
parents: 437
diff changeset
   335
    res.dsc$w_length = sizeof buff - 2;
claus
parents: 437
diff changeset
   336
    res.dsc$b_dtype = DSC$K_DTYPE_T;
claus
parents: 437
diff changeset
   337
    res.dsc$b_class = DSC$K_CLASS_S;
claus
parents: 437
diff changeset
   338
claus
parents: 437
diff changeset
   339
    /* Read files, collecting versions. */
claus
parents: 437
diff changeset
   340
    for (context = 0; e->vms_verscount < VERSIZE(e); e->vms_verscount++) {
claus
parents: 437
diff changeset
   341
	if (lib$find_file(&pat, &res, &context) == RMS$_NMF || context == 0)
claus
parents: 437
diff changeset
   342
	    break;
claus
parents: 437
diff changeset
   343
	buff[sizeof buff - 1] = '\0';
claus
parents: 437
diff changeset
   344
	if (p = strchr(buff, ';'))
claus
parents: 437
diff changeset
   345
	    e->vms_versions[e->vms_verscount] = atoi(p + 1);
claus
parents: 437
diff changeset
   346
	else
claus
parents: 437
diff changeset
   347
	    e->vms_versions[e->vms_verscount] = -1;
claus
parents: 437
diff changeset
   348
    }
claus
parents: 437
diff changeset
   349
claus
parents: 437
diff changeset
   350
    free(text);
claus
parents: 437
diff changeset
   351
}
claus
parents: 437
diff changeset
   352
claus
parents: 437
diff changeset
   353
/*
claus
parents: 437
diff changeset
   354
**  Read the next entry from the directory.
claus
parents: 437
diff changeset
   355
*/
claus
parents: 437
diff changeset
   356
struct dirent *
claus
parents: 437
diff changeset
   357
readdir(dd)
2957
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   358
    DIR *dd;
438
claus
parents: 437
diff changeset
   359
{
2957
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   360
    struct dsc$descriptor_s res;
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   361
    char                    *p;
2982
3032a3a7e17a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2957
diff changeset
   362
    char                    buff[sizeof dd->entry.d_name + 10];
2957
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   363
    int                     i;
438
claus
parents: 437
diff changeset
   364
claus
parents: 437
diff changeset
   365
    /* Set up result descriptor, and get next file. */
claus
parents: 437
diff changeset
   366
    res.dsc$a_pointer = buff;
claus
parents: 437
diff changeset
   367
    res.dsc$w_length = sizeof buff - 2;
claus
parents: 437
diff changeset
   368
    res.dsc$b_dtype = DSC$K_DTYPE_T;
claus
parents: 437
diff changeset
   369
    res.dsc$b_class = DSC$K_CLASS_S;
claus
parents: 437
diff changeset
   370
    if (lib$find_file(&dd->pat, &res, &dd->context) == RMS$_NMF
claus
parents: 437
diff changeset
   371
     || dd->context == 0L)
claus
parents: 437
diff changeset
   372
	/* None left... */
claus
parents: 437
diff changeset
   373
	return NULL;
claus
parents: 437
diff changeset
   374
claus
parents: 437
diff changeset
   375
    /* Force the buffer to end with a NUL. */
claus
parents: 437
diff changeset
   376
    buff[sizeof buff - 1] = '\0';
claus
parents: 437
diff changeset
   377
    for (p = buff; !isspace(*p); p++)
claus
parents: 437
diff changeset
   378
	;
claus
parents: 437
diff changeset
   379
    *p = '\0';
claus
parents: 437
diff changeset
   380
claus
parents: 437
diff changeset
   381
    /* Skip any directory component and just copy the name. */
claus
parents: 437
diff changeset
   382
    if (p = strchr(buff, ']'))
claus
parents: 437
diff changeset
   383
	(void)strcpy(dd->entry.d_name, p + 1);
claus
parents: 437
diff changeset
   384
    else
claus
parents: 437
diff changeset
   385
	(void)strcpy(dd->entry.d_name, buff);
claus
parents: 437
diff changeset
   386
claus
parents: 437
diff changeset
   387
    /* Clobber the version. */
claus
parents: 437
diff changeset
   388
    if (p = strchr(dd->entry.d_name, ';'))
claus
parents: 437
diff changeset
   389
	*p = '\0';
claus
parents: 437
diff changeset
   390
2982
3032a3a7e17a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2957
diff changeset
   391
    /* claus: empty dirs seems to leave *.* in the buffer ... */
3032a3a7e17a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2957
diff changeset
   392
    if (strcmp(dd->entry.d_name, "*.*") == 0) {
3032a3a7e17a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2957
diff changeset
   393
	return NULL;
3032a3a7e17a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2957
diff changeset
   394
    }
3032a3a7e17a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2957
diff changeset
   395
438
claus
parents: 437
diff changeset
   396
    dd->entry.d_namlen = strlen(dd->entry.d_name);
claus
parents: 437
diff changeset
   397
claus
parents: 437
diff changeset
   398
    dd->entry.vms_verscount = 0;
claus
parents: 437
diff changeset
   399
    if (dd->vms_wantversions)
claus
parents: 437
diff changeset
   400
	collectversions(dd);
claus
parents: 437
diff changeset
   401
    return &dd->entry;
claus
parents: 437
diff changeset
   402
}
claus
parents: 437
diff changeset
   403
claus
parents: 437
diff changeset
   404
/*
claus
parents: 437
diff changeset
   405
**  Return something that can be used in a seekdir later.
claus
parents: 437
diff changeset
   406
*/
claus
parents: 437
diff changeset
   407
long
claus
parents: 437
diff changeset
   408
telldir(dd)
2957
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   409
    DIR  *dd;
438
claus
parents: 437
diff changeset
   410
{
claus
parents: 437
diff changeset
   411
    return dd->context;
claus
parents: 437
diff changeset
   412
}
claus
parents: 437
diff changeset
   413
claus
parents: 437
diff changeset
   414
/*
claus
parents: 437
diff changeset
   415
**  Return to a spot where we used to be.
claus
parents: 437
diff changeset
   416
*/
claus
parents: 437
diff changeset
   417
void
claus
parents: 437
diff changeset
   418
seekdir(dd, pos)
2957
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   419
    DIR  *dd;
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   420
    long pos;
438
claus
parents: 437
diff changeset
   421
{
claus
parents: 437
diff changeset
   422
    dd->context = pos;
claus
parents: 437
diff changeset
   423
}
claus
parents: 437
diff changeset
   424
2896
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   425
#  define HAS_OPENDIR
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   426
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   427
# endif /* __VMS__ */
be30640b9012 VMS stuff
Claus Gittinger <cg@exept.de>
parents: 2685
diff changeset
   428
#endif /* not HAS_OPENDIR */
438
claus
parents: 437
diff changeset
   429
%}
claus
parents: 437
diff changeset
   430
! !
claus
parents: 437
diff changeset
   431
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   432
!DirectoryStream class methodsFor:'documentation'!
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   433
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   434
copyright
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   435
"
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   436
 COPYRIGHT (c) 1989 by Claus Gittinger
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   437
	      All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   438
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   439
 This software is furnished under a license and may be used
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   440
 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
   441
 inclusion of the above copyright notice.   This software may not
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   442
 be provided or otherwise made available to, or used by, any
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   443
 other person.  No title to or ownership of the software is
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   444
 hereby transferred.
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
!
360
claus
parents: 249
diff changeset
   447
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   448
documentation
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   449
"
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   450
    Instances of DirectoryStream allow reading a file-directory,
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   451
    as if it was a stream of filenames.
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   452
    Basically, its an interface to opendir, readdir and closedir.
2957
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   453
    Notice: 
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   454
	DirectoryStream is an ST/X special; 
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   455
	for portability, we recommend the use of Filename protocol.
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
   456
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1281
diff changeset
   457
    [author:]
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   458
	Claus Gittinger
2957
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   459
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   460
    [see also:]
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   461
	Filename
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   462
"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   463
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   464
a27a279701f8 Initial revision
claus
parents:
diff changeset
   465
!DirectoryStream class methodsFor:'instance creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   466
a27a279701f8 Initial revision
claus
parents:
diff changeset
   467
directoryNamed:dirName
7826
c32044219031 comment
Claus Gittinger <cg@exept.de>
parents: 6268
diff changeset
   468
    "return a DirectoryStream for directory named dirName, aString
c32044219031 comment
Claus Gittinger <cg@exept.de>
parents: 6268
diff changeset
   469
     Raises an openError, if the directory does not exists."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   470
a27a279701f8 Initial revision
claus
parents:
diff changeset
   471
    |newStream|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   472
a27a279701f8 Initial revision
claus
parents:
diff changeset
   473
    newStream := (self basicNew) pathName:dirName.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   474
    newStream openForReading isNil ifTrue:[^nil].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   475
    ^ newStream
7826
c32044219031 comment
Claus Gittinger <cg@exept.de>
parents: 6268
diff changeset
   476
c32044219031 comment
Claus Gittinger <cg@exept.de>
parents: 6268
diff changeset
   477
    "
c32044219031 comment
Claus Gittinger <cg@exept.de>
parents: 6268
diff changeset
   478
     self directoryNamed:'adadasd' 
c32044219031 comment
Claus Gittinger <cg@exept.de>
parents: 6268
diff changeset
   479
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   480
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   481
5245
fb27aee25da6 category change
Claus Gittinger <cg@exept.de>
parents: 5120
diff changeset
   482
!DirectoryStream methodsFor:'access-reading'!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   483
a27a279701f8 Initial revision
claus
parents:
diff changeset
   484
nextLine
a27a279701f8 Initial revision
claus
parents:
diff changeset
   485
    "return the next filename as a string"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   486
a27a279701f8 Initial revision
claus
parents:
diff changeset
   487
    |prevEntry nextEntry|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   488
%{
77
6c38ca59927f *** empty log message ***
claus
parents: 54
diff changeset
   489
#ifdef HAS_OPENDIR
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   490
    DIR *d;
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   491
# ifdef NEXT
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   492
    struct direct *dp;
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   493
# else
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   494
    struct dirent *dp;
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   495
# endif
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   496
    OBJ dirP;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   497
1281
b4b3abffdf32 Support optional signal generation on end of stream.
Stefan Vogel <sv@exept.de>
parents: 1133
diff changeset
   498
    if (__INST(hitEOF) != true && (dirP = __INST(dirPointer)) != nil) {
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   499
	__INST(lastErrorNumber) = nil;
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   500
	d = (DIR *)__FILEVal(dirP);
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   501
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   502
	__BEGIN_INTERRUPTABLE__
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   503
	do {
2957
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   504
	    do {
5120
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   505
		__threadErrno = 0;
3816
af3f917c7759 use wrapCalls for FindFirstFile & FindNextFile (win32 - dir-reading)
Claus Gittinger <cg@exept.de>
parents: 3164
diff changeset
   506
		dp = readdir(d);
af3f917c7759 use wrapCalls for FindFirstFile & FindNextFile (win32 - dir-reading)
Claus Gittinger <cg@exept.de>
parents: 3164
diff changeset
   507
		/*
af3f917c7759 use wrapCalls for FindFirstFile & FindNextFile (win32 - dir-reading)
Claus Gittinger <cg@exept.de>
parents: 3164
diff changeset
   508
		 * for compatibility with ST-80,
af3f917c7759 use wrapCalls for FindFirstFile & FindNextFile (win32 - dir-reading)
Claus Gittinger <cg@exept.de>
parents: 3164
diff changeset
   509
		 * skip entries for '.' and '..'.
af3f917c7759 use wrapCalls for FindFirstFile & FindNextFile (win32 - dir-reading)
Claus Gittinger <cg@exept.de>
parents: 3164
diff changeset
   510
		 * If wanted, these must be added synthetically.
af3f917c7759 use wrapCalls for FindFirstFile & FindNextFile (win32 - dir-reading)
Claus Gittinger <cg@exept.de>
parents: 3164
diff changeset
   511
		 */
2957
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   512
	    } while (dp && ((strcmp(dp->d_name, ".")==0) || (strcmp(dp->d_name, "..")==0)));
5120
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   513
	} while ((dp == NULL) && (__threadErrno == EINTR));
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   514
	__END_INTERRUPTABLE__
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   515
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   516
	if (dp != NULL) {
1688
8a42db1eea60 removed all COMMA_CON / CON_COMMA uses
Claus Gittinger <cg@exept.de>
parents: 1664
diff changeset
   517
	    nextEntry = __MKSTRING((char *)(dp->d_name));
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   518
	} else {
5120
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   519
	    if (__threadErrno) {
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   520
		__INST(lastErrorNumber) = __MKSMALLINT(__threadErrno);
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   521
	    } else {
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   522
	       __INST(hitEOF) = true;
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   523
	    }
1281
b4b3abffdf32 Support optional signal generation on end of stream.
Stefan Vogel <sv@exept.de>
parents: 1133
diff changeset
   524
       }
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   525
    }
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   526
#else /* no HAS_OPENDIR */
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   527
# ifdef WIN32
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   528
    HANDLE d;
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   529
    WIN32_FIND_DATA data;
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   530
    OBJ dirP;
3816
af3f917c7759 use wrapCalls for FindFirstFile & FindNextFile (win32 - dir-reading)
Claus Gittinger <cg@exept.de>
parents: 3164
diff changeset
   531
    int rslt;
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   532
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   533
    if (__INST(hitEOF) != true && (dirP = __INST(dirPointer)) != nil) {
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   534
	__INST(lastErrorNumber) = nil;
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   535
	d = __HANDLEVal(dirP);
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   536
6259
164d7efc1eb2 api call stuff (more calls wrapped; care for EINTR)
Claus Gittinger <cg@exept.de>
parents: 5245
diff changeset
   537
	do {
164d7efc1eb2 api call stuff (more calls wrapped; care for EINTR)
Claus Gittinger <cg@exept.de>
parents: 5245
diff changeset
   538
	    __threadErrno = 0;
6268
e4bf390583ac *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 6266
diff changeset
   539
	    rslt = STX_API_CALL2( "FindNextFile", FindNextFile, d, &data );
6259
164d7efc1eb2 api call stuff (more calls wrapped; care for EINTR)
Claus Gittinger <cg@exept.de>
parents: 5245
diff changeset
   540
	} while ((rslt < 0) && (__threadErrno == EINTR));
164d7efc1eb2 api call stuff (more calls wrapped; care for EINTR)
Claus Gittinger <cg@exept.de>
parents: 5245
diff changeset
   541
164d7efc1eb2 api call stuff (more calls wrapped; care for EINTR)
Claus Gittinger <cg@exept.de>
parents: 5245
diff changeset
   542
	if (rslt > 0) {
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   543
	    nextEntry = __MKSTRING( data.cFileName );
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   544
	} else {
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   545
	   __INST(hitEOF) = true;
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   546
	}
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   547
    }
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   548
# endif /* WIN32 */
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   549
#endif /* HAS_OPENDIR */
155
edd7fc34e104 *** empty log message ***
claus
parents: 92
diff changeset
   550
%}.
edd7fc34e104 *** empty log message ***
claus
parents: 92
diff changeset
   551
    lastErrorNumber notNil ifTrue:[^ self ioError].
1664
82793bcf229c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1631
diff changeset
   552
    prevEntry := readAheadEntry.
82793bcf229c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1631
diff changeset
   553
    readAheadEntry := nextEntry.
1281
b4b3abffdf32 Support optional signal generation on end of stream.
Stefan Vogel <sv@exept.de>
parents: 1133
diff changeset
   554
    prevEntry isNil ifTrue:[^ self pastEnd].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   555
    ^ prevEntry
a27a279701f8 Initial revision
claus
parents:
diff changeset
   556
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   557
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   558
!DirectoryStream methodsFor:'closing'!
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   559
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   560
close
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   561
    "close the stream - tell operating system"
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   562
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   563
    dirPointer notNil ifTrue:[
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   564
	Lobby unregister:self.
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   565
	self closeFile.
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   566
	dirPointer := nil
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   567
    ]
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   568
! !
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
!DirectoryStream methodsFor:'instance release'!
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   571
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   572
closeFile
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   573
    "low level close of a directoryStream"
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   574
%{
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   575
#ifdef HAS_OPENDIR
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   576
    OBJ dp;
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   577
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 613
diff changeset
   578
    if ((dp = __INST(dirPointer)) != nil) {
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 613
diff changeset
   579
	__INST(dirPointer) = nil;
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   580
	closedir( (DIR *)(__FILEVal(dp)) );
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   581
    }
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   582
#else
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   583
# ifdef WIN32
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   584
    OBJ dp;
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   585
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   586
    if ((dp = __INST(dirPointer)) != nil) {
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   587
	__INST(dirPointer) = nil;
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   588
	FindClose( __HANDLEVal(dp) );
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   589
    }
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   590
# endif
613
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   591
#endif
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   592
%}
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   593
! !
0af19c3594fc checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   594
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   595
!DirectoryStream methodsFor:'private'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   596
a27a279701f8 Initial revision
claus
parents:
diff changeset
   597
openForReading
a27a279701f8 Initial revision
claus
parents:
diff changeset
   598
    "open the file for readonly"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   599
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   600
    |ok entry|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   601
a27a279701f8 Initial revision
claus
parents:
diff changeset
   602
    mode := #readonly.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   603
%{
77
6c38ca59927f *** empty log message ***
claus
parents: 54
diff changeset
   604
#ifdef HAS_OPENDIR
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   605
    DIR *d;
477
8710aba7876b oops - making id's real objects requires a store macro
Claus Gittinger <cg@exept.de>
parents: 475
diff changeset
   606
    OBJ path, dp;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   607
155
edd7fc34e104 *** empty log message ***
claus
parents: 92
diff changeset
   608
    ok = false;
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 613
diff changeset
   609
    if (__INST(dirPointer) == nil) {
5120
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   610
	path = __INST(pathName);
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   611
	if (__isString(path)) {
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   612
	    __BEGIN_INTERRUPTABLE__
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   613
	    __threadErrno = 0;
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   614
	    do {
6268
e4bf390583ac *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 6266
diff changeset
   615
		path = __INST(pathName);
5120
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   616
		d = opendir((char *) __stringVal(path));
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   617
	    } while ((d == NULL) && (__threadErrno == EINTR));
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   618
	    __END_INTERRUPTABLE__
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   619
5120
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   620
	    if (d == NULL) {
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   621
		__INST(lastErrorNumber) = __MKSMALLINT(__threadErrno);
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   622
	    } else {
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   623
		__INST(dirPointer) = dp = __MKEXTERNALADDRESS(d); __STORE(self, dp);
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   624
		ok = true;
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   625
	    }
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   626
	}
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   627
    }
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   628
#else
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   629
# ifdef WIN32
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   630
    HANDLE d;
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   631
    OBJ path, dp;
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   632
    char pattern[512];
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   633
    WIN32_FIND_DATA data;
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   634
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   635
    ok = false;
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   636
    if (__INST(dirPointer) == nil) {
5120
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   637
	path = __INST(pathName);
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   638
	if (__isString(path)) {
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   639
	    int l = __stringSize(path);
3164
4f37ae9c8961 use strncpy to avoid buffer-overruns
Claus Gittinger <cg@exept.de>
parents: 2999
diff changeset
   640
5120
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   641
	    if (l < (sizeof(pattern)-4)) {
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   642
		strncpy(pattern, __stringVal(path), l);
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   643
		strcpy(pattern+l, "\\*");
6259
164d7efc1eb2 api call stuff (more calls wrapped; care for EINTR)
Claus Gittinger <cg@exept.de>
parents: 5245
diff changeset
   644
164d7efc1eb2 api call stuff (more calls wrapped; care for EINTR)
Claus Gittinger <cg@exept.de>
parents: 5245
diff changeset
   645
		do {
164d7efc1eb2 api call stuff (more calls wrapped; care for EINTR)
Claus Gittinger <cg@exept.de>
parents: 5245
diff changeset
   646
		    __threadErrno = 0;
6268
e4bf390583ac *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 6266
diff changeset
   647
		    d = STX_API_CALL2( "FindFirstFile", FindFirstFile, pattern, &data );
6259
164d7efc1eb2 api call stuff (more calls wrapped; care for EINTR)
Claus Gittinger <cg@exept.de>
parents: 5245
diff changeset
   648
		} while ((d < 0) && (__threadErrno == EINTR));
164d7efc1eb2 api call stuff (more calls wrapped; care for EINTR)
Claus Gittinger <cg@exept.de>
parents: 5245
diff changeset
   649
5120
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   650
		if (d == INVALID_HANDLE_VALUE) {
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   651
		    __INST(lastErrorNumber) = __MKSMALLINT(GetLastError());
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   652
		} else {
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   653
		    __INST(dirPointer) = dp = __MKEXTERNALADDRESS(d); __STORE(self, dp);
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   654
		    entry = __MKSTRING( data.cFileName );
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   655
		    ok = true;
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   656
		}
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   657
	    }
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   658
	}
1631
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   659
    }
0d50b800b011 directory readOps for NT
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   660
# endif
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   661
#endif
155
edd7fc34e104 *** empty log message ***
claus
parents: 92
diff changeset
   662
%}.
edd7fc34e104 *** empty log message ***
claus
parents: 92
diff changeset
   663
    ok isNil ifTrue:[
5120
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   664
	"
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   665
	 opendir not avalable - use slower pipe
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   666
	"
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   667
	^ PipeStream readingFrom:('cd ' , pathName , '; ls -a')
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   668
    ].
155
edd7fc34e104 *** empty log message ***
claus
parents: 92
diff changeset
   669
edd7fc34e104 *** empty log message ***
claus
parents: 92
diff changeset
   670
    (ok == true) ifTrue:[
5120
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   671
	Lobby register:self.
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   672
	entry isNil ifTrue:[
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   673
	    self nextLine. "read 1st entry into readAheadEntry buffer"
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   674
	] ifFalse:[
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   675
	    readAheadEntry := entry.
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   676
	].
13143fbcbdf8 introduced __threadErrno (for native threads)
Claus Gittinger <cg@exept.de>
parents: 4526
diff changeset
   677
	^ self
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   678
    ].
4526
a42dc8e09586 errorOpen renamed to errorAlreadyOpen
Claus Gittinger <cg@exept.de>
parents: 4298
diff changeset
   679
    dirPointer notNil ifTrue:[^ self errorAlreadyOpen].
155
edd7fc34e104 *** empty log message ***
claus
parents: 92
diff changeset
   680
    lastErrorNumber notNil ifTrue:[^ self openError].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   681
    ^ nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   682
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   683
a27a279701f8 Initial revision
claus
parents:
diff changeset
   684
reOpen
38
454b1b94a48e *** empty log message ***
claus
parents: 31
diff changeset
   685
    "reOpen the stream after image restart"
454b1b94a48e *** empty log message ***
claus
parents: 31
diff changeset
   686
2
claus
parents: 1
diff changeset
   687
    dirPointer := nil.
claus
parents: 1
diff changeset
   688
    super reOpen
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   689
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   690
a27a279701f8 Initial revision
claus
parents:
diff changeset
   691
!DirectoryStream methodsFor:'testing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   692
a27a279701f8 Initial revision
claus
parents:
diff changeset
   693
atEnd
a27a279701f8 Initial revision
claus
parents:
diff changeset
   694
    "return true, if position is at end"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   695
1664
82793bcf229c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1631
diff changeset
   696
    ^ readAheadEntry == nil
2945
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   697
!
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   698
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   699
isEmpty
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   700
    "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
   701
     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
   702
2957
46015145c398 comments
Claus Gittinger <cg@exept.de>
parents: 2945
diff changeset
   703
    |entry|
2945
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   704
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   705
    [self atEnd] whileFalse:[
3816
af3f917c7759 use wrapCalls for FindFirstFile & FindNextFile (win32 - dir-reading)
Claus Gittinger <cg@exept.de>
parents: 3164
diff changeset
   706
	entry := self nextLine.
af3f917c7759 use wrapCalls for FindFirstFile & FindNextFile (win32 - dir-reading)
Claus Gittinger <cg@exept.de>
parents: 3164
diff changeset
   707
	entry asFilename isImplicit ifFalse:[
af3f917c7759 use wrapCalls for FindFirstFile & FindNextFile (win32 - dir-reading)
Claus Gittinger <cg@exept.de>
parents: 3164
diff changeset
   708
	    ^ false.
af3f917c7759 use wrapCalls for FindFirstFile & FindNextFile (win32 - dir-reading)
Claus Gittinger <cg@exept.de>
parents: 3164
diff changeset
   709
	]
2945
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   710
    ].
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   711
    ^ true
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   712
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   713
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   714
    "
3816
af3f917c7759 use wrapCalls for FindFirstFile & FindNextFile (win32 - dir-reading)
Claus Gittinger <cg@exept.de>
parents: 3164
diff changeset
   715
	(DirectoryStream directoryNamed:'/') isEmpty
af3f917c7759 use wrapCalls for FindFirstFile & FindNextFile (win32 - dir-reading)
Claus Gittinger <cg@exept.de>
parents: 3164
diff changeset
   716
	(DirectoryStream directoryNamed:'/var/tmp') isEmpty
2945
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   717
    "
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   718
1a4f2e0d9f1b Add #isEmpty, to check for an empty directory.
Stefan Vogel <sv@exept.de>
parents: 2896
diff changeset
   719
    "Modified: 18.9.1997 / 18:05:31 / stefan"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   720
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   721
1281
b4b3abffdf32 Support optional signal generation on end of stream.
Stefan Vogel <sv@exept.de>
parents: 1133
diff changeset
   722
!DirectoryStream class methodsFor:'documentation'!
b4b3abffdf32 Support optional signal generation on end of stream.
Stefan Vogel <sv@exept.de>
parents: 1133
diff changeset
   723
b4b3abffdf32 Support optional signal generation on end of stream.
Stefan Vogel <sv@exept.de>
parents: 1133
diff changeset
   724
version
7826
c32044219031 comment
Claus Gittinger <cg@exept.de>
parents: 6268
diff changeset
   725
    ^ '$Header: /cvs/stx/stx/libbasic/DirectoryStream.st,v 1.54 2004-01-14 12:56:39 cg Exp $'
1281
b4b3abffdf32 Support optional signal generation on end of stream.
Stefan Vogel <sv@exept.de>
parents: 1133
diff changeset
   726
! !