2 file-name.cc - implement File_name
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-name.hh"
23 #include <sys/cygwin.h>
26 /* We don't have multiple roots, set this to '\0'? */
41 dos_to_posix (String file_name
)
43 char buf
[PATH_MAX
] = "";
44 char *s
= file_name
.get_copy_str0 ();
45 /* ugh: char const* argument gets modified. */
46 int fail
= cygwin_conv_to_posix_path (s
, buf
);
52 #endif /* __CYGWIN__ */
55 /** Use slash as directory separator. On Windows, they can pretty
58 slashify (String file_name
)
60 file_name
.substitute ('\\', '/');
61 file_name
.substitute ("//", "/");
64 #endif /* __MINGW32__ */
66 /* Join components to full file_name. */
68 File_name::to_string () const
71 if (!root_
.is_empty ())
72 s
= root_
+ ::to_string (ROOTSEP
);
73 if (!dir_
.is_empty ())
76 if (!base_
.is_empty () || !ext_
.is_empty ())
77 s
+= ::to_string (DIRSEP
);
80 if (!ext_
.is_empty ())
81 s
+= ::to_string (EXTSEP
) + ext_
;
85 File_name::File_name (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 int i
= file_name
.index (ROOTSEP
);
100 root_
= file_name
.left_string (i
);
101 file_name
= file_name
.right_string (file_name
.length () - i
- 1);
104 i
= file_name
.index_last (DIRSEP
);
107 dir_
= file_name
.left_string (i
);
108 file_name
= file_name
.right_string (file_name
.length () - i
- 1);
111 i
= file_name
.index_last ('.');
114 base_
= file_name
.left_string (i
);
115 ext_
= file_name
.right_string (file_name
.length () - i
- 1);