--- 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<l; i++) {
+ uP.wpattern[i] = __unicode16StringVal(path)[i];
+ }
+ uP.wpattern[i++] = '\\';
+ uP.wpattern[i++] = '*';
+ uP.wpattern[i] = 0;
+
+ do {
+ __threadErrno = 0;
+ d = STX_API_CALL2( "FindFirstFileW", FindFirstFileW, uP.wpattern, &uD.wdata );
+ } 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 = __MKU16STRING( uD.wdata.cFileName );
+ ok = true;
+ }
+ }
+ }
}
# endif
#endif
%}.
ok isNil ifTrue:[
- "
- opendir not avalable - use slower pipe
- "
- ^ PipeStream readingFrom:('cd ' , pathName , '; ls -a')
+ "
+ opendir not avalable - use slower pipe
+ "
+ ^ PipeStream readingFrom:('cd ' , pathName , '; ls -a')
].
(ok == true) ifTrue:[
- Lobby register:self.
- entry isNil ifTrue:[
- self nextLine. "read 1st entry into readAheadEntry buffer"
- ] ifFalse:[
- readAheadEntry := entry.
- ].
- ^ self
+ Lobby register:self.
+ entry isNil ifTrue:[
+ self nextLine. "read 1st entry into readAheadEntry buffer"
+ ] ifFalse:[
+ readAheadEntry := entry.
+ ].
+ ^ self
].
dirPointer notNil ifTrue:[^ self errorAlreadyOpen].
lastErrorNumber notNil ifTrue:[^ self openError].
@@ -748,5 +783,5 @@
!DirectoryStream class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/DirectoryStream.st,v 1.64 2008-10-30 13:18:13 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/DirectoryStream.st,v 1.65 2008-10-30 16:25:55 cg Exp $'
! !