/*
path.cc - manipulation of paths and filenames.
*/
+
+#include "config.h"
#include <stdio.h>
-#include "config.hh"
+#include <errno.h>
+#if HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
#include "file-path.hh"
#include "flower-debug.hh"
-/** find a file.
+/** Find a file.
It will search in the current dir, in the construction-arg, and
in any other added path, in this order.
String
File_path::find (String nm) const
{
- fdebug << "looking for" << nm << ": ";
+ DEBUG_OUT << "looking for" << nm << ": ";
if (!nm.length_i() || (nm == "-") )
return nm;
for (int i=0; i < size(); i++)
path += nm;
- fdebug << path << "? ";
+ DEBUG_OUT << path << "? ";
+
+#if 0
+ /*
+ Check if directory. TODO: encapsulate for autoconf
+ */
+ struct stat sbuf;
+ if (stat (path.ch_C(), &sbuf) == ENOENT)
+ continue;
+
+ if (!(sbuf.st_mode & __S_IFREG))
+ continue;
+#endif
+#if !STAT_MACROS_BROKEN
+ struct stat sbuf;
+ if (stat (path.ch_C (), &sbuf) == ENOENT)
+ continue;
+
+ if (S_ISDIR (sbuf.st_mode))
+ continue;
+#endif
+
FILE *f = fopen (path.ch_C(), "r"); // ugh!
if (f)
{
- fdebug << "found\n";
+ DEBUG_OUT << "found\n";
fclose (f);
return path;
}
}
- fdebug << '\n';
+ DEBUG_OUT << '\n';
return "";
}
+/**
+ Add a directory, return false if failed
+ */
+bool
+File_path::try_add (String s)
+{
+ if (s == "")
+ s = ".";
+ FILE * f = fopen (s.ch_C(), "r");
+ if (!f)
+ return false;
+ fclose (f);
+
+ push (s);
+ return true;
+}
+
void
File_path::add (String s)
{
- push (s);
+ push (s);
+}
+
+String
+File_path::str () const
+{
+ String s;
+ for (int i=0; i< size (); i++)
+ {
+ s = s + elem (i);
+ if (i < size () -1 )
+ s += ":";
+ }
+ return s;
}