source: Include/Classes/System/String.ab@ 123

Last change on this file since 123 was 123, checked in by イグトランス (egtra), 17 years ago

(拡張)メタファイル関数(全部)・構造体(一部)、BITMAPV4HEADERとそれに関連する型などの宣言

File size: 11.8 KB
RevLine 
[1]1Class String
[30]2 m_Length As Long
[1]3Public
[119]4 Chars As *Char
[1]5
6 Sub String()
[121]7 Chars = _System_calloc(SizeOf (Char) * 1)
[30]8 m_Length = 0
[1]9 End Sub
10
[119]11 Sub String(initStr As *Char)
[1]12 String()
13 Assign(initStr)
14 End Sub
[30]15
[49]16 Sub String(ByRef initStr As String)
[1]17 String()
18 Assign(initStr)
19 End Sub
[49]20
[1]21 Sub String(length As Long)
[121]22 String()
[1]23 ReSize(length)
24 End Sub
[121]25
[119]26 Sub String(initChar As Char, length As Long)
[1]27 ReSize(length, initChar)
28 End Sub
29
30 Sub ~String()
[123]31 _System_free(Chars)
[31]32 Chars = 0
[1]33#ifdef _DEBUG
[30]34 m_Length = 0
[1]35#endif
36 End Sub
37
[121]38 Const Function Length() As Long
[30]39 Return m_Length
40 End Function
41
[119]42 Function Operator() As *Char
[31]43 Return Chars
[1]44 End Function
45
46 Sub Operator = (ByRef objString As String)
[31]47 Assign(objString.Chars, objString.m_Length)
[1]48 End Sub
49
[119]50 Sub Operator = (text As *Char)
[1]51 Assign(text)
52 End Sub
53
[121]54 Const Function Operator[] (n As Long) As Char
[31]55 Return Chars[n]
[1]56 End Function
57
[119]58 Sub Operator[]= (n As Long, c As Char)
[31]59 Chars[n] = c
[1]60 End Sub
61
[121]62 Const Function Operator + (lpszText As *Char) As String
[1]63 Return Concat(lpszText, lstrlen(lpszText))
64 End Function
65
[121]66 Const Function Operator + (ByRef objString As String) As String
[30]67 Return Concat(objString, objString.m_Length)
[1]68 End Function
69
[121]70 Const Function Operator & (lpszText As *Char) As String
71 Dim tempString = This + lpszText
[1]72 Return tempString
73 End Function
74
[121]75 Const Function Operator & (ByRef objString As String) As String
76 Dim tempString = This + objString
[1]77 Return tempString
78 End Function
79
80 Function Operator== (ByRef objString As String) As Long
81 If lstrcmp(This, objString) = 0 Then
82 Return _System_TRUE
83 Else
84 Return _System_FALSE
85 End If
86 End Function
87
[119]88 Function Operator== (lpszText As *Char) As Long
[1]89 If lstrcmp(This, lpszText) = 0 Then
90 Return _System_TRUE
91 Else
92 Return _System_FALSE
93 End If
94 End Function
95
96 Function Operator<> (ByRef objString As String) As Long
97 Return lstrcmp(This, objString)
98 End Function
99
[119]100 Function Operator<> (lpszText As *Char) As Long
[1]101 Return lstrcmp(This, lpszText)
102 End Function
103
104 Function Operator< (ByRef objString As String) As Long
105 If lstrcmp(This, objString) < 0 Then
106 Return _System_TRUE
107 Else
108 Return _System_FALSE
109 End If
110 End Function
111
[119]112 Function Operator< (lpszText As *Char) As Long
[1]113 If lstrcmp(This, lpszText) < 0 Then
114 Return _System_TRUE
115 Else
116 Return _System_FALSE
117 End If
118 End Function
119
120 Function Operator> (ByRef objString As String) As Long
121 If lstrcmp(This, objString) > 0 Then
122 Return _System_TRUE
123 Else
124 Return _System_FALSE
125 End If
126 End Function
127
[119]128 Function Operator> (lpszText As *Char) As Long
[1]129 If lstrcmp(This, lpszText) > 0 Then
130 Return _System_TRUE
131 Else
132 Return _System_FALSE
133 End If
134 End Function
135
136 Function Operator<= (ByRef objString As String) As Long
137 If lstrcmp(This, objString) <= 0 Then
138 Return _System_TRUE
139 Else
140 Return _System_FALSE
141 End If
142 End Function
143
[119]144 Function Operator<= (lpszText As *Char) As Long
[1]145 If lstrcmp(This, lpszText) <= 0 Then
146 Return _System_TRUE
147 Else
148 Return _System_FALSE
149 End If
150 End Function
151
152 Function Operator>= (ByRef objString As String) As Long
153 If lstrcmp(This, objString) => 0 Then
154 Return _System_TRUE
155 Else
156 Return _System_FALSE
157 End If
158 End Function
159
[119]160 Function Operator>= (lpszText As *Char) As Long
[1]161 If lstrcmp(This, lpszText) => 0 Then
162 Return _System_TRUE
163 Else
164 Return _System_FALSE
165 End If
166 End Function
167
[119]168 Function StrPtr() As *Char
[31]169 Return Chars
[1]170 End Function
171
172 Sub ReSize(allocLength As Long)
173 If allocLength < 0 Then Exit Sub
[30]174 If allocLength > m_Length Then
[1]175 Dim oldLength As Long
[30]176 oldLength = m_Length
[1]177 If AllocStringBuffer(allocLength) <> 0 Then
[121]178 ZeroMemory(VarPtr(Chars[oldLength]), SizeOf (Char) * (m_Length - oldLength + 1))
[1]179 End If
180 Else
[30]181 m_Length = allocLength
[31]182 Chars[m_Length] = 0
[1]183 End If
184 End Sub
185
[119]186 Sub ReSize(allocLength As Long, c As Char)
[1]187 If allocLength < 0 Then
188 Exit Sub
[30]189 ElseIf allocLength > m_Length Then
[1]190 Dim oldLength As Long
[30]191 oldLength = m_Length
[1]192 If AllocStringBuffer(allocLength) <> 0 Then
[121]193 Dim p = VarPtr(Chars[oldLength]) As *Char
194 Dim fillLen = m_Length - oldLength
195 Dim i As Long
196 For i = 0 To ELM(fillLen)
197 p[i] = c
198 Next
[1]199 End If
200 Else
[30]201 m_Length = allocLength
[1]202 End If
[31]203 Chars[m_Length] = 0
[1]204 End Sub
205
[121]206 Sub Assign(text As *Char, textLength As Long)
207 If text = Chars Then Exit Sub
[1]208 If AllocStringBuffer(textLength) <> 0 Then
[121]209 memcpy(Chars, text, SizeOf (Char) * textLength)
[31]210 Chars[m_Length] = 0
[1]211 End If
212 End Sub
213
214 Sub Assign(ByRef objString As String)
[31]215 Assign(objString.Chars, objString.m_Length)
[1]216 End Sub
217
[121]218 Sub Assign(text As *Char)
219 If text Then
220 Assign(text, lstrlen(text))
[1]221 Else
[31]222 'Chars=_System_realloc(Chars,1)
223 Chars[0] = 0
[30]224 m_Length = 0
[1]225 End If
226 End Sub
227
[121]228 Sub Append(text As *Char, textLength As Long)
[1]229 Dim prevLen As Long
[30]230 prevLen = m_Length
231 If AllocStringBuffer(m_Length + textLength) <> 0 Then
[121]232 memcpy(VarPtr(Chars[prevLen]), text, SizeOf (Char) * textLength)
[31]233 Chars[m_Length] = 0
[1]234 End If
235 End Sub
236
[119]237 Sub Append(text As *Char)
[1]238 Append(text, lstrlen(text))
239 End Sub
240
241 Sub Append(ByRef str As String)
[31]242 Append(str.Chars, str.m_Length)
[1]243 End Sub
244
[119]245 Function Concat(lpszText As *Char, textLength As Long) As String
[1]246 Dim tempString As String
247 With tempString
[30]248 .AllocStringBuffer(This.m_Length + textLength)
[121]249 memcpy(.Chars, This.Chars, SizeOf (Char) * This.m_Length)
250 memcpy(VarPtr(.Chars[This.m_Length]), lpszText, SizeOf (Char) * textLength)
[31]251 .Chars[.m_Length] = 0
[1]252 End With
253 Return tempString
254 End Function
255
256 Function Contains(ByRef objString As String) As BOOL
[30]257 If IndexOf(objString, 0, m_Length) >= 0 Then
[1]258 Return _System_TRUE
259 Else
260 Return _System_FALSE
261 End If
262 End Function
263
[119]264 Function Contains(lpszText As *Char) As BOOL
[30]265 If IndexOf(lpszText, 0, m_Length) >= 0 Then
[1]266 Return _System_TRUE
267 Else
268 Return _System_FALSE
269 End If
270 End Function
271
[119]272 Function IndexOf(lpszText As *Char) As Long
[30]273 Return IndexOf(lpszText, 0, m_Length)
[1]274 End Function
275
[119]276 Function IndexOf(lpszText As *Char, startIndex As Long) As Long
[30]277 Return IndexOf(lpszText, startIndex, m_Length - startIndex)
[1]278 End Function
279
[119]280 Function IndexOf(lpszText As *Char, startIndex As Long, count As Long) As Long
[1]281 Dim length As Long
282 length = lstrlen(lpszText)
283
284 If startIndex < 0 Then Return -1
[30]285 If count < 1 Or count + startIndex > m_Length Then Return -1
286 If length > m_Length Then Return -1
[1]287
288 If length = 0 Then Return startIndex
289
290 Dim i As Long, j As Long
291 For i = startIndex To startIndex + count - 1
292 For j = 0 To length - 1
[31]293 If Chars[i + j] = lpszText[j] Then
[1]294 If j = length - 1 Then Return i
295 Else
296 Exit For
297 End If
298 Next
299 Next
300 Return -1
301 End Function
302
[119]303 Function LastIndexOf(lpszText As *Char) As Long
[30]304 Return LastIndexOf(lpszText, m_Length - 1, m_Length)
[1]305 End Function
306
[119]307 Function LastIndexOf(lpszText As *Char, startIndex As Long) As Long
308 Return LastIndexOf(lpszText As *Char, startIndex, startIndex + 1)
[1]309 End Function
310
[119]311 Function LastIndexOf(lpszText As *Char, startIndex As Long, count As Long) As Long
[1]312 Dim length As Long
313 length = lstrlen(lpszText)
314
[30]315 If startIndex < 0 Or startIndex > m_Length - 1 Then Return -1
[1]316 If count < 1 Or count > startIndex + 2 Then Return -1
[30]317 If length > m_Length Then Return -1
[1]318
319 If length = 0 Then Return startIndex
320
321 Dim i As Long, j As Long
322 For i = startIndex To startIndex - count + 1 Step -1
323 For j = length - 1 To 0 Step -1
[31]324 If Chars[i + j] = lpszText[j] Then
[1]325 If j = 0 Then Return i
326 Else
327 Exit For
328 End If
329 Next
330 Next
331 Return -1
332 End Function
333
[119]334 Function StartsWith(lpszText As *Char) As BOOL
[1]335 If IndexOf(lpszText) = 0 Then
336 Return _System_TRUE
337 Else
338 Return _System_FALSE
339 End If
340 End Function
341
[119]342 Function EndsWith(lpszText As *Char) As BOOL
[30]343 If LastIndexOf(lpszText) = m_Length - lstrlen(lpszText) Then
[1]344 Return _System_TRUE
345 Else
346 Return _System_FALSE
347 End If
348 End Function
349
[121]350 Function Insert(startIndex As Long, text As *Char) As Long
[1]351 Dim length As Long
[121]352 length = lstrlen(text)
[1]353
[30]354 If startIndex < 0 Or startIndex > m_Length Then Return -1
[1]355
[119]356 Dim newChars As *Char
[121]357 newChars = _System_malloc(SizeOf (Char) * (length + m_Length + 1))
[1]358 If newChars = 0 Then Return -1
359
[121]360 memcpy(newChars, Chars, SizeOf (Char) * startIndex)
361 memcpy(VarPtr(newChars[startIndex]), text, SizeOf (Char) * length)
362 memcpy(VarPtr(newChars[startIndex + length]), VarPtr(Chars[startIndex]), SizeOf (Char) * (m_Length - startIndex + 1))
[1]363
[31]364 _System_free(Chars)
365 Chars = newChars
[30]366 m_Length = length + m_Length
367 Return m_Length
[1]368 End Function
369
370 Function SubString(startIndex As Long) As String
[30]371 Return SubString(startIndex, m_Length - startIndex)
[1]372 End Function
373
374 Function SubString(startIndex As Long, length As Long) As String
375 If startIndex < 0 Or length <= 0 Then Return ""
[30]376 If startIndex + length > m_Length Then Return ""
[1]377
378 Dim temp As String
379 temp.AllocStringBuffer(length)
[121]380 memcpy(temp.Chars, VarPtr(Chars[startIndex]), SizeOf (Char) * length)
[31]381 Chars[m_Length] = 0
[1]382 Return temp
383 End Function
384
385 Function Remove(startIndex As Long) As Long
[30]386 If startIndex < 0 Or startIndex > m_Length Then Return -1
[31]387 Chars[startIndex] = 0
[30]388 m_Length = startIndex
389 Return m_Length
[1]390 End Function
391
392 Function Remove(startIndex As Long, count As Long) As Long
393 If startIndex < 0 Or count < 0 Then Return -1
[30]394 If startIndex + count > m_Length Then Return -1
[1]395
[119]396 Dim newChars As *Char
[121]397 newChars = _System_malloc(SizeOf (Char) * (m_Length - count + 1))
[1]398 If newChars = 0 Then Return -1
399
[121]400 memcpy(newChars, Chars, SizeOf (Char) * startIndex)
401 memcpy(VarPtr(newChars[startIndex]), VarPtr(Chars[startIndex + count]), SizeOf (Char) * (m_Length - startIndex - count))
[30]402 newChars[m_Length - count] = 0
[1]403
[31]404 _System_free(Chars)
405 Chars = newChars
[30]406 m_Length = m_Length - count
407 Return m_Length
[1]408 End Function
409
410 Function IsNullOrEmpty() As BOOL
[30]411 If m_Length = 0 Then
[1]412 Return _System_TRUE
413 Else
414 Return _System_FALSE
415 End If
416 End Function
417
[119]418
419 Sub Replace(oldChar As Char, newChar As Char)
[1]420 Dim i As Long
[30]421 For i = 0 To ELM(m_Length)
[31]422 If Chars[i] = oldChar Then
423 Chars[i] = newChar
[1]424 End If
425 Next
426 End Sub
427
428 Sub Replace(ByRef oldStr As String, ByRef newStr As String)
[30]429 Replace(oldStr, oldStr.m_Length, newStr, newStr.m_Length)
[1]430 End Sub
431
432 Sub Replace(oldStr As PCSTR, newStr As PCSTR)
433 Replace(oldStr, lstrlen(oldStr), newStr, lstrlen(newStr))
434 End Sub
435
436 Sub Replace(oldStr As PCSTR, oldLen As Long, newStr As PCSTR, newLen As Long)
437 Dim tempString As String
438 With tempString
439 Dim current = 0 As Long
440 Do
441 Dim pos As Long
442 pos = IndexOf(oldStr, current)
443 If pos = -1 Then
444 Exit Do
445 End If
[31]446 .Append(Chars + current, pos - current)
[1]447 .Append(newStr, newLen)
448 current = pos + oldLen
449 Loop
[31]450 .Append(Chars + current, m_Length - current)
[1]451 End With
452 Swap(tempString)
453 End Sub
454
455 Sub ToLower()
[31]456 CharLower(Chars)
[1]457 End Sub
458
459 Sub ToUpper()
[31]460 CharUpper(Chars)
[1]461 End Sub
462
463 Sub Swap(ByRef x As String)
464 Dim tempLen As Long
465 Dim tempChars As PSTR
[30]466 tempLen = x.m_Length
[31]467 tempChars = x.Chars
[30]468 x.m_Length = This.m_Length
[31]469 x.Chars = This.Chars
[30]470 This.m_Length = tempLen
[31]471 This.Chars = tempChars
[1]472 End Sub
473
[119]474 Override Function ToString() As String
475 Return This
476 End Function
477
[1]478Private
479 ' メモリ確保に失敗すると元の文字列は失われない。(例外安全でいう強い保障)
[119]480 Function AllocStringBuffer(textLength As Long) As *Char
[1]481 If textLength < 0 Then
482 Return 0
[30]483 ElseIf textLength > m_Length Then
[121]484 AllocStringBuffer = _System_realloc(Chars, SizeOf(Char) * (textLength + 1))
[1]485 If AllocStringBuffer <> 0 Then
[30]486 m_Length = textLength
[31]487 Chars = AllocStringBuffer
[1]488 End If
489 Else
[30]490 m_Length = textLength
[31]491 AllocStringBuffer = Chars
[1]492 End If
493 End Function
494
495End Class
496
Note: See TracBrowser for help on using the repository browser.