2 file-name.cc - implement File_name
4 source file of the Flower Library
6 (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
7 Jan Nieuwenhuizen <janneke@gnu.org>
10 #include "file-name.hh"
23 #include <sys/cygwin.h>
40 dos_to_posix (std::string file_name)
42 char buf[PATH_MAX] = "";
43 char *s = file_name.get_copy_str0 ();
44 /* ugh: char const* argument gets modified. */
45 int fail = cygwin_conv_to_posix_path (s, buf);
51 #endif /* __CYGWIN__ */
53 /** Use slash as directory separator. On Windows, they can pretty
56 static /* avoid warning */
59 slashify (std::string file_name)
61 replace_all (file_name, '\\', '/');
62 replace_all (file_name, std::string ("//"), "/");
66 /* Join components to full file_name. */
68 File_name::to_string () const
72 s = root_ + std::to_string (ROOTSEP);
76 if (!base_.empty () || !ext_.empty ())
77 s += std::to_string (DIRSEP);
81 s += std::to_string (EXTSEP) + ext_;
85 File_name::File_name (std::string file_name)
88 /* All system functions would work, even if we do not convert to
89 posix file_name, but we would think that \foe\bar\baz.ly is in
91 file_name = dos_to_posix (file_name);
94 file_name = slashify (file_name);
97 ssize i = file_name.find (ROOTSEP);
100 root_ = file_name.substr (0, i);
101 file_name = file_name.substr (i + 1);
104 i = file_name.rfind (DIRSEP);
107 dir_ = file_name.substr (0, i);
108 file_name = file_name.substr (i + 1);
111 i = file_name.rfind ('.');
114 base_ = file_name.substr (0, i);
115 ext_ = file_name.substr (i + 1);
122 File_name::is_absolute () const
125 Hmm. Is c:foo absolute?
127 return (dir_.length () && dir_[0] == DIRSEP) || root_.length ();