X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Futils.cpp;h=6c48d62a5eecfbafe855cf70b07fb4f2cf553f0b;hp=bae91cc50898ad83838749f58987a9c3a182d61a;hb=05ea50ffd15fa74ab1059df2c63442fdf83dec96;hpb=6f4ac56492d45c04df0f205252b3c3210e319b4f diff --git a/source/utils.cpp b/source/utils.cpp index bae91cc..6c48d62 100644 --- a/source/utils.cpp +++ b/source/utils.cpp @@ -8,8 +8,10 @@ Distributed under the LGPL #include #ifndef WIN32 #include +#else +#include #endif -#include +#include #include "path.h" #include "utils.h" @@ -55,6 +57,14 @@ Path fix_case(const Path &path) return result; } +/** +Creates the given directory and any parent directories if needed. + +@param path The path to create +@param mode Access mode for new directories + +@return 0 on success, -1 on error +*/ int mkpath(const Path &path, int mode) { Path p; @@ -81,6 +91,7 @@ int mkpath(const Path &path, int mode) { #ifdef WIN32 // The win32 version of this function doesn't take the mode argument. Go figure. + (void)mode; err=mkdir(p.str().c_str()); #else err=mkdir(p.str().c_str(),mode); @@ -125,7 +136,8 @@ list list_files(const Path &path) while(dirent *de=readdir(dir)) { const char *fn=de->d_name; - if(fn[0]=='.' && (fn[1]==0 || (fn[1]=='.' && fn[2]==0))) continue; + if(fn[0]=='.' && (fn[1]==0 || (fn[1]=='.' && fn[2]==0))) + continue; result.push_back(fn); } closedir(dir); @@ -136,25 +148,55 @@ list list_files(const Path &path) bool exists(const Path &path) { struct stat st; - return !stat(path.str().c_str(),&st); + return !stat(path.str().c_str(), &st); } Filename splitext(const string &fn) { Filename result; unsigned dot=fn.rfind('.'); - result.base=fn.substr(0,dot); + result.base=fn.substr(0, dot); if(dot!=string::npos) result.ext=fn.substr(dot); return result; } -#ifndef WIN32 int fnmatch(const string &pat, const Path &fn) { +#ifdef WIN32 + return globcasematch(pat, fn); +#else return ::fnmatch(pat.c_str(), fn.str().c_str(), FNM_PATHNAME); -} #endif +} + +Path relative(const Path &path, const Path &base) +{ + Path::iterator i=path.begin(); + Path::iterator j=base.begin(); + for(; (i!=path.end() && j!=base.end() && *i==*j); ++i,++j); + + Path result; + for(; j!=base.end(); ++j) + result/=".."; + for(; i!=path.end(); ++i) + result/=*i; + + return result; +} + +/** +Extracts the basename from the given path. Same thing as Path::Path(p)[-1], +but faster. +*/ +string basename(const std::string &p) +{ + unsigned slash=p.rfind(DIRCHAR); + if(slash==string::npos) + return p; + else + return p.substr(slash+1); +} } // namespace Path } // namespace Msp