123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- // Copyright (C) 2002-2012 Nikolaus Gebhardt
- // This file is part of the "Irrlicht Engine".
- // For conditions of distribution and use, see copyright notice in irrlicht.h
- #ifndef IRR_CORE_UTIL_H_INCLUDED
- #define IRR_CORE_UTIL_H_INCLUDED
- #include "irrString.h"
- #include "path.h"
- namespace irr
- {
- namespace core
- {
- /*! \file coreutil.h
- \brief File containing useful basic utility functions
- */
- // ----------- some basic quite often used string functions -----------------
- //! search if a filename has a proper extension
- inline s32 isFileExtension (const io::path& filename, const io::path& ext0,
- const io::path& ext1, const io::path& ext2)
- {
- s32 extPos = filename.findLast ( '.' );
- if ( extPos < 0 )
- return 0;
- extPos += 1;
- if ( filename.equals_substring_ignore_case ( ext0, extPos ) )
- return 1;
- if ( filename.equals_substring_ignore_case ( ext1, extPos ) )
- return 2;
- if ( filename.equals_substring_ignore_case ( ext2, extPos ) )
- return 3;
- return 0;
- }
- //! search if a filename has a proper extension
- inline bool hasFileExtension(const io::path& filename, const io::path& ext0,
- const io::path& ext1 = "", const io::path& ext2 = "")
- {
- return isFileExtension ( filename, ext0, ext1, ext2 ) > 0;
- }
- //! cut the filename extension from a source file path and store it in a dest file path
- inline io::path& cutFilenameExtension ( io::path &dest, const io::path &source )
- {
- const s32 endPos = source.findLast ( '.' );
- dest = source.subString ( 0, endPos < 0 ? source.size () : endPos );
- return dest;
- }
- //! get the filename extension from a file path
- inline io::path& getFileNameExtension ( io::path &dest, const io::path &source )
- {
- const s32 endPos = source.findLast ( '.' );
- if ( endPos < 0 )
- dest = "";
- else
- dest = source.subString ( endPos, source.size () );
- return dest;
- }
- //! delete path from filename
- inline io::path& deletePathFromFilename(io::path& filename)
- {
- // delete path from filename
- const fschar_t* s = filename.c_str();
- const fschar_t* p = s + filename.size();
- // search for path separator or beginning
- while ( *p != '/' && *p != '\\' && p != s )
- p--;
- if ( p != s )
- {
- ++p;
- filename = p;
- }
- return filename;
- }
- //! trim paths
- inline io::path& deletePathFromPath(io::path& filename, s32 pathCount)
- {
- // delete path from filename
- s32 i = filename.size();
- // search for path separator or beginning
- while ( i>=0 )
- {
- if ( filename[i] == '/' || filename[i] == '\\' )
- {
- if ( --pathCount <= 0 )
- break;
- }
- --i;
- }
- if ( i>0 )
- {
- filename [ i + 1 ] = 0;
- filename.validate();
- }
- else
- filename="";
- return filename;
- }
- //! looks if file is in the same directory of path. returns offset of directory.
- //! 0 means in same directory. 1 means file is direct child of path
- inline s32 isInSameDirectory ( const io::path& path, const io::path& file )
- {
- if ( path.size() && !path.equalsn ( file, path.size() ) )
- return -1;
- s32 subA = 0;
- s32 subB = 0;
- s32 pos = 0;
- while ( (pos = path.findNext ( '/', pos )) >= 0 )
- {
- subA += 1;
- pos += 1;
- }
- pos = 0;
- while ( (pos = file.findNext ( '/', pos )) >= 0 )
- {
- subB += 1;
- pos += 1;
- }
- return subB - subA;
- }
- //! splits a path into components
- static inline void splitFilename(const io::path &name, io::path* path=0,
- io::path* filename=0, io::path* extension=0, bool make_lower=false)
- {
- s32 i = name.size();
- s32 extpos = i;
- // search for path separator or beginning
- while ( i >= 0 )
- {
- if ( name[i] == '.' )
- {
- extpos = i;
- if ( extension )
- *extension = name.subString ( extpos + 1, name.size() - (extpos + 1), make_lower );
- }
- else
- if ( name[i] == '/' || name[i] == '\\' )
- {
- if ( filename )
- *filename = name.subString ( i + 1, extpos - (i + 1), make_lower );
- if ( path )
- {
- *path = name.subString ( 0, i + 1, make_lower );
- path->replace ( '\\', '/' );
- }
- return;
- }
- i -= 1;
- }
- if ( filename )
- *filename = name.subString ( 0, extpos, make_lower );
- }
- //! create a filename from components
- static inline io::path mergeFilename(const io::path& path, const io::path& filename, const io::path& extension = "")
- {
- io::path result(path);
- if ( !result.empty() )
- {
- const fschar_t last = result.lastChar();
- if ( last != IRR_TEXT('/') && last != IRR_TEXT('\\') )
- result += IRR_TEXT('/');
- }
- if ( !filename.empty() )
- result += filename;
- if ( !extension.empty() )
- {
- if ( !result.empty() && extension[0] != IRR_TEXT('.') )
- result += IRR_TEXT('.');
- result += extension;
- }
- return result;
- }
- //! some standard function ( to remove dependencies )
- inline s32 isdigit(s32 c) { return c >= '0' && c <= '9'; }
- inline s32 isspace(s32 c) { return c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v'; }
- inline s32 isupper(s32 c) { return c >= 'A' && c <= 'Z'; }
- } // end namespace core
- } // end namespace irr
- #endif
|