summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthias Melcher <fltk@matthiasm.com>2007-01-22 11:14:29 +0000
committerMatthias Melcher <fltk@matthiasm.com>2007-01-22 11:14:29 +0000
commite4586d1572fe52fa16f5a6538f215e7d45c898af (patch)
treef043ad575b969d9223ce927229df414d6612d35a /src
parent9e79fd13d2b56f25e893298e6476f2a858f6adf6 (diff)
Removed 'optimization' for fl_filename_isdir which would break the original purpose of the fuction (testing the *existence* of a directory). But I did not want to lose the performance in the directory chooser where I *know* that a directory exists, just not if it is a file or directory, so I added the function fl_filename_isdir_quick() to do just that. Please verify that the new version works as expected, especially with regard to the directory chooser.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@5630 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src')
-rw-r--r--src/Fl_File_Browser.cxx2
-rw-r--r--src/Fl_File_Chooser2.cxx12
-rw-r--r--src/filename_isdir.cxx24
3 files changed, 26 insertions, 12 deletions
diff --git a/src/Fl_File_Browser.cxx b/src/Fl_File_Browser.cxx
index abb6ff697..f5e02587d 100644
--- a/src/Fl_File_Browser.cxx
+++ b/src/Fl_File_Browser.cxx
@@ -600,7 +600,7 @@ Fl_File_Browser::load(const char *directory,// I - Directory to load
icon = Fl_File_Icon::find(filename);
if ((icon && icon->type() == Fl_File_Icon::DIRECTORY) ||
- fl_filename_isdir(filename)) {
+ fl_filename_isdir_quick(filename)) {
num_dirs ++;
insert(num_dirs, files[i]->d_name, icon);
} else if (filetype_ == FILES &&
diff --git a/src/Fl_File_Chooser2.cxx b/src/Fl_File_Chooser2.cxx
index 8de0f4d61..77ba45850 100644
--- a/src/Fl_File_Chooser2.cxx
+++ b/src/Fl_File_Chooser2.cxx
@@ -412,9 +412,9 @@ Fl_File_Chooser::fileListCB()
if (Fl::event_clicks()) {
#if (defined(WIN32) && ! defined(__CYGWIN__)) || defined(__EMX__)
if ((strlen(pathname) == 2 && pathname[1] == ':') ||
- fl_filename_isdir(pathname))
+ fl_filename_isdir_quick(pathname))
#else
- if (fl_filename_isdir(pathname))
+ if (fl_filename_isdir_quick(pathname))
#endif /* WIN32 || __EMX__ */
{
// Change directories...
@@ -477,7 +477,7 @@ Fl_File_Chooser::fileListCB()
if (callback_) (*callback_)(this, data_);
// Activate the OK button as needed...
- if (!fl_filename_isdir(pathname) || (type_ & DIRECTORY))
+ if (!fl_filename_isdir_quick(pathname) || (type_ & DIRECTORY))
okButton->activate();
else
okButton->deactivate();
@@ -544,15 +544,15 @@ Fl_File_Chooser::fileNameCB()
// Enter pressed - select or change directory...
#if (defined(WIN32) && ! defined(__CYGWIN__)) || defined(__EMX__)
if ((isalpha(pathname[0] & 255) && pathname[1] == ':' && !pathname[2]) ||
- fl_filename_isdir(pathname) &&
+ fl_filename_isdir_quick(pathname) &&
compare_dirnames(pathname, directory_)) {
#else
- if (fl_filename_isdir(pathname) &&
+ if (fl_filename_isdir_quick(pathname) &&
compare_dirnames(pathname, directory_)) {
#endif /* WIN32 || __EMX__ */
directory(pathname);
} else if ((type_ & CREATE) || access(pathname, 0) == 0) {
- if (!fl_filename_isdir(pathname) || (type_ & DIRECTORY)) {
+ if (!fl_filename_isdir_quick(pathname) || (type_ & DIRECTORY)) {
// Update the preview box...
update_preview();
diff --git a/src/filename_isdir.cxx b/src/filename_isdir.cxx
index f1a3d2909..b917613d9 100644
--- a/src/filename_isdir.cxx
+++ b/src/filename_isdir.cxx
@@ -40,18 +40,22 @@ static inline int isdirsep(char c) {return c=='/' || c=='\\';}
#define isdirsep(c) ((c)=='/')
#endif
-int fl_filename_isdir(const char* n) {
- struct stat s;
-
+int fl_filename_isdir_quick(const char* n) {
// Do a quick optimization for filenames with a trailing slash...
if (*n && isdirsep(n[strlen(n) - 1])) return 1;
+ return fl_filename_isdir(n);
+}
-#ifdef WIN32
+int fl_filename_isdir(const char* n) {
+ struct stat s;
char fn[1024];
int length;
+
+ length = strlen(n);
+
+#ifdef WIN32
// This workaround brought to you by the fine folks at Microsoft!
// (read lots of sarcasm in that...)
- length = strlen(n);
if (length < (int)(sizeof(fn) - 1)) {
if (length < 4 && isalpha(n[0]) && n[1] == ':' &&
(isdirsep(n[2]) || !n[2])) {
@@ -67,6 +71,16 @@ int fl_filename_isdir(const char* n) {
n = fn;
}
}
+#else
+ // Matt: Actually, we found out that a trailling slash may also throw off
+ // some Unix implementations of stat, so cutting slashes is a must on every
+ // platform (thanks for that test, Greg)
+ if (length > 0 && isdirsep(n[length - 1])) {
+ length --;
+ memcpy(fn, n, length);
+ fn[length] = '\0';
+ n = fn;
+ }
#endif
return !stat(n, &s) && (s.st_mode&0170000)==0040000;