--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/DirStr.st Fri Jul 16 11:39:45 1993 +0200
@@ -0,0 +1,169 @@
+"
+ COPYRIGHT (c) 1989-93 by Claus Gittinger
+ All Rights Reserved
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice. This software may not
+ be provided or otherwise made available to, or used by, any
+ other person. No title to or ownership of the software is
+ hereby transferred.
+"
+
+FileStream subclass:#DirectoryStream
+ instanceVariableNames:'dirPointer readAhead'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Streams-External'
+!
+
+DirectoryStream comment:'
+
+COPYRIGHT (c) 1989-93 by Claus Gittinger
+ All Rights Reserved
+
+%W% %E%
+'!
+
+%{
+#include <stdio.h>
+#ifndef transputer
+# include <sys/types.h>
+# include <sys/stat.h>
+# ifdef OPENDIR
+# include <sys/types.h>
+# ifdef NEXT
+# include <sys/dir.h>
+# else
+# include <dirent.h>
+# endif
+# endif
+#endif
+%}
+
+!DirectoryStream methodsFor:'instance release'!
+
+closeFile
+ "a directoryStream has been collected - close it"
+%{
+#ifdef OPENDIR
+ closedir((DIR *)MKFD(_INST(dirPointer)));
+#endif
+%}
+! !
+
+!DirectoryStream class methodsFor:'instance creation'!
+
+directoryNamed:dirName
+ "return a DirectoryStream for directory named dirName, aString"
+
+ |newStream|
+
+ newStream := (self basicNew) pathName:dirName.
+ newStream openForReading isNil ifTrue:[^nil].
+ ^ newStream
+! !
+
+!DirectoryStream methodsFor:'access reading'!
+
+nextLine
+ "return the next filename as a string"
+
+ |prevEntry nextEntry|
+%{
+#ifdef OPENDIR
+ DIR *d;
+#ifdef NEXT
+ struct direct *dp;
+#else
+ struct dirent *dp;
+#endif
+
+ if (_INST(dirPointer) != nil) {
+ d = (DIR *)MKFD(_INST(dirPointer));
+ dp = readdir(d);
+ if (dp != NULL) {
+ nextEntry = _MKSTRING((char *)(dp->d_name) COMMA_CON);
+ }
+ }
+#endif
+%}
+.
+ prevEntry := readAhead.
+ readAhead := nextEntry.
+ ^ prevEntry
+! !
+
+!DirectoryStream methodsFor:'private'!
+
+openForReading
+ "open the file for readonly"
+
+ |retVal|
+
+ mode := #readonly.
+%{
+#ifdef OPENDIR
+ DIR *d;
+ OBJ path;
+ extern OBJ ErrorNumber, ErrorString;
+ extern errno;
+
+ retVal = false;
+ if (_INST(dirPointer) == nil) {
+ path = _INST(pathName);
+ if (_isString(path)) {
+ d = opendir((char *) _stringVal(path));
+ if (d == NULL) {
+ /* ErrorString = _MKSTRING(perror("popen:") COMMA_CON); */
+ ErrorNumber = _MKSMALLINT(errno);
+ } else {
+ _INST(dirPointer) = MKOBJ(d);
+ retVal = true;
+ }
+ }
+ }
+#endif
+%}
+.
+ retVal isNil ifTrue:[
+ "opendir not avalable - use slow pipe"
+ ^ PipeStream readingFrom:('cd ' , pathName , '; ls -a')
+ ].
+ (retVal == true) ifTrue:[
+ lobby register:self.
+ self nextLine. "read 1st entry into readAhead buffer"
+ ^ self
+ ].
+ ^ nil
+!
+
+reOpen
+ "sent after snapin to reopen streams"
+
+ filePointer notNil ifTrue:[
+ "it was open, when snapped-out"
+ filePointer := nil.
+ 'cannot reopen directorystream' printNewline
+ ]
+! !
+
+!DirectoryStream methodsFor:'testing'!
+
+atEnd
+ "return true, if position is at end"
+
+ ^ readAhead == nil
+! !
+
+!DirectoryStream methodsFor:'closing'!
+
+close
+ "close the stream - tell operating system"
+
+ dirPointer notNil ifTrue:[
+ lobby unregister:self.
+ self closeFile.
+ dirPointer := nil
+ ]
+! !