Skylicht Engine
Loading...
Searching...
No Matches
coreutil.h
Go to the documentation of this file.
1// Copyright (C) 2002-2012 Nikolaus Gebhardt
2// This file is part of the "Irrlicht Engine".
3// For conditions of distribution and use, see copyright notice in irrlicht.h
4
5#ifndef __IRR_CORE_UTIL_H_INCLUDED__
6#define __IRR_CORE_UTIL_H_INCLUDED__
7
8#include "irrString.h"
9#include "path.h"
10
11namespace irr
12{
13namespace core
14{
15
19
20// ----------- some basic quite often used string functions -----------------
21
23inline s32 isFileExtension (const io::path& filename, const io::path& ext0,
24 const io::path& ext1, const io::path& ext2)
25{
26 s32 extPos = filename.findLast ( '.' );
27 if ( extPos < 0 )
28 return 0;
29
30 extPos += 1;
31 if ( filename.equals_substring_ignore_case ( ext0, extPos ) )
32 return 1;
33 if ( filename.equals_substring_ignore_case ( ext1, extPos ) )
34 return 2;
35 if ( filename.equals_substring_ignore_case ( ext2, extPos ) )
36 return 3;
37 return 0;
38}
39
41inline bool hasFileExtension(const io::path& filename, const io::path& ext0,
42 const io::path& ext1 = "", const io::path& ext2 = "")
43{
44 return isFileExtension ( filename, ext0, ext1, ext2 ) > 0;
45}
46
48inline io::path& cutFilenameExtension ( io::path &dest, const io::path &source )
49{
50 s32 endPos = source.findLast ( '.' );
51 dest = source.subString ( 0, endPos < 0 ? source.size () : endPos );
52 return dest;
53}
54
56inline io::path& getFileNameExtension ( io::path &dest, const io::path &source )
57{
58 s32 endPos = source.findLast ( '.' );
59 if ( endPos < 0 )
60 dest = "";
61 else
62 dest = source.subString ( endPos, source.size () );
63 return dest;
64}
65
68{
69 // delete path from filename
70 const fschar_t* s = filename.c_str();
71 const fschar_t* p = s + filename.size();
72
73 // search for path separator or beginning
74 while ( *p != '/' && *p != '\\' && p != s )
75 p--;
76
77 if ( p != s )
78 {
79 ++p;
80 filename = p;
81 }
82 return filename;
83}
84
86inline io::path& deletePathFromPath(io::path& filename, s32 pathCount)
87{
88 // delete path from filename
89 s32 i = filename.size();
90
91 // search for path separator or beginning
92 while ( i>=0 )
93 {
94 if ( filename[i] == '/' || filename[i] == '\\' )
95 {
96 if ( --pathCount <= 0 )
97 break;
98 }
99 --i;
100 }
101
102 if ( i>0 )
103 {
104 filename [ i + 1 ] = 0;
105 filename.validate();
106 }
107 else
108 filename="";
109 return filename;
110}
111
114inline s32 isInSameDirectory ( const io::path& path, const io::path& file )
115{
116 s32 subA = 0;
117 s32 subB = 0;
118 s32 pos;
119
120 if ( path.size() && !path.equalsn ( file, path.size() ) )
121 return -1;
122
123 pos = 0;
124 while ( (pos = path.findNext ( '/', pos )) >= 0 )
125 {
126 subA += 1;
127 pos += 1;
128 }
129
130 pos = 0;
131 while ( (pos = file.findNext ( '/', pos )) >= 0 )
132 {
133 subB += 1;
134 pos += 1;
135 }
136
137 return subB - subA;
138}
139
141static inline void splitFilename(const io::path &name, io::path* path=0,
142 io::path* filename=0, io::path* extension=0, bool make_lower=false)
143{
144 s32 i = name.size();
145 s32 extpos = i;
146
147 // search for path separator or beginning
148 while ( i >= 0 )
149 {
150 if ( name[i] == '.' )
151 {
152 extpos = i;
153 if ( extension )
154 *extension = name.subString ( extpos + 1, name.size() - (extpos + 1), make_lower );
155 }
156 else
157 if ( name[i] == '/' || name[i] == '\\' )
158 {
159 if ( filename )
160 *filename = name.subString ( i + 1, extpos - (i + 1), make_lower );
161 if ( path )
162 {
163 *path = name.subString ( 0, i + 1, make_lower );
164 path->replace ( '\\', '/' );
165 }
166 return;
167 }
168 i -= 1;
169 }
170 if ( filename )
171 *filename = name.subString ( 0, extpos, make_lower );
172}
173
175static inline io::path mergeFilename(const io::path& path, const io::path& filename, const io::path& extension = "")
176{
177 io::path result(path);
178
179 if ( !result.empty() )
180 {
181 fschar_t last = result.lastChar();
182 if ( last != _IRR_TEXT('/') && last != _IRR_TEXT('\\') )
183 result += _IRR_TEXT('/');
184 }
185 if ( !filename.empty() )
186 result += filename;
187 if ( !extension.empty() )
188 {
189 if ( !result.empty() && extension[0] != _IRR_TEXT('.') )
190 result += _IRR_TEXT('.');
191 result += extension;
192 }
193
194 return result;
195}
196
197
199#undef isdigit
200#undef isspace
201#undef isupper
202inline s32 isdigit(s32 c) { return c >= '0' && c <= '9'; }
203inline s32 isspace(s32 c) { return c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v'; }
204inline s32 isupper(s32 c) { return c >= 'A' && c <= 'Z'; }
205
206
207} // end namespace core
208} // end namespace irr
209
210#endif
u32 size() const
Returns length of the string's content.
Definition irrString.h:496
string< T, TAlloc > & validate()
verify the existing string.
Definition irrString.h:1262
string< T > subString(u32 begin, s32 length, bool make_lower=false) const
Returns a substring.
Definition irrString.h:906
s32 findLast(T c, s32 start=-1) const
finds last occurrence of character in string
Definition irrString.h:837
string< T, TAlloc > & replace(T toReplace, T replaceWith)
Replaces all characters of a special type with another one.
Definition irrString.h:1022
s32 findNext(T c, u32 startPos) const
finds next occurrence of character in string
Definition irrString.h:822
const T * c_str() const
Returns character string.
Definition irrString.h:510
bool equals_substring_ignore_case(const string< T, TAlloc > &other, const s32 sourcePos=0) const
Compares the strings ignoring case.
Definition irrString.h:550
bool equalsn(const string< T, TAlloc > &other, u32 n) const
compares the first n characters of the strings
Definition irrString.h:584
Basic classes such as vectors, planes, arrays, lists, and so on can be found in this namespace.
Definition aabbox3d.h:15
io::path & deletePathFromPath(io::path &filename, s32 pathCount)
trim paths
Definition coreutil.h:86
bool hasFileExtension(const io::path &filename, const io::path &ext0, const io::path &ext1="", const io::path &ext2="")
search if a filename has a proper extension
Definition coreutil.h:41
io::path & getFileNameExtension(io::path &dest, const io::path &source)
get the filename extension from a file path
Definition coreutil.h:56
s32 isFileExtension(const io::path &filename, const io::path &ext0, const io::path &ext1, const io::path &ext2)
search if a filename has a proper extension
Definition coreutil.h:23
s32 isdigit(s32 c)
some standard function ( to remove dependencies )
Definition coreutil.h:202
io::path & deletePathFromFilename(io::path &filename)
delete path from filename
Definition coreutil.h:67
io::path & cutFilenameExtension(io::path &dest, const io::path &source)
cut the filename extension from a source file path and store it in a dest file path
Definition coreutil.h:48
s32 isInSameDirectory(const io::path &path, const io::path &file)
Definition coreutil.h:114
core::string< fschar_t > path
Type used for all file system related strings.
Definition path.h:17
Everything in the Irrlicht Engine can be found in this namespace.
Definition Skylicht.h:33
char fschar_t
Type name for character type used by the file system.
Definition irrTypes.h:158
signed int s32
32 bit signed variable.
Definition irrTypes.h:66