joachim99@75
|
1 /*
|
joachim99@75
|
2 * Copyright (c) 2003, Sergey Zorin. All rights reserved.
|
joachim99@75
|
3 *
|
joachim99@75
|
4 * This software is distributable under the BSD license. See the terms of the
|
joachim99@75
|
5 * BSD license in the LICENSE file provided with this software.
|
joachim99@75
|
6 *
|
joachim99@75
|
7 */
|
joachim99@75
|
8
|
joachim99@75
|
9 #ifndef __string_h__
|
joachim99@75
|
10 #define __string_h__
|
joachim99@75
|
11
|
joachim99@75
|
12 #include <windows.h>
|
joachim99@75
|
13 #include <tchar.h>
|
joachim99@75
|
14
|
joachim99@75
|
15 #include <string.h>
|
joachim99@75
|
16 #include <stdlib.h>
|
joachim99@75
|
17
|
joachim99@75
|
18 class STRING;
|
joachim99@75
|
19 inline STRING operator+( const STRING& s1, const STRING& s2);
|
joachim99@75
|
20
|
joachim99@75
|
21 class STRING {
|
joachim99@75
|
22 public:
|
joachim99@75
|
23 static const int begin = 0;
|
joachim99@75
|
24 static const int end = -1;
|
joachim99@75
|
25
|
joachim99@75
|
26 public:
|
joachim99@75
|
27 STRING(const STRING& s) {
|
joachim99@75
|
28 _str = new TCHAR[s.length()+1];
|
joachim99@75
|
29 lstrcpy(_str, s);
|
joachim99@75
|
30 }
|
joachim99@75
|
31
|
joachim99@75
|
32 STRING(const TCHAR* str = TEXT("")) {
|
joachim99@75
|
33 _str = new TCHAR[lstrlen(str)+1];
|
joachim99@75
|
34 lstrcpy(_str, str);
|
joachim99@75
|
35 }
|
joachim99@75
|
36
|
joachim99@75
|
37 ~STRING() {
|
joachim99@75
|
38 delete[] _str;
|
joachim99@75
|
39 }
|
joachim99@75
|
40
|
joachim99@75
|
41 void resize( size_t newLength )
|
joachim99@75
|
42 {
|
joachim99@75
|
43 size_t oldLength = length();
|
joachim99@75
|
44 if ( newLength < oldLength ) {
|
joachim99@75
|
45 _str[newLength] = 0; // Just truncate the string
|
joachim99@75
|
46 } else if( newLength>oldLength) {
|
joachim99@75
|
47 TCHAR* p = new TCHAR[ newLength + 1 ];
|
joachim99@75
|
48 lstrcpy(p, _str);
|
joachim99@75
|
49 for( size_t i=oldLength; i<newLength; ++i)
|
joachim99@75
|
50 p[i]=TEXT(' ');
|
joachim99@75
|
51 p[newLength]=0;
|
joachim99@75
|
52 }
|
joachim99@75
|
53 }
|
joachim99@75
|
54
|
joachim99@75
|
55 STRING& operator=(const STRING& s) {
|
joachim99@75
|
56 delete[] _str;
|
joachim99@75
|
57 _str = new TCHAR[s.length()+1];
|
joachim99@75
|
58 lstrcpy(_str, s);
|
joachim99@75
|
59 return *this;
|
joachim99@75
|
60 }
|
joachim99@75
|
61
|
joachim99@75
|
62 operator TCHAR*() {
|
joachim99@75
|
63 return _str;
|
joachim99@75
|
64 }
|
joachim99@75
|
65
|
joachim99@75
|
66 operator const TCHAR*() const {
|
joachim99@75
|
67 return _str;
|
joachim99@75
|
68 }
|
joachim99@75
|
69
|
joachim99@75
|
70 const TCHAR* c_str() const {
|
joachim99@75
|
71 return _str;
|
joachim99@75
|
72 }
|
joachim99@75
|
73
|
joachim99@75
|
74 size_t length() const {
|
joachim99@75
|
75 return _tcslen(_str);
|
joachim99@75
|
76 }
|
joachim99@75
|
77
|
joachim99@75
|
78 // Also returns the length. Behaviour like std::basic_string::size.
|
joachim99@75
|
79 // See also sizeInBytes() below.
|
joachim99@75
|
80 size_t size() const {
|
joachim99@75
|
81 return length();
|
joachim99@75
|
82 }
|
joachim99@75
|
83
|
joachim99@75
|
84 // String length in bytes. May differ from length() for Unicode or MBCS
|
joachim99@75
|
85 size_t sizeInBytes() const {
|
joachim99@75
|
86 return length()*sizeof(TCHAR);
|
joachim99@75
|
87 }
|
joachim99@75
|
88
|
joachim99@75
|
89 bool empty() const
|
joachim99@75
|
90 {
|
joachim99@75
|
91 return length()==0;
|
joachim99@75
|
92 }
|
joachim99@75
|
93
|
joachim99@75
|
94 STRING substr(size_t from, size_t len=size_t(-1)) const {
|
joachim99@75
|
95 STRING tmp;
|
joachim99@75
|
96 size_t to = len==size_t(-1) ? length() : from + len;
|
joachim99@75
|
97
|
joachim99@75
|
98 if(from < to && (to <= length())) {
|
joachim99@75
|
99 size_t new_len = to - from + 1;
|
joachim99@75
|
100 TCHAR* new_str = new TCHAR[new_len+1];
|
joachim99@75
|
101 lstrcpyn(new_str, &_str[from], int(new_len) );
|
joachim99@75
|
102 new_str[new_len] = 0;
|
joachim99@75
|
103
|
joachim99@75
|
104 tmp = new_str;
|
joachim99@75
|
105 delete[] new_str;
|
joachim99@75
|
106 }
|
joachim99@75
|
107
|
joachim99@75
|
108 return tmp;
|
joachim99@75
|
109 }
|
joachim99@75
|
110
|
joachim99@75
|
111 STRING& replace( size_t pos, size_t num, const STRING& s )
|
joachim99@75
|
112 {
|
joachim99@75
|
113 *this = substr( 0, pos ) + s + substr( pos+num );
|
joachim99@75
|
114 return *this;
|
joachim99@75
|
115 }
|
joachim99@75
|
116
|
joachim99@75
|
117 bool operator ==(const STRING& s) const {
|
joachim99@75
|
118 return (lstrcmp(_str, s) == 0);
|
joachim99@75
|
119 }
|
joachim99@75
|
120
|
joachim99@75
|
121 size_t find(const STRING& s) const
|
joachim99@75
|
122 {
|
joachim99@75
|
123 const TCHAR* p = _tcsstr( _str, s._str );
|
joachim99@75
|
124 if (p)
|
joachim99@75
|
125 return p - _str;
|
joachim99@75
|
126 else
|
joachim99@75
|
127 return size_t(-1);
|
joachim99@75
|
128 }
|
joachim99@75
|
129
|
joachim99@75
|
130 STRING& operator +=(const STRING& s) {
|
joachim99@75
|
131 TCHAR* str = new TCHAR[lstrlen(_str)+s.length()+1];
|
joachim99@75
|
132
|
joachim99@75
|
133 lstrcpy(str, _str);
|
joachim99@75
|
134 lstrcat(str, s);
|
joachim99@75
|
135
|
joachim99@75
|
136 delete[] _str;
|
joachim99@75
|
137
|
joachim99@75
|
138 _str = str;
|
joachim99@75
|
139
|
joachim99@75
|
140 return *this;
|
joachim99@75
|
141 }
|
joachim99@75
|
142
|
joachim99@75
|
143 private:
|
joachim99@75
|
144 TCHAR* _str;
|
joachim99@75
|
145 };
|
joachim99@75
|
146
|
joachim99@75
|
147 inline STRING operator+( const STRING& s1, const STRING& s2) {
|
joachim99@75
|
148 STRING tmp(s1);
|
joachim99@75
|
149
|
joachim99@75
|
150 tmp+=s2;
|
joachim99@75
|
151
|
joachim99@75
|
152 return tmp;
|
joachim99@75
|
153 }
|
joachim99@75
|
154
|
joachim99@75
|
155
|
joachim99@75
|
156
|
joachim99@75
|
157 #endif // __string_h__
|