DirectoryStream.st
changeset 11294 ecf21f4ab995
parent 11288 c71a04b0e26c
child 11302 c8e8b9cde3d7
--- 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 $'
 ! !