X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=flower%2Ffile-name.cc;h=bb07ebccd0f03576bedd90f0e206158d9bcf4955;hb=5b4b0d6e9a197e8f9eb085b7c2ad78b8be3e5cfc;hp=787c27f25a2e18fa17fa0d28b58f10218010fbb8;hpb=3512ac1f9e6ac4d96f0a486ba8f5968ccf0ce507;p=lilypond.git diff --git a/flower/file-name.cc b/flower/file-name.cc index 787c27f25a..bb07ebccd0 100644 --- a/flower/file-name.cc +++ b/flower/file-name.cc @@ -3,7 +3,7 @@ source file of the Flower Library - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2008 Han-Wen Nienhuys Jan Nieuwenhuizen */ @@ -12,6 +12,7 @@ #include #include #include +#include using namespace std; @@ -42,7 +43,7 @@ static string dos_to_posix (string file_name) { char buf[PATH_MAX] = ""; - char s[PATH_MAX]; + char s[PATH_MAX] = {0}; file_name.copy (s, PATH_MAX - 1); /* ugh: char const* argument gets modified. */ int fail = cygwin_conv_to_posix_path (s, buf); @@ -60,8 +61,8 @@ static /* avoid warning */ string slashify (string file_name) { - replace_all (file_name, '\\', '/'); - replace_all (file_name, string ("//"), "/"); + replace_all (&file_name, '\\', '/'); + replace_all (&file_name, string ("//"), "/"); return file_name; } @@ -74,9 +75,7 @@ dir_name (string const file_name) if (n && s[n - 1] == '/') s[n - 1] = 0; if (s.rfind ('/') != NPOS) - { - s = s.substr (0, s.rfind ('/')); - } + s = s.substr (0, s.rfind ('/')); else s = ""; @@ -179,3 +178,26 @@ File_name::is_absolute () const return (dir_.length () && dir_[0] == DIRSEP) || root_.length (); } + + +File_name +File_name::canonicalized () const +{ + File_name c = *this; + + replace_all (&c.dir_, string ("//"), string ("/")); + + vector components = string_split (c.dir_, '/'); + vector new_components; + + for (vsize i = 0; i < components.size (); i++) + { + if (components[i] == "..") + new_components.pop_back (); + else + new_components.push_back (components[i]); + } + + c.dir_ = string_join (new_components, "/"); + return c; +}