diff -r 4b08b41f0488 -r ecf21f4ab995 DirectoryStream.st --- a/DirectoryStream.st Thu Oct 30 16:54:13 2008 +0100 +++ b/DirectoryStream.st Thu Oct 30 17:25:55 2008 +0100 @@ -632,74 +632,109 @@ ok = false; if (__INST(dirPointer) == nil) { - path = __INST(pathName); - if (__isString(path)) { - __BEGIN_INTERRUPTABLE__ - __threadErrno = 0; - do { - path = __INST(pathName); - d = opendir((char *) __stringVal(path)); - } while ((d == NULL) && (__threadErrno == EINTR)); - __END_INTERRUPTABLE__ + path = __INST(pathName); + if (__isString(path)) { + __BEGIN_INTERRUPTABLE__ + __threadErrno = 0; + do { + path = __INST(pathName); + d = opendir((char *) __stringVal(path)); + } while ((d == NULL) && (__threadErrno == EINTR)); + __END_INTERRUPTABLE__ - if (d == NULL) { - __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno); - } else { - dp = __MKEXTERNALADDRESS(d); __INST(dirPointer) = dp; __STORE(self, dp); - ok = true; - } - } + if (d == NULL) { + __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno); + } else { + dp = __MKEXTERNALADDRESS(d); __INST(dirPointer) = dp; __STORE(self, dp); + ok = true; + } + } } #else # ifdef WIN32 +# ifndef MAXPATHLEN +# define MAXPATHLEN 1024 +# endif HANDLE d; OBJ path, dp; - char pattern[512]; - WIN32_FIND_DATA data; + union { + char pattern[MAXPATHLEN]; + wchar_t wpattern[MAXPATHLEN]; + } uP; + union { + WIN32_FIND_DATAA data; + WIN32_FIND_DATAW wdata; + } uD; ok = false; if (__INST(dirPointer) == nil) { - path = __INST(pathName); - if (__isString(path)) { - int l = __stringSize(path); + path = __INST(pathName); + if (__isString(path)) { + int l = __stringSize(path); - if (l < (sizeof(pattern)-4)) { - strncpy(pattern, __stringVal(path), l); - strcpy(pattern+l, "\\*"); + if (l < (MAXPATHLEN-4)) { + strncpy(uP.pattern, __stringVal(path), l); + strcpy(uP.pattern+l, "\\*"); + + do { + __threadErrno = 0; + d = STX_API_CALL2( "FindFirstFile", FindFirstFile, uP.pattern, &uD.data ); + } while ((d < 0) && (__threadErrno == EINTR)); - do { - __threadErrno = 0; - d = STX_API_CALL2( "FindFirstFile", FindFirstFile, pattern, &data ); - } while ((d < 0) && (__threadErrno == EINTR)); + if (d == INVALID_HANDLE_VALUE) { + __INST(lastErrorNumber) = __mkSmallInteger(GetLastError()); + } else { + dp = __MKEXTERNALADDRESS(d); __INST(dirPointer) = dp; __STORE(self, dp); + entry = __MKSTRING( uD.data.cFileName ); + ok = true; + } + } + } + else if (__isUnicode16String(path)) { + int l = __unicode16StringSize(path); + int i; - if (d == INVALID_HANDLE_VALUE) { - __INST(lastErrorNumber) = __mkSmallInteger(GetLastError()); - } else { - dp = __MKEXTERNALADDRESS(d); __INST(dirPointer) = dp; __STORE(self, dp); - entry = __MKSTRING( data.cFileName ); - ok = true; - } - } - } + if (l < (MAXPATHLEN-4)) { + for (i=0; i