X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=flower%2Ffile-name.cc;h=990e3d6d9161d983860b0c380e1a1139b17edf9c;hb=97a0169312a260933246ab224e4f8b0969871dd5;hp=21fec4e4b1a8a8a5a054edef2f32ae3175a9c566;hpb=2d6c005d7e1f82fee33060ea18d4d32ec626ddbc;p=lilypond.git diff --git a/flower/file-name.cc b/flower/file-name.cc index 21fec4e4b1..990e3d6d91 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--2015 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; @@ -21,10 +33,6 @@ using namespace std; #include #endif -#ifdef __CYGWIN__ -#include -#endif - #ifndef ROOTSEP #define ROOTSEP ':' #endif @@ -37,36 +45,21 @@ using namespace std; #define EXTSEP '.' #endif -#ifdef __CYGWIN__ -static string -dos_to_posix (string file_name) -{ - char buf[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); - if (!fail) - return buf; - return file_name; -} -#endif /* __CYGWIN__ */ - /** Use slash as directory separator. On Windows, they can pretty 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; } string -dir_name (string const file_name) +dir_name (const string &file_name) { string s = file_name; s = slashify (s); @@ -77,17 +70,28 @@ dir_name (string const file_name) s = s.substr (0, s.rfind ('/')); else s = ""; - + return s; } string get_working_directory () { - char cwd[PATH_MAX]; - getcwd (cwd, PATH_MAX); - - return string (cwd); +#ifdef PATH_MAX + vector cwd (PATH_MAX); +#else + vector cwd (1024); +#endif + while (getcwd (cwd.data (), cwd.size ()) == NULL) + { + if (errno != ERANGE) + { + // getcwd () fails. + return ""; + } + cwd.resize (cwd.size () * 2); + } + return string (cwd.data ()); } /* Join components to full file_name. */ @@ -106,7 +110,6 @@ File_name::dir_part () const return s; } - string File_name::file_part () const { @@ -124,7 +127,7 @@ File_name::to_string () const string f = file_part (); if (!f.empty () - && !dir_.empty()) + && !dir_.empty ()) { d += ::to_string (DIRSEP); } @@ -134,12 +137,6 @@ File_name::to_string () const File_name::File_name (string file_name) { -#ifdef __CYGWIN__ - /* All system functions would work, even if we do not convert to - posix file_name, but we would think that \foe\bar\baz.ly is in - the cwd. */ - file_name = dos_to_posix (file_name); -#endif #ifdef __MINGW32__ file_name = slashify (file_name); #endif @@ -172,8 +169,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; +}