--- a/DirectoryStream.st Mon Apr 09 16:03:06 2018 +0200
+++ b/DirectoryStream.st Mon Apr 09 19:17:59 2018 +0200
@@ -1,5 +1,3 @@
-"{ Encoding: utf8 }"
-
"
COPYRIGHT (c) 1989 by Claus Gittinger
All Rights Reserved
@@ -579,145 +577,142 @@
encodedPathName := OperatingSystem encodePath:pathName.
mode := #readonly.
hitEOF := false.
+ ok := false.
%{
-#ifdef HAS_OPENDIR
- DIR *d;
- OBJ path, dp;
+#if defined(HAS_OPENDIR)
+ if (__INST(dirPointer) == nil && __isStringLike(encodedPathName)) {
+ DIR *d;
+ OBJ path, dp;
- ok = false;
- if (__INST(dirPointer) == nil) {
- if (__isStringLike(encodedPathName)) {
- __BEGIN_INTERRUPTABLE__
- __threadErrno = 0;
- do {
- d = opendir((char *) __stringVal(encodedPathName));
- } while ((d == NULL) && (__threadErrno == EINTR));
- __END_INTERRUPTABLE__
+ __threadErrno = 0;
+ __BEGIN_INTERRUPTABLE__
+ do {
+ d = opendir((char *) __stringVal(encodedPathName));
+ } while ((d == NULL) && (__threadErrno == EINTR));
+ __END_INTERRUPTABLE__
- if (d == NULL) {
- error = __mkSmallInteger(__threadErrno);
- } else {
- dp = __MKEXTERNALADDRESS(d); __INST(dirPointer) = dp; __STORE(self, dp);
- ok = true;
- }
- }
+ if (d == NULL) {
+ error = __mkSmallInteger(__threadErrno);
+ } else {
+ dp = __MKEXTERNALADDRESS(d); __INST(dirPointer) = dp; __STORE(self, dp);
+ ok = true;
+ }
}
-#else
-#ifdef __win32__
+#elif defined(__win32__)
HANDLE d;
OBJ path, dp;
union {
- char pattern[MAXPATHLEN];
- wchar_t wpattern[MAXPATHLEN];
+ char pattern[MAXPATHLEN];
+ wchar_t wpattern[MAXPATHLEN];
} uP;
union {
- WIN32_FIND_DATAA data;
- WIN32_FIND_DATAW wdata;
+ WIN32_FIND_DATAA data;
+ WIN32_FIND_DATAW wdata;
} uD;
- ok = false;
if (__INST(dirPointer) == nil) {
- path = __INST(pathName);
- if (__isStringLike(path)) {
- int l = __stringSize(path);
+ path = __INST(pathName);
+ if (__isStringLike(path)) {
+ int l = __stringSize(path);
- if (l < (MAXPATHLEN-4)) {
- strncpy(uP.pattern, __stringVal(path), l);
- strcpy(uP.pattern+l, "\\*");
+ if (l < (MAXPATHLEN-4)) {
+ strncpy(uP.pattern, __stringVal(path), l);
+ strcpy(uP.pattern+l, "\\*");
- do {
- __threadErrno = 0;
- d = STX_API_NOINT_CALL2( "FindFirstFileA", FindFirstFileA, uP.pattern, &uD.data );
- } while ((d < 0) && (__threadErrno == EINTR));
+ do {
+ __threadErrno = 0;
+ d = STX_API_NOINT_CALL2( "FindFirstFileA", FindFirstFileA, uP.pattern, &uD.data );
+ } while ((d < 0) && (__threadErrno == EINTR));
- if (d == INVALID_HANDLE_VALUE) {
- error = __mkSmallInteger(GetLastError());
- } else {
- dp = __MKEXTERNALADDRESS(d); __INST(dirPointer) = dp; __STORE(self, dp);
+ if (d == INVALID_HANDLE_VALUE) {
+ error = __mkSmallInteger(GetLastError());
+ } else {
+ dp = __MKEXTERNALADDRESS(d); __INST(dirPointer) = dp; __STORE(self, dp);
- fileSize = __MKLARGEINT64(1, uD.data.nFileSizeLow, uD.data.nFileSizeHigh );
- osPathname = __MKSTRING( uD.data.cFileName );
- osFileAttributes = __mkSmallInteger( uD.data.dwFileAttributes );
+ fileSize = __MKLARGEINT64(1, uD.data.nFileSizeLow, uD.data.nFileSizeHigh );
+ osPathname = __MKSTRING( uD.data.cFileName );
+ osFileAttributes = __mkSmallInteger( uD.data.dwFileAttributes );
- osCrtTime = FileTimeToOsTime1970(&uD.data.ftCreationTime);
- osAccTime = FileTimeToOsTime1970(&uD.data.ftLastAccessTime);
- osModTime = FileTimeToOsTime1970(&uD.data.ftLastWriteTime);
- ok = true;
- }
- }
- }
- else if (__isUnicode16String(path)) {
- int l = __unicode16StringSize(path);
- int i;
+ osCrtTime = FileTimeToOsTime1970(&uD.data.ftCreationTime);
+ osAccTime = FileTimeToOsTime1970(&uD.data.ftLastAccessTime);
+ osModTime = FileTimeToOsTime1970(&uD.data.ftLastWriteTime);
+ ok = true;
+ }
+ }
+ }
+ else if (__isUnicode16String(path)) {
+ int l = __unicode16StringSize(path);
+ int i;
- if (l < (MAXPATHLEN-4)) {
- for (i=0; i<l; i++) {
- uP.wpattern[i] = __unicode16StringVal(path)[i];
- }
- uP.wpattern[i++] = '\\';
- uP.wpattern[i++] = '*';
- uP.wpattern[i] = 0;
+ if (l < (MAXPATHLEN-4)) {
+ for (i=0; i<l; i++) {
+ uP.wpattern[i] = __unicode16StringVal(path)[i];
+ }
+ uP.wpattern[i++] = '\\';
+ uP.wpattern[i++] = '*';
+ uP.wpattern[i] = 0;
- do {
- __threadErrno = 0;
- d = STX_API_NOINT_CALL2( "FindFirstFileW", FindFirstFileW, uP.wpattern, &uD.wdata );
- } while ((d < 0) && (__threadErrno == EINTR));
+ do {
+ __threadErrno = 0;
+ d = STX_API_NOINT_CALL2( "FindFirstFileW", FindFirstFileW, uP.wpattern, &uD.wdata );
+ } while ((d < 0) && (__threadErrno == EINTR));
- if (d == INVALID_HANDLE_VALUE) {
- error = __mkSmallInteger(GetLastError());
- } else {
- dp = __MKEXTERNALADDRESS(d); __INST(dirPointer) = dp; __STORE(self, dp);
+ if (d == INVALID_HANDLE_VALUE) {
+ error = __mkSmallInteger(GetLastError());
+ } else {
+ dp = __MKEXTERNALADDRESS(d); __INST(dirPointer) = dp; __STORE(self, dp);
- fileSize = __MKLARGEINT64(1, uD.wdata.nFileSizeLow, uD.wdata.nFileSizeHigh );
- osPathname = __MKU16STRING( uD.wdata.cFileName );
- osFileAttributes = __mkSmallInteger( uD.data.dwFileAttributes );
+ fileSize = __MKLARGEINT64(1, uD.wdata.nFileSizeLow, uD.wdata.nFileSizeHigh );
+ osPathname = __MKU16STRING( uD.wdata.cFileName );
+ osFileAttributes = __mkSmallInteger( uD.data.dwFileAttributes );
- osCrtTime = FileTimeToOsTime1970(&uD.wdata.ftCreationTime);
- osAccTime = FileTimeToOsTime1970(&uD.wdata.ftLastAccessTime);
- osModTime = FileTimeToOsTime1970(&uD.wdata.ftLastWriteTime);
- ok = true;
- }
- }
- }
+ osCrtTime = FileTimeToOsTime1970(&uD.wdata.ftCreationTime);
+ osAccTime = FileTimeToOsTime1970(&uD.wdata.ftLastAccessTime);
+ osModTime = FileTimeToOsTime1970(&uD.wdata.ftLastWriteTime);
+ ok = true;
+ }
+ }
+ }
}
-#endif
-#endif
+#endif // __win32__
%}.
ok == true ifTrue:[
- self registerForFinalization.
- osPathname isNil ifTrue:[
- "UNIX: does not automatically provide the first entry"
+ self registerForFinalization.
+ osPathname isNil ifTrue:[
+ "UNIX: does not automatically provide the first entry"
- (StreamError,StreamIOError) handle:[:ex |
- self close.
- ex reject.
- ] do:[
- readAheadEntry := OperatingSystem nextLinkInfoFrom:self dirPointer:dirPointer.
- ].
- ] ifFalse:[
- "Windows already provides the first entry's info"
+ (StreamError,StreamIOError) handle:[:ex |
+ self close.
+ ex reject.
+ ] do:[
+ readAheadEntry := OperatingSystem nextLinkInfoFrom:self dirPointer:dirPointer.
+ ].
+ ] ifFalse:[
+ "Windows already provides the first entry's info"
- readAheadEntry := OperatingSystem
- linkInfoFor:osPathname
- fileSize:fileSize
- fileAttributes:osFileAttributes
- osCrtTime:osCrtTime
- osAccTime:osAccTime
- osModTime:osModTime
- ].
+ readAheadEntry := OperatingSystem
+ linkInfoFor:osPathname
+ fileSize:fileSize
+ fileAttributes:osFileAttributes
+ osCrtTime:osCrtTime
+ osAccTime:osAccTime
+ osModTime:osModTime
+ ].
- ^ self
+ ^ self
].
ok notNil ifTrue:[
- dirPointer notNil ifTrue:[^ self errorAlreadyOpen].
+ dirPointer notNil ifTrue:[^ self errorAlreadyOpen].
].
error notNil ifTrue:[
- ^ self openError:(lastErrorNumber := error).
+ ^ self openError:(lastErrorNumber := error).
].
^ nil
+
+ "Modified: / 09-04-2018 / 19:03:18 / stefan"
!
reOpen
@@ -772,3 +767,4 @@
version_CVS
^ '$Header$'
! !
+