X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=ETL%2Ftrunk%2FETL%2F_stringf.h;h=d26645332204aa912cd68c1b805cf56d321a3b59;hb=73244bb27b398a2257ab1ddd0f8ff48e45933413;hp=21a7190bba9fb8f98ef7dad97e04af3a5336e897;hpb=b3016b249333ac0ab0008d8c6c4d9029b2ff30c9;p=synfig.git diff --git a/ETL/trunk/ETL/_stringf.h b/ETL/trunk/ETL/_stringf.h index 21a7190..d266453 100644 --- a/ETL/trunk/ETL/_stringf.h +++ b/ETL/trunk/ETL/_stringf.h @@ -53,11 +53,7 @@ _ETL_BEGIN_CDECLS #else # ifdef HAVE_VSNPRINTF // This is the secondary method -# if defined(__CYGWIN__) || defined(_WIN32) -extern int vsnprintf(char *,unsigned int,const char*,va_list)ETL_NO_THROW; -# else -extern int vsnprintf(char *,int,const char*,va_list)ETL_NO_THROW; -# endif + extern int vsnprintf(char *,size_t,const char*,va_list)ETL_NO_THROW; # endif #endif @@ -197,14 +193,12 @@ inline bool is_absolute_path(const std::string &path) { #ifdef WIN32 - if(path.size()>=3 && path[1]==':' && path[2]=='\\') + if(path.size()>=3 && path[1]==':' && (path[2]=='\\' || path[2]=='/')) return true; - return false; -#else +#endif if(!path.empty() && path[0]==ETL_DIRECTORY_SEPERATOR) return true; return false; -#endif } inline std::string @@ -248,7 +242,7 @@ get_root_from_path(std::string path) break; ret+=*iter; } - if(iter!=path.end()) + //if(iter!=path.end()) ret+=ETL_DIRECTORY_SEPERATOR; return ret; } @@ -278,17 +272,18 @@ cleanup_path(std::string path) while(!path.empty()) { std::string dir(get_root_from_path(path)); - if(dir=="../" && ret.size()) + if((dir=="../" || dir=="..\\") && ret.size()) { ret=dirname(ret)+ETL_DIRECTORY_SEPERATOR; } - else if(dir!="./" && dir!=".") + else if((dir!="./" && dir!=".\\") && dir!=".") { ret+=dir; } path=remove_root_from_path(path); } + // Remove any trailing directory seperators if(ret.size() && ret[ret.size()-1]==ETL_DIRECTORY_SEPERATOR) { ret.erase(ret.begin()+ret.size()-1); @@ -323,6 +318,20 @@ relative_path(std::string curr_path,std::string dest_path) curr_path=absolute_path(curr_path); else curr_path=cleanup_path(curr_path); + +#ifdef WIN32 + // If we are on windows and the dest path is on a different drive, + // then there is no way to make a relative path to it. + if(dest_path.size()>=3 && dest_path[1]==':' && dest_path[0]!=curr_path[0]) + { + return dest_path; + } +#endif + + if(curr_path==dirname(dest_path)) + { + return basename(dest_path); + } while(!dest_path.empty() && !curr_path.empty() && get_root_from_path(dest_path)==get_root_from_path(curr_path)) { @@ -332,7 +341,7 @@ relative_path(std::string curr_path,std::string dest_path) while(!curr_path.empty()) { - dest_path="../"+dest_path; + dest_path=std::string("..")+ETL_DIRECTORY_SEPERATOR+dest_path; curr_path=remove_root_from_path(curr_path); }