2 file-path.cc - implement File_path
4 source file of the Flower Library
6 (c) 1997--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 Jan Nieuwenhuizen <janneke@gnu.org>
10 #include "file-path.hh"
21 #include <sys/cygwin.h>
24 #include "file-name.hh"
32 File_path::directories () const
38 File_path::parse_path (String p)
41 while ((len = p.length ()) )
43 int i = p.index (PATHSEP);
46 append (p.left_string (i));
47 p = p.right_string (len - i - 1);
52 is_file (String file_name)
54 #if 0 /* Check if directory. TODO: encapsulate for autoconf */
56 if (stat (file_name.to_str0 (), &sbuf) != 0)
59 if (!(sbuf.st_mode & __S_IFREG))
62 #if !STAT_MACROS_BROKEN
64 if (stat (file_name.to_str0 (), &sbuf) != 0)
67 return !S_ISDIR (sbuf.st_mode);
70 if (FILE *f = fopen (file_name.to_str0 (), "r"))
80 is_dir (String file_name)
82 #if !STAT_MACROS_BROKEN
84 if (stat (file_name.to_str0 (), &sbuf) != 0)
87 return S_ISDIR (sbuf.st_mode);
90 if (FILE *f = fopen (file_name.to_str0 (), "r"))
101 Check absolute file name, search in the current dir (DUH! FIXME!),
102 in the construction-arg (what's that?), and in any other appended
103 directory, in this order.
106 The file name if found, or empty string if not found. */
109 File_path::find (String name) const
111 if (!name.length () || (name == "-"))
115 if (name[0] == '\\' || (name.length () > 2 && name[2] == '\\'))
116 programming_error ("file name not normalized: " + name);
117 #endif /* __MINGW32__ */
119 /* Handle absolute file name. */
120 File_name file_name (name);
121 if (file_name.dir_[0] == DIRSEP && is_file (file_name.to_string ()))
122 return file_name.to_string ();
124 for (int i = 0, n = size (); i < n; i++)
126 File_name dir = elem (i);
127 file_name.root_ = dir.root_;
129 file_name.dir_ = dir.to_string ();
130 if (is_file (file_name.to_string ()))
131 return file_name.to_string ();
138 Seach in the current dir (DUH! FIXME?), in the construction-arg
139 (what's that?, and in any other appended directory, in this order.
141 Search for NAME, or name without extension, or name with any of
142 EXTENSIONS, in that order.
145 The file name if found, or empty string if not found. */
147 File_path::find (String name, char const *extensions[])
149 File_name file_name (name);
150 if (name.is_empty () || name == "-")
151 file_name.base_ = "-";
154 String orig_ext = file_name.ext_;
155 for (int i = 0; extensions[i]; i++)
157 file_name.ext_ = orig_ext;
158 if (*extensions[i] && !file_name.ext_.is_empty ())
159 file_name.ext_ += ".";
160 file_name.ext_ += extensions[i];
161 if (!find (file_name.to_string ()).is_empty ())
164 /* Reshuffle extension */
165 file_name = File_name (file_name.to_string ());
167 return file_name.to_string ();
170 /** Append a directory, return false if failed. */
172 File_path::try_append (String s)
185 File_path::to_string () const
188 for (int i = 0, n = size (); i < n; i++)
192 s += ::to_string (PATHSEP);