|
IrrlichtEngine
|
00001 // Copyright (C) 2002-2011 Nikolaus Gebhardt 00002 // This file is part of the "Irrlicht Engine". 00003 // For conditions of distribution and use, see copyright notice in irrlicht.h 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 // ----------- some basic quite often used string functions ----------------- 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 // delete path from filename 00071 const fschar_t* s = filename.c_str(); 00072 const fschar_t* p = s + filename.size(); 00073 00074 // search for path separator or beginning 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 // delete path from filename 00090 s32 i = filename.size(); 00091 00092 // search for path separator or beginning 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 // splits a path into components 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 // search for path separator or beginning 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 } // end namespace core 00186 } // end namespace irr 00187 00188 #endif