DirectoryStream.st
changeset 11294 ecf21f4ab995
parent 11288 c71a04b0e26c
child 11302 c8e8b9cde3d7
equal deleted inserted replaced
11293:4b08b41f0488 11294:ecf21f4ab995
   630     DIR *d;
   630     DIR *d;
   631     OBJ path, dp;
   631     OBJ path, dp;
   632 
   632 
   633     ok = false;
   633     ok = false;
   634     if (__INST(dirPointer) == nil) {
   634     if (__INST(dirPointer) == nil) {
   635 	path = __INST(pathName);
   635         path = __INST(pathName);
   636 	if (__isString(path)) {
   636         if (__isString(path)) {
   637 	    __BEGIN_INTERRUPTABLE__
   637             __BEGIN_INTERRUPTABLE__
   638 	    __threadErrno = 0;
   638             __threadErrno = 0;
   639 	    do {
   639             do {
   640 		path = __INST(pathName);
   640                 path = __INST(pathName);
   641 		d = opendir((char *) __stringVal(path));
   641                 d = opendir((char *) __stringVal(path));
   642 	    } while ((d == NULL) && (__threadErrno == EINTR));
   642             } while ((d == NULL) && (__threadErrno == EINTR));
   643 	    __END_INTERRUPTABLE__
   643             __END_INTERRUPTABLE__
   644 
   644 
   645 	    if (d == NULL) {
   645             if (d == NULL) {
   646 		__INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
   646                 __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno);
   647 	    } else {
   647             } else {
   648 		dp = __MKEXTERNALADDRESS(d); __INST(dirPointer) = dp; __STORE(self, dp);
   648                 dp = __MKEXTERNALADDRESS(d); __INST(dirPointer) = dp; __STORE(self, dp);
   649 		ok = true;
   649                 ok = true;
   650 	    }
   650             }
   651 	}
   651         }
   652     }
   652     }
   653 #else
   653 #else
   654 # ifdef WIN32
   654 # ifdef WIN32
       
   655 #  ifndef MAXPATHLEN 
       
   656 #   define MAXPATHLEN 1024
       
   657 #  endif
   655     HANDLE d;
   658     HANDLE d;
   656     OBJ path, dp;
   659     OBJ path, dp;
   657     char pattern[512];
   660     union {
   658     WIN32_FIND_DATA data;
   661         char pattern[MAXPATHLEN];
       
   662         wchar_t wpattern[MAXPATHLEN];
       
   663     } uP;
       
   664     union {
       
   665         WIN32_FIND_DATAA data;
       
   666         WIN32_FIND_DATAW wdata;
       
   667     } uD;
   659 
   668 
   660     ok = false;
   669     ok = false;
   661     if (__INST(dirPointer) == nil) {
   670     if (__INST(dirPointer) == nil) {
   662 	path = __INST(pathName);
   671         path = __INST(pathName);
   663 	if (__isString(path)) {
   672         if (__isString(path)) {
   664 	    int l = __stringSize(path);
   673             int l = __stringSize(path);
   665 
   674 
   666 	    if (l < (sizeof(pattern)-4)) {
   675             if (l < (MAXPATHLEN-4)) {
   667 		strncpy(pattern, __stringVal(path), l);
   676                 strncpy(uP.pattern, __stringVal(path), l);
   668 		strcpy(pattern+l, "\\*");
   677                 strcpy(uP.pattern+l, "\\*");
   669 
   678 
   670 		do {
   679                 do {
   671 		    __threadErrno = 0;
   680                     __threadErrno = 0;
   672 		    d = STX_API_CALL2( "FindFirstFile", FindFirstFile, pattern, &data );
   681                     d = STX_API_CALL2( "FindFirstFile", FindFirstFile, uP.pattern, &uD.data );
   673 		} while ((d < 0) && (__threadErrno == EINTR));
   682                 } while ((d < 0) && (__threadErrno == EINTR));
   674 
   683 
   675 		if (d == INVALID_HANDLE_VALUE) {
   684                 if (d == INVALID_HANDLE_VALUE) {
   676 		    __INST(lastErrorNumber) = __mkSmallInteger(GetLastError());
   685                     __INST(lastErrorNumber) = __mkSmallInteger(GetLastError());
   677 		} else {
   686                 } else {
   678 		    dp = __MKEXTERNALADDRESS(d); __INST(dirPointer) = dp; __STORE(self, dp);
   687                     dp = __MKEXTERNALADDRESS(d); __INST(dirPointer) = dp; __STORE(self, dp);
   679 		    entry = __MKSTRING( data.cFileName );
   688                     entry = __MKSTRING( uD.data.cFileName );
   680 		    ok = true;
   689                     ok = true;
   681 		}
   690                 }
   682 	    }
   691             }
   683 	}
   692         }
       
   693         else if (__isUnicode16String(path)) {
       
   694             int l = __unicode16StringSize(path);
       
   695             int i;
       
   696 
       
   697             if (l < (MAXPATHLEN-4)) {
       
   698                 for (i=0; i<l; i++) {
       
   699                     uP.wpattern[i] = __unicode16StringVal(path)[i];
       
   700                 }
       
   701                 uP.wpattern[i++] = '\\';
       
   702                 uP.wpattern[i++] = '*';
       
   703                 uP.wpattern[i] = 0;
       
   704 
       
   705                 do {
       
   706                     __threadErrno = 0;
       
   707                     d = STX_API_CALL2( "FindFirstFileW", FindFirstFileW, uP.wpattern, &uD.wdata );
       
   708                 } while ((d < 0) && (__threadErrno == EINTR));
       
   709 
       
   710                 if (d == INVALID_HANDLE_VALUE) {
       
   711                     __INST(lastErrorNumber) = __mkSmallInteger(GetLastError());
       
   712                 } else {
       
   713                     dp = __MKEXTERNALADDRESS(d); __INST(dirPointer) = dp; __STORE(self, dp);
       
   714                     entry = __MKU16STRING( uD.wdata.cFileName );
       
   715                     ok = true;
       
   716                 }
       
   717             }
       
   718         }
   684     }
   719     }
   685 # endif
   720 # endif
   686 #endif
   721 #endif
   687 %}.
   722 %}.
   688     ok isNil ifTrue:[
   723     ok isNil ifTrue:[
   689 	"
   724         "
   690 	 opendir not avalable - use slower pipe
   725          opendir not avalable - use slower pipe
   691 	"
   726         "
   692 	^ PipeStream readingFrom:('cd ' , pathName , '; ls -a')
   727         ^ PipeStream readingFrom:('cd ' , pathName , '; ls -a')
   693     ].
   728     ].
   694 
   729 
   695     (ok == true) ifTrue:[
   730     (ok == true) ifTrue:[
   696 	Lobby register:self.
   731         Lobby register:self.
   697 	entry isNil ifTrue:[
   732         entry isNil ifTrue:[
   698 	    self nextLine. "read 1st entry into readAheadEntry buffer"
   733             self nextLine. "read 1st entry into readAheadEntry buffer"
   699 	] ifFalse:[
   734         ] ifFalse:[
   700 	    readAheadEntry := entry.
   735             readAheadEntry := entry.
   701 	].
   736         ].
   702 	^ self
   737         ^ self
   703     ].
   738     ].
   704     dirPointer notNil ifTrue:[^ self errorAlreadyOpen].
   739     dirPointer notNil ifTrue:[^ self errorAlreadyOpen].
   705     lastErrorNumber notNil ifTrue:[^ self openError].
   740     lastErrorNumber notNil ifTrue:[^ self openError].
   706     ^ nil
   741     ^ nil
   707 !
   742 !
   746 ! !
   781 ! !
   747 
   782 
   748 !DirectoryStream class methodsFor:'documentation'!
   783 !DirectoryStream class methodsFor:'documentation'!
   749 
   784 
   750 version
   785 version
   751     ^ '$Header: /cvs/stx/stx/libbasic/DirectoryStream.st,v 1.64 2008-10-30 13:18:13 cg Exp $'
   786     ^ '$Header: /cvs/stx/stx/libbasic/DirectoryStream.st,v 1.65 2008-10-30 16:25:55 cg Exp $'
   752 ! !
   787 ! !