Go to the documentation of this file.00001
00002
00003
00004
00005 #ifndef __IRR_CORE_UTIL_H_INCLUDED__
00006 #define __IRR_CORE_UTIL_H_INCLUDED__
00007
00008 #include "irrString.h"
00009 #include "path.h"
00010
00011 namespace irr
00012 {
00013 namespace core
00014 {
00015
00020
00021
00023 inline s32 isFileExtension ( const io::path& filename,
00024 const io::path& ext0,
00025 const io::path& ext1,
00026 const io::path& ext2)
00027 {
00028 s32 extPos = filename.findLast ( '.' );
00029 if ( extPos < 0 )
00030 return 0;
00031
00032 extPos += 1;
00033 if ( filename.equals_substring_ignore_case ( ext0, extPos ) ) return 1;
00034 if ( filename.equals_substring_ignore_case ( ext1, extPos ) ) return 2;
00035 if ( filename.equals_substring_ignore_case ( ext2, extPos ) ) return 3;
00036 return 0;
00037 }
00038
00040 inline bool hasFileExtension ( const io::path& filename,
00041 const io::path& ext0,
00042 const io::path& ext1 = "",
00043 const io::path& ext2 = "")
00044 {
00045 return isFileExtension ( filename, ext0, ext1, ext2 ) > 0;
00046 }
00047
00049 inline io::path& cutFilenameExtension ( io::path &dest, const io::path &source )
00050 {
00051 s32 endPos = source.findLast ( '.' );
00052 dest = source.subString ( 0, endPos < 0 ? source.size () : endPos );
00053 return dest;
00054 }
00055
00057 inline io::path& getFileNameExtension ( io::path &dest, const io::path &source )
00058 {
00059 s32 endPos = source.findLast ( '.' );
00060 if ( endPos < 0 )
00061 dest = "";
00062 else
00063 dest = source.subString ( endPos, source.size () );
00064 return dest;
00065 }
00066
00068 inline io::path& deletePathFromFilename(io::path& filename)
00069 {
00070
00071 const fschar_t* s = filename.c_str();
00072 const fschar_t* p = s + filename.size();
00073
00074
00075 while ( *p != '/' && *p != '\\' && p != s )
00076 p--;
00077
00078 if ( p != s )
00079 {
00080 ++p;
00081 filename = p;
00082 }
00083 return filename;
00084 }
00085
00087 inline io::path& deletePathFromPath(io::path& filename, s32 pathCount)
00088 {
00089
00090 s32 i = filename.size();
00091
00092
00093 while ( i>=0 )
00094 {
00095 if ( filename[i] == '/' || filename[i] == '\\' )
00096 {
00097 if ( --pathCount <= 0 )
00098 break;
00099 }
00100 --i;
00101 }
00102
00103 if ( i>0 )
00104 {
00105 filename [ i + 1 ] = 0;
00106 filename.validate();
00107 }
00108 else
00109 filename="";
00110 return filename;
00111 }
00112
00115 inline s32 isInSameDirectory ( const io::path& path, const io::path& file )
00116 {
00117 s32 subA = 0;
00118 s32 subB = 0;
00119 s32 pos;
00120
00121 if ( path.size() && !path.equalsn ( file, path.size() ) )
00122 return -1;
00123
00124 pos = 0;
00125 while ( (pos = path.findNext ( '/', pos )) >= 0 )
00126 {
00127 subA += 1;
00128 pos += 1;
00129 }
00130
00131 pos = 0;
00132 while ( (pos = file.findNext ( '/', pos )) >= 0 )
00133 {
00134 subB += 1;
00135 pos += 1;
00136 }
00137
00138 return subB - subA;
00139 }
00140
00141
00142 static inline void splitFilename(const io::path &name, io::path* path=0,
00143 io::path* filename=0, io::path* extension=0, bool make_lower=false)
00144 {
00145 s32 i = name.size();
00146 s32 extpos = i;
00147
00148
00149 while ( i >= 0 )
00150 {
00151 if ( name[i] == '.' )
00152 {
00153 extpos = i;
00154 if ( extension )
00155 *extension = name.subString ( extpos + 1, name.size() - (extpos + 1), make_lower );
00156 }
00157 else
00158 if ( name[i] == '/' || name[i] == '\\' )
00159 {
00160 if ( filename )
00161 *filename = name.subString ( i + 1, extpos - (i + 1), make_lower );
00162 if ( path )
00163 {
00164 *path = name.subString ( 0, i + 1, make_lower );
00165 path->replace ( '\\', '/' );
00166 }
00167 return;
00168 }
00169 i -= 1;
00170 }
00171 if ( filename )
00172 *filename = name.subString ( 0, extpos, make_lower );
00173 }
00174
00175
00177 #undef isdigit
00178 #undef isspace
00179 #undef isupper
00180 inline s32 isdigit(s32 c) { return c >= '0' && c <= '9'; }
00181 inline s32 isspace(s32 c) { return c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v'; }
00182 inline s32 isupper(s32 c) { return c >= 'A' && c <= 'Z'; }
00183
00184
00185 }
00186 }
00187
00188 #endif