+ concat (dirs_, string_split (p, PATHSEP));
+}
+
+bool
+is_file (string file_name)
+{
+#if !STAT_MACROS_BROKEN
+ struct stat sbuf;
+ if (stat (file_name.c_str (), &sbuf) != 0)
+ return false;
+
+ return !S_ISDIR (sbuf.st_mode);
+#endif
+
+ if (FILE *f = fopen (file_name.c_str (), "r"))
+ {
+ fclose (f);
+ return true;
+ }
+
+ return false;
+}
+
+bool
+is_dir (string file_name)
+{
+ /*
+ canonicalize; in particular, trailing slashes should disappear.
+ */
+ file_name = File_name (file_name).to_string ();
+
+#if !STAT_MACROS_BROKEN
+ struct stat sbuf;
+ if (stat (file_name.c_str (), &sbuf) != 0)
+ return false;
+
+ return S_ISDIR (sbuf.st_mode);
+#endif
+
+ if (FILE *f = fopen (file_name.c_str (), "r"))