2 fegdk: FE Game Development Kit
3 Copyright (C) 2001-2008 Alexey "waker" Yakovenko
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
15 You should have received a copy of the GNU Library General Public
16 License along with this library; if not, write to the Free
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 waker@users.sourceforge.net
32 #define _wcsinc(_pc) ((_pc)+1)
36 #define _wclen(lpsz) (1)
51 static const size_t npos
= 0xffffffff;
53 wStr( const wchar_t *s
)
75 wStr( const wStr
& _X
)
83 wStr( const wStr
& _X
, size_t _P
, size_t _M
)
106 wStr
&assign( const wchar_t *s
)
108 resize( wcslen( s
) );
115 wStr
& assign( const char *s
)
117 resize( strlen( s
) );
121 for ( i
= 0; i
< _Len
; i
++ )
129 void printf( wchar_t *fmt
, ... )
137 resize (wcslen (fmt
));
140 /* Try to print in the allocated space. */
142 n
= vswprintf (_Ptr
, _Len
, fmt
, ap
);
144 /* If that worked, return the string. */
145 if (n
> -1 && n
< _Len
)
147 /* Else try again with more space. */
148 if (n
> -1) /* glibc 2.1 */
149 resize (_Len
+ 1); /* precisely what is needed */
151 resize (_Len
* 2); /* twice the old size */
156 // seems like too big line. terminate.
157 // throw genericError ("cStr::printf failed!\n");
161 void trim_left( wchar_t *targets
)
167 if ( wcschr( targets
, *c
) == NULL
)
174 // fix up data and length
175 size_t l
= _Len
- ( c
- _Ptr
);
176 memmove( _Ptr
, c
, ( l
+ 1 ) * sizeof( wchar_t ) );
181 void trim_left( wchar_t target
)
185 while ( target
== *c
)
190 // fix up data and length
191 size_t l
= _Len
- ( c
- _Ptr
);
192 memmove( _Ptr
, c
, ( l
+ 1 ) * sizeof( wchar_t ) );
197 void trim_left( void )
201 while ( iswspace( *c
) )
206 // fix up data and length
207 size_t l
= _Len
- ( c
- _Ptr
);
208 memmove( _Ptr
, c
, ( l
+ 1 ) * sizeof( wchar_t ) );
213 void trim_right( wchar_t *targets
)
215 // find beginning of trailing matches
216 // by starting at beginning (DBCS aware)
219 wchar_t *last
= NULL
;
223 if ( wcschr( targets
, *c
) != NULL
)
235 // truncate at left-most matching character
241 void trim_right( wchar_t target
)
244 wchar_t *last
= NULL
;
260 // truncate at left-most matching character
266 void trim_right( void )
269 wchar_t *last
= NULL
;
273 if ( iswspace( *c
) )
285 // truncate at trailing space start
291 void reserve( size_t s
)
297 void resize( size_t s
)
302 append( s
- _Len
, wchar_t( 0 ) );
305 void erase( size_t s
)
308 memset( _Ptr
+ s
, 0, sizeof( wchar_t ) * ( _Len
- s
) );
312 size_t size( void ) const
317 size_t length( void ) const
322 size_t capacity( void ) const
327 const wchar_t *c_str( void ) const
329 return _Ptr
? _Ptr
: L
"";
332 const wchar_t *data( void ) const
337 void grow( size_t s
)
340 wchar_t *buf
= new wchar_t[ _Res
+ 1 ];
348 memset( buf
, 0, sizeof( wchar_t ) * ( _Res
+ 1 ) );
352 wStr
& assign( const wStr
&s
)
356 wcscpy( _Ptr
, s
.c_str() );
360 wStr
& assign( size_t s
, wchar_t c
)
365 for ( p
= _Ptr
; p
< _Ptr
+ s
; p
++ )
372 wStr
& assign( const wStr
& _X
, size_t _P
, size_t _M
)
374 size_t _N
= _X
.size() - _P
;
381 wcsncpy( _Ptr
, &_X
.c_str()[_P
], _N
);
383 _Ptr
[_N
] = wchar_t( 0 );
388 wStr
& append( size_t s
, wchar_t c
)
390 if ( _Len
+ s
> _Res
)
392 for ( wchar_t *p
= _Ptr
+ _Len
; p
< _Ptr
+ _Len
+ s
; p
++ )
398 wStr
& append( const wchar_t *s
)
401 resize( l
+ wcslen( s
) );
402 wcscpy( _Ptr
+ l
, s
);
406 wStr
& append( const wStr
&s
)
409 resize( l
+ s
.size() );
410 wcscpy( _Ptr
+ l
, s
.c_str() );
414 size_t find( wchar_t s
) const
416 for ( wchar_t *p
= _Ptr
; p
< _Ptr
+ _Len
; p
++ )
424 wStr
substr( size_t p
, size_t m
) const
426 return wStr( *this, p
, m
);
429 int compare( const wStr
&s
) const
431 const wchar_t *p1
, *p2
;
433 p1
= empty() ? L
"" : _Ptr
;
434 p2
= s
.empty() ? L
"" : s
.c_str();
436 return wcscmp( p1
, p2
);
439 bool empty( void ) const
444 void insert( size_t offs
, const wStr
& val
)
446 assert( offs
<= size() );
450 resize( size() + val
.size() );
452 memmove( _Ptr
+ offs
+ val
.size(), _Ptr
+ offs
, ( sz
- offs
+ 1 ) * sizeof( wchar_t ) );
453 memcpy( _Ptr
+ offs
, val
.c_str(), val
.size() * sizeof( wchar_t ) );
457 void erase( size_t offs
, size_t amount
)
459 assert( offs
< size() );
460 assert( offs
+ amount
<= size() );
462 memmove( _Ptr
+ offs
, _Ptr
+ offs
+ amount
, ( size() - offs
- amount
) * sizeof( wchar_t ) );
463 resize( size() - amount
);
466 operator const wchar_t *() const
471 wStr
& operator = ( const wStr
& _X
)
476 wStr
& operator = ( const wchar_t* _X
)
481 wStr
& operator = ( wchar_t _X
)
483 return assign( 1, _X
);
486 wStr
& operator += ( const wStr
& _X
)
491 wStr
& operator += ( const wchar_t* _X
)
496 wStr
& operator += ( wchar_t _X
)
498 return append( 1, _X
);
503 for ( size_t i
= 0; i
< size(); i
++ )
506 *(_Ptr
+ i
) = towlower( *( _Ptr
+ i
) );
508 *(_Ptr
+ i
) = towlower( *( _Ptr
+ i
) );
515 inline wStr
operator + ( const wStr
&s1
, const wStr
&s2
)
517 return wStr( s1
) += s2
;
520 inline bool operator < ( const wStr
&_L
, const wStr
&_R
)
522 return _L
.compare(_R
) < 0;
525 inline bool operator > ( const wStr
&_L
, const wStr
&_R
)
530 inline bool operator <= ( const wStr
&_L
, const wStr
&_R
)
535 inline bool operator >= ( const wStr
&_L
, const wStr
&_R
)
540 inline bool operator == ( const wStr
&_L
, const wStr
&_R
)
542 return _L
.compare( _R
) ? false : true;
545 inline bool operator == ( const wStr
&_L
, const wchar_t *_R
)
547 return _L
.compare( _R
) ? false : true;
550 inline bool operator == ( const wchar_t *_L
, const wStr
&_R
)
552 return _R
.compare( _L
) ? false : true;
555 inline bool operator != ( const wStr
&_L
, const wStr
&_R
)
557 return _L
.compare( _R
) ? true : false;
560 inline bool operator != ( const wStr
&_L
, const wchar_t *_R
)
562 return _L
.compare( _R
) ? true : false;
565 inline bool operator != ( const wchar_t *_L
, const wStr
&_R
)
567 return _R
.compare( _L
) ? true : false;