X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=flower%2Ffile-name.cc;h=c24c0731e4f237bccba2ac3dd1d0b8b450210a19;hb=e8f544af29c93145d122efa8dcfc0548d9b84f0b;hp=66b1aaa1149a38e03d394966985ffaa7878f1ac6;hpb=9f3572d98bb948c9689cd1f75401a029451fa001;p=lilypond.git diff --git a/flower/file-name.cc b/flower/file-name.cc index 66b1aaa114..c24c0731e4 100644 --- a/flower/file-name.cc +++ b/flower/file-name.cc @@ -1,10 +1,21 @@ /* - file-name.cc - implement File_name + This file is part of LilyPond, the GNU music typesetter. - source file of the Flower Library - - (c) 1997--2006 Han-Wen Nienhuys + Copyright (C) 1997--2012 Han-Wen Nienhuys Jan Nieuwenhuizen + + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ #include "file-name.hh" @@ -12,6 +23,7 @@ #include #include #include +#include using namespace std; @@ -42,7 +54,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); @@ -56,12 +68,12 @@ dos_to_posix (string file_name) much be exchanged. */ #if 0 static /* avoid warning */ -#endif +#endif 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; } @@ -73,7 +85,11 @@ dir_name (string const file_name) ssize n = s.length (); if (n && s[n - 1] == '/') s[n - 1] = 0; - s = s.substr (0, s.rfind ('/')); + if (s.rfind ('/') != NPOS) + s = s.substr (0, s.rfind ('/')); + else + s = ""; + return s; } @@ -81,30 +97,51 @@ string get_working_directory () { char cwd[PATH_MAX]; - getcwd (cwd, PATH_MAX); - - return string (cwd); + // getcwd returns NULL upon a failure, contents of cwd would be undefined! + return string (getcwd (cwd, PATH_MAX)); } /* Join components to full file_name. */ string -File_name::to_string () const +File_name::dir_part () const { string s; if (!root_.empty ()) s = root_ + ::to_string (ROOTSEP); + if (!dir_.empty ()) { s += dir_; - if (!base_.empty () || !ext_.empty ()) - s += ::to_string (DIRSEP); } - s += base_; + + return s; +} + +string +File_name::file_part () const +{ + string s; + s = base_; if (!ext_.empty ()) s += ::to_string (EXTSEP) + ext_; return s; } +string +File_name::to_string () const +{ + string d = dir_part (); + string f = file_part (); + + if (!f.empty () + && !dir_.empty ()) + { + d += ::to_string (DIRSEP); + } + + return d + f; +} + File_name::File_name (string file_name) { #ifdef __CYGWIN__ @@ -145,8 +182,29 @@ bool File_name::is_absolute () const { /* - Hmm. Is c:foo absolute? + Hmm. Is c:foo absolute? */ 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; +}