]> git.donarmstrong.com Git - lilypond.git/blob - flower/file-name.cc
Fix some bugs in the dynamic engraver and PostScript backend
[lilypond.git] / flower / file-name.cc
1 /*
2   file-name.cc - implement File_name
3
4   source file of the Flower Library
5
6   (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
7   Jan Nieuwenhuizen <janneke@gnu.org>
8 */
9
10 #include "file-name.hh"
11
12 #include <cstdio>
13 #include <cerrno>
14 #include <unistd.h>
15
16 using namespace std;
17
18 #include "config.hh"
19
20 #if HAVE_SYS_STAT_H
21 #include <sys/stat.h>
22 #endif
23
24 #ifdef __CYGWIN__
25 #include <sys/cygwin.h>
26 #endif
27
28 #ifndef ROOTSEP
29 #define ROOTSEP ':'
30 #endif
31
32 #ifndef DIRSEP
33 #define DIRSEP '/'
34 #endif
35
36 #ifndef EXTSEP
37 #define EXTSEP '.'
38 #endif
39
40 #ifdef __CYGWIN__
41 static string
42 dos_to_posix (string file_name)
43 {
44   char buf[PATH_MAX] = "";
45   char s[PATH_MAX];
46   file_name.copy (s, PATH_MAX - 1);
47   /* ugh: char const* argument gets modified.  */
48   int fail = cygwin_conv_to_posix_path (s, buf);
49   if (!fail)
50     return buf;
51   return file_name;
52 }
53 #endif /* __CYGWIN__ */
54
55 /** Use slash as directory separator.  On Windows, they can pretty
56     much be exchanged.  */
57 #if 0
58 static /* avoid warning */
59 #endif 
60 string
61 slashify (string file_name)
62 {
63   replace_all (file_name, '\\', '/');
64   replace_all (file_name, string ("//"), "/");
65   return file_name;
66 }
67
68 string
69 dir_name (string const file_name)
70 {
71   string s = file_name;
72   s = slashify (s);
73   ssize n = s.length ();
74   if (n && s[n - 1] == '/')
75     s[n - 1] = 0;
76   s = s.substr (0, s.rfind ('/'));
77   return s;
78 }
79
80 string
81 get_working_directory ()
82 {
83   char cwd[PATH_MAX];
84   getcwd (cwd, PATH_MAX);
85
86   return string (cwd);
87 }
88
89 /* Join components to full file_name. */
90 string
91 File_name::to_string () const
92 {
93   string s;
94   if (!root_.empty ())
95     s = root_ + ::to_string (ROOTSEP);
96   if (!dir_.empty ())
97     {
98       s += dir_;
99       if (!base_.empty () || !ext_.empty ())
100         s += ::to_string (DIRSEP);
101     }
102   s += base_;
103   if (!ext_.empty ())
104     s += ::to_string (EXTSEP) + ext_;
105   return s;
106 }
107
108 File_name::File_name (string file_name)
109 {
110 #ifdef __CYGWIN__
111   /* All system functions would work, even if we do not convert to
112      posix file_name, but we would think that \foe\bar\baz.ly is in
113      the cwd.  */
114   file_name = dos_to_posix (file_name);
115 #endif
116 #ifdef __MINGW32__
117   file_name = slashify (file_name);
118 #endif
119
120   ssize i = file_name.find (ROOTSEP);
121   if (i != NPOS)
122     {
123       root_ = file_name.substr (0, i);
124       file_name = file_name.substr (i + 1);
125     }
126
127   i = file_name.rfind (DIRSEP);
128   if (i != NPOS)
129     {
130       dir_ = file_name.substr (0, i);
131       file_name = file_name.substr (i + 1);
132     }
133
134   i = file_name.rfind ('.');
135   if (i != NPOS)
136     {
137       base_ = file_name.substr (0, i);
138       ext_ = file_name.substr (i + 1);
139     }
140   else
141     base_ = file_name;
142 }
143
144 bool
145 File_name::is_absolute () const
146 {
147   /*
148     Hmm. Is c:foo absolute?  
149    */
150   return (dir_.length () && dir_[0] == DIRSEP) || root_.length ();
151 }
152