*/
#include <stdio.h>
+#include <stdlib.h> /* for qsort */
+#include "config.h" /* to check for dirent.h */
#ifdef SEL_FILE_IGNORE_CASE
#include <ctype.h>
#endif /* def SEL_FILE_IGNORE_CASE */
-#include "selfile.h"
-
-#if defined(SVR4) || defined(SYSV) || defined(USG) || defined(__osf__)
+#ifdef HAVE_DIRENT_H
#include <dirent.h>
-#else /* defined(SVR4) || defined(SYSV) || defined(USG) */
+#else
#include <sys/dir.h>
#define dirent direct
-#endif /* defined(SVR4) || defined(SYSV) || defined(USG) */
+#endif
#include <sys/stat.h>
-#if defined(SVR4) || defined(SYSV) || defined(USG)
-extern void qsort();
-#endif /* defined(SVR4) || defined(SYSV) || defined(USG) */
+#include "selfile.h"
#ifdef SEL_FILE_IGNORE_CASE
int
(void) stat(".", &statBuf);
dir->mtime = statBuf.st_mtime;
- (void) readdir(dirp); /* throw away "." */
+ while (dp = readdir(dirp)) {
+ struct stat statBuf;
+ if(!strcmp(dp->d_name, ".")) continue; /* Throw away "." */
+ if(!strcmp(dp->d_name, "..")) continue; /* Throw away ".." */
#ifndef S_IFLNK
- (void) readdir(dirp); /* throw away ".." */
#endif /* ndef S_IFLNK */
-
- while (dp = readdir(dirp)) {
if (i >= alloc) {
alloc = 2 * (alloc + 1);
result = (SFEntry *) XtRealloc((char *) result,
maxChars = len;
}
result[i].shown = result[i].real;
+ if(SFpathFlag) { // [HGM] only show directories
+ if (stat(str, &statBuf) || SFstatChar(&statBuf) != '/') continue;
+ } else if(SFfilterBuffer[0]) { // [HGM] filter on extension
+ char *p = SFfilterBuffer, match, *q;
+ match = !(stat(str, &statBuf) || SFstatChar(&statBuf) != '/');
+ do {
+ if(q = strchr(p, ' ')) *q = 0;
+ if(strstr(str, p)) match++;
+ if(q) *q = ' ';
+ } while(q && (p = q+1));
+ if(!match) continue;
+ }
i++;
}
-#if defined(SVR4) || defined(SYSV) || defined(USG)
- qsort((char *) result, (unsigned) i, sizeof(SFEntry), SFcompareEntries);
-#else /* defined(SVR4) || defined(SYSV) || defined(USG) */
- qsort((char *) result, i, sizeof(SFEntry), SFcompareEntries);
-#endif /* defined(SVR4) || defined(SYSV) || defined(USG) */
+ qsort((char *) result, (size_t) i, sizeof(SFEntry), SFcompareEntries);
dir->entries = result;
dir->nEntries = i;