6b97ac7e3a4083f04b3c0ff8035fb1d5468d612b
[ardour.git] / libs / pbd3 / dirname.cc
1 #include <cstdio>
2 #include <cstdlib>
3 #include <string>
4 #include <pbd/dirname.h>
5
6
7 char *
8 PBD::dirname (const char *path)
9
10 {
11         char *slash;
12         size_t len;
13         char *ret;
14         
15         if ((slash = strrchr (path, '/')) == 0) {
16                 return strdup (path);
17         }
18         
19         if (*(slash+1) == '\0') {
20                 return strdup ("");
21         }
22
23         len = (size_t) (slash - path);
24         ret = (char *) malloc (sizeof (char) * (len + 1));
25
26         snprintf (ret, len, "%*s", (int)len, path);
27         return ret;
28 }
29
30 std::string 
31 PBD::dirname (const std::string str)
32 {
33         std::string::size_type slash = str.find_last_of ('/');
34         std::string dir;
35
36         if (slash == std::string::npos) {
37                 return str;
38         }
39
40         /* remove trailing multiple slashes (legal under POSIX) */
41
42         dir = str.substr (0, slash);
43         slash = dir.length();
44
45         while (slash > 1 && dir[slash-1] == '/') {
46                 slash--;
47                 dir = dir.substr (0, slash);
48         }
49
50         return dir;
51 }