Implement -autoCopyPV
[xboard.git] / filebrowser / dir.c
index 102187e..ff317e5 100644 (file)
  */
 
 #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
@@ -123,13 +121,13 @@ SFgetDir(dir)
        (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,
@@ -144,14 +142,22 @@ SFgetDir(dir)
                        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;