X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Futils.cpp;h=6c48d62a5eecfbafe855cf70b07fb4f2cf553f0b;hp=a7037ce33640a5d876c17ba16430443a484e884c;hb=05ea50ffd15fa74ab1059df2c63442fdf83dec96;hpb=9a8993b390544fb3e6b23ed562e2a2d4a62e4a7c diff --git a/source/utils.cpp b/source/utils.cpp index a7037ce..6c48d62 100644 --- a/source/utils.cpp +++ b/source/utils.cpp @@ -1,8 +1,17 @@ +/* +This file is part of libmsppath +Copyright © 2006 Mikko Rasa, Mikkosoft Productions +Distributed under the LGPL +*/ #include #include #include +#ifndef WIN32 #include -#include +#else +#include +#endif +#include #include "path.h" #include "utils.h" @@ -48,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; @@ -74,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); @@ -118,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); @@ -129,14 +148,14 @@ 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; @@ -144,7 +163,39 @@ Filename splitext(const string &fn) 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